Skip to main content

Base URL

The Inboxapp API gives you access to your team’s conversations and the CRM state around them. Every platform uses the same resources, so your code asks what an account can do instead of which platform it is on.

The data model

Authentication

Send your API token in the Authorization 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.
Reads never create a contact. Someone your team has never talked to or imported has none: message them by sending to a 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:
No match is an empty 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.
Check both before you call:
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 in platformData, tagged by _tag:
Ignore tags you don’t know.

Responses

Every documented field is present: a value that doesn’t apply is null. 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:
Brackets (ids[]=…) and comma-separated values aren’t accepted. See Query parameters.

Expansion

References are IDs by default. Use expand to embed the related resource next to its ID field, contact beside contactId, at most 4 per request:

Updates

In PATCH bodies, omitted fields are left unchanged, and null clears a nullable field.

Errors

Every error has the same body:
Branch on 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 carries X-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.