Accepts optional attachments. Each item carries its value under src (or the
accepted aliases content / url / data) and, optionally, type and
caption. A bare string, or a single item outside a list, is accepted too.
src takes one of two forms:
Inline bytes — a data: URI or bare base64. Decoded, verified against
their own magic bytes, and written to S3 before the message row, so a
storage failure never leaves a message with a broken image in the chat. A
declared type is ignored here: the bytes decide.
A link — an https:// URL. Stored as given and never fetched: the
operator’s browser loads it directly, so Rescue neither hosts nor guarantees
it, and a URL that expires will stop rendering. type is the only type signal
a link has; without it the type is guessed from the file extension and
otherwise falls back to a plain link. Only https, a public host and the
default port are accepted.
Rejections carry a stable code in detail.error (see AttachmentRejectReason).
Retries of a message whose attachments are all inline bytes are safe: an
identical payload re-posted inside the dedupe window returns the original message
instead of creating a second one. Text-only messages are not deduplicated —
repeated posts each create a message, as they always have. Neither are messages
carrying a link: a link is identified by its URL, and the media behind a URL can
change, so collapsing a re-post would hide a new frame rather than a duplicate.
Retry a link post only if you want a second message.
The conversation is created on demand, so a message posted immediately after the
emergency is declared is accepted rather than rejected with a retry.
Attachments to post with the message. Accepts a list or a single item; each item is either an object with src (plus optional type, caption) or the bare value string. src takes a data: URI, bare base64, or an https:// URL. At most 5 per message. attachment is accepted as a singular alias for this field.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Punch Rescue Developer portal","colors":{"primary":"#E1051E","light":"#E1051E","dark":"#E1051E"},"logo":"https://mintcdn.com/punchrescue/O2-yITAI4Lh3gsko/images/svgviewer-output.svg?fit=max\u0026auto=format\u0026n=O2-yITAI4Lh3gsko\u0026q=85\u0026s=0450206ce5ace91d28653dc827183bc4","favicon":"https://mintcdn.com/punchrescue/eXiAGYuzrlrOIu5A/images/cropped-Rescue-Logo-Icon-Favicon-32x32.png?fit=max\u0026auto=format\u0026n=eXiAGYuzrlrOIu5A\u0026q=85\u0026s=529865521acfd6706b9f0aca7bb9177e","api":{"openapi":"openapi.json"},"navbar":{"links":[{"href":"mailto:support@punchrescue.com","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://dashboard.mintlify.com"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/punch-rescue"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"punchrescue","hasAudioNarration":false,"actualSubdomain":"punchrescue","customDomains":["docs.punchrescue.com"],"gitSource":{"type":"github","owner":"mintlify-community","repo":"docs-punchrescue-48eaf8b8","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6abb956ac9f9b22ff3770563","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API reference","count":2},{"language":"default","tag":"API documentation","count":2},{"language":"default","tag":"MCP Server","count":1},{"language":"default","tag":"Overview","count":1}]},"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":"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},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/emergencies/post-a-message-to-an-emergencys-conversation","slug":"/api-reference/emergencies/post-a-message-to-an-emergencys-conversation","pageMetadata":{"title":"Post a message to an emergency's conversation","description":"**Required permission:** `write`.\n\nAccepts optional `attachments`. Each item carries its value under `src` (or the\naccepted aliases `content` / `url` / `data`) and, optionally, `type` and\n`caption`. A bare string, or a single item outside a list, is accepted too.\n\n`src` takes one of two forms:\n\n* **Inline bytes** — a `data:` URI or bare base64. Decoded, verified against\n their own magic bytes, and written to S3 *before* the message row, so a\n storage failure never leaves a message with a broken image in the chat. A\n declared `type` is ignored here: the bytes decide.\n* **A link** — an `https://` URL. Stored as given and **never fetched**: the\n operator's browser loads it directly, so Rescue neither hosts nor guarantees\n it, and a URL that expires will stop rendering. `type` is the only type signal\n a link has; without it the type is guessed from the file extension and\n otherwise falls back to a plain link. Only https, a public host and the\n default port are accepted.\n\nRejections carry a stable code in `detail.error` (see `AttachmentRejectReason`).\n\nRetries of a message whose attachments are *all inline bytes* are safe: an\nidentical payload re-posted inside the dedupe window returns the original message\ninstead of creating a second one. Text-only messages are not deduplicated —\nrepeated posts each create a message, as they always have. Neither are messages\ncarrying a link: a link is identified by its URL, and the media behind a URL can\nchange, so collapsing a re-post would hide a new frame rather than a duplicate.\nRetry a link post only if you want a second message.\n\nThe conversation is created on demand, so a message posted immediately after the\nemergency is declared is accepted rather than rejected with a retry.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json post /orgs/{org_id}/emergencies/{emergency_id}/messages","href":"/api-reference/emergencies/post-a-message-to-an-emergencys-conversation","autogeneratedByOpenApi":true,"hidden":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 em: \"em\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Required permission:\"\n }), \" \", _jsx(_components.code, {\n children: \"write\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Accepts optional \", _jsx(_components.code, {\n children: \"attachments\"\n }), \". Each item carries its value under \", _jsx(_components.code, {\n children: \"src\"\n }), \" (or the\\naccepted aliases \", _jsx(_components.code, {\n children: \"content\"\n }), \" / \", _jsx(_components.code, {\n children: \"url\"\n }), \" / \", _jsx(_components.code, {\n children: \"data\"\n }), \") and, optionally, \", _jsx(_components.code, {\n children: \"type\"\n }), \" and\\n\", _jsx(_components.code, {\n children: \"caption\"\n }), \". A bare string, or a single item outside a list, is accepted too.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"src\"\n }), \" takes one of two forms:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Inline bytes\"\n }), \" — a \", _jsx(_components.code, {\n children: \"data:\"\n }), \" URI or bare base64. Decoded, verified against\\ntheir own magic bytes, and written to S3 \", _jsx(_components.em, {\n children: \"before\"\n }), \" the message row, so a\\nstorage failure never leaves a message with a broken image in the chat. A\\ndeclared \", _jsx(_components.code, {\n children: \"type\"\n }), \" is ignored here: the bytes decide.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"A link\"\n }), \" — an \", _jsx(_components.code, {\n children: \"https://\"\n }), \" URL. Stored as given and \", _jsx(_components.strong, {\n children: \"never fetched\"\n }), \": the\\noperator’s browser loads it directly, so Rescue neither hosts nor guarantees\\nit, and a URL that expires will stop rendering. \", _jsx(_components.code, {\n children: \"type\"\n }), \" is the only type signal\\na link has; without it the type is guessed from the file extension and\\notherwise falls back to a plain link. Only https, a public host and the\\ndefault port are accepted.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Rejections carry a stable code in \", _jsx(_components.code, {\n children: \"detail.error\"\n }), \" (see \", _jsx(_components.code, {\n children: \"AttachmentRejectReason\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Retries of a message whose attachments are \", _jsx(_components.em, {\n children: \"all inline bytes\"\n }), \" are safe: an\\nidentical payload re-posted inside the dedupe window returns the original message\\ninstead of creating a second one. Text-only messages are not deduplicated —\\nrepeated posts each create a message, as they always have. Neither are messages\\ncarrying a link: a link is identified by its URL, and the media behind a URL can\\nchange, so collapsing a re-post would hide a new frame rather than a duplicate.\\nRetry a link post only if you want a second message.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"The conversation is created on demand, so a message posted immediately after the\\nemergency is declared is accepted rather than rejected with a retry.\"\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":"Post a message to an emergency's conversation","description":"**Required permission:** `write`.\n\nAccepts optional `attachments`. Each item carries its value under `src` (or the\naccepted aliases `content` / `url` / `data`) and, optionally, `type` and\n`caption`. A bare string, or a single item outside a list, is accepted too.\n\n`src` takes one of two forms:\n\n* **Inline bytes** — a `data:` URI or bare base64. Decoded, verified against\n their own magic bytes, and written to S3 *before* the message row, so a\n storage failure never leaves a message with a broken image in the chat. A\n declared `type` is ignored here: the bytes decide.\n* **A link** — an `https://` URL. Stored as given and **never fetched**: the\n operator's browser loads it directly, so Rescue neither hosts nor guarantees\n it, and a URL that expires will stop rendering. `type` is the only type signal\n a link has; without it the type is guessed from the file extension and\n otherwise falls back to a plain link. Only https, a public host and the\n default port are accepted.\n\nRejections carry a stable code in `detail.error` (see `AttachmentRejectReason`).\n\nRetries of a message whose attachments are *all inline bytes* are safe: an\nidentical payload re-posted inside the dedupe window returns the original message\ninstead of creating a second one. Text-only messages are not deduplicated —\nrepeated posts each create a message, as they always have. Neither are messages\ncarrying a link: a link is identified by its URL, and the media behind a URL can\nchange, so collapsing a re-post would hide a new frame rather than a duplicate.\nRetry a link post only if you want a second message.\n\nThe conversation is created on demand, so a message posted immediately after the\nemergency is declared is accepted rather than rejected with a retry.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json post /orgs/{org_id}/emergencies/{emergency_id}/messages","href":"/api-reference/emergencies/post-a-message-to-an-emergencys-conversation","autogeneratedByOpenApi":true,"hidden":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Emergencies"],"summary":"Post a message to an emergency's conversation","description":"**Required permission:** `write`.\n\nAccepts optional `attachments`. Each item carries its value under `src` (or the\naccepted aliases `content` / `url` / `data`) and, optionally, `type` and\n`caption`. A bare string, or a single item outside a list, is accepted too.\n\n`src` takes one of two forms:\n\n* **Inline bytes** — a `data:` URI or bare base64. Decoded, verified against\n their own magic bytes, and written to S3 *before* the message row, so a\n storage failure never leaves a message with a broken image in the chat. A\n declared `type` is ignored here: the bytes decide.\n* **A link** — an `https://` URL. Stored as given and **never fetched**: the\n operator's browser loads it directly, so Rescue neither hosts nor guarantees\n it, and a URL that expires will stop rendering. `type` is the only type signal\n a link has; without it the type is guessed from the file extension and\n otherwise falls back to a plain link. Only https, a public host and the\n default port are accepted.\n\nRejections carry a stable code in `detail.error` (see `AttachmentRejectReason`).\n\nRetries of a message whose attachments are *all inline bytes* are safe: an\nidentical payload re-posted inside the dedupe window returns the original message\ninstead of creating a second one. Text-only messages are not deduplicated —\nrepeated posts each create a message, as they always have. Neither are messages\ncarrying a link: a link is identified by its URL, and the media behind a URL can\nchange, so collapsing a re-post would hide a new frame rather than a duplicate.\nRetry a link post only if you want a second message.\n\nThe conversation is created on demand, so a message posted immediately after the\nemergency is declared is accepted rather than rejected with a retry.","operationId":"emergencies.messages.create","parameters":["4a02a694-50c4-44eb-ba1e-1b3913d004e6","4772b0ea-892f-4903-bf08-c7c4ce4a9bc5"],"requestBody":"b37fb2b6-b734-47ce-bec2-c74cc2c8fa37","responses":{"201":"0cecf34c-b1f5-492b-a243-9f5fa241c249","422":"d0529732-99a9-4ddb-82ce-998a9e3b7f5c"},"method":"post","type":"path","servers":["3029d8cd-4e5a-4715-849a-211bc3098e1d"],"security":["bb444628-4fb1-4a94-851f-a263e6f24212"],"path":"/orgs/{org_id}/emergencies/{emergency_id}/messages","baseUrlOptions":["https://api.punchrescue.com/api/public/v1"],"title":"Post a message to an emergency's conversation","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"4a02a694-50c4-44eb-ba1e-1b3913d004e6":{"name":"org_id","in":"path","required":true,"schema":{"type":"string","description":"Target organization id (from the route path)","title":"Org Id","isRequired":true,"uniqueKey":"","typeLabel":"string"},"description":"Target organization id (from the route path)"},"4772b0ea-892f-4903-bf08-c7c4ce4a9bc5":{"name":"emergency_id","in":"path","required":true,"schema":{"type":"string","description":"Emergency id","title":"Emergency Id","isRequired":true,"uniqueKey":"","typeLabel":"string"},"description":"Emergency id"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"content":{"oneOf":[{"type":"string","title":"Content","maxLength":4000,"uniqueKey":"content.oneOf.0","typeLabel":"string"},{"type":"null","title":"Content","uniqueKey":"content.oneOf.1","typeLabel":"null"}],"uniqueKey":"content","typeLabel":"string | null"},"author":{"oneOf":[{"type":"object","title":"MessageAuthorInput","required":["type"],"properties":{"type":{"type":"string","enum":["agent","system","user"],"title":"Type","description":"Author kind; becomes the message source","isRequired":true,"uniqueKey":"author.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","title":"Name","maxLength":128,"uniqueKey":"author.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","uniqueKey":"author.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"author.oneOf.0.name","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"author.oneOf.0","typeLabel":"MessageAuthorInput · object"},{"type":"null","uniqueKey":"author.oneOf.1","typeLabel":"null"}],"uniqueKey":"author","typeLabel":"MessageAuthorInput · object | null"},"attachments":{"items":{"properties":{"src":{"type":"string","minLength":1,"title":"Src","description":"Attachment value: a data: URI, bare base64, or an https:// URL","isRequired":true,"uniqueKey":"attachments.items.[INDEX].src","typeLabel":"string"},"type":{"oneOf":[{"type":"string","title":"Type","description":"Declared media type: either a full media type ('image/png', 'application/vnd.apple.mpegurl') or a bare kind ('image' | 'video' | 'hls_video' | 'audio' | 'file' | 'link'). Consulted only for `https://` attachments, which are never downloaded and so have no bytes to read it from; when omitted the type is guessed from the URL's file extension (an `.m3u8` becomes a live `hls_video`) and otherwise falls back to a plain link. Send `type: \"file\"` to force a download affordance. For inline base64 it is ignored — the type is always read from the magic bytes.","maxLength":255,"uniqueKey":"attachments.items.[INDEX].type.oneOf.0","typeLabel":"string"},{"type":"null","title":"Type","description":"Declared media type: either a full media type ('image/png', 'application/vnd.apple.mpegurl') or a bare kind ('image' | 'video' | 'hls_video' | 'audio' | 'file' | 'link'). Consulted only for `https://` attachments, which are never downloaded and so have no bytes to read it from; when omitted the type is guessed from the URL's file extension (an `.m3u8` becomes a live `hls_video`) and otherwise falls back to a plain link. Send `type: \"file\"` to force a download affordance. For inline base64 it is ignored — the type is always read from the magic bytes.","uniqueKey":"attachments.items.[INDEX].type.oneOf.1","typeLabel":"null"}],"uniqueKey":"attachments.items.[INDEX].type","typeLabel":"string | null"},"caption":{"oneOf":[{"type":"string","title":"Caption","description":"Optional text rendered under the media in chat","maxLength":512,"uniqueKey":"attachments.items.[INDEX].caption.oneOf.0","typeLabel":"string"},{"type":"null","title":"Caption","description":"Optional text rendered under the media in chat","uniqueKey":"attachments.items.[INDEX].caption.oneOf.1","typeLabel":"null"}],"uniqueKey":"attachments.items.[INDEX].caption","typeLabel":"string | null"}},"type":"object","required":["src"],"title":"AttachmentInput","description":"One inline attachment. Only the value is required; everything else is optional.\n\n`src` accepts several names because the engine-side contract was still open when\nthis shipped: `src` is canonical and the one documented, while `content`, `url`\nand `data` are honoured so the integration cannot be blocked by a naming choice.\nAliases resolve first-match-wins in the declared order, so a payload carrying more\nthan one is still deterministic.\n\n`type` carries the same set of aliases for the same reason as `src`: the engine\nspells it `mimeType`, the workflow catalog spells it `kind`, and neither should\nbe the reason a snapshot fails to post.\n\n`extra=\"ignore\"` rather than `forbid`: because `src` is required, a typo in the\nvalue key still fails loudly as a missing field, while a field the engine adds\nbefore we support it does not destroy an otherwise valid message.","uniqueKey":"attachments.items.[INDEX]","typeLabel":"AttachmentInput · object"},"type":"array","maxItems":5,"title":"Attachments","description":"Attachments to post with the message. Accepts a list or a single item; each item is either an object with `src` (plus optional `type`, `caption`) or the bare value string. `src` takes a data: URI, bare base64, or an https:// URL. At most 5 per message. `attachment` is accepted as a singular alias for this field.","uniqueKey":"attachments","typeLabel":"AttachmentInput · object[]"}},"additionalProperties":false,"type":"object","title":"CreateEmergencyMessageRequest","uniqueKey":"","typeLabel":"CreateEmergencyMessageRequest · object"},"examples":{"Example":{"title":"Example","value":{"content":"\u003cstring>","author":{"name":"\u003cstring>"},"attachments":[{"src":"\u003cstring>","type":"\u003cstring>","caption":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"0cecf34c-b1f5-492b-a243-9f5fa241c249":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"messageId":{"type":"string","title":"Messageid","isRequired":true,"uniqueKey":"messageId","typeLabel":"string"},"conversationId":{"type":"string","title":"Conversationid","isRequired":true,"uniqueKey":"conversationId","typeLabel":"string"},"content":{"type":"string","title":"Content","isRequired":true,"uniqueKey":"content","typeLabel":"string"},"source":{"oneOf":[{"type":"string","title":"Source","uniqueKey":"source.oneOf.0","typeLabel":"string"},{"type":"null","title":"Source","uniqueKey":"source.oneOf.1","typeLabel":"null"}],"uniqueKey":"source","typeLabel":"string | null"},"createdAt":{"oneOf":[{"type":"string","title":"Createdat","uniqueKey":"createdAt.oneOf.0","typeLabel":"string"},{"type":"null","title":"Createdat","uniqueKey":"createdAt.oneOf.1","typeLabel":"null"}],"uniqueKey":"createdAt","typeLabel":"string | null"},"attachments":{"items":{"properties":{"attachmentId":{"type":"string","title":"Attachmentid","isRequired":true,"uniqueKey":"attachments.items.[INDEX].attachmentId","typeLabel":"string"},"kind":{"type":"string","title":"Kind","description":"image | video | hls_video | audio | file | link. `hls_video` is a live HLS stream (play with an HLS player, badge it live); `link` is a URL to open in a new tab, not download.","isRequired":true,"uniqueKey":"attachments.items.[INDEX].kind","typeLabel":"string"},"mimeType":{"oneOf":[{"type":"string","title":"Mimetype","description":"Verified media type for stored bytes, read from the file's bytes; the caller's declared type for links (`application/vnd.apple.mpegurl` for HLS). Null for a bare link that declared no type.","uniqueKey":"attachments.items.[INDEX].mimeType.oneOf.0","typeLabel":"string"},{"type":"null","title":"Mimetype","description":"Verified media type for stored bytes, read from the file's bytes; the caller's declared type for links (`application/vnd.apple.mpegurl` for HLS). Null for a bare link that declared no type.","uniqueKey":"attachments.items.[INDEX].mimeType.oneOf.1","typeLabel":"null"}],"uniqueKey":"attachments.items.[INDEX].mimeType","typeLabel":"string | null"},"url":{"oneOf":[{"type":"string","title":"Url","description":"Absolute URL, ready to use as an \u003cimg src>. For stored media this is the CDN URL; for a link attachment it is the URL you supplied, unchanged. Null when no CDN domain is configured and one could not be assembled — skip the attachment rather than render it.","uniqueKey":"attachments.items.[INDEX].url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Url","description":"Absolute URL, ready to use as an \u003cimg src>. For stored media this is the CDN URL; for a link attachment it is the URL you supplied, unchanged. Null when no CDN domain is configured and one could not be assembled — skip the attachment rather than render it.","uniqueKey":"attachments.items.[INDEX].url.oneOf.1","typeLabel":"null"}],"uniqueKey":"attachments.items.[INDEX].url","typeLabel":"string | null"},"source":{"oneOf":[{"type":"string","title":"Source","description":"How the attachment arrived: data_uri | base64 | url. `url` means Rescue does not host it.","uniqueKey":"attachments.items.[INDEX].source.oneOf.0","typeLabel":"string"},{"type":"null","title":"Source","description":"How the attachment arrived: data_uri | base64 | url. `url` means Rescue does not host it.","uniqueKey":"attachments.items.[INDEX].source.oneOf.1","typeLabel":"null"}],"uniqueKey":"attachments.items.[INDEX].source","typeLabel":"string | null"},"sizeBytes":{"oneOf":[{"type":"integer","title":"Sizebytes","description":"Stored size in bytes; null for link attachments, which are never downloaded","uniqueKey":"attachments.items.[INDEX].sizeBytes.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Sizebytes","description":"Stored size in bytes; null for link attachments, which are never downloaded","uniqueKey":"attachments.items.[INDEX].sizeBytes.oneOf.1","typeLabel":"null"}],"uniqueKey":"attachments.items.[INDEX].sizeBytes","typeLabel":"integer | null"},"caption":{"oneOf":[{"type":"string","title":"Caption","uniqueKey":"attachments.items.[INDEX].caption.oneOf.0","typeLabel":"string"},{"type":"null","title":"Caption","uniqueKey":"attachments.items.[INDEX].caption.oneOf.1","typeLabel":"null"}],"uniqueKey":"attachments.items.[INDEX].caption","typeLabel":"string | null"},"width":{"oneOf":[{"type":"integer","title":"Width","description":"Pixel width, read from the file header. Null when the header could not be parsed.","uniqueKey":"attachments.items.[INDEX].width.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Width","description":"Pixel width, read from the file header. Null when the header could not be parsed.","uniqueKey":"attachments.items.[INDEX].width.oneOf.1","typeLabel":"null"}],"uniqueKey":"attachments.items.[INDEX].width","typeLabel":"integer | null"},"height":{"oneOf":[{"type":"integer","title":"Height","description":"Pixel height, read from the file header. Null when the header could not be parsed.","uniqueKey":"attachments.items.[INDEX].height.oneOf.0","typeLabel":"integer"},{"type":"null","title":"Height","description":"Pixel height, read from the file header. Null when the header could not be parsed.","uniqueKey":"attachments.items.[INDEX].height.oneOf.1","typeLabel":"null"}],"uniqueKey":"attachments.items.[INDEX].height","typeLabel":"integer | null"}},"type":"object","required":["attachmentId","kind"],"title":"PublicAttachmentResponse","uniqueKey":"attachments.items.[INDEX]","typeLabel":"PublicAttachmentResponse · object"},"type":"array","title":"Attachments","description":"Stored attachments; empty for text-only messages","uniqueKey":"attachments","typeLabel":"PublicAttachmentResponse · object[]"}},"type":"object","required":["messageId","conversationId","content"],"title":"PublicMessageResponse","uniqueKey":"","typeLabel":"PublicMessageResponse · object"},"examples":{"Example":{"title":"Example","value":{"messageId":"\u003cstring>","conversationId":"\u003cstring>","content":"\u003cstring>","source":"\u003cstring>","createdAt":"\u003cstring>","attachments":[{"attachmentId":"\u003cstring>","kind":"\u003cstring>","mimeType":"\u003cstring>","url":"\u003cstring>","source":"\u003cstring>","sizeBytes":123,"caption":"\u003cstring>","width":123,"height":123}]}}},"exampleType":"generated"}},"exampleType":"generated"},"d0529732-99a9-4ddb-82ce-998a9e3b7f5c":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"oneOf":[{"type":"string","uniqueKey":"detail.items.[INDEX].loc.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"integer","uniqueKey":"detail.items.[INDEX].loc.items.[INDEX].oneOf.1","typeLabel":"integer"}],"uniqueKey":"detail.items.[INDEX].loc.items.[INDEX]","typeLabel":"string | integer"},"type":"array","title":"Location","isRequired":true,"uniqueKey":"detail.items.[INDEX].loc","typeLabel":"(string | integer)[]"},"msg":{"type":"string","title":"Message","isRequired":true,"uniqueKey":"detail.items.[INDEX].msg","typeLabel":"string"},"type":{"type":"string","title":"Error Type","isRequired":true,"uniqueKey":"detail.items.[INDEX].type","typeLabel":"string"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError","uniqueKey":"detail.items.[INDEX]","typeLabel":"ValidationError · object"},"type":"array","title":"Detail","uniqueKey":"detail","typeLabel":"ValidationError · object[]"}},"type":"object","title":"HTTPValidationError","uniqueKey":"","typeLabel":"HTTPValidationError · object"},"examples":{"Example":{"title":"Example","value":{"detail":[{"loc":["\u003cstring>"],"msg":"\u003cstring>","type":"\u003cstring>"}]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"bb444628-4fb1-4a94-851f-a263e6f24212":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"rk_live_\u003c8hex>\u003c64hex>","scopes":[]}}},"servers":{"3029d8cd-4e5a-4715-849a-211bc3098e1d":{"url":"https://api.punchrescue.com/api/public/v1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"rk_live_\u003c8hex>\u003c64hex>","scopes":[]},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json"},"subdomain":"punchrescue","siteName":"Punch Rescue Developer portal","title":"Post a message to an emergency's conversation - Punch Rescue Developer portal","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-29T10:39:44.803Z","originalFileLocation":"api-reference/emergencies/post-a-message-to-an-emergencys-conversation.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=\"Required permission: write. Accepts optional attachments. Each item carries its value under src (or the accepted aliases content / url / data) and, optionally, type and caption. A bare string, or a single item outside a list, is accepted too. src takes one of two forms: Inline bytes — a data: URI or bare base64. Decoded, verified against their own magic bytes, and written to S3 before the message row, so a storage failure never leaves a message with a broken image in the chat. A declared type is ignored here: the bytes decide. A link — an https:// URL. Stored as given and never fetched: the operator\u0026#x27;s browser loads it directly, so Rescue neither hosts nor guarantees it, and a URL that expires will stop rendering. type is the only type signal a link has; without it the type is guessed from the file extension and otherwise falls back to a plain link. Only https, a public host and the default port are accepted. Rejections carry a stable code in detail.error (see AttachmentRejectReason). Retries of a message whose attachments are all inline bytes are safe: an identical payload re-posted inside the dedupe window returns the original message instead of creating a second one. Text-only messages are not deduplicated — repeated posts each create a message, as they always have. Neither are messages carrying a link: a link is identified by its URL, and the media behind a URL can change, so collapsing a re-post would hide a new frame rather than a duplicate. Retry a link post only if you want a second message. The conversation is created on demand, so a message posted immediately after the emergency is declared is accepted rather than rejected with a retry.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Punch Rescue Developer portal\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"noindex\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/punchrescue/bA-DwKcrINUS2Jp_/_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/punchrescue/bA-DwKcrINUS2Jp_/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/punchrescue/bA-DwKcrINUS2Jp_/_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/punchrescue/bA-DwKcrINUS2Jp_/_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/punchrescue/bA-DwKcrINUS2Jp_/_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/punchrescue/bA-DwKcrINUS2Jp_/_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/punchrescue/bA-DwKcrINUS2Jp_/_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/punchrescue/bA-DwKcrINUS2Jp_/_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/punchrescue/bA-DwKcrINUS2Jp_/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Post a message to an emergency\u0026#x27;s conversation - Punch Rescue Developer portal\">\u003cmeta data-mint-head property=\"og:description\" content=\"Required permission: write. Accepts optional attachments. Each item carries its value under src (or the accepted aliases content / url / data) and, optionally, type and caption. A bare string, or a single item outside a list, is accepted too. src takes one of two forms: Inline bytes — a data: URI or bare base64. Decoded, verified against their own magic bytes, and written to S3 before the message row, so a storage failure never leaves a message with a broken image in the chat. A declared type is ignored here: the bytes decide. A link — an https:// URL. Stored as given and never fetched: the operator\u0026#x27;s browser loads it directly, so Rescue neither hosts nor guarantees it, and a URL that expires will stop rendering. type is the only type signal a link has; without it the type is guessed from the file extension and otherwise falls back to a plain link. Only https, a public host and the default port are accepted. Rejections carry a stable code in detail.error (see AttachmentRejectReason). Retries of a message whose attachments are all inline bytes are safe: an identical payload re-posted inside the dedupe window returns the original message instead of creating a second one. Text-only messages are not deduplicated — repeated posts each create a message, as they always have. Neither are messages carrying a link: a link is identified by its URL, and the media behind a URL can change, so collapsing a re-post would hide a new frame rather than a duplicate. Retry a link post only if you want a second message. The conversation is created on demand, so a message posted immediately after the emergency is declared is accepted rather than rejected with a retry.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Punch Rescue Developer portal\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.punchrescue.com/api-reference/emergencies/post-a-message-to-an-emergencys-conversation\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://punchrescue.mintlify.site/_mintlify/api/og/v2?division=Emergencies\u0026amp;title=Post+a+message+to+an+emergency%27s+conversation\u0026amp;description=**Required+permission%3A**+%60write%60.%0A%0AAccepts+optional+%60attachments%60.+Each+item+carries+its+value+under+%60src%60+%28or+the%0Aaccepted+aliases+%60content%60+%2F+%60url%60+%2F+%60data%60%29+\u0026amp;theme=bae8430faf2095d1c4817761\u0026amp;signature=52a146e23415c138a6da46f19cabc25adf8dbe95a39608a66d74dd34377668fd\">\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=\"Post a message to an emergency\u0026#x27;s conversation - Punch Rescue Developer portal\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Required permission: write. Accepts optional attachments. Each item carries its value under src (or the accepted aliases content / url / data) and, optionally, type and caption. A bare string, or a single item outside a list, is accepted too. src takes one of two forms: Inline bytes — a data: URI or bare base64. Decoded, verified against their own magic bytes, and written to S3 before the message row, so a storage failure never leaves a message with a broken image in the chat. A declared type is ignored here: the bytes decide. A link — an https:// URL. Stored as given and never fetched: the operator\u0026#x27;s browser loads it directly, so Rescue neither hosts nor guarantees it, and a URL that expires will stop rendering. type is the only type signal a link has; without it the type is guessed from the file extension and otherwise falls back to a plain link. Only https, a public host and the default port are accepted. Rejections carry a stable code in detail.error (see AttachmentRejectReason). Retries of a message whose attachments are all inline bytes are safe: an identical payload re-posted inside the dedupe window returns the original message instead of creating a second one. Text-only messages are not deduplicated — repeated posts each create a message, as they always have. Neither are messages carrying a link: a link is identified by its URL, and the media behind a URL can change, so collapsing a re-post would hide a new frame rather than a duplicate. Retry a link post only if you want a second message. The conversation is created on demand, so a message posted immediately after the emergency is declared is accepted rather than rejected with a retry.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://punchrescue.mintlify.site/_mintlify/api/og/v2?division=Emergencies\u0026amp;title=Post+a+message+to+an+emergency%27s+conversation\u0026amp;description=**Required+permission%3A**+%60write%60.%0A%0AAccepts+optional+%60attachments%60.+Each+item+carries+its+value+under+%60src%60+%28or+the%0Aaccepted+aliases+%60content%60+%2F+%60url%60+%2F+%60data%60%29+\u0026amp;theme=bae8430faf2095d1c4817761\u0026amp;signature=52a146e23415c138a6da46f19cabc25adf8dbe95a39608a66d74dd34377668fd\">\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/punchrescue/bA-DwKcrINUS2Jp_/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Punch Rescue Developer portal\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#E1051E\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.punchrescue.com/api-reference/emergencies/post-a-message-to-an-emergencys-conversation\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/emergencies/post-a-message-to-an-emergencys-conversation.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.punchrescue.com/#organization\",\"name\":\"Punch Rescue Developer portal\",\"url\":\"https://docs.punchrescue.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/punchrescue/O2-yITAI4Lh3gsko/images/svgviewer-output.svg?fit=max\u0026auto=format\u0026n=O2-yITAI4Lh3gsko\u0026q=85\u0026s=0450206ce5ace91d28653dc827183bc4\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.punchrescue.com#website\",\"name\":\"Punch Rescue Developer portal\",\"url\":\"https://docs.punchrescue.com\",\"publisher\":{\"@id\":\"https://docs.punchrescue.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.punchrescue.com/api-reference/emergencies/post-a-message-to-an-emergencys-conversation#webpage\",\"url\":\"https://docs.punchrescue.com/api-reference/emergencies/post-a-message-to-an-emergencys-conversation\",\"name\":\"Post a message to an emergency's conversation\",\"description\":\"Required permission: write. Accepts optional attachments. Each item carries its value under src (or the accepted aliases content / url / data) and, optionally, type and caption. A bare string, or a single item outside a list, is accepted too. src takes one of two forms: Inline bytes — a data: URI or bare base64. Decoded, verified against their own magic bytes, and written to S3 before the message row, so a storage failure never leaves a message with a broken image in the chat. A declared type is ignored here: the bytes decide. A link — an https:// URL. Stored as given and never fetched: the operator's browser loads it directly, so Rescue neither hosts nor guarantees it, and a URL that expires will stop rendering. type is the only type signal a link has; without it the type is guessed from the file extension and otherwise falls back to a plain link. Only https, a public host and the default port are accepted. Rejections carry a stable code in detail.error (see AttachmentRejectReason). Retries of a message whose attachments are all inline bytes are safe: an identical payload re-posted inside the dedupe window returns the original message instead of creating a second one. Text-only messages are not deduplicated — repeated posts each create a message, as they always have. Neither are messages carrying a link: a link is identified by its URL, and the media behind a URL can change, so collapsing a re-post would hide a new frame rather than a duplicate. Retry a link post only if you want a second message. The conversation is created on demand, so a message posted immediately after the emergency is declared is accepted rather than rejected with a retry.\",\"dateModified\":\"2026-09-29T10:39:44.803Z\",\"isPartOf\":{\"@id\":\"https://docs.punchrescue.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.punchrescue.com/api-reference/emergencies/post-a-message-to-an-emergencys-conversation#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.punchrescue.com/api-reference/emergencies/post-a-message-to-an-emergencys-conversation#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.punchrescue.com/api-reference/categories/list-emergency-categories\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Emergencies\",\"item\":\"https://docs.punchrescue.com/api-reference/emergencies/list-emergencies\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Post a message to an emergency's conversation\",\"item\":\"https://docs.punchrescue.com/api-reference/emergencies/post-a-message-to-an-emergencys-conversation\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.punchrescue.com/api-reference/emergencies/post-a-message-to-an-emergencys-conversation#apireference\",\"headline\":\"Post a message to an emergency's conversation\",\"name\":\"Post a message to an emergency's conversation\",\"description\":\"Required permission: write. Accepts optional attachments. Each item carries its value under src (or the accepted aliases content / url / data) and, optionally, type and caption. A bare string, or a single item outside a list, is accepted too. src takes one of two forms: Inline bytes — a data: URI or bare base64. Decoded, verified against their own magic bytes, and written to S3 before the message row, so a storage failure never leaves a message with a broken image in the chat. A declared type is ignored here: the bytes decide. A link — an https:// URL. Stored as given and never fetched: the operator's browser loads it directly, so Rescue neither hosts nor guarantees it, and a URL that expires will stop rendering. type is the only type signal a link has; without it the type is guessed from the file extension and otherwise falls back to a plain link. Only https, a public host and the default port are accepted. Rejections carry a stable code in detail.error (see AttachmentRejectReason). Retries of a message whose attachments are all inline bytes are safe: an identical payload re-posted inside the dedupe window returns the original message instead of creating a second one. Text-only messages are not deduplicated — repeated posts each create a message, as they always have. Neither are messages carrying a link: a link is identified by its URL, and the media behind a URL can change, so collapsing a re-post would hide a new frame rather than a duplicate. Retry a link post only if you want a second message. The conversation is created on demand, so a message posted immediately after the emergency is declared is accepted rather than rejected with a retry.\",\"url\":\"https://docs.punchrescue.com/api-reference/emergencies/post-a-message-to-an-emergencys-conversation\",\"mainEntityOfPage\":{\"@id\":\"https://docs.punchrescue.com/api-reference/emergencies/post-a-message-to-an-emergencys-conversation#webpage\"},\"dateModified\":\"2026-09-29T10:39:44.803Z\",\"publisher\":{\"@id\":\"https://docs.punchrescue.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.punchrescue.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Punch Rescue Developer portal\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Punch Rescue Developer portal","nav":{"global":null,"tabs":[{"tab":"Guides","hidden":true,"pages":[{"title":"Guides","href":""}]},{"tab":"API reference","groups":[{"group":"API documentation","pages":[{"title":"Introduction","href":"/api-reference/introduction"},{"title":"Webhooks","description":"Receive Punch Rescue events in real time — emergency and device lifecycle transitions delivered as HTTP callbacks with at-least-once delivery, retries, dedup, and stable per-entity ordering.","href":"/api-reference/webhooks"}]},{"group":"Endpoints","hidden":true,"pages":[{"group":"Categories","pages":[{"title":"List emergency categories","description":"**Required permission:** `read`.\n\nReturns the categories an emergency can be declared under for this org.\nUse the resulting `categoryId` (or `name`) in `POST /orgs/{orgId}/emergencies`.\nLives under `/emergencies/` for agent discoverability — answers\n\"what kinds of emergencies can I declare?\" without backing up the tree.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/emergencies/categories","href":"/api-reference/categories/list-emergency-categories"}]},{"group":"Onboarding","pages":[{"title":"Get onboarding progress","description":"**Required permission:** `read`.\n\nReturns this org's onboarding-checklist progress: overall `percent`,\n`completed`/`total` counts, and per-step completion grouped with human labels\n(`groups[].steps[]`, each carrying `key`, `label`, `done`, and the entitlement\n`requires` gate). Only steps applicable to the org are listed — the same view\nthe in-app \"Get started\" panel and the `get_onboarding_progress` MCP tool return.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/onboarding","href":"/api-reference/onboarding/get-onboarding-progress"},{"title":"Get partner onboarding progress","description":"**Required permission:** `read`. **Key scope:** the partner's own key (not narrowed\nto specific orgs) or a global key.\n\nReturns the partner's own onboarding-checklist progress, same shape as\n`GET /orgs/{orgId}/onboarding`: overall `percent`, `completed`/`total`, and\nper-step completion grouped with labels. The same view the partner portal's\n\"Get started\" panel and the `get_partner_onboarding_progress` MCP tool return.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /partners/{partner_id}/onboarding","href":"/api-reference/onboarding/get-partner-onboarding-progress"}]},{"group":"Emergencies","pages":[{"title":"List emergencies","description":"**Required permission:** `read`.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/emergencies","href":"/api-reference/emergencies/list-emergencies"},{"title":"Declare an emergency","description":"**Required permission:** `write`.\n\nForwarded to the shared EmergencyDeclarationUsecase so Notify and v1 share\na single implementation. Idempotency-Key handling is on the roadmap — for\nnow, retries on a transient failure may create duplicate emergencies.\nPartners that want dedup today can supply `externalId` (unique per org).","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json post /orgs/{org_id}/emergencies","href":"/api-reference/emergencies/declare-an-emergency"},{"title":"Get an emergency","description":"**Required permission:** `read`.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/emergencies/{emergency_id}","href":"/api-reference/emergencies/get-an-emergency"},{"title":"Update an emergency","description":"**Required permission:** `write`. Recategorize an emergency — resolution\nlives at `POST .../resolutions`. Resolved emergencies are immutable.\n\nOnly `categoryId`/`categoryName` are persisted today. Sending\n`description`, `metadata`, or `occurredAt` returns 422 (not yet supported);\nthose fields will be honored once storage is added to AlertDBModel.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json patch /orgs/{org_id}/emergencies/{emergency_id}","href":"/api-reference/emergencies/update-an-emergency"},{"title":"Post a message to an emergency's conversation","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json post /orgs/{org_id}/emergencies/{emergency_id}/messages","href":"/api-reference/emergencies/post-a-message-to-an-emergencys-conversation"},{"title":"Resolve an emergency","description":"**Required permission:** `write`. Creates the resolution sub-resource.\n\nA second call on an already-resolved emergency returns 409. Idempotency-Key\nsupport is on the roadmap — until then partners should treat a 5xx as\n\"unknown outcome\" and check `GET /emergencies/{id}` before retrying.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json post /orgs/{org_id}/emergencies/{emergency_id}/resolutions","href":"/api-reference/emergencies/resolve-an-emergency"}]},{"group":"Devices","pages":[{"title":"List devices","description":"**Required permission:** `read`.\n\nLists devices for this org. Pass `deviceType` to filter to one type, or omit\nit to list every type combined. `status` filters on the effective\nonline/offline state derived from the last heartbeat.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/devices","href":"/api-reference/devices/list-devices"},{"title":"Org device status snapshot","description":"**Required permission:** `read`.\n\nReturns a current per-org device snapshot: totals and online counts by\ndevice type, plus low-battery and last-checkin rollups across all types.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/devices/status","href":"/api-reference/devices/org-device-status-snapshot"}]},{"group":"Users","pages":[{"title":"List organization users","description":"**Required permission:** `read`.\n\nLists the users belonging to this org. `role` mirrors the Admin Portal's\n\"Role\" column (`responder | user | visitor`, from the user's response level);\n`accessLevel` is the separate admin tier. `ownedDevice*` are per-org.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/users","href":"/api-reference/users/list-organization-users"}]}]},{"group":"Endpoints","expanded":true,"pages":[{"group":"Categories","pages":[{"title":"List emergency categories","description":"**Required permission:** `read`.\n\nReturns the categories an emergency can be declared under for this org.\nUse the resulting `categoryId` (or `name`) in `POST /orgs/{orgId}/emergencies`.\nLives under `/emergencies/` for agent discoverability — answers\n\"what kinds of emergencies can I declare?\" without backing up the tree.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/emergencies/categories","href":"/api-reference/categories/list-emergency-categories"}]},{"group":"Onboarding","pages":[{"title":"Get onboarding progress","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/onboarding","href":"/api-reference/onboarding/get-onboarding-progress"},{"title":"Get partner onboarding progress","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /partners/{partner_id}/onboarding","href":"/api-reference/onboarding/get-partner-onboarding-progress"}]},{"group":"Emergencies","pages":[{"title":"List emergencies","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/emergencies","href":"/api-reference/emergencies/list-emergencies"},{"title":"Declare an emergency","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json post /orgs/{org_id}/emergencies","href":"/api-reference/emergencies/declare-an-emergency"},{"title":"Get an emergency","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/emergencies/{emergency_id}","href":"/api-reference/emergencies/get-an-emergency"},{"title":"Update an emergency","description":"**Required permission:** `write`. Recategorize an emergency — resolution\nlives at `POST .../resolutions`. Resolved emergencies are immutable.\n\nOnly `categoryId`/`categoryName` are persisted today. Sending\n`description`, `metadata`, or `occurredAt` returns 422 (not yet supported);\nthose fields will be honored once storage is added to AlertDBModel.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json patch /orgs/{org_id}/emergencies/{emergency_id}","href":"/api-reference/emergencies/update-an-emergency"},{"title":"Post a message to an emergency's conversation","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json post /orgs/{org_id}/emergencies/{emergency_id}/messages","href":"/api-reference/emergencies/post-a-message-to-an-emergencys-conversation"},{"title":"Resolve an emergency","description":"**Required permission:** `write`. Creates the resolution sub-resource.\n\nA second call on an already-resolved emergency returns 409. Idempotency-Key\nsupport is on the roadmap — until then partners should treat a 5xx as\n\"unknown outcome\" and check `GET /emergencies/{id}` before retrying.","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json post /orgs/{org_id}/emergencies/{emergency_id}/resolutions","href":"/api-reference/emergencies/resolve-an-emergency"}]},{"group":"Devices","pages":[{"title":"List devices","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/devices","href":"/api-reference/devices/list-devices"},{"title":"Org device status snapshot","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/devices/status","href":"/api-reference/devices/org-device-status-snapshot"}]},{"group":"Users","pages":[{"title":"List organization users","deprecated":null,"version":null,"openapi":"https://api.rescue-serverless.dev.back2back.team/api/public/v1/openapi.json get /orgs/{org_id}/users","href":"/api-reference/users/list-organization-users"}]}]}]},{"tab":"MCP Server","pages":[{"title":"MCP Server","href":"/introduction"}]}]},"basePath":"","title":"Post a message to an emergency's conversation - Punch Rescue Developer portal","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-i2a3QZ8E.js","utils-ChLwp8m0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DRktVTDc.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CA2pEs4T.js","snippetPresets-ClQ6XrKD.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Ct_Lv36y.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Cn2PYw9e.js","shallow-rkyymjXQ.js","getApiPlaygroundDisplay-BB9vkXtE.js","CodeSnippet-Bm5RU7m1.js","CodeSnippets-BgU9Deuz.js","Page-BUDYNlhG.js","getPastedJson-BD-6NNum.js","icon-8Z6tud2e.js","MethodPill-Tuzr4g3V.js","DuplicateIcon-0ceWFYhN.js","createIcon-FBXow_ST.js","DynamicMarkdown-CD8713Yy.js","SectionHeading-7zgzQbH-.js","axios-vUo_bRtp.js","Markdown-D7Ofw1oz.js","clsx-eKJ4rcii.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CwjSCXIK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-9EK5IAXV.js"]}