Skip to main content
POST

Authorizations

Authorization
string
header
required

Your workspace API key, sent as Authorization: Bearer blu_.... Workspace admins can find it in the Blujay app under API.

An API key has full access to your workspace and works on every endpoint. There is no test mode: every key sends real messages and changes real data, so keep it secret and use it only from your server.

Each API key can make 600 read requests and 120 write requests per minute, plus 60 attachment requests per minute. Over a limit you get 429 RATE_LIMIT_EXCEEDED with Retry-After.

Reseller partner keys. A partner key acts for one of the partner's customers when the request names it in the Blujay-Workspace header (the customer's workspace_ ID). Without the header it reaches only /v1/partner/* and /v1/me. Each customer gets the limits above for each partner key, and all of a partner's requests together get ten times those limits; a 429 says which in error.details[0].scope (partner_customer or partner). A messaging key can read anything for a customer and change chats, messages, contacts, attachments and vCards; everything else needs an admin key (403 PARTNER_ROLE_FORBIDDEN). Paused or closing customers can be read but not changed (409 CUSTOMER_PAUSED or CUSTOMER_CLOSING). Any other workspace ID in the header returns 404 NOT_FOUND; using the header with any other credential returns 400 WORKSPACE_HEADER_NOT_ALLOWED.

Headers

Idempotency-Key
string

A unique value you choose (1–255 characters) that makes this request safe to retry. Send the same key with the same request and Blujay returns the original response instead of doing the work again. Use a new key for each new action.

Blujay keeps keys for at least 24 hours. Keys are separate for each API key and each route family (for example every POST /v1/chats/{chat_id}/messages shares one). Reusing a key with a different request returns 409 IDEMPOTENCY_REQUEST_MISMATCH. Sending it while the first request is still running returns 409 IDEMPOTENCY_IN_PROGRESS; retry shortly.

Required string length: 1 - 255

Path Parameters

message_id
string
required
Pattern: ^msg_[A-Za-z0-9_-]+$
Example:

"msg_abc123"

Body

application/json
type
enum<string>
required

One of Apple's six standard tapbacks, or custom for an emoji reaction (set emoji).

Available options:
love,
like,
dislike,
laugh,
emphasize,
question,
custom
emoji
string

Required with type custom, and not allowed with the standard types.

Minimum string length: 1
Example:

"😍"

part_index
integer
default:0

Which part of the message to react to, numbered the same way as part_index in reaction.added. For a text-only message, 0 is the only part.

Required range: x >= 0

Response

Blujay accepted the reaction and is sending it from the message's phone number. Confirm it through the reaction.added or reaction.removed webhook. If the reaction was already in place (or already absent), the response is the same and nothing is sent.

Wraps every successful response. The result is in data.

status
enum<string>
required
Available options:
success
trace_id
string
required
Pattern: ^trc_[A-Za-z0-9_-]+$
Example:

"trc_8f2a1c0e4b7d"

timestamp
string<date-time>
required
Example:

"2026-10-14T17:01:00.000Z"

data
object
required
client_request_id
string

Your X-Request-ID header value, echoed back when you send one. Not included on the send responses (POST /v1/chats and POST /v1/chats/{chat_id}/messages); keep your own mapping from your request ID to the returned message ID there.