List account contacts across accounts in this entity
Returns person contacts for ALL accounts in the API key’s entity,
with optional filters by account, external_source, or external_id.
Stripe-style cursor pagination via starting_after.
Use this endpoint when you need to look up contacts that were imported
from an external system (Versa Cloud, Bubble, Shopify, etc.) by their
provenance tuple (account_id, external_source, external_id). Powers
migration back-read paths, Customer 360 cross-account contact rollups,
RMA contact pickers, and integration sync resolvers that hydrate by
provenance.
Layer 1 (multi-tenant isolation): the account_contacts table has no
entity_id column; scope is enforced via JOIN to accounts.entity_id.
A crafted cursor pointing at a sister-entity contact returns 0 rows
from the inner cursor SELECT, so no row leak.
Filed by the WSS Versa migration agent as a sister of
GET /v1/account-addresses (NEW-GAP-MIGRATION-API-V1-GET-ACCOUNT-CONTACTS,
P1, 2026-05-17). Cross-refs:
docs/prompts/completed/NEW-GAP-MIGRATION-API-V1-GET-ACCOUNT-CONTACTS [COMPLETE].md.
Requires accounts:read OR contacts:read scope.
Authorizations
API key issued per entity via Settings > Developers > API Keys.
Each key carries scopes (e.g. orders:read, products:write).
Bearer token format: Authorization: Bearer ark_live_ent_
Test keys use ark_test_ent_. Both are issued per entity
via Settings > Developers > API Keys.
Query Parameters
Filter to contacts belonging to this account.
Filter by provenance source label (e.g. versa_cloud, bubble,
shopify). Migration back-read pattern.
Filter by the source system's row identifier. Often combined
with external_source for an exact-tuple lookup.
Number of rows to return. Default 25, max 500.
1 <= x <= 500Cursor: a contact id from a previous response. Returns rows
ordered before this cursor by (created_at DESC, id DESC).

