Adds a tapback to a message in an iMessage chat, from the Blujay phone number the chat belongs to. You can react to messages your contacts sent and to your own. The six standard reactions are love, like, dislike, laugh, emphasize and question. To react with any emoji, send type: custom with emoji set to exactly one emoji, such as 😍 or 👍🏽. A symbol sent without its emoji style, such as ❤, is sent and reported as iPhones send it (❤️). A message can carry one reaction per person on each part, so adding a different one, standard or emoji, replaces yours. Recipients on iOS 17 or earlier see an emoji reaction as the text “Reacted 😍 to …”.
Stickers contacts put on your messages arrive as sticker reactions, but you can’t send stickers (400 VALIDATION_ERROR).
A 202 means Blujay accepted the reaction and is sending it. Confirm it through the reaction.added webhook, where reactor is your phone number. If you already have that reaction on the message, Blujay returns 202 without sending it again. Send an Idempotency-Key so a retry after a lost response is safe.
iMessage only: a message sent or received as SMS or RCS returns 400 UNSUPPORTED_CHAT_OPERATION. A reaction can’t itself be reacted to (404 NOT_FOUND), and an unsent or failed message can’t be either (400 VALIDATION_ERROR). A reaction notifies the other person like a message, so a chat with an opted-out contact returns 403 RECIPIENT_SUPPRESSED, the same rule as sending a message in it.
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.
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.
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.
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.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Blujay API","description":"Send and receive iMessage, RCS and SMS from your Blujay phone numbers with the Blujay API.","colors":{"primary":"#007AFF","light":"#4DA3FF","dark":"#007AFF"},"logo":{"light":"https://mintcdn.com/blujay-api/Z06BDuKbaRqwvTNY/logo/light.svg?fit=max\u0026auto=format\u0026n=Z06BDuKbaRqwvTNY\u0026q=85\u0026s=7e2d044d91197ee37ad1e32cf7c89936","dark":"https://mintcdn.com/blujay-api/Z06BDuKbaRqwvTNY/logo/dark.svg?fit=max\u0026auto=format\u0026n=Z06BDuKbaRqwvTNY\u0026q=85\u0026s=d5a73c28432c5541ee1c48a16175a845","href":"https://docs.blujay.io"},"favicon":"https://mintcdn.com/blujay-api/Z06BDuKbaRqwvTNY/favicon.png?fit=max\u0026auto=format\u0026n=Z06BDuKbaRqwvTNY\u0026q=85\u0026s=52b83434892a2ee20969e9f587e906c2","api":{"openapi":"api-reference/openapi.yaml","playground":{"display":"interactive"},"examples":{"defaults":"all","languages":["curl","javascript","python","go","ruby","php"]}},"background":{"color":{"dark":"#141414"}},"navbar":{"links":[{"href":"mailto:support@blujay.io","label":"Support"}],"primary":{"type":"button","label":"Sign up free","href":"https://app.blujay.io/?auth=register"}},"footer":{"socials":{"x":"https://x.com/blujayio","website":"https://blujay.io"},"links":[{"header":"Blujay","items":[{"label":"Help center","href":"https://support.blujay.io"},{"label":"Open Blujay","href":"https://app.blujay.io"}]}]},"fonts":{"family":"Geist"},"contextual":{"options":["copy","view","chatgpt","claude","cursor","mcp"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"blujay-api","hasAudioNarration":false,"actualSubdomain":"blujay-api","customDomains":["docs.blujay.io"],"gitSource":{"type":"github","owner":"blujayhq","repo":"api-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":"","_id":"6ada546d4fd5aea585776e0c"},"entitlements":{},"buildId":"6af3f64c47adc41223f29755","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"API reference","count":150},{"language":"default","tag":"Guides","count":92},{"language":"default","tag":"Errors","count":84},{"language":"default","tag":"Endpoints","count":65},{"language":"default","tag":"Contacts","count":21},{"language":"default","tag":"Messages","count":21},{"language":"default","tag":"Webhooks","count":20},{"language":"default","tag":"Chats","count":17},{"language":"default","tag":"Reseller partners","count":11},{"language":"default","tag":"Sending messages","count":11}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"html:not(.dark) h1,html:not(.dark) h2,html:not(.dark) h3{color:#0A2540}html:not(.dark) .prose{color:#425466}#navigation-items a,#navigation-items .sidebar-group>li>button{padding-top:4px;padding-bottom:4px}#navigation-items>div:has(>.sidebar-group-header){margin-top:1.25rem}#navigation-items>div:first-child:has(>.sidebar-group-header){margin-top:0}#navigation-items .sidebar-group-header{margin-bottom:0.375rem}#navigation-items>div:only-of-type>.sidebar-group-header{display:none}#navigation-items>div:only-of-type>.sidebar-group>li+li{margin-top:0}#navigation-items>div:only-of-type>.sidebar-group>li>button{font-weight:500}#navigation-items>div:only-of-type>.sidebar-group>li>button,#navigation-items>div:only-of-type a:not([aria-current=\"page\"]),#navigation-items>div:only-of-type a:not([aria-current=\"page\"]):hover{color:#0A2540}.dark #navigation-items>div:only-of-type>.sidebar-group>li>button,.dark #navigation-items>div:only-of-type a:not([aria-current=\"page\"]),.dark #navigation-items>div:only-of-type a:not([aria-current=\"page\"]):hover{color:#fff}#navigation-items>div:only-of-type>.sidebar-group>li>ul{margin-left:1rem;padding-left:0;margin-top:0;border-left:1px solid rgb(0 0 0 / 0.14)}#navigation-items>div:only-of-type>.sidebar-group>li>ul a{padding-left:12px!important}.dark #navigation-items>div:only-of-type>.sidebar-group>li>ul{border-left-color:rgb(255 255 255 / 0.2)}#page-title{font-size:42px;line-height:1.2;font-weight:500;letter-spacing:-0.03em}#header .prose{font-size:20px;line-height:28px;letter-spacing:-0.02em}.dark #header .prose{color:rgb(255 255 255 / 0.8)}.dark #page-title{color:#fff}#content{line-height:24px;letter-spacing:-0.01em}.dark #content{color:rgb(255 255 255 / 0.8)}#content h2:not([data-component-part=\"card-title\"]){font-size:35px;line-height:42px;font-weight:500;letter-spacing:-0.03em;margin-top:48px;margin-bottom:15px}#content h3:not([data-component-part=\"card-title\"]){font-size:24px;line-height:32px;font-weight:500;letter-spacing:-0.02em;margin-top:32px;margin-bottom:12px}#content p{margin-top:16px;margin-bottom:0}#content ul,#content ol{margin-top:16px;margin-bottom:0}#content li{margin-top:0;margin-bottom:0}#content table{font-size:15px;line-height:22.5px}#content .callout{border-radius:8px;padding:14px 16px}#content .callout>.prose{font-size:16px;line-height:24px}.dark #content .callout>.prose{color:rgb(255 255 255 / 0.85)}html:not(.dark) #content .callout>.prose{color:#425466}#content .callout[class*=\"border-green\"]{background:rgb(0 122 255 / 0.05);border-color:rgb(0 122 255 / 0.25)}#content .callout[class*=\"border-green\"] svg{color:#007AFF;fill:currentColor}#content ul{padding-left:0;list-style:none}#content ul>li{margin-left:-6px}#content li+li{margin-top:8px}#content ul>li::before{content:\"\";position:absolute;width:5px;height:5px;border-radius:50%;left:15px;top:9.5px;background-color:#425466}.dark #content ul>li::before{background-color:rgb(255 255 255 / 0.8)}#content h2+*,#content h3+*{margin-top:0}#content a.link{color:#007AFF;font-weight:400;border-bottom:0;text-decoration:underline;text-decoration-color:rgb(0 122 255 / 0.4);text-underline-offset:auto}.dark #content a.link{color:#4DA3FF;text-decoration-color:rgb(77 163 255 / 0.4)}.dark #content strong{color:#fff;font-weight:700}"}],"page":{"pagePath":"api-reference/messages/add-a-reaction","slug":"/api-reference/messages/add-a-reaction","pageMetadata":{"title":"Add a reaction","description":"Adds a tapback to a message in an iMessage chat, from the Blujay phone number the chat belongs to. You can react to messages your contacts sent and to your own. The six standard reactions are `love`, `like`, `dislike`, `laugh`, `emphasize` and `question`. To react with any emoji, send `type: custom` with `emoji` set to exactly one emoji, such as `😍` or `👍🏽`. A symbol sent without its emoji style, such as `❤`, is sent and reported as iPhones send it (`❤️`). A message can carry one reaction per person on each part, so adding a different one, standard or emoji, replaces yours. Recipients on iOS 17 or earlier see an emoji reaction as the text \"Reacted 😍 to …\".\n\nStickers contacts put on your messages arrive as `sticker` reactions, but you can't send stickers (`400 VALIDATION_ERROR`).\n\nA `202` means Blujay accepted the reaction and is sending it. Confirm it through the `reaction.added` webhook, where `reactor` is your phone number. If you already have that reaction on the message, Blujay returns `202` without sending it again. Send an `Idempotency-Key` so a retry after a lost response is safe.\n\niMessage only: a message sent or received as SMS or RCS returns `400 UNSUPPORTED_CHAT_OPERATION`. A reaction can't itself be reacted to (`404 NOT_FOUND`), and an unsent or failed message can't be either (`400 VALIDATION_ERROR`). A reaction notifies the other person like a message, so a chat with an opted-out contact returns `403 RECIPIENT_SUPPRESSED`, the same rule as sending a message in it.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/messages/{message_id}/reactions","href":"/api-reference/messages/add-a-reaction","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Adds a tapback to a message in an iMessage chat, from the Blujay phone number the chat belongs to. You can react to messages your contacts sent and to your own. The six standard reactions are \", _jsx(_components.code, {\n children: \"love\"\n }), \", \", _jsx(_components.code, {\n children: \"like\"\n }), \", \", _jsx(_components.code, {\n children: \"dislike\"\n }), \", \", _jsx(_components.code, {\n children: \"laugh\"\n }), \", \", _jsx(_components.code, {\n children: \"emphasize\"\n }), \" and \", _jsx(_components.code, {\n children: \"question\"\n }), \". To react with any emoji, send \", _jsx(_components.code, {\n children: \"type: custom\"\n }), \" with \", _jsx(_components.code, {\n children: \"emoji\"\n }), \" set to exactly one emoji, such as \", _jsx(_components.code, {\n children: \"😍\"\n }), \" or \", _jsx(_components.code, {\n children: \"👍🏽\"\n }), \". A symbol sent without its emoji style, such as \", _jsx(_components.code, {\n children: \"❤\"\n }), \", is sent and reported as iPhones send it (\", _jsx(_components.code, {\n children: \"❤️\"\n }), \"). A message can carry one reaction per person on each part, so adding a different one, standard or emoji, replaces yours. Recipients on iOS 17 or earlier see an emoji reaction as the text “Reacted 😍 to …”.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Stickers contacts put on your messages arrive as \", _jsx(_components.code, {\n children: \"sticker\"\n }), \" reactions, but you can’t send stickers (\", _jsx(_components.code, {\n children: \"400 VALIDATION_ERROR\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A \", _jsx(_components.code, {\n children: \"202\"\n }), \" means Blujay accepted the reaction and is sending it. Confirm it through the \", _jsx(_components.code, {\n children: \"reaction.added\"\n }), \" webhook, where \", _jsx(_components.code, {\n children: \"reactor\"\n }), \" is your phone number. If you already have that reaction on the message, Blujay returns \", _jsx(_components.code, {\n children: \"202\"\n }), \" without sending it again. Send an \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" so a retry after a lost response is safe.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"iMessage only: a message sent or received as SMS or RCS returns \", _jsx(_components.code, {\n children: \"400 UNSUPPORTED_CHAT_OPERATION\"\n }), \". A reaction can’t itself be reacted to (\", _jsx(_components.code, {\n children: \"404 NOT_FOUND\"\n }), \"), and an unsent or failed message can’t be either (\", _jsx(_components.code, {\n children: \"400 VALIDATION_ERROR\"\n }), \"). A reaction notifies the other person like a message, so a chat with an opted-out contact returns \", _jsx(_components.code, {\n children: \"403 RECIPIENT_SUPPRESSED\"\n }), \", the same rule as sending a message in it.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Add a reaction","description":"Adds a tapback to a message in an iMessage chat, from the Blujay phone number the chat belongs to. You can react to messages your contacts sent and to your own. The six standard reactions are `love`, `like`, `dislike`, `laugh`, `emphasize` and `question`. To react with any emoji, send `type: custom` with `emoji` set to exactly one emoji, such as `😍` or `👍🏽`. A symbol sent without its emoji style, such as `❤`, is sent and reported as iPhones send it (`❤️`). A message can carry one reaction per person on each part, so adding a different one, standard or emoji, replaces yours. Recipients on iOS 17 or earlier see an emoji reaction as the text \"Reacted 😍 to …\".\n\nStickers contacts put on your messages arrive as `sticker` reactions, but you can't send stickers (`400 VALIDATION_ERROR`).\n\nA `202` means Blujay accepted the reaction and is sending it. Confirm it through the `reaction.added` webhook, where `reactor` is your phone number. If you already have that reaction on the message, Blujay returns `202` without sending it again. Send an `Idempotency-Key` so a retry after a lost response is safe.\n\niMessage only: a message sent or received as SMS or RCS returns `400 UNSUPPORTED_CHAT_OPERATION`. A reaction can't itself be reacted to (`404 NOT_FOUND`), and an unsent or failed message can't be either (`400 VALIDATION_ERROR`). A reaction notifies the other person like a message, so a chat with an opted-out contact returns `403 RECIPIENT_SUPPRESSED`, the same rule as sending a message in it.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/messages/{message_id}/reactions","href":"/api-reference/messages/add-a-reaction","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Messages"],"summary":"Add a reaction","description":"Adds a tapback to a message in an iMessage chat, from the Blujay phone number the chat belongs to. You can react to messages your contacts sent and to your own. The six standard reactions are `love`, `like`, `dislike`, `laugh`, `emphasize` and `question`. To react with any emoji, send `type: custom` with `emoji` set to exactly one emoji, such as `😍` or `👍🏽`. A symbol sent without its emoji style, such as `❤`, is sent and reported as iPhones send it (`❤️`). A message can carry one reaction per person on each part, so adding a different one, standard or emoji, replaces yours. Recipients on iOS 17 or earlier see an emoji reaction as the text \"Reacted 😍 to …\".\n\nStickers contacts put on your messages arrive as `sticker` reactions, but you can't send stickers (`400 VALIDATION_ERROR`).\n\nA `202` means Blujay accepted the reaction and is sending it. Confirm it through the `reaction.added` webhook, where `reactor` is your phone number. If you already have that reaction on the message, Blujay returns `202` without sending it again. Send an `Idempotency-Key` so a retry after a lost response is safe.\n\niMessage only: a message sent or received as SMS or RCS returns `400 UNSUPPORTED_CHAT_OPERATION`. A reaction can't itself be reacted to (`404 NOT_FOUND`), and an unsent or failed message can't be either (`400 VALIDATION_ERROR`). A reaction notifies the other person like a message, so a chat with an opted-out contact returns `403 RECIPIENT_SUPPRESSED`, the same rule as sending a message in it.\n","operationId":"createPublicMessageReaction","security":["86a8cff5-88d6-428f-a4f8-ab50321edcc2"],"parameters":["bec106dd-1184-4aa8-94e7-065730dda565","dabd94ee-ece0-4a90-8ecd-fd75b5d48dd9"],"requestBody":"ff04cdeb-a9d0-41e2-a525-d1dba262ca4a","responses":{"202":"773c1c57-41bc-411b-ac2b-59fc0957040f","400":"a93cdbe9-4fae-4654-b97d-ec8267fd7a01","403":"6883ba3d-50ec-4b82-9f4c-df00ec04b5ea","404":"81e3bd54-f8de-4dc3-886a-e989a293fb58","409":"e6fd8aec-3912-4700-adad-c44b42b94eaa","502":"e69a9b0f-6c6a-4444-a22f-94372954df20","503":"14646540-a5ee-45eb-9a7e-c298510e3ad6"},"method":"post","type":"path","servers":["660565a7-87d9-4b09-af2e-872548a05c9e"],"path":"/v1/messages/{message_id}/reactions","baseUrlOptions":["https://api.blujay.io"],"title":"Add a reaction","codeSamples":[],"requestExampleLanguages":["bash","javascript","python","go","ruby","php"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"bec106dd-1184-4aa8-94e7-065730dda565":{"name":"message_id","in":"path","required":true,"schema":{"type":"string","examples":["msg_abc123"],"pattern":"^msg_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"","typeLabel":"string"}},"dabd94ee-ece0-4a90-8ecd-fd75b5d48dd9":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","minLength":1,"maxLength":255,"isRequired":false,"description":"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.\n\nBlujay 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.\n","uniqueKey":"","typeLabel":"string"},"description":"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.\n\nBlujay 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.\n"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"type":"string","enum":["love","like","dislike","laugh","emphasize","question","custom"],"description":"One of Apple's six standard tapbacks, or `custom` for an emoji reaction (set `emoji`).","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"emoji":{"type":"string","description":"Required with type `custom`, and not allowed with the standard types.","minLength":1,"example":"😍","uniqueKey":"emoji","typeLabel":"string"},"part_index":{"type":"integer","minimum":0,"default":0,"description":"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.","uniqueKey":"part_index","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"examples":{"love":{"title":"love","value":{"type":"love"}},"custom":{"title":"custom","value":{"type":"custom","emoji":"😍"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"773c1c57-41bc-411b-ac2b-59fc0957040f":{"description":"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.","headers":{"X-Trace-ID":{"description":"Unique ID for this request. It matches `trace_id` in the body. Include it when you contact Blujay support.","schema":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$"}}},"content":{"application/json":{"schema":{"type":"object","description":"Wraps every successful response. The result is in `data`.","required":["data","status","trace_id","timestamp"],"properties":{"status":{"type":"string","enum":["success"],"isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"trace_id":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"trace_id","typeLabel":"string"},"timestamp":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","isRequired":true,"uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"data":{"type":"object","additionalProperties":false,"required":["message_id","chat_id","phone_number_id","operation","status","reaction"],"properties":{"message_id":{"type":"string","examples":["msg_abc123"],"pattern":"^msg_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"data.message_id","typeLabel":"string"},"chat_id":{"type":"string","examples":["chat_abc123"],"pattern":"^chat_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"data.chat_id","typeLabel":"string"},"phone_number_id":{"type":"string","examples":["phone_abc123"],"pattern":"^phone_[A-Za-z0-9_-]+$","description":"The Blujay phone number the reaction is sent from, which is the number in the message's chat.","isRequired":true,"uniqueKey":"data.phone_number_id","typeLabel":"string"},"operation":{"type":"string","enum":["reaction_add","reaction_remove"],"isRequired":true,"uniqueKey":"data.operation","typeLabel":"enum\u003cstring>"},"status":{"const":"accepted","isRequired":true,"uniqueKey":"data.status","typeLabel":"any"},"reaction":{"type":"object","additionalProperties":false,"required":["type","part_index"],"properties":{"type":{"type":"string","enum":["love","like","dislike","laugh","emphasize","question","custom"],"description":"One of Apple's six standard tapbacks, or `custom` for an emoji reaction (set `emoji`).","isRequired":true,"uniqueKey":"data.reaction.type","typeLabel":"enum\u003cstring>"},"part_index":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"data.reaction.part_index","typeLabel":"integer"},"emoji":{"type":"string","description":"The emoji, present when `type` is `custom`.","minLength":1,"example":"😍","uniqueKey":"data.reaction.emoji","typeLabel":"string"}},"isRequired":true,"uniqueKey":"data.reaction","typeLabel":"object"}},"isRequired":true,"uniqueKey":"data","typeLabel":"object"},"client_request_id":{"type":"string","description":"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.","uniqueKey":"client_request_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"accepted":{"title":"accepted","value":{"status":"success","data":{"message_id":"msg_abc123","chat_id":"chat_abc123","phone_number_id":"phone_abc123","operation":"reaction_add","status":"accepted","reaction":{"type":"love","part_index":0}},"trace_id":"trc_8f2a1c0e4b7d","timestamp":"2026-10-14T17:02:00.000Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"a93cdbe9-4fae-4654-b97d-ec8267fd7a01":{"description":"The reaction was refused, and nothing was sent.\n\n`400`:\n- `VALIDATION_ERROR`: the request is invalid (including a `custom` reaction without exactly one emoji, or a sticker), or the message was unsent or failed to send.\n- `UNSUPPORTED_CHAT_OPERATION`: the message was sent or received as SMS or RCS. Reactions are iMessage only.\n\n`403 RECIPIENT_SUPPRESSED`: the contact in this chat opted out.\n\n`409`:\n- `MESSAGE_NOT_SENT_YET`: your message hasn't finished sending yet. Retry shortly.\n- `SENDER_UNAVAILABLE`: the phone number the message belongs to is no longer available.\n- `IDEMPOTENCY_REQUEST_MISMATCH` or `IDEMPOTENCY_IN_PROGRESS`: see `Idempotency-Key`.\n\n`502 CHANGE_REJECTED`: the phone number refused the reaction. Don't retry the same request.\n","headers":{"X-Trace-ID":{"description":"Unique ID for this request. It matches `trace_id` in the body. Include it when you contact Blujay support.","schema":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$"}}},"content":{"application/json":{"schema":{"type":"object","description":"Wraps every error response. Branch on `error.code`, and include `trace_id` when you contact support.","required":["status","error","trace_id","timestamp"],"properties":{"status":{"const":"error","isRequired":true,"uniqueKey":"status","typeLabel":"any"},"error":{"type":"object","required":["code","message","type","http_status","retryable","doc_url","details"],"properties":{"code":{"type":"string","description":"Stable, machine-readable error code. Branch on this value.","examples":["RATE_LIMIT_EXCEEDED","QUEUE_UNAVAILABLE","FEATURE_NOT_ENABLED"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation. It can change, so don't parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"type":{"type":"string","description":"Broad error category.","examples":["validation","auth","idempotency","rate_limit","queue","feature_gate"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"string"},"http_status":{"type":"integer","description":"The HTTP status code of the response.","enum":[400,401,403,404,409,413,415,422,429,500,502,503],"isRequired":true,"uniqueKey":"error.http_status","typeLabel":"enum\u003cinteger>"},"retryable":{"type":"boolean","description":"Whether sending the same request again later can succeed.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"Link to documentation for this error code.","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"details":{"type":"array","description":"Extra structured context, such as the fields that failed validation or the limit you hit.","items":{"type":"object","additionalProperties":true,"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"error.details","typeLabel":"object[]"},"retry_after":{"type":"integer","minimum":1,"description":"Seconds to wait before retrying. Also sent as the `Retry-After` header.","uniqueKey":"error.retry_after","typeLabel":"integer"},"reset_at":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","description":"When the limit you hit resets.","uniqueKey":"error.reset_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"trace_id":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"trace_id","typeLabel":"string"},"timestamp":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","isRequired":true,"uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"client_request_id":{"type":"string","description":"Your `X-Request-ID` header value, echoed back when you send one.","uniqueKey":"client_request_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":"error","error":{"code":"RATE_LIMIT_EXCEEDED","message":"\u003cstring>","type":"validation","http_status":400,"retryable":true,"doc_url":"\u003cstring>","details":[{}],"retry_after":2,"reset_at":"2026-10-14T17:01:00.000Z"},"trace_id":"trc_8f2a1c0e4b7d","timestamp":"2026-10-14T17:01:00.000Z","client_request_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"6883ba3d-50ec-4b82-9f4c-df00ec04b5ea":{"description":"The recipient opted out, so the message or reaction can't be sent.","headers":{"X-Trace-ID":{"description":"Unique ID for this request. It matches `trace_id` in the body. Include it when you contact Blujay support.","schema":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$"}}},"content":{"application/json":{"schema":{"type":"object","description":"Wraps every error response. Branch on `error.code`, and include `trace_id` when you contact support.","required":["status","error","trace_id","timestamp"],"properties":{"status":{"const":"error","isRequired":true,"uniqueKey":"status","typeLabel":"any"},"error":{"type":"object","required":["code","message","type","http_status","retryable","doc_url","details"],"properties":{"code":{"type":"string","description":"Stable, machine-readable error code. Branch on this value.","examples":["RATE_LIMIT_EXCEEDED","QUEUE_UNAVAILABLE","FEATURE_NOT_ENABLED"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation. It can change, so don't parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"type":{"type":"string","description":"Broad error category.","examples":["validation","auth","idempotency","rate_limit","queue","feature_gate"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"string"},"http_status":{"type":"integer","description":"The HTTP status code of the response.","enum":[400,401,403,404,409,413,415,422,429,500,502,503],"isRequired":true,"uniqueKey":"error.http_status","typeLabel":"enum\u003cinteger>"},"retryable":{"type":"boolean","description":"Whether sending the same request again later can succeed.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"Link to documentation for this error code.","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"details":{"type":"array","description":"Extra structured context, such as the fields that failed validation or the limit you hit.","items":{"type":"object","additionalProperties":true,"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"error.details","typeLabel":"object[]"},"retry_after":{"type":"integer","minimum":1,"description":"Seconds to wait before retrying. Also sent as the `Retry-After` header.","uniqueKey":"error.retry_after","typeLabel":"integer"},"reset_at":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","description":"When the limit you hit resets.","uniqueKey":"error.reset_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"trace_id":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"trace_id","typeLabel":"string"},"timestamp":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","isRequired":true,"uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"client_request_id":{"type":"string","description":"Your `X-Request-ID` header value, echoed back when you send one.","uniqueKey":"client_request_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"recipientSuppressed":{"title":"recipientSuppressed","value":{"status":"error","error":{"code":"RECIPIENT_SUPPRESSED","message":"Recipient is suppressed for outbound messaging","type":"authorization","http_status":403,"retryable":false,"doc_url":"https://docs.blujay.io/errors/recipient-suppressed","details":[]},"trace_id":"trc_8f2a1c0e4b7d","timestamp":"2026-10-14T00:00:00.000Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"81e3bd54-f8de-4dc3-886a-e989a293fb58":{"description":"The resource doesn't exist or isn't in your workspace.","headers":{"X-Trace-ID":{"description":"Unique ID for this request. It matches `trace_id` in the body. Include it when you contact Blujay support.","schema":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$"}}},"content":{"application/json":{"schema":{"type":"object","description":"Wraps every error response. Branch on `error.code`, and include `trace_id` when you contact support.","required":["status","error","trace_id","timestamp"],"properties":{"status":{"const":"error","isRequired":true,"uniqueKey":"status","typeLabel":"any"},"error":{"type":"object","required":["code","message","type","http_status","retryable","doc_url","details"],"properties":{"code":{"type":"string","description":"Stable, machine-readable error code. Branch on this value.","examples":["RATE_LIMIT_EXCEEDED","QUEUE_UNAVAILABLE","FEATURE_NOT_ENABLED"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation. It can change, so don't parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"type":{"type":"string","description":"Broad error category.","examples":["validation","auth","idempotency","rate_limit","queue","feature_gate"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"string"},"http_status":{"type":"integer","description":"The HTTP status code of the response.","enum":[400,401,403,404,409,413,415,422,429,500,502,503],"isRequired":true,"uniqueKey":"error.http_status","typeLabel":"enum\u003cinteger>"},"retryable":{"type":"boolean","description":"Whether sending the same request again later can succeed.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"Link to documentation for this error code.","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"details":{"type":"array","description":"Extra structured context, such as the fields that failed validation or the limit you hit.","items":{"type":"object","additionalProperties":true,"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"error.details","typeLabel":"object[]"},"retry_after":{"type":"integer","minimum":1,"description":"Seconds to wait before retrying. Also sent as the `Retry-After` header.","uniqueKey":"error.retry_after","typeLabel":"integer"},"reset_at":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","description":"When the limit you hit resets.","uniqueKey":"error.reset_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"trace_id":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"trace_id","typeLabel":"string"},"timestamp":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","isRequired":true,"uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"client_request_id":{"type":"string","description":"Your `X-Request-ID` header value, echoed back when you send one.","uniqueKey":"client_request_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":"error","error":{"code":"RATE_LIMIT_EXCEEDED","message":"\u003cstring>","type":"validation","http_status":400,"retryable":true,"doc_url":"\u003cstring>","details":[{}],"retry_after":2,"reset_at":"2026-10-14T17:01:00.000Z"},"trace_id":"trc_8f2a1c0e4b7d","timestamp":"2026-10-14T17:01:00.000Z","client_request_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"e6fd8aec-3912-4700-adad-c44b42b94eaa":{"description":"The reaction was refused, and nothing was sent.\n\n`400`:\n- `VALIDATION_ERROR`: the request is invalid (including a `custom` reaction without exactly one emoji, or a sticker), or the message was unsent or failed to send.\n- `UNSUPPORTED_CHAT_OPERATION`: the message was sent or received as SMS or RCS. Reactions are iMessage only.\n\n`403 RECIPIENT_SUPPRESSED`: the contact in this chat opted out.\n\n`409`:\n- `MESSAGE_NOT_SENT_YET`: your message hasn't finished sending yet. Retry shortly.\n- `SENDER_UNAVAILABLE`: the phone number the message belongs to is no longer available.\n- `IDEMPOTENCY_REQUEST_MISMATCH` or `IDEMPOTENCY_IN_PROGRESS`: see `Idempotency-Key`.\n\n`502 CHANGE_REJECTED`: the phone number refused the reaction. Don't retry the same request.\n","headers":{"X-Trace-ID":{"description":"Unique ID for this request. It matches `trace_id` in the body. Include it when you contact Blujay support.","schema":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$"}}},"content":{"application/json":{"schema":{"type":"object","description":"Wraps every error response. Branch on `error.code`, and include `trace_id` when you contact support.","required":["status","error","trace_id","timestamp"],"properties":{"status":{"const":"error","isRequired":true,"uniqueKey":"status","typeLabel":"any"},"error":{"type":"object","required":["code","message","type","http_status","retryable","doc_url","details"],"properties":{"code":{"type":"string","description":"Stable, machine-readable error code. Branch on this value.","examples":["RATE_LIMIT_EXCEEDED","QUEUE_UNAVAILABLE","FEATURE_NOT_ENABLED"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation. It can change, so don't parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"type":{"type":"string","description":"Broad error category.","examples":["validation","auth","idempotency","rate_limit","queue","feature_gate"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"string"},"http_status":{"type":"integer","description":"The HTTP status code of the response.","enum":[400,401,403,404,409,413,415,422,429,500,502,503],"isRequired":true,"uniqueKey":"error.http_status","typeLabel":"enum\u003cinteger>"},"retryable":{"type":"boolean","description":"Whether sending the same request again later can succeed.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"Link to documentation for this error code.","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"details":{"type":"array","description":"Extra structured context, such as the fields that failed validation or the limit you hit.","items":{"type":"object","additionalProperties":true,"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"error.details","typeLabel":"object[]"},"retry_after":{"type":"integer","minimum":1,"description":"Seconds to wait before retrying. Also sent as the `Retry-After` header.","uniqueKey":"error.retry_after","typeLabel":"integer"},"reset_at":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","description":"When the limit you hit resets.","uniqueKey":"error.reset_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"trace_id":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"trace_id","typeLabel":"string"},"timestamp":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","isRequired":true,"uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"client_request_id":{"type":"string","description":"Your `X-Request-ID` header value, echoed back when you send one.","uniqueKey":"client_request_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":"error","error":{"code":"RATE_LIMIT_EXCEEDED","message":"\u003cstring>","type":"validation","http_status":400,"retryable":true,"doc_url":"\u003cstring>","details":[{}],"retry_after":2,"reset_at":"2026-10-14T17:01:00.000Z"},"trace_id":"trc_8f2a1c0e4b7d","timestamp":"2026-10-14T17:01:00.000Z","client_request_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"e69a9b0f-6c6a-4444-a22f-94372954df20":{"description":"The reaction was refused, and nothing was sent.\n\n`400`:\n- `VALIDATION_ERROR`: the request is invalid (including a `custom` reaction without exactly one emoji, or a sticker), or the message was unsent or failed to send.\n- `UNSUPPORTED_CHAT_OPERATION`: the message was sent or received as SMS or RCS. Reactions are iMessage only.\n\n`403 RECIPIENT_SUPPRESSED`: the contact in this chat opted out.\n\n`409`:\n- `MESSAGE_NOT_SENT_YET`: your message hasn't finished sending yet. Retry shortly.\n- `SENDER_UNAVAILABLE`: the phone number the message belongs to is no longer available.\n- `IDEMPOTENCY_REQUEST_MISMATCH` or `IDEMPOTENCY_IN_PROGRESS`: see `Idempotency-Key`.\n\n`502 CHANGE_REJECTED`: the phone number refused the reaction. Don't retry the same request.\n","headers":{"X-Trace-ID":{"description":"Unique ID for this request. It matches `trace_id` in the body. Include it when you contact Blujay support.","schema":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$"}}},"content":{"application/json":{"schema":{"type":"object","description":"Wraps every error response. Branch on `error.code`, and include `trace_id` when you contact support.","required":["status","error","trace_id","timestamp"],"properties":{"status":{"const":"error","isRequired":true,"uniqueKey":"status","typeLabel":"any"},"error":{"type":"object","required":["code","message","type","http_status","retryable","doc_url","details"],"properties":{"code":{"type":"string","description":"Stable, machine-readable error code. Branch on this value.","examples":["RATE_LIMIT_EXCEEDED","QUEUE_UNAVAILABLE","FEATURE_NOT_ENABLED"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation. It can change, so don't parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"type":{"type":"string","description":"Broad error category.","examples":["validation","auth","idempotency","rate_limit","queue","feature_gate"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"string"},"http_status":{"type":"integer","description":"The HTTP status code of the response.","enum":[400,401,403,404,409,413,415,422,429,500,502,503],"isRequired":true,"uniqueKey":"error.http_status","typeLabel":"enum\u003cinteger>"},"retryable":{"type":"boolean","description":"Whether sending the same request again later can succeed.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"Link to documentation for this error code.","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"details":{"type":"array","description":"Extra structured context, such as the fields that failed validation or the limit you hit.","items":{"type":"object","additionalProperties":true,"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"error.details","typeLabel":"object[]"},"retry_after":{"type":"integer","minimum":1,"description":"Seconds to wait before retrying. Also sent as the `Retry-After` header.","uniqueKey":"error.retry_after","typeLabel":"integer"},"reset_at":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","description":"When the limit you hit resets.","uniqueKey":"error.reset_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"trace_id":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"trace_id","typeLabel":"string"},"timestamp":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","isRequired":true,"uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"client_request_id":{"type":"string","description":"Your `X-Request-ID` header value, echoed back when you send one.","uniqueKey":"client_request_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":"error","error":{"code":"RATE_LIMIT_EXCEEDED","message":"\u003cstring>","type":"validation","http_status":400,"retryable":true,"doc_url":"\u003cstring>","details":[{}],"retry_after":2,"reset_at":"2026-10-14T17:01:00.000Z"},"trace_id":"trc_8f2a1c0e4b7d","timestamp":"2026-10-14T17:01:00.000Z","client_request_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"14646540-a5ee-45eb-9a7e-c298510e3ad6":{"description":"The messaging network couldn't accept the request right now (`PHONE_NUMBER_UNAVAILABLE`). Nothing was changed. Retry after `Retry-After` seconds.","headers":{"X-Trace-ID":{"description":"Unique ID for this request. It matches `trace_id` in the body. Include it when you contact Blujay support.","schema":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","description":"Wraps every error response. Branch on `error.code`, and include `trace_id` when you contact support.","required":["status","error","trace_id","timestamp"],"properties":{"status":{"const":"error","isRequired":true,"uniqueKey":"status","typeLabel":"any"},"error":{"type":"object","required":["code","message","type","http_status","retryable","doc_url","details"],"properties":{"code":{"type":"string","description":"Stable, machine-readable error code. Branch on this value.","examples":["RATE_LIMIT_EXCEEDED","QUEUE_UNAVAILABLE","FEATURE_NOT_ENABLED"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation. It can change, so don't parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"type":{"type":"string","description":"Broad error category.","examples":["validation","auth","idempotency","rate_limit","queue","feature_gate"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"string"},"http_status":{"type":"integer","description":"The HTTP status code of the response.","enum":[400,401,403,404,409,413,415,422,429,500,502,503],"isRequired":true,"uniqueKey":"error.http_status","typeLabel":"enum\u003cinteger>"},"retryable":{"type":"boolean","description":"Whether sending the same request again later can succeed.","isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"Link to documentation for this error code.","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"details":{"type":"array","description":"Extra structured context, such as the fields that failed validation or the limit you hit.","items":{"type":"object","additionalProperties":true,"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"error.details","typeLabel":"object[]"},"retry_after":{"type":"integer","minimum":1,"description":"Seconds to wait before retrying. Also sent as the `Retry-After` header.","uniqueKey":"error.retry_after","typeLabel":"integer"},"reset_at":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","description":"When the limit you hit resets.","uniqueKey":"error.reset_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"trace_id":{"type":"string","examples":["trc_8f2a1c0e4b7d"],"pattern":"^trc_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"trace_id","typeLabel":"string"},"timestamp":{"type":"string","examples":["2026-10-14T17:01:00.000Z"],"format":"date-time","isRequired":true,"uniqueKey":"timestamp","typeLabel":"string\u003cdate-time>"},"client_request_id":{"type":"string","description":"Your `X-Request-ID` header value, echoed back when you send one.","uniqueKey":"client_request_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"phoneNumberUnavailable":{"title":"phoneNumberUnavailable","value":{"status":"error","error":{"code":"PHONE_NUMBER_UNAVAILABLE","message":"This service is temporarily unavailable","type":"phone_number","http_status":503,"retryable":true,"doc_url":"https://docs.blujay.io/errors/phone-number-unavailable","details":[],"retry_after":30},"trace_id":"trc_8f2a1c0e4b7d","timestamp":"2026-10-14T00:00:00.000Z"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"86a8cff5-88d6-428f-a4f8-ab50321edcc2":{"PublicApiKey":{"type":"http","scheme":"bearer","bearerFormat":"blu_...","description":"Your workspace API key, sent as `Authorization: Bearer blu_...`. Workspace admins can find it in the Blujay app under **API**.\n\nAn 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.\n\nEach 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`.\n\n**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`.\n","scopes":[],"schemeName":"PublicApiKey"}}},"servers":{"660565a7-87d9-4b09-af2e-872548a05c9e":{"url":"https://api.blujay.io","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"blu_...","description":"Your workspace API key, sent as `Authorization: Bearer blu_...`. Workspace admins can find it in the Blujay app under **API**.\n\nAn 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.\n\nEach 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`.\n\n**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`.\n","scopes":[],"schemeName":"PublicApiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Your workspace API key, sent as `Authorization: Bearer blu_...`. Workspace admins can find it in the Blujay app under **API**.\n\nAn 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.\n\nEach 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`.\n\n**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`.\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"PublicApiKey","name":"Authorization"}],"title":"PublicApiKey"}]},"originalFileLocation":"api-reference/openapi.yaml"},"subdomain":"blujay-api","siteName":"Blujay API","title":"Add a reaction - Blujay API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-11T01:31:24.827Z","originalFileLocation":"api-reference/messages/add-a-reaction.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Adds a tapback to a message in an iMessage chat, from the Blujay phone number the chat belongs to. You can react to messages your contacts sent and to your own. The six standard reactions are love, like, dislike, laugh, emphasize and question. To react with any emoji, send type: custom with emoji set to exactly one emoji, such as 😍 or 👍🏽. A symbol sent without its emoji style, such as ❤, is sent and reported as iPhones send it (❤️). A message can carry one reaction per person on each part, so adding a different one, standard or emoji, replaces yours. Recipients on iOS 17 or earlier see an emoji reaction as the text \u0026quot;Reacted 😍 to …\u0026quot;. Stickers contacts put on your messages arrive as sticker reactions, but you can\u0026#x27;t send stickers (400 VALIDATION_ERROR). A 202 means Blujay accepted the reaction and is sending it. Confirm it through the reaction.added webhook, where reactor is your phone number. If you already have that reaction on the message, Blujay returns 202 without sending it again. Send an Idempotency-Key so a retry after a lost response is safe. iMessage only: a message sent or received as SMS or RCS returns 400 UNSUPPORTED_CHAT_OPERATION. A reaction can\u0026#x27;t itself be reacted to (404 NOT_FOUND), and an unsent or failed message can\u0026#x27;t be either (400 VALIDATION_ERROR). A reaction notifies the other person like a message, so a chat with an opted-out contact returns 403 RECIPIENT_SUPPRESSED, the same rule as sending a message in it.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Blujay API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/blujay-api/ME8eQTARhlNFGeGt/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/blujay-api/ME8eQTARhlNFGeGt/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/blujay-api/ME8eQTARhlNFGeGt/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/blujay-api/ME8eQTARhlNFGeGt/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/blujay-api/ME8eQTARhlNFGeGt/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/blujay-api/ME8eQTARhlNFGeGt/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/blujay-api/ME8eQTARhlNFGeGt/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/blujay-api/ME8eQTARhlNFGeGt/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/blujay-api/ME8eQTARhlNFGeGt/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Add a reaction - Blujay API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Adds a tapback to a message in an iMessage chat, from the Blujay phone number the chat belongs to. You can react to messages your contacts sent and to your own. The six standard reactions are love, like, dislike, laugh, emphasize and question. To react with any emoji, send type: custom with emoji set to exactly one emoji, such as 😍 or 👍🏽. A symbol sent without its emoji style, such as ❤, is sent and reported as iPhones send it (❤️). A message can carry one reaction per person on each part, so adding a different one, standard or emoji, replaces yours. Recipients on iOS 17 or earlier see an emoji reaction as the text \u0026quot;Reacted 😍 to …\u0026quot;. Stickers contacts put on your messages arrive as sticker reactions, but you can\u0026#x27;t send stickers (400 VALIDATION_ERROR). A 202 means Blujay accepted the reaction and is sending it. Confirm it through the reaction.added webhook, where reactor is your phone number. If you already have that reaction on the message, Blujay returns 202 without sending it again. Send an Idempotency-Key so a retry after a lost response is safe. iMessage only: a message sent or received as SMS or RCS returns 400 UNSUPPORTED_CHAT_OPERATION. A reaction can\u0026#x27;t itself be reacted to (404 NOT_FOUND), and an unsent or failed message can\u0026#x27;t be either (400 VALIDATION_ERROR). A reaction notifies the other person like a message, so a chat with an opted-out contact returns 403 RECIPIENT_SUPPRESSED, the same rule as sending a message in it.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Blujay API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.blujay.io/api-reference/messages/add-a-reaction\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://blujay-api.mintlify.site/_mintlify/api/og/v2?division=Messages\u0026amp;title=Add+a+reaction\u0026amp;description=Adds+a+tapback+to+a+message+in+an+iMessage+chat%2C+from+the+Blujay+phone+number+the+chat+belongs+to.+You+can+react+to+messages+your+contacts+sent+and+to+your+own.\u0026amp;theme=fd31e5cf5d981648caebe5b9\u0026amp;signature=fb0e614d2cc0634c56b578109c79b7c85fc457310ba59555ed478f4b915fadde\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Add a reaction - Blujay API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Adds a tapback to a message in an iMessage chat, from the Blujay phone number the chat belongs to. You can react to messages your contacts sent and to your own. The six standard reactions are love, like, dislike, laugh, emphasize and question. To react with any emoji, send type: custom with emoji set to exactly one emoji, such as 😍 or 👍🏽. A symbol sent without its emoji style, such as ❤, is sent and reported as iPhones send it (❤️). A message can carry one reaction per person on each part, so adding a different one, standard or emoji, replaces yours. Recipients on iOS 17 or earlier see an emoji reaction as the text \u0026quot;Reacted 😍 to …\u0026quot;. Stickers contacts put on your messages arrive as sticker reactions, but you can\u0026#x27;t send stickers (400 VALIDATION_ERROR). A 202 means Blujay accepted the reaction and is sending it. Confirm it through the reaction.added webhook, where reactor is your phone number. If you already have that reaction on the message, Blujay returns 202 without sending it again. Send an Idempotency-Key so a retry after a lost response is safe. iMessage only: a message sent or received as SMS or RCS returns 400 UNSUPPORTED_CHAT_OPERATION. A reaction can\u0026#x27;t itself be reacted to (404 NOT_FOUND), and an unsent or failed message can\u0026#x27;t be either (400 VALIDATION_ERROR). A reaction notifies the other person like a message, so a chat with an opted-out contact returns 403 RECIPIENT_SUPPRESSED, the same rule as sending a message in it.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://blujay-api.mintlify.site/_mintlify/api/og/v2?division=Messages\u0026amp;title=Add+a+reaction\u0026amp;description=Adds+a+tapback+to+a+message+in+an+iMessage+chat%2C+from+the+Blujay+phone+number+the+chat+belongs+to.+You+can+react+to+messages+your+contacts+sent+and+to+your+own.\u0026amp;theme=fd31e5cf5d981648caebe5b9\u0026amp;signature=fb0e614d2cc0634c56b578109c79b7c85fc457310ba59555ed478f4b915fadde\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/blujay-api/ME8eQTARhlNFGeGt/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Blujay API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#007AFF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.blujay.io/api-reference/messages/add-a-reaction\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/messages/add-a-reaction.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.blujay.io/#organization\",\"name\":\"Blujay API\",\"url\":\"https://docs.blujay.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/blujay-api/Z06BDuKbaRqwvTNY/logo/light.svg?fit=max\u0026auto=format\u0026n=Z06BDuKbaRqwvTNY\u0026q=85\u0026s=7e2d044d91197ee37ad1e32cf7c89936\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.blujay.io#website\",\"name\":\"Blujay API\",\"url\":\"https://docs.blujay.io\",\"publisher\":{\"@id\":\"https://docs.blujay.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.blujay.io/api-reference/messages/add-a-reaction#webpage\",\"url\":\"https://docs.blujay.io/api-reference/messages/add-a-reaction\",\"name\":\"Add a reaction\",\"description\":\"Adds a tapback to a message in an iMessage chat, from the Blujay phone number the chat belongs to. You can react to messages your contacts sent and to your own. The six standard reactions are love, like, dislike, laugh, emphasize and question. To react with any emoji, send type: custom with emoji set to exactly one emoji, such as 😍 or 👍🏽. A symbol sent without its emoji style, such as ❤, is sent and reported as iPhones send it (❤️). A message can carry one reaction per person on each part, so adding a different one, standard or emoji, replaces yours. Recipients on iOS 17 or earlier see an emoji reaction as the text \\\"Reacted 😍 to …\\\". Stickers contacts put on your messages arrive as sticker reactions, but you can't send stickers (400 VALIDATION_ERROR). A 202 means Blujay accepted the reaction and is sending it. Confirm it through the reaction.added webhook, where reactor is your phone number. If you already have that reaction on the message, Blujay returns 202 without sending it again. Send an Idempotency-Key so a retry after a lost response is safe. iMessage only: a message sent or received as SMS or RCS returns 400 UNSUPPORTED_CHAT_OPERATION. A reaction can't itself be reacted to (404 NOT_FOUND), and an unsent or failed message can't be either (400 VALIDATION_ERROR). A reaction notifies the other person like a message, so a chat with an opted-out contact returns 403 RECIPIENT_SUPPRESSED, the same rule as sending a message in it.\",\"dateModified\":\"2026-11-11T01:31:24.827Z\",\"isPartOf\":{\"@id\":\"https://docs.blujay.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.blujay.io/api-reference/messages/add-a-reaction#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.blujay.io/api-reference/messages/add-a-reaction#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.blujay.io/api-reference/auth/get-the-current-credential\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Messages\",\"item\":\"https://docs.blujay.io/api-reference/messages/list-messages-in-a-chat\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Add a reaction\",\"item\":\"https://docs.blujay.io/api-reference/messages/add-a-reaction\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.blujay.io/api-reference/messages/add-a-reaction#apireference\",\"headline\":\"Add a reaction\",\"name\":\"Add a reaction\",\"description\":\"Adds a tapback to a message in an iMessage chat, from the Blujay phone number the chat belongs to. You can react to messages your contacts sent and to your own. The six standard reactions are love, like, dislike, laugh, emphasize and question. To react with any emoji, send type: custom with emoji set to exactly one emoji, such as 😍 or 👍🏽. A symbol sent without its emoji style, such as ❤, is sent and reported as iPhones send it (❤️). A message can carry one reaction per person on each part, so adding a different one, standard or emoji, replaces yours. Recipients on iOS 17 or earlier see an emoji reaction as the text \\\"Reacted 😍 to …\\\". Stickers contacts put on your messages arrive as sticker reactions, but you can't send stickers (400 VALIDATION_ERROR). A 202 means Blujay accepted the reaction and is sending it. Confirm it through the reaction.added webhook, where reactor is your phone number. If you already have that reaction on the message, Blujay returns 202 without sending it again. Send an Idempotency-Key so a retry after a lost response is safe. iMessage only: a message sent or received as SMS or RCS returns 400 UNSUPPORTED_CHAT_OPERATION. A reaction can't itself be reacted to (404 NOT_FOUND), and an unsent or failed message can't be either (400 VALIDATION_ERROR). A reaction notifies the other person like a message, so a chat with an opted-out contact returns 403 RECIPIENT_SUPPRESSED, the same rule as sending a message in it.\",\"url\":\"https://docs.blujay.io/api-reference/messages/add-a-reaction\",\"mainEntityOfPage\":{\"@id\":\"https://docs.blujay.io/api-reference/messages/add-a-reaction#webpage\"},\"dateModified\":\"2026-11-11T01:31:24.827Z\",\"publisher\":{\"@id\":\"https://docs.blujay.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.blujay.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Blujay API\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Blujay API\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/messages/add-a-reaction.md","siteName":"Blujay API","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API reference","groups":[{"group":"Overview","pages":[{"title":"API reference","href":"/api-reference/introduction"}]},{"group":"Endpoints","pages":[{"group":"Auth","pages":[{"title":"Get the current credential","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/me","href":"/api-reference/auth/get-the-current-credential"}]},{"group":"Chats","pages":[{"title":"List chats","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/chats","href":"/api-reference/chats/list-chats"},{"title":"Create a chat and send the first message","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/chats","href":"/api-reference/chats/create-a-chat-and-send-the-first-message"},{"title":"Get a chat","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/chats/{chat_id}","href":"/api-reference/chats/get-a-chat"},{"title":"Rename a group chat or set its photo","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/chats/{chat_id}","href":"/api-reference/chats/rename-a-group-chat-or-set-its-photo"},{"title":"Download a group chat's photo","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/chats/{chat_id}/icon","href":"/api-reference/chats/download-a-group-chats-photo"},{"title":"Leave a group chat","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/chats/{chat_id}/leave","href":"/api-reference/chats/leave-a-group-chat"},{"title":"List group participants","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/chats/{chat_id}/participants","href":"/api-reference/chats/list-group-participants"},{"title":"Add a group participant","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/chats/{chat_id}/participants","href":"/api-reference/chats/add-a-group-participant"},{"title":"Remove a group participant","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/chats/{chat_id}/participants","href":"/api-reference/chats/remove-a-group-participant"},{"title":"Start a typing indicator","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/chats/{chat_id}/typing","href":"/api-reference/chats/start-a-typing-indicator"},{"title":"Stop a typing indicator","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/chats/{chat_id}/typing","href":"/api-reference/chats/stop-a-typing-indicator"},{"title":"Mark a chat as read","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/chats/{chat_id}/read","href":"/api-reference/chats/mark-a-chat-as-read"}]},{"group":"Messages","pages":[{"title":"List messages in a chat","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/chats/{chat_id}/messages","href":"/api-reference/messages/list-messages-in-a-chat"},{"title":"Send a message","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/chats/{chat_id}/messages","href":"/api-reference/messages/send-a-message"},{"title":"List messages","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/messages","href":"/api-reference/messages/list-messages"},{"title":"Get a message","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/messages/{message_id}","href":"/api-reference/messages/get-a-message"},{"title":"Edit a message","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/messages/{message_id}","href":"/api-reference/messages/edit-a-message"},{"title":"List a reply thread","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/messages/{message_id}/thread","href":"/api-reference/messages/list-a-reply-thread"},{"title":"Unsend a message","description":"Unsends a text-only iMessage you sent from this workspace. Apple allows this within 2 minutes of sending. Recipients on older Apple software may still see the message.\n\nThe message stays readable through the API with `unsent_at` and `unsent_scope` set, and its text is removed from `parts`. The unsent text is never returned. Repeating an unsend returns the current message. Send an `Idempotency-Key` so you can safely retry.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/messages/{message_id}/unsend","href":"/api-reference/messages/unsend-a-message"},{"title":"Add a reaction","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/messages/{message_id}/reactions","href":"/api-reference/messages/add-a-reaction"},{"title":"Remove a reaction","description":"Removes a tapback your phone number put on a message, whether it was added through the API or in the Blujay app. A `202` means Blujay accepted the removal and is sending it; confirm it through the `reaction.removed` webhook.\n\nTo remove an emoji reaction, use `custom` as the type and pass the emoji: `DELETE /v1/messages/{message_id}/reactions/custom?emoji=😍` (URL-encoded). Stickers can't be removed (`400 VALIDATION_ERROR`).\n\nIf you don't have that reaction on the message, Blujay returns `202` and sends nothing. Pass `part_index` when you reacted to a part other than the first. Send an `Idempotency-Key` so a retry after a lost response is safe. The same iMessage-only rules apply as for adding a reaction.\n","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/messages/{message_id}/reactions/{type}","href":"/api-reference/messages/remove-a-reaction"}]},{"group":"Phone Numbers","pages":[{"title":"List phone numbers","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/phone-numbers","href":"/api-reference/phone-numbers/list-phone-numbers"},{"title":"Get a phone number","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/phone-numbers/{phone_number_id}","href":"/api-reference/phone-numbers/get-a-phone-number"},{"title":"Get a number's iMessage name and photo","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/phone-numbers/{phone_number_id}/contact-card","href":"/api-reference/phone-numbers/get-a-numbers-imessage-name-and-photo"},{"title":"Set a number's iMessage name and photo","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml put /v1/phone-numbers/{phone_number_id}/contact-card","href":"/api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo"},{"title":"Turn off a number's iMessage name and photo","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/phone-numbers/{phone_number_id}/contact-card","href":"/api-reference/phone-numbers/turn-off-a-numbers-imessage-name-and-photo"},{"title":"Download a number's iMessage photo","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/phone-numbers/{phone_number_id}/contact-card/photo","href":"/api-reference/phone-numbers/download-a-numbers-imessage-photo"}]},{"group":"Capability","pages":[{"title":"Check iMessage, RCS or SMS support","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/capability/evaluate_service","href":"/api-reference/capability/check-imessage-rcs-or-sms-support"}]},{"group":"Team Members","pages":[{"title":"List assignable team members","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/team-members/assignable","href":"/api-reference/team-members/list-assignable-team-members"}]},{"group":"Partners","pages":[]},{"group":"Workflows","pages":[{"title":"List workflows","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/workflows","href":"/api-reference/workflows/list-workflows"},{"title":"Enroll a contact in a workflow","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/workflows/{workflow_id}/enrollments","href":"/api-reference/workflows/enroll-a-contact-in-a-workflow"}]},{"group":"Contacts","pages":[{"title":"List contacts","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/contacts","href":"/api-reference/contacts/list-contacts"},{"title":"Create a contact","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/contacts","href":"/api-reference/contacts/create-a-contact"},{"title":"Create or update a contact","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/contacts/import","href":"/api-reference/contacts/create-or-update-a-contact"},{"title":"Search contacts","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/contacts/search","href":"/api-reference/contacts/search-contacts"},{"title":"Get a contact","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/contacts/{contact_id}","href":"/api-reference/contacts/get-a-contact"},{"title":"Delete a contact","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/contacts/{contact_id}","href":"/api-reference/contacts/delete-a-contact"},{"title":"Update a contact","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/contacts/{contact_id}","href":"/api-reference/contacts/update-a-contact"},{"title":"Add a tag to a contact","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/contacts/{contact_id}/tags","href":"/api-reference/contacts/add-a-tag-to-a-contact"},{"title":"List a contact's notes","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/contacts/{contact_id}/notes","href":"/api-reference/contacts/list-a-contacts-notes"},{"title":"Add a note to a contact","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/contacts/{contact_id}/notes","href":"/api-reference/contacts/add-a-note-to-a-contact"},{"title":"Mark a contact completed","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/contacts/{contact_id}/stage","href":"/api-reference/contacts/mark-a-contact-completed"},{"title":"Assign a contact to a team member","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/contacts/{contact_id}/assignee","href":"/api-reference/contacts/assign-a-contact-to-a-team-member"},{"title":"Opt out a contact","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/contacts/{contact_id}/suppress","href":"/api-reference/contacts/opt-out-a-contact"},{"title":"Remove a contact's opt-out","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/contacts/{contact_id}/unsuppress","href":"/api-reference/contacts/remove-a-contacts-opt-out"},{"title":"Opt out a phone number or email","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/contacts/suppressions","href":"/api-reference/contacts/opt-out-a-phone-number-or-email"}]},{"group":"Attachments","pages":[{"title":"Upload an attachment","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/attachments","href":"/api-reference/attachments/upload-an-attachment"},{"title":"Get an attachment","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/attachments/{attachment_id}","href":"/api-reference/attachments/get-an-attachment"},{"title":"Delete an attachment","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/attachments/{attachment_id}","href":"/api-reference/attachments/delete-an-attachment"},{"title":"Download an attachment","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/attachments/{attachment_id}/content","href":"/api-reference/attachments/download-an-attachment"}]},{"group":"Calls","pages":[{"title":"Download a call recording","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/calls/{call_id}/recording","href":"/api-reference/calls/download-a-call-recording"}]},{"group":"vCards","pages":[{"title":"List saved vCards","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/vcards","href":"/api-reference/vcards/list-saved-vcards"},{"title":"Save a vCard","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/vcards","href":"/api-reference/vcards/save-a-vcard"},{"title":"Get a saved vCard","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/vcards/{vcard_id}","href":"/api-reference/vcards/get-a-saved-vcard"},{"title":"Delete a saved vCard","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/vcards/{vcard_id}","href":"/api-reference/vcards/delete-a-saved-vcard"},{"title":"Update a saved vCard","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/vcards/{vcard_id}","href":"/api-reference/vcards/update-a-saved-vcard"}]},{"group":"Webhooks","pages":[{"title":"List webhook subscriptions","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/webhook-subscriptions","href":"/api-reference/webhooks/list-webhook-subscriptions"},{"title":"Create a webhook subscription","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/webhook-subscriptions","href":"/api-reference/webhooks/create-a-webhook-subscription"},{"title":"Get a webhook subscription","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/webhook-subscriptions/{subscription_id}","href":"/api-reference/webhooks/get-a-webhook-subscription"},{"title":"Delete a webhook subscription","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml delete /v1/webhook-subscriptions/{subscription_id}","href":"/api-reference/webhooks/delete-a-webhook-subscription"},{"title":"Update a webhook subscription","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml patch /v1/webhook-subscriptions/{subscription_id}","href":"/api-reference/webhooks/update-a-webhook-subscription"},{"title":"List webhook delivery attempts","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml get /v1/webhook-subscriptions/{subscription_id}/deliveries","href":"/api-reference/webhooks/list-webhook-delivery-attempts"},{"title":"Replay a webhook event","deprecated":null,"version":null,"openapi":"/api-reference/openapi.yaml post /v1/webhook-subscriptions/{subscription_id}/events/{event_id}/replay","href":"/api-reference/webhooks/replay-a-webhook-event"},{"title":"Webhook event","version":null,"deprecated":null,"openapi":"/api-reference/openapi.yaml webhook publicEvent","href":"/api-reference/webhooks/webhook-event"}]}]},{"group":"Errors","pages":[{"title":"Errors","href":"/errors/index"},{"group":"Request errors","pages":[{"title":"VALIDATION_ERROR","sidebarTitle":"VALIDATION_ERROR","href":"/errors/validation-error"},{"title":"INVALID_PUBLIC_ID","sidebarTitle":"INVALID_PUBLIC_ID","href":"/errors/invalid-public-id"},{"title":"INVALID_CURSOR","sidebarTitle":"INVALID_CURSOR","href":"/errors/invalid-cursor"},{"title":"NOT_FOUND","sidebarTitle":"NOT_FOUND","href":"/errors/not-found"},{"title":"FEATURE_NOT_ENABLED","sidebarTitle":"FEATURE_NOT_ENABLED","href":"/errors/feature-not-enabled"}]},{"group":"Authentication","pages":[{"title":"UNAUTHORIZED","sidebarTitle":"UNAUTHORIZED","href":"/errors/unauthorized"},{"title":"API_KEY_REVOKED","sidebarTitle":"API_KEY_REVOKED","href":"/errors/api-key-revoked"},{"title":"API_KEY_EXPIRED","sidebarTitle":"API_KEY_EXPIRED","href":"/errors/api-key-expired"},{"title":"OAUTH_TOKEN_INVALID","sidebarTitle":"OAUTH_TOKEN_INVALID","href":"/errors/oauth-token-invalid"},{"title":"OAUTH_SCOPE_REQUIRED","sidebarTitle":"OAUTH_SCOPE_REQUIRED","href":"/errors/oauth-scope-required"},{"title":"OAUTH_ROUTE_NOT_ENABLED","sidebarTitle":"OAUTH_ROUTE_NOT_ENABLED","href":"/errors/oauth-route-not-enabled"}]},{"group":"Idempotency","pages":[{"title":"IDEMPOTENCY_REQUEST_MISMATCH","sidebarTitle":"IDEMPOTENCY_REQUEST_MISMATCH","href":"/errors/idempotency-request-mismatch"},{"title":"IDEMPOTENCY_KEY_MISMATCH","sidebarTitle":"IDEMPOTENCY_KEY_MISMATCH","href":"/errors/idempotency-key-mismatch"},{"title":"IDEMPOTENCY_IN_PROGRESS","sidebarTitle":"IDEMPOTENCY_IN_PROGRESS","href":"/errors/idempotency-in-progress"}]},{"group":"Rate limits and capacity","pages":[{"title":"RATE_LIMIT_EXCEEDED","sidebarTitle":"RATE_LIMIT_EXCEEDED","href":"/errors/rate-limit-exceeded"},{"title":"QUEUE_FULL","sidebarTitle":"QUEUE_FULL","href":"/errors/queue-full"},{"title":"ATTACHMENT_CAPACITY_EXCEEDED","sidebarTitle":"ATTACHMENT_CAPACITY_EXCEEDED","href":"/errors/attachment-capacity-exceeded"}]},{"group":"Sending messages","pages":[{"title":"EMAIL_REQUIRES_IMESSAGE","sidebarTitle":"EMAIL_REQUIRES_IMESSAGE","href":"/errors/email-requires-imessage"},{"title":"FIRST_MESSAGE_LINK_NOT_ALLOWED","sidebarTitle":"FIRST_MESSAGE_LINK_NOT_ALLOWED","href":"/errors/first-message-link-not-allowed"},{"title":"PRE_REPLY_CONTENT_BLOCKED","sidebarTitle":"PRE_REPLY_CONTENT_BLOCKED","href":"/errors/pre-reply-content-blocked"},{"title":"PRE_REPLY_LENGTH_EXCEEDED","sidebarTitle":"PRE_REPLY_LENGTH_EXCEEDED","href":"/errors/pre-reply-length-exceeded"},{"title":"PRE_REPLY_LIMIT_REACHED","sidebarTitle":"PRE_REPLY_LIMIT_REACHED","href":"/errors/pre-reply-limit-reached"},{"title":"RECIPIENT_SUPPRESSED","sidebarTitle":"RECIPIENT_SUPPRESSED","href":"/errors/recipient-suppressed"},{"title":"CONTACT_NOT_VERIFIED","sidebarTitle":"CONTACT_NOT_VERIFIED","href":"/errors/contact-not-verified"},{"title":"CONTACT_MUST_TEXT_FIRST","sidebarTitle":"CONTACT_MUST_TEXT_FIRST","href":"/errors/contact-must-text-first"},{"title":"SENDER_SUSPENDED","sidebarTitle":"SENDER_SUSPENDED","href":"/errors/sender-suspended"},{"title":"SENDER_RETIRED","sidebarTitle":"SENDER_RETIRED","href":"/errors/sender-retired"},{"title":"FROM_NUMBER_REQUIRED","sidebarTitle":"FROM_NUMBER_REQUIRED","href":"/errors/from-number-required"}]},{"group":"Chats and groups","pages":[{"title":"UNSUPPORTED_CHAT_OPERATION","sidebarTitle":"UNSUPPORTED_CHAT_OPERATION","href":"/errors/unsupported-chat-operation"},{"title":"REPLY_TARGET_NOT_FOUND","sidebarTitle":"REPLY_TARGET_NOT_FOUND","href":"/errors/reply-target-not-found"},{"title":"REPLY_TARGET_NOT_IN_CHAT","sidebarTitle":"REPLY_TARGET_NOT_IN_CHAT","href":"/errors/reply-target-not-in-chat"},{"title":"REPLY_TARGET_NOT_REPLYABLE","sidebarTitle":"REPLY_TARGET_NOT_REPLYABLE","href":"/errors/reply-target-not-replyable"},{"title":"REPLY_TARGET_NOT_SENT","sidebarTitle":"REPLY_TARGET_NOT_SENT","href":"/errors/reply-target-not-sent"},{"title":"PHONE_NUMBER_REQUIRED","sidebarTitle":"PHONE_NUMBER_REQUIRED","href":"/errors/phone-number-required"},{"title":"LAST_PHONE_NUMBER_IN_GROUP","sidebarTitle":"LAST_PHONE_NUMBER_IN_GROUP","href":"/errors/last-phone-number-in-group"},{"title":"GROUP_MINIMUM_PARTICIPANTS","sidebarTitle":"GROUP_MINIMUM_PARTICIPANTS","href":"/errors/group-minimum-participants"},{"title":"PHONE_NUMBER_HAS_SCHEDULED_MESSAGES","sidebarTitle":"PHONE_NUMBER_HAS_SCHEDULED_MESSAGES","href":"/errors/phone-number-has-scheduled-messages"},{"title":"PHONE_NUMBER_HAS_MESSAGES_SENDING","sidebarTitle":"PHONE_NUMBER_HAS_MESSAGES_SENDING","href":"/errors/phone-number-has-messages-sending"}]},{"group":"Edit and unsend","pages":[{"title":"MESSAGE_NOT_SENT_YET","sidebarTitle":"MESSAGE_NOT_SENT_YET","href":"/errors/message-not-sent-yet"},{"title":"MESSAGE_NOT_EDITABLE","sidebarTitle":"MESSAGE_NOT_EDITABLE","href":"/errors/message-not-editable"},{"title":"EDIT_WINDOW_EXPIRED","sidebarTitle":"EDIT_WINDOW_EXPIRED","href":"/errors/edit-window-expired"},{"title":"EDIT_LIMIT_REACHED","sidebarTitle":"EDIT_LIMIT_REACHED","href":"/errors/edit-limit-reached"},{"title":"UNSEND_WINDOW_EXPIRED","sidebarTitle":"UNSEND_WINDOW_EXPIRED","href":"/errors/unsend-window-expired"},{"title":"EDIT_UNCHANGED","sidebarTitle":"EDIT_UNCHANGED","href":"/errors/edit-unchanged"},{"title":"SENDER_UNAVAILABLE","sidebarTitle":"SENDER_UNAVAILABLE","href":"/errors/sender-unavailable"},{"title":"CHANGE_REJECTED","sidebarTitle":"CHANGE_REJECTED","href":"/errors/change-rejected"},{"title":"CHANGE_UNCONFIRMED","sidebarTitle":"CHANGE_UNCONFIRMED","href":"/errors/change-unconfirmed"}]},{"group":"Media","pages":[{"title":"ATTACHMENT_NOT_READY","sidebarTitle":"ATTACHMENT_NOT_READY","href":"/errors/attachment-not-ready"},{"title":"ATTACHMENT_UPLOAD_INVALID","sidebarTitle":"ATTACHMENT_UPLOAD_INVALID","href":"/errors/attachment-upload-invalid"},{"title":"ATTACHMENT_TOO_LARGE","sidebarTitle":"ATTACHMENT_TOO_LARGE","href":"/errors/attachment-too-large"},{"title":"UNSUPPORTED_ATTACHMENT_TYPE","sidebarTitle":"UNSUPPORTED_ATTACHMENT_TYPE","href":"/errors/unsupported-attachment-type"},{"title":"ATTACHMENT_FETCH_FAILED","sidebarTitle":"ATTACHMENT_FETCH_FAILED","href":"/errors/attachment-fetch-failed"},{"title":"ATTACHMENT_STORAGE_UNAVAILABLE","sidebarTitle":"ATTACHMENT_STORAGE_UNAVAILABLE","href":"/errors/attachment-storage-unavailable"},{"title":"VOICE_MEMO_UNREADABLE","sidebarTitle":"VOICE_MEMO_UNREADABLE","href":"/errors/voice-memo-unreadable"},{"title":"VOICE_MEMO_PROCESSING_UNAVAILABLE","sidebarTitle":"VOICE_MEMO_PROCESSING_UNAVAILABLE","href":"/errors/voice-memo-processing-unavailable"},{"title":"RECORDING_UNAVAILABLE","sidebarTitle":"RECORDING_UNAVAILABLE","href":"/errors/recording-unavailable"}]},{"group":"Contacts","pages":[{"title":"CONTACT_ALREADY_EXISTS","sidebarTitle":"CONTACT_ALREADY_EXISTS","href":"/errors/contact-already-exists"},{"title":"CONTACT_PHONE_LOCKED","sidebarTitle":"CONTACT_PHONE_LOCKED","href":"/errors/contact-phone-locked"},{"title":"CONTACT_MATCH_CONFLICT","sidebarTitle":"CONTACT_MATCH_CONFLICT","href":"/errors/contact-match-conflict"}]},{"group":"Workflows","pages":[{"title":"WORKFLOW_LIFECYCLE_ERROR","sidebarTitle":"WORKFLOW_LIFECYCLE_ERROR","href":"/errors/workflow-lifecycle-error"},{"title":"WORKFLOW_VALIDATION_ERROR","sidebarTitle":"WORKFLOW_VALIDATION_ERROR","href":"/errors/workflow-validation-error"}]},{"group":"Webhooks","pages":[{"title":"UNSUPPORTED_WEBHOOK_EVENT","sidebarTitle":"UNSUPPORTED_WEBHOOK_EVENT","href":"/errors/unsupported-webhook-event"},{"title":"WEBHOOK_URL_INVALID","sidebarTitle":"WEBHOOK_URL_INVALID","href":"/errors/webhook-url-invalid"},{"title":"WEBHOOK_URL_UNSAFE","sidebarTitle":"WEBHOOK_URL_UNSAFE","href":"/errors/webhook-url-unsafe"},{"title":"WEBHOOK_URL_UNRESOLVABLE","sidebarTitle":"WEBHOOK_URL_UNRESOLVABLE","href":"/errors/webhook-url-unresolvable"},{"title":"WEBHOOK_VERSION_UNSUPPORTED","sidebarTitle":"WEBHOOK_VERSION_UNSUPPORTED","href":"/errors/webhook-version-unsupported"},{"title":"WEBHOOK_SUBSCRIPTION_INACTIVE","sidebarTitle":"WEBHOOK_SUBSCRIPTION_INACTIVE","href":"/errors/webhook-subscription-inactive"},{"title":"WEBHOOK_PHONE_NUMBER_EXCLUDED","sidebarTitle":"WEBHOOK_PHONE_NUMBER_EXCLUDED","href":"/errors/webhook-phone-number-excluded"}]},{"group":"Server and availability","pages":[{"title":"CAPABILITY_CHECK_UNAVAILABLE","sidebarTitle":"CAPABILITY_CHECK_UNAVAILABLE","href":"/errors/capability-check-unavailable"},{"title":"QUEUE_UNAVAILABLE","sidebarTitle":"QUEUE_UNAVAILABLE","href":"/errors/queue-unavailable"},{"title":"PHONE_NUMBER_UNAVAILABLE","sidebarTitle":"PHONE_NUMBER_UNAVAILABLE","href":"/errors/phone-number-unavailable"},{"title":"INTERNAL_ERROR","sidebarTitle":"INTERNAL_ERROR","href":"/errors/internal-error"}]},{"group":"Reseller partners","pages":[{"title":"WORKSPACE_HEADER_NOT_ALLOWED","sidebarTitle":"WORKSPACE_HEADER_NOT_ALLOWED","href":"/errors/workspace-header-not-allowed"},{"title":"WORKSPACE_HEADER_REQUIRED","sidebarTitle":"WORKSPACE_HEADER_REQUIRED","href":"/errors/workspace-header-required"},{"title":"PARTNER_ROLE_FORBIDDEN","sidebarTitle":"PARTNER_ROLE_FORBIDDEN","href":"/errors/partner-role-forbidden"},{"title":"CUSTOMER_PAUSED","sidebarTitle":"CUSTOMER_PAUSED","href":"/errors/customer-paused"},{"title":"CUSTOMER_CLOSING","sidebarTitle":"CUSTOMER_CLOSING","href":"/errors/customer-closing"},{"title":"EMBED_PARENT_ORIGIN_NOT_REGISTERED","sidebarTitle":"EMBED_PARENT_ORIGIN_NOT_REGISTERED","href":"/errors/embed-parent-origin-not-registered"},{"title":"EMBED_UNAVAILABLE","sidebarTitle":"EMBED_UNAVAILABLE","href":"/errors/embed-unavailable"},{"title":"CUSTOMER_EXTERNAL_REFERENCE_CONFLICT","sidebarTitle":"CUSTOMER_EXTERNAL_REFERENCE_CONFLICT","href":"/errors/customer-external-reference-conflict"},{"title":"AREA_CODE_UNAVAILABLE","sidebarTitle":"AREA_CODE_UNAVAILABLE","href":"/errors/area-code-unavailable"},{"title":"NO_PHONE_NUMBERS_AVAILABLE","sidebarTitle":"NO_PHONE_NUMBERS_AVAILABLE","href":"/errors/no-phone-numbers-available"},{"title":"TEAM_MEMBER_EMAIL_CONFLICT","sidebarTitle":"TEAM_MEMBER_EMAIL_CONFLICT","href":"/errors/team-member-email-conflict"}]}]}]}]},"basePath":"","title":"Add a reaction - Blujay API","buildId":"dpl_596ePT575z4qnAFksq1biRW97aLY","deploymentId":"dpl_596ePT575z4qnAFksq1biRW97aLY","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-C9Wu0MeN.js","utils-jWgu-6Qf.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DBD8f9qn.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BGuX1ui5.js","snippetPresets-Evy63nQB.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BQHO1lnV.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-B6C8m-t_.js","shallow-BG4cT0fH.js","getApiPlaygroundDisplay-CgEPrE-D.js","CodeSnippet-CU8JyZ9N.js","CodeSnippets-BnxHU32T.js","Page-D6S0Yh6q.js","getPastedJson-CwiYOonh.js","icon-DYDpWmDf.js","MethodPill-C-J-l7_c.js","DuplicateIcon-B6ARwg9w.js","createIcon-Dsv4MtDq.js","DynamicMarkdown-CtasenyM.js","SectionHeading-YNcgYwjB.js","axios-vUo_bRtp.js","Markdown-CwLx6PAg.js","clsx-C3kuh_dz.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CmKHfscc.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-U3mI6Ljh.js"]}