SendKuy API
API Reference

Import up to 1000 contacts in the background

Answers 202 with a job, not with contacts: nothing has been created yet when the call returns. Poll GET /jobs/{id} to watch it finish and to read the per-row errors.

Try it — POST /contacts/bulk

Kept for this tab only — it disappears when you close it, and it is never sent anywhere except as the Authorization header on the call below.

Authorization

bearerAuth contacts:write
AuthorizationBearer <token>

Authorization: Bearer sk_live_.... Keys in the query string or the request body are refused — a URL is logged by every proxy it passes, and that is how customer keys leak.

A key carries scopes. A call outside them answers 403 with insufficient_scope and names the scope it wanted.

In: header

Scope: contacts:write

Header Parameters

Idempotency-Key?string

Any unique string, one per logical request. Retrying with the same key returns the first answer instead of doing the work twice, and answers with Idempotent-Replay: true.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST https://app.sendkuy.com/api/v1/contacts/bulk \  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \  -H "Content-Type: application/json" \  -d '{  "contacts": [    {      "first_name": "Citra",      "whatsapp": "+6281234567892"    },    {      "first_name": "Dewi",      "email": "dewi@example.com"    }  ]}'
{  "data": {    "object": "job",    "id": "job_9cBe3A1H-SLhW5fONWZ32wb-IIio5Ts3",    "type": "contacts.bulk",    "status": "queued",    "total": 0,    "processed": 0,    "failed": 0,    "errors": [      {}    ],    "created_at": "2019-08-24T14:15:22Z",    "completed_at": "2019-08-24T14:15:22Z"  }}