Base URL
The data model
Authentication
Send your API token in theAuthorization header: Authorization: Bearer <token>. The token decides the team, so no path or parameter names one.
Profiles and contacts
A profile holds what the platform says about a person:username, displayName, bio, follower counts. A contact holds what your team says about them: statusId, tagIds, notes, valuation, assigneeId. A contact groups one or more profiles.
A thread is always with one profile, and its contactId points to the contact that profile belongs to.
profile target.
IDs
A
platformId always comes with a platform, and means nothing without it. To find a resource by its platform identity, filter its collection:
data array, never a 404.
Platforms and capabilities
Platforms differ: one lets you edit a message, another doesn’t. The API expresses that as capabilities instead of per-platform endpoints.GET /platforms lists the platforms available to your team, with their capabilities and limits.
New platforms may be added within v2, so treat
platform as an open string. Code that checks capabilities keeps working when they are. See Platforms and capabilities for what each platform supports.
Platform data
Fields every platform has are top-level. Fields only one platform has are inplatformData, tagged by _tag:
Responses
Every documented field is present: a value that doesn’t apply isnull. Timestamps are ISO 8601 in UTC. Within v2, fields, enum values and error codes may be added, so ignore unknown fields and handle unknown enum values.
Pagination
Collections return{ "data": [...], "nextCursor": "..." }. Pass nextCursor back as cursor, with the same filters, to read the next page. It is null on the last page. limit defaults to 50, up to 100. See Pagination.
Query parameters
To pass several values, repeat the key:ids[]=…) and comma-separated values aren’t accepted. See Query parameters.
Expansion
References are IDs by default. Useexpand to embed the related resource next to its ID field, contact beside contactId, at most 4 per request:
Updates
InPATCH bodies, omitted fields are left unchanged, and null clears a nullable field.
Errors
Every error has the same body:code, the contract. message can be shown to a person and may change. details is null or the object documented for that code. Share requestId, also in the X-Request-Id header, when you contact support. See Error codes.
Sending safely
POST /messages takes an optional Idempotency-Key header. Retrying with the same key never sends twice: a replay returns the original result. Without a key, a retry can send twice.
Rate limits
Each team can make 300 requests per minute, 10,000 per hour and 100,000 per day. Every response carriesX-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Past a limit, requests fail with 429 rateLimited and a Retry-After header. See Rate limits.