Sets the iMessage name and photo for one of your dedicated numbers. Upload the photo first with POST /v1/attachments (JPEG or PNG, up to 25 MiB); Blujay center-crops it to a square and resizes it for iMessage. PUT replaces the name. Omit avatar_attachment_id to keep the current photo, or send null to remove it so iMessage shows the number’s initials.
PUT waits up to about 3 seconds for the number to publish the change. Usually it does, and you get 200 with status: active. If Apple is slow to take the change, you get 202 with status: applying; the number keeps going on its own, and GET .../contact-card about 15 seconds later reports active. There is no need to send the change again. The response confirms the number accepted the change, not that anyone has seen it yet. Blujay offers the card automatically with your next message in each iMessage chat and refreshes it once a day, so there is nothing to call. If you change it several times in a row, an iPhone may show an earlier version until the next daily refresh. People who saved the number as a contact keep their own card.
Refusals: Free Plan numbers 400 FEATURE_NOT_ENABLED; a photo that isn’t JPEG or PNG 415 UNSUPPORTED_ATTACHMENT_TYPE; a photo still uploading 409 ATTACHMENT_NOT_READY; a number that is busy with another change, not set up, or not reachable 503 PHONE_NUMBER_UNAVAILABLE with Retry-After. After a 503, read GET .../contact-card before retrying: if the number applied the change after all, the read reports 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.
The iMessage name and photo to set on a dedicated number. PUT replaces the name. Omit avatar_attachment_id to keep the current photo; send null to remove it.
A ready JPEG or PNG attachment from POST /v1/attachments, up to 25 MiB. Blujay center-crops it to a square and resizes it to 512 by 512 for iMessage. null removes the photo.
Pattern: ^att_[A-Za-z0-9_-]+$
Example:
"att_abc123"
Response
The number published the change. status is active.
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/phone-numbers/set-a-numbers-imessage-name-and-photo","slug":"/api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo","pageMetadata":{"title":"Set a number's iMessage name and photo","description":"Sets the iMessage name and photo for one of your dedicated numbers. Upload the photo first with `POST /v1/attachments` (JPEG or PNG, up to 25 MiB); Blujay center-crops it to a square and resizes it for iMessage. `PUT` replaces the name. Omit `avatar_attachment_id` to keep the current photo, or send `null` to remove it so iMessage shows the number's initials.\n\n`PUT` waits up to about 3 seconds for the number to publish the change. Usually it does, and you get `200` with `status: active`. If Apple is slow to take the change, you get `202` with `status: applying`; the number keeps going on its own, and `GET .../contact-card` about 15 seconds later reports `active`. There is no need to send the change again. The response confirms the number accepted the change, not that anyone has seen it yet. Blujay offers the card automatically with your next message in each iMessage chat and refreshes it once a day, so there is nothing to call. If you change it several times in a row, an iPhone may show an earlier version until the next daily refresh. People who saved the number as a contact keep their own card.\n\nRefusals: Free Plan numbers `400 FEATURE_NOT_ENABLED`; a photo that isn't JPEG or PNG `415 UNSUPPORTED_ATTACHMENT_TYPE`; a photo still uploading `409 ATTACHMENT_NOT_READY`; a number that is busy with another change, not set up, or not reachable `503 PHONE_NUMBER_UNAVAILABLE` with `Retry-After`. After a `503`, read `GET .../contact-card` before retrying: if the number applied the change after all, the read reports it.\n","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","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: [\"Sets the iMessage name and photo for one of your dedicated numbers. Upload the photo first with \", _jsx(_components.code, {\n children: \"POST /v1/attachments\"\n }), \" (JPEG or PNG, up to 25 MiB); Blujay center-crops it to a square and resizes it for iMessage. \", _jsx(_components.code, {\n children: \"PUT\"\n }), \" replaces the name. Omit \", _jsx(_components.code, {\n children: \"avatar_attachment_id\"\n }), \" to keep the current photo, or send \", _jsx(_components.code, {\n children: \"null\"\n }), \" to remove it so iMessage shows the number’s initials.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"PUT\"\n }), \" waits up to about 3 seconds for the number to publish the change. Usually it does, and you get \", _jsx(_components.code, {\n children: \"200\"\n }), \" with \", _jsx(_components.code, {\n children: \"status: active\"\n }), \". If Apple is slow to take the change, you get \", _jsx(_components.code, {\n children: \"202\"\n }), \" with \", _jsx(_components.code, {\n children: \"status: applying\"\n }), \"; the number keeps going on its own, and \", _jsx(_components.code, {\n children: \"GET .../contact-card\"\n }), \" about 15 seconds later reports \", _jsx(_components.code, {\n children: \"active\"\n }), \". There is no need to send the change again. The response confirms the number accepted the change, not that anyone has seen it yet. Blujay offers the card automatically with your next message in each iMessage chat and refreshes it once a day, so there is nothing to call. If you change it several times in a row, an iPhone may show an earlier version until the next daily refresh. People who saved the number as a contact keep their own card.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Refusals: Free Plan numbers \", _jsx(_components.code, {\n children: \"400 FEATURE_NOT_ENABLED\"\n }), \"; a photo that isn’t JPEG or PNG \", _jsx(_components.code, {\n children: \"415 UNSUPPORTED_ATTACHMENT_TYPE\"\n }), \"; a photo still uploading \", _jsx(_components.code, {\n children: \"409 ATTACHMENT_NOT_READY\"\n }), \"; a number that is busy with another change, not set up, or not reachable \", _jsx(_components.code, {\n children: \"503 PHONE_NUMBER_UNAVAILABLE\"\n }), \" with \", _jsx(_components.code, {\n children: \"Retry-After\"\n }), \". After a \", _jsx(_components.code, {\n children: \"503\"\n }), \", read \", _jsx(_components.code, {\n children: \"GET .../contact-card\"\n }), \" before retrying: if the number applied the change after all, the read reports 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":"Set a number's iMessage name and photo","description":"Sets the iMessage name and photo for one of your dedicated numbers. Upload the photo first with `POST /v1/attachments` (JPEG or PNG, up to 25 MiB); Blujay center-crops it to a square and resizes it for iMessage. `PUT` replaces the name. Omit `avatar_attachment_id` to keep the current photo, or send `null` to remove it so iMessage shows the number's initials.\n\n`PUT` waits up to about 3 seconds for the number to publish the change. Usually it does, and you get `200` with `status: active`. If Apple is slow to take the change, you get `202` with `status: applying`; the number keeps going on its own, and `GET .../contact-card` about 15 seconds later reports `active`. There is no need to send the change again. The response confirms the number accepted the change, not that anyone has seen it yet. Blujay offers the card automatically with your next message in each iMessage chat and refreshes it once a day, so there is nothing to call. If you change it several times in a row, an iPhone may show an earlier version until the next daily refresh. People who saved the number as a contact keep their own card.\n\nRefusals: Free Plan numbers `400 FEATURE_NOT_ENABLED`; a photo that isn't JPEG or PNG `415 UNSUPPORTED_ATTACHMENT_TYPE`; a photo still uploading `409 ATTACHMENT_NOT_READY`; a number that is busy with another change, not set up, or not reachable `503 PHONE_NUMBER_UNAVAILABLE` with `Retry-After`. After a `503`, read `GET .../contact-card` before retrying: if the number applied the change after all, the read reports it.\n","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","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Phone Numbers"],"summary":"Set a number's iMessage name and photo","description":"Sets the iMessage name and photo for one of your dedicated numbers. Upload the photo first with `POST /v1/attachments` (JPEG or PNG, up to 25 MiB); Blujay center-crops it to a square and resizes it for iMessage. `PUT` replaces the name. Omit `avatar_attachment_id` to keep the current photo, or send `null` to remove it so iMessage shows the number's initials.\n\n`PUT` waits up to about 3 seconds for the number to publish the change. Usually it does, and you get `200` with `status: active`. If Apple is slow to take the change, you get `202` with `status: applying`; the number keeps going on its own, and `GET .../contact-card` about 15 seconds later reports `active`. There is no need to send the change again. The response confirms the number accepted the change, not that anyone has seen it yet. Blujay offers the card automatically with your next message in each iMessage chat and refreshes it once a day, so there is nothing to call. If you change it several times in a row, an iPhone may show an earlier version until the next daily refresh. People who saved the number as a contact keep their own card.\n\nRefusals: Free Plan numbers `400 FEATURE_NOT_ENABLED`; a photo that isn't JPEG or PNG `415 UNSUPPORTED_ATTACHMENT_TYPE`; a photo still uploading `409 ATTACHMENT_NOT_READY`; a number that is busy with another change, not set up, or not reachable `503 PHONE_NUMBER_UNAVAILABLE` with `Retry-After`. After a `503`, read `GET .../contact-card` before retrying: if the number applied the change after all, the read reports it.\n","operationId":"putPublicPhoneNumberContactCard","security":["11721992-b4dd-4481-9dcc-f36f05c93fec"],"parameters":["1ba4c52c-5485-4dea-96f2-1cb96d77f6a7"],"requestBody":"566eadd0-c609-4c24-9cc8-48152ce1edf8","responses":{"200":"d204431d-8901-43c1-8238-dcbce0e77a4c","202":"9cd14797-109b-4bf1-9b35-266af405e338","400":"5237688c-dff6-4027-a4da-4e1c78c97184","401":"5ba92efc-a8e0-40d3-876a-46e71febe9c2","404":"fe0bd1fb-8f6e-49a3-a746-f165aa3a0539","409":"4a425254-7e0d-4361-8102-a30444df8c65","413":"8f701189-8015-4608-b447-381f1bb1edda","415":"37eb4e1a-3667-47a7-b2dd-4326a3f46337","503":"4e45c0da-ea8a-4512-a33a-8ac074429238"},"method":"put","type":"path","servers":["660565a7-87d9-4b09-af2e-872548a05c9e"],"path":"/v1/phone-numbers/{phone_number_id}/contact-card","baseUrlOptions":["https://api.blujay.io"],"title":"Set a number's iMessage name and photo","codeSamples":[],"requestExampleLanguages":["bash","javascript","python","go","ruby","php"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"1ba4c52c-5485-4dea-96f2-1cb96d77f6a7":{"name":"phone_number_id","in":"path","required":true,"schema":{"type":"string","examples":["phone_abc123"],"pattern":"^phone_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"description":"The iMessage name and photo to set on a dedicated number. `PUT` replaces the name. Omit `avatar_attachment_id` to keep the current photo; send `null` to remove it.","required":["first_name"],"properties":{"first_name":{"type":"string","minLength":1,"maxLength":80,"examples":["Acme"],"isRequired":true,"uniqueKey":"first_name","typeLabel":"string"},"last_name":{"type":"string","maxLength":80,"description":"Optional. Blank when omitted.","examples":["Support"],"uniqueKey":"last_name","typeLabel":"string"},"avatar_attachment_id":{"oneOf":[{"type":"string","description":"A ready JPEG or PNG attachment from `POST /v1/attachments`, up to 25 MiB. Blujay center-crops it to a square and resizes it to 512 by 512 for iMessage. `null` removes the photo.","pattern":"^att_[A-Za-z0-9_-]+$","example":"att_abc123","uniqueKey":"avatar_attachment_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"A ready JPEG or PNG attachment from `POST /v1/attachments`, up to 25 MiB. Blujay center-crops it to a square and resizes it to 512 by 512 for iMessage. `null` removes the photo.","uniqueKey":"avatar_attachment_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"avatar_attachment_id","typeLabel":"string | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"supportLine":{"title":"supportLine","value":{"first_name":"Acme","last_name":"Support","avatar_attachment_id":"att_abc123"}},"nameOnly":{"title":"nameOnly","value":{"first_name":"Acme","last_name":"Sales"}},"removePhoto":{"title":"removePhoto","value":{"first_name":"Acme","last_name":"Support","avatar_attachment_id":null}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"d204431d-8901-43c1-8238-dcbce0e77a4c":{"description":"The number published the change. `status` is `active`.","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,"description":"The iMessage name and photo a dedicated number offers to people who don't have it saved.","required":["phone_number_id","status","first_name","last_name","display_name","photo","updated_at"],"properties":{"phone_number_id":{"type":"string","examples":["phone_abc123"],"pattern":"^phone_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"data.phone_number_id","typeLabel":"string"},"status":{"type":"string","enum":["not_set","applying","active","unavailable"],"description":"- `not_set`: the number shares no name and photo.\n- `applying`: a change was accepted and the number is finishing it; read again in a few seconds.\n- `active`: the name and photo are in place.\n- `unavailable`: the number can't report its state right now.\n","isRequired":true,"uniqueKey":"data.status","typeLabel":"enum\u003cstring>"},"first_name":{"oneOf":[{"type":"string","examples":["Acme"],"isRequired":true,"uniqueKey":"data.first_name.oneOf.0","typeLabel":"string"},{"type":"null","examples":["Acme"],"isRequired":true,"uniqueKey":"data.first_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.first_name","typeLabel":"string | null"},"last_name":{"oneOf":[{"type":"string","examples":["Support"],"isRequired":true,"uniqueKey":"data.last_name.oneOf.0","typeLabel":"string"},{"type":"null","examples":["Support"],"isRequired":true,"uniqueKey":"data.last_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.last_name","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The name recipients see, built from the first and last name.","examples":["Acme Support"],"isRequired":true,"uniqueKey":"data.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The name recipients see, built from the first and last name.","examples":["Acme Support"],"isRequired":true,"uniqueKey":"data.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.display_name","typeLabel":"string | null"},"photo":{"oneOf":[{"type":"object","description":"`null` when the number has no photo (iMessage shows initials).","required":["download_url","content_type"],"properties":{"download_url":{"type":"string","description":"Path of `GET /v1/phone-numbers/{phone_number_id}/contact-card/photo`; send it with your API key.","examples":["/v1/phone-numbers/phone_abc123/contact-card/photo"],"isRequired":true,"uniqueKey":"data.photo.oneOf.0.download_url","typeLabel":"string"},"content_type":{"type":"string","enum":["image/png"],"isRequired":true,"uniqueKey":"data.photo.oneOf.0.content_type","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"data.photo.oneOf.0","typeLabel":"object"},{"type":"null","description":"`null` when the number has no photo (iMessage shows initials).","isRequired":true,"uniqueKey":"data.photo.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.photo","typeLabel":"object | null"},"updated_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the number last changed its name and photo state.","isRequired":true,"uniqueKey":"data.updated_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the number last changed its name and photo state.","isRequired":true,"uniqueKey":"data.updated_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.updated_at","typeLabel":"string\u003cdate-time> | null"}},"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":{"active":{"title":"active","value":{"status":"success","data":{"phone_number_id":"phone_abc123","status":"active","first_name":"Acme","last_name":"Support","display_name":"Acme Support","photo":{"download_url":"/v1/phone-numbers/phone_abc123/contact-card/photo","content_type":"image/png"},"updated_at":"2026-10-22T17:00:01.000Z"},"trace_id":"trc_8f2a1c0e4b7d","timestamp":"2026-10-22T17:00:02.000Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"9cd14797-109b-4bf1-9b35-266af405e338":{"description":"The change was accepted and the number is still publishing it. `status` is `applying`; read `GET .../contact-card` about 15 seconds later to confirm `active`.","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,"description":"The iMessage name and photo a dedicated number offers to people who don't have it saved.","required":["phone_number_id","status","first_name","last_name","display_name","photo","updated_at"],"properties":{"phone_number_id":{"type":"string","examples":["phone_abc123"],"pattern":"^phone_[A-Za-z0-9_-]+$","isRequired":true,"uniqueKey":"data.phone_number_id","typeLabel":"string"},"status":{"type":"string","enum":["not_set","applying","active","unavailable"],"description":"- `not_set`: the number shares no name and photo.\n- `applying`: a change was accepted and the number is finishing it; read again in a few seconds.\n- `active`: the name and photo are in place.\n- `unavailable`: the number can't report its state right now.\n","isRequired":true,"uniqueKey":"data.status","typeLabel":"enum\u003cstring>"},"first_name":{"oneOf":[{"type":"string","examples":["Acme"],"isRequired":true,"uniqueKey":"data.first_name.oneOf.0","typeLabel":"string"},{"type":"null","examples":["Acme"],"isRequired":true,"uniqueKey":"data.first_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.first_name","typeLabel":"string | null"},"last_name":{"oneOf":[{"type":"string","examples":["Support"],"isRequired":true,"uniqueKey":"data.last_name.oneOf.0","typeLabel":"string"},{"type":"null","examples":["Support"],"isRequired":true,"uniqueKey":"data.last_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.last_name","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The name recipients see, built from the first and last name.","examples":["Acme Support"],"isRequired":true,"uniqueKey":"data.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The name recipients see, built from the first and last name.","examples":["Acme Support"],"isRequired":true,"uniqueKey":"data.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.display_name","typeLabel":"string | null"},"photo":{"oneOf":[{"type":"object","description":"`null` when the number has no photo (iMessage shows initials).","required":["download_url","content_type"],"properties":{"download_url":{"type":"string","description":"Path of `GET /v1/phone-numbers/{phone_number_id}/contact-card/photo`; send it with your API key.","examples":["/v1/phone-numbers/phone_abc123/contact-card/photo"],"isRequired":true,"uniqueKey":"data.photo.oneOf.0.download_url","typeLabel":"string"},"content_type":{"type":"string","enum":["image/png"],"isRequired":true,"uniqueKey":"data.photo.oneOf.0.content_type","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"data.photo.oneOf.0","typeLabel":"object"},{"type":"null","description":"`null` when the number has no photo (iMessage shows initials).","isRequired":true,"uniqueKey":"data.photo.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.photo","typeLabel":"object | null"},"updated_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the number last changed its name and photo state.","isRequired":true,"uniqueKey":"data.updated_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the number last changed its name and photo state.","isRequired":true,"uniqueKey":"data.updated_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.updated_at","typeLabel":"string\u003cdate-time> | null"}},"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":{"applying":{"title":"applying","value":{"status":"success","data":{"phone_number_id":"phone_abc123","status":"applying","first_name":"Acme","last_name":"Support","display_name":"Acme Support","photo":{"download_url":"/v1/phone-numbers/phone_abc123/contact-card/photo","content_type":"image/png"},"updated_at":"2026-10-22T17:00:00.000Z"},"trace_id":"trc_8f2a1c0e4b7d","timestamp":"2026-10-22T17:00:01.000Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"5237688c-dff6-4027-a4da-4e1c78c97184":{"description":"The body failed validation (`VALIDATION_ERROR`), the photo could not be processed (`VALIDATION_ERROR`), or the number is on the Free Plan (`FEATURE_NOT_ENABLED`).","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"},"5ba92efc-a8e0-40d3-876a-46e71febe9c2":{"description":"The API key is missing or invalid (`UNAUTHORIZED`), revoked (`API_KEY_REVOKED`) or expired (`API_KEY_EXPIRED`).","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"},"fe0bd1fb-8f6e-49a3-a746-f165aa3a0539":{"description":"The phone number or the attachment is not in your workspace (`NOT_FOUND`).","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"},"4a425254-7e0d-4361-8102-a30444df8c65":{"description":"The attachment's file has not finished uploading (`ATTACHMENT_NOT_READY`).","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"},"8f701189-8015-4608-b447-381f1bb1edda":{"description":"The photo is over 25 MiB (`ATTACHMENT_TOO_LARGE`).","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"},"37eb4e1a-3667-47a7-b2dd-4326a3f46337":{"description":"The attachment is not a JPEG or PNG image (`UNSUPPORTED_ATTACHMENT_TYPE`).","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"},"4e45c0da-ea8a-4512-a33a-8ac074429238":{"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":{"11721992-b4dd-4481-9dcc-f36f05c93fec":{"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":"Set a number's iMessage name and photo - Blujay API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-11T01:31:23.987Z","originalFileLocation":"api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo.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=\"Sets the iMessage name and photo for one of your dedicated numbers. Upload the photo first with POST /v1/attachments (JPEG or PNG, up to 25 MiB); Blujay center-crops it to a square and resizes it for iMessage. PUT replaces the name. Omit avatar_attachment_id to keep the current photo, or send null to remove it so iMessage shows the number\u0026#x27;s initials. PUT waits up to about 3 seconds for the number to publish the change. Usually it does, and you get 200 with status: active. If Apple is slow to take the change, you get 202 with status: applying; the number keeps going on its own, and GET .../contact-card about 15 seconds later reports active. There is no need to send the change again. The response confirms the number accepted the change, not that anyone has seen it yet. Blujay offers the card automatically with your next message in each iMessage chat and refreshes it once a day, so there is nothing to call. If you change it several times in a row, an iPhone may show an earlier version until the next daily refresh. People who saved the number as a contact keep their own card. Refusals: Free Plan numbers 400 FEATURE_NOT_ENABLED; a photo that isn\u0026#x27;t JPEG or PNG 415 UNSUPPORTED_ATTACHMENT_TYPE; a photo still uploading 409 ATTACHMENT_NOT_READY; a number that is busy with another change, not set up, or not reachable 503 PHONE_NUMBER_UNAVAILABLE with Retry-After. After a 503, read GET .../contact-card before retrying: if the number applied the change after all, the read reports 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=\"Set a number\u0026#x27;s iMessage name and photo - Blujay API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Sets the iMessage name and photo for one of your dedicated numbers. Upload the photo first with POST /v1/attachments (JPEG or PNG, up to 25 MiB); Blujay center-crops it to a square and resizes it for iMessage. PUT replaces the name. Omit avatar_attachment_id to keep the current photo, or send null to remove it so iMessage shows the number\u0026#x27;s initials. PUT waits up to about 3 seconds for the number to publish the change. Usually it does, and you get 200 with status: active. If Apple is slow to take the change, you get 202 with status: applying; the number keeps going on its own, and GET .../contact-card about 15 seconds later reports active. There is no need to send the change again. The response confirms the number accepted the change, not that anyone has seen it yet. Blujay offers the card automatically with your next message in each iMessage chat and refreshes it once a day, so there is nothing to call. If you change it several times in a row, an iPhone may show an earlier version until the next daily refresh. People who saved the number as a contact keep their own card. Refusals: Free Plan numbers 400 FEATURE_NOT_ENABLED; a photo that isn\u0026#x27;t JPEG or PNG 415 UNSUPPORTED_ATTACHMENT_TYPE; a photo still uploading 409 ATTACHMENT_NOT_READY; a number that is busy with another change, not set up, or not reachable 503 PHONE_NUMBER_UNAVAILABLE with Retry-After. After a 503, read GET .../contact-card before retrying: if the number applied the change after all, the read reports 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/phone-numbers/set-a-numbers-imessage-name-and-photo\">\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=Phone+Numbers\u0026amp;title=Set+a+number%27s+iMessage+name+and+photo\u0026amp;description=Sets+the+iMessage+name+and+photo+for+one+of+your+dedicated+numbers.+Upload+the+photo+first+with+%60POST+%2Fv1%2Fattachments%60+%28JPEG+or+PNG%2C+up+to+25+MiB%29%3B+Blujay+cente\u0026amp;theme=fd31e5cf5d981648caebe5b9\u0026amp;signature=7d600ef1c5b817053b026a5b955f84e1e9c95eecd6ae4e93f9a59b1c7320d760\">\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=\"Set a number\u0026#x27;s iMessage name and photo - Blujay API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Sets the iMessage name and photo for one of your dedicated numbers. Upload the photo first with POST /v1/attachments (JPEG or PNG, up to 25 MiB); Blujay center-crops it to a square and resizes it for iMessage. PUT replaces the name. Omit avatar_attachment_id to keep the current photo, or send null to remove it so iMessage shows the number\u0026#x27;s initials. PUT waits up to about 3 seconds for the number to publish the change. Usually it does, and you get 200 with status: active. If Apple is slow to take the change, you get 202 with status: applying; the number keeps going on its own, and GET .../contact-card about 15 seconds later reports active. There is no need to send the change again. The response confirms the number accepted the change, not that anyone has seen it yet. Blujay offers the card automatically with your next message in each iMessage chat and refreshes it once a day, so there is nothing to call. If you change it several times in a row, an iPhone may show an earlier version until the next daily refresh. People who saved the number as a contact keep their own card. Refusals: Free Plan numbers 400 FEATURE_NOT_ENABLED; a photo that isn\u0026#x27;t JPEG or PNG 415 UNSUPPORTED_ATTACHMENT_TYPE; a photo still uploading 409 ATTACHMENT_NOT_READY; a number that is busy with another change, not set up, or not reachable 503 PHONE_NUMBER_UNAVAILABLE with Retry-After. After a 503, read GET .../contact-card before retrying: if the number applied the change after all, the read reports it.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://blujay-api.mintlify.site/_mintlify/api/og/v2?division=Phone+Numbers\u0026amp;title=Set+a+number%27s+iMessage+name+and+photo\u0026amp;description=Sets+the+iMessage+name+and+photo+for+one+of+your+dedicated+numbers.+Upload+the+photo+first+with+%60POST+%2Fv1%2Fattachments%60+%28JPEG+or+PNG%2C+up+to+25+MiB%29%3B+Blujay+cente\u0026amp;theme=fd31e5cf5d981648caebe5b9\u0026amp;signature=7d600ef1c5b817053b026a5b955f84e1e9c95eecd6ae4e93f9a59b1c7320d760\">\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/phone-numbers/set-a-numbers-imessage-name-and-photo\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo.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/phone-numbers/set-a-numbers-imessage-name-and-photo#webpage\",\"url\":\"https://docs.blujay.io/api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo\",\"name\":\"Set a number's iMessage name and photo\",\"description\":\"Sets the iMessage name and photo for one of your dedicated numbers. Upload the photo first with POST /v1/attachments (JPEG or PNG, up to 25 MiB); Blujay center-crops it to a square and resizes it for iMessage. PUT replaces the name. Omit avatar_attachment_id to keep the current photo, or send null to remove it so iMessage shows the number's initials. PUT waits up to about 3 seconds for the number to publish the change. Usually it does, and you get 200 with status: active. If Apple is slow to take the change, you get 202 with status: applying; the number keeps going on its own, and GET .../contact-card about 15 seconds later reports active. There is no need to send the change again. The response confirms the number accepted the change, not that anyone has seen it yet. Blujay offers the card automatically with your next message in each iMessage chat and refreshes it once a day, so there is nothing to call. If you change it several times in a row, an iPhone may show an earlier version until the next daily refresh. People who saved the number as a contact keep their own card. Refusals: Free Plan numbers 400 FEATURE_NOT_ENABLED; a photo that isn't JPEG or PNG 415 UNSUPPORTED_ATTACHMENT_TYPE; a photo still uploading 409 ATTACHMENT_NOT_READY; a number that is busy with another change, not set up, or not reachable 503 PHONE_NUMBER_UNAVAILABLE with Retry-After. After a 503, read GET .../contact-card before retrying: if the number applied the change after all, the read reports it.\",\"dateModified\":\"2026-11-11T01:31:23.987Z\",\"isPartOf\":{\"@id\":\"https://docs.blujay.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.blujay.io/api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.blujay.io/api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo#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\":\"Phone Numbers\",\"item\":\"https://docs.blujay.io/api-reference/phone-numbers/list-phone-numbers\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Set a number's iMessage name and photo\",\"item\":\"https://docs.blujay.io/api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.blujay.io/api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo#apireference\",\"headline\":\"Set a number's iMessage name and photo\",\"name\":\"Set a number's iMessage name and photo\",\"description\":\"Sets the iMessage name and photo for one of your dedicated numbers. Upload the photo first with POST /v1/attachments (JPEG or PNG, up to 25 MiB); Blujay center-crops it to a square and resizes it for iMessage. PUT replaces the name. Omit avatar_attachment_id to keep the current photo, or send null to remove it so iMessage shows the number's initials. PUT waits up to about 3 seconds for the number to publish the change. Usually it does, and you get 200 with status: active. If Apple is slow to take the change, you get 202 with status: applying; the number keeps going on its own, and GET .../contact-card about 15 seconds later reports active. There is no need to send the change again. The response confirms the number accepted the change, not that anyone has seen it yet. Blujay offers the card automatically with your next message in each iMessage chat and refreshes it once a day, so there is nothing to call. If you change it several times in a row, an iPhone may show an earlier version until the next daily refresh. People who saved the number as a contact keep their own card. Refusals: Free Plan numbers 400 FEATURE_NOT_ENABLED; a photo that isn't JPEG or PNG 415 UNSUPPORTED_ATTACHMENT_TYPE; a photo still uploading 409 ATTACHMENT_NOT_READY; a number that is busy with another change, not set up, or not reachable 503 PHONE_NUMBER_UNAVAILABLE with Retry-After. After a 503, read GET .../contact-card before retrying: if the number applied the change after all, the read reports it.\",\"url\":\"https://docs.blujay.io/api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo\",\"mainEntityOfPage\":{\"@id\":\"https://docs.blujay.io/api-reference/phone-numbers/set-a-numbers-imessage-name-and-photo#webpage\"},\"dateModified\":\"2026-11-11T01:31:23.987Z\",\"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/phone-numbers/set-a-numbers-imessage-name-and-photo.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","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","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","description":"Returns the iMessage name and photo one of your dedicated numbers offers to people who don't have it saved (Apple's \"Share name and photo\"). Blujay asks the number for its current state on every read, so `status` is live:\n- `not_set`: the number shares no name and photo.\n- `applying`: a change was accepted and the number is finishing it. Read again in about 15 seconds.\n- `active`: the name and photo are in place.\n- `unavailable`: the number can't report its state right now.\n\n`photo` is `null` when the number has no photo (iMessage shows initials); otherwise `photo.download_url` returns the current photo as a PNG. Free Plan numbers return `400 FEATURE_NOT_ENABLED`.\n","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","description":"Stops the number from offering a name and photo. Returns `202` with the profile; `status` becomes `not_set` once the number confirms. People who already accepted the name and photo keep it on their phones.","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":"Set a number's iMessage name and photo - 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"]}