Skip to main content
GET
Export Contacts
Streams the same filtered set as List contacts (minus account_id, and at most 500 rows — see the caveat below) as text/csv. The column set is fixed — it does not track the raw table 1:1. In particular, several export columns are computed by flattening capture_payload.enrichment rather than being raw columns: All other columns are raw contact fields: id, first_name, last_name, title, company, email, phone, stage, source, tags, notes, owner_id, created_at, updated_at, target_at, lead_at, contact_at, disqualified_at, captured_by_card_id, agent_demo_id, agent_demo_url, agent_demo_phone, converted_to_account_id, converted_to_deal_id, converted_at. Array/object cells are flattened (tags joined with ; , any nested object JSON-encoded); empty cells are the empty string, not null. Accepts the same filters as List contacts, except there’s no account_id filter here. Free-text q matches the same fields (first/last name, email, title, company, company_domain).
This endpoint currently returns at most 500 rows. The route accepts limit up to 10000, but the underlying query builder re-clamps to 500, so anything above that has no effect — and the default limit=5000 is already silently truncated. The CSV carries no truncation indicator: you get a well-formed 500-row file with no way to tell rows were dropped. If your org has more than 500 matching contacts, page through GET /contacts with limit/offset and use the X-Total-Count header to know when you’ve read them all, rather than treating this endpoint’s output as a full extract.

Auth

Requires a CRM read scope and an active organization on the token. Any of contacts:read, deals:read, companies:read, or activities:read qualifies, as does any *:manage scope — manage implies read.

Response

200text/csv body with a Content-Disposition: attachment; filename="contacts-<timestamp>.csv" header. No JSON envelope.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Query Parameters

stage
string | null

Funnel stage filter: a single value ('contact') or a comma list ('target,lead').

owner_id
string | null

Filter to contacts owned by this Logto user id.

source
string | null

Filter by origin tag; exact match. Values written by the backend: 'manual', 'import' (CSV import), 'customer_intel', 'scan_badge', 'scan_card', 'share_back'.

disqualified
boolean | null

Filter by disqualification: true for disqualified only, false for active only.

q
string | null

Free-text search across first/last name, email, title, company, and company domain.

limit
integer
default:5000

Requested row count. Accepted up to 10000, but the export currently returns at most 500 rows — larger values (including the 5000 default) have no effect and the CSV is truncated with no indicator. Page GET /contacts with limit/offset and X-Total-Count for a full extract.

Response

Successful Response