Top-level alias: POST /admin/api/destinations. Write role required. The workspace-wide cap counts destinations with a non-null project_id and is checked before validation.
Makes a POST safe to retry for 24 hours: the same key, credential, path and body returns the stored response (Idempotent-Replayed: true) instead of running again. 422 if the key was used for a different request; 409 while the first is in flight.
webhook only, and required for it: an absolute https URL. http and relative URLs are rejected. Normalized through the URL parser before storing. Refused for Slack, S3, SQS and Pub/Sub, whose address is their config. A Slack incoming-webhook URL (hooks.slack.com) is refused here (400): it is a credential, stored encrypted only as a slack destination's config.webhook_url (#313).
Custom headers sent with every delivery (DLV-7). Replaces the whole list; null clears it. Sent before Hookie's own headers, which always win. webhook only: refused for Slack, S3, SQS and Pub/Sub.
Authentication (DLV-7), stored AES-256-GCM encrypted and never returned. null or {type:'none'} removes it. On PATCH, the same type with no credential keeps the stored credential (so an API key's header can be renamed without re-entering it). webhook only: refused for Slack, S3, SQS and Pub/Sub (S3 and SQS are authenticated by SigV4 from config, Pub/Sub by its service-account key).
Payload transformation (DLV-7): data, never code. null sends Hookie's envelope {id, dataset, received_at, data}. A template is any JSON value whose string leaves may hold {{path}} placeholders, read from the envelope with the mapping engine's dotted-path reader ({{dataset}}, {{data.customer.email}}, {{$payload}} for the whole envelope); a string that is exactly one placeholder keeps the value's type, an embedded one becomes text (objects as JSON, missing as empty). A mapping builds a flat object, one key per {path, key}, as routing rules do ($submission.id and $submission.received_at are the record's id and time). At most 16 KB serialised. The body is always sent as application/json and Hookie-Signature is computed over it as sent.
OBS-2: a public https URL (no credentials, no private or internal host) that receives one signed POST when Hookie switches this destination off for failing. Body: {type:'destination.disabled', occurred_at, destination:{id,name,url,project_id}, reason, consecutive_dead, failing_since, last_failure}; headers Hookie-Signature (the destination's signing secret, same scheme as a delivery) and Hookie-Alert: destination.disabled. Sent once, never retried, redirects not followed. null or empty removes it.
How a delivery leaves Hookie (DLV-13, #313, #322). webhook: the signed HTTPS POST to url (Hookie-Signature and the Standard Webhooks headers), unchanged. slack: a POST to a Slack incoming webhook with a readable message ({text, blocks}: dataset, event id, received time and the payload as pretty JSON truncated to 2,500 characters), or the destination's own template when it has a transform; it carries only Content-Type and User-Agent, no signature headers. s3: one object per event PUT to an S3-compatible bucket (AWS S3, Cloudflare R2, GCS interoperability, MinIO) at {prefix}{dataset}/{yyyy}/{mm}/{dd}/{event id}.json (dated by when the event was received, UTC), Content-Type application/json, x-amz-meta-hookie-event-id and x-amz-meta-hookie-dataset, signed with AWS SigV4; the key is the event's, so a retry or replay overwrites the same object. sqs (#322): one SendMessage per event to an Amazon SQS queue over the JSON protocol (POST to the queue URL's host, X-Amz-Target AmazonSQS.SendMessage, Content-Type application/x-amz-json-1.0, signed with AWS SigV4 for service sqs); MessageBody is the delivery body, and the message attributes event_id and dataset (String) carry the event's id and dataset. A FIFO queue (name ending .fifo) also gets MessageDeduplicationId = the event id and MessageGroupId = the dataset, so a retry or replay inside SQS's five-minute window is one message. A message over SQS's 1 MiB limit (1,048,576 bytes, body and attributes together) fails at once and is not retried. SQS's error code decides a retry: throttling (ThrottlingException, RequestThrottled, KmsThrottled) and SQS-side failures are retried, refusals (AccessDenied, QueueDoesNotExist, InvalidParameterValue, InvalidMessageContents, signature and KMS errors) are not; the code is added to the delivery's error. pubsub (#322): one publish per event, POST https://pubsub.googleapis.com/v1/projects/{project}/topics/{topic}:publish with {messages: [{data: base64(body), attributes: {event_id, dataset}}]}, authorised by an OAuth access token minted from the destination's service-account key (an RS256 JWT exchanged at https://oauth2.googleapis.com/token) and cached until 60 s before it expires, never minted per delivery. A 401 drops the cached token and is retried; a key Google refuses fails the delivery without retrying. Pub/Sub has no deduplication on publish: receivers dedupe on the event_id attribute. All of them share retries with backoff, pacing, the delivery allowance and holds, replay and the delivery log. The type is fixed at creation.
A typed destination's settings (DLV-13, #313, #322). Required on create for those types; refused for a webhook. Credentials are stored AES-256-GCM encrypted and never returned, exported or logged. On PATCH, a credential that is not sent keeps the stored one, and settings that are not sent keep their stored values. On create, the Slack variant needs webhook_url.
Slack
S3
SQS
Pub/Sub
Show child attributes
Response
Created. signing_secret is returned here in plaintext; it is stored AES-256-GCM encrypted and can be read back later via the secret endpoint. Every type gets a signing secret: a webhook's deliveries are signed with it, and for Slack, S3, SQS and Pub/Sub it signs only the destination's alert_url notices.
Present when the destination's URL is one of this project's own endpoint URLs or ingest keys and its dataset filter admits the dataset that writes to, so every event would loop back (stopped after 8 hops by Hookie-Hop). The destination is still created.
The created destination, as GET by id returns it (#201).
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Hookie","description":"Capture, route and deliver webhooks on Cloudflare — ingest anything, route it into datasets with rules, and deliver signed events with retries, AI triggers and multi-step workflows.","colors":{"primary":"#2B56A1","light":"#749ADC","dark":"#2CB8B8"},"logo":{"light":"https://mintcdn.com/hookie-ai/3zmwtACPzz3wb-OX/logo/light.svg?fit=max\u0026auto=format\u0026n=3zmwtACPzz3wb-OX\u0026q=85\u0026s=3d05bb847a5407bc7e75e7270aafc101","dark":"https://mintcdn.com/hookie-ai/3zmwtACPzz3wb-OX/logo/dark.svg?fit=max\u0026auto=format\u0026n=3zmwtACPzz3wb-OX\u0026q=85\u0026s=3a34a943f368167074930496ba10fa63","href":"https://hookie.ai"},"favicon":"https://mintcdn.com/hookie-ai/3zmwtACPzz3wb-OX/favicon.svg?fit=max\u0026auto=format\u0026n=3zmwtACPzz3wb-OX\u0026q=85\u0026s=e81ffa68ca681fd9823d22e0e57d7003","api":{"openapi":"openapi.json","playground":{"display":"interactive"},"examples":{"languages":["bash","javascript","python"]}},"navbar":{"links":[{"href":"https://hookie.ai","label":"Hookie.ai"},{"href":"https://hookie.ai/use-cases","label":"Use cases"},{"href":"https://hookie.ai/pricing","label":"Pricing"}],"primary":{"type":"button","label":"Open console","href":"https://app.hookie.ai/"}},"footer":{"socials":{"website":"https://hookie.ai"},"links":[{"header":"Product","items":[{"label":"Features","href":"https://hookie.ai/features"},{"label":"Use cases","href":"https://hookie.ai/use-cases"},{"label":"Pricing","href":"https://hookie.ai/pricing"},{"label":"Changelog","href":"https://hookie.ai/changelog"},{"label":"Status","href":"https://hookie.ai/status"}]},{"header":"Docs","items":[{"label":"Quickstart","href":"/quickstart"},{"label":"API reference","href":"/api-reference"},{"label":"Connected agents","href":"/connected-agents"}]},{"header":"Company","items":[{"label":"Security","href":"https://hookie.ai/security"},{"label":"Contact","href":"https://hookie.ai/contact"}]},{"header":"Legal","items":[{"label":"Terms","href":"https://hookie.ai/legal/terms"},{"label":"Privacy","href":"https://hookie.ai/legal/privacy"},{"label":"Acceptable use","href":"https://hookie.ai/legal/acceptable-use"}]}]},"styling":{"codeblocks":"dark","latex":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"hookie-ai","hasAudioNarration":false,"actualSubdomain":"hookie-ai","customDomains":["docs.hookie.ai"],"gitSource":{"type":"github","owner":"bcusack1996","repo":"hookie-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6acb37193d9a94205f095409","collectionId":"0e08d911-dc25-4671-83b6-91f9acd96a01","liveDeploymentHistoryId":"6acb37193d9a94205f095409","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6acb37193d9a94205f095409","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"API reference","count":224},{"language":"default","tag":"Workspace","count":26},{"language":"default","tag":"Guides","count":20},{"language":"default","tag":"Customer Portal","count":18},{"language":"default","tag":"Portals","count":12},{"language":"default","tag":"Ingest","count":10},{"language":"default","tag":"SSO","count":10},{"language":"default","tag":"Workflows","count":10},{"language":"default","tag":"Concepts","count":9},{"language":"default","tag":"Webhooks","count":9}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"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":"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":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/destinations/create-an-outbound-destination","slug":"/api-reference/destinations/create-an-outbound-destination","pageMetadata":{"title":"Create an outbound destination","description":"Top-level alias: POST /admin/api/destinations. Write role required. The workspace-wide cap counts destinations with a non-null project_id and is checked before validation.","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/destinations","href":"/api-reference/destinations/create-an-outbound-destination","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: \"Top-level alias: POST /admin/api/destinations. Write role required. The workspace-wide cap counts destinations with a non-null project_id and is checked before validation.\"\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":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Create an outbound destination","description":"Top-level alias: POST /admin/api/destinations. Write role required. The workspace-wide cap counts destinations with a non-null project_id and is checked before validation.","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/destinations","href":"/api-reference/destinations/create-an-outbound-destination","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"createDestination","summary":"Create an outbound destination","tags":["Destinations"],"responses":{"201":"5707afb3-6a94-4ad3-bf14-50904a01e398","400":"90bb5668-f062-4097-afc0-09fa20a10e57","401":"fe0615b2-f38f-4fa8-8ed1-5a1d4f7207ec","402":"1765db35-6b39-404b-a928-eaec2e86405a","403":"b4df0a2b-904c-4668-96d0-07b4d121755a","429":"6d4359b7-be4e-4382-8f00-1071fbcbc479","500":"afbab805-7b53-4e14-9eed-dc55a054ee07"},"description":"Top-level alias: POST /admin/api/destinations. Write role required. The workspace-wide cap counts destinations with a non-null project_id and is checked before validation.","parameters":["7eac7cf7-52c8-4fa8-9e09-ae5bd6ab1fac","2f5ba3b1-2831-4d68-b5ae-d35130ce6fb4"],"requestBody":"decd9e41-f6af-4f22-aa76-3f96d55fd8ec","security":["b1e39b3c-c9d7-44f8-83ce-d4cff4a36a04","968aaeab-e71d-40b3-8758-55e46b5aaedd","dd52e6e1-d646-47a9-a117-9070008cf236"],"method":"post","type":"path","servers":["0ea1ddc9-3a31-4421-86e4-db5233ac2213","d5e32d1f-0c83-4838-aa53-3e0ffb5d5c54"],"path":"/admin/api/projects/{project_id}/destinations","baseUrlOptions":["https://app.hookie.ai","https://app.preview.hookie.ai"],"title":"Create an outbound destination","codeSamples":[],"requestExampleLanguages":["bash","javascript","python"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"7eac7cf7-52c8-4fa8-9e09-ae5bd6ab1fac":{"name":"project_id","in":"path","required":true,"description":"Project id (UUID) belonging to the caller workspace.","schema":{"type":"string","isRequired":true,"description":"Project id (UUID) belonging to the caller workspace.","uniqueKey":"","typeLabel":"string"}},"2f5ba3b1-2831-4d68-b5ae-d35130ce6fb4":{"name":"Idempotency-Key","in":"header","required":false,"description":"Makes a POST safe to retry for 24 hours: the same key, credential, path and body returns the stored response (`Idempotent-Replayed: true`) instead of running again. 422 if the key was used for a different request; 409 while the first is in flight.","schema":{"type":"string","minLength":1,"maxLength":255,"isRequired":false,"description":"Makes a POST safe to retry for 24 hours: the same key, credential, path and body returns the stored response (`Idempotent-Replayed: true`) instead of running again. 422 if the key was used for a different request; 409 while the first is in flight.","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":80,"isRequired":true,"uniqueKey":"name","typeLabel":"string"},"url":{"type":"string","format":"uri","description":"webhook only, and required for it: an absolute https URL. http and relative URLs are rejected. Normalized through the URL parser before storing. Refused for Slack, S3, SQS and Pub/Sub, whose address is their config. A Slack incoming-webhook URL (hooks.slack.com) is refused here (400): it is a credential, stored encrypted only as a `slack` destination's config.webhook_url (#313).","uniqueKey":"url","typeLabel":"string\u003curi>"},"datasetFilter":{"oneOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,62}$","uniqueKey":"datasetFilter.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"CAMELCASE on create - the create validator reads datasetFilter, while PATCH reads dataset_filter. Omitted or null means every dataset.","uniqueKey":"datasetFilter.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,62}$"},"description":"CAMELCASE on create - the create validator reads datasetFilter, while PATCH reads dataset_filter. Omitted or null means every dataset.","uniqueKey":"datasetFilter.oneOf.1","typeLabel":"null"}],"uniqueKey":"datasetFilter","typeLabel":"string[] | null"},"enabled":{"type":"boolean","default":true,"description":"Anything other than the literal false is treated as true.","uniqueKey":"enabled","typeLabel":"boolean"},"headers":{"oneOf":[{"type":"array","maxItems":20,"items":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":100,"description":"An HTTP header name (RFC 9110 token). Reserved and refused: Hookie-*, X-Hookie-*, webhook-*, Host, Content-Length, Content-Type, Idempotency-Key, User-Agent, and hop-by-hop headers (Connection, Keep-Alive, TE, Trailer, Transfer-Encoding, Upgrade, Proxy-*). Names are unique, case-insensitively.","isRequired":true,"uniqueKey":"headers.oneOf.0.items.[INDEX].name","typeLabel":"string"},"value":{"type":"string","maxLength":4096,"description":"No CR, LF or other control characters. On PATCH, a secret header sent WITHOUT a value keeps the value already stored for that name.","uniqueKey":"headers.oneOf.0.items.[INDEX].value","typeLabel":"string"},"secret":{"type":"boolean","default":false,"description":"Store the value AES-256-GCM encrypted and never return it.","uniqueKey":"headers.oneOf.0.items.[INDEX].secret","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"headers.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"Custom headers sent with every delivery (DLV-7). Replaces the whole list; null clears it. Sent before Hookie's own headers, which always win. webhook only: refused for Slack, S3, SQS and Pub/Sub.","uniqueKey":"headers.oneOf.0","typeLabel":"object[]"},{"type":"null","maxItems":20,"items":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":100,"description":"An HTTP header name (RFC 9110 token). Reserved and refused: Hookie-*, X-Hookie-*, webhook-*, Host, Content-Length, Content-Type, Idempotency-Key, User-Agent, and hop-by-hop headers (Connection, Keep-Alive, TE, Trailer, Transfer-Encoding, Upgrade, Proxy-*). Names are unique, case-insensitively."},"value":{"type":"string","maxLength":4096,"description":"No CR, LF or other control characters. On PATCH, a secret header sent WITHOUT a value keeps the value already stored for that name."},"secret":{"type":"boolean","default":false,"description":"Store the value AES-256-GCM encrypted and never return it."}},"additionalProperties":false},"description":"Custom headers sent with every delivery (DLV-7). Replaces the whole list; null clears it. Sent before Hookie's own headers, which always win. webhook only: refused for Slack, S3, SQS and Pub/Sub.","uniqueKey":"headers.oneOf.1","typeLabel":"null"}],"uniqueKey":"headers","typeLabel":"object[] | null"},"auth":{"oneOf":[{"type":"null","description":"Authentication (DLV-7), stored AES-256-GCM encrypted and never returned. null or {type:'none'} removes it. On PATCH, the same type with no credential keeps the stored credential (so an API key's header can be renamed without re-entering it). webhook only: refused for Slack, S3, SQS and Pub/Sub (S3 and SQS are authenticated by SigV4 from config, Pub/Sub by its service-account key).","uniqueKey":"auth.oneOf.0","typeLabel":"null"},{"type":"object","description":"Authentication (DLV-7), stored AES-256-GCM encrypted and never returned. null or {type:'none'} removes it. On PATCH, the same type with no credential keeps the stored credential (so an API key's header can be renamed without re-entering it). webhook only: refused for Slack, S3, SQS and Pub/Sub (S3 and SQS are authenticated by SigV4 from config, Pub/Sub by its service-account key).","required":["type"],"properties":{"type":{"const":"none","isRequired":true,"uniqueKey":"auth.oneOf.1.type","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"auth.oneOf.1","typeLabel":"object"},{"type":"object","description":"Authentication (DLV-7), stored AES-256-GCM encrypted and never returned. null or {type:'none'} removes it. On PATCH, the same type with no credential keeps the stored credential (so an API key's header can be renamed without re-entering it). webhook only: refused for Slack, S3, SQS and Pub/Sub (S3 and SQS are authenticated by SigV4 from config, Pub/Sub by its service-account key).","required":["type"],"properties":{"type":{"const":"bearer","isRequired":true,"uniqueKey":"auth.oneOf.2.type","typeLabel":"any"},"token":{"type":"string","maxLength":4096,"uniqueKey":"auth.oneOf.2.token","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"auth.oneOf.2","typeLabel":"object"},{"type":"object","description":"Authentication (DLV-7), stored AES-256-GCM encrypted and never returned. null or {type:'none'} removes it. On PATCH, the same type with no credential keeps the stored credential (so an API key's header can be renamed without re-entering it). webhook only: refused for Slack, S3, SQS and Pub/Sub (S3 and SQS are authenticated by SigV4 from config, Pub/Sub by its service-account key).","required":["type"],"properties":{"type":{"const":"basic","isRequired":true,"uniqueKey":"auth.oneOf.3.type","typeLabel":"any"},"username":{"type":"string","description":"May not contain ':'.","uniqueKey":"auth.oneOf.3.username","typeLabel":"string"},"password":{"type":"string","uniqueKey":"auth.oneOf.3.password","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"auth.oneOf.3","typeLabel":"object"},{"type":"object","description":"Authentication (DLV-7), stored AES-256-GCM encrypted and never returned. null or {type:'none'} removes it. On PATCH, the same type with no credential keeps the stored credential (so an API key's header can be renamed without re-entering it). webhook only: refused for Slack, S3, SQS and Pub/Sub (S3 and SQS are authenticated by SigV4 from config, Pub/Sub by its service-account key).","required":["type","header"],"properties":{"type":{"const":"api_key","isRequired":true,"uniqueKey":"auth.oneOf.4.type","typeLabel":"any"},"header":{"type":"string","description":"The header the key goes in, e.g. DD-API-KEY or X-Api-Key. Not a reserved header.","isRequired":true,"uniqueKey":"auth.oneOf.4.header","typeLabel":"string"},"value":{"type":"string","maxLength":4096,"uniqueKey":"auth.oneOf.4.value","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"auth.oneOf.4","typeLabel":"object"}],"uniqueKey":"auth","typeLabel":"null · object · object · object · object"},"transform":{"oneOf":[{"type":"null","description":"Payload transformation (DLV-7): data, never code. null sends Hookie's envelope {id, dataset, received_at, data}. A template is any JSON value whose string leaves may hold {{path}} placeholders, read from the envelope with the mapping engine's dotted-path reader ({{dataset}}, {{data.customer.email}}, {{$payload}} for the whole envelope); a string that is exactly one placeholder keeps the value's type, an embedded one becomes text (objects as JSON, missing as empty). A mapping builds a flat object, one key per {path, key}, as routing rules do ($submission.id and $submission.received_at are the record's id and time). At most 16 KB serialised. The body is always sent as application/json and Hookie-Signature is computed over it as sent.","uniqueKey":"transform.oneOf.0","typeLabel":"null"},{"type":"object","description":"Payload transformation (DLV-7): data, never code. null sends Hookie's envelope {id, dataset, received_at, data}. A template is any JSON value whose string leaves may hold {{path}} placeholders, read from the envelope with the mapping engine's dotted-path reader ({{dataset}}, {{data.customer.email}}, {{$payload}} for the whole envelope); a string that is exactly one placeholder keeps the value's type, an embedded one becomes text (objects as JSON, missing as empty). A mapping builds a flat object, one key per {path, key}, as routing rules do ($submission.id and $submission.received_at are the record's id and time). At most 16 KB serialised. The body is always sent as application/json and Hookie-Signature is computed over it as sent.","required":["type","template"],"properties":{"type":{"const":"template","isRequired":true,"uniqueKey":"transform.oneOf.1.type","typeLabel":"any"},"template":{"description":"Any JSON value, nested at most 20 levels.","isRequired":true,"uniqueKey":"transform.oneOf.1.template","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"transform.oneOf.1","typeLabel":"object"},{"type":"object","description":"Payload transformation (DLV-7): data, never code. null sends Hookie's envelope {id, dataset, received_at, data}. A template is any JSON value whose string leaves may hold {{path}} placeholders, read from the envelope with the mapping engine's dotted-path reader ({{dataset}}, {{data.customer.email}}, {{$payload}} for the whole envelope); a string that is exactly one placeholder keeps the value's type, an embedded one becomes text (objects as JSON, missing as empty). A mapping builds a flat object, one key per {path, key}, as routing rules do ($submission.id and $submission.received_at are the record's id and time). At most 16 KB serialised. The body is always sent as application/json and Hookie-Signature is computed over it as sent.","required":["type","mappings"],"properties":{"type":{"const":"mapping","isRequired":true,"uniqueKey":"transform.oneOf.2.type","typeLabel":"any"},"mappings":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"object","required":["path","key"],"properties":{"path":{"type":"string","maxLength":200,"isRequired":true,"uniqueKey":"transform.oneOf.2.mappings.items.[INDEX].path","typeLabel":"string"},"key":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,62}$","isRequired":true,"uniqueKey":"transform.oneOf.2.mappings.items.[INDEX].key","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"transform.oneOf.2.mappings.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"transform.oneOf.2.mappings","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"transform.oneOf.2","typeLabel":"object"}],"uniqueKey":"transform","typeLabel":"null · object · object"},"alert_url":{"oneOf":[{"type":"string","format":"uri","description":"OBS-2: a public https URL (no credentials, no private or internal host) that receives one signed POST when Hookie switches this destination off for failing. Body: {type:'destination.disabled', occurred_at, destination:{id,name,url,project_id}, reason, consecutive_dead, failing_since, last_failure}; headers Hookie-Signature (the destination's signing secret, same scheme as a delivery) and Hookie-Alert: destination.disabled. Sent once, never retried, redirects not followed. null or empty removes it.","uniqueKey":"alert_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"OBS-2: a public https URL (no credentials, no private or internal host) that receives one signed POST when Hookie switches this destination off for failing. Body: {type:'destination.disabled', occurred_at, destination:{id,name,url,project_id}, reason, consecutive_dead, failing_since, last_failure}; headers Hookie-Signature (the destination's signing secret, same scheme as a delivery) and Hookie-Alert: destination.disabled. Sent once, never retried, redirects not followed. null or empty removes it.","uniqueKey":"alert_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"alert_url","typeLabel":"string\u003curi> | null"},"type":{"type":"string","enum":["webhook","slack","s3","sqs","pubsub"],"default":"webhook","description":"How a delivery leaves Hookie (DLV-13, #313, #322). `webhook`: the signed HTTPS POST to `url` (Hookie-Signature and the Standard Webhooks headers), unchanged. `slack`: a POST to a Slack incoming webhook with a readable message ({text, blocks}: dataset, event id, received time and the payload as pretty JSON truncated to 2,500 characters), or the destination's own template when it has a transform; it carries only Content-Type and User-Agent, no signature headers. `s3`: one object per event PUT to an S3-compatible bucket (AWS S3, Cloudflare R2, GCS interoperability, MinIO) at {prefix}{dataset}/{yyyy}/{mm}/{dd}/{event id}.json (dated by when the event was received, UTC), Content-Type application/json, x-amz-meta-hookie-event-id and x-amz-meta-hookie-dataset, signed with AWS SigV4; the key is the event's, so a retry or replay overwrites the same object. `sqs` (#322): one SendMessage per event to an Amazon SQS queue over the JSON protocol (POST to the queue URL's host, X-Amz-Target AmazonSQS.SendMessage, Content-Type application/x-amz-json-1.0, signed with AWS SigV4 for service sqs); MessageBody is the delivery body, and the message attributes event_id and dataset (String) carry the event's id and dataset. A FIFO queue (name ending .fifo) also gets MessageDeduplicationId = the event id and MessageGroupId = the dataset, so a retry or replay inside SQS's five-minute window is one message. A message over SQS's 1 MiB limit (1,048,576 bytes, body and attributes together) fails at once and is not retried. SQS's error code decides a retry: throttling (ThrottlingException, RequestThrottled, KmsThrottled) and SQS-side failures are retried, refusals (AccessDenied, QueueDoesNotExist, InvalidParameterValue, InvalidMessageContents, signature and KMS errors) are not; the code is added to the delivery's error. `pubsub` (#322): one publish per event, POST https://pubsub.googleapis.com/v1/projects/{project}/topics/{topic}:publish with {messages: [{data: base64(body), attributes: {event_id, dataset}}]}, authorised by an OAuth access token minted from the destination's service-account key (an RS256 JWT exchanged at https://oauth2.googleapis.com/token) and cached until 60 s before it expires, never minted per delivery. A 401 drops the cached token and is retried; a key Google refuses fails the delivery without retrying. Pub/Sub has no deduplication on publish: receivers dedupe on the event_id attribute. All of them share retries with backoff, pacing, the delivery allowance and holds, replay and the delivery log. The type is fixed at creation.","uniqueKey":"type","typeLabel":"enum\u003cstring>"},"config":{"oneOf":[{"type":"object","title":"Slack","description":"A typed destination's settings (DLV-13, #313, #322). Required on create for those types; refused for a webhook. Credentials are stored AES-256-GCM encrypted and never returned, exported or logged. On PATCH, a credential that is not sent keeps the stored one, and settings that are not sent keep their stored values. On create, the Slack variant needs webhook_url.","properties":{"webhook_url":{"type":"string","format":"uri","maxLength":500,"description":"A Slack incoming-webhook URL: https://hooks.slack.com/services/T…/B…/… (also /workflows/ and /triggers/). Any other host is refused. The URL is the credential: it is shown back only masked (https://hooks.slack.com/services/••••abcd). Sending that masked value back unchanged keeps the stored URL.","uniqueKey":"config.oneOf.0.webhook_url","typeLabel":"string\u003curi>"}},"additionalProperties":false,"uniqueKey":"config.oneOf.0","typeLabel":"Slack · object"},{"type":"object","title":"S3","description":"A typed destination's settings (DLV-13, #313, #322). Required on create for those types; refused for a webhook. Credentials are stored AES-256-GCM encrypted and never returned, exported or logged. On PATCH, a credential that is not sent keeps the stored one, and settings that are not sent keep their stored values. On create, the Slack variant needs webhook_url.","properties":{"endpoint":{"oneOf":[{"type":"string","format":"uri","description":"Origin of an S3-compatible service, https and a public host only, with no path: https://\u003caccount>.r2.cloudflarestorage.com for R2, https://storage.googleapis.com for GCS. Omitted or null: AWS S3 in `region`. Objects on a custom endpoint are addressed path-style (https://host/bucket/key).","uniqueKey":"config.oneOf.1.endpoint.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Origin of an S3-compatible service, https and a public host only, with no path: https://\u003caccount>.r2.cloudflarestorage.com for R2, https://storage.googleapis.com for GCS. Omitted or null: AWS S3 in `region`. Objects on a custom endpoint are addressed path-style (https://host/bucket/key).","uniqueKey":"config.oneOf.1.endpoint.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.1.endpoint","typeLabel":"string\u003curi> | null"},"region":{"type":"string","description":"The signing region: us-east-1, eu-west-2, …; `auto` for R2. Required for AWS; defaults to `auto` when an endpoint is given.","uniqueKey":"config.oneOf.1.region","typeLabel":"string"},"bucket":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{1,61}[a-z0-9]$","uniqueKey":"config.oneOf.1.bucket","typeLabel":"string"},"prefix":{"type":"string","maxLength":256,"default":"","description":"Prepended to every key as is (end it with / for a folder). May not start with /, or contain . or .. segments, backslashes or control characters.","uniqueKey":"config.oneOf.1.prefix","typeLabel":"string"},"access_key_id":{"type":"string","description":"Returned in full: it identifies the key, it does not unlock it.","uniqueKey":"config.oneOf.1.access_key_id","typeLabel":"string"},"secret_access_key":{"type":"string","maxLength":256,"description":"Write-only. Never returned.","uniqueKey":"config.oneOf.1.secret_access_key","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"config.oneOf.1","typeLabel":"S3 · object"},{"type":"object","title":"SQS","description":"A typed destination's settings (DLV-13, #313, #322). Required on create for those types; refused for a webhook. Credentials are stored AES-256-GCM encrypted and never returned, exported or logged. On PATCH, a credential that is not sent keeps the stored one, and settings that are not sent keep their stored values. On create, the Slack variant needs webhook_url.","properties":{"queue_url":{"type":"string","format":"uri","maxLength":300,"description":"The queue's URL: https://sqs.\u003cregion>.amazonaws.com/\u003c12-digit account id>/\u003cqueue name> (also sqs.\u003cregion>.amazonaws.com.cn, sqs-fips.\u003cregion>.amazonaws.com and the legacy \u003cregion>.queue.amazonaws.com and queue.amazonaws.com). Any other host is refused. A name ending .fifo is a FIFO queue.","uniqueKey":"config.oneOf.2.queue_url","typeLabel":"string\u003curi>"},"region":{"type":"string","description":"Optional: read from the queue URL. Sent, it must match it.","uniqueKey":"config.oneOf.2.region","typeLabel":"string"},"access_key_id":{"type":"string","description":"Returned in full: it identifies the key, it does not unlock it. Grant it sqs:SendMessage on this queue and nothing more.","uniqueKey":"config.oneOf.2.access_key_id","typeLabel":"string"},"secret_access_key":{"type":"string","maxLength":256,"description":"Write-only. Never returned.","uniqueKey":"config.oneOf.2.secret_access_key","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"config.oneOf.2","typeLabel":"SQS · object"},{"type":"object","title":"Pub/Sub","description":"A typed destination's settings (DLV-13, #313, #322). Required on create for those types; refused for a webhook. Credentials are stored AES-256-GCM encrypted and never returned, exported or logged. On PATCH, a credential that is not sent keeps the stored one, and settings that are not sent keep their stored values. On create, the Slack variant needs webhook_url.","properties":{"project_id":{"type":"string","pattern":"^[a-z][a-z0-9-]{4,28}[a-z0-9]$","description":"The Google Cloud project the topic is in.","uniqueKey":"config.oneOf.3.project_id","typeLabel":"string"},"topic":{"type":"string","description":"The topic id (3-255 letters, digits, - _ . ~ +, starting with a letter, not goog...), or its full name projects/{project}/topics/{topic}.","uniqueKey":"config.oneOf.3.topic","typeLabel":"string"},"service_account_json":{"oneOf":[{"type":"string","maxLength":16384,"description":"Write-only. The service account's JSON key file as Google issues it (text or object): it must have type service_account, a client_email of a service account, an RSA private_key in PKCS #8 PEM, and token_uri https://oauth2.googleapis.com/token (any other token_uri is refused). Only the email, the private key and its id are kept, encrypted; the email is returned as config.service_account_email. Scope the account to roles/pubsub.publisher on this topic.","uniqueKey":"config.oneOf.3.service_account_json.oneOf.0","typeLabel":"string"},{"type":"object","maxLength":16384,"description":"Write-only. The service account's JSON key file as Google issues it (text or object): it must have type service_account, a client_email of a service account, an RSA private_key in PKCS #8 PEM, and token_uri https://oauth2.googleapis.com/token (any other token_uri is refused). Only the email, the private key and its id are kept, encrypted; the email is returned as config.service_account_email. Scope the account to roles/pubsub.publisher on this topic.","uniqueKey":"config.oneOf.3.service_account_json.oneOf.1","typeLabel":"object"}],"uniqueKey":"config.oneOf.3.service_account_json","typeLabel":"string | object"}},"additionalProperties":false,"uniqueKey":"config.oneOf.3","typeLabel":"Pub/Sub · object"}],"uniqueKey":"config","typeLabel":"Slack · object | S3 · object | SQS · object | Pub/Sub · object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"\u003cstring>","url":"\u003cstring>","datasetFilter":["\u003cstring>"],"enabled":true,"headers":[{"name":"\u003cstring>","value":"\u003cstring>","secret":false}],"auth":{"type":"none"},"transform":{"type":"template","template":"\u003cunknown>"},"alert_url":"\u003cstring>","type":"webhook","config":{"webhook_url":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"5707afb3-6a94-4ad3-bf14-50904a01e398":{"description":"Created. signing_secret is returned here in plaintext; it is stored AES-256-GCM encrypted and can be read back later via the secret endpoint. Every type gets a signing secret: a webhook's deliveries are signed with it, and for Slack, S3, SQS and Pub/Sub it signs only the destination's alert_url notices.","content":{"application/json":{"schema":{"type":"object","required":["id","signing_secret"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"signing_secret":{"type":"string","description":"whsec_ followed by 48 hex characters.","isRequired":true,"uniqueKey":"signing_secret","typeLabel":"string"},"warning":{"type":"string","description":"Present when the destination's URL is one of this project's own endpoint URLs or ingest keys and its dataset filter admits the dataset that writes to, so every event would loop back (stopped after 8 hops by Hookie-Hop). The destination is still created.","uniqueKey":"warning","typeLabel":"string"},"destination":{"type":"object","required":["id","name","url","dataset_filter","enabled","created_at"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"destination.id","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"destination.name","typeLabel":"string"},"url":{"type":"string","format":"uri","description":"Where deliveries go. For a webhook, the https URL it POSTs to. For Slack, the masked webhook URL; for S3, the bucket's base URL (with the prefix): display values, safe to show, never a credential.","isRequired":true,"uniqueKey":"destination.url","typeLabel":"string\u003curi>"},"dataset_filter":{"oneOf":[{"type":"string","description":"JSON array of dataset names, or null for all datasets.","isRequired":true,"uniqueKey":"destination.dataset_filter.oneOf.0","typeLabel":"string"},{"type":"null","description":"JSON array of dataset names, or null for all datasets.","isRequired":true,"uniqueKey":"destination.dataset_filter.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"destination.dataset_filter","typeLabel":"string | null"},"enabled":{"type":"integer","enum":[0,1],"isRequired":true,"uniqueKey":"destination.enabled","typeLabel":"enum\u003cinteger>"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"destination.created_at","typeLabel":"string\u003cdate-time>"},"timeout_seconds":{"oneOf":[{"type":"integer","minimum":1,"maximum":30,"description":"Seconds to wait for the receiver's answer before the attempt counts as failed (1-30). null: the default, 10.","uniqueKey":"destination.timeout_seconds.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"maximum":30,"description":"Seconds to wait for the receiver's answer before the attempt counts as failed (1-30). null: the default, 10.","uniqueKey":"destination.timeout_seconds.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.timeout_seconds","typeLabel":"integer | null"},"max_per_second":{"oneOf":[{"type":"number","minimum":0.1,"maximum":1000,"description":"Most deliveries a second to this destination (0.1-1000). null: no limit. A delivery over it waits on the queue for its reserved slot; it is not failed and is not counted as an attempt.","uniqueKey":"destination.max_per_second.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0.1,"maximum":1000,"description":"Most deliveries a second to this destination (0.1-1000). null: no limit. A delivery over it waits on the queue for its reserved slot; it is not failed and is not counted as an attempt.","uniqueKey":"destination.max_per_second.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.max_per_second","typeLabel":"number | null"},"max_concurrency":{"oneOf":[{"type":"integer","minimum":1,"maximum":100,"description":"Most requests in flight to this destination at once (1-100). null: no cap. A delivery over it waits on the queue; it is not failed and is not counted as an attempt.","uniqueKey":"destination.max_concurrency.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":1,"maximum":100,"description":"Most requests in flight to this destination at once (1-100). null: no cap. A delivery over it waits on the queue; it is not failed and is not counted as an attempt.","uniqueKey":"destination.max_concurrency.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.max_concurrency","typeLabel":"integer | null"},"previous_secret_expires_at":{"oneOf":[{"type":"string","format":"date-time","description":"While a rotated-out signing secret still signs (for 24 hours after a rotation): when it stops. null outside that window. The secret itself is never returned.","uniqueKey":"destination.previous_secret_expires_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"While a rotated-out signing secret still signs (for 24 hours after a rotation): when it stops. null outside that window. The secret itself is never returned.","uniqueKey":"destination.previous_secret_expires_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.previous_secret_expires_at","typeLabel":"string\u003cdate-time> | null"},"type":{"type":"string","enum":["webhook","slack","s3","sqs","pubsub"],"default":"webhook","description":"How a delivery leaves Hookie (DLV-13, #313, #322). `webhook`: the signed HTTPS POST to `url` (Hookie-Signature and the Standard Webhooks headers), unchanged. `slack`: a POST to a Slack incoming webhook with a readable message ({text, blocks}: dataset, event id, received time and the payload as pretty JSON truncated to 2,500 characters), or the destination's own template when it has a transform; it carries only Content-Type and User-Agent, no signature headers. `s3`: one object per event PUT to an S3-compatible bucket (AWS S3, Cloudflare R2, GCS interoperability, MinIO) at {prefix}{dataset}/{yyyy}/{mm}/{dd}/{event id}.json (dated by when the event was received, UTC), Content-Type application/json, x-amz-meta-hookie-event-id and x-amz-meta-hookie-dataset, signed with AWS SigV4; the key is the event's, so a retry or replay overwrites the same object. `sqs` (#322): one SendMessage per event to an Amazon SQS queue over the JSON protocol (POST to the queue URL's host, X-Amz-Target AmazonSQS.SendMessage, Content-Type application/x-amz-json-1.0, signed with AWS SigV4 for service sqs); MessageBody is the delivery body, and the message attributes event_id and dataset (String) carry the event's id and dataset. A FIFO queue (name ending .fifo) also gets MessageDeduplicationId = the event id and MessageGroupId = the dataset, so a retry or replay inside SQS's five-minute window is one message. A message over SQS's 1 MiB limit (1,048,576 bytes, body and attributes together) fails at once and is not retried. SQS's error code decides a retry: throttling (ThrottlingException, RequestThrottled, KmsThrottled) and SQS-side failures are retried, refusals (AccessDenied, QueueDoesNotExist, InvalidParameterValue, InvalidMessageContents, signature and KMS errors) are not; the code is added to the delivery's error. `pubsub` (#322): one publish per event, POST https://pubsub.googleapis.com/v1/projects/{project}/topics/{topic}:publish with {messages: [{data: base64(body), attributes: {event_id, dataset}}]}, authorised by an OAuth access token minted from the destination's service-account key (an RS256 JWT exchanged at https://oauth2.googleapis.com/token) and cached until 60 s before it expires, never minted per delivery. A 401 drops the cached token and is retried; a key Google refuses fails the delivery without retrying. Pub/Sub has no deduplication on publish: receivers dedupe on the event_id attribute. All of them share retries with backoff, pacing, the delivery allowance and holds, replay and the delivery log. The type is fixed at creation.","uniqueKey":"destination.type","typeLabel":"enum\u003cstring>"},"config":{"oneOf":[{"type":"object","description":"The type's settings as returned (DLV-13, #322): null for a webhook; {webhook_url} (masked) for Slack; {endpoint, region, bucket, prefix, access_key_id} for S3; {queue_url, region, access_key_id, fifo} for SQS; {project_id, topic, service_account_email} for Pub/Sub. No credential is ever included.","properties":{"webhook_url":{"oneOf":[{"type":"string","description":"Slack: the masked URL, e.g. https://hooks.slack.com/services/••••abcd.","uniqueKey":"destination.config.oneOf.0.webhook_url.oneOf.0","typeLabel":"string"},{"type":"null","description":"Slack: the masked URL, e.g. https://hooks.slack.com/services/••••abcd.","uniqueKey":"destination.config.oneOf.0.webhook_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.config.oneOf.0.webhook_url","typeLabel":"string | null"},"endpoint":{"oneOf":[{"type":"string","uniqueKey":"destination.config.oneOf.0.endpoint.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"destination.config.oneOf.0.endpoint.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.config.oneOf.0.endpoint","typeLabel":"string | null"},"region":{"oneOf":[{"type":"string","uniqueKey":"destination.config.oneOf.0.region.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"destination.config.oneOf.0.region.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.config.oneOf.0.region","typeLabel":"string | null"},"bucket":{"oneOf":[{"type":"string","uniqueKey":"destination.config.oneOf.0.bucket.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"destination.config.oneOf.0.bucket.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.config.oneOf.0.bucket","typeLabel":"string | null"},"prefix":{"type":"string","uniqueKey":"destination.config.oneOf.0.prefix","typeLabel":"string"},"access_key_id":{"oneOf":[{"type":"string","uniqueKey":"destination.config.oneOf.0.access_key_id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"destination.config.oneOf.0.access_key_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.config.oneOf.0.access_key_id","typeLabel":"string | null"},"queue_url":{"oneOf":[{"type":"string","description":"SQS: the queue's URL.","uniqueKey":"destination.config.oneOf.0.queue_url.oneOf.0","typeLabel":"string"},{"type":"null","description":"SQS: the queue's URL.","uniqueKey":"destination.config.oneOf.0.queue_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.config.oneOf.0.queue_url","typeLabel":"string | null"},"fifo":{"type":"boolean","description":"SQS: whether the queue is FIFO (its name ends .fifo), so messages carry MessageDeduplicationId and MessageGroupId.","uniqueKey":"destination.config.oneOf.0.fifo","typeLabel":"boolean"},"project_id":{"oneOf":[{"type":"string","description":"Pub/Sub: the topic's project.","uniqueKey":"destination.config.oneOf.0.project_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Pub/Sub: the topic's project.","uniqueKey":"destination.config.oneOf.0.project_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.config.oneOf.0.project_id","typeLabel":"string | null"},"topic":{"oneOf":[{"type":"string","description":"Pub/Sub: the topic id.","uniqueKey":"destination.config.oneOf.0.topic.oneOf.0","typeLabel":"string"},{"type":"null","description":"Pub/Sub: the topic id.","uniqueKey":"destination.config.oneOf.0.topic.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.config.oneOf.0.topic","typeLabel":"string | null"},"service_account_email":{"oneOf":[{"type":"string","description":"Pub/Sub: the service account whose key is stored (the key itself is never returned).","uniqueKey":"destination.config.oneOf.0.service_account_email.oneOf.0","typeLabel":"string"},{"type":"null","description":"Pub/Sub: the service account whose key is stored (the key itself is never returned).","uniqueKey":"destination.config.oneOf.0.service_account_email.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.config.oneOf.0.service_account_email","typeLabel":"string | null"}},"uniqueKey":"destination.config.oneOf.0","typeLabel":"object"},{"type":"null","description":"The type's settings as returned (DLV-13, #322): null for a webhook; {webhook_url} (masked) for Slack; {endpoint, region, bucket, prefix, access_key_id} for S3; {queue_url, region, access_key_id, fifo} for SQS; {project_id, topic, service_account_email} for Pub/Sub. No credential is ever included.","properties":{"webhook_url":{"oneOf":[{"type":"string","description":"Slack: the masked URL, e.g. https://hooks.slack.com/services/••••abcd."},{"type":"null","description":"Slack: the masked URL, e.g. https://hooks.slack.com/services/••••abcd."}]},"endpoint":{"oneOf":[{"type":"string"},{"type":"null"}]},"region":{"oneOf":[{"type":"string"},{"type":"null"}]},"bucket":{"oneOf":[{"type":"string"},{"type":"null"}]},"prefix":{"type":"string"},"access_key_id":{"oneOf":[{"type":"string"},{"type":"null"}]},"queue_url":{"oneOf":[{"type":"string","description":"SQS: the queue's URL."},{"type":"null","description":"SQS: the queue's URL."}]},"fifo":{"type":"boolean","description":"SQS: whether the queue is FIFO (its name ends .fifo), so messages carry MessageDeduplicationId and MessageGroupId."},"project_id":{"oneOf":[{"type":"string","description":"Pub/Sub: the topic's project."},{"type":"null","description":"Pub/Sub: the topic's project."}]},"topic":{"oneOf":[{"type":"string","description":"Pub/Sub: the topic id."},{"type":"null","description":"Pub/Sub: the topic id."}]},"service_account_email":{"oneOf":[{"type":"string","description":"Pub/Sub: the service account whose key is stored (the key itself is never returned)."},{"type":"null","description":"Pub/Sub: the service account whose key is stored (the key itself is never returned)."}]}},"uniqueKey":"destination.config.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.config","typeLabel":"object | null"},"secrets_set":{"type":"array","items":{"type":"string","enum":["webhook_url","secret_access_key","service_account_json"],"uniqueKey":"destination.secrets_set.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Slack, S3, SQS and Pub/Sub only: which credentials are stored (their values never leave the server).","uniqueKey":"destination.secrets_set","typeLabel":"enum\u003cstring>[]"}},"description":"The created destination, as GET by id returns it (#201).","uniqueKey":"destination","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"\u003cstring>","signing_secret":"\u003cstring>","warning":"\u003cstring>","destination":{"id":"\u003cstring>","name":"\u003cstring>","url":"\u003cstring>","dataset_filter":"\u003cstring>","enabled":0,"created_at":"2023-11-07T05:31:56Z","timeout_seconds":15,"max_per_second":500.05,"max_concurrency":50,"previous_secret_expires_at":"2023-11-07T05:31:56Z","type":"webhook","config":{"webhook_url":"\u003cstring>","endpoint":"\u003cstring>","region":"\u003cstring>","bucket":"\u003cstring>","prefix":"\u003cstring>","access_key_id":"\u003cstring>","queue_url":"\u003cstring>","fifo":true,"project_id":"\u003cstring>","topic":"\u003cstring>","service_account_email":"\u003cstring>"},"secrets_set":["webhook_url"]}}}},"exampleType":"generated"}},"exampleType":"generated"},"90bb5668-f062-4097-afc0-09fa20a10e57":{"description":"Validation failure - name missing or over 80 characters, url missing, not absolute, or not https, an invalid datasetFilter entry, a reserved, malformed or duplicated header, a header value with a line break, an unknown auth type or a missing credential, a custom header that is also the authentication's header, an invalid transform (unknown type, bad mapping key, over 16 KB), or an alert_url that is not a public https URL, an unknown type, a url, headers or auth on a Slack, S3, SQS or Pub/Sub destination, config on a webhook, or a typed config that is missing or invalid (a webhook_url not on https://hooks.slack.com/, an endpoint that is not a public https origin, a bad region, bucket, prefix or access key, a missing secret_access_key, a queue_url that is not on an SQS endpoint or a region that does not match it, a bad project_id or topic, or a service_account_json that is not JSON, has no service account's client_email or usable private_key, or names a token_uri other than https://oauth2.googleapis.com/token).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"},"fe0615b2-f38f-4fa8-8ed1-5a1d4f7207ec":{"description":"Not signed in, or the agent bearer token is invalid, unknown or revoked.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"},"1765db35-6b39-404b-a928-eaec2e86405a":{"description":"Plan limit reached (free 1, standard 10, team 25 destinations per workspace) - upgrade to add more.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"},"b4df0a2b-904c-4668-96d0-07b4d121755a":{"description":"Insufficient role (write capability required: owner, admin or developer), or a cookie-authenticated mutation missing the X-Requested-With: fetch header. Also `reason: \"workspace_suspended\"` while the workspace is suspended. For an OAuth-connected agent the body also carries `code`, `required_scope` and `granted_scopes`, plus `manage_url` when widening its grant in Settings → Connected agents would let the call through (see Error).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"},"6d4359b7-be4e-4382-8f00-1071fbcbc479":{"description":"Over this credential's burst limit (about 100 requests per 10 seconds; best-effort, counted separately at each Cloudflare location). Retry after `Retry-After` seconds.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"},"afbab805-7b53-4e14-9eed-dc55a054ee07":{"description":"Internal error.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"b1e39b3c-c9d7-44f8-83ce-d4cff4a36a04":{"session":{"type":"apiKey","in":"cookie","name":"hookie_session","description":"The console's sealed session cookie, set by WorkOS AuthKit. Mutating requests also require the `X-Requested-With` CSRF header.","scopes":[],"schemeName":"session"}},"968aaeab-e71d-40b3-8758-55e46b5aaedd":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"An OAuth 2.1 access token from a connected agent, audienced at the `/mcp` resource URI. The agent acts as its user, with that user's role narrowed to the granted `hookie:*` scopes. No CSRF header is required — a bearer token is not ambient credentials.","scopes":[],"schemeName":"bearerAuth"}},"dd52e6e1-d646-47a9-a117-9070008cf236":{"apiKey":{"type":"http","scheme":"bearer","description":"An `hk_…` admin API key from Settings → API keys. Acts as the member who created it, capped at the key's role (viewer, developer or admin) and optionally one project. Stored as a SHA-256 hash, shown once. No CSRF header is required.","scopes":[],"schemeName":"apiKey"}}},"servers":{"0ea1ddc9-3a31-4421-86e4-db5233ac2213":{"url":"https://app.hookie.ai","description":"Production"},"d5e32d1f-0c83-4838-aa53-3e0ffb5d5c54":{"url":"https://app.preview.hookie.ai","description":"Preview"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"cookie","name":"hookie_session","description":"The console's sealed session cookie, set by WorkOS AuthKit. Mutating requests also require the `X-Requested-With` CSRF header.","scopes":[],"schemeName":"session"},"schema":{"title":"hookie_session","type":"string","description":"The console's sealed session cookie, set by WorkOS AuthKit. Mutating requests also require the `X-Requested-With` CSRF header.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"session","name":"hookie_session"}],"title":"session"},{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"An OAuth 2.1 access token from a connected agent, audienced at the `/mcp` resource URI. The agent acts as its user, with that user's role narrowed to the granted `hookie:*` scopes. No CSRF header is required — a bearer token is not ambient credentials.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An OAuth 2.1 access token from a connected agent, audienced at the `/mcp` resource URI. The agent acts as its user, with that user's role narrowed to the granted `hookie:*` scopes. No CSRF header is required — a bearer token is not ambient credentials.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"},{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"An `hk_…` admin API key from Settings → API keys. Acts as the member who created it, capped at the key's role (viewer, developer or admin) and optionally one project. Stored as a SHA-256 hash, shown once. No CSRF header is required.","scopes":[],"schemeName":"apiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An `hk_…` admin API key from Settings → API keys. Acts as the member who created it, capped at the key's role (viewer, developer or admin) and optionally one project. Stored as a SHA-256 hash, shown once. No CSRF header is required.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"openapi.json"},"subdomain":"hookie-ai","siteName":"Hookie","title":"Create an outbound destination - Hookie","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-10T06:45:31.968Z","originalFileLocation":"api-reference/destinations/create-an-outbound-destination.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=\"Top-level alias: POST /admin/api/destinations. Write role required. The workspace-wide cap counts destinations with a non-null project_id and is checked before validation.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Hookie\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_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/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_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/hookie-ai/swNEJiZkoA-0uCAd/_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/hookie-ai/swNEJiZkoA-0uCAd/_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/hookie-ai/swNEJiZkoA-0uCAd/_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/hookie-ai/swNEJiZkoA-0uCAd/_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/hookie-ai/swNEJiZkoA-0uCAd/_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/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create an outbound destination - Hookie\">\u003cmeta data-mint-head property=\"og:description\" content=\"Top-level alias: POST /admin/api/destinations. Write role required. The workspace-wide cap counts destinations with a non-null project_id and is checked before validation.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Hookie\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.hookie.ai/api-reference/destinations/create-an-outbound-destination\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://hookie-ai.mintlify.app/_mintlify/api/og/v2?division=Destinations\u0026amp;title=Create+an+outbound+destination\u0026amp;description=Top-level+alias%3A+POST+%2Fadmin%2Fapi%2Fdestinations.+Write+role+required.+The+workspace-wide+cap+counts+destinations+with+a+non-null+project_id+and+is+checked+before+\u0026amp;theme=f4aa03159c73f069ac2e6bcf\u0026amp;signature=fdb0380bf55fe1d48c4ba83599dae7f2bdcade068444d7bcd1572c9019c2e443\">\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=\"Create an outbound destination - Hookie\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Top-level alias: POST /admin/api/destinations. Write role required. The workspace-wide cap counts destinations with a non-null project_id and is checked before validation.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://hookie-ai.mintlify.app/_mintlify/api/og/v2?division=Destinations\u0026amp;title=Create+an+outbound+destination\u0026amp;description=Top-level+alias%3A+POST+%2Fadmin%2Fapi%2Fdestinations.+Write+role+required.+The+workspace-wide+cap+counts+destinations+with+a+non-null+project_id+and+is+checked+before+\u0026amp;theme=f4aa03159c73f069ac2e6bcf\u0026amp;signature=fdb0380bf55fe1d48c4ba83599dae7f2bdcade068444d7bcd1572c9019c2e443\">\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/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Hookie\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2B56A1\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.hookie.ai/api-reference/destinations/create-an-outbound-destination\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/destinations/create-an-outbound-destination.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.hookie.ai/#organization\",\"name\":\"Hookie\",\"url\":\"https://docs.hookie.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/hookie-ai/3zmwtACPzz3wb-OX/logo/light.svg?fit=max\u0026auto=format\u0026n=3zmwtACPzz3wb-OX\u0026q=85\u0026s=3d05bb847a5407bc7e75e7270aafc101\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.hookie.ai#website\",\"name\":\"Hookie\",\"url\":\"https://docs.hookie.ai\",\"publisher\":{\"@id\":\"https://docs.hookie.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.hookie.ai/api-reference/destinations/create-an-outbound-destination#webpage\",\"url\":\"https://docs.hookie.ai/api-reference/destinations/create-an-outbound-destination\",\"name\":\"Create an outbound destination\",\"description\":\"Top-level alias: POST /admin/api/destinations. Write role required. The workspace-wide cap counts destinations with a non-null project_id and is checked before validation.\",\"dateModified\":\"2026-10-10T06:45:31.968Z\",\"isPartOf\":{\"@id\":\"https://docs.hookie.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.hookie.ai/api-reference/destinations/create-an-outbound-destination#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.hookie.ai/api-reference/destinations/create-an-outbound-destination#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API reference\",\"item\":\"https://docs.hookie.ai/api-reference/ingest/metas-url-verification-hubchallenge-on-the-public-webhook-url\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Destinations\",\"item\":\"https://docs.hookie.ai/api-reference/destinations/list-outbound-destinations\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Create an outbound destination\",\"item\":\"https://docs.hookie.ai/api-reference/destinations/create-an-outbound-destination\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.hookie.ai/api-reference/destinations/create-an-outbound-destination#apireference\",\"headline\":\"Create an outbound destination\",\"name\":\"Create an outbound destination\",\"description\":\"Top-level alias: POST /admin/api/destinations. Write role required. The workspace-wide cap counts destinations with a non-null project_id and is checked before validation.\",\"url\":\"https://docs.hookie.ai/api-reference/destinations/create-an-outbound-destination\",\"mainEntityOfPage\":{\"@id\":\"https://docs.hookie.ai/api-reference/destinations/create-an-outbound-destination#webpage\"},\"dateModified\":\"2026-10-10T06:45:31.968Z\",\"publisher\":{\"@id\":\"https://docs.hookie.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.hookie.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Hookie\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Hookie","nav":{"global":null,"groups":[{"group":"Get started","icon":"rocket","pages":[{"title":"Overview","sidebarTitle":"Overview","icon":{"name":"info-circle","style":"regular","library":"fontawesome"},"href":"/index"},{"title":"Quickstart","icon":{"name":"shipping-fast","style":"regular","library":"fontawesome"},"href":"/quickstart"}]},{"group":"Concepts","icon":"lightbulb","pages":[{"title":"Projects","icon":"folder-tree","href":"/projects"},{"title":"Endpoints and ingest keys","icon":"inbox","href":"/endpoints-and-keys"},{"title":"Datasets and records","icon":"table","href":"/datasets-and-records"},{"title":"Rules and mappings","icon":"route","href":"/rules-and-mappings"},{"title":"Destinations and deliveries","icon":"paper-plane","href":"/destinations-and-deliveries"},{"title":"Limits and plans","icon":"gauge","href":"/limits-and-plans"},{"title":"Billing","icon":"credit-card","href":"/billing"},{"title":"Roles, API keys and connected agents","sidebarTitle":"Roles and agents","icon":"user-shield","href":"/roles-and-agents"},{"title":"Glossary","icon":"book","href":"/glossary"}]},{"group":"CLI","icon":"terminal","pages":[{"title":"CLI","sidebarTitle":"Overview","icon":"terminal","href":"/cli/index"},{"title":"Operations","icon":"screwdriver-wrench","href":"/cli/operations"},{"title":"Command reference","icon":"list","href":"/cli/commands"},{"title":"Configuration","icon":"gear","href":"/cli/configuration"}]},{"group":"Guides","icon":"book-open","pages":[{"title":"Forms","icon":"rectangle-list","href":"/forms"},{"title":"Verify signatures","icon":"signature","href":"/signatures"},{"title":"Verify provider signatures","icon":"shield-check","href":"/endpoint-verification"},{"title":"Destination types and options","sidebarTitle":"Destination options","icon":"send","href":"/destinations"},{"title":"Slack app","icon":"slack","href":"/slack-app"},{"title":"Database sources","icon":"database","href":"/database-sources"},{"title":"Ingest keys","icon":"key","href":"/ingest-keys"},{"title":"Live streaming","icon":"radio","href":"/streaming"},{"title":"Workflows \u0026 AI agents","icon":{"name":"robot","style":"regular","library":"fontawesome"},"href":"/workflows"},{"title":"Customer portal","icon":"users","href":"/customer-portal"},{"title":"Broadcast Logs","icon":"tower-broadcast","href":"/broadcast-logs"},{"title":"Analytics","icon":"chart-line","href":"/analytics"},{"title":"Team members","icon":"users","href":"/team-members"},{"title":"Connected agents","icon":"plug","href":"/connected-agents"},{"title":"Agent self-registration","icon":"robot","href":"/agent-self-registration"},{"title":"WorkOS Agent Auth","icon":"id-badge","href":"/workos-agent-auth"},{"title":"API keys","icon":"lock","href":"/api-keys"},{"title":"Data API","icon":"database","href":"/data-api"},{"title":"Delete, export and close","icon":"trash-can","href":"/data-deletion"},{"title":"API reference","icon":"code","href":"/api-reference"}]},{"group":"API reference","icon":"terminal","pages":[{"group":"Ingest","pages":[{"title":"Meta's URL verification (hub.challenge) on the public webhook URL","deprecated":null,"version":null,"openapi":"/openapi.json get /{workspace}/{project}/{webhook}","href":"/api-reference/ingest/metas-url-verification-hubchallenge-on-the-public-webhook-url"},{"title":"Ingest an event through the public webhook URL","deprecated":null,"version":null,"openapi":"/openapi.json post /{workspace}/{project}/{webhook}","href":"/api-reference/ingest/ingest-an-event-through-the-public-webhook-url"},{"title":"CORS preflight for a page's fetch() to the public webhook URL","deprecated":null,"version":null,"openapi":"/openapi.json options /{workspace}/{project}/{webhook}","href":"/api-reference/ingest/cors-preflight-for-a-pages-fetch-to-the-public-webhook-url"},{"title":"Ingest an event through the public webhook URL, naming its dataset","deprecated":null,"version":null,"openapi":"/openapi.json post /{workspace}/{project}/{webhook}/{dataset}","href":"/api-reference/ingest/ingest-an-event-through-the-public-webhook-url-naming-its-dataset"},{"title":"Ingest an event with an ingest key (PUT alias of ingestEvent)","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/ingest/{ingest_key}","href":"/api-reference/ingest/ingest-an-event-with-an-ingest-key-put-alias-of-ingestevent"},{"title":"Ingest an event with an ingest key, routed by the project's mapping rules, with the key's default dataset as the fallback","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/ingest/{ingest_key}","href":"/api-reference/ingest/ingest-an-event-with-an-ingest-key-routed-by-the-projects-mapping-rules-with-the-keys-default-dataset-as-the-fallback"},{"title":"Ingest an event into a named dataset (PUT alias of ingestEventToDataset)","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/ingest/{ingest_key}/{dataset}","href":"/api-reference/ingest/ingest-an-event-into-a-named-dataset-put-alias-of-ingesteventtodataset"},{"title":"Ingest an event with an ingest key straight into a named dataset","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/ingest/{ingest_key}/{dataset}","href":"/api-reference/ingest/ingest-an-event-with-an-ingest-key-straight-into-a-named-dataset"},{"title":"Ingest into a configured endpoint (PUT alias of ingestWebhookEvent)","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/webhooks/{ingest_key}/{slug}","href":"/api-reference/ingest/ingest-into-a-configured-endpoint-put-alias-of-ingestwebhookevent"},{"title":"Ingest an event into a configured endpoint using an ingest key","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/webhooks/{ingest_key}/{slug}","href":"/api-reference/ingest/ingest-an-event-into-a-configured-endpoint-using-an-ingest-key"}]},{"group":"Streaming","pages":[{"title":"Tail the ingest key's project live event stream over SSE or WebSocket","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/stream","href":"/api-reference/streaming/tail-the-ingest-keys-project-live-event-stream-over-sse-or-websocket"},{"title":"Tail the current workspace's live event stream over SSE or WebSocket","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/stream","href":"/api-reference/streaming/tail-the-current-workspaces-live-event-stream-over-sse-or-websocket"}]},{"group":"Customer Portal","pages":[{"title":"Get the portal context for the caller's token or session","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/me","href":"/api-reference/customer-portal/get-the-portal-context-for-the-callers-token-or-session"},{"title":"List the dataset/event types this portal exposes","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/event-types","href":"/api-reference/customer-portal/list-the-datasetevent-types-this-portal-exposes"},{"title":"List this customer's own destinations","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/destinations","href":"/api-reference/customer-portal/list-this-customers-own-destinations"},{"title":"Create a destination for this customer","deprecated":null,"version":null,"openapi":"/openapi.json post /portal/api/destinations","href":"/api-reference/customer-portal/create-a-destination-for-this-customer"},{"title":"Edit, pause or resume one of this customer's destinations","deprecated":null,"version":null,"openapi":"/openapi.json put /portal/api/destinations/{id}","href":"/api-reference/customer-portal/edit-pause-or-resume-one-of-this-customers-destinations"},{"title":"Delete one of this customer's destinations","deprecated":null,"version":null,"openapi":"/openapi.json delete /portal/api/destinations/{id}","href":"/api-reference/customer-portal/delete-one-of-this-customers-destinations"},{"title":"Edit, pause or resume one of this customer's destinations","deprecated":null,"version":null,"openapi":"/openapi.json patch /portal/api/destinations/{id}","href":"/api-reference/customer-portal/edit-pause-or-resume-one-of-this-customers-destinations-1"},{"title":"List recent delivery attempts to this customer's destinations","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/deliveries","href":"/api-reference/customer-portal/list-recent-delivery-attempts-to-this-customers-destinations"},{"title":"Trade a portal token for a session cookie","deprecated":null,"version":null,"openapi":"/openapi.json post /portal/api/session","href":"/api-reference/customer-portal/trade-a-portal-token-for-a-session-cookie"},{"title":"Sign out of the portal","deprecated":null,"version":null,"openapi":"/openapi.json delete /portal/api/session","href":"/api-reference/customer-portal/sign-out-of-the-portal"},{"title":"Show a destination's signing secret again","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/destinations/{id}/secret","href":"/api-reference/customer-portal/show-a-destinations-signing-secret-again"},{"title":"Rotate a destination's signing secret, with an overlap","deprecated":null,"version":null,"openapi":"/openapi.json post /portal/api/destinations/{id}/rotate-secret","href":"/api-reference/customer-portal/rotate-a-destinations-signing-secret-with-an-overlap"},{"title":"End a rotation's overlap early","deprecated":null,"version":null,"openapi":"/openapi.json post /portal/api/destinations/{id}/expire-previous-secret","href":"/api-reference/customer-portal/end-a-rotations-overlap-early"},{"title":"One delivery, whole: why it failed","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/deliveries/{id}","href":"/api-reference/customer-portal/one-delivery-whole:-why-it-failed"},{"title":"Send a delivery again","deprecated":null,"version":null,"openapi":"/openapi.json post /portal/api/deliveries/{id}/replay","href":"/api-reference/customer-portal/send-a-delivery-again"},{"title":"Example payloads for each exposed event type, and how to verify a delivery (both signature schemes)","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/examples","href":"/api-reference/customer-portal/example-payloads-for-each-exposed-event-type-and-how-to-verify-a-delivery-both-signature-schemes"},{"title":"Table views the provider shared in the portal","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/views","href":"/api-reference/customer-portal/table-views-the-provider-shared-in-the-portal"},{"title":"One page of a shared view, for the signed-in customer","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/views/{id}/records","href":"/api-reference/customer-portal/one-page-of-a-shared-view-for-the-signed-in-customer"}]},{"group":"Account","pages":[{"title":"Current user, workspace and role","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/me","href":"/api-reference/account/current-user-workspace-and-role"}]},{"group":"Dashboard","pages":[{"title":"Workspace home dashboard rollup","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/dashboard/summary","href":"/api-reference/dashboard/workspace-home-dashboard-rollup"},{"title":"Bucketed activity series for the workspace","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/dashboard/timeseries","href":"/api-reference/dashboard/bucketed-activity-series-for-the-workspace"},{"title":"Analytics breakdown by project, endpoint, workflow and dataset","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/dashboard/analytics","href":"/api-reference/dashboard/analytics-breakdown-by-project-endpoint-workflow-and-dataset"}]},{"group":"Projects","pages":[{"title":"List projects in the workspace","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects","href":"/api-reference/projects/list-projects-in-the-workspace"},{"title":"Create a project","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects","href":"/api-reference/projects/create-a-project"},{"title":"Get one project with resource counts","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}","href":"/api-reference/projects/get-one-project-with-resource-counts"},{"title":"Delete a project","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}","href":"/api-reference/projects/delete-a-project"},{"title":"Rename a project or set its IP allowlist","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}","href":"/api-reference/projects/rename-a-project-or-set-its-ip-allowlist"},{"title":"Export a project's configuration","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/config","href":"/api-reference/projects/export-a-projects-configuration"},{"title":"Import a configuration into a project","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/config","href":"/api-reference/projects/import-a-configuration-into-a-project"},{"title":"Clone a project","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/clone","href":"/api-reference/projects/clone-a-project"}]},{"group":"Stats","pages":[{"title":"Traffic and delivery stats for one project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/stats","href":"/api-reference/stats/traffic-and-delivery-stats-for-one-project"}]},{"group":"Datasets","pages":[{"title":"List datasets with record counts","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/datasets","href":"/api-reference/datasets/list-datasets-with-record-counts"},{"title":"One page of a dataset's records, whole and flattened (export shape)","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/datasets/{dataset}","href":"/api-reference/datasets/one-page-of-a-datasets-records-whole-and-flattened-export-shape"}]},{"group":"Records","pages":[{"title":"Get one record with its full payload","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/records/{id}","href":"/api-reference/records/get-one-record-with-its-full-payload"},{"title":"Delete a record and every copy of it","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/records/{id}","href":"/api-reference/records/delete-a-record-and-every-copy-of-it"},{"title":"One page of a dataset's records, optionally through a saved view","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/datasets/{dataset}/records","href":"/api-reference/records/one-page-of-a-datasets-records-optionally-through-a-saved-view"},{"title":"Retired: records are read by dataset","deprecated":true,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/webhooks/{id}/records","href":"/api-reference/records/retired:-records-are-read-by-dataset"},{"title":"The dataset's latest purge","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/datasets/{dataset}/purge","href":"/api-reference/records/the-datasets-latest-purge"},{"title":"Delete every record in a dataset","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/datasets/{dataset}/purge","href":"/api-reference/records/delete-every-record-in-a-dataset"}]},{"group":"Submissions","pages":[{"title":"List raw submissions","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/submissions","href":"/api-reference/submissions/list-raw-submissions"},{"title":"Set a submission forward status","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/submissions/{id}","href":"/api-reference/submissions/set-a-submission-forward-status"}]},{"group":"Rules","pages":[{"title":"List mapping rules","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/rules","href":"/api-reference/rules/list-mapping-rules"},{"title":"Create a mapping rule","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/rules","href":"/api-reference/rules/create-a-mapping-rule"},{"title":"Get one rule","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/rules/{id}","href":"/api-reference/rules/get-one-rule"},{"title":"Delete a rule","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/rules/{id}","href":"/api-reference/rules/delete-a-rule"},{"title":"Update a rule","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/rules/{id}","href":"/api-reference/rules/update-a-rule"},{"title":"Test conditions and mappings against a sample payload","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/rules/test","href":"/api-reference/rules/test-conditions-and-mappings-against-a-sample-payload"}]},{"group":"Webhooks","pages":[{"title":"List endpoints","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/webhooks","href":"/api-reference/webhooks/list-endpoints"},{"title":"Create an endpoint","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/webhooks","href":"/api-reference/webhooks/create-an-endpoint"},{"title":"Publish a new version of a webhook","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/webhooks/{id}/versions","href":"/api-reference/webhooks/publish-a-new-version-of-a-webhook"},{"title":"Get one webhook","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/webhooks/{id}","href":"/api-reference/webhooks/get-one-webhook"},{"title":"Delete a webhook version","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/webhooks/{id}","href":"/api-reference/webhooks/delete-a-webhook-version"},{"title":"Change an endpoint: enabled, name, dataset, IP allowlist, form redirect, CORS origins, URL verification, signature verification","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/webhooks/{id}","href":"/api-reference/webhooks/change-an-endpoint:-enabled-name-dataset-ip-allowlist-form-redirect-cors-origins-url-verification-signature-verification"},{"title":"Give an endpoint a new public URL, with an overlap","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/webhooks/{id}/rotate","href":"/api-reference/webhooks/give-an-endpoint-a-new-public-url-with-an-overlap"},{"title":"Replace an endpoint's provider signing secret, with an overlap","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/webhooks/{id}/rotate-verification-secret","href":"/api-reference/webhooks/replace-an-endpoints-provider-signing-secret-with-an-overlap"},{"title":"One endpoint's received and refused requests","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/webhooks/{id}/activity","href":"/api-reference/webhooks/one-endpoints-received-and-refused-requests"}]},{"group":"Record views","pages":[{"title":"List saved record views","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/record-views","href":"/api-reference/record-views/list-saved-record-views"},{"title":"Create a record view","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/record-views","href":"/api-reference/record-views/create-a-record-view"},{"title":"Get one view","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/record-views/{id}","href":"/api-reference/record-views/get-one-view"},{"title":"Delete a record view","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/record-views/{id}","href":"/api-reference/record-views/delete-a-record-view"},{"title":"Update a record view","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/record-views/{id}","href":"/api-reference/record-views/update-a-record-view"}]},{"group":"Ingest keys","pages":[{"title":"List ingest keys","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ingest-keys","href":"/api-reference/ingest-keys/list-ingest-keys"},{"title":"Issue an ingest key","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/ingest-keys","href":"/api-reference/ingest-keys/issue-an-ingest-key"},{"title":"Get one ingest key","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ingest-keys/{id}","href":"/api-reference/ingest-keys/get-one-ingest-key"},{"title":"Revoke an ingest key","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/ingest-keys/{id}","href":"/api-reference/ingest-keys/revoke-an-ingest-key"},{"title":"Rename an ingest key, or set its expiry or IP allowlist","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/ingest-keys/{id}","href":"/api-reference/ingest-keys/rename-an-ingest-key-or-set-its-expiry-or-ip-allowlist"},{"title":"Rotate an ingest key with an overlap","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/ingest-keys/{id}/rotate","href":"/api-reference/ingest-keys/rotate-an-ingest-key-with-an-overlap"}]},{"group":"Destinations","pages":[{"title":"List outbound destinations","description":"Top-level alias: GET /admin/api/destinations. Readable by any role. Pages with ?limit and ?offset and returns total, limit and offset beside the array, which is unchanged (DX-6, #201).","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/destinations","href":"/api-reference/destinations/list-outbound-destinations"},{"title":"Create an outbound destination","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/destinations","href":"/api-reference/destinations/create-an-outbound-destination"},{"title":"Get one destination","description":"The object, as one row of the list returns it, or 404. This used to answer 200 with the whole list for any id (DX-6, #201). Readable by any role.","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/destinations/{id}","href":"/api-reference/destinations/get-one-destination"},{"title":"Delete a destination","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/destinations/{id}","href":"/api-reference/destinations/delete-a-destination"},{"title":"Edit a destination: name, URL or type settings, on/off, dataset filter, request options, alert URL or delivery limits","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/destinations/{id}","href":"/api-reference/destinations/edit-a-destination:-name-url-or-type-settings-onoff-dataset-filter-request-options-alert-url-or-delivery-limits"},{"title":"Reveal a destination signing secret","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/destinations/{id}/secret","href":"/api-reference/destinations/reveal-a-destination-signing-secret"},{"title":"Rotate a destination signing secret","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/destinations/{id}/rotate-secret","href":"/api-reference/destinations/rotate-a-destination-signing-secret"},{"title":"Stop signing with a destination's previous secret","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/destinations/{id}/expire-previous-secret","href":"/api-reference/destinations/stop-signing-with-a-destinations-previous-secret"}]},{"group":"Deliveries","pages":[{"title":"List outbound deliveries","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/deliveries","href":"/api-reference/deliveries/list-outbound-deliveries"},{"title":"Delivery health per destination: success rate, latency percentiles, error classes, time series","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/deliveries/metrics","href":"/api-reference/deliveries/delivery-health-per-destination:-success-rate-latency-percentiles-error-classes-time-series"},{"title":"Replay every delivery that did not arrive, by filter","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/deliveries/replay","href":"/api-reference/deliveries/replay-every-delivery-that-did-not-arrive-by-filter"},{"title":"List events whose deliveries are held past the monthly delivery allowance","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/deliveries/held","href":"/api-reference/deliveries/list-events-whose-deliveries-are-held-past-the-monthly-delivery-allowance"},{"title":"Send held deliveries now that there is room in the allowance","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/deliveries/held/release","href":"/api-reference/deliveries/send-held-deliveries-now-that-there-is-room-in-the-allowance"},{"title":"Get one delivery with its response body and every attempt","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/deliveries/{id}","href":"/api-reference/deliveries/get-one-delivery-with-its-response-body-and-every-attempt"},{"title":"Replay a delivery","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/deliveries/{id}/replay","href":"/api-reference/deliveries/replay-a-delivery"}]},{"group":"Search","pages":[{"title":"Search records (events)","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/search/events","href":"/api-reference/search/search-records-events"},{"title":"Search deliveries","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/search/deliveries","href":"/api-reference/search/search-deliveries"},{"title":"Search AI agent runs","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/search/ai-runs","href":"/api-reference/search/search-ai-agent-runs"},{"title":"Search the AI call log","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/search/ai-calls","href":"/api-reference/search/search-the-ai-call-log"},{"title":"Get one AI call in full","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/search/ai-calls/{id}","href":"/api-reference/search/get-one-ai-call-in-full"},{"title":"Search raw submissions","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/search/submissions","href":"/api-reference/search/search-raw-submissions"},{"title":"Correlate any pipeline id across the pipeline","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/search/correlate/{id}","href":"/api-reference/search/correlate-any-pipeline-id-across-the-pipeline"}]},{"group":"Audit","pages":[{"title":"Read the workspace audit log","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/audit","href":"/api-reference/audit/read-the-workspace-audit-log"},{"title":"List the actions recorded in the workspace audit log","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/audit/actions","href":"/api-reference/audit/list-the-actions-recorded-in-the-workspace-audit-log"}]},{"group":"Sources","pages":[{"title":"List inbound source connectors in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/sources","href":"/api-reference/sources/list-inbound-source-connectors-in-a-project"},{"title":"Create a source connector","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/sources","href":"/api-reference/sources/create-a-source-connector"},{"title":"Get one source","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/sources/{source_id}","href":"/api-reference/sources/get-one-source"},{"title":"Delete a source connector","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/sources/{source_id}","href":"/api-reference/sources/delete-a-source-connector"},{"title":"Update a source connector","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/sources/{source_id}","href":"/api-reference/sources/update-a-source-connector"},{"title":"Test a source connector's connection","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/sources/{source_id}/test","href":"/api-reference/sources/test-a-source-connectors-connection"}]},{"group":"Triggers","pages":[{"title":"List agentic-AI event triggers in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/triggers","href":"/api-reference/triggers/list-agentic-ai-event-triggers-in-a-project"},{"title":"Create an agentic-AI event trigger","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/triggers","href":"/api-reference/triggers/create-an-agentic-ai-event-trigger"},{"title":"Get one trigger","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/triggers/{trigger_id}","href":"/api-reference/triggers/get-one-trigger"},{"title":"Delete an AI trigger","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/triggers/{trigger_id}","href":"/api-reference/triggers/delete-an-ai-trigger"},{"title":"Enable or disable an AI trigger","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/triggers/{trigger_id}","href":"/api-reference/triggers/enable-or-disable-an-ai-trigger"}]},{"group":"Cron triggers","pages":[{"title":"List cron triggers in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/cron-triggers","href":"/api-reference/cron-triggers/list-cron-triggers-in-a-project"},{"title":"Create a cron trigger","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/cron-triggers","href":"/api-reference/cron-triggers/create-a-cron-trigger"},{"title":"Preview a cron schedule's next fire times","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/cron-triggers/preview","href":"/api-reference/cron-triggers/preview-a-cron-schedules-next-fire-times"},{"title":"Get one cron trigger","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/cron-triggers/{cron_trigger_id}","href":"/api-reference/cron-triggers/get-one-cron-trigger"},{"title":"Delete a cron trigger","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/cron-triggers/{cron_trigger_id}","href":"/api-reference/cron-triggers/delete-a-cron-trigger"},{"title":"Update a cron trigger","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/cron-triggers/{cron_trigger_id}","href":"/api-reference/cron-triggers/update-a-cron-trigger"},{"title":"Fire a cron trigger once, immediately","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/cron-triggers/{cron_trigger_id}/test","href":"/api-reference/cron-triggers/fire-a-cron-trigger-once-immediately"}]},{"group":"WebSocket triggers","pages":[{"title":"List WebSocket triggers in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ws-triggers","href":"/api-reference/websocket-triggers/list-websocket-triggers-in-a-project"},{"title":"Create a WebSocket trigger","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/ws-triggers","href":"/api-reference/websocket-triggers/create-a-websocket-trigger"},{"title":"Get one ws trigger","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ws-triggers/{ws_trigger_id}","href":"/api-reference/websocket-triggers/get-one-ws-trigger"},{"title":"Delete a WebSocket trigger","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/ws-triggers/{ws_trigger_id}","href":"/api-reference/websocket-triggers/delete-a-websocket-trigger"},{"title":"Edit, pause or resume a WebSocket trigger","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/ws-triggers/{ws_trigger_id}","href":"/api-reference/websocket-triggers/edit-pause-or-resume-a-websocket-trigger"},{"title":"Probe a WebSocket trigger's connection","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/ws-triggers/{ws_trigger_id}/test","href":"/api-reference/websocket-triggers/probe-a-websocket-triggers-connection"}]},{"group":"Workflows","pages":[{"title":"List workflow definitions in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/workflows","href":"/api-reference/workflows/list-workflow-definitions-in-a-project"},{"title":"Create a workflow definition","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/workflows","href":"/api-reference/workflows/create-a-workflow-definition"},{"title":"Get one workflow definition","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/workflows/{workflow_id}","href":"/api-reference/workflows/get-one-workflow-definition"},{"title":"Replace a workflow definition","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/projects/{project_id}/workflows/{workflow_id}","href":"/api-reference/workflows/replace-a-workflow-definition"},{"title":"Deactivate, or permanently delete, a workflow","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/workflows/{workflow_id}","href":"/api-reference/workflows/deactivate-or-permanently-delete-a-workflow"},{"title":"Change part of a workflow (merge)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/workflows/{workflow_id}","href":"/api-reference/workflows/change-part-of-a-workflow-merge"},{"title":"List instances of one workflow","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/workflows/{workflow_id}/instances","href":"/api-reference/workflows/list-instances-of-one-workflow"},{"title":"Get a workflow instance with its step events and per-step status","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/workflow-instances/{instance_id}","href":"/api-reference/workflows/get-a-workflow-instance-with-its-step-events-and-per-step-status"},{"title":"Cancel a workflow instance","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/workflow-instances/{instance_id}/cancel","href":"/api-reference/workflows/cancel-a-workflow-instance"},{"title":"Retry a workflow instance","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/workflow-instances/{instance_id}/retry","href":"/api-reference/workflows/retry-a-workflow-instance"}]},{"group":"AI agents","pages":[{"title":"List AI agents in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ai-agents","href":"/api-reference/ai-agents/list-ai-agents-in-a-project"},{"title":"Create an AI agent","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/ai-agents","href":"/api-reference/ai-agents/create-an-ai-agent"},{"title":"Get one AI agent","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ai-agents/{agent_id}","href":"/api-reference/ai-agents/get-one-ai-agent"},{"title":"Replace an AI agent","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/projects/{project_id}/ai-agents/{agent_id}","href":"/api-reference/ai-agents/replace-an-ai-agent"},{"title":"Retire, or permanently delete, an AI agent","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/ai-agents/{agent_id}","href":"/api-reference/ai-agents/retire-or-permanently-delete-an-ai-agent"},{"title":"Change an AI agent (only the fields sent)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/ai-agents/{agent_id}","href":"/api-reference/ai-agents/change-an-ai-agent-only-the-fields-sent"},{"title":"Models an AI trigger, agent or workflow AI step may name","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/ai-models","href":"/api-reference/ai-agents/models-an-ai-trigger-agent-or-workflow-ai-step-may-name"}]},{"group":"Portals","pages":[{"title":"The project's one customer portal","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/portal","href":"/api-reference/portals/the-projects-one-customer-portal"},{"title":"Create or update the project's customer portal","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/projects/{project_id}/portal","href":"/api-reference/portals/create-or-update-the-projects-customer-portal"},{"title":"Remove the project's customer portal for good","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/portal","href":"/api-reference/portals/remove-the-projects-customer-portal-for-good"},{"title":"Create or update the project's customer portal (PATCH, same as PUT)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/portal","href":"/api-reference/portals/create-or-update-the-projects-customer-portal-patch-same-as-put"},{"title":"List customer portals in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/portals","href":"/api-reference/portals/list-customer-portals-in-a-project"},{"title":"Create a customer portal","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/portals","href":"/api-reference/portals/create-a-customer-portal"},{"title":"Get one customer portal","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/portals/{portal_id}","href":"/api-reference/portals/get-one-customer-portal"},{"title":"Update a customer portal","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/projects/{project_id}/portals/{portal_id}","href":"/api-reference/portals/update-a-customer-portal"},{"title":"Disable a customer portal","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/portals/{portal_id}","href":"/api-reference/portals/disable-a-customer-portal"},{"title":"Update a customer portal (PATCH, same as PUT)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/portals/{portal_id}","href":"/api-reference/portals/update-a-customer-portal-patch-same-as-put"},{"title":"List a portal's access tokens","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/portals/{portal_id}/tokens","href":"/api-reference/portals/list-a-portals-access-tokens"},{"title":"Issue or revoke a portal access token","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/portals/{portal_id}/tokens","href":"/api-reference/portals/issue-or-revoke-a-portal-access-token"}]},{"group":"Connected agents","pages":[{"title":"List the signed-in user's OAuth-connected coding agents","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/agents","href":"/api-reference/connected-agents/list-the-signed-in-users-oauth-connected-coding-agents"},{"title":"Revoke a connected agent","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/agents/{grant_id}","href":"/api-reference/connected-agents/revoke-a-connected-agent"},{"title":"Change what a connected agent may do","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/agents/{grant_id}","href":"/api-reference/connected-agents/change-what-a-connected-agent-may-do"}]},{"group":"SSO","pages":[{"title":"List workspace SSO configurations","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/sso","href":"/api-reference/sso/list-workspace-sso-configurations"},{"title":"Create a workspace SSO configuration (not available)","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/sso","href":"/api-reference/sso/create-a-workspace-sso-configuration-not-available"},{"title":"Replace a workspace SSO configuration (not available)","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/sso/{sso_config_id}","href":"/api-reference/sso/replace-a-workspace-sso-configuration-not-available"},{"title":"Delete a workspace SSO configuration","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/sso/{sso_config_id}","href":"/api-reference/sso/delete-a-workspace-sso-configuration"},{"title":"Update a workspace SSO configuration (not available)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/sso/{sso_config_id}","href":"/api-reference/sso/update-a-workspace-sso-configuration-not-available"},{"title":"Check whether an SSO configuration is complete","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/sso/{sso_config_id}/test","href":"/api-reference/sso/check-whether-an-sso-configuration-is-complete"},{"title":"Read the workspace's SSO / Directory Sync request","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/sso/requests","href":"/api-reference/sso/read-the-workspaces-sso-directory-sync-request"},{"title":"Request single sign-on or Directory Sync","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/sso/requests","href":"/api-reference/sso/request-single-sign-on-or-directory-sync"},{"title":"Cancel a pending SSO / Directory Sync request","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/sso/requests/{request_id}","href":"/api-reference/sso/cancel-a-pending-sso-directory-sync-request"},{"title":"Open the WorkOS Admin Portal to set up SSO or Directory Sync","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/sso/portal-link","href":"/api-reference/sso/open-the-workos-admin-portal-to-set-up-sso-or-directory-sync"}]},{"group":"IP allowlist","pages":[{"title":"Read the workspace-level ingest IP allowlist","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/ip-allowlist","href":"/api-reference/ip-allowlist/read-the-workspace-level-ingest-ip-allowlist"},{"title":"Replace the workspace-level ingest IP allowlist","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/ip-allowlist","href":"/api-reference/ip-allowlist/replace-the-workspace-level-ingest-ip-allowlist"},{"title":"Replace the workspace-level ingest IP allowlist","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/ip-allowlist","href":"/api-reference/ip-allowlist/replace-the-workspace-level-ingest-ip-allowlist-1"}]},{"group":"Workspace","pages":[{"title":"The workspace's name, slug and former slugs","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/workspace","href":"/api-reference/workspace/the-workspaces-name-slug-and-former-slugs"},{"title":"Rename the workspace or change its slug","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/workspace","href":"/api-reference/workspace/rename-the-workspace-or-change-its-slug"},{"title":"List the workspace's admin API keys","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/api-keys","href":"/api-reference/workspace/list-the-workspaces-admin-api-keys"},{"title":"Create an admin API key (shown once)","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/api-keys","href":"/api-reference/workspace/create-an-admin-api-key-shown-once"},{"title":"Revoke an admin API key","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/api-keys/{key_id}","href":"/api-reference/workspace/revoke-an-admin-api-key"},{"title":"The pending workspace closure, if any","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/workspace/closure","href":"/api-reference/workspace/the-pending-workspace-closure-if-any"},{"title":"Close the workspace","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/workspace/closure","href":"/api-reference/workspace/close-the-workspace"},{"title":"Undo a pending closure","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/workspace/closure","href":"/api-reference/workspace/undo-a-pending-closure"},{"title":"Export all of the workspace's data","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/workspace/export","href":"/api-reference/workspace/export-all-of-the-workspaces-data"},{"title":"List the workspace's pending invites","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/invites","href":"/api-reference/workspace/list-the-workspaces-pending-invites"},{"title":"Create a shareable invite link","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/invites","href":"/api-reference/workspace/create-a-shareable-invite-link"},{"title":"Revoke a pending invite","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/invites/{invite_id}","href":"/api-reference/workspace/revoke-a-pending-invite"},{"title":"Join a workspace with an invite link's token","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/invites/accept","href":"/api-reference/workspace/join-a-workspace-with-an-invite-links-token"},{"title":"See what an invite link's token would join, without joining","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/invites/preview","href":"/api-reference/workspace/see-what-an-invite-links-token-would-join-without-joining"},{"title":"List the workspace's members","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/members","href":"/api-reference/workspace/list-the-workspaces-members"},{"title":"Remove a member, or leave the workspace","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/members/{user_id}","href":"/api-reference/workspace/remove-a-member-or-leave-the-workspace"},{"title":"Change a member's role","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/members/{user_id}","href":"/api-reference/workspace/change-a-members-role"},{"title":"Transfer ownership to another member","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/members/transfer-ownership","href":"/api-reference/workspace/transfer-ownership-to-another-member"},{"title":"List the workspaces the caller belongs to","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/workspaces","href":"/api-reference/workspace/list-the-workspaces-the-caller-belongs-to"},{"title":"Switch the caller's active workspace","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/workspaces/active","href":"/api-reference/workspace/switch-the-callers-active-workspace"},{"title":"The workspace's Google Workspace domain link","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/workspace/google-domain","href":"/api-reference/workspace/the-workspaces-google-workspace-domain-link"},{"title":"Link the owner's Google Workspace domain","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/workspace/google-domain","href":"/api-reference/workspace/link-the-owners-google-workspace-domain"},{"title":"Unlink the Google Workspace domain","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/workspace/google-domain","href":"/api-reference/workspace/unlink-the-google-workspace-domain"},{"title":"Change the role people from the linked domain join with","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/workspace/google-domain","href":"/api-reference/workspace/change-the-role-people-from-the-linked-domain-join-with"},{"title":"See what a claim token would take over","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/agent-accounts/claim-preview","href":"/api-reference/workspace/see-what-a-claim-token-would-take-over"},{"title":"Take ownership of a workspace an AI agent registered","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/agent-accounts/claim","href":"/api-reference/workspace/take-ownership-of-a-workspace-an-ai-agent-registered"}]},{"group":"Billing","pages":[{"title":"Current plan, subscription and display prices","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/billing/status","href":"/api-reference/billing/current-plan-subscription-and-display-prices"},{"title":"Start a new subscription via Stripe Checkout","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/billing/subscribe","href":"/api-reference/billing/start-a-new-subscription-via-stripe-checkout"},{"title":"Renewal date, payment failures, a pending cancellation and invoices, from Stripe","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/billing/details","href":"/api-reference/billing/renewal-date-payment-failures-a-pending-cancellation-and-invoices-from-stripe"},{"title":"Open Stripe's Customer Portal for this workspace","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/billing/portal","href":"/api-reference/billing/open-stripes-customer-portal-for-this-workspace"}]},{"group":"Presets","pages":[{"title":"Outbound destination preset catalog","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/destination-presets","href":"/api-reference/presets/outbound-destination-preset-catalog"},{"title":"Inbound source preset catalog","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/source-presets","href":"/api-reference/presets/inbound-source-preset-catalog"}]},{"group":"Data API","pages":[{"title":"The datasets this key may read, and their columns","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/data","href":"/api-reference/data-api/the-datasets-this-key-may-read-and-their-columns"},{"title":"One page of an exposed dataset, exposed columns only","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/data/{dataset}","href":"/api-reference/data-api/one-page-of-an-exposed-dataset-exposed-columns-only"},{"title":"What the project exposes to the Data API, and its keys (metadata only)","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/data-api","href":"/api-reference/data-api/what-the-project-exposes-to-the-data-api-and-its-keys-metadata-only"},{"title":"Replace what the project exposes","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/projects/{project_id}/data-api/exposures","href":"/api-reference/data-api/replace-what-the-project-exposes"},{"title":"Replace what the project exposes (PATCH, same as PUT)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/data-api/exposures","href":"/api-reference/data-api/replace-what-the-project-exposes-patch-same-as-put"},{"title":"Create a read-only Data API key (the plaintext is returned once)","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/data-api/keys","href":"/api-reference/data-api/create-a-read-only-data-api-key-the-plaintext-is-returned-once"},{"title":"Revoke a Data API key; it stops working immediately","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/data-api/keys/{key_id}","href":"/api-reference/data-api/revoke-a-data-api-key;-it-stops-working-immediately"}]},{"group":"Broadcast Logs","pages":[{"title":"The project's Broadcast Logs integration (or null) and the vendor catalog","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/telemetry","href":"/api-reference/broadcast-logs/the-projects-broadcast-logs-integration-or-null-and-the-vendor-catalog"},{"title":"Start forwarding the project's logs and traces over OTLP/HTTP (JSON) to one tool","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/telemetry","href":"/api-reference/broadcast-logs/start-forwarding-the-projects-logs-and-traces-over-otlphttp-json-to-one-tool"},{"title":"Remove the integration","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/telemetry","href":"/api-reference/broadcast-logs/remove-the-integration"},{"title":"Change the integration's settings or secrets, or enable / disable it","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/telemetry","href":"/api-reference/broadcast-logs/change-the-integrations-settings-or-secrets-or-enable-disable-it"},{"title":"Send one test log record (and span) to a draft or the saved configuration","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/telemetry/test","href":"/api-reference/broadcast-logs/send-one-test-log-record-and-span-to-a-draft-or-the-saved-configuration"}]},{"group":"Observability","pages":[{"title":"A project's flagged events: filtered and routing failed","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/errors","href":"/api-reference/observability/a-projects-flagged-events:-filtered-and-routing-failed"},{"title":"One flagged event, with its whole payload","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/errors/{id}","href":"/api-reference/observability/one-flagged-event-with-its-whole-payload"}]},{"group":"Status","pages":[{"title":"Is the API up?","deprecated":null,"version":null,"openapi":"/openapi.json get /health","href":"/api-reference/status/is-the-api-up?"},{"title":"CORS preflight for /health","deprecated":null,"version":null,"openapi":"/openapi.json options /health","href":"/api-reference/status/cors-preflight-for-health"},{"title":"Is the API up? (headers only)","deprecated":null,"version":null,"openapi":"/openapi.json head /health","href":"/api-reference/status/is-the-api-up?-headers-only"}]},{"group":"Agents","pages":[{"title":"Get a proof-of-work challenge to register an agent","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/agents/register/challenge","href":"/api-reference/agents/get-a-proof-of-work-challenge-to-register-an-agent"},{"title":"Register an AI agent's own Hookie account","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/agents/register","href":"/api-reference/agents/register-an-ai-agents-own-hookie-account"}]},{"group":"Delivery","pages":[{"title":"An outbound delivery to a destination","version":null,"deprecated":null,"openapi":"/openapi.json webhook delivery","href":"/api-reference/delivery/an-outbound-delivery-to-a-destination"}]}]}]},"basePath":"","title":"Create an outbound destination - Hookie","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-C8RPHPxo.js","utils-0BK-9q6z.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DfjzsUJT.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B4v9psJ4.js","snippetPresets-CpTQv-Ez.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-BNP-Fvr0.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BSgu6h1D.js","shallow-Biv1i9Gs.js","getApiPlaygroundDisplay-BoGOXhtF.js","CodeSnippet-DvQoT18_.js","CodeSnippets-Dnpa15xT.js","Page-Buji1S4J.js","getPastedJson-xAIyhUFE.js","icon-S6FBih11.js","MethodPill-SaYeUZyk.js","DuplicateIcon-Cs-p3v2Q.js","createIcon-DjCFEoHq.js","DynamicMarkdown-BcnBltEQ.js","SectionHeading-BUBl0eEF.js","axios-vUo_bRtp.js","Markdown-h4cOoD8d.js","clsx-B2v50t8t.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DJnKvr0g.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BHrrjR1K.js"]}