Messages

Sending messages

POST /messages queues a text or media message to one user who opted in, and answers 202 Accepted.

POST /messages
curl https://api.quic.chat/platform/v1/messages \
  -H "Authorization: Bearer $QUIC_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "to": { "appUserId": "u_4f9XkQ2bT7mN1pR8sV0wYz" },
    "type": "text",
    "text": "Hello from my first QuiC app πŸ‘‹",
    "clientReference": "order-1042"
  }'
202 Accepted
HTTP/1.1 202 Accepted
QuiC-Request-Id: req_...
QuiC-Version: 2026-10-01

{
  "id": "cmg4r2x0p0001ab12cd34ef56",
  "status": "accepted",
  "appUserId": "u_4f9XkQ2bT7mN1pR8sV0wYz",
  "type": "text",
  "createdAt": "2026-10-01T09:30:00.000Z",
  "clientReference": "order-1042"
}

Request body#

POST /messages fields
FieldTypeNotes
toobjectEither { "appUserId": "u_…" } or, for internal live apps with a live key, { "email": "…" } for someone in your organization.
typestringtext, image, video, audio or file.
textstring ≀ 4096Required for text; an optional caption for media.
mediaIdstringFrom POST /media; required for media types.
clientReferencestring ≀ 128Your own id, echoed in message.status events.

Idempotency#

Idempotency-Key is required: any unique string up to 255 characters, such as a UUID. QuiC keeps it for 24 hours. Retrying with the same key and the same body returns the first response (with Idempotent-Replayed: true) and never sends twice. The same key with a different body is 422 idempotency_key_reused.

The 24-hour window#

Consent is always required. On top of it, to keep business messages welcome: within 24 hours of the user's last message to you, you can reply freely (subject to rate limits). Outside that window you can start at most 3 messages per user per 24 hours. GET /users/:appUserId tells you whether the window is open.

Delivery status#

GET /messages/:id returns the message and its status: sent β†’ delivered β†’ read. Subscribe to message.status to be told instead of polling. Messages the user sent you have status received.

Send errors#

Errors from POST /messages
HTTPcodeMeaning
400idempotency_key_requiredAdd an Idempotency-Key header.
400invalid_requestThe body failed validation; see error.details.
403consent_requiredThe user has not opted in, or opted out, or blocked you.
403recipient_not_testerSandbox: the user is not an accepted tester.
403recipient_outside_orgInternal live: the user is not in your organization.
403recipient_org_blocks_businessesThe user's organization doesn't allow outside businesses.
403recipient_unavailableThe account is not active.
403app_suspendedThe app is suspended or rejected.
403email_addressing_not_allowedEmail addressing needs internal live + a live key.
404recipient_not_foundNo such appUserId (or email) for this app.
409media_not_uploadedThe media upload has not finished.
422media_invalidThe uploaded file does not match what you declared.
422idempotency_key_reusedSame key, different body.
429daily_quota_exceededDaily message quota reached.
429business_initiated_capMore than 3 business-initiated messages to this user in 24 hours.
429rate_limitedToo many requests; wait Retry-After seconds.