List a campaign's contacts

View as Markdown
Returns the campaign's contacts, oldest first (`created_at` ascending), optionally filtered by `status`. Use `status=pending` to see who is still to be reached, or `status=dnc` to review opt-outs. Items leave out `metadata` and the CRM sync columns. Pagination is by page number, with a `total` across all pages: keep requesting pages while `page * limit < total`. **Consistency.** Pages are cached for up to 30 seconds. Adding contacts or a dialer claim clears the cache, but status changes from finished calls can take up to 30 seconds to appear. **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` (reads included), 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"

UUID of the campaign. An unknown, deleted or foreign campaign answers 404; a value that is not a UUID answers 400.

Query parameters

pageintegerOptional1-100000Defaults to 1

1-indexed page number. An out-of-range or non-integer value is rejected with 400 Invalid query params.

limitintegerOptional1-100Defaults to 50

Contacts per page. An out-of-range or non-integer value is rejected with 400 (not clamped).

statusenumOptional

Only contacts in this status (see CampaignContactListItem.status). An unknown value is rejected with 400.

Response

One page of contacts.
dataobject

Errors

400
Bad Request Error
401
Unauthorized Error
403
Forbidden Error
404
Not Found Error
429
Too Many Requests Error