Current receipt state. Sent is a client-only handoff state. Delivered means Relay accepted and stored the Message. Read means every recipient explicitly marked the Chat Read.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Relay","description":"Relay API v1 documentation.","colors":{"primary":"#006BE6","light":"#4DA3FF","dark":"#007EFF"},"logo":{"light":"https://mintcdn.com/relay-staging/fjL9_TNOlSXF6Cqt/logo/light.png?fit=max\u0026auto=format\u0026n=fjL9_TNOlSXF6Cqt\u0026q=85\u0026s=66c2d390ee2afe0b0d1d99bc84b1ca0d","dark":"https://mintcdn.com/relay-staging/YFXuCpEIcllu8dZZ/logo/dark.png?fit=max\u0026auto=format\u0026n=YFXuCpEIcllu8dZZ\u0026q=85\u0026s=7c2ce728bd59af19440a86a1e1235c16","href":"/"},"favicon":"https://mintcdn.com/relay-staging/ACSI-_boGHGW-2RY/favicon-staging.png?fit=max\u0026auto=format\u0026n=ACSI-_boGHGW-2RY\u0026q=85\u0026s=55869334cfb76b3c7e5ff51626edddb8","api":{"params":{"expanded":"closed"},"playground":{"display":"simple"},"examples":{"defaults":"required","languages":["curl"]}},"appearance":{"default":"system","strict":false},"navbar":{"links":[{"icon":"copy","href":"/integrations/agent-prompt#relay-agent-prompt","label":"Copy agent prompt"}],"primary":{"type":"button","label":"Console","href":"https://console.staging.relayapp.im"}},"footer":{"socials":{"website":"https://relayapp.im","github":"https://github.com/relaymessenger"}},"seo":{"metatags":{"og:image":"https://docs.staging.relayapp.im/images/og-image.png","twitter:image":"https://docs.staging.relayapp.im/images/og-image.png","twitter:card":"summary_large_image"}},"fonts":{"family":"Figtree"},"contextual":{"options":["copy","view"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"relay-staging","hasAudioNarration":false,"actualSubdomain":"relay-staging","customDomains":["docs.staging.relayapp.im"],"gitSource":{"type":"github","owner":"relaymessenger","repo":"relay-docs","deployBranch":"staging","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ad9bfcb9679105657d485cb","collectionId":"6736b8e2-1e01-4508-8c21-19c70f62684f","liveDeploymentHistoryId":"6ad9bfcb9679105657d485cb","schemaVersion":"v3"},"entitlements":{},"buildId":"6ad9bfcb9679105657d485cb","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Guides","count":102},{"language":"default","tag":"CLI","count":92},{"language":"default","tag":"API Reference","count":68},{"language":"default","tag":"Chats","count":54},{"language":"default","tag":"Agents","count":28},{"language":"default","tag":"Webhook Events","count":28},{"language":"default","tag":"Error Codes","count":23},{"language":"default","tag":"Calls","count":20},{"language":"default","tag":"2xxx — Resource errors","count":19},{"language":"default","tag":"Webhooks","count":18}]},"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":"editor-v7-file-tree","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":"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":"pause-universal-search-reconcile","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":"per-site-search-delta","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":"editor-private-page-search","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":"editor-nav-generations","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":"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":"byok-sep-25","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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","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":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"@keyframes buttons-browser-rise{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes selection-appear{0%{opacity:0}to{opacity:1}}@keyframes selection-rise{0%{transform:translateY(12px);opacity:0}to{transform:translateY(0);opacity:1}}:root{--relay-brand-blue:#0b75ff}html.dark img[src*=\"/images/brands/cline.svg\"],html.dark img[src*=\"/images/brands/elevenlabs.svg\"],html.dark img[src*=\"/images/brands/openai.svg\"],html.dark img[src*=\"/images/brands/opencode.svg\"],html.dark img[src*=\"/images/brands/pipecat.svg\"],html.dark img[src*=\"/images/brands/vercel.svg\"]{filter:invert(1)}html.dark img[src*=\"/images/brands/livekit.svg\"]{background:#fff;border-radius:3px}@media (min-width:600px){#navbar div.flex-1:has(>a>img.nav-logo){flex:0 0 auto!important}#navbar nav[aria-label=Main]{justify-content:flex-start!important}}#navbar div.absolute.w-full.h-full.border-b,#navbar>div.border-b{border-bottom-width:0}[data-component-part=scroll-area-scrollbar]{background-color:transparent}html{scrollbar-width:thin;scrollbar-color:#d4d4d4 transparent}html.dark{scrollbar-color:#525252 transparent}.hero-art{display:block}.hero-art>svg{display:block;width:100%;height:auto}.dark .hero-art-light,.hero-art-dark{display:none}.dark .hero-art-dark{display:block}.frame:has(>.relay-preview){padding:0;background:0 0;border:0;box-shadow:none;border-radius:12px}.frame:has(>.relay-preview)>.absolute.inset-0{display:none}.frame:has(>.relay-preview)>figcaption{margin-top:8px;padding:0 8px;color:rgb(var(--gray-500))}.dark .frame:has(>.relay-preview)>figcaption{color:rgb(var(--gray-400))}.relay-preview{position:relative;background:#fff;color:#000}.dark .relay-preview{background:#000;color:#fff}.relay-preview>*{width:100%;min-width:0}.relay-preview-reset{position:absolute;top:8px;right:8px;z-index:3;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;margin:0;padding:0;border:0;border-radius:8px;background:0 0;color:rgb(var(--gray-400));cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out}.relay-preview-reset:hover{color:rgb(var(--gray-600));background:rgb(var(--gray-100))}.dark .relay-preview-reset{color:rgb(var(--gray-500))}.dark .relay-preview-reset:hover{color:rgb(var(--gray-300));background:rgb(255 255 255/.1)}.relay-preview-reset:focus-visible{outline:2px solid currentColor;outline-offset:2px}.relay-preview-reset svg.icon{background-color:currentColor}.relay-preview-bar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px;padding:0 12px 16px}.relay-preview-seg{display:inline-flex;flex-wrap:wrap;justify-content:center;padding:2px;border-radius:9px;background:rgb(var(--gray-100))}.dark .relay-preview-seg{background:rgb(255 255 255/.08)}.relay-preview-seg button{margin:0;padding:3px 10px;border:0;border-radius:7px;background:0 0;color:rgb(var(--gray-500));font:inherit;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out}.relay-preview-seg button:hover{color:rgb(var(--gray-800))}.relay-preview-seg button[aria-pressed=true]{background:#fff;color:rgb(var(--gray-900));box-shadow:0 1px 2px rgb(0 0 0/.1),0 0 0 .5px rgb(0 0 0/.06)}.dark .relay-preview-hint,.dark .relay-preview-seg button{color:rgb(var(--gray-400))}.dark .relay-preview-seg button:hover{color:rgb(var(--gray-200))}.dark .relay-preview-seg button[aria-pressed=true]{background:rgb(255 255 255/.16);color:#fff;box-shadow:none}.relay-preview-seg button:focus-visible{outline:2px solid currentColor;outline-offset:1px}.relay-preview-hint{color:rgb(var(--gray-500));font-size:12px;line-height:18px}.buttons-preview-frame{position:relative;overflow:hidden}.buttons-preview-stage{display:flex;flex-direction:column;box-sizing:border-box;max-width:402px;margin:0 auto;padding:16px}.buttons-preview-message{display:flex;flex-direction:column;align-self:flex-start;gap:8px;width:260px;max-width:100%}.selection-preview .buttons-preview-message{align-self:stretch;width:auto}.buttons-preview-text{isolation:isolate;padding:10px 14px;border-radius:20px;background:#f1f3f5;color:#111827;font-size:17px;line-height:1.35;white-space:pre-wrap;overflow-wrap:anywhere}.dark .buttons-preview-text{background:#242b36;color:#f3f4f6}.buttons-preview-text.has-tail{position:relative;margin-bottom:7px}.buttons-preview-text-tail{position:absolute;left:0;top:calc(100% - 16px);z-index:-1;fill:#f1f3f5}.dark .buttons-preview-text-tail{fill:#242b36}.buttons-preview-stack{display:flex;flex-direction:column;align-self:flex-start;gap:4px;width:75%;max-width:75%}.buttons-preview-pill{box-sizing:border-box;display:flex;justify-content:space-between;align-items:center;gap:5px;width:100%;min-height:48px;padding:12px 16px 12px 20px;border-radius:24px;background:#eef5ff;color:#0b75ff;font-weight:600;font-size:17px;line-height:24px;font-family:-apple-system,BlinkMacSystemFont,\"SF Pro Text\",system-ui,sans-serif}.dark .buttons-preview-pill{background:#101e33;color:#6fb0ff}.buttons-preview-action{border:0;text-align:left;cursor:pointer;transition:background-color .2s ease-in-out,transform .15s ease-out}.buttons-preview-action:active{transform:scale(.97);opacity:1}.buttons-preview-action:focus-visible{outline:2px solid currentColor;outline-offset:3px}.buttons-reply{margin-top:8px;animation:selection-appear .2s ease-in-out}.buttons-reply svg{max-width:100%;height:auto}.buttons-preview-own,.buttons-reply{align-self:flex-end;max-width:100%}.buttons-preview-arrow{flex:none;width:1em;height:1em;font-size:.72em;line-height:1}.buttons-preview-tap path{fill:#0b75ff}.buttons-preview-tap text,.buttons-url-preview{font-family:-apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Inter\",system-ui,sans-serif}.buttons-preview-tap text{fill:#fff;font-size:17px}.buttons-preview.is-browser-open .buttons-preview-frame{min-height:440px}.buttons-url-preview{position:absolute;inset:0;display:flex;flex-direction:column;background:#fff;color:#111827;animation:buttons-browser-rise .28s ease-out}.dark .buttons-url-preview{background:#000;color:#f3f4f6}.buttons-browser-bar{flex:none;display:grid;grid-template-columns:44px 1fr 44px;align-items:center;gap:4px;padding:10px 8px;background:#f2f2f7;border-bottom:1px solid #e5e5ea}.dark .buttons-browser-bar{background:#1c1c1e;border-bottom-color:#2c2c2e}.buttons-url-close{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 auto;padding:0;border:0;border-radius:16px;background:#e3e3e8;color:#3c3c43;cursor:pointer;transition:transform .15s ease-out}.dark .buttons-url-close{background:#2c2c2e;color:#ebebf5}.buttons-url-close:active{transform:scale(.94)}.buttons-url-close:focus-visible{outline:2px solid #0b75ff;outline-offset:2px}.buttons-url-close svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}.buttons-browser-address{display:flex;align-items:center;justify-content:center;gap:5px;min-width:0;height:34px;padding:0 12px;border-radius:12px;background:#e3e3e8;font-size:14px;font-weight:500}.dark .buttons-browser-address{background:#2c2c2e}.buttons-browser-address span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.buttons-browser-address svg{flex:none;width:10px;height:12px;fill:none;stroke:currentColor;stroke-width:1.4}.buttons-browser-reload,.buttons-browser-toolbar svg{fill:none;stroke:#0b75ff;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}.buttons-browser-reload{justify-self:center;width:16px;height:16px}.buttons-browser-page{flex:1 1 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:24px;text-align:center}.buttons-url-caption{font-size:12px;color:#68717e}.dark .buttons-browser-note,.dark .buttons-url-caption{color:#a0a7b2}.buttons-url-address{font-size:15px;font-weight:600;overflow-wrap:anywhere}.buttons-browser-note{max-width:240px;font-size:13px;color:#68717e}.buttons-browser-toolbar{flex:none;display:flex;justify-content:space-around;padding:10px 8px 14px;background:#f2f2f7;border-top:1px solid #e5e5ea}.dark .buttons-browser-toolbar{background:#1c1c1e;border-top-color:#2c2c2e}.buttons-browser-toolbar svg{width:22px;height:22px}.buttons-browser-toolbar svg.is-disabled{stroke:#c7c7cc}.dark .buttons-browser-toolbar svg.is-disabled{stroke:#48484a}.selection-preview.is-sheet-open .buttons-preview-frame{min-height:400px}.selection-answer,.selection-prompt{display:block;align-self:flex-start;max-width:100%;margin:0;padding:0;border:0;background:0 0;cursor:pointer;transition:transform .15s ease-out}.selection-answer{align-self:flex-end;animation:selection-appear .2s ease-in-out}.selection-answer:active,.selection-prompt:active{transform:scale(.97);opacity:1}.selection-answer:focus-visible,.selection-prompt:focus-visible,.selection-send:focus-visible,.selection-sheet-grabber:focus-visible,.selection-sheet-option:focus-visible{outline:2px solid #0b75ff;outline-offset:3px}.dark .selection-answer:focus-visible,.dark .selection-prompt:focus-visible,.dark .selection-send:focus-visible,.dark .selection-sheet-grabber:focus-visible,.dark .selection-sheet-option:focus-visible{outline-color:#6fb0ff}.selection-card{display:block;max-width:100%;height:auto;font-family:-apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Inter\",system-ui,sans-serif}.selection-card-leading .selection-card-shape{fill:#f1f3f5}.dark .selection-card-leading .selection-card-shape{fill:#242b36}.selection-card-trailing .selection-card-shape{fill:#0b75ff}.selection-card-title{font-size:15px;font-weight:600}.selection-card-subtitle{font-size:13px}.selection-card-label{font-size:15px}.selection-card-leading .selection-card-label,.selection-card-leading .selection-card-title{fill:#111827}.selection-card-leading .selection-card-subtitle{fill:#68717e}.selection-card-leading .selection-card-mark{stroke:#111827}.selection-card-leading .selection-card-chevron{stroke:#68717e}.dark .selection-card-leading .selection-card-label,.dark .selection-card-leading .selection-card-title{fill:#f3f4f6}.dark .selection-card-leading .selection-card-subtitle{fill:#a0a7b2}.dark .selection-card-leading .selection-card-mark{stroke:#f3f4f6}.dark .selection-card-leading .selection-card-chevron{stroke:#a0a7b2}.selection-card-trailing .selection-card-label,.selection-card-trailing .selection-card-title{fill:#fff}.selection-card-trailing .selection-card-mark{stroke:#fff}.selection-card-trailing .selection-card-chevron{stroke:rgba(255,255,255,.75)}.selection-card-chevron,.selection-card-mark{fill:none;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}.selection-sheet-layer,.selection-sheet-scrim{position:absolute;inset:0}.selection-sheet-scrim{background:rgba(15,23,42,.38)}.selection-sheet{position:absolute;left:0;right:0;bottom:0;display:flex;flex-direction:column;max-height:100%;border-radius:16px 16px 11px 11px;background:#fff;color:#111827;font-family:-apple-system,BlinkMacSystemFont,\"SF Pro Text\",\"Inter\",system-ui,sans-serif;animation:selection-rise .22s ease-out}.dark .selection-sheet{background:#151a23;color:#f3f4f6}.selection-sheet-grabber{flex:none;align-self:center;width:56px;height:20px;margin:0;padding:0;border:0;background:0 0;cursor:pointer}.selection-sheet-grabber::before{content:\"\";display:block;width:36px;height:5px;margin:7px auto 0;border-radius:3px;background:#c7c7cc}.dark .selection-sheet-grabber::before{background:#48484a}.selection-sheet-title{flex:none;padding:12px 24px;font-size:22px;font-weight:700;line-height:1.2}.selection-sheet-list{flex:1 1 auto;min-height:0;max-height:260px;overflow-y:auto;padding-bottom:76px;-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 14px,#000 calc(100% - 56px),transparent 100%);mask-image:linear-gradient(to bottom,transparent 0,#000 14px,#000 calc(100% - 56px),transparent 100%)}.selection-sheet.is-read-only .selection-sheet-list{padding-bottom:26px;-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 14px);mask-image:linear-gradient(to bottom,transparent 0,#000 14px)}.selection-sheet-option{position:relative;box-sizing:border-box;display:flex;align-items:center;gap:12px;width:100%;margin:0;padding:14px 20px;border:0;background:0 0;color:inherit;font:inherit;font-size:16px;text-align:left;cursor:pointer}.selection-sheet-option+.selection-sheet-option::before{content:\"\";position:absolute;top:0;left:52px;right:0;height:1px;background:#e5e7eb}.dark .selection-sheet-option+.selection-sheet-option::before{background:#2b323d}.selection-sheet-option:disabled{cursor:default}.selection-sheet-label{overflow-wrap:anywhere;font-weight:600}.selection-box{flex:none;width:22px;height:22px}.selection-box circle{fill:transparent;stroke:#b9bec7;stroke-width:1.5;transition:fill .2s ease-in-out,stroke .2s ease-in-out}.dark .selection-box circle{stroke:#6b7280}.selection-box path{fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;opacity:0;transition:opacity .2s ease-in-out}.selection-sheet-option[aria-checked=true] .selection-box circle{fill:#0b75ff;stroke:#0b75ff}.selection-sheet-option[aria-checked=true] .selection-box path{opacity:1}.selection-sheet-footer{position:absolute;left:0;right:0;bottom:0;display:flex;justify-content:center;padding:0 0 16px;pointer-events:none}.selection-send{box-sizing:border-box;display:block;width:calc(50% + 16px);height:48px;margin:0;padding:0;border:0;border-radius:24px;background:#0b75ff;color:#fff;box-shadow:0 6px 18px rgba(15,23,42,.16),inset 0 1px 0 rgba(255,255,255,.35);pointer-events:auto;font-family:inherit;font-size:17px;font-weight:600;opacity:1;cursor:pointer;transition:background-color .2s ease-in-out,color .2s ease-in-out,transform .15s ease-out}.selection-send:active:not(:disabled){transform:scale(.96);opacity:1}.selection-send:disabled{background:#eceef1;color:rgba(60,60,67,.3);opacity:1;cursor:default}.dark .selection-send:disabled{background:#2c2c2e;color:rgba(235,235,245,.3)}.native-dialog,.native-preview{--app-blue:var(--relay-brand-blue);--app-incoming:#e9e9e9;--app-ink:#000;--app-secondary:rgba(60,60,67,.6);--app-group:#f2f2f7;--app-field:#fff;--app-line:rgba(60,60,67,.18);color:var(--app-ink);font:17px/1.3 -apple-system,BlinkMacSystemFont,\"SF Pro Text\",system-ui,sans-serif}.dark .native-dialog,.dark .native-preview{--app-blue:#007eff;--app-incoming:#2c2c2e;--app-ink:#fff;--app-secondary:rgba(235,235,245,.6);--app-group:#000;--app-field:#1c1c1e;--app-line:rgba(84,84,88,.65)}.native-dialog *,.native-preview *{box-sizing:border-box}.native-dialog button,.native-preview button{font:inherit;cursor:pointer}.native-dialog :focus-visible,.native-preview button:focus-visible{outline:2px solid var(--app-blue);outline-offset:3px}.native-preview{position:relative}.native-transcript{display:flex;flex-direction:column;gap:8px;max-width:402px;margin:0 auto;padding:16px;box-sizing:border-box}.native-text{align-self:flex-start;max-width:calc(100% - 94px);border-radius:20px;padding:10px 14px;background:var(--app-incoming);overflow-wrap:anywhere}.native-capsule{border:0;border-radius:999px;padding:8px 12px;min-height:40px;width:100%;background:color-mix(in srgb,var(--app-blue) 15%,transparent);color:var(--app-blue);font-weight:600!important;line-height:22px}.form-calendar-grid button[aria-pressed=true],.native-capsule.is-primary{background:var(--app-blue);color:#fff}.native-capsule:active{opacity:.7;transform:scale(.97)}.native-capsule:disabled{opacity:.35;cursor:default}.rich-shelf{display:flex;align-items:stretch;gap:8px;padding-bottom:7px}.rich-shelf.is-carousel{scroll-behavior:smooth;overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x mandatory;scrollbar-width:thin}.rich-balloon{position:relative;isolation:isolate;flex:0 0 min(350px,calc(100% - 94px));min-width:0;scroll-snap-align:start}.rich-balloon.is-small{flex-basis:min(180px,calc(100% - 94px))}.rich-card,.rich-media{background:var(--app-incoming)}.rich-card{display:flex;flex-direction:column;height:100%;overflow:hidden;border-radius:18px}.rich-media{display:block;flex-shrink:0;width:100%;padding:0;border:0}.rich-media:focus-visible{outline-offset:-3px}.rich-media img{display:block;width:100%;height:100%;object-fit:cover;margin:0;border-radius:0}.rich-copy{padding:16px 16px 0}.rich-media+.rich-copy{padding-top:12px}.rich-title{font-size:17px;font-weight:600;overflow-wrap:anywhere}.rich-description{margin-top:2px;color:var(--app-secondary);overflow-wrap:anywhere}.rich-suggestions{display:flex;flex-direction:column;gap:8px;padding:12px 16px 16px;margin-top:auto}.native-tail{position:absolute;left:0;bottom:-7px;width:23px;height:24px;fill:var(--app-incoming);z-index:-1}.rich-followups{display:flex;flex-direction:column;gap:4px;width:calc((100% - 94px)*.75)}.rich-followups .native-capsule{min-height:48px;text-align:left;padding:12px 16px 12px 20px}.rich-scroll-controls{display:flex;justify-content:center;gap:12px}.rich-scroll-controls button{background:0 0;border:0;color:var(--app-blue);width:32px;height:28px;border-radius:8px;font-size:24px}.native-replies{display:flex;flex-direction:column;gap:8px}.native-replies:empty{display:none}.native-preview .buttons-preview-tap path,.native-preview .selection-card-trailing .selection-card-shape{fill:var(--app-blue)}.native-preview .selection-card-leading .selection-card-shape{fill:var(--app-incoming)}.native-preview .selection-card-leading .selection-card-title{fill:var(--app-ink)}.native-preview .selection-card-leading .selection-card-subtitle{fill:var(--app-secondary)}.native-preview .selection-card-leading .selection-card-chevron{stroke:var(--app-secondary)}.form-preview .selection-card-leading .selection-card-subtitle{fill:rgba(60,60,67,.72)}.dark .form-preview .selection-card-leading .selection-card-subtitle{fill:rgba(235,235,245,.7)}.form-preview .selection-card-trailing .selection-card-subtitle{fill:rgba(255,255,255,.8)}.dark .form-preview .selection-card-trailing .selection-card-subtitle{fill:rgba(255,255,255,.6)}.rich-followups .native-capsule{background:#eef5ff;color:#0b75ff}.dark .rich-followups .native-capsule{background:#101e33;color:#6fb0ff}.native-form-answer,.native-form-prompt{display:block;width:fit-content;max-width:100%;background:0 0;border:0;padding:0}.native-form-prompt{align-self:flex-start}.native-form-answer{align-self:flex-end}.native-form-answer svg,.native-form-prompt svg{display:block;max-width:100%;height:auto}.native-response{padding:8px 16px;font-size:13px}.native-response summary{cursor:pointer;color:var(--app-secondary)}.native-response pre{font-size:12px;white-space:pre-wrap;overflow-wrap:anywhere;max-height:220px;overflow:auto}.native-dialog{width:min(402px,calc(100vw - 24px));max-height:min(680px,90dvh);padding:0;border:0;border-radius:28px;background:var(--app-field);margin:auto;box-shadow:0 20px 80px #0003}.native-dialog::backdrop{background:#0006}.native-dialog[open]{display:flex;flex-direction:column}.native-sheet-bar{flex-shrink:0;display:grid;grid-template-columns:1fr 32px;align-items:center;gap:8px;padding:12px 16px;font-size:17px}.native-sheet-bar button{width:32px;height:32px;padding:0;border:0;border-radius:50%;background:var(--app-incoming);color:var(--app-ink);font-size:24px;line-height:1}.native-sheet-bar .native-back{color:var(--app-blue);background:0 0;font-size:32px}.rich-photo{width:100%;min-height:0;object-fit:contain;margin:0}.rich-url{padding:24px;overflow-wrap:anywhere}.native-form-content h3,.rich-url p{color:var(--app-secondary);font-size:15px}.native-form-sheet{background:var(--app-group);height:min(620px,90dvh)}.native-form-sheet .native-sheet-bar{grid-template-columns:32px 1fr 32px;text-align:center}.native-grabber{flex-shrink:0;width:36px;height:5px;border-radius:3px;background:var(--app-line);margin:8px auto 0}.native-form-content{overflow-y:auto;flex:1;min-height:0;padding:8px 20px 20px}.native-form-content section{margin:16px 0 24px}.native-form-content h3{display:flex;justify-content:space-between;gap:8px;margin:0 16px 7px;font-size:13px;font-weight:400;text-transform:uppercase}.native-form-content h3 span:last-child:not(:first-child){text-transform:none}.native-field-group{background:var(--app-field);border-radius:12px;overflow:hidden}.native-field-group input,.native-field-group textarea{display:block;width:100%;border:0;border-radius:0;padding:12px 16px;margin:0;background:0 0;color:var(--app-ink);font:inherit;resize:vertical}.native-field-group input::placeholder,.native-field-group textarea::placeholder{color:var(--app-secondary)}.native-field-group:focus-within{outline:2px solid var(--app-blue);outline-offset:2px}.native-field-group :focus-visible{outline-offset:-3px}.form-choice,.form-date,.form-picker{display:flex;width:100%;min-height:44px;gap:8px;align-items:center;justify-content:space-between;border:0;padding:10px 16px;background:0 0;color:var(--app-ink);text-align:left}.form-choice+.form-choice{border-top:.5px solid var(--app-line)}.form-check{color:var(--app-blue);font-weight:600}.form-switch{display:flex;align-items:center;width:51px;height:31px;flex-shrink:0;border-radius:16px;padding:2px;background:var(--app-line)}.form-switch>span{display:block;width:27px;height:27px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #0003}.form-switch.is-on{background:var(--app-blue);justify-content:flex-end}.form-picker select{max-width:60%;min-width:64px;border:0;color:var(--app-blue);background:0 0;font:inherit}.form-date>span:last-child{padding:6px 11px;border-radius:999px;background:var(--app-incoming);color:var(--app-blue)}.form-calendar{padding:12px 16px}.form-calendar-heading{display:flex;align-items:center;gap:12px}.form-calendar-heading strong{flex:1;font-size:17px}.form-calendar-heading button{background:0 0;color:var(--app-blue);border:0;font-size:28px}.form-calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;text-align:center;margin-top:12px}.form-calendar-grid>span{font-size:12px;color:var(--app-secondary)}.form-calendar-grid button{aspect-ratio:1;padding:0;border:0;border-radius:50%;color:var(--app-ink);background:0 0}.form-calendar button:disabled{opacity:.25;cursor:default}.form-clear-date{display:block;border:0;background:0 0;color:#ff3b30;padding:10px 16px}.form-answer-row{white-space:pre-wrap;overflow-wrap:anywhere}.form-answer-row+.form-answer-row{border-top:.5px solid var(--app-line)}.form-answer-row>span{display:block;font-size:15px;color:var(--app-secondary);margin-bottom:5px}.form-answer-row,.form-intro{padding:12px 16px}.form-hint{color:var(--app-secondary);font-size:13px;padding:0 16px}.native-form-bottom{display:flex;justify-content:center;padding:12px 16px 16px;flex-shrink:0}.native-form-bottom .native-capsule{min-height:50px;width:calc(50% + 32px);max-width:100%}[data-component-part=card-icon]:has(img[src*=\"/images/brands/\"]){flex-shrink:0}@media (prefers-reduced-motion:reduce){.buttons-preview *,.buttons-preview ::before{transition:none!important;animation:none!important}.buttons-preview-action:active,.selection-answer:active,.selection-prompt:active,.selection-send:active:not(:disabled){transform:none}.rich-shelf.is-carousel{scroll-behavior:auto}.native-capsule:active{transform:none!important}}.a2-balloon{align-self:flex-start;width:min(350px,calc(100% - 40px))}.a2-card{padding:16px;background:var(--app-incoming);overflow:hidden}.a2-col,.a2-row{display:flex;flex-direction:column;gap:8px}.a2-row{flex-direction:row}.a2-text{line-height:1.25;overflow-wrap:anywhere}.a2-badge,.a2-text.is-caption{font-size:13px;color:var(--app-secondary)}.a2-badge{display:inline-block;padding:4px 10px;border-radius:999px;font-weight:700;background:color-mix(in srgb,var(--app-blue) 15%,transparent);color:var(--app-blue);white-space:nowrap}.a2-divider{border:0;border-top:1px solid var(--app-line);margin:4px 0}.native-preview .a2-button{border:0;border-radius:999px;min-height:44px;width:100%;padding:10px 16px;background:var(--app-blue);color:#fff;font-weight:600;font-size:17px}.native-preview .a2-button.is-borderless{background:0 0;color:var(--app-blue)}.a2-slider{display:flex;flex-direction:column;gap:6px}.a2-slider-head{display:flex;justify-content:space-between;color:var(--app-secondary);font-size:15px}.a2-slider input{-webkit-appearance:none;appearance:none;width:100%;height:4px;border-radius:2px;margin:10px 0;background:linear-gradient(to right,var(--app-blue) var(--a2-fill),var(--app-line) var(--a2-fill))}.a2-slider input::-webkit-slider-thumb{-webkit-appearance:none;width:36px;height:24px;border-radius:12px;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,.25)}.a2-slider input::-moz-range-thumb{width:36px;height:24px;border-radius:12px;border:0;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,.25)}.native-preview .a2-check,.native-preview .a2-choice{display:flex;align-items:center;gap:10px;border:0;background:0 0;color:inherit;padding:4px 0;text-align:left;font-size:17px}.a2-box{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:6px;border:2px solid var(--app-secondary);color:#fff;font-size:14px;font-weight:700}.a2-check.is-on .a2-box{background:var(--app-blue);border-color:var(--app-blue)}.a2-check.is-on span:last-child{text-decoration:line-through;color:var(--app-secondary)}.a2-choices{display:flex;flex-direction:column;gap:2px}.a2-dot{width:22px;height:22px;border-radius:50%;border:2px solid var(--app-secondary);flex-shrink:0}.a2-choice.is-on .a2-dot{border:7px solid var(--app-blue)}.a2-chart{display:flex;align-items:flex-end;gap:12px;height:160px;padding-top:8px}.a2-bar-slot{flex:1;height:100%;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:4px;font-size:12px;color:var(--app-secondary)}.a2-bar{width:100%;background:var(--app-blue);border-radius:4px 4px 0 0;min-height:2px}.a2-map{position:relative;height:180px;border-radius:12px;background:#dfe9d8;overflow:hidden}.dark .a2-map{background:#26322b}.native-preview .a2-pin{position:absolute;width:18px;height:18px;margin:-9px 0 0 -9px;border-radius:50%;border:3px solid #fff;background:#ff3b30;padding:0;box-shadow:0 1px 3px rgba(0,0,0,.3)}.native-preview .a2-pin.is-on{transform:scale(1.3)}.a2-pin-detail{display:flex;flex-direction:column;margin-top:8px;font-size:15px}.a2-pin-detail span{color:var(--app-secondary)}.a2-countdown{font-size:34px;font-weight:600;font-variant-numeric:tabular-nums}.a2-image{height:140px;border-radius:12px;background:var(--app-line)}.a2-row>.a2-text{flex:1 1 auto;overflow-wrap:break-word}.a2-row>.a2-badge{flex:0 0 auto}"}],"page":{"pagePath":"api-reference/messages/get-a-message-by-id","slug":"/api-reference/messages/get-a-message-by-id","pageMetadata":{"title":"Get a message by ID","description":"Retrieve one visible Message.","deprecated":null,"version":null,"sidebarTitle":"Retrieve","openapi":"/api-reference/openapi.mint.yaml get /v1/messages/{messageId}","href":"/api-reference/messages/get-a-message-by-id","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Retrieve one visible Message.\"\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":"Get a message by ID","description":"Retrieve one visible Message.","deprecated":null,"version":null,"sidebarTitle":"Retrieve","openapi":"/api-reference/openapi.mint.yaml get /v1/messages/{messageId}","href":"/api-reference/messages/get-a-message-by-id","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/relay-staging/603be6d9fda39113/agent-prompt.js","/_mintlify/custom/relay-staging/e136a31f650b5647/posthog.js"],"openApiReferenceData":{"operation":{"operationId":"getMessage","x-mint":{"metadata":{"sidebarTitle":"Retrieve"},"href":"/api-reference/messages/get-a-message-by-id"},"summary":"Get a message by ID","description":"Retrieve one visible Message.","tags":["Messages"],"security":["85710b44-5150-40fa-90b9-a2c72bc751e7"],"parameters":["bfc2dc93-7c5b-4408-be02-585389f608fa"],"responses":{"200":"b1b1b66c-15dd-46bc-8293-c19a7ba0e7f7","401":"3ca49c41-1cd0-44e9-ad21-df033777787f","403":"b5420181-9f83-4334-9b5c-434d8c8cf281","404":"3ed4675c-0f3e-4353-a1e9-d5c6fc6a9142","500":"0829f670-a2b1-4662-9e4c-daf0e8a5d520"},"method":"get","type":"path","servers":["5fe554b7-ad2b-4bee-af8d-aab2bdda93ef"],"path":"/v1/messages/{messageId}","baseUrlOptions":["https://api.staging.relayapp.im"],"title":"Get a message by ID","codeSamples":[],"requestExampleLanguages":["bash"],"requiredOnlyExamples":true,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"bfc2dc93-7c5b-4408-be02-585389f608fa":{"name":"messageId","in":"path","required":true,"description":"Unique identifier of the message to retrieve","schema":{"type":"string","format":"uuid","isRequired":true,"description":"Unique identifier of the message to retrieve","uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"responses":{"b1b1b66c-15dd-46bc-8293-c19a7ba0e7f7":{"description":"Message found and returned successfully","content":{"application/json":{"schema":{"type":"object","required":["id","chat_id","is_from_me","delivery_status","created_at","updated_at","is_system_message"],"properties":{"id":{"type":"string","description":"Unique identifier for the message","format":"uuid","isRequired":true,"uniqueKey":"id","typeLabel":"string\u003cuuid>"},"chat_id":{"type":"string","description":"ID of the chat this message belongs to","format":"uuid","isRequired":true,"uniqueKey":"chat_id","typeLabel":"string\u003cuuid>"},"is_from_me":{"type":"boolean","description":"Whether this message was sent by the authenticated user","isRequired":true,"uniqueKey":"is_from_me","typeLabel":"boolean"},"delivery_status":{"type":"string","description":"Current receipt state. Sent is a client-only handoff state. Delivered means Relay accepted and stored the Message. Read means every recipient explicitly marked the Chat Read.","enum":["sent","delivered","read"],"isRequired":true,"uniqueKey":"delivery_status","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","description":"When the message was created","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","description":"When the message was last updated","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"},"is_system_message":{"type":"boolean","description":"Whether this timeline item is a visible Chat event.","isRequired":true,"uniqueKey":"is_system_message","typeLabel":"boolean"},"from":{"oneOf":[{"deprecated":true,"type":"string","description":"Use from_handle instead.","uniqueKey":"from.oneOf.0","typeLabel":"string"},{"deprecated":true,"type":"null","description":"Use from_handle instead.","uniqueKey":"from.oneOf.1","typeLabel":"null"}],"uniqueKey":"from","typeLabel":"string | null"},"from_handle":{"oneOf":[{"type":"object","description":"The sender of this message as a full handle object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"from_handle.oneOf.0.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"from_handle.oneOf.0.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"from_handle.oneOf.0.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"from_handle.oneOf.0.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"from_handle.oneOf.0.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"from_handle.oneOf.0.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"from_handle.oneOf.0.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"from_handle.oneOf.0.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"from_handle.oneOf.0.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"from_handle.oneOf.0.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"from_handle.oneOf.0.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"from_handle.oneOf.0.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"from_handle.oneOf.0.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"from_handle.oneOf.0.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"from_handle.oneOf.0.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"from_handle.oneOf.0.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"from_handle.oneOf.0.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"from_handle.oneOf.0.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"from_handle.oneOf.0.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"from_handle.oneOf.0.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"from_handle.oneOf.0.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"from_handle.oneOf.0.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"from_handle.oneOf.0.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"from_handle.oneOf.0.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"from_handle.oneOf.0.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"from_handle.oneOf.0.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle.oneOf.0.activity","typeLabel":"object | null"}},"uniqueKey":"from_handle.oneOf.0","typeLabel":"object"},{"type":"null","description":"The sender of this message as a full handle object","uniqueKey":"from_handle.oneOf.1","typeLabel":"null"}],"uniqueKey":"from_handle","typeLabel":"object | null"},"parts":{"oneOf":[{"type":"array","description":"Message parts in order (text, media, and link)","items":{"oneOf":[{"type":"object","description":"A text message part","required":["type","value","reactions"],"properties":{"type":{"type":"string","enum":["text"],"description":"Indicates this is a text message part","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"The text content","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.value","typeLabel":"string"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.reactions","typeLabel":"object[] | null"},"mentions":{"oneOf":[{"type":"array","description":"Mentions ordered by position in the text; null when none. Handles reflect the participant's current handle.","items":{"type":"object","required":["id","handle","is_me","range"],"properties":{"id":{"type":"string","format":"uuid","description":"Stable participant Contact ID, unchanged when the handle changes.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mentions.oneOf.0.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"The target participant's current Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mentions.oneOf.0.items.[INDEX].handle","typeLabel":"string"},"is_me":{"type":"boolean","description":"Whether the mention addresses the recipient reading this message.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mentions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"range":{"type":"array","items":{"type":"integer","minimum":0,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mentions.oneOf.0.items.[INDEX].range.items.[INDEX]","typeLabel":"integer"},"minItems":2,"maxItems":2,"description":"Inclusive-exclusive [start, end) UTF-16 code-unit range in value; the whole value when the send omitted mention_range.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mentions.oneOf.0.items.[INDEX].range","typeLabel":"integer[]"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mentions.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mentions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Mentions ordered by position in the text; null when none. Handles reflect the participant's current handle.","items":{"type":"object","required":["id","handle","is_me","range"],"properties":{"id":{"type":"string","format":"uuid","description":"Stable participant Contact ID, unchanged when the handle changes."},"handle":{"type":"string","description":"The target participant's current Relay Handle."},"is_me":{"type":"boolean","description":"Whether the mention addresses the recipient reading this message."},"range":{"type":"array","items":{"type":"integer","minimum":0},"minItems":2,"maxItems":2,"description":"Inclusive-exclusive [start, end) UTF-16 code-unit range in value; the whole value when the send omitted mention_range."}}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mentions.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mentions","typeLabel":"object[] | null"},"mention":{"oneOf":[{"deprecated":true,"type":"string","description":"Deprecated mirror of the first mention handle.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mention.oneOf.0","typeLabel":"string"},{"deprecated":true,"type":"null","description":"Deprecated mirror of the first mention handle.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mention.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mention","typeLabel":"string | null"},"mention_range":{"oneOf":[{"deprecated":true,"type":"array","prefixItems":[{"type":"integer","minimum":0},{"type":"integer","minimum":1}],"minItems":2,"maxItems":2,"description":"Deprecated mirror of the first mention range; null when omitted on send.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mention_range.oneOf.0","typeLabel":"array"},{"deprecated":true,"type":"null","prefixItems":[{"type":"integer","minimum":0},{"type":"integer","minimum":1}],"minItems":2,"maxItems":2,"description":"Deprecated mirror of the first mention range; null when omitted on send.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mention_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0.mention_range","typeLabel":"array | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A media attachment part","required":["type","id","url","filename","mime_type","size_bytes","reactions"],"properties":{"type":{"type":"string","enum":["media"],"description":"Indicates this is a media attachment part","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"id":{"type":"string","format":"uuid","description":"Unique attachment identifier","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.id","typeLabel":"string\u003cuuid>"},"url":{"type":"string","format":"uri","description":"Opaque Relay download URL for the Attachment.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.url","typeLabel":"string\u003curi>"},"filename":{"type":"string","description":"Original filename","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.filename","typeLabel":"string"},"mime_type":{"type":"string","description":"MIME type of the file","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.mime_type","typeLabel":"string"},"size_bytes":{"type":"integer","description":"File size in bytes","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.size_bytes","typeLabel":"integer"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.reactions","typeLabel":"object[] | null"},"duration_ms":{"oneOf":[{"type":"integer","minimum":0,"description":"Audio or video duration in milliseconds when known.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.duration_ms.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"Audio or video duration in milliseconds when known.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.duration_ms.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.duration_ms","typeLabel":"integer | null"},"width":{"oneOf":[{"type":"integer","minimum":1,"description":"Pixel width when known. Width and height are supplied together.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.width.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"Pixel width when known. Width and height are supplied together.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.width.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.width","typeLabel":"integer | null"},"height":{"oneOf":[{"type":"integer","minimum":1,"description":"Pixel height when known. Width and height are supplied together.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.height.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"description":"Pixel height when known. Width and height are supplied together.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.height.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1.height","typeLabel":"integer | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"A rich link preview part","required":["type","value","reactions"],"properties":{"type":{"type":"string","enum":["link"],"description":"Indicates this is a rich link preview part","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"The URL","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.value","typeLabel":"string"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2.reactions","typeLabel":"object[] | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"A buttons part as read back","required":["type","items","reactions"],"properties":{"type":{"type":"string","enum":["buttons"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"items":{"type":"array","items":{"type":"object","description":"One button as read back","required":["label"],"properties":{"label":{"type":"string","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.\\items.items.[INDEX].label","typeLabel":"string"},"url":{"type":"string","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.\\items.items.[INDEX].url","typeLabel":"string"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.\\items.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.\\items","typeLabel":"object[]"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3.reactions","typeLabel":"object[] | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.3","typeLabel":"object"},{"type":"object","required":["type","title","options","has_responded","selected_values","selected_ids","reactions"],"properties":{"type":{"type":"string","enum":["selection"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.type","typeLabel":"enum\u003cstring>"},"title":{"type":"string","description":"The question, as the agent sent it after trimming.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.title","typeLabel":"string"},"options":{"type":"array","minItems":1,"maxItems":25,"description":"All options in display order, including options from sections. Retained for clients that do not display groups.","items":{"type":"object","required":["id","value","label"],"properties":{"id":{"type":"string","minLength":1,"maxLength":200,"description":"Stable row identifier. For a legacy option, equals its value.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.options.items.[INDEX].id","typeLabel":"string"},"value":{"type":"string","minLength":1,"maxLength":200,"description":"Compatibility alias, equal to id.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.options.items.[INDEX].value","typeLabel":"string"},"label":{"type":"string","minLength":1,"maxLength":80,"description":"Stored label. Legacy labels can exceed the new 24-character input limit.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.options.items.[INDEX].label","typeLabel":"string"},"subtitle":{"type":"string","maxLength":72,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.options.items.[INDEX].subtitle","typeLabel":"string"},"image_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.options.items.[INDEX].image_url","typeLabel":"string\u003curi>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.options.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.options","typeLabel":"object[]"},"selected_values":{"oneOf":[{"type":"array","readOnly":true,"items":{"type":"string","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.selected_values.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"The values the authenticated viewer chose, in source-option order, identical on every one of that user's devices; null until the viewer answers, when the answer Message no longer exists, and always for an agent viewer.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.selected_values.oneOf.0","typeLabel":"string[]"},{"type":"null","readOnly":true,"items":{"type":"string"},"description":"The values the authenticated viewer chose, in source-option order, identical on every one of that user's devices; null until the viewer answers, when the answer Message no longer exists, and always for an agent viewer.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.selected_values.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.selected_values","typeLabel":"string[] | null"},"selected_ids":{"oneOf":[{"type":"array","readOnly":true,"items":{"type":"string","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.selected_ids.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"The authenticated viewer's selected option IDs in source order. Equal to selected_values, including for legacy options; null under the same conditions.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.selected_ids.oneOf.0","typeLabel":"string[]"},{"type":"null","readOnly":true,"items":{"type":"string"},"description":"The authenticated viewer's selected option IDs in source order. Equal to selected_values, including for legacy options; null under the same conditions.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.selected_ids.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.selected_ids","typeLabel":"string[] | null"},"has_responded":{"type":"boolean","readOnly":true,"description":"Whether the authenticated viewer has durably answered this part. Claims are scoped to the responding user, never to an agent viewer. Existing Chat admission rules still apply, including at most one user per Chat. Acceptance advances this viewer's Message updated_at and sends a message.upserted for the source prompt to this user's devices.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.has_responded","typeLabel":"boolean"},"reactions":{"type":"null","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.reactions","typeLabel":"null"},"subtitle":{"type":"string","maxLength":512,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.subtitle","typeLabel":"string"},"multiple":{"type":"boolean","default":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.multiple","typeLabel":"boolean"},"sections":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","required":["title","options"],"properties":{"title":{"type":"string","minLength":1,"maxLength":24,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.sections.items.[INDEX].title","typeLabel":"string"},"options":{"type":"array","minItems":1,"maxItems":25,"items":{"type":"object","required":["id","value","label"],"properties":{"id":{"type":"string","minLength":1,"maxLength":200,"description":"Stable row identifier. For a legacy option, equals its value.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.sections.items.[INDEX].options.items.[INDEX].id","typeLabel":"string"},"value":{"type":"string","minLength":1,"maxLength":200,"description":"Compatibility alias, equal to id.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.sections.items.[INDEX].options.items.[INDEX].value","typeLabel":"string"},"label":{"type":"string","minLength":1,"maxLength":80,"description":"Stored label. Legacy labels can exceed the new 24-character input limit.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.sections.items.[INDEX].options.items.[INDEX].label","typeLabel":"string"},"subtitle":{"type":"string","maxLength":72,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.sections.items.[INDEX].options.items.[INDEX].subtitle","typeLabel":"string"},"image_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.sections.items.[INDEX].options.items.[INDEX].image_url","typeLabel":"string\u003curi>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.sections.items.[INDEX].options.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.sections.items.[INDEX].options","typeLabel":"object[]"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.sections.items.[INDEX]","typeLabel":"object"},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.sections","typeLabel":"object[]"},"reply_message":{"type":"object","additionalProperties":false,"required":["title"],"description":"Source-owned text for the answered bubble. Copied by the server into the answer metadata when supplied on the prompt. Does not replace the portable selected-label text.","properties":{"title":{"type":"string","minLength":1,"pattern":"\\S","maxLength":512,"description":"Answered bubble title, trimmed before storage.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.reply_message.title","typeLabel":"string"},"subtitle":{"type":"string","maxLength":512,"description":"Optional answered bubble subtitle, trimmed before storage; blank after trimming is stored as absent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.reply_message.subtitle","typeLabel":"string"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4.reply_message","typeLabel":"object"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.4","typeLabel":"object"},{"type":"object","required":["type","value","title","pages","has_responded","answers","reactions"],"properties":{"type":{"type":"string","enum":["form"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","readOnly":true,"description":"The form's received_message.title, else its title; the words a client that does not draw the form shows in its place.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.value","typeLabel":"string"},"title":{"type":"string","minLength":1,"maxLength":80,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.title","typeLabel":"string"},"pages":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"description":"One native form page. Pages appear in array order.","required":["id","title","fields"],"properties":{"id":{"type":"string","minLength":1,"maxLength":19,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Unique page id.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].id","typeLabel":"string"},"title":{"type":"string","minLength":1,"maxLength":80,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].title","typeLabel":"string"},"fields":{"type":"array","minItems":1,"maxItems":50,"items":{"oneOf":[{"type":"object","required":["id","type","label"],"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Unique across every page of this form. Responses use this id as the answer key.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.0.id","typeLabel":"string"},"type":{"type":"string","enum":["text"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":20,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.0.label","typeLabel":"string"},"placeholder":{"type":"string","description":"Text shown before the user enters or chooses a value.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.0.placeholder","typeLabel":"string"},"required":{"type":"boolean","default":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.0.required","typeLabel":"boolean"},"max_length":{"type":"integer","maximum":9007199254740991,"minimum":1,"description":"Maximum Unicode scalar characters. Defaults to 30 for single-line and 300 for multiline text; a positive explicit value overrides the default.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.0.max_length","typeLabel":"integer"},"multiline":{"type":"boolean","default":false,"description":"Allow line breaks and a native multiline text field.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.0.multiline","typeLabel":"boolean"},"keyboard":{"type":"string","enum":["default","email","phone","number","url"],"default":"default","description":"The keyboard iOS shows. `email` and `phone` also check the answer: an email address, or an E.164 number such as +13135550123. A wrong one is refused with 422/2006. `number` and `url` only choose the keyboard.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.0.keyboard","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","required":["id","type","label","options"],"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Unique across every page of this form. Responses use this id as the answer key.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1.id","typeLabel":"string"},"type":{"type":"string","enum":["select"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":30,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1.label","typeLabel":"string"},"options":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"object","additionalProperties":false,"required":["value","label"],"properties":{"value":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Stable case-sensitive value, unique within this field.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1.options.items.[INDEX].value","typeLabel":"string"},"label":{"type":"string","minLength":1,"maxLength":30,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1.options.items.[INDEX].label","typeLabel":"string"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1.options.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1.options","typeLabel":"object[]"},"placeholder":{"type":"string","description":"Text shown before the user enters or chooses a value.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1.placeholder","typeLabel":"string"},"required":{"type":"boolean","default":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1.required","typeLabel":"boolean"},"multiple":{"type":"boolean","default":false,"description":"Return an array of values in source-option order when true, otherwise one string.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1.multiple","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","required":["id","type","label","options"],"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Unique across every page of this form. Responses use this id as the answer key.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.2.id","typeLabel":"string"},"type":{"type":"string","enum":["picker"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":20,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.2.label","typeLabel":"string"},"options":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object","additionalProperties":false,"required":["value","label"],"properties":{"value":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Stable case-sensitive value, unique within this field.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.2.options.items.[INDEX].value","typeLabel":"string"},"label":{"type":"string","minLength":1,"maxLength":30,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.2.options.items.[INDEX].label","typeLabel":"string"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.2.options.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.2.options","typeLabel":"object[]"},"placeholder":{"type":"string","description":"Text shown before the user enters or chooses a value.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.2.placeholder","typeLabel":"string"},"required":{"type":"boolean","default":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.2.required","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"Collect a valid Gregorian calendar date as YYYY-MM-DD, independent of time zone.","required":["id","type","label"],"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Unique across every page of this form. Responses use this id as the answer key.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.3.id","typeLabel":"string"},"type":{"type":"string","enum":["date"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":40,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.3.label","typeLabel":"string"},"placeholder":{"type":"string","description":"Text shown before the user enters or chooses a value.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.3.placeholder","typeLabel":"string"},"required":{"type":"boolean","default":false,"description":"Maximum answer length. A calendar date is ten characters. Defaults to 10.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.3.required","typeLabel":"boolean"},"min_date":{"type":"string","format":"date","pattern":"^(?!0000)[0-9]{4}-[0-9]{2}-[0-9]{2}$","default":"1900-01-01","description":"Earliest date the person can choose, YYYY-MM-DD. An earlier answer is refused. Not after max_date (checked by Relay).","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.3.min_date","typeLabel":"string\u003cdate>"},"max_date":{"type":"string","format":"date","pattern":"^(?!0000)[0-9]{4}-[0-9]{2}-[0-9]{2}$","default":"2100-12-31","description":"Latest date the person can choose, YYYY-MM-DD. A later answer is refused.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.3.max_date","typeLabel":"string\u003cdate>"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX].fields","typeLabel":"object[]"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.pages","typeLabel":"object[]"},"has_responded":{"type":"boolean","readOnly":true,"description":"Whether the authenticated user has durably answered. False for agent viewers. Same-key retries return the original response; a different-key second answer returns 409/1005. Source message.upserted refreshes this user’s devices.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.has_responded","typeLabel":"boolean"},"answers":{"oneOf":[{"type":"object","description":"This viewer’s answers, null before answering or when the answer Message no longer exists; always null for agent viewers. Agents receive the form_response in the answer Message instead.","additionalProperties":{"oneOf":[{"type":"string","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.answers.oneOf.0.additionalProperties.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.answers.oneOf.0.additionalProperties.oneOf.1.items.[INDEX]","typeLabel":"string"},"maxItems":20,"uniqueItems":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.answers.oneOf.0.additionalProperties.oneOf.1","typeLabel":"string[]"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.answers.oneOf.0.additionalProperties","typeLabel":"string | string[]"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.answers.oneOf.0","typeLabel":"object"},{"type":"null","description":"This viewer’s answers, null before answering or when the answer Message no longer exists; always null for agent viewers. Agents receive the form_response in the answer Message instead.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.answers.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.answers","typeLabel":"object | null"},"reactions":{"type":"null","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.reactions","typeLabel":"null"},"show_summary":{"type":"boolean","default":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.show_summary","typeLabel":"boolean"},"splash":{"type":"object","additionalProperties":false,"description":"Optional introduction before the first field page.","required":["button_title"],"properties":{"button_title":{"type":"string","minLength":1,"maxLength":35,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.splash.button_title","typeLabel":"string"},"title":{"type":"string","minLength":1,"maxLength":80,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.splash.title","typeLabel":"string"},"text":{"type":"string","minLength":0,"maxLength":4096,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.splash.text","typeLabel":"string"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.splash","typeLabel":"object"},"received_message":{"type":"object","additionalProperties":false,"description":"Optional received card text. Each native page uses its own page title.","required":["title"],"properties":{"title":{"type":"string","minLength":1,"maxLength":512,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.received_message.title","typeLabel":"string"},"subtitle":{"type":"string","minLength":0,"maxLength":512,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.received_message.subtitle","typeLabel":"string"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.received_message","typeLabel":"object"},"reply_message":{"type":"object","additionalProperties":false,"description":"Optional answered card subtitle. The answered title is Form sent.","required":["title"],"properties":{"title":{"type":"string","enum":["Form sent"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.reply_message.title","typeLabel":"enum\u003cstring>"},"subtitle":{"type":"string","minLength":0,"maxLength":512,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.reply_message.subtitle","typeLabel":"string"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5.reply_message","typeLabel":"object"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.5","typeLabel":"object"},{"type":"object","description":"Persisted field-keyed answers delivered in normal Message events. Contributes no fallback text and cannot receive reactions.","required":["type","answers"],"properties":{"type":{"type":"string","enum":["form_response"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.6.type","typeLabel":"enum\u003cstring>"},"answers":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"additionalProperties":{"oneOf":[{"type":"string","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.6.answers.additionalProperties.oneOf.0","typeLabel":"string"},{"type":"array","items":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.6.answers.additionalProperties.oneOf.1.items.[INDEX]","typeLabel":"string"},"maxItems":20,"uniqueItems":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.6.answers.additionalProperties.oneOf.1","typeLabel":"string[]"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.6.answers.additionalProperties","typeLabel":"string | string[]"},"description":"Answers keyed by source field id. Text, date, picker and single select use a string; multi-select uses unique option values in source order. A one-option multi-select represents opt-in. Optional unanswered fields may be omitted or use an empty value. Source fields enforce required values, max_length and allowed choices.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.6.answers","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.6","typeLabel":"object"},{"type":"object","description":"Persisted selection metadata; contributes no fallback text and cannot receive reactions. selected_ids is source-derived. When the source supplies reply_message, it is copied into this answer so its bubble text remains available independently of the source.","required":["type","selected_values","selected_ids"],"properties":{"type":{"type":"string","enum":["selection_response"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.7.type","typeLabel":"enum\u003cstring>"},"selected_values":{"type":"array","minItems":1,"maxItems":25,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":200,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.7.selected_values.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.7.selected_values","typeLabel":"string[]"},"selected_ids":{"type":"array","minItems":1,"maxItems":25,"uniqueItems":true,"readOnly":true,"items":{"type":"string","minLength":1,"maxLength":200,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.7.selected_ids.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.7.selected_ids","typeLabel":"string[]"},"reply_message":{"type":"object","additionalProperties":false,"required":["title"],"description":"Source-owned text for the answered bubble. Copied by the server into the answer metadata when supplied on the prompt. Does not replace the portable selected-label text.","properties":{"title":{"type":"string","minLength":1,"pattern":"\\S","maxLength":512,"description":"Answered bubble title, trimmed before storage.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.7.reply_message.title","typeLabel":"string"},"subtitle":{"type":"string","maxLength":512,"description":"Optional answered bubble subtitle, trimmed before storage; blank after trimming is stored as absent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.7.reply_message.subtitle","typeLabel":"string"}},"readOnly":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.7.reply_message","typeLabel":"object"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.7","typeLabel":"object"},{"type":"object","description":"A rich_card part as read back.","required":["type","reactions"],"properties":{"type":{"type":"string","enum":["rich_card"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.type","typeLabel":"enum\u003cstring>"},"reactions":{"oneOf":[{"type":"array","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.reactions","typeLabel":"object[] | null"},"media":{"type":"object","additionalProperties":false,"description":"A card's picture or video. Drawn across the card's full width at `height` and opened full screen when tapped.","required":["type","url"],"properties":{"type":{"type":"string","enum":["image","video"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.media.type","typeLabel":"enum\u003cstring>"},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of the file.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.media.url","typeLabel":"string\u003curi>"},"thumbnail_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of a still shown before a video plays.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.media.thumbnail_url","typeLabel":"string\u003curi>"},"height":{"type":"string","enum":["short","medium","tall"],"default":"medium","description":"short is 112 pt, medium 168 pt, tall 264 pt.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.media.height","typeLabel":"enum\u003cstring>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.media","typeLabel":"object"},"title":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"1 to 200 characters after trimming; never only whitespace.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.title","typeLabel":"string"},"description":{"type":"string","minLength":1,"maxLength":2000,"pattern":"\\S","description":"1 to 2000 characters after trimming; never only whitespace.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.description","typeLabel":"string"},"suggestions":{"type":"array","minItems":1,"maxItems":4,"description":"1 to 4 suggestions. Every reply `id` is unique within the part (checked by Relay; JSON Schema cannot express it).","items":{"oneOf":[{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","id"],"properties":{"type":{"type":"string","enum":["reply"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.0.label","typeLabel":"string"},"id":{"type":"string","minLength":1,"maxLength":256,"description":"Your identifier for this reply, returned in the person's suggestion_response. Unique within the part, across every card of a carousel (checked by Relay; JSON Schema cannot express it).","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.0.id","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","url"],"properties":{"type":{"type":"string","enum":["open_url"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.1.label","typeLabel":"string"},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^[hH][tT][tT][pP][sS]?://","description":"An http or https URL. Other schemes are refused.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.1.url","typeLabel":"string\u003curi>"},"application":{"type":"string","enum":["browser","webview"],"description":"webview opens the page inside Relay; browser, the default, opens the in-app browser the same way a link does.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.1.application","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","phone_number"],"properties":{"type":{"type":"string","enum":["dial"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.2.label","typeLabel":"string"},"phone_number":{"type":"string","pattern":"^\\+[1-9]\\d{1,14}$","description":"E.164, for example +12223334444.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.2.phone_number","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","latitude"],"properties":{"type":{"type":"string","enum":["view_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.3.label","typeLabel":"string"},"latitude":{"type":"number","minimum":-90,"maximum":90,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.3.latitude","typeLabel":"number"},"longitude":{"type":"number","minimum":-180,"maximum":180,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.3.longitude","typeLabel":"number"},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.3.name","typeLabel":"string"},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.3.query","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.3","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","query"],"properties":{"type":{"type":"string","enum":["view_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.4.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.4.label","typeLabel":"string"},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.4.query","typeLabel":"string"},"latitude":{"type":"number","minimum":-90,"maximum":90,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.4.latitude","typeLabel":"number"},"longitude":{"type":"number","minimum":-180,"maximum":180,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.4.longitude","typeLabel":"number"},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.4.name","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.4","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label"],"properties":{"type":{"type":"string","enum":["share_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.5.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.5.label","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.5","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","start_time","end_time","title"],"properties":{"type":{"type":"string","enum":["create_calendar_event"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.6.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.6.label","typeLabel":"string"},"start_time":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.6.start_time","typeLabel":"string\u003cdate-time>"},"end_time":{"type":"string","format":"date-time","description":"Not before start_time.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.6.end_time","typeLabel":"string\u003cdate-time>"},"title":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.6.title","typeLabel":"string"},"description":{"type":"string","maxLength":500,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.6.description","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX].oneOf.6","typeLabel":"object"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8.suggestions","typeLabel":"object[]"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.8","typeLabel":"object"},{"type":"object","description":"A carousel part as read back.","required":["type","card_width","cards","reactions"],"properties":{"type":{"type":"string","enum":["carousel"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.type","typeLabel":"enum\u003cstring>"},"card_width":{"type":"string","enum":["small","medium"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.card_width","typeLabel":"enum\u003cstring>"},"cards":{"type":"array","items":{"oneOf":[{"type":"object","description":"One card. Needs at least one of media, title or description.","required":["media"],"properties":{"media":{"type":"object","additionalProperties":false,"description":"A card's picture or video. Drawn across the card's full width at `height` and opened full screen when tapped.","required":["type","url"],"properties":{"type":{"type":"string","enum":["image","video"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.media.type","typeLabel":"enum\u003cstring>"},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of the file.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.media.url","typeLabel":"string\u003curi>"},"thumbnail_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of a still shown before a video plays.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.media.thumbnail_url","typeLabel":"string\u003curi>"},"height":{"type":"string","enum":["short","medium","tall"],"default":"medium","description":"short is 112 pt, medium 168 pt, tall 264 pt.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.media.height","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.media","typeLabel":"object"},"title":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"1 to 200 characters after trimming; never only whitespace.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.title","typeLabel":"string"},"description":{"type":"string","minLength":1,"maxLength":2000,"pattern":"\\S","description":"1 to 2000 characters after trimming; never only whitespace.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.description","typeLabel":"string"},"suggestions":{"type":"array","minItems":1,"maxItems":4,"description":"1 to 4 suggestions. Every reply `id` is unique within the part (checked by Relay; JSON Schema cannot express it).","items":{"oneOf":[{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","id"],"properties":{"type":{"type":"string","enum":["reply"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.0.label","typeLabel":"string"},"id":{"type":"string","minLength":1,"maxLength":256,"description":"Your identifier for this reply, returned in the person's suggestion_response. Unique within the part, across every card of a carousel (checked by Relay; JSON Schema cannot express it).","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.0.id","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","url"],"properties":{"type":{"type":"string","enum":["open_url"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.1.label","typeLabel":"string"},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^[hH][tT][tT][pP][sS]?://","description":"An http or https URL. Other schemes are refused.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.1.url","typeLabel":"string\u003curi>"},"application":{"type":"string","enum":["browser","webview"],"description":"webview opens the page inside Relay; browser, the default, opens the in-app browser the same way a link does.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.1.application","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","phone_number"],"properties":{"type":{"type":"string","enum":["dial"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.2.label","typeLabel":"string"},"phone_number":{"type":"string","pattern":"^\\+[1-9]\\d{1,14}$","description":"E.164, for example +12223334444.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.2.phone_number","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","latitude"],"properties":{"type":{"type":"string","enum":["view_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.3.label","typeLabel":"string"},"latitude":{"type":"number","minimum":-90,"maximum":90,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.3.latitude","typeLabel":"number"},"longitude":{"type":"number","minimum":-180,"maximum":180,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.3.longitude","typeLabel":"number"},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.3.name","typeLabel":"string"},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.3.query","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.3","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","query"],"properties":{"type":{"type":"string","enum":["view_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.4.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.4.label","typeLabel":"string"},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.4.query","typeLabel":"string"},"latitude":{"type":"number","minimum":-90,"maximum":90,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.4.latitude","typeLabel":"number"},"longitude":{"type":"number","minimum":-180,"maximum":180,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.4.longitude","typeLabel":"number"},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.4.name","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.4","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label"],"properties":{"type":{"type":"string","enum":["share_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.5.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.5.label","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.5","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","start_time","end_time","title"],"properties":{"type":{"type":"string","enum":["create_calendar_event"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.6.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.6.label","typeLabel":"string"},"start_time":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.6.start_time","typeLabel":"string\u003cdate-time>"},"end_time":{"type":"string","format":"date-time","description":"Not before start_time.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.6.end_time","typeLabel":"string\u003cdate-time>"},"title":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.6.title","typeLabel":"string"},"description":{"type":"string","maxLength":500,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.6.description","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX].oneOf.6","typeLabel":"object"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0.suggestions","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One card. Needs at least one of media, title or description.","required":["title"],"properties":{"title":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"1 to 200 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.title","typeLabel":"string"},"media":{"type":"object","additionalProperties":false,"description":"A card's picture or video. Drawn across the card's full width at `height` and opened full screen when tapped.","required":["type","url"],"properties":{"type":{"type":"string","enum":["image","video"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.media.type","typeLabel":"enum\u003cstring>"},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of the file.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.media.url","typeLabel":"string\u003curi>"},"thumbnail_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of a still shown before a video plays.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.media.thumbnail_url","typeLabel":"string\u003curi>"},"height":{"type":"string","enum":["short","medium","tall"],"default":"medium","description":"short is 112 pt, medium 168 pt, tall 264 pt.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.media.height","typeLabel":"enum\u003cstring>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.media","typeLabel":"object"},"description":{"type":"string","minLength":1,"maxLength":2000,"pattern":"\\S","description":"1 to 2000 characters after trimming; never only whitespace.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.description","typeLabel":"string"},"suggestions":{"type":"array","minItems":1,"maxItems":4,"description":"1 to 4 suggestions. Every reply `id` is unique within the part (checked by Relay; JSON Schema cannot express it).","items":{"oneOf":[{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","id"],"properties":{"type":{"type":"string","enum":["reply"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.0.label","typeLabel":"string"},"id":{"type":"string","minLength":1,"maxLength":256,"description":"Your identifier for this reply, returned in the person's suggestion_response. Unique within the part, across every card of a carousel (checked by Relay; JSON Schema cannot express it).","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.0.id","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","url"],"properties":{"type":{"type":"string","enum":["open_url"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.1.label","typeLabel":"string"},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^[hH][tT][tT][pP][sS]?://","description":"An http or https URL. Other schemes are refused.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.1.url","typeLabel":"string\u003curi>"},"application":{"type":"string","enum":["browser","webview"],"description":"webview opens the page inside Relay; browser, the default, opens the in-app browser the same way a link does.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.1.application","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","phone_number"],"properties":{"type":{"type":"string","enum":["dial"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.2.label","typeLabel":"string"},"phone_number":{"type":"string","pattern":"^\\+[1-9]\\d{1,14}$","description":"E.164, for example +12223334444.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.2.phone_number","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","latitude"],"properties":{"type":{"type":"string","enum":["view_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.3.label","typeLabel":"string"},"latitude":{"type":"number","minimum":-90,"maximum":90,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.3.latitude","typeLabel":"number"},"longitude":{"type":"number","minimum":-180,"maximum":180,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.3.longitude","typeLabel":"number"},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.3.name","typeLabel":"string"},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.3.query","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.3","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","query"],"properties":{"type":{"type":"string","enum":["view_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.4.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.4.label","typeLabel":"string"},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.4.query","typeLabel":"string"},"latitude":{"type":"number","minimum":-90,"maximum":90,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.4.latitude","typeLabel":"number"},"longitude":{"type":"number","minimum":-180,"maximum":180,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.4.longitude","typeLabel":"number"},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.4.name","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.4","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label"],"properties":{"type":{"type":"string","enum":["share_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.5.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.5.label","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.5","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","start_time","end_time","title"],"properties":{"type":{"type":"string","enum":["create_calendar_event"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.6.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.6.label","typeLabel":"string"},"start_time":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.6.start_time","typeLabel":"string\u003cdate-time>"},"end_time":{"type":"string","format":"date-time","description":"Not before start_time.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.6.end_time","typeLabel":"string\u003cdate-time>"},"title":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.6.title","typeLabel":"string"},"description":{"type":"string","maxLength":500,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.6.description","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX].oneOf.6","typeLabel":"object"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1.suggestions","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One card. Needs at least one of media, title or description.","required":["description"],"properties":{"description":{"type":"string","minLength":1,"maxLength":2000,"pattern":"\\S","description":"1 to 2000 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.description","typeLabel":"string"},"media":{"type":"object","additionalProperties":false,"description":"A card's picture or video. Drawn across the card's full width at `height` and opened full screen when tapped.","required":["type","url"],"properties":{"type":{"type":"string","enum":["image","video"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.media.type","typeLabel":"enum\u003cstring>"},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of the file.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.media.url","typeLabel":"string\u003curi>"},"thumbnail_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of a still shown before a video plays.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.media.thumbnail_url","typeLabel":"string\u003curi>"},"height":{"type":"string","enum":["short","medium","tall"],"default":"medium","description":"short is 112 pt, medium 168 pt, tall 264 pt.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.media.height","typeLabel":"enum\u003cstring>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.media","typeLabel":"object"},"title":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"1 to 200 characters after trimming; never only whitespace.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.title","typeLabel":"string"},"suggestions":{"type":"array","minItems":1,"maxItems":4,"description":"1 to 4 suggestions. Every reply `id` is unique within the part (checked by Relay; JSON Schema cannot express it).","items":{"oneOf":[{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","id"],"properties":{"type":{"type":"string","enum":["reply"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.0.label","typeLabel":"string"},"id":{"type":"string","minLength":1,"maxLength":256,"description":"Your identifier for this reply, returned in the person's suggestion_response. Unique within the part, across every card of a carousel (checked by Relay; JSON Schema cannot express it).","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.0.id","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","url"],"properties":{"type":{"type":"string","enum":["open_url"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.1.label","typeLabel":"string"},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^[hH][tT][tT][pP][sS]?://","description":"An http or https URL. Other schemes are refused.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.1.url","typeLabel":"string\u003curi>"},"application":{"type":"string","enum":["browser","webview"],"description":"webview opens the page inside Relay; browser, the default, opens the in-app browser the same way a link does.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.1.application","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","phone_number"],"properties":{"type":{"type":"string","enum":["dial"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.2.label","typeLabel":"string"},"phone_number":{"type":"string","pattern":"^\\+[1-9]\\d{1,14}$","description":"E.164, for example +12223334444.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.2.phone_number","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","latitude"],"properties":{"type":{"type":"string","enum":["view_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.3.label","typeLabel":"string"},"latitude":{"type":"number","minimum":-90,"maximum":90,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.3.latitude","typeLabel":"number"},"longitude":{"type":"number","minimum":-180,"maximum":180,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.3.longitude","typeLabel":"number"},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.3.name","typeLabel":"string"},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.3.query","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.3","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","query"],"properties":{"type":{"type":"string","enum":["view_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.4.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.4.label","typeLabel":"string"},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.4.query","typeLabel":"string"},"latitude":{"type":"number","minimum":-90,"maximum":90,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.4.latitude","typeLabel":"number"},"longitude":{"type":"number","minimum":-180,"maximum":180,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.4.longitude","typeLabel":"number"},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.4.name","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.4","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label"],"properties":{"type":{"type":"string","enum":["share_location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.5.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.5.label","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.5","typeLabel":"object"},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","start_time","end_time","title"],"properties":{"type":{"type":"string","enum":["create_calendar_event"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.6.type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.6.label","typeLabel":"string"},"start_time":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.6.start_time","typeLabel":"string\u003cdate-time>"},"end_time":{"type":"string","format":"date-time","description":"Not before start_time.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.6.end_time","typeLabel":"string\u003cdate-time>"},"title":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.6.title","typeLabel":"string"},"description":{"type":"string","maxLength":500,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.6.description","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX].oneOf.6","typeLabel":"object"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2.suggestions","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX].oneOf.2","typeLabel":"object"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.cards","typeLabel":"object[]"},"reactions":{"oneOf":[{"type":"array","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9.reactions","typeLabel":"object[] | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.9","typeLabel":"object"},{"type":"object","description":"The reply the person tapped, as the agent reads it. Contributes no fallback text.","required":["type","id","label"],"properties":{"type":{"type":"string","enum":["suggestion_response"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.10.type","typeLabel":"enum\u003cstring>"},"id":{"type":"string","description":"The reply suggestion's id, as the agent sent it.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.10.id","typeLabel":"string"},"label":{"type":"string","description":"The reply suggestion's label, as the card showed it.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.10.label","typeLabel":"string"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.10","typeLabel":"object"},{"type":"object","description":"A payment card as every reader sees it, read from the payment request. `status` changes in place.","required":["type","payment_request_id","checkout_url","amount","currency","description","category","mode","status","reactions"],"properties":{"type":{"type":"string","enum":["payment"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.type","typeLabel":"enum\u003cstring>"},"payment_request_id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.payment_request_id","typeLabel":"string\u003cuuid>"},"checkout_url":{"type":"string","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.checkout_url","typeLabel":"string"},"amount":{"type":"integer","description":"In the currency's minor units. For a subscription, what the first period costs.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.amount","typeLabel":"integer"},"currency":{"type":"string","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.currency","typeLabel":"string"},"description":{"type":"string","description":"The card's title line.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.description","typeLabel":"string"},"category":{"type":"string","enum":["physical_goods","digital_goods","donation"],"description":"What is being paid for, the same three values as PayPal Orders v2 `items[].category` (PHYSICAL_GOODS, DIGITAL_GOODS, DONATION; developer.paypal.com/docs/api/orders/v2/). The App Store Review Guidelines (developer.apple.com/app-store/review/guidelines/) decide where each can be paid:\n- `physical_goods`: physical goods, and services used in the real world, such as a haircut or a ride (3.1.3(e)). Payable anywhere.\n- `digital_goods`: anything used in an app or online. A person pays by opening the link in Safari, and only on the United States storefront (3.1.1(a)); sending one to a person whose devices report only other storefronts returns 422 (error code `2006`). A tip to an agent or a creator is `digital_goods` (3.1.1: tips to digital content providers use In-App Purchase).\n- `donation`: money for a charity or a fundraiser. Collected outside the app, on any storefront (3.2.2(iv): such apps \"may only collect funds outside of the app, such as via Safari…\").","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.category","typeLabel":"enum\u003cstring>"},"mode":{"type":"string","enum":["payment","subscription"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.mode","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"A payment request's lifecycle. It leaves `requested` exactly once, and only on Stripe's word or your cancel.","enum":["requested","succeeded","canceled","expired"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.status","typeLabel":"enum\u003cstring>"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part. Only a person can react to a payment.","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part. Only a person can react to a payment.","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.reactions","typeLabel":"object[] | null"},"recurring":{"type":"object","additionalProperties":false,"description":"A subscription's renewal cadence, read from its Stripe Price.","required":["interval","interval_count"],"properties":{"interval":{"type":"string","enum":["day","week","month","year"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.recurring.interval","typeLabel":"enum\u003cstring>"},"interval_count":{"type":"integer","minimum":1,"description":"Intervals per renewal (3 with `month` is quarterly).","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.recurring.interval_count","typeLabel":"integer"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.recurring","typeLabel":"object"},"image_url":{"type":"string","description":"The request's product picture, when it has one; the card shows it.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11.image_url","typeLabel":"string"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.11","typeLabel":"object"},{"type":"object","description":"The payer's receipt. When a payment request succeeds, Relay adds one message from the person who paid at the bottom of the chat, a reply to the `payment` card, carrying this part; your agent receives it as `message.received` like any message. The payer is the person who opened the payment in the Relay app, or, when Relay does not know who paid, the one person in a chat that holds the card. A group chat with no known payer gets no receipt. Expired and canceled requests add no message. Only Relay writes this part; sending one returns 400.","required":["type","payment_request_id","description","amount","currency","mode","reactions"],"properties":{"type":{"type":"string","enum":["payment_receipt"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.type","typeLabel":"enum\u003cstring>"},"payment_request_id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.payment_request_id","typeLabel":"string\u003cuuid>"},"description":{"type":"string","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.description","typeLabel":"string"},"amount":{"type":"integer","description":"What was paid, in the currency's minor units. For a subscription, what the first period cost.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.amount","typeLabel":"integer"},"currency":{"type":"string","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.currency","typeLabel":"string"},"mode":{"type":"string","enum":["payment","subscription"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.mode","typeLabel":"enum\u003cstring>"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.reactions","typeLabel":"object[] | null"},"recurring":{"type":"object","additionalProperties":false,"description":"A subscription's renewal cadence, read from its Stripe Price.","required":["interval","interval_count"],"properties":{"interval":{"type":"string","enum":["day","week","month","year"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.recurring.interval","typeLabel":"enum\u003cstring>"},"interval_count":{"type":"integer","minimum":1,"description":"Intervals per renewal (3 with `month` is quarterly).","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.recurring.interval_count","typeLabel":"integer"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12.recurring","typeLabel":"object"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.12","typeLabel":"object"},{"type":"object","description":"A request for the person's location, sent by an agent with `POST /v1/chats/{chatId}/location/request`. It cannot be sent as a message part. A client that does not draw it shows the Message's text, \"\u003cagent display name> requested your location\".","required":["type","reactions"],"properties":{"type":{"type":"string","enum":["location_request"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.type","typeLabel":"enum\u003cstring>"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13.reactions","typeLabel":"object[] | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.13","typeLabel":"object"},{"type":"object","description":"A rating request from an agent. A client that does not draw it shows the Message's text, \"Enjoying \u003cagent display name>?\".","required":["type","value","rating","reactions"],"properties":{"type":{"type":"string","enum":["rating_request"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","description":"\"Enjoying \u003cagent display name>?\", the words a client that does not draw the card shows in its place.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.value","typeLabel":"string"},"rating":{"oneOf":[{"type":"null","description":"The reader's own rating of the agent that asked, or null when the reader has not rated it. Nobody else's rating is shown here.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.rating.oneOf.0","typeLabel":"null"},{"type":"object","description":"The reader's own rating of the agent that asked, or null when the reader has not rated it. Nobody else's rating is shown here.","required":["stars","review"],"properties":{"stars":{"type":"integer","minimum":1,"maximum":5,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.rating.oneOf.1.stars","typeLabel":"integer"},"review":{"oneOf":[{"type":"string","maxLength":1000,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.rating.oneOf.1.review.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":1000,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.rating.oneOf.1.review.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.rating.oneOf.1.review","typeLabel":"string | null"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.rating.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.rating","typeLabel":"null | object"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14.reactions","typeLabel":"object[] | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.14","typeLabel":"object"},{"type":"object","description":"An A2UI v1.0 card: every accepted message for each surface the part created, in order, exactly as sent, so every reader replays the same list.","required":["type","media_type","data","reactions"],"properties":{"type":{"type":"string","enum":["data"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.type","typeLabel":"enum\u003cstring>"},"media_type":{"type":"string","enum":["application/a2ui+json"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.media_type","typeLabel":"enum\u003cstring>"},"data":{"type":"array","items":{"type":"object","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.data.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.data","typeLabel":"object[]"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15.reactions","typeLabel":"object[] | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.15","typeLabel":"object"},{"type":"object","description":"A person's location share, the card the person's app draws. It carries the share's state, not its position: read the position with `GET /v1/chats/{chatId}/location`. It cannot be sent as a message part. A share whose `ends_at` has passed reads as `ended` with `ended_at` equal to `ends_at`.","required":["type","state","began_at","ends_at","ended_at","reactions"],"properties":{"type":{"type":"string","enum":["location"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.type","typeLabel":"enum\u003cstring>"},"state":{"type":"string","enum":["live","ended"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.state","typeLabel":"enum\u003cstring>"},"began_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.began_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.began_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.began_at","typeLabel":"string\u003cdate-time> | null"},"ends_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the share ends by itself; null when it has no end.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.ends_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the share ends by itself; null when it has no end.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.ends_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.ends_at","typeLabel":"string\u003cdate-time> | null"},"ended_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.ended_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.ended_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.ended_at","typeLabel":"string\u003cdate-time> | null"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16.reactions","typeLabel":"object[] | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.16","typeLabel":"object"},{"type":"object","description":"A place sent once, as its sender sent it. `name` and `address` are absent when the sender left them out. A client that does not draw it shows the Message's text: the name, else the address, else \"Dropped Pin\".","required":["type","latitude","longitude","reactions"],"example":{"type":"place","latitude":37.44216251868683,"longitude":-122.16153582049394,"name":"Philz Coffee","address":"101 Forest Ave, Palo Alto, CA 94301","reactions":null},"properties":{"type":{"type":"string","enum":["place"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.type","typeLabel":"enum\u003cstring>"},"latitude":{"type":"number","minimum":-90,"maximum":90,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.latitude","typeLabel":"number"},"longitude":{"type":"number","minimum":-180,"maximum":180,"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.longitude","typeLabel":"number"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].is_me","typeLabel":"boolean"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle.activity","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].handle","typeLabel":"object"},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].custom_emoji.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX].custom_emoji","typeLabel":"string | null"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}},"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.reactions","typeLabel":"object[] | null"},"name":{"type":"string","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.name","typeLabel":"string"},"address":{"type":"string","uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17.address","typeLabel":"string"}},"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.17","typeLabel":"object"},{"type":"object","required":["type","value","reactions"],"properties":{"type":{"type":"string","enum":["system"],"isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.18.type","typeLabel":"enum\u003cstring>"},"value":{"type":"string","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.18.value","typeLabel":"string"},"reactions":{"type":"null","isRequired":true,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.18.reactions","typeLabel":"null"}},"additionalProperties":false,"uniqueKey":"parts.oneOf.0.items.[INDEX].oneOf.18","typeLabel":"object"}],"uniqueKey":"parts.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"parts.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Message parts in order (text, media, and link)","items":{"oneOf":[{"type":"object","description":"A text message part","required":["type","value","reactions"],"properties":{"type":{"type":"string","enum":["text"],"description":"Indicates this is a text message part"},"value":{"type":"string","description":"The text content"},"mentions":{"oneOf":[{"type":"array","description":"Mentions ordered by position in the text; null when none. Handles reflect the participant's current handle.","items":{"type":"object","required":["id","handle","is_me","range"],"properties":{"id":{"type":"string","format":"uuid","description":"Stable participant Contact ID, unchanged when the handle changes."},"handle":{"type":"string","description":"The target participant's current Relay Handle."},"is_me":{"type":"boolean","description":"Whether the mention addresses the recipient reading this message."},"range":{"type":"array","items":{"type":"integer","minimum":0},"minItems":2,"maxItems":2,"description":"Inclusive-exclusive [start, end) UTF-16 code-unit range in value; the whole value when the send omitted mention_range."}}}},{"type":"null","description":"Mentions ordered by position in the text; null when none. Handles reflect the participant's current handle.","items":{"type":"object","required":["id","handle","is_me","range"],"properties":{"id":{"type":"string","format":"uuid","description":"Stable participant Contact ID, unchanged when the handle changes."},"handle":{"type":"string","description":"The target participant's current Relay Handle."},"is_me":{"type":"boolean","description":"Whether the mention addresses the recipient reading this message."},"range":{"type":"array","items":{"type":"integer","minimum":0},"minItems":2,"maxItems":2,"description":"Inclusive-exclusive [start, end) UTF-16 code-unit range in value; the whole value when the send omitted mention_range."}}}}]},"mention":{"oneOf":[{"deprecated":true,"type":"string","description":"Deprecated mirror of the first mention handle."},{"deprecated":true,"type":"null","description":"Deprecated mirror of the first mention handle."}]},"mention_range":{"oneOf":[{"deprecated":true,"type":"array","prefixItems":[{"type":"integer","minimum":0},{"type":"integer","minimum":1}],"minItems":2,"maxItems":2,"description":"Deprecated mirror of the first mention range; null when omitted on send."},{"deprecated":true,"type":"null","prefixItems":[{"type":"integer","minimum":0},{"type":"integer","minimum":1}],"minItems":2,"maxItems":2,"description":"Deprecated mirror of the first mention range; null when omitted on send."}]},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","description":"A media attachment part","required":["type","id","url","filename","mime_type","size_bytes","reactions"],"properties":{"type":{"type":"string","enum":["media"],"description":"Indicates this is a media attachment part"},"id":{"type":"string","format":"uuid","description":"Unique attachment identifier"},"url":{"type":"string","format":"uri","description":"Opaque Relay download URL for the Attachment."},"filename":{"type":"string","description":"Original filename"},"mime_type":{"type":"string","description":"MIME type of the file"},"size_bytes":{"type":"integer","description":"File size in bytes"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]},"duration_ms":{"oneOf":[{"type":"integer","minimum":0,"description":"Audio or video duration in milliseconds when known."},{"type":"null","minimum":0,"description":"Audio or video duration in milliseconds when known."}]},"width":{"oneOf":[{"type":"integer","minimum":1,"description":"Pixel width when known. Width and height are supplied together."},{"type":"null","minimum":1,"description":"Pixel width when known. Width and height are supplied together."}]},"height":{"oneOf":[{"type":"integer","minimum":1,"description":"Pixel height when known. Width and height are supplied together."},{"type":"null","minimum":1,"description":"Pixel height when known. Width and height are supplied together."}]}}},{"type":"object","description":"A rich link preview part","required":["type","value","reactions"],"properties":{"type":{"type":"string","enum":["link"],"description":"Indicates this is a rich link preview part"},"value":{"type":"string","description":"The URL"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","description":"A buttons part as read back","required":["type","items","reactions"],"properties":{"type":{"type":"string","enum":["buttons"]},"items":{"type":"array","items":{"type":"object","description":"One button as read back","required":["label"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}}},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","required":["type","title","options","has_responded","selected_values","selected_ids","reactions"],"properties":{"type":{"type":"string","enum":["selection"]},"title":{"type":"string","description":"The question, as the agent sent it after trimming."},"subtitle":{"type":"string","maxLength":512},"multiple":{"type":"boolean","default":true},"options":{"type":"array","minItems":1,"maxItems":25,"description":"All options in display order, including options from sections. Retained for clients that do not display groups.","items":{"type":"object","required":["id","value","label"],"properties":{"id":{"type":"string","minLength":1,"maxLength":200,"description":"Stable row identifier. For a legacy option, equals its value."},"value":{"type":"string","minLength":1,"maxLength":200,"description":"Compatibility alias, equal to id."},"label":{"type":"string","minLength":1,"maxLength":80,"description":"Stored label. Legacy labels can exceed the new 24-character input limit."},"subtitle":{"type":"string","maxLength":72},"image_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"}}}},"sections":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","required":["title","options"],"properties":{"title":{"type":"string","minLength":1,"maxLength":24},"options":{"type":"array","minItems":1,"maxItems":25,"items":{"type":"object","required":["id","value","label"],"properties":{"id":{"type":"string","minLength":1,"maxLength":200,"description":"Stable row identifier. For a legacy option, equals its value."},"value":{"type":"string","minLength":1,"maxLength":200,"description":"Compatibility alias, equal to id."},"label":{"type":"string","minLength":1,"maxLength":80,"description":"Stored label. Legacy labels can exceed the new 24-character input limit."},"subtitle":{"type":"string","maxLength":72},"image_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"}}}}}}},"reply_message":{"type":"object","additionalProperties":false,"required":["title"],"description":"Source-owned text for the answered bubble. Copied by the server into the answer metadata when supplied on the prompt. Does not replace the portable selected-label text.","properties":{"title":{"type":"string","minLength":1,"pattern":"\\S","maxLength":512,"description":"Answered bubble title, trimmed before storage."},"subtitle":{"type":"string","maxLength":512,"description":"Optional answered bubble subtitle, trimmed before storage; blank after trimming is stored as absent."}}},"selected_values":{"oneOf":[{"type":"array","readOnly":true,"items":{"type":"string"},"description":"The values the authenticated viewer chose, in source-option order, identical on every one of that user's devices; null until the viewer answers, when the answer Message no longer exists, and always for an agent viewer."},{"type":"null","readOnly":true,"items":{"type":"string"},"description":"The values the authenticated viewer chose, in source-option order, identical on every one of that user's devices; null until the viewer answers, when the answer Message no longer exists, and always for an agent viewer."}]},"selected_ids":{"oneOf":[{"type":"array","readOnly":true,"items":{"type":"string"},"description":"The authenticated viewer's selected option IDs in source order. Equal to selected_values, including for legacy options; null under the same conditions."},{"type":"null","readOnly":true,"items":{"type":"string"},"description":"The authenticated viewer's selected option IDs in source order. Equal to selected_values, including for legacy options; null under the same conditions."}]},"has_responded":{"type":"boolean","readOnly":true,"description":"Whether the authenticated viewer has durably answered this part. Claims are scoped to the responding user, never to an agent viewer. Existing Chat admission rules still apply, including at most one user per Chat. Acceptance advances this viewer's Message updated_at and sends a message.upserted for the source prompt to this user's devices."},"reactions":{"type":"null"}}},{"type":"object","required":["type","value","title","pages","has_responded","answers","reactions"],"properties":{"type":{"type":"string","enum":["form"]},"value":{"type":"string","readOnly":true,"description":"The form's received_message.title, else its title; the words a client that does not draw the form shows in its place."},"title":{"type":"string","minLength":1,"maxLength":80,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"},"pages":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"description":"One native form page. Pages appear in array order.","required":["id","title","fields"],"properties":{"id":{"type":"string","minLength":1,"maxLength":19,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Unique page id."},"title":{"type":"string","minLength":1,"maxLength":80,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"},"fields":{"type":"array","minItems":1,"maxItems":50,"items":{"oneOf":[{"type":"object","required":["id","type","label"],"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Unique across every page of this form. Responses use this id as the answer key."},"type":{"type":"string","enum":["text"]},"label":{"type":"string","minLength":1,"maxLength":20,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"},"placeholder":{"type":"string","description":"Text shown before the user enters or chooses a value."},"required":{"type":"boolean","default":false},"max_length":{"type":"integer","maximum":9007199254740991,"minimum":1,"description":"Maximum Unicode scalar characters. Defaults to 30 for single-line and 300 for multiline text; a positive explicit value overrides the default."},"multiline":{"type":"boolean","default":false,"description":"Allow line breaks and a native multiline text field."},"keyboard":{"type":"string","enum":["default","email","phone","number","url"],"default":"default","description":"The keyboard iOS shows. `email` and `phone` also check the answer: an email address, or an E.164 number such as +13135550123. A wrong one is refused with 422/2006. `number` and `url` only choose the keyboard."}},"additionalProperties":false},{"type":"object","required":["id","type","label","options"],"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Unique across every page of this form. Responses use this id as the answer key."},"type":{"type":"string","enum":["select"]},"label":{"type":"string","minLength":1,"maxLength":30,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"},"placeholder":{"type":"string","description":"Text shown before the user enters or chooses a value."},"required":{"type":"boolean","default":false},"multiple":{"type":"boolean","default":false,"description":"Return an array of values in source-option order when true, otherwise one string."},"options":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"object","additionalProperties":false,"required":["value","label"],"properties":{"value":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Stable case-sensitive value, unique within this field."},"label":{"type":"string","minLength":1,"maxLength":30,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"}}}}},"additionalProperties":false},{"type":"object","required":["id","type","label","options"],"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Unique across every page of this form. Responses use this id as the answer key."},"type":{"type":"string","enum":["picker"]},"label":{"type":"string","minLength":1,"maxLength":20,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"},"placeholder":{"type":"string","description":"Text shown before the user enters or chooses a value."},"required":{"type":"boolean","default":false},"options":{"type":"array","minItems":1,"maxItems":200,"items":{"type":"object","additionalProperties":false,"required":["value","label"],"properties":{"value":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Stable case-sensitive value, unique within this field."},"label":{"type":"string","minLength":1,"maxLength":30,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"}}}}},"additionalProperties":false},{"type":"object","description":"Collect a valid Gregorian calendar date as YYYY-MM-DD, independent of time zone.","required":["id","type","label"],"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","description":"Unique across every page of this form. Responses use this id as the answer key."},"type":{"type":"string","enum":["date"]},"label":{"type":"string","minLength":1,"maxLength":40,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"},"placeholder":{"type":"string","description":"Text shown before the user enters or chooses a value."},"required":{"type":"boolean","default":false,"description":"Maximum answer length. A calendar date is ten characters. Defaults to 10."},"min_date":{"type":"string","format":"date","pattern":"^(?!0000)[0-9]{4}-[0-9]{2}-[0-9]{2}$","default":"1900-01-01","description":"Earliest date the person can choose, YYYY-MM-DD. An earlier answer is refused. Not after max_date (checked by Relay)."},"max_date":{"type":"string","format":"date","pattern":"^(?!0000)[0-9]{4}-[0-9]{2}-[0-9]{2}$","default":"2100-12-31","description":"Latest date the person can choose, YYYY-MM-DD. A later answer is refused."}},"additionalProperties":false}]}}}}},"show_summary":{"type":"boolean","default":false},"splash":{"type":"object","additionalProperties":false,"description":"Optional introduction before the first field page.","required":["button_title"],"properties":{"title":{"type":"string","minLength":1,"maxLength":80,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"},"text":{"type":"string","minLength":0,"maxLength":4096},"button_title":{"type":"string","minLength":1,"maxLength":35,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"}}},"received_message":{"type":"object","additionalProperties":false,"description":"Optional received card text. Each native page uses its own page title.","required":["title"],"properties":{"title":{"type":"string","minLength":1,"maxLength":512,"pattern":"^(?![\\s\\p{Cf}]*$)\\S(?:[\\s\\S]*\\S)?$"},"subtitle":{"type":"string","minLength":0,"maxLength":512}}},"reply_message":{"type":"object","additionalProperties":false,"description":"Optional answered card subtitle. The answered title is Form sent.","required":["title"],"properties":{"title":{"type":"string","enum":["Form sent"]},"subtitle":{"type":"string","minLength":0,"maxLength":512}}},"has_responded":{"type":"boolean","readOnly":true,"description":"Whether the authenticated user has durably answered. False for agent viewers. Same-key retries return the original response; a different-key second answer returns 409/1005. Source message.upserted refreshes this user’s devices."},"answers":{"oneOf":[{"type":"object","description":"This viewer’s answers, null before answering or when the answer Message no longer exists; always null for agent viewers. Agents receive the form_response in the answer Message instead.","additionalProperties":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"maxItems":20,"uniqueItems":true}]}},{"type":"null","description":"This viewer’s answers, null before answering or when the answer Message no longer exists; always null for agent viewers. Agents receive the form_response in the answer Message instead."}]},"reactions":{"type":"null"}}},{"type":"object","description":"Persisted field-keyed answers delivered in normal Message events. Contributes no fallback text and cannot receive reactions.","required":["type","answers"],"properties":{"type":{"type":"string","enum":["form_response"]},"answers":{"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"additionalProperties":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$"},"maxItems":20,"uniqueItems":true}]},"description":"Answers keyed by source field id. Text, date, picker and single select use a string; multi-select uses unique option values in source order. A one-option multi-select represents opt-in. Optional unanswered fields may be omitted or use an empty value. Source fields enforce required values, max_length and allowed choices."}},"additionalProperties":false},{"type":"object","description":"Persisted selection metadata; contributes no fallback text and cannot receive reactions. selected_ids is source-derived. When the source supplies reply_message, it is copied into this answer so its bubble text remains available independently of the source.","required":["type","selected_values","selected_ids"],"properties":{"type":{"type":"string","enum":["selection_response"]},"selected_values":{"type":"array","minItems":1,"maxItems":25,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":200}},"selected_ids":{"type":"array","minItems":1,"maxItems":25,"uniqueItems":true,"readOnly":true,"items":{"type":"string","minLength":1,"maxLength":200}},"reply_message":{"type":"object","additionalProperties":false,"required":["title"],"description":"Source-owned text for the answered bubble. Copied by the server into the answer metadata when supplied on the prompt. Does not replace the portable selected-label text.","properties":{"title":{"type":"string","minLength":1,"pattern":"\\S","maxLength":512,"description":"Answered bubble title, trimmed before storage."},"subtitle":{"type":"string","maxLength":512,"description":"Optional answered bubble subtitle, trimmed before storage; blank after trimming is stored as absent."}},"readOnly":true}}},{"type":"object","description":"A rich_card part as read back.","required":["type","reactions"],"properties":{"type":{"type":"string","enum":["rich_card"]},"media":{"type":"object","additionalProperties":false,"description":"A card's picture or video. Drawn across the card's full width at `height` and opened full screen when tapped.","required":["type","url"],"properties":{"type":{"type":"string","enum":["image","video"]},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of the file."},"thumbnail_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of a still shown before a video plays."},"height":{"type":"string","enum":["short","medium","tall"],"default":"medium","description":"short is 112 pt, medium 168 pt, tall 264 pt."}}},"title":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"1 to 200 characters after trimming; never only whitespace."},"description":{"type":"string","minLength":1,"maxLength":2000,"pattern":"\\S","description":"1 to 2000 characters after trimming; never only whitespace."},"suggestions":{"type":"array","minItems":1,"maxItems":4,"description":"1 to 4 suggestions. Every reply `id` is unique within the part (checked by Relay; JSON Schema cannot express it).","items":{"oneOf":[{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","id"],"properties":{"type":{"type":"string","enum":["reply"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"id":{"type":"string","minLength":1,"maxLength":256,"description":"Your identifier for this reply, returned in the person's suggestion_response. Unique within the part, across every card of a carousel (checked by Relay; JSON Schema cannot express it)."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","url"],"properties":{"type":{"type":"string","enum":["open_url"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^[hH][tT][tT][pP][sS]?://","description":"An http or https URL. Other schemes are refused."},"application":{"type":"string","enum":["browser","webview"],"description":"webview opens the page inside Relay; browser, the default, opens the in-app browser the same way a link does."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","phone_number"],"properties":{"type":{"type":"string","enum":["dial"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"phone_number":{"type":"string","pattern":"^\\+[1-9]\\d{1,14}$","description":"E.164, for example +12223334444."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","latitude"],"properties":{"type":{"type":"string","enum":["view_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name."},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S"}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","query"],"properties":{"type":{"type":"string","enum":["view_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name."},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S"}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label"],"properties":{"type":{"type":"string","enum":["share_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","start_time","end_time","title"],"properties":{"type":{"type":"string","enum":["create_calendar_event"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"start_time":{"type":"string","format":"date-time"},"end_time":{"type":"string","format":"date-time","description":"Not before start_time."},"title":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"description":{"type":"string","maxLength":500}},"additionalProperties":false}]}},"reactions":{"oneOf":[{"type":"array","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","description":"A carousel part as read back.","required":["type","card_width","cards","reactions"],"properties":{"type":{"type":"string","enum":["carousel"]},"card_width":{"type":"string","enum":["small","medium"]},"cards":{"type":"array","items":{"oneOf":[{"type":"object","description":"One card. Needs at least one of media, title or description.","required":["media"],"properties":{"media":{"type":"object","additionalProperties":false,"description":"A card's picture or video. Drawn across the card's full width at `height` and opened full screen when tapped.","required":["type","url"],"properties":{"type":{"type":"string","enum":["image","video"]},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of the file."},"thumbnail_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of a still shown before a video plays."},"height":{"type":"string","enum":["short","medium","tall"],"default":"medium","description":"short is 112 pt, medium 168 pt, tall 264 pt."}}},"title":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"1 to 200 characters after trimming; never only whitespace."},"description":{"type":"string","minLength":1,"maxLength":2000,"pattern":"\\S","description":"1 to 2000 characters after trimming; never only whitespace."},"suggestions":{"type":"array","minItems":1,"maxItems":4,"description":"1 to 4 suggestions. Every reply `id` is unique within the part (checked by Relay; JSON Schema cannot express it).","items":{"oneOf":[{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","id"],"properties":{"type":{"type":"string","enum":["reply"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"id":{"type":"string","minLength":1,"maxLength":256,"description":"Your identifier for this reply, returned in the person's suggestion_response. Unique within the part, across every card of a carousel (checked by Relay; JSON Schema cannot express it)."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","url"],"properties":{"type":{"type":"string","enum":["open_url"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^[hH][tT][tT][pP][sS]?://","description":"An http or https URL. Other schemes are refused."},"application":{"type":"string","enum":["browser","webview"],"description":"webview opens the page inside Relay; browser, the default, opens the in-app browser the same way a link does."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","phone_number"],"properties":{"type":{"type":"string","enum":["dial"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"phone_number":{"type":"string","pattern":"^\\+[1-9]\\d{1,14}$","description":"E.164, for example +12223334444."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","latitude"],"properties":{"type":{"type":"string","enum":["view_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name."},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S"}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","query"],"properties":{"type":{"type":"string","enum":["view_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name."},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S"}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label"],"properties":{"type":{"type":"string","enum":["share_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","start_time","end_time","title"],"properties":{"type":{"type":"string","enum":["create_calendar_event"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"start_time":{"type":"string","format":"date-time"},"end_time":{"type":"string","format":"date-time","description":"Not before start_time."},"title":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"description":{"type":"string","maxLength":500}},"additionalProperties":false}]}}},"additionalProperties":false},{"type":"object","description":"One card. Needs at least one of media, title or description.","required":["title"],"properties":{"media":{"type":"object","additionalProperties":false,"description":"A card's picture or video. Drawn across the card's full width at `height` and opened full screen when tapped.","required":["type","url"],"properties":{"type":{"type":"string","enum":["image","video"]},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of the file."},"thumbnail_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of a still shown before a video plays."},"height":{"type":"string","enum":["short","medium","tall"],"default":"medium","description":"short is 112 pt, medium 168 pt, tall 264 pt."}}},"title":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"1 to 200 characters after trimming; never only whitespace."},"description":{"type":"string","minLength":1,"maxLength":2000,"pattern":"\\S","description":"1 to 2000 characters after trimming; never only whitespace."},"suggestions":{"type":"array","minItems":1,"maxItems":4,"description":"1 to 4 suggestions. Every reply `id` is unique within the part (checked by Relay; JSON Schema cannot express it).","items":{"oneOf":[{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","id"],"properties":{"type":{"type":"string","enum":["reply"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"id":{"type":"string","minLength":1,"maxLength":256,"description":"Your identifier for this reply, returned in the person's suggestion_response. Unique within the part, across every card of a carousel (checked by Relay; JSON Schema cannot express it)."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","url"],"properties":{"type":{"type":"string","enum":["open_url"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^[hH][tT][tT][pP][sS]?://","description":"An http or https URL. Other schemes are refused."},"application":{"type":"string","enum":["browser","webview"],"description":"webview opens the page inside Relay; browser, the default, opens the in-app browser the same way a link does."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","phone_number"],"properties":{"type":{"type":"string","enum":["dial"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"phone_number":{"type":"string","pattern":"^\\+[1-9]\\d{1,14}$","description":"E.164, for example +12223334444."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","latitude"],"properties":{"type":{"type":"string","enum":["view_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name."},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S"}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","query"],"properties":{"type":{"type":"string","enum":["view_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name."},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S"}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label"],"properties":{"type":{"type":"string","enum":["share_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","start_time","end_time","title"],"properties":{"type":{"type":"string","enum":["create_calendar_event"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"start_time":{"type":"string","format":"date-time"},"end_time":{"type":"string","format":"date-time","description":"Not before start_time."},"title":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"description":{"type":"string","maxLength":500}},"additionalProperties":false}]}}},"additionalProperties":false},{"type":"object","description":"One card. Needs at least one of media, title or description.","required":["description"],"properties":{"media":{"type":"object","additionalProperties":false,"description":"A card's picture or video. Drawn across the card's full width at `height` and opened full screen when tapped.","required":["type","url"],"properties":{"type":{"type":"string","enum":["image","video"]},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of the file."},"thumbnail_url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","description":"A public https URL of a still shown before a video plays."},"height":{"type":"string","enum":["short","medium","tall"],"default":"medium","description":"short is 112 pt, medium 168 pt, tall 264 pt."}}},"title":{"type":"string","minLength":1,"maxLength":200,"pattern":"\\S","description":"1 to 200 characters after trimming; never only whitespace."},"description":{"type":"string","minLength":1,"maxLength":2000,"pattern":"\\S","description":"1 to 2000 characters after trimming; never only whitespace."},"suggestions":{"type":"array","minItems":1,"maxItems":4,"description":"1 to 4 suggestions. Every reply `id` is unique within the part (checked by Relay; JSON Schema cannot express it).","items":{"oneOf":[{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","id"],"properties":{"type":{"type":"string","enum":["reply"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"id":{"type":"string","minLength":1,"maxLength":256,"description":"Your identifier for this reply, returned in the person's suggestion_response. Unique within the part, across every card of a carousel (checked by Relay; JSON Schema cannot express it)."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","url"],"properties":{"type":{"type":"string","enum":["open_url"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"url":{"type":"string","format":"uri","maxLength":2048,"pattern":"^[hH][tT][tT][pP][sS]?://","description":"An http or https URL. Other schemes are refused."},"application":{"type":"string","enum":["browser","webview"],"description":"webview opens the page inside Relay; browser, the default, opens the in-app browser the same way a link does."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","phone_number"],"properties":{"type":{"type":"string","enum":["dial"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"phone_number":{"type":"string","pattern":"^\\+[1-9]\\d{1,14}$","description":"E.164, for example +12223334444."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","latitude"],"properties":{"type":{"type":"string","enum":["view_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name."},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S"}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","query"],"properties":{"type":{"type":"string","enum":["view_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S","description":"The pin's name."},"query":{"type":"string","minLength":1,"maxLength":256,"pattern":"\\S"}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label"],"properties":{"type":{"type":"string","enum":["share_location"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."}},"additionalProperties":false},{"type":"object","description":"One suggestion on a card. A `reply` is sent back as the person's own message: a `text` part equal to\n`label`, then a `suggestion_response` part carrying `id`, replying to the card part. Every other type is an\naction the person's phone does itself and sends nothing back.\n","required":["type","label","start_time","end_time","title"],"properties":{"type":{"type":"string","enum":["create_calendar_event"]},"label":{"type":"string","minLength":1,"maxLength":25,"pattern":"\\S","description":"The button's words, 1 to 25 characters after trimming; never only whitespace."},"start_time":{"type":"string","format":"date-time"},"end_time":{"type":"string","format":"date-time","description":"Not before start_time."},"title":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"description":{"type":"string","maxLength":500}},"additionalProperties":false}]}}},"additionalProperties":false}]}},"reactions":{"oneOf":[{"type":"array","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","description":"The reply the person tapped, as the agent reads it. Contributes no fallback text.","required":["type","id","label"],"properties":{"type":{"type":"string","enum":["suggestion_response"]},"id":{"type":"string","description":"The reply suggestion's id, as the agent sent it."},"label":{"type":"string","description":"The reply suggestion's label, as the card showed it."}}},{"type":"object","description":"A payment card as every reader sees it, read from the payment request. `status` changes in place.","required":["type","payment_request_id","checkout_url","amount","currency","description","category","mode","status","reactions"],"properties":{"type":{"type":"string","enum":["payment"]},"payment_request_id":{"type":"string","format":"uuid"},"checkout_url":{"type":"string"},"amount":{"type":"integer","description":"In the currency's minor units. For a subscription, what the first period costs."},"currency":{"type":"string"},"description":{"type":"string","description":"The card's title line."},"category":{"type":"string","enum":["physical_goods","digital_goods","donation"],"description":"What is being paid for, the same three values as PayPal Orders v2 `items[].category` (PHYSICAL_GOODS, DIGITAL_GOODS, DONATION; developer.paypal.com/docs/api/orders/v2/). The App Store Review Guidelines (developer.apple.com/app-store/review/guidelines/) decide where each can be paid:\n- `physical_goods`: physical goods, and services used in the real world, such as a haircut or a ride (3.1.3(e)). Payable anywhere.\n- `digital_goods`: anything used in an app or online. A person pays by opening the link in Safari, and only on the United States storefront (3.1.1(a)); sending one to a person whose devices report only other storefronts returns 422 (error code `2006`). A tip to an agent or a creator is `digital_goods` (3.1.1: tips to digital content providers use In-App Purchase).\n- `donation`: money for a charity or a fundraiser. Collected outside the app, on any storefront (3.2.2(iv): such apps \"may only collect funds outside of the app, such as via Safari…\")."},"mode":{"type":"string","enum":["payment","subscription"]},"recurring":{"type":"object","additionalProperties":false,"description":"A subscription's renewal cadence, read from its Stripe Price.","required":["interval","interval_count"],"properties":{"interval":{"type":"string","enum":["day","week","month","year"]},"interval_count":{"type":"integer","minimum":1,"description":"Intervals per renewal (3 with `month` is quarterly)."}}},"image_url":{"type":"string","description":"The request's product picture, when it has one; the card shows it."},"status":{"type":"string","description":"A payment request's lifecycle. It leaves `requested` exactly once, and only on Stripe's word or your cancel.","enum":["requested","succeeded","canceled","expired"]},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part. Only a person can react to a payment.","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part. Only a person can react to a payment.","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","description":"The payer's receipt. When a payment request succeeds, Relay adds one message from the person who paid at the bottom of the chat, a reply to the `payment` card, carrying this part; your agent receives it as `message.received` like any message. The payer is the person who opened the payment in the Relay app, or, when Relay does not know who paid, the one person in a chat that holds the card. A group chat with no known payer gets no receipt. Expired and canceled requests add no message. Only Relay writes this part; sending one returns 400.","required":["type","payment_request_id","description","amount","currency","mode","reactions"],"properties":{"type":{"type":"string","enum":["payment_receipt"]},"payment_request_id":{"type":"string","format":"uuid"},"description":{"type":"string"},"amount":{"type":"integer","description":"What was paid, in the currency's minor units. For a subscription, what the first period cost."},"currency":{"type":"string"},"mode":{"type":"string","enum":["payment","subscription"]},"recurring":{"type":"object","additionalProperties":false,"description":"A subscription's renewal cadence, read from its Stripe Price.","required":["interval","interval_count"],"properties":{"interval":{"type":"string","enum":["day","week","month","year"]},"interval_count":{"type":"integer","minimum":1,"description":"Intervals per renewal (3 with `month` is quarterly)."}}},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","description":"A request for the person's location, sent by an agent with `POST /v1/chats/{chatId}/location/request`. It cannot be sent as a message part. A client that does not draw it shows the Message's text, \"\u003cagent display name> requested your location\".","required":["type","reactions"],"properties":{"type":{"type":"string","enum":["location_request"]},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","description":"A rating request from an agent. A client that does not draw it shows the Message's text, \"Enjoying \u003cagent display name>?\".","required":["type","value","rating","reactions"],"properties":{"type":{"type":"string","enum":["rating_request"]},"value":{"type":"string","description":"\"Enjoying \u003cagent display name>?\", the words a client that does not draw the card shows in its place."},"rating":{"oneOf":[{"type":"null","description":"The reader's own rating of the agent that asked, or null when the reader has not rated it. Nobody else's rating is shown here."},{"type":"object","description":"The reader's own rating of the agent that asked, or null when the reader has not rated it. Nobody else's rating is shown here.","required":["stars","review"],"properties":{"stars":{"type":"integer","minimum":1,"maximum":5},"review":{"oneOf":[{"type":"string","maxLength":1000},{"type":"null","maxLength":1000}]}},"additionalProperties":false}]},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","description":"An A2UI v1.0 card: every accepted message for each surface the part created, in order, exactly as sent, so every reader replays the same list.","required":["type","media_type","data","reactions"],"properties":{"type":{"type":"string","enum":["data"]},"media_type":{"type":"string","enum":["application/a2ui+json"]},"data":{"type":"array","items":{"type":"object"}},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","description":"A person's location share, the card the person's app draws. It carries the share's state, not its position: read the position with `GET /v1/chats/{chatId}/location`. It cannot be sent as a message part. A share whose `ends_at` has passed reads as `ended` with `ended_at` equal to `ends_at`.","required":["type","state","began_at","ends_at","ended_at","reactions"],"properties":{"type":{"type":"string","enum":["location"]},"state":{"type":"string","enum":["live","ended"]},"began_at":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]},"ends_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the share ends by itself; null when it has no end."},{"type":"null","format":"date-time","description":"When the share ends by itself; null when it has no end."}]},"ended_at":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","description":"A place sent once, as its sender sent it. `name` and `address` are absent when the sender left them out. A client that does not draw it shows the Message's text: the name, else the address, else \"Dropped Pin\".","required":["type","latitude","longitude","reactions"],"example":{"type":"place","latitude":37.44216251868683,"longitude":-122.16153582049394,"name":"Philz Coffee","address":"101 Forest Ave, Palo Alto, CA 94301","reactions":null},"properties":{"type":{"type":"string","enum":["place"]},"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180},"name":{"type":"string"},"address":{"type":"string"},"reactions":{"oneOf":[{"type":"array","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}},{"type":"null","description":"Reactions on this message part","items":{"type":"object","required":["is_me","handle","type"],"properties":{"is_me":{"type":"boolean","description":"Whether this reaction is from the current user"},"handle":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle"},"handle":{"type":"string","description":"Relay Handle."},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active"}]},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)"},{"type":"null","format":"date-time","description":"When they left (if applicable)"}]},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller."},{"type":"null","description":"Whether this handle is the authenticated caller."}]},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent."},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name."},{"type":"null","description":"Current Contact display name."}]},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely."}]},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture."}]},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null."}]},"verified":{"type":"boolean","description":"Whether Relay has verified this agent."},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"]},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one."},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one."}]},"verified":{"type":"boolean","description":"Whether Relay has verified the organization."}},"additionalProperties":false},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"]},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account."},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account."}]},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account."},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL."}]},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account."}]}},"additionalProperties":false},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns."}]},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"]},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"]},{"type":"null","maxLength":255,"examples":["Call"]}]},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"]},{"type":"null","maxLength":255,"examples":["Main"]}]}},"additionalProperties":false},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent."}]},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time."}]},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age."}]},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL."},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user."}]},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization."},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state."},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed."},"text":{"type":"string","description":"Current short activity description."},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji."},{"type":"null","description":"Optional Unicode emoji."}]},"updated_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived."}}},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity."}]}}},"type":{"type":"string","description":"Six standard tapbacks or a custom Unicode emoji.","enum":["love","like","dislike","laugh","emphasize","question","custom"]},"custom_emoji":{"oneOf":[{"type":"string","description":"Custom emoji if type is \"custom\", null otherwise"},{"type":"null","description":"Custom emoji if type is \"custom\", null otherwise"}]}}}}]}}},{"type":"object","required":["type","value","reactions"],"properties":{"type":{"type":"string","enum":["system"]},"value":{"type":"string"},"reactions":{"type":"null"}},"additionalProperties":false}]},"uniqueKey":"parts.oneOf.1","typeLabel":"null"}],"uniqueKey":"parts","typeLabel":"object[] | null"},"reply_to":{"oneOf":[{"type":"object","description":"Indicates this message is a threaded reply to another message","required":["message_id"],"properties":{"message_id":{"type":"string","format":"uuid","description":"The ID of the message to reply to","isRequired":true,"uniqueKey":"reply_to.oneOf.0.message_id","typeLabel":"string\u003cuuid>"},"part_index":{"type":"integer","format":"int32","description":"The specific message part to reply to (0-based index).\nDefaults to 0 (first part) if not provided.\nUse this when replying to a specific part of a multipart message.\nTargeting a `buttons` part returns 422 unless the message is a tap:\none `text` part equal to one of that part's plain button labels,\nsent by the user. An agent's reply to a `buttons` part returns 403.\nA selection response must explicitly supply this index and target a\n`selection` part. Only a user may answer, with exactly plain text\nthen `selection_response` metadata. Malformed shapes return 400/1005;\nmismatched source values, order or text return 422/2006; an already\nconsumed selection with a different key returns 409/1005.\nSame-key retries return the original Message, under normal Message\nidempotency and authorization rules.\n","minimum":0,"uniqueKey":"reply_to.oneOf.0.part_index","typeLabel":"integer\u003cint32>"}},"uniqueKey":"reply_to.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"reply_to.oneOf.1","typeLabel":"null"}],"uniqueKey":"reply_to","typeLabel":"object | null"},"thread":{"oneOf":[{"type":"object","description":"The thread this Message belongs to, or null when it is not a reply.","required":["originator_message_id","originator_part_index"],"properties":{"originator_message_id":{"type":"string","format":"uuid","description":"ID of the Message that opened the thread.","isRequired":true,"uniqueKey":"thread.oneOf.0.originator_message_id","typeLabel":"string\u003cuuid>"},"originator_part_index":{"type":"integer","format":"int32","minimum":0,"description":"Index of the originator's part that opened the thread (0-based).","isRequired":true,"uniqueKey":"thread.oneOf.0.originator_part_index","typeLabel":"integer\u003cint32>"}},"uniqueKey":"thread.oneOf.0","typeLabel":"object"},{"type":"null","description":"The thread this Message belongs to, or null when it is not a reply.","uniqueKey":"thread.oneOf.1","typeLabel":"null"}],"uniqueKey":"thread","typeLabel":"object | null"},"sent_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the message was sent","uniqueKey":"sent_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the message was sent","uniqueKey":"sent_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"sent_at","typeLabel":"string\u003cdate-time> | null"},"delivered_at":{"oneOf":[{"type":"string","format":"date-time","description":"When Relay accepted and stored the Message. For a committed Message, this is the same instant as created_at.","uniqueKey":"delivered_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When Relay accepted and stored the Message. For a committed Message, this is the same instant as created_at.","uniqueKey":"delivered_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"delivered_at","typeLabel":"string\u003cdate-time> | null"},"read_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the message was read","uniqueKey":"read_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the message was read","uniqueKey":"read_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"read_at","typeLabel":"string\u003cdate-time> | null"},"silent":{"type":"boolean","description":"Whether the sender sent this Message silently, so the recipient's device showed no banner and played no sound.","uniqueKey":"silent","typeLabel":"boolean"},"deliveries":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["contact","delivered_at","read_at"],"properties":{"contact":{"type":"object","required":["id","handle","joined_at","kind","display_name","image_url","image_color","subtitle","verified","is_contact"],"properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for this handle","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","description":"Relay Handle.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.handle","typeLabel":"string"},"joined_at":{"type":"string","format":"date-time","description":"When this participant joined the chat","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.joined_at","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether this Contact is a user or an agent.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.kind","typeLabel":"enum\u003cstring>"},"display_name":{"oneOf":[{"type":"string","description":"Current Contact display name.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Current Contact display name.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.display_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Current Contact picture, as a permanent address served by Relay. It does not expire and may be cached indefinitely.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.image_color","typeLabel":"string | null"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The one line under an agent's name. User Contacts return null.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.subtitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.subtitle","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified this agent.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.verified","typeLabel":"boolean"},"is_contact":{"type":"boolean","description":"Whether the caller holds this member as a Contact. A person's reply or adding the agent makes it a Contact. Removing a Contact keeps an existing conversation in Chats until another incoming message makes it a message request, unless the caller owns the agent or is a member of its organization.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.is_contact","typeLabel":"boolean"},"status":{"oneOf":[{"type":"string","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"deliveries.items.[INDEX].contact.status.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Participant status","enum":["active","left","removed"],"default":"active","uniqueKey":"deliveries.items.[INDEX].contact.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.status","typeLabel":"enum\u003cstring> | null"},"left_at":{"oneOf":[{"type":"string","format":"date-time","description":"When they left (if applicable)","uniqueKey":"deliveries.items.[INDEX].contact.left_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When they left (if applicable)","uniqueKey":"deliveries.items.[INDEX].contact.left_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.left_at","typeLabel":"string\u003cdate-time> | null"},"is_me":{"oneOf":[{"type":"boolean","description":"Whether this handle is the authenticated caller.","uniqueKey":"deliveries.items.[INDEX].contact.is_me.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this handle is the authenticated caller.","uniqueKey":"deliveries.items.[INDEX].contact.is_me.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.is_me","typeLabel":"boolean | null"},"owner":{"oneOf":[{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","name","verified"],"properties":{"kind":{"type":"string","enum":["organization"],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"name":{"oneOf":[{"type":"string","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The organization's name in Relay Console. Null until the organization has one.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.0.name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.0.name","typeLabel":"string | null"},"verified":{"type":"boolean","description":"Whether Relay has verified the organization.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.0.verified","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.0","typeLabel":"object"},{"type":"object","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","required":["kind","handle","display_name"],"properties":{"kind":{"type":"string","enum":["user"],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"handle":{"oneOf":[{"type":"string","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.handle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's Relay Handle. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.handle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.handle","typeLabel":"string | null"},"display_name":{"oneOf":[{"type":"string","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.display_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The owning person's display name. Null when the person has no Relay account.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.display_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.display_name","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Null when the person has no Relay account. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Null when the person has no Relay account. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"oneOf":[{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.links.oneOf.0.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.links.oneOf.0","typeLabel":"string\u003curi>[]"},{"type":"null","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Null when the person has no Relay account. Relay sends no platform name; read the site from the URL.","uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.links.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.links","typeLabel":"string\u003curi>[] | null"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none or have no Relay account.","uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1.about","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.1","typeLabel":"object"},{"type":"null","description":"Who owns this agent. Present only when kind is agent. Null for an agent that no organization or person owns.","uniqueKey":"deliveries.items.[INDEX].contact.owner.oneOf.2","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.owner","typeLabel":"object · object · null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"deliveries.items.[INDEX].contact.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.rive","typeLabel":"object | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"deliveries.items.[INDEX].contact.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"deliveries.items.[INDEX].contact.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"deliveries.items.[INDEX].contact.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"deliveries.items.[INDEX].contact.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"deliveries.items.[INDEX].contact.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"deliveries.items.[INDEX].contact.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"deliveries.items.[INDEX].contact.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"deliveries.items.[INDEX].contact.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.about","typeLabel":"string | null"},"activity_version":{"type":"string","pattern":"^(0|[1-9][0-9]*)$","description":"Activity state version for this participant in this chat. Older versions must not replace newer state.","uniqueKey":"deliveries.items.[INDEX].contact.activity_version","typeLabel":"string"},"activity":{"oneOf":[{"type":"object","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","required":["id","text","emoji","updated_at","expires_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Identifier of this activity, retained when it is renewed.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.activity.oneOf.0.id","typeLabel":"string\u003cuuid>"},"text":{"type":"string","description":"Current short activity description.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.activity.oneOf.0.text","typeLabel":"string"},"emoji":{"oneOf":[{"type":"string","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.activity.oneOf.0.emoji.oneOf.0","typeLabel":"string"},{"type":"null","description":"Optional Unicode emoji.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.activity.oneOf.0.emoji.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.activity.oneOf.0.emoji","typeLabel":"string | null"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.activity.oneOf.0.updated_at","typeLabel":"string\u003cdate-time>"},"expires_at":{"type":"string","format":"date-time","description":"Hide the activity at this time unless a newer renewal has arrived.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact.activity.oneOf.0.expires_at","typeLabel":"string\u003cdate-time>"}},"uniqueKey":"deliveries.items.[INDEX].contact.activity.oneOf.0","typeLabel":"object"},{"type":"null","description":"Current activity in this chat. Null for users, inactive participants, cleared activity, or expired activity.","uniqueKey":"deliveries.items.[INDEX].contact.activity.oneOf.1","typeLabel":"null"}],"uniqueKey":"deliveries.items.[INDEX].contact.activity","typeLabel":"object | null"}},"description":"Message recipient whose commit-time Delivered timestamp and explicit Read timestamp this row records.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].contact","typeLabel":"object"},"delivered_at":{"oneOf":[{"type":"string","format":"date-time","description":"When Relay accepted and stored the Message. Relay stamps the same Message commit time for every recipient.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].delivered_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When Relay accepted and stored the Message. Relay stamps the same Message commit time for every recipient.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].delivered_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].delivered_at","typeLabel":"string\u003cdate-time> | null"},"read_at":{"oneOf":[{"type":"string","format":"date-time","description":"When this recipient marked the Chat Read. Read implies Delivered.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].read_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When this recipient marked the Chat Read. Read implies Delivered.","isRequired":true,"uniqueKey":"deliveries.items.[INDEX].read_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"deliveries.items.[INDEX].read_at","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"deliveries.items.[INDEX]","typeLabel":"object"},"description":"Per-recipient Delivered and Read truth for direct and group Chats. Relay derives this because it controls every recipient endpoint.","uniqueKey":"deliveries","typeLabel":"object[]"},"system_event":{"oneOf":[{"type":"object","required":["type","actor","subject","value","icon_attachment_id","contact_card","call"],"properties":{"type":{"type":"string","enum":["chat_created","participant_added","participant_removed","group_name_updated","group_icon_updated","contact_card_shared","call"],"description":"What happened. For call the actor is the caller, the subject is the callee, and call carries the Call's live state.","isRequired":true,"uniqueKey":"system_event.oneOf.0.type","typeLabel":"enum\u003cstring>"},"actor":{"type":"object","additionalProperties":false,"description":"Who did it, with the name and picture a client shows beside the event, as a group shows a message's sender.","required":["id","handle","kind","display_name","image_url","image_color"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"system_event.oneOf.0.actor.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","isRequired":true,"uniqueKey":"system_event.oneOf.0.actor.handle","typeLabel":"string"},"kind":{"type":"string","enum":["user","agent"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.actor.kind","typeLabel":"enum\u003cstring>"},"display_name":{"type":"string","description":"First and last name joined by a space; empty when the Contact has none.","isRequired":true,"uniqueKey":"system_event.oneOf.0.actor.display_name","typeLabel":"string"},"image_url":{"oneOf":[{"type":"string","format":"uri","isRequired":true,"uniqueKey":"system_event.oneOf.0.actor.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","isRequired":true,"uniqueKey":"system_event.oneOf.0.actor.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.actor.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits.","isRequired":true,"uniqueKey":"system_event.oneOf.0.actor.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits.","isRequired":true,"uniqueKey":"system_event.oneOf.0.actor.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.actor.image_color","typeLabel":"string | null"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"system_event.oneOf.0.actor.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"system_event.oneOf.0.actor.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.actor.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"system_event.oneOf.0.actor.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"system_event.oneOf.0.actor.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.actor.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"system_event.oneOf.0.actor.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"system_event.oneOf.0.actor.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"system_event.oneOf.0.actor.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"system_event.oneOf.0.actor.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.actor.about","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"system_event.oneOf.0.actor","typeLabel":"object"},"subject":{"oneOf":[{"type":"object","required":["id","handle","kind"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"system_event.oneOf.0.subject.oneOf.0.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","isRequired":true,"uniqueKey":"system_event.oneOf.0.subject.oneOf.0.handle","typeLabel":"string"},"kind":{"type":"string","enum":["user","agent"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.subject.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"system_event.oneOf.0.subject.oneOf.0.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"system_event.oneOf.0.subject.oneOf.0.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.subject.oneOf.0.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"system_event.oneOf.0.subject.oneOf.0.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"system_event.oneOf.0.subject.oneOf.0.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.subject.oneOf.0.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"system_event.oneOf.0.subject.oneOf.0.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"system_event.oneOf.0.subject.oneOf.0.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"system_event.oneOf.0.subject.oneOf.0.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"system_event.oneOf.0.subject.oneOf.0.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.subject.oneOf.0.about","typeLabel":"string | null"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"system_event.oneOf.0.subject.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"system_event.oneOf.0.subject.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.subject","typeLabel":"object | null"},"value":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"system_event.oneOf.0.value.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"system_event.oneOf.0.value.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.value","typeLabel":"string | null"},"icon_attachment_id":{"oneOf":[{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"system_event.oneOf.0.icon_attachment_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","isRequired":true,"uniqueKey":"system_event.oneOf.0.icon_attachment_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.icon_attachment_id","typeLabel":"string\u003cuuid> | null"},"contact_card":{"oneOf":[{"type":"object","required":["handle","first_name","is_active","is_verified","kind","last_name","image_url","image_color"],"properties":{"first_name":{"type":"string","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.first_name","typeLabel":"string"},"last_name":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.last_name.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.last_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.last_name","typeLabel":"string | null"},"image_url":{"oneOf":[{"type":"string","format":"uri","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.image_url","typeLabel":"string\u003curi> | null"},"image_color":{"oneOf":[{"type":"string","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.image_color.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^[0-9A-F]{6}$","description":"Dominant colour of the picture at image_url, six uppercase hex digits, computed by Relay once when the picture is set. Null when Relay could not read the picture.","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.image_color.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.image_color","typeLabel":"string | null"},"is_active":{"type":"boolean","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.is_active","typeLabel":"boolean"},"is_verified":{"type":"boolean","description":"Whether Relay has verified this agent. Always false for a user.","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.is_verified","typeLabel":"boolean"},"handle":{"type":"string","description":"Relay Handle associated with this contact card. Empty (\"\") only on a shared person's card after they deleted their account.","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.handle","typeLabel":"string"},"kind":{"type":"string","enum":["user","agent"],"description":"Whether the Contact is a user or an agent.","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, or null. Set it with PATCH `rive`.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, or null. Set it with PATCH `rive`.","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.rive","typeLabel":"object | null"},"id":{"type":"string","format":"uuid","description":"The shared Contact's id, present only on a card shared by handle or user_id. Open an agent by this id; the handle may since have changed.","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.id","typeLabel":"string\u003cuuid>"},"subtitle":{"oneOf":[{"type":"string","maxLength":60,"description":"The shared agent's subtitle when it was shared, present only on a card shared by handle.","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.subtitle.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":60,"description":"The shared agent's subtitle when it was shared, present only on a card shared by handle.","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.subtitle.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.subtitle","typeLabel":"string | null"},"url":{"type":"string","format":"uri","description":"Relay link that opens the shared agent's chat, present only on a card shared by handle. The card's other fields are a snapshot taken when it was shared and never change.","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.url","typeLabel":"string\u003curi>"},"description":{"oneOf":[{"type":"string","maxLength":2000,"description":"Detailed agent description. Required for public agents; null clears it otherwise.","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":2000,"description":"Detailed agent description. Required for public agents; null clears it otherwise.","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.description.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.description","typeLabel":"string | null"},"links":{"type":"array","maxItems":5,"items":{"type":"string","format":"uri","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.links.items.[INDEX]","typeLabel":"string\u003curi>"},"description":"A shared person's profile links when the card was shared, present only on a person's card. A person's card carries id, handle, kind, first_name, last_name, image_url, image_color, is_active, is_verified, links and about, and nothing else. Empty after the person deleted their account.","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"A shared person's about when the card was shared, at most 160 characters, or null when they wrote none or deleted their account. Present only on a person's card.","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"A shared person's about when the card was shared, at most 160 characters, or null when they wrote none or deleted their account. Present only on a person's card.","uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0.about","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.contact_card","typeLabel":"object | null"},"call":{"oneOf":[{"type":"object","description":"The Call this event marks. Null unless type is call.","required":["id","status","answered_at","ended_at","from","to","duration_seconds"],"properties":{"id":{"type":"string","format":"uuid","description":"The Call's id.","isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.id","typeLabel":"string\u003cuuid>"},"status":{"type":"string","description":"The same values as Call.status.","enum":["ringing","in-progress","completed","no-answer","canceled","busy","failed"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.status","typeLabel":"enum\u003cstring>"},"answered_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.answered_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.answered_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.answered_at","typeLabel":"string\u003cdate-time> | null"},"ended_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.ended_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.ended_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.ended_at","typeLabel":"string\u003cdate-time> | null"},"from":{"type":"object","additionalProperties":false,"required":["id","handle","kind"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.handle","typeLabel":"string"},"kind":{"type":"string","enum":["user","agent"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.kind","typeLabel":"enum\u003cstring>"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.about.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.about","typeLabel":"string | null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from.rive","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.from","typeLabel":"object"},"to":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","additionalProperties":false,"required":["id","handle","kind"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"handle":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].handle","typeLabel":"string"},"kind":{"type":"string","enum":["user","agent"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"timezone":{"oneOf":[{"type":"string","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].timezone.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":64,"examples":["America/Detroit"],"description":"The person's IANA time zone name, as their Relay app last reported it; null until the app reports one. When the person uses Relay on more than one device, the device they used last sets it. Present only when kind is user. Timestamps stay in UTC; use this to read them in the person's local time.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].timezone","typeLabel":"string | null"},"age_range":{"oneOf":[{"type":"string","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].age_range.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["under_13","13_15","16_17","18_plus",null],"examples":["18_plus"],"description":"The person's age range, as their Relay app last reported it: from Apple's Declared Age Range, or from a birth year the person gave once (only the range is kept). Null until the app reports one. Present only when kind is user. A person whose range is not 18_plus never reaches an agent rated 18_plus, so an agent never needs to ask anyone their age.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].age_range.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].age_range","typeLabel":"enum\u003cstring> | null"},"links":{"type":"array","maxItems":5,"uniqueItems":true,"items":{"type":"string","format":"uri","maxLength":2048,"pattern":"^https://","uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].links.items.[INDEX]","typeLabel":"string\u003curi>"},"examples":[["https://github.com/ana","https://www.instagram.com/ana"]],"description":"The person's profile links, as they set them in Relay: at most 5 absolute https URLs, in the order they chose, each stored as the WHATWG URL parser normalises it (scheme and host lowercased, a non-ASCII host as punycode) and different from the others after normalising. Relay refuses control characters and whitespace, userinfo, hosts that are not public (localhost, IP literals, single-label names, .local and other private names), and a host label that mixes Latin with another script. Empty when they set none. Present only when kind is user. Relay sends no platform name; read the site from the URL.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].links","typeLabel":"string\u003curi>[]"},"about":{"oneOf":[{"type":"string","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].about.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":160,"examples":["Builds robots in Ann Arbor."],"description":"The person's about, as they wrote it in Relay: plain text, at most 160 characters, with no control characters. Null when they wrote none. Present only when kind is user.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].about.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].about","typeLabel":"string | null"},"rive":{"oneOf":[{"type":"object","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","required":["file","artboard","state_machine","view_model"],"properties":{"file":{"type":"string","format":"uri","description":"The .riv Relay hosts, at a permanent address that never changes its bytes: `\u003ccdn>/rive/\u003ccontact id>/\u003cversion>/file-\u003chash>.riv`.","examples":["https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0.file","typeLabel":"string\u003curi>"},"artboard":{"oneOf":[{"type":"string","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0.artboard.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Call"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0.artboard.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0.artboard","typeLabel":"string | null"},"state_machine":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0.state_machine.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0.state_machine.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0.state_machine","typeLabel":"string | null"},"view_model":{"oneOf":[{"type":"string","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0.view_model.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"examples":["Main"],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0.view_model.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0.view_model","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Rive file this agent shows in its calls, so the app can load it before the call connects. Null when it has none. Present only when kind is agent.","uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX].rive","typeLabel":"object | null"}},"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.to","typeLabel":"object[]"},"duration_seconds":{"oneOf":[{"type":"integer","minimum":0,"description":"Whole seconds from answered to ended. Null when the Call was never answered or has not ended.","isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.duration_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"Whole seconds from answered to ended. Null when the Call was never answered or has not ended.","isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.duration_seconds.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0.duration_seconds","typeLabel":"integer | null"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.0","typeLabel":"object"},{"type":"null","description":"The Call this event marks. Null unless type is call.","isRequired":true,"uniqueKey":"system_event.oneOf.0.call.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"system_event.oneOf.0.call","typeLabel":"object | null"}},"additionalProperties":false,"uniqueKey":"system_event.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"system_event.oneOf.1","typeLabel":"null"}],"uniqueKey":"system_event","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","chat_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","is_from_me":true,"delivery_status":"sent","created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z","is_system_message":true,"from":"\u003cstring>","from_handle":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","handle":"\u003cstring>","joined_at":"2023-11-07T05:31:56Z","kind":"user","display_name":"\u003cstring>","image_url":"\u003cstring>","image_color":"\u003cstring>","subtitle":"\u003cstring>","verified":true,"is_contact":true,"status":"active","left_at":"2023-11-07T05:31:56Z","is_me":true,"owner":{"kind":"organization","name":"\u003cstring>","verified":true},"rive":{"file":"https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv","artboard":"Call","state_machine":"Main","view_model":"Main"},"timezone":"America/Detroit","age_range":"18_plus","links":["https://github.com/ana","https://www.instagram.com/ana"],"about":"Builds robots in Ann Arbor.","activity_version":"\u003cstring>","activity":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","text":"\u003cstring>","emoji":"\u003cstring>","updated_at":"2023-11-07T05:31:56Z","expires_at":"2023-11-07T05:31:56Z"}},"parts":[{"type":"text","value":"\u003cstring>","reactions":[{"is_me":true,"handle":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","handle":"\u003cstring>","joined_at":"2023-11-07T05:31:56Z","kind":"user","display_name":"\u003cstring>","image_url":"\u003cstring>","image_color":"\u003cstring>","subtitle":"\u003cstring>","verified":true,"is_contact":true,"status":"active","left_at":"2023-11-07T05:31:56Z","is_me":true,"owner":{"kind":"organization","name":"\u003cstring>","verified":true},"rive":{"file":"https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv","artboard":"Call","state_machine":"Main","view_model":"Main"},"timezone":"America/Detroit","age_range":"18_plus","links":["https://github.com/ana","https://www.instagram.com/ana"],"about":"Builds robots in Ann Arbor.","activity_version":"\u003cstring>","activity":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","text":"\u003cstring>","emoji":"\u003cstring>","updated_at":"2023-11-07T05:31:56Z","expires_at":"2023-11-07T05:31:56Z"}},"type":"love","custom_emoji":"\u003cstring>"}],"mentions":[{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","handle":"\u003cstring>","is_me":true,"range":[1]}],"mention":"\u003cstring>","mention_range":"\u003carray>"}],"reply_to":{"message_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","part_index":1},"thread":{"originator_message_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","originator_part_index":1},"sent_at":"2023-11-07T05:31:56Z","delivered_at":"2023-11-07T05:31:56Z","read_at":"2023-11-07T05:31:56Z","silent":true,"deliveries":[{"contact":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","handle":"\u003cstring>","joined_at":"2023-11-07T05:31:56Z","kind":"user","display_name":"\u003cstring>","image_url":"\u003cstring>","image_color":"\u003cstring>","subtitle":"\u003cstring>","verified":true,"is_contact":true,"status":"active","left_at":"2023-11-07T05:31:56Z","is_me":true,"owner":{"kind":"organization","name":"\u003cstring>","verified":true},"rive":{"file":"https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv","artboard":"Call","state_machine":"Main","view_model":"Main"},"timezone":"America/Detroit","age_range":"18_plus","links":["https://github.com/ana","https://www.instagram.com/ana"],"about":"Builds robots in Ann Arbor.","activity_version":"\u003cstring>","activity":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","text":"\u003cstring>","emoji":"\u003cstring>","updated_at":"2023-11-07T05:31:56Z","expires_at":"2023-11-07T05:31:56Z"}},"delivered_at":"2023-11-07T05:31:56Z","read_at":"2023-11-07T05:31:56Z"}],"system_event":{"type":"chat_created","actor":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","handle":"\u003cstring>","kind":"user","display_name":"\u003cstring>","image_url":"\u003cstring>","image_color":"\u003cstring>","timezone":"America/Detroit","age_range":"18_plus","links":["https://github.com/ana","https://www.instagram.com/ana"],"about":"Builds robots in Ann Arbor."},"subject":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","handle":"\u003cstring>","kind":"user","timezone":"America/Detroit","age_range":"18_plus","links":["https://github.com/ana","https://www.instagram.com/ana"],"about":"Builds robots in Ann Arbor."},"value":"\u003cstring>","icon_attachment_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","contact_card":{"first_name":"\u003cstring>","last_name":"\u003cstring>","image_url":"\u003cstring>","image_color":"\u003cstring>","is_active":true,"is_verified":true,"handle":"\u003cstring>","kind":"user","rive":{"file":"https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv","artboard":"Call","state_machine":"Main","view_model":"Main"},"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","subtitle":"\u003cstring>","url":"\u003cstring>","description":"\u003cstring>","links":["\u003cstring>"],"about":"Builds robots in Ann Arbor."},"call":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","status":"ringing","answered_at":"2023-11-07T05:31:56Z","ended_at":"2023-11-07T05:31:56Z","from":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","handle":"\u003cstring>","kind":"user","timezone":"America/Detroit","age_range":"18_plus","links":["https://github.com/ana","https://www.instagram.com/ana"],"about":"Builds robots in Ann Arbor.","rive":{"file":"https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv","artboard":"Call","state_machine":"Main","view_model":"Main"}},"to":[{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","handle":"\u003cstring>","kind":"user","timezone":"America/Detroit","age_range":"18_plus","links":["https://github.com/ana","https://www.instagram.com/ana"],"about":"Builds robots in Ann Arbor.","rive":{"file":"https://cdn.relayapp.im/rive/0199a000-0000-7000-8000-00000000000b/1790000000000/file-0123456789abcdef.riv","artboard":"Call","state_machine":"Main","view_model":"Main"}}],"duration_seconds":1}}}}},"exampleType":"generated"}},"exampleType":"generated"},"3ca49c41-1cd0-44e9-ad21-df033777787f":{"description":"Unauthorized - missing or invalid authentication","content":{"application/json":{"schema":{"type":"object","required":["error","success"],"properties":{"error":{"type":"object","required":["status","code","message","doc_url"],"properties":{"status":{"type":"integer","description":"HTTP status code (e.g., 400, 404, 500)","isRequired":true,"uniqueKey":"error.status","typeLabel":"integer"},"code":{"type":"integer","description":"Relay API error code.","isRequired":true,"uniqueKey":"error.code","typeLabel":"integer"},"message":{"type":"string","description":"Human-readable error message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","description":"Link to documentation for this error code","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string"},"retry_after":{"type":"integer","description":"Number of seconds to wait before retrying. Only present on 429 rate limit errors.","uniqueKey":"error.retry_after","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"success":{"type":"boolean","description":"Always false for error responses","isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"trace_id":{"type":"string","description":"Unique trace ID for request tracing and debugging","uniqueKey":"trace_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"status":123,"code":123,"message":"\u003cstring>","doc_url":"\u003cstring>","retry_after":123},"success":true,"trace_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"b5420181-9f83-4334-9b5c-434d8c8cf281":{"description":"Forbidden - no access to this resource","content":{"application/json":{"schema":{"type":"object","required":["error","success"],"properties":{"error":{"type":"object","required":["status","code","message","doc_url"],"properties":{"status":{"type":"integer","description":"HTTP status code (e.g., 400, 404, 500)","isRequired":true,"uniqueKey":"error.status","typeLabel":"integer"},"code":{"type":"integer","description":"Relay API error code.","isRequired":true,"uniqueKey":"error.code","typeLabel":"integer"},"message":{"type":"string","description":"Human-readable error message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","description":"Link to documentation for this error code","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string"},"retry_after":{"type":"integer","description":"Number of seconds to wait before retrying. Only present on 429 rate limit errors.","uniqueKey":"error.retry_after","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"success":{"type":"boolean","description":"Always false for error responses","isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"trace_id":{"type":"string","description":"Unique trace ID for request tracing and debugging","uniqueKey":"trace_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"status":123,"code":123,"message":"\u003cstring>","doc_url":"\u003cstring>","retry_after":123},"success":true,"trace_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"3ed4675c-0f3e-4353-a1e9-d5c6fc6a9142":{"description":"Resource not found","content":{"application/json":{"schema":{"type":"object","required":["error","success"],"properties":{"error":{"type":"object","required":["status","code","message","doc_url"],"properties":{"status":{"type":"integer","description":"HTTP status code (e.g., 400, 404, 500)","isRequired":true,"uniqueKey":"error.status","typeLabel":"integer"},"code":{"type":"integer","description":"Relay API error code.","isRequired":true,"uniqueKey":"error.code","typeLabel":"integer"},"message":{"type":"string","description":"Human-readable error message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","description":"Link to documentation for this error code","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string"},"retry_after":{"type":"integer","description":"Number of seconds to wait before retrying. Only present on 429 rate limit errors.","uniqueKey":"error.retry_after","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"success":{"type":"boolean","description":"Always false for error responses","isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"trace_id":{"type":"string","description":"Unique trace ID for request tracing and debugging","uniqueKey":"trace_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"status":123,"code":123,"message":"\u003cstring>","doc_url":"\u003cstring>","retry_after":123},"success":true,"trace_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"0829f670-a2b1-4662-9e4c-daf0e8a5d520":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["error","success"],"properties":{"error":{"type":"object","required":["status","code","message","doc_url"],"properties":{"status":{"type":"integer","description":"HTTP status code (e.g., 400, 404, 500)","isRequired":true,"uniqueKey":"error.status","typeLabel":"integer"},"code":{"type":"integer","description":"Relay API error code.","isRequired":true,"uniqueKey":"error.code","typeLabel":"integer"},"message":{"type":"string","description":"Human-readable error message","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"doc_url":{"type":"string","description":"Link to documentation for this error code","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string"},"retry_after":{"type":"integer","description":"Number of seconds to wait before retrying. Only present on 429 rate limit errors.","uniqueKey":"error.retry_after","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"},"success":{"type":"boolean","description":"Always false for error responses","isRequired":true,"uniqueKey":"success","typeLabel":"boolean"},"trace_id":{"type":"string","description":"Unique trace ID for request tracing and debugging","uniqueKey":"trace_id","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"status":123,"code":123,"message":"\u003cstring>","doc_url":"\u003cstring>","retry_after":123},"success":true,"trace_id":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"85710b44-5150-40fa-90b9-a2c72bc751e7":{"BearerAuth":{"type":"http","scheme":"bearer","description":"Bearer token authentication. Include your API token in the Authorization header.\n\nFormat: `Authorization: Bearer \u003cyour-token>`\n","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"5fe554b7-ad2b-4bee-af8d-aab2bdda93ef":{"url":"https://api.staging.relayapp.im","description":"Relay API"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Bearer token authentication. Include your API token in the Authorization header.\n\nFormat: `Authorization: Bearer \u003cyour-token>`\n","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer token authentication. Include your API token in the Authorization header.\n\nFormat: `Authorization: Bearer \u003cyour-token>`\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"api-reference/openapi.mint.yaml"},"subdomain":"relay-staging","siteName":"Relay","title":"Get a message by ID - Relay","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T07:49:38.843Z","originalFileLocation":"api-reference/messages/get-a-message-by-id.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=\"Retrieve one visible Message.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Relay\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/relay-staging/7Bc1RjtNZkUJGQ72/_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/relay-staging/7Bc1RjtNZkUJGQ72/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/relay-staging/7Bc1RjtNZkUJGQ72/_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/relay-staging/7Bc1RjtNZkUJGQ72/_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/relay-staging/7Bc1RjtNZkUJGQ72/_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/relay-staging/7Bc1RjtNZkUJGQ72/_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/relay-staging/7Bc1RjtNZkUJGQ72/_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/relay-staging/7Bc1RjtNZkUJGQ72/_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/relay-staging/7Bc1RjtNZkUJGQ72/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Get a message by ID - Relay\">\u003cmeta data-mint-head property=\"og:description\" content=\"Retrieve one visible Message.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Relay\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.staging.relayapp.im/api-reference/messages/get-a-message-by-id\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.staging.relayapp.im/images/og-image.png\">\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=\"Get a message by ID - Relay\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Retrieve one visible Message.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.staging.relayapp.im/images/og-image.png\">\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/relay-staging/7Bc1RjtNZkUJGQ72/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Relay\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#006BE6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.staging.relayapp.im/api-reference/messages/get-a-message-by-id\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/messages/get-a-message-by-id.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.staging.relayapp.im/#organization\",\"name\":\"Relay\",\"url\":\"https://docs.staging.relayapp.im\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/relay-staging/fjL9_TNOlSXF6Cqt/logo/light.png?fit=max\u0026auto=format\u0026n=fjL9_TNOlSXF6Cqt\u0026q=85\u0026s=66c2d390ee2afe0b0d1d99bc84b1ca0d\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.staging.relayapp.im#website\",\"name\":\"Relay\",\"url\":\"https://docs.staging.relayapp.im\",\"publisher\":{\"@id\":\"https://docs.staging.relayapp.im/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.staging.relayapp.im/api-reference/messages/get-a-message-by-id#webpage\",\"url\":\"https://docs.staging.relayapp.im/api-reference/messages/get-a-message-by-id\",\"name\":\"Get a message by ID\",\"description\":\"Retrieve one visible Message.\",\"dateModified\":\"2026-10-22T07:49:38.843Z\",\"isPartOf\":{\"@id\":\"https://docs.staging.relayapp.im#website\"},\"breadcrumb\":{\"@id\":\"https://docs.staging.relayapp.im/api-reference/messages/get-a-message-by-id#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.staging.relayapp.im/api-reference/messages/get-a-message-by-id#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Messages\",\"item\":\"https://docs.staging.relayapp.im/api-reference/resources/messages/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Get a message by ID\",\"item\":\"https://docs.staging.relayapp.im/api-reference/messages/get-a-message-by-id\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.staging.relayapp.im/api-reference/messages/get-a-message-by-id#apireference\",\"headline\":\"Get a message by ID\",\"name\":\"Get a message by ID\",\"description\":\"Retrieve one visible Message.\",\"url\":\"https://docs.staging.relayapp.im/api-reference/messages/get-a-message-by-id\",\"mainEntityOfPage\":{\"@id\":\"https://docs.staging.relayapp.im/api-reference/messages/get-a-message-by-id#webpage\"},\"image\":\"https://docs.staging.relayapp.im/images/og-image.png\",\"dateModified\":\"2026-10-22T07:49:38.843Z\",\"publisher\":{\"@id\":\"https://docs.staging.relayapp.im/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.staging.relayapp.im#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Relay\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Relay","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"CLI","pages":[{"title":"CLI","href":"/cli"}]},{"tab":"Webhook Events","pages":[{"title":"Webhook Events","href":"/events"}]},{"tab":"Error Codes","pages":[{"title":"Error Codes","href":"/api-reference/errors"}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"API overview","sidebarTitle":"Overview","href":"/api-reference/overview"}]},{"group":"Chats","expanded":false,"pages":[{"title":"Chats","sidebarTitle":"Overview","href":"/api-reference/resources/chats/overview"},{"title":"Create a new chat","deprecated":null,"version":null,"sidebarTitle":"Create","openapi":"/api-reference/openapi.mint.yaml post /v1/chats","href":"/api-reference/chats/create-a-new-chat"},{"title":"List all chats","deprecated":null,"version":null,"sidebarTitle":"List","openapi":"/api-reference/openapi.mint.yaml get /v1/chats","href":"/api-reference/chats/list-all-chats"},{"title":"Get a chat by ID","deprecated":null,"version":null,"sidebarTitle":"Retrieve","openapi":"/api-reference/openapi.mint.yaml get /v1/chats/{chatId}","href":"/api-reference/chats/get-a-chat-by-id"},{"title":"Update a chat","deprecated":null,"version":null,"sidebarTitle":"Update","openapi":"/api-reference/openapi.mint.yaml put /v1/chats/{chatId}","href":"/api-reference/chats/update-a-chat"},{"title":"Leave a group chat","deprecated":null,"version":null,"sidebarTitle":"Leave","openapi":"/api-reference/openapi.mint.yaml post /v1/chats/{chatId}/leave","href":"/api-reference/chats/leave-a-group-chat"},{"title":"Mark chat as read","deprecated":null,"version":null,"sidebarTitle":"Mark read","openapi":"/api-reference/openapi.mint.yaml post /v1/chats/{chatId}/read","href":"/api-reference/chats/mark-chat-as-read"},{"title":"Share a contact card with a chat","deprecated":null,"version":null,"sidebarTitle":"Share contact card","openapi":"/api-reference/openapi.mint.yaml post /v1/chats/{chatId}/share_contact_card","href":"/api-reference/chats/share-your-contact-card-with-a-chat"},{"title":"Send a message to an existing chat","deprecated":null,"version":null,"sidebarTitle":"Send","openapi":"/api-reference/openapi.mint.yaml post /v1/chats/{chatId}/messages","href":"/api-reference/messages/send-a-message-to-an-existing-chat"},{"title":"Get messages from a chat","deprecated":null,"version":null,"sidebarTitle":"List","openapi":"/api-reference/openapi.mint.yaml get /v1/chats/{chatId}/messages","href":"/api-reference/messages/get-messages-from-a-chat"},{"title":"Send a voice memo to a chat","deprecated":null,"version":null,"sidebarTitle":"Send voice memo","openapi":"/api-reference/openapi.mint.yaml post /v1/chats/{chatId}/voicememo","href":"/api-reference/messages/send-a-voice-memo-to-a-chat"},{"title":"Add a participant to a chat","deprecated":null,"version":null,"sidebarTitle":"Add","openapi":"/api-reference/openapi.mint.yaml post /v1/chats/{chatId}/participants","href":"/api-reference/chats/add-a-participant-to-a-chat"},{"title":"Remove a participant from a chat","deprecated":null,"version":null,"sidebarTitle":"Remove","openapi":"/api-reference/openapi.mint.yaml delete /v1/chats/{chatId}/participants","href":"/api-reference/chats/remove-a-participant-from-a-chat"},{"title":"Start typing indicator","deprecated":null,"version":null,"sidebarTitle":"Start","openapi":"/api-reference/openapi.mint.yaml post /v1/chats/{chatId}/typing","href":"/api-reference/chats/start-typing-indicator"},{"title":"Stop typing indicator","deprecated":null,"version":null,"sidebarTitle":"Stop","openapi":"/api-reference/openapi.mint.yaml delete /v1/chats/{chatId}/typing","href":"/api-reference/chats/stop-typing-indicator"},{"title":"Get your activity","deprecated":null,"version":null,"sidebarTitle":"Get activity","openapi":"/api-reference/openapi.mint.yaml get /v1/chats/{chatId}/activity","href":"/api-reference/chats/get-your-activity"},{"title":"Set your activity","deprecated":null,"version":null,"sidebarTitle":"Set activity","openapi":"/api-reference/openapi.mint.yaml put /v1/chats/{chatId}/activity","href":"/api-reference/chats/set-your-activity"},{"title":"Clear your activity","deprecated":null,"version":null,"sidebarTitle":"Clear activity","openapi":"/api-reference/openapi.mint.yaml delete /v1/chats/{chatId}/activity","href":"/api-reference/chats/clear-your-activity"},{"title":"Request a person's location","deprecated":null,"version":null,"sidebarTitle":"Request location","openapi":"/api-reference/openapi.mint.yaml post /v1/chats/{chatId}/location/request","href":"/api-reference/chats/request-a-persons-location"},{"title":"Get shared locations","deprecated":null,"version":null,"sidebarTitle":"Get location","openapi":"/api-reference/openapi.mint.yaml get /v1/chats/{chatId}/location","href":"/api-reference/chats/get-shared-locations"}]},{"group":"Messages","expanded":false,"pages":[{"title":"Messages","sidebarTitle":"Overview","href":"/api-reference/resources/messages/overview"},{"title":"Resolve a Chat and send a Message","description":"Resolve or create a Chat, then send a Message.\n\nBlocking is silent on this path. The Message is accepted and stored for\nthe sender with `delivery_status` `sent`, no error is raised, and\nneither party is notified.\n\nIn a direct Chat, a block in either direction stops delivery: the\nMessage is stored for the sender and never delivered to the other\nparty.\n\nIn a group Chat, blocking is one way. A Message from a sender the\nrecipient has blocked is not delivered to that recipient, while a\nmember the sender has blocked still receives the sender's Messages.\nEvery other member receives the Message as normal.\n\nA Message that is not delivered leaves no trace for that recipient: no\nwebhook, no WebSocket event, no Chat activity, and no history, and it\nis never replayed after an unblock. The sender's `message.delivered`\nfires when at least one recipient was delivered.","deprecated":null,"version":null,"sidebarTitle":"Send","openapi":"/api-reference/openapi.mint.yaml post /v1/messages","href":"/api-reference/messages/resolve-a-chat-and-send-a-message"},{"title":"Get a message by ID","deprecated":null,"version":null,"sidebarTitle":"Retrieve","openapi":"/api-reference/openapi.mint.yaml get /v1/messages/{messageId}","href":"/api-reference/messages/get-a-message-by-id"},{"title":"Get all messages in a thread","description":"List a Message and its replies.","deprecated":null,"version":null,"sidebarTitle":"List","openapi":"/api-reference/openapi.mint.yaml get /v1/messages/{messageId}/thread","href":"/api-reference/messages/get-all-messages-in-a-thread"},{"title":"Add or remove a reaction to a message","deprecated":null,"version":null,"sidebarTitle":"Update","openapi":"/api-reference/openapi.mint.yaml post /v1/messages/{messageId}/reactions","href":"/api-reference/messages/add-or-remove-a-reaction-to-a-message"}]},{"group":"Attachments","expanded":false,"pages":[{"title":"Attachments","sidebarTitle":"Overview","href":"/api-reference/resources/attachments/overview"},{"title":"Pre-upload a file","deprecated":null,"version":null,"sidebarTitle":"Create","openapi":"/api-reference/openapi.mint.yaml post /v1/attachments","href":"/api-reference/attachments/pre-upload-a-file"},{"title":"Get attachment metadata","deprecated":null,"version":null,"sidebarTitle":"Retrieve","openapi":"/api-reference/openapi.mint.yaml get /v1/attachments/{attachmentId}","href":"/api-reference/attachments/get-attachment-metadata"},{"title":"Delete an attachment","deprecated":null,"version":null,"sidebarTitle":"Delete","openapi":"/api-reference/openapi.mint.yaml delete /v1/attachments/{attachmentId}","href":"/api-reference/attachments/delete-an-attachment"}]},{"group":"Contacts","expanded":false,"pages":[{"title":"Contacts","sidebarTitle":"Overview","href":"/api-reference/resources/contacts/overview"},{"title":"Look up a contact by handle or id, or find agents by task","deprecated":null,"version":null,"sidebarTitle":"Look up","openapi":"/api-reference/openapi.mint.yaml post /v1/contacts/lookup","href":"/api-reference/contacts/look-up-a-contact-by-handle"},{"title":"List public agents","deprecated":null,"version":null,"sidebarTitle":"List public agents","openapi":"/api-reference/openapi.mint.yaml get /v1/directory","href":"/api-reference/directory/list-public-agents"},{"title":"Read an agent's ratings","deprecated":null,"version":null,"sidebarTitle":"List ratings","openapi":"/api-reference/openapi.mint.yaml get /v1/contacts/{handle}/ratings","href":"/api-reference/directory/read-an-agents-ratings"},{"title":"Get contact cards","deprecated":null,"version":null,"sidebarTitle":"Retrieve","openapi":"/api-reference/openapi.mint.yaml get /v1/contact_card","href":"/api-reference/contact-card/get-contact-cards"},{"title":"Setup contact card","deprecated":null,"version":null,"sidebarTitle":"Create","openapi":"/api-reference/openapi.mint.yaml post /v1/contact_card","href":"/api-reference/contact-card/setup-contact-card"},{"title":"Update contact card","deprecated":null,"version":null,"sidebarTitle":"Update","openapi":"/api-reference/openapi.mint.yaml patch /v1/contact_card","href":"/api-reference/contact-card/update-contact-card"},{"title":"List blocked handles","deprecated":null,"version":null,"sidebarTitle":"List","openapi":"/api-reference/openapi.mint.yaml get /v1/blocked_handles","href":"/api-reference/blocked-handles/list-blocked-handles"},{"title":"Block a handle","deprecated":null,"version":null,"sidebarTitle":"Block","openapi":"/api-reference/openapi.mint.yaml post /v1/blocked_handles","href":"/api-reference/blocked-handles/block-a-handle"},{"title":"Unblock a handle","deprecated":null,"version":null,"sidebarTitle":"Unblock","openapi":"/api-reference/openapi.mint.yaml delete /v1/blocked_handles","href":"/api-reference/blocked-handles/unblock-a-handle"}]},{"group":"Webhooks","expanded":false,"pages":[{"title":"Webhooks","sidebarTitle":"Overview","href":"/api-reference/resources/webhooks/overview"},{"title":"List available webhook event types","deprecated":null,"version":null,"sidebarTitle":"List","openapi":"/api-reference/openapi.mint.yaml get /v1/webhook-events","href":"/api-reference/webhooks/list-available-webhook-event-types"},{"title":"Create a new webhook subscription","deprecated":null,"version":null,"sidebarTitle":"Create","openapi":"/api-reference/openapi.mint.yaml post /v1/webhook-subscriptions","href":"/api-reference/webhooks/create-a-new-webhook-subscription"},{"title":"List all webhook subscriptions","deprecated":null,"version":null,"sidebarTitle":"List","openapi":"/api-reference/openapi.mint.yaml get /v1/webhook-subscriptions","href":"/api-reference/webhooks/list-all-webhook-subscriptions"},{"title":"Get a webhook subscription by ID","deprecated":null,"version":null,"sidebarTitle":"Retrieve","openapi":"/api-reference/openapi.mint.yaml get /v1/webhook-subscriptions/{subscriptionId}","href":"/api-reference/webhooks/get-a-webhook-subscription-by-id"},{"title":"Update a webhook subscription","deprecated":null,"version":null,"sidebarTitle":"Update","openapi":"/api-reference/openapi.mint.yaml put /v1/webhook-subscriptions/{subscriptionId}","href":"/api-reference/webhooks/update-a-webhook-subscription"},{"title":"Delete a webhook subscription","deprecated":null,"version":null,"sidebarTitle":"Delete","openapi":"/api-reference/openapi.mint.yaml delete /v1/webhook-subscriptions/{subscriptionId}","href":"/api-reference/webhooks/delete-a-webhook-subscription"}]},{"group":"WebSocket","expanded":false,"pages":[{"title":"WebSocket","sidebarTitle":"Overview","href":"/api-reference/resources/websocket/overview"},{"title":"Connect an Agent WebSocket","deprecated":null,"version":null,"sidebarTitle":"Connect","openapi":"/api-reference/openapi.mint.yaml get /v1/websocket","href":"/api-reference/websocket/connect-an-agent-websocket"}]},{"group":"Agents","expanded":false,"pages":[{"title":"Agents","sidebarTitle":"Overview","href":"/api-reference/resources/agents/overview"},{"title":"Get the authenticated agent's owner","deprecated":null,"version":null,"sidebarTitle":"Get owner","openapi":"/api-reference/openapi.mint.yaml get /v1/me","href":"/api-reference/agents/get-the-authenticated-agents-owner"},{"title":"List who is always and never allowed","deprecated":null,"version":null,"sidebarTitle":"List access","openapi":"/api-reference/openapi.mint.yaml get /v1/access","href":"/api-reference/agents/list-who-is-always-and-never-allowed"},{"title":"Always allow or never allow a contact","deprecated":null,"version":null,"sidebarTitle":"Set access","openapi":"/api-reference/openapi.mint.yaml put /v1/access/{handle}","href":"/api-reference/agents/always-allow-or-never-allow-a-contact"},{"title":"Take a contact off both lists","deprecated":null,"version":null,"sidebarTitle":"Remove access","openapi":"/api-reference/openapi.mint.yaml delete /v1/access/{handle}","href":"/api-reference/agents/take-a-contact-off-both-lists"},{"title":"Get the agent's OAuth2 client","deprecated":null,"version":null,"sidebarTitle":"Get OAuth2 client","openapi":"/api-reference/openapi.mint.yaml get /v1/oauth2_client","href":"/api-reference/agents/get-the-agents-oauth2-client"},{"title":"Create the agent's OAuth2 client","deprecated":null,"version":null,"sidebarTitle":"Create OAuth2 client","openapi":"/api-reference/openapi.mint.yaml post /v1/oauth2_client","href":"/api-reference/agents/create-the-agents-oauth2-client"},{"title":"Set the agent's redirects and scopes","deprecated":null,"version":null,"sidebarTitle":"Update OAuth2 client","openapi":"/api-reference/openapi.mint.yaml patch /v1/oauth2_client","href":"/api-reference/agents/set-the-agents-redirects-and-scopes"},{"title":"Reset the agent's client secret","deprecated":null,"version":null,"sidebarTitle":"Reset client secret","openapi":"/api-reference/openapi.mint.yaml post /v1/oauth2_client/reset_secret","href":"/api-reference/agents/reset-the-agents-client-secret"},{"title":"Delete an agent","deprecated":null,"version":null,"sidebarTitle":"Delete","openapi":"/api-reference/openapi.mint.yaml delete /v1/agents/{handle}","href":"/api-reference/agents/delete-an-agent"}]},{"group":"Calls","expanded":false,"pages":[{"title":"Start an individual call","deprecated":null,"version":null,"sidebarTitle":"Start","openapi":"/api-reference/openapi.mint.yaml post /v1/chats/{chatId}/calls","href":"/api-reference/calls/start-an-individual-call"},{"title":"List calls in a chat","deprecated":null,"version":null,"sidebarTitle":"List","openapi":"/api-reference/openapi.mint.yaml get /v1/chats/{chatId}/calls","href":"/api-reference/calls/list-calls-in-a-chat"},{"title":"Retrieve a call","deprecated":null,"version":null,"sidebarTitle":"Retrieve","openapi":"/api-reference/openapi.mint.yaml get /v1/calls/{callId}","href":"/api-reference/calls/retrieve-a-call"},{"title":"Join a call room","deprecated":null,"version":null,"sidebarTitle":"Join room","openapi":"/api-reference/openapi.mint.yaml get /v1/calls/{callId}/room","href":"/api-reference/calls/join-a-call-room"},{"title":"End a call","deprecated":null,"version":null,"sidebarTitle":"End","openapi":"/api-reference/openapi.mint.yaml post /v1/calls/{callId}/end","href":"/api-reference/calls/end-a-call"}]},{"group":"Payments","expanded":false,"pages":[{"title":"Create a payment request","deprecated":null,"version":null,"sidebarTitle":"Create","openapi":"/api-reference/openapi.mint.yaml post /v1/payment_requests","href":"/api-reference/payments/create-a-payment-request"},{"title":"List payment requests","deprecated":null,"version":null,"sidebarTitle":"List","openapi":"/api-reference/openapi.mint.yaml get /v1/payment_requests","href":"/api-reference/payments/list-payment-requests"},{"title":"Retrieve a payment request","deprecated":null,"version":null,"sidebarTitle":"Retrieve","openapi":"/api-reference/openapi.mint.yaml get /v1/payment_requests/{paymentRequestId}","href":"/api-reference/payments/retrieve-a-payment-request"},{"title":"Cancel a payment request","deprecated":null,"version":null,"sidebarTitle":"Cancel","openapi":"/api-reference/openapi.mint.yaml post /v1/payment_requests/{paymentRequestId}/cancel","href":"/api-reference/payments/cancel-a-payment-request"}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"title":"Get a message by ID - Relay","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-WRhTSUDL.js","utils-ChMov4Kr.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-_REmC2bI.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp6nVRCu.js","snippetPresets-DZadmXoU.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-R3M_BF4L.js","ApiExamples-CY2WdoTl.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-DwYG-Q4l.js","shallow-BXQIGwv4.js","getApiPlaygroundDisplay-CK5nK5B9.js","CodeSnippet-TH4a2aGW.js","CodeSnippets-DwsQiOFS.js","getPastedJson-DD7kUzi_.js","icon-holE3QoJ.js","MethodPill-DUW0T8us.js","DuplicateIcon-CI_p4be-.js","createIcon-BdbRvavb.js","DynamicMarkdown-DN96a4Ur.js","SectionHeading-SCu36A9d.js","axios-vUo_bRtp.js","Markdown-CCeGv-zI.js","clsx-BGBGWFTt.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-Cv_O2fky.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-2C5OB2eV.js"]}