/api/v1/contactscontacts:readList the workspace's contacts, newest first. Offset pagination; no cursor.
Query parameters
| Name | Type | Rules |
|---|---|---|
limit | integer | 1–200, default 50 (out-of-range values are clamped) |
offset | integer | ≥0, default 0 |
query | string | case-insensitive substring match on first_name, last_name, email, company |
curl "https://app.outboundrix.io/api/v1/contacts?limit=50&offset=0&query=acme" \
-H "Authorization: Bearer obx_live_sk_XXXXXXXX"200 OK
{
"count": 1,
"rows": [
{
"id": 1042,
"workspace_id": "7",
"company_id": null,
"first_name": "Dana",
"last_name": "Ruiz",
"email": "dana@acme.io",
"email_status": "valid",
"phone": null,
"title": "Head of Sales",
"company": "Acme",
"industry": "Software",
"location": "Austin, US",
"employees": "51-200",
"score": 82,
"status": "new",
"notes": null,
"custom": {},
"created_at": "2026-10-02T09:20:00.000Z",
"updated_at": "2026-10-02T09:20:00.000Z"
}
]
}- count is the number of rows in this page, not the workspace total. Keep paging until a page returns fewer than limit.
- Order is created_at then id, newest first, so pages never repeat or skip rows that share a timestamp (a bulk import writes many at once).
- Rows are the full contacts record, so columns added by later migrations appear without notice.