Download the CSV template

View as Markdown
Returns a one-line CSV with the recommended headers (`phone_number,name,email,whatsapp_number`) as the attachment `contacts-template.csv`. Add any extra columns you want as metadata, fill it in with numbers that include the country code, and upload it with `POST /api/campaigns/{campaignId}/contacts/upload-preview`. The template is static: `campaignId` is neither validated nor looked up. **Access** - **Required scope:** `read` (or `write`/`full`). - **Rate limit:** Contacts import — 5 requests/min per workspace, shared by every route under `/api/campaigns/{campaignId}/contacts`, on top of the general API limit. See [Rate limits](/rate-limits). - **Plan:** Available on every plan.

Authentication

AuthorizationBearer
Workspace API key: `jl_` followed by 64 lowercase hex characters, created by the workspace owner in the dashboard (**Settings → API Keys**) and sent as `Authorization: Bearer jl_...`. The plaintext is shown once, at creation; Jelliu stores only a SHA-256 hash. A workspace can hold up to 25 active keys. | Scope | GET / HEAD | POST / PUT / PATCH / DELETE | Admin-only routes | | --- | --- | --- | --- | | `read` | Yes | No | No | | `write` | Yes | Yes | No | | `full` | Yes | Yes | Yes | Operations restricted to admins or owners reject keys without the `full` scope with `403`, and say so in their description. No key, whatever its scope, can mint or revoke API keys or rotate a webhook secret — that requires a signed-in owner session. A revoked key stops authenticating within about 10 seconds. See [Authentication](/authentication).

Path parameters

campaignIdstringRequiredformat: "uuid"
Any campaign id. It is not validated or looked up, so the template is returned for any value.

Response headers

Content-DispositionstringOptional

Always an attachment named contacts-template.csv.

Response

The CSV template.

Errors

401
Unauthorized Error
403
Forbidden Error
429
Too Many Requests Error