Create bulk invites

Try it in the sandbox

Issue up to 100 Kicbak invites in a single request, each funded by your organisation's wallet with a shared reward rule.

POSThttps://kicbak.co/api/third-party/v1/kicbak/invites/bulk

Authentication

Exchange your organisation's client key and secret for a bearer token, then send Authorization: Bearer <token>. Organisation clients only.

Headers

FieldTypeRequiredDescription
Content-TypestringrequiredMust be application/json.
AuthorizationstringrequiredBearer token obtained from POST /api/third-party/v1/auth/token, e.g. "Bearer eyJhbGci...".
x-client-keystringdeprecatedDeprecated — use Authorization instead. Still accepted so existing integrations keep working; responses carry Deprecation: true.
x-client-secretstringdeprecatedDeprecated — sent alongside x-client-key on the legacy path.

Request body

FieldTypeRequiredDescription
invitesarray<InviteItem>required1 to 100 invites. Each is { email, name?, reference? }.
rewardSpecKind"FIXED_KIC" | "FIXED_USD" | "PERCENT_OF_USD"requiredHow the invite reward is calculated.
rewardKicAmountintegerconditionalRequired for FIXED_KIC. Whole $kic, max 1,000,000.
rewardUsdnumberconditionalRequired for FIXED_USD. Max $10,000.
rewardPercentnumberconditionalRequired for PERCENT_OF_USD. Max 100.
basisUsdnumberconditionalRequired for PERCENT_OF_USD. Max $100,000.
grantTrigger"ON_JOIN" | "ON_QUALIFYING_EVENT"optionalDefaults to ON_JOIN.
expiresAtstring (ISO 8601)optionalMust be a date in the future.
requestIdstringrequiredA unique string identifying this batch, 8–200 characters. Send the same request again — same requestId and emails — and the original invites come back with replay: true and a 200, instead of a second set. Reusing a requestId with a DIFFERENT email set is refused with 409.

InviteItem (each entry in invites)

FieldTypeRequiredDescription
emailstringrequiredA valid email address. Deduplicated case-insensitively.
namestringoptionalRecipient's display name, max 120 characters.
referencestringoptionalYour own identifier for THIS invitation, 1–200 characters. It comes back on every response and is how you look this invitation up later. Distinct from requestId, which names the batch. Each reference may be used once.

Code examples

bash
curl -X POST https://kicbak.co/api/third-party/v1/kicbak/invites/bulk \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $KICBAK_TOKEN" \
  -d '{
    "invites": [
      { "email": "jane@example.com", "name": "Jane Doe", "reference": "booking-88213" },
      { "email": "john@example.com", "reference": "booking-88214" }
    ],
    "rewardSpecKind": "FIXED_KIC",
    "rewardKicAmount": 500,
    "requestId": "invite-batch-2026-08-04-0001"
  }'

Responses

Every response is JSON with a status field (1 success, 0 failure). Failures also carry a code your error handler can branch on — it never changes if we reword message.

json
{
  "status": 1,
  "message": "2 invites created successfully.",
  "data": {
    "created": [
      { "email": "jane@example.com", "code": "K7XQ2M9P", "shareUrl": "https://kicbak.co/join?invite=K7XQ2M9P", "reference": "booking-88213" },
      { "email": "john@example.com", "code": "R4T8W1YZ", "shareUrl": "https://kicbak.co/join?invite=R4T8W1YZ", "reference": "booking-88214" }
    ]
  }
}

Error reference

StatusCodeMeaning
200Replay: this exact requestId + emails was already created. The originals return with replay: true; nothing is created again.
400Malformed JSON, failed validation, missing wallet/price, or reward over the max.
401UNAUTHORIZEDNo readable credential, or a token that doesn't decode/validate.
401TOKEN_EXPIREDToken aged out. Re-exchange the same client_key/client_secret and retry.
401CREDENTIAL_ROTATEDThis token was minted under a secret that has since been rotated. Exchange your new secret.
401CREDENTIAL_EXPIREDThe credential itself is past its own expiry — re-exchanging will not help; request a new credential.
401CLIENT_INACTIVEThe client has been deactivated.
403NOT_ORGANIZATIONClient is not organisation-owned — only organisation clients can call this endpoint.
503SANDBOX_UNAVAILABLEYou are using a sandbox credential and the sandbox environment is temporarily unavailable on our side. Retry shortly; production credentials are unaffected.
403The client's organisation exists but is not yet ACTIVE.
404The organisation tied to this client no longer exists.
400REFERENCE_DUPLICATED_IN_REQUESTTwo invites in the same request carry the same reference.
409REFERENCE_ALREADY_USEDA reference in this request is already used by one of your invitations; the errors array names the holder.
409One or more emails are already registered users or have an active pending invite; OR this requestId was already used for a different set of emails.
429More than 20 requests from this client within the last hour.
500Unexpected server error. Safe to retry.