List a campaign's contacts
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(orwrite/full). - Rate limit: General API — 120 requests/min per workspace on Starter or with no active plan, 200 on Growth, 300 on Business, 600 on Enterprise. The 5/min contacts-import limit does not apply to this route. See Rate limits.
- Plan: Available on every plan.
Authentication
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.
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.
Path parameters
UUID of the campaign. An unknown, deleted or foreign campaign answers 404; a value that is not a UUID answers 400.
Query parameters
1-indexed page number. An out-of-range or non-integer value is rejected with 400 Invalid query params.
Contacts per page. An out-of-range or non-integer value is rejected with 400 (not clamped).
Only contacts in this status (see CampaignContactListItem.status). An unknown value is rejected with 400.

