One message campaign’s engagement funnel — sends, deliveries, opens,
clicks, attribution, and the derived rates — plus its most-clicked
links. Resolves newsletters and flow campaigns alike (flow campaigns
carry no sent_date, and instead name the flow that sends them in
flow). SMS campaigns return the SMS stat set (opted_out,
failed) and no links.
Without period parameters the funnel covers the campaign’s whole
life. Pass period (or period=custom with start_date/end_date)
to scope it to a reporting window — the same window vocabulary as
every other report read, so its numbers line up with
/v1/reports/campaigns rows for the same period. The response echoes
the window in period; null means lifetime. top_links is always
lifetime — link clicks are not stored by day.
The campaign’s configuration is /v1/campaigns/{id}.
Target a subaccount instead of the main connected account.
Pass a subaccount id from get_account's subaccounts list. Only direct subaccounts
of the connected account are reachable — omit this for the main account itself.
The campaign's unique identifier (returned as campaign_id in report responses and id in campaign responses). Ids are opaque public strings — a numeric id from a Privy dashboard URL is not a valid API id and will 404; list campaigns and match by title instead.
Scope the funnel to a date range, resolved in the account's time zone. Pass custom together with start_date and end_date. Omit entirely for the campaign's lifetime funnel (the default).
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Privy Knowledge Base","colors":{"primary":"#254E5A","light":"#E3E32B","dark":"#254E5A"},"logo":{"light":"https://mintcdn.com/privy/fGrkZt933tBjY_zl/logo/light.svg?fit=max\u0026auto=format\u0026n=fGrkZt933tBjY_zl\u0026q=85\u0026s=36a01db426b7c94fac423778765cd517","dark":"https://mintcdn.com/privy/fGrkZt933tBjY_zl/logo/dark.svg?fit=max\u0026auto=format\u0026n=fGrkZt933tBjY_zl\u0026q=85\u0026s=24576b53a928bf065f4a636ab8dc3431"},"favicon":"https://mintcdn.com/privy/fGrkZt933tBjY_zl/logo/favicon.svg?fit=max\u0026auto=format\u0026n=fGrkZt933tBjY_zl\u0026q=85\u0026s=9fee6eb5a3c74b929294365e07a3f01d","background":{"color":{"light":"#FFF","dark":"#0D1D23"}},"navbar":{"links":[{"href":"https://www.privy.com/pricing","label":"Pricing"},{"href":"mailto:support@privy.com","label":"Contact Support"}],"primary":{"type":"button","label":"Login","href":"https://dashboard.privy.com"}},"footer":{"socials":{"x":"https://x.com/privy","linkedin":"https://www.linkedin.com/company/privy"}},"seo":{"indexing":"all"},"fonts":{"heading":{"family":"Matter","weight":650,"source":"https://public-assets.privy.com/MatterStandard-VF.woff2","format":"woff2"},"body":{"family":"Matter","weight":400,"source":"https://public-assets.privy.com/MatterStandard-VF.woff2","format":"woff2"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"privy","hasAudioNarration":false,"actualSubdomain":"privy","customDomains":["help.privy.com"],"gitSource":{"type":"github","owner":"privy","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"issues":true,"edits":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af3ac7069be62302954224f","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"default","tag":"Learn","count":275},{"language":"default","tag":"Developer","count":49},{"language":"default","tag":"Integrations","count":30},{"language":"default","tag":"Strategy Guides","count":24},{"language":"default","tag":"Flows","count":18},{"language":"default","tag":"Account + Billing","count":18},{"language":"default","tag":"Contacts","count":17},{"language":"default","tag":"Displays","count":15},{"language":"default","tag":"Deliverability","count":11},{"language":"default","tag":"Content","count":10}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@font-face{font-family:\"Matter\";src:url(\"https://public-assets.privy.com/MatterStandard-VF.woff2\") format(\"woff2\");font-display:swap;font-style:normal;font-weight:600}.mdx-content strong,.mdx-content b{font-weight:600}.mdx-content em,.mdx-content i{font-style:italic}"}],"page":{"pagePath":"docs/api-reference/get-campaign-performance","slug":"/docs/api-reference/get-campaign-performance","pageMetadata":{"title":"Get campaign performance","openapi":"openapi/privy-api.yaml GET /reports/campaigns/{campaign_id}","description":"One message campaign's engagement funnel — sends, deliveries, opens,\nclicks, attribution, and the derived rates — plus its most-clicked\nlinks. Resolves newsletters and flow campaigns alike (flow campaigns\ncarry no `sent_date`, and instead name the flow that sends them in\n`flow`). SMS campaigns return the SMS stat set (`opted_out`,\n`failed`) and no links.\n\nWithout period parameters the funnel covers the campaign's **whole\nlife**. Pass `period` (or `period=custom` with `start_date`/`end_date`)\nto scope it to a reporting window — the same window vocabulary as\nevery other report read, so its numbers line up with\n`/v1/reports/campaigns` rows for the same period. The response echoes\nthe window in `period`; `null` means lifetime. `top_links` is always\nlifetime — link clicks are not stored by day.\n\nThe campaign's configuration is `/v1/campaigns/{id}`.\n\n**Required scope:** `reports_read`\n","href":"/docs/api-reference/get-campaign-performance"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"One message campaign’s engagement funnel — sends, deliveries, opens,\\nclicks, attribution, and the derived rates — plus its most-clicked\\nlinks. Resolves newsletters and flow campaigns alike (flow campaigns\\ncarry no \", _jsx(_components.code, {\n children: \"sent_date\"\n }), \", and instead name the flow that sends them in\\n\", _jsx(_components.code, {\n children: \"flow\"\n }), \"). SMS campaigns return the SMS stat set (\", _jsx(_components.code, {\n children: \"opted_out\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"failed\"\n }), \") and no links.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Without period parameters the funnel covers the campaign’s \", _jsx(_components.strong, {\n children: \"whole\\nlife\"\n }), \". Pass \", _jsx(_components.code, {\n children: \"period\"\n }), \" (or \", _jsx(_components.code, {\n children: \"period=custom\"\n }), \" with \", _jsx(_components.code, {\n children: \"start_date\"\n }), \"/\", _jsx(_components.code, {\n children: \"end_date\"\n }), \")\\nto scope it to a reporting window — the same window vocabulary as\\nevery other report read, so its numbers line up with\\n\", _jsx(_components.code, {\n children: \"/v1/reports/campaigns\"\n }), \" rows for the same period. The response echoes\\nthe window in \", _jsx(_components.code, {\n children: \"period\"\n }), \"; \", _jsx(_components.code, {\n children: \"null\"\n }), \" means lifetime. \", _jsx(_components.code, {\n children: \"top_links\"\n }), \" is always\\nlifetime — link clicks are not stored by day.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The campaign’s configuration is \", _jsx(_components.code, {\n children: \"/v1/campaigns/{id}\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Required scope:\"\n }), \" \", _jsx(_components.code, {\n children: \"reports_read\"\n })]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Get campaign performance","openapi":"openapi/privy-api.yaml GET /reports/campaigns/{campaign_id}","description":"One message campaign's engagement funnel — sends, deliveries, opens,\nclicks, attribution, and the derived rates — plus its most-clicked\nlinks. Resolves newsletters and flow campaigns alike (flow campaigns\ncarry no `sent_date`, and instead name the flow that sends them in\n`flow`). SMS campaigns return the SMS stat set (`opted_out`,\n`failed`) and no links.\n\nWithout period parameters the funnel covers the campaign's **whole\nlife**. Pass `period` (or `period=custom` with `start_date`/`end_date`)\nto scope it to a reporting window — the same window vocabulary as\nevery other report read, so its numbers line up with\n`/v1/reports/campaigns` rows for the same period. The response echoes\nthe window in `period`; `null` means lifetime. `top_links` is always\nlifetime — link clicks are not stored by day.\n\nThe campaign's configuration is `/v1/campaigns/{id}`.\n\n**Required scope:** `reports_read`\n","href":"/docs/api-reference/get-campaign-performance"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"getCampaignReport","summary":"Get campaign performance","description":"One message campaign's engagement funnel — sends, deliveries, opens,\nclicks, attribution, and the derived rates — plus its most-clicked\nlinks. Resolves newsletters and flow campaigns alike (flow campaigns\ncarry no `sent_date`, and instead name the flow that sends them in\n`flow`). SMS campaigns return the SMS stat set (`opted_out`,\n`failed`) and no links.\n\nWithout period parameters the funnel covers the campaign's **whole\nlife**. Pass `period` (or `period=custom` with `start_date`/`end_date`)\nto scope it to a reporting window — the same window vocabulary as\nevery other report read, so its numbers line up with\n`/v1/reports/campaigns` rows for the same period. The response echoes\nthe window in `period`; `null` means lifetime. `top_links` is always\nlifetime — link clicks are not stored by day.\n\nThe campaign's configuration is `/v1/campaigns/{id}`.\n\n**Required scope:** `reports_read`\n","tags":["Reports"],"security":["713a085f-c3f8-4098-ba26-f657b70b7333"],"parameters":["a6e6f5e9-8df1-4f20-b378-08e336127ad9","a5335049-d860-4c82-bcbf-898ffcbbd142","593c3d95-04a8-4554-bce6-ecb4bb088546","c3d2daf9-a48e-47f8-b1dc-6abee84af358","ea265eec-174b-4214-9476-823fc4419405"],"responses":{"200":"0479e874-1f0a-4762-b045-807ad93cef4f","401":"bcadd86d-7814-4c75-b6e8-3ec4b2d6d9b0","403":"8337849f-73fd-4819-a8cc-46d0da6c3c03","404":"08c39cc9-2ff9-4bb8-a0c7-17b9d5ed64e2","422":"18a70e8c-96c3-4f7a-a6b8-2cba4887843d","429":"69958811-c9aa-4d30-8997-911abc76ab06"},"method":"get","type":"path","servers":["97f63e03-f020-41b7-a5b9-e312bbfed47d"],"path":"/reports/campaigns/{campaign_id}","baseUrlOptions":["https://api.privy.com/v1"],"title":"Get campaign performance","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"a6e6f5e9-8df1-4f20-b378-08e336127ad9":{"name":"Privy-Account-Id","in":"header","required":false,"description":"Target a subaccount instead of the main connected account.\nPass a subaccount `id` from get_account's `subaccounts` list. Only direct subaccounts\nof the connected account are reachable — omit this for the main account itself.\n","schema":{"type":"string","isRequired":false,"description":"Target a subaccount instead of the main connected account.\nPass a subaccount `id` from get_account's `subaccounts` list. Only direct subaccounts\nof the connected account are reachable — omit this for the main account itself.\n","uniqueKey":"","typeLabel":"string"},"example":"S1U2B3A4C5C6T7"},"a5335049-d860-4c82-bcbf-898ffcbbd142":{"name":"campaign_id","in":"path","required":true,"description":"The campaign's unique identifier (returned as `campaign_id` in report responses and `id` in campaign responses). Ids are opaque public strings — a numeric id from a Privy dashboard URL is not a valid API id and will 404; list campaigns and match by title instead.","schema":{"type":"string","isRequired":true,"description":"The campaign's unique identifier (returned as `campaign_id` in report responses and `id` in campaign responses). Ids are opaque public strings — a numeric id from a Privy dashboard URL is not a valid API id and will 404; list campaigns and match by title instead.","uniqueKey":"","typeLabel":"string"},"example":"kD4qN8wZr1"},"593c3d95-04a8-4554-bce6-ecb4bb088546":{"name":"period","in":"query","description":"Scope the funnel to a date range, resolved in the account's time zone. Pass `custom` together with `start_date` and `end_date`. Omit entirely for the campaign's lifetime funnel (the default).\n","schema":{"type":"string","enum":["last_7_days","last_30_days","last_90_days","this_month","last_month","custom"],"description":"Scope the funnel to a date range, resolved in the account's time zone. Pass `custom` together with `start_date` and `end_date`. Omit entirely for the campaign's lifetime funnel (the default).\n","uniqueKey":"","typeLabel":"enum\u003cstring>"},"example":"last_30_days"},"c3d2daf9-a48e-47f8-b1dc-6abee84af358":{"name":"start_date","in":"query","description":"Inclusive start of a `custom` period (ISO 8601 date). Required when `period=custom`, ignored otherwise.","schema":{"type":"string","format":"date","description":"Inclusive start of a `custom` period (ISO 8601 date). Required when `period=custom`, ignored otherwise.","uniqueKey":"","typeLabel":"string\u003cdate>"},"example":"2026-06-01"},"ea265eec-174b-4214-9476-823fc4419405":{"name":"end_date","in":"query","description":"Inclusive end of a `custom` period (ISO 8601 date). Required when `period=custom`, ignored otherwise. Custom periods are capped at 366 days.","schema":{"type":"string","format":"date","description":"Inclusive end of a `custom` period (ISO 8601 date). Required when `period=custom`, ignored otherwise. Custom periods are capped at 366 days.","uniqueKey":"","typeLabel":"string\u003cdate>"},"example":"2026-06-30"}},"responses":{"0479e874-1f0a-4762-b045-807ad93cef4f":{"description":"The campaign's engagement funnel — lifetime, or scoped to the requested period.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"campaign_id":{"type":"string","description":"The campaign's unique identifier. It matches `id` in `/v1/campaigns` responses.\n","example":"kD4qN8wZr1","uniqueKey":"data.campaign_id","typeLabel":"string"},"type":{"type":"string","description":"Discriminates the two campaign families — `newsletter` (email and SMS one-time sends) and `flow` (the messages automation flows send).\n","enum":["newsletter","flow"],"example":"newsletter","uniqueKey":"data.type","typeLabel":"enum\u003cstring>"},"title":{"oneOf":[{"type":"string","example":"June Restock Announcement","uniqueKey":"data.title.oneOf.0","typeLabel":"string"},{"type":"null","example":"June Restock Announcement","uniqueKey":"data.title.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.title","typeLabel":"string | null"},"channel":{"type":"string","enum":["email","sms"],"example":"email","uniqueKey":"data.channel","typeLabel":"enum\u003cstring>"},"ab_test":{"oneOf":[{"type":"object","description":"Per-version A/B results when this newsletter is a test, `null` otherwise (flow campaigns never are). Test-scoped: the period parameters do not apply to this block.\n","properties":{"state":{"type":"string","enum":["draft","scheduled","preparing","awaiting_winner","sending","sent","partially_sent","canceled","unsent"],"description":"The campaign's send lifecycle, the same value as `status` on `/v1/campaigns`. `preparing`, `awaiting_winner` and `sending` mean the test is still running.\n","example":"sent","uniqueKey":"data.ab_test.oneOf.0.state","typeLabel":"enum\u003cstring>"},"winning_metric":{"oneOf":[{"type":"string","enum":["open_rate","click_rate","order_rate",null],"description":"The metric the winner is chosen on, reported in each version's `decision`.","example":"click_rate","uniqueKey":"data.ab_test.oneOf.0.winning_metric.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["open_rate","click_rate","order_rate",null],"description":"The metric the winner is chosen on, reported in each version's `decision`.","example":"click_rate","uniqueKey":"data.ab_test.oneOf.0.winning_metric.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.winning_metric","typeLabel":"enum\u003cstring> | null"},"results_source":{"type":"string","enum":["snapshot","live"],"description":"`snapshot` — frozen figures the winner was decided on. `live` — counted within the last 10 minutes; the numbers can still move. A decided test with no readable snapshot also reports `live`, bounded by `decision_due_at`.\n","example":"snapshot","uniqueKey":"data.ab_test.oneOf.0.results_source","typeLabel":"enum\u003cstring>"},"measured_at":{"type":"string","format":"date-time","description":"When the `decision` figures were taken: the snapshot's cutoff, or for live figures `decision_due_at` once it has passed, and otherwise the time they were counted, up to 10 minutes before this request.\n","example":"2026-06-19T09:00:00Z","uniqueKey":"data.ab_test.oneOf.0.measured_at","typeLabel":"string\u003cdate-time>"},"decision_due_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the decision window closes. `null` until the test audience has finished sending, including while an `awaiting_winner` test is still sending to it, and for a test that ended before then.\n","example":"2026-06-19T09:00:00Z","uniqueKey":"data.ab_test.oneOf.0.decision_due_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the decision window closes. `null` until the test audience has finished sending, including while an `awaiting_winner` test is still sending to it, and for a test that ended before then.\n","example":"2026-06-19T09:00:00Z","uniqueKey":"data.ab_test.oneOf.0.decision_due_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.decision_due_at","typeLabel":"string\u003cdate-time> | null"},"winner_selected_at":{"oneOf":[{"type":"string","format":"date-time","description":"When a winner was committed. `null` until then.","example":"2026-06-19T09:04:00Z","uniqueKey":"data.ab_test.oneOf.0.winner_selected_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When a winner was committed. `null` until then.","example":"2026-06-19T09:04:00Z","uniqueKey":"data.ab_test.oneOf.0.winner_selected_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.winner_selected_at","typeLabel":"string\u003cdate-time> | null"},"completed_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the winning version finished sending to the remainder. `null` until then, and for a canceled or failed test.\n","example":"2026-06-19T11:30:00Z","uniqueKey":"data.ab_test.oneOf.0.completed_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the winning version finished sending to the remainder. `null` until then, and for a canceled or failed test.\n","example":"2026-06-19T11:30:00Z","uniqueKey":"data.ab_test.oneOf.0.completed_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.completed_at","typeLabel":"string\u003cdate-time> | null"},"winner_version_id":{"oneOf":[{"type":"string","description":"The `id` of the winning version. `null` until a winner is committed.","example":"cpv_YJGOjpJ","uniqueKey":"data.ab_test.oneOf.0.winner_version_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The `id` of the winning version. `null` until a winner is committed.","example":"cpv_YJGOjpJ","uniqueKey":"data.ab_test.oneOf.0.winner_version_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.winner_version_id","typeLabel":"string | null"},"selection_reason":{"oneOf":[{"type":"string","enum":["highest_metric","tie_control","tie_random","no_data_control",null],"description":"Why the winning version was chosen. `null` until a winner is\ncommitted.\n\n- `highest_metric` — one version led on the metric.\n- `tie_control` — versions tied and the control was among them, so\n the control was kept.\n- `tie_random` — versions tied with no control among them, so one was\n picked at random.\n- `no_data_control` — nothing was delivered for any version, so the\n control was kept by default.\n","example":"highest_metric","uniqueKey":"data.ab_test.oneOf.0.selection_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["highest_metric","tie_control","tie_random","no_data_control",null],"description":"Why the winning version was chosen. `null` until a winner is\ncommitted.\n\n- `highest_metric` — one version led on the metric.\n- `tie_control` — versions tied and the control was among them, so\n the control was kept.\n- `tie_random` — versions tied with no control among them, so one was\n picked at random.\n- `no_data_control` — nothing was delivered for any version, so the\n control was kept by default.\n","example":"highest_metric","uniqueKey":"data.ab_test.oneOf.0.selection_reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.selection_reason","typeLabel":"enum\u003cstring> | null"},"audience":{"type":"object","description":"The audience split, populated when generation runs — every count is `null` on a test that has not launched.\n","properties":{"eligible_count":{"oneOf":[{"type":"integer","description":"Contacts matching the campaign's audience.","example":12000,"uniqueKey":"data.ab_test.oneOf.0.audience.eligible_count.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Contacts matching the campaign's audience.","example":12000,"uniqueKey":"data.ab_test.oneOf.0.audience.eligible_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.audience.eligible_count","typeLabel":"integer | null"},"test_count":{"oneOf":[{"type":"integer","description":"Contacts in the test cohort, across all versions.","example":3000,"uniqueKey":"data.ab_test.oneOf.0.audience.test_count.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Contacts in the test cohort, across all versions.","example":3000,"uniqueKey":"data.ab_test.oneOf.0.audience.test_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.audience.test_count","typeLabel":"integer | null"},"remainder_count":{"oneOf":[{"type":"integer","description":"Contacts held back to receive the winning version after the decision. Zero when the versions' shares consume the whole audience — a legitimate setup that leaves nobody for the winner to be sent to.\n","example":9000,"uniqueKey":"data.ab_test.oneOf.0.audience.remainder_count.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Contacts held back to receive the winning version after the decision. Zero when the versions' shares consume the whole audience — a legitimate setup that leaves nobody for the winner to be sent to.\n","example":9000,"uniqueKey":"data.ab_test.oneOf.0.audience.remainder_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.audience.remainder_count","typeLabel":"integer | null"}},"uniqueKey":"data.ab_test.oneOf.0.audience","typeLabel":"object"},"versions":{"type":"array","description":"The versions in labelled order (A, B, C…); the control is first.","items":{"type":"object","description":"One version's results.","properties":{"id":{"type":"string","description":"Opaque, stable version identifier, prefixed `cpv_`. The same id as the version on `GET /v1/campaigns/{id}`.\n","example":"cpv_dkyYZmk","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].id","typeLabel":"string"},"name":{"type":"string","example":"Version A","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].name","typeLabel":"string"},"is_control":{"type":"boolean","example":true,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].is_control","typeLabel":"boolean"},"is_winner":{"type":"boolean","description":"Whether this version won. `false` on every version until a winner is committed.","example":false,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].is_winner","typeLabel":"boolean"},"audience_share":{"oneOf":[{"type":"number","description":"Share of the eligible audience (0–1) this version was sent to during the test.","example":0.125,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].audience_share.oneOf.0","typeLabel":"number"},{"type":"null","description":"Share of the eligible audience (0–1) this version was sent to during the test.","example":0.125,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].audience_share.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].audience_share","typeLabel":"number | null"},"subject":{"oneOf":[{"type":"string","description":"This version's human-readable label: its subject line, or its message body for SMS.\n","example":"The restock you asked for is here","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].subject.oneOf.0","typeLabel":"string"},{"type":"null","description":"This version's human-readable label: its subject line, or its message body for SMS.\n","example":"The restock you asked for is here","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].subject.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].subject","typeLabel":"string | null"},"decision":{"oneOf":[{"type":"object","description":"The figures the winner is chosen on. `null` when the test has no winning metric.","properties":{"metric_value":{"type":"object","description":"`numerator` over `denominator`, as a percent.","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.0.metric_value.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.0.metric_value.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.0.metric_value","typeLabel":"object"},"numerator":{"type":"object","description":"The version's count for `winning_metric`: unique opens, unique clicks, or attributed orders placed by the window's close.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.0.numerator.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.0.numerator.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.0.numerator","typeLabel":"object"},"denominator":{"type":"object","description":"Messages delivered for this version within the window.","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.0.denominator.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.0.denominator.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.0.denominator","typeLabel":"object"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.0","typeLabel":"object"},{"type":"null","description":"The figures the winner is chosen on. `null` when the test has no winning metric.","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].decision","typeLabel":"object | null"},"stats":{"type":"object","description":"One version's lifetime performance, with the keys and units of the\ncampaign-level `stats` block (email or SMS set), plus `assigned`.\nCounts every send of this version's message, so the winning version's\nfigures include the remainder sent to it after the decision. Unlike\n`decision`, these keep moving as late engagement and orders arrive, and\nthey ignore the report period.\n\nDifferences from the campaign-level block: `opened_unique` and\n`clicked_unique` count distinct recipients exactly, with no monthly\ndrift, and an SMS version's `order_rate` divides by `delivered` rather\nthan `sent`. `bounced`, `spam_reports`, `unsubscribed` and `opted_out`\ncount every event, as at campaign level.\n","properties":{"assigned":{"type":"object","description":"Contacts allocated to this version's test cohort when the audience was frozen. The winner's other figures include the remainder send, so its `sent` can exceed `assigned`.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.assigned.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.assigned.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.assigned","typeLabel":"object"},"sent":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.sent.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.sent.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.sent","typeLabel":"object"},"delivered":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.delivered.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.delivered.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.delivered","typeLabel":"object"},"delivery_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.delivery_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.delivery_rate.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.delivery_rate","typeLabel":"object"},"opened_unique":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.opened_unique.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.opened_unique.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.opened_unique","typeLabel":"object"},"open_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.open_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.open_rate.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.open_rate","typeLabel":"object"},"clicked_unique":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.clicked_unique.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.clicked_unique.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.clicked_unique","typeLabel":"object"},"click_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.click_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.click_rate.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.click_rate","typeLabel":"object"},"bounced":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.bounced.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.bounced.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.bounced","typeLabel":"object"},"bounce_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.bounce_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.bounce_rate.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.bounce_rate","typeLabel":"object"},"spam_reports":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.spam_reports.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.spam_reports.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.spam_reports","typeLabel":"object"},"unsubscribed":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.unsubscribed.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.unsubscribed.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.unsubscribed","typeLabel":"object"},"unsubscribe_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.unsubscribe_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.unsubscribe_rate.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.unsubscribe_rate","typeLabel":"object"},"opted_out":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.opted_out.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.opted_out.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.opted_out","typeLabel":"object"},"failed":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.failed.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.failed.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.failed","typeLabel":"object"},"attributed_orders":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.attributed_orders.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.attributed_orders.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.attributed_orders","typeLabel":"object"},"order_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.order_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.order_rate.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.order_rate","typeLabel":"object"},"attributed_revenue":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.attributed_revenue.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.attributed_revenue.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.attributed_revenue","typeLabel":"object"},"average_order_value":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.average_order_value.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.average_order_value.unit","typeLabel":"string"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats.average_order_value","typeLabel":"object"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].stats","typeLabel":"object"},"top_links":{"type":"array","description":"This version's most-clicked links, best first, deduped by URL — at most 100 links are reported. Lifetime clicks, like `stats`. Email tests only; absent for SMS.\n","items":{"type":"object","properties":{"url":{"type":"string","example":"https://shop.example.com/collections/restock","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].top_links.items.[INDEX].url","typeLabel":"string"},"name":{"oneOf":[{"type":"string","description":"The link's display name from the email content, when one was set.","example":"Shop the restock","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].top_links.items.[INDEX].name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The link's display name from the email content, when one was set.","example":"Shop the restock","uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].top_links.items.[INDEX].name.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].top_links.items.[INDEX].name","typeLabel":"string | null"},"clicks":{"type":"integer","example":402,"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].top_links.items.[INDEX].clicks","typeLabel":"integer"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].top_links.items.[INDEX]","typeLabel":"object"},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX].top_links","typeLabel":"object[]"}},"uniqueKey":"data.ab_test.oneOf.0.versions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"data.ab_test.oneOf.0.versions","typeLabel":"object[]"}},"uniqueKey":"data.ab_test.oneOf.0","typeLabel":"object"},{"type":"null","description":"Per-version A/B results when this newsletter is a test, `null` otherwise (flow campaigns never are). Test-scoped: the period parameters do not apply to this block.\n","uniqueKey":"data.ab_test.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.ab_test","typeLabel":"object | null"},"sent_date":{"oneOf":[{"type":"string","format":"date","description":"Newsletters only — flow campaigns send continuously, so their detail omits this field.\n","example":"2026-06-18","uniqueKey":"data.sent_date.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Newsletters only — flow campaigns send continuously, so their detail omits this field.\n","example":"2026-06-18","uniqueKey":"data.sent_date.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.sent_date","typeLabel":"string\u003cdate> | null"},"flow":{"oneOf":[{"type":"object","description":"Flow campaigns only — the flow that sends this message. Newsletter details omit the field entirely; a flow campaign whose node has since been deleted carries `null`.\n","properties":{"id":{"type":"string","description":"The flow's identifier, as returned by `GET /v1/flows`.","example":"0Rqw3Z8","uniqueKey":"data.flow.oneOf.0.id","typeLabel":"string"},"title":{"oneOf":[{"type":"string","example":"Welcome Series","uniqueKey":"data.flow.oneOf.0.title.oneOf.0","typeLabel":"string"},{"type":"null","example":"Welcome Series","uniqueKey":"data.flow.oneOf.0.title.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.flow.oneOf.0.title","typeLabel":"string | null"}},"uniqueKey":"data.flow.oneOf.0","typeLabel":"object"},{"type":"null","description":"Flow campaigns only — the flow that sends this message. Newsletter details omit the field entirely; a flow campaign whose node has since been deleted carries `null`.\n","uniqueKey":"data.flow.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.flow","typeLabel":"object | null"},"period":{"oneOf":[{"type":"object","description":"The window `stats` covers. `null` means the campaign's whole life — the default when no period parameters were passed.\n","properties":{"label":{"type":"string","enum":["last_7_days","last_30_days","last_90_days","this_month","last_month","custom"],"example":"last_30_days","uniqueKey":"data.period.oneOf.0.label","typeLabel":"enum\u003cstring>"},"start_date":{"type":"string","format":"date","example":"2026-06-21","uniqueKey":"data.period.oneOf.0.start_date","typeLabel":"string\u003cdate>"},"end_date":{"type":"string","format":"date","example":"2026-07-20","uniqueKey":"data.period.oneOf.0.end_date","typeLabel":"string\u003cdate>"}},"uniqueKey":"data.period.oneOf.0","typeLabel":"object"},{"type":"null","description":"The window `stats` covers. `null` means the campaign's whole life — the default when no period parameters were passed.\n","uniqueKey":"data.period.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.period","typeLabel":"object | null"},"stats":{"type":"object","description":"The campaign's engagement funnel over the window the response covers —\nthe resolved report period on list rows and period-scoped detail reads,\nor the campaign's whole life on the default (no-period) detail read.\nEmail campaigns carry `delivery_rate`, `opened_unique`, `open_rate`,\n`bounced`, `bounce_rate`, `spam_reports`, `unsubscribed`,\n`unsubscribe_rate`, and `average_order_value`; SMS campaigns carry\n`opted_out` and `failed`; both carry the rest.\n\n`attributed_orders` and `attributed_revenue` credit the campaign when\none of its messages was the contact's most recent engagement — email\nopen, email click, or SMS click — in the 7 days before the order was\nplaced. `order_rate` is those orders over the messages the campaign\ngot out: email deliveries for an email campaign, sends for an SMS one —\nso an SMS campaign's `order_rate` is not directly comparable with an\nemail campaign's (undelivered messages still sit in the denominator).\n\nThe rates do not share one denominator. `delivery_rate` and\n`bounce_rate` are over `sent`; `open_rate`, `click_rate` and\n`unsubscribe_rate` are over `delivered`. `unsubscribed`, `bounced` and\n`spam_reports` count every event, while `opened_unique` and\n`clicked_unique` de-duplicate — but only against the previous month, so\non a campaign that has been sending for longer, which includes any\nlong-running flow campaign, a contact who re-engages after that gap is\ncounted again and these counters drift above the true number of\ndistinct contacts.\n`average_order_value` is `attributed_revenue / attributed_orders`,\nreported as 0 when there are no attributed orders. SMS stat blocks\ncarry no `average_order_value` — divide `attributed_revenue` by\n`attributed_orders` yourself.\n","properties":{"sent":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.sent.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.sent.unit","typeLabel":"string"}},"uniqueKey":"data.stats.sent","typeLabel":"object"},"delivered":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.delivered.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.delivered.unit","typeLabel":"string"}},"uniqueKey":"data.stats.delivered","typeLabel":"object"},"delivery_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.delivery_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.delivery_rate.unit","typeLabel":"string"}},"uniqueKey":"data.stats.delivery_rate","typeLabel":"object"},"opened_unique":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.opened_unique.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.opened_unique.unit","typeLabel":"string"}},"uniqueKey":"data.stats.opened_unique","typeLabel":"object"},"open_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.open_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.open_rate.unit","typeLabel":"string"}},"uniqueKey":"data.stats.open_rate","typeLabel":"object"},"clicked_unique":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.clicked_unique.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.clicked_unique.unit","typeLabel":"string"}},"uniqueKey":"data.stats.clicked_unique","typeLabel":"object"},"click_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.click_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.click_rate.unit","typeLabel":"string"}},"uniqueKey":"data.stats.click_rate","typeLabel":"object"},"bounced":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.bounced.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.bounced.unit","typeLabel":"string"}},"uniqueKey":"data.stats.bounced","typeLabel":"object"},"bounce_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.bounce_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.bounce_rate.unit","typeLabel":"string"}},"uniqueKey":"data.stats.bounce_rate","typeLabel":"object"},"spam_reports":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.spam_reports.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.spam_reports.unit","typeLabel":"string"}},"uniqueKey":"data.stats.spam_reports","typeLabel":"object"},"unsubscribed":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.unsubscribed.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.unsubscribed.unit","typeLabel":"string"}},"uniqueKey":"data.stats.unsubscribed","typeLabel":"object"},"unsubscribe_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.unsubscribe_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.unsubscribe_rate.unit","typeLabel":"string"}},"uniqueKey":"data.stats.unsubscribe_rate","typeLabel":"object"},"opted_out":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.opted_out.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.opted_out.unit","typeLabel":"string"}},"uniqueKey":"data.stats.opted_out","typeLabel":"object"},"failed":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.failed.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.failed.unit","typeLabel":"string"}},"uniqueKey":"data.stats.failed","typeLabel":"object"},"attributed_orders":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.attributed_orders.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.attributed_orders.unit","typeLabel":"string"}},"uniqueKey":"data.stats.attributed_orders","typeLabel":"object"},"order_rate":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.order_rate.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.order_rate.unit","typeLabel":"string"}},"uniqueKey":"data.stats.order_rate","typeLabel":"object"},"attributed_revenue":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.attributed_revenue.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.attributed_revenue.unit","typeLabel":"string"}},"uniqueKey":"data.stats.attributed_revenue","typeLabel":"object"},"average_order_value":{"type":"object","description":"A single report metric with its unit. `count` values are whole\nnumbers, `percent` values are 0–100 with one decimal. Money metrics\ncarry the account's lowercased ISO 4217 currency code as their unit\n(e.g. `usd`, `eur`, `jpy`) and are expressed in that currency's major\nunits, two decimals. A rate whose denominator was zero reports 0, not\nnull — so 0 does not distinguish \"no activity\" from \"activity that\nnever converted\"; read the underlying counts to tell those apart.\n","properties":{"value":{"type":"number","example":42,"uniqueKey":"data.stats.average_order_value.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.stats.average_order_value.unit","typeLabel":"string"}},"uniqueKey":"data.stats.average_order_value","typeLabel":"object"}},"uniqueKey":"data.stats","typeLabel":"object"},"top_links":{"type":"array","description":"The campaign's most-clicked links, best first, deduped by URL — at most 100 links are reported. For an A/B test these are the control version's links; every version's own are on `ab_test.versions[].top_links`. Email campaigns only; absent for SMS campaigns.\n","items":{"type":"object","properties":{"url":{"type":"string","example":"https://shop.example.com/collections/restock","uniqueKey":"data.top_links.items.[INDEX].url","typeLabel":"string"},"name":{"oneOf":[{"type":"string","description":"The link's display name from the email content, when one was set.","example":"Shop the restock","uniqueKey":"data.top_links.items.[INDEX].name.oneOf.0","typeLabel":"string"},{"type":"null","description":"The link's display name from the email content, when one was set.","example":"Shop the restock","uniqueKey":"data.top_links.items.[INDEX].name.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.top_links.items.[INDEX].name","typeLabel":"string | null"},"clicks":{"type":"integer","example":402,"uniqueKey":"data.top_links.items.[INDEX].clicks","typeLabel":"integer"}},"uniqueKey":"data.top_links.items.[INDEX]","typeLabel":"object"},"uniqueKey":"data.top_links","typeLabel":"object[]"}},"uniqueKey":"data","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"data":{"campaign_id":"kD4qN8wZr1","type":"newsletter","title":"June Restock Announcement","channel":"email","sent_date":"2026-06-18","period":null,"stats":{"sent":{"value":8200,"unit":"count"},"delivered":{"value":8020,"unit":"count"},"delivery_rate":{"value":97.8,"unit":"percent"},"opened_unique":{"value":3450,"unit":"count"},"open_rate":{"value":43,"unit":"percent"},"clicked_unique":{"value":610,"unit":"count"},"click_rate":{"value":7.6,"unit":"percent"},"bounced":{"value":74,"unit":"count"},"bounce_rate":{"value":0.9,"unit":"percent"},"spam_reports":{"value":3,"unit":"count"},"unsubscribed":{"value":21,"unit":"count"},"unsubscribe_rate":{"value":0.3,"unit":"percent"},"attributed_orders":{"value":45,"unit":"count"},"order_rate":{"value":0.6,"unit":"percent"},"attributed_revenue":{"value":2810,"unit":"usd"},"average_order_value":{"value":62.44,"unit":"usd"}},"ab_test":{"state":"sent","winning_metric":"click_rate","results_source":"snapshot","measured_at":"2026-06-19T15:20:00Z","decision_due_at":"2026-06-19T15:20:00Z","winner_selected_at":"2026-06-19T15:24:00Z","completed_at":"2026-06-19T17:50:00Z","winner_version_id":"cpv_YJGOjpJ","selection_reason":"highest_metric","audience":{"eligible_count":8200,"test_count":2050,"remainder_count":6150},"versions":[{"id":"cpv_dkyYZmk","name":"Version A","is_control":true,"is_winner":false,"audience_share":0.125,"subject":"The restock you asked for is here","decision":{"metric_value":{"value":4.8,"unit":"percent"},"numerator":{"value":48,"unit":"count"},"denominator":{"value":1003,"unit":"count"}},"stats":{"assigned":{"value":1025,"unit":"count"},"sent":{"value":1025,"unit":"count"},"delivered":{"value":1003,"unit":"count"},"delivery_rate":{"value":97.9,"unit":"percent"},"opened_unique":{"value":431,"unit":"count"},"open_rate":{"value":43,"unit":"percent"},"clicked_unique":{"value":50,"unit":"count"},"click_rate":{"value":5,"unit":"percent"},"bounced":{"value":9,"unit":"count"},"bounce_rate":{"value":0.9,"unit":"percent"},"spam_reports":{"value":0,"unit":"count"},"unsubscribed":{"value":3,"unit":"count"},"unsubscribe_rate":{"value":0.3,"unit":"percent"},"attributed_orders":{"value":4,"unit":"count"},"order_rate":{"value":0.4,"unit":"percent"},"attributed_revenue":{"value":238,"unit":"usd"},"average_order_value":{"value":59.5,"unit":"usd"}},"top_links":[{"url":"https://shop.example.com/collections/restock","name":"Shop the restock","clicks":44}]},{"id":"cpv_YJGOjpJ","name":"Version B","is_control":false,"is_winner":true,"audience_share":0.125,"subject":"Your size is back, but not for long","decision":{"metric_value":{"value":8,"unit":"percent"},"numerator":{"value":80,"unit":"count"},"denominator":{"value":1004,"unit":"count"}},"stats":{"assigned":{"value":1025,"unit":"count"},"sent":{"value":7175,"unit":"count"},"delivered":{"value":7017,"unit":"count"},"delivery_rate":{"value":97.8,"unit":"percent"},"opened_unique":{"value":3019,"unit":"count"},"open_rate":{"value":43,"unit":"percent"},"clicked_unique":{"value":560,"unit":"count"},"click_rate":{"value":8,"unit":"percent"},"bounced":{"value":65,"unit":"count"},"bounce_rate":{"value":0.9,"unit":"percent"},"spam_reports":{"value":3,"unit":"count"},"unsubscribed":{"value":18,"unit":"count"},"unsubscribe_rate":{"value":0.3,"unit":"percent"},"attributed_orders":{"value":41,"unit":"count"},"order_rate":{"value":0.6,"unit":"percent"},"attributed_revenue":{"value":2572,"unit":"usd"},"average_order_value":{"value":62.73,"unit":"usd"}},"top_links":[{"url":"https://shop.example.com/collections/restock","name":"Shop the restock","clicks":466}]}]},"top_links":[{"url":"https://shop.example.com/collections/restock","name":"Shop the restock","clicks":44}]}},"examples":{"Example":{"title":"Example","value":{"data":{"campaign_id":"kD4qN8wZr1","type":"newsletter","title":"June Restock Announcement","channel":"email","sent_date":"2026-06-18","period":null,"stats":{"sent":{"value":8200,"unit":"count"},"delivered":{"value":8020,"unit":"count"},"delivery_rate":{"value":97.8,"unit":"percent"},"opened_unique":{"value":3450,"unit":"count"},"open_rate":{"value":43,"unit":"percent"},"clicked_unique":{"value":610,"unit":"count"},"click_rate":{"value":7.6,"unit":"percent"},"bounced":{"value":74,"unit":"count"},"bounce_rate":{"value":0.9,"unit":"percent"},"spam_reports":{"value":3,"unit":"count"},"unsubscribed":{"value":21,"unit":"count"},"unsubscribe_rate":{"value":0.3,"unit":"percent"},"attributed_orders":{"value":45,"unit":"count"},"order_rate":{"value":0.6,"unit":"percent"},"attributed_revenue":{"value":2810,"unit":"usd"},"average_order_value":{"value":62.44,"unit":"usd"}},"ab_test":{"state":"sent","winning_metric":"click_rate","results_source":"snapshot","measured_at":"2026-06-19T15:20:00Z","decision_due_at":"2026-06-19T15:20:00Z","winner_selected_at":"2026-06-19T15:24:00Z","completed_at":"2026-06-19T17:50:00Z","winner_version_id":"cpv_YJGOjpJ","selection_reason":"highest_metric","audience":{"eligible_count":8200,"test_count":2050,"remainder_count":6150},"versions":[{"id":"cpv_dkyYZmk","name":"Version A","is_control":true,"is_winner":false,"audience_share":0.125,"subject":"The restock you asked for is here","decision":{"metric_value":{"value":4.8,"unit":"percent"},"numerator":{"value":48,"unit":"count"},"denominator":{"value":1003,"unit":"count"}},"stats":{"assigned":{"value":1025,"unit":"count"},"sent":{"value":1025,"unit":"count"},"delivered":{"value":1003,"unit":"count"},"delivery_rate":{"value":97.9,"unit":"percent"},"opened_unique":{"value":431,"unit":"count"},"open_rate":{"value":43,"unit":"percent"},"clicked_unique":{"value":50,"unit":"count"},"click_rate":{"value":5,"unit":"percent"},"bounced":{"value":9,"unit":"count"},"bounce_rate":{"value":0.9,"unit":"percent"},"spam_reports":{"value":0,"unit":"count"},"unsubscribed":{"value":3,"unit":"count"},"unsubscribe_rate":{"value":0.3,"unit":"percent"},"attributed_orders":{"value":4,"unit":"count"},"order_rate":{"value":0.4,"unit":"percent"},"attributed_revenue":{"value":238,"unit":"usd"},"average_order_value":{"value":59.5,"unit":"usd"}},"top_links":[{"url":"https://shop.example.com/collections/restock","name":"Shop the restock","clicks":44}]},{"id":"cpv_YJGOjpJ","name":"Version B","is_control":false,"is_winner":true,"audience_share":0.125,"subject":"Your size is back, but not for long","decision":{"metric_value":{"value":8,"unit":"percent"},"numerator":{"value":80,"unit":"count"},"denominator":{"value":1004,"unit":"count"}},"stats":{"assigned":{"value":1025,"unit":"count"},"sent":{"value":7175,"unit":"count"},"delivered":{"value":7017,"unit":"count"},"delivery_rate":{"value":97.8,"unit":"percent"},"opened_unique":{"value":3019,"unit":"count"},"open_rate":{"value":43,"unit":"percent"},"clicked_unique":{"value":560,"unit":"count"},"click_rate":{"value":8,"unit":"percent"},"bounced":{"value":65,"unit":"count"},"bounce_rate":{"value":0.9,"unit":"percent"},"spam_reports":{"value":3,"unit":"count"},"unsubscribed":{"value":18,"unit":"count"},"unsubscribe_rate":{"value":0.3,"unit":"percent"},"attributed_orders":{"value":41,"unit":"count"},"order_rate":{"value":0.6,"unit":"percent"},"attributed_revenue":{"value":2572,"unit":"usd"},"average_order_value":{"value":62.73,"unit":"usd"}},"top_links":[{"url":"https://shop.example.com/collections/restock","name":"Shop the restock","clicks":466}]}]},"top_links":[{"url":"https://shop.example.com/collections/restock","name":"Shop the restock","clicks":44}]}}}},"exampleType":"examples"}},"exampleType":"examples"},"bcadd86d-7814-4c75-b6e8-3ec4b2d6d9b0":{"description":"Missing or invalid bearer token.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_client","invalid_scope","unauthorized","insufficient_scope","forbidden","paid_plan_required","api_access_required","segment_builder_required","not_found","no_connected_store","conflict","contacts_not_ready","validation_failed","idempotency_key_reused","rate_limited","store_unavailable","store_rate_limited","not_a_draft","design_changed","sms_missing","email_missing","ab_test_draft","idempotency_key_reused","template_unavailable","design_unavailable","render_failed"],"example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","example":"One or more fields are invalid","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","example":"email","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","example":"is required","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"unauthorized","message":"Bearer token is missing or invalid"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthorized","message":"Bearer token is missing or invalid"}}}},"exampleType":"examples"}},"exampleType":"examples"},"8337849f-73fd-4819-a8cc-46d0da6c3c03":{"description":"`insufficient_scope` when the token lacks the required scope for this endpoint.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_client","invalid_scope","unauthorized","insufficient_scope","forbidden","paid_plan_required","api_access_required","segment_builder_required","not_found","no_connected_store","conflict","contacts_not_ready","validation_failed","idempotency_key_reused","rate_limited","store_unavailable","store_rate_limited","not_a_draft","design_changed","sms_missing","email_missing","ab_test_draft","idempotency_key_reused","template_unavailable","design_unavailable","render_failed"],"example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","example":"One or more fields are invalid","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","example":"email","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","example":"is required","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"insufficient_scope","message":"Token does not have the required scope"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"insufficient_scope","message":"Token does not have the required scope"}}}},"exampleType":"examples"}},"exampleType":"examples"},"08c39cc9-2ff9-4bb8-a0c7-17b9d5ed64e2":{"description":"The requested resource does not exist or does not belong to your account.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_client","invalid_scope","unauthorized","insufficient_scope","forbidden","paid_plan_required","api_access_required","segment_builder_required","not_found","no_connected_store","conflict","contacts_not_ready","validation_failed","idempotency_key_reused","rate_limited","store_unavailable","store_rate_limited","not_a_draft","design_changed","sms_missing","email_missing","ab_test_draft","idempotency_key_reused","template_unavailable","design_unavailable","render_failed"],"example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","example":"One or more fields are invalid","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","example":"email","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","example":"is required","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"not_found","message":"Not found"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"not_found","message":"Not found"}}}},"exampleType":"examples"}},"exampleType":"examples"},"18a70e8c-96c3-4f7a-a6b8-2cba4887843d":{"description":"One or more fields failed validation.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_client","invalid_scope","unauthorized","insufficient_scope","forbidden","paid_plan_required","api_access_required","segment_builder_required","not_found","no_connected_store","conflict","contacts_not_ready","validation_failed","idempotency_key_reused","rate_limited","store_unavailable","store_rate_limited","not_a_draft","design_changed","sms_missing","email_missing","ab_test_draft","idempotency_key_reused","template_unavailable","design_unavailable","render_failed"],"example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","example":"One or more fields are invalid","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","example":"email","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","example":"is required","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"validation_failed","message":"One or more fields are invalid","details":[{"field":"email","message":"is required"}]}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"validation_failed","message":"One or more fields are invalid","details":[{"field":"email","message":"is required"}]}}}},"exampleType":"examples"}},"exampleType":"examples"},"69958811-c9aa-4d30-8997-911abc76ab06":{"description":"Rate limit exceeded. Retry after the specified time.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"},"example":42},"X-RateLimit-Limit-Minute":{"description":"Maximum requests allowed per minute.","schema":{"type":"integer"},"example":60},"X-RateLimit-Remaining-Minute":{"description":"Requests remaining in the current minute window.","schema":{"type":"integer"},"example":0},"X-RateLimit-Reset-Minute":{"description":"Unix timestamp when the minute window resets.","schema":{"type":"integer"},"example":1711929600},"X-RateLimit-Limit-Day":{"description":"Maximum requests allowed per day.","schema":{"type":"integer"},"example":10000},"X-RateLimit-Remaining-Day":{"description":"Requests remaining in the current day window.","schema":{"type":"integer"},"example":9500},"X-RateLimit-Reset-Day":{"description":"Unix timestamp when the day window resets.","schema":{"type":"integer"},"example":1712016000}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_client","invalid_scope","unauthorized","insufficient_scope","forbidden","paid_plan_required","api_access_required","segment_builder_required","not_found","no_connected_store","conflict","contacts_not_ready","validation_failed","idempotency_key_reused","rate_limited","store_unavailable","store_rate_limited","not_a_draft","design_changed","sms_missing","email_missing","ab_test_draft","idempotency_key_reused","template_unavailable","design_unavailable","render_failed"],"example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","example":"One or more fields are invalid","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","example":"email","uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","example":"is required","uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"rate_limited","message":"Rate limit exceeded"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"rate_limited","message":"Rate limit exceeded"}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"713a085f-c3f8-4098-ba26-f657b70b7333":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API token or OAuth access token","description":"Send either an API token or an OAuth access token as\n`Authorization: Bearer \u003ctoken>`. See the Authentication page for details.\n","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"97f63e03-f020-41b7-a5b9-e312bbfed47d":{"url":"https://api.privy.com/v1","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"API token or OAuth access token","description":"Send either an API token or an OAuth access token as\n`Authorization: Bearer \u003ctoken>`. See the Authentication page for details.\n","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Send either an API token or an OAuth access token as\n`Authorization: Bearer \u003ctoken>`. See the Authentication page for details.\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"openapi/privy-api.yaml"},"subdomain":"privy","siteName":"Privy Knowledge Base","title":"Get campaign performance - Privy Knowledge Base","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T23:08:30.128Z","originalFileLocation":"docs/api-reference/get-campaign-performance.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=\"One message campaign\u0026#x27;s engagement funnel — sends, deliveries, opens, clicks, attribution, and the derived rates — plus its most-clicked links. Resolves newsletters and flow campaigns alike (flow campaigns carry no sent_date, and instead name the flow that sends them in flow). SMS campaigns return the SMS stat set (opted_out, failed) and no links. Without period parameters the funnel covers the campaign\u0026#x27;s whole life. Pass period (or period=custom with start_date/end_date) to scope it to a reporting window — the same window vocabulary as every other report read, so its numbers line up with /v1/reports/campaigns rows for the same period. The response echoes the window in period; null means lifetime. top_links is always lifetime — link clicks are not stored by day. The campaign\u0026#x27;s configuration is /v1/campaigns/{id}. Required scope: reports_read\">\u003cmeta data-mint-head name=\"application-name\" content=\"Privy Knowledge Base\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/privy/fvbglk3MPcKWjtyG/_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/privy/fvbglk3MPcKWjtyG/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/privy/fvbglk3MPcKWjtyG/_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/privy/fvbglk3MPcKWjtyG/_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/privy/fvbglk3MPcKWjtyG/_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/privy/fvbglk3MPcKWjtyG/_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/privy/fvbglk3MPcKWjtyG/_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/privy/fvbglk3MPcKWjtyG/_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/privy/fvbglk3MPcKWjtyG/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Get campaign performance - Privy Knowledge Base\">\u003cmeta data-mint-head property=\"og:description\" content=\"One message campaign\u0026#x27;s engagement funnel — sends, deliveries, opens, clicks, attribution, and the derived rates — plus its most-clicked links. Resolves newsletters and flow campaigns alike (flow campaigns carry no sent_date, and instead name the flow that sends them in flow). SMS campaigns return the SMS stat set (opted_out, failed) and no links. Without period parameters the funnel covers the campaign\u0026#x27;s whole life. Pass period (or period=custom with start_date/end_date) to scope it to a reporting window — the same window vocabulary as every other report read, so its numbers line up with /v1/reports/campaigns rows for the same period. The response echoes the window in period; null means lifetime. top_links is always lifetime — link clicks are not stored by day. The campaign\u0026#x27;s configuration is /v1/campaigns/{id}. Required scope: reports_read\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Privy Knowledge Base\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://help.privy.com/docs/api-reference/get-campaign-performance\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://privy.mintlify.site/_mintlify/api/og/v2?division=Reports\u0026amp;title=Get+campaign+performance\u0026amp;description=One+message+campaign%27s+engagement+funnel+%E2%80%94+sends%2C+deliveries%2C+opens%2C%0Aclicks%2C+attribution%2C+and+the+derived+rates+%E2%80%94+plus+its+most-clicked%0Alinks.+Resolves+newslett\u0026amp;theme=a5dbdd3119e247d04186b21c\u0026amp;signature=bec5f30420752eac6e78c7cf7e52c4885a5bab48393c1d67342e2901a95acfdb\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Get campaign performance - Privy Knowledge Base\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"One message campaign\u0026#x27;s engagement funnel — sends, deliveries, opens, clicks, attribution, and the derived rates — plus its most-clicked links. Resolves newsletters and flow campaigns alike (flow campaigns carry no sent_date, and instead name the flow that sends them in flow). SMS campaigns return the SMS stat set (opted_out, failed) and no links. Without period parameters the funnel covers the campaign\u0026#x27;s whole life. Pass period (or period=custom with start_date/end_date) to scope it to a reporting window — the same window vocabulary as every other report read, so its numbers line up with /v1/reports/campaigns rows for the same period. The response echoes the window in period; null means lifetime. top_links is always lifetime — link clicks are not stored by day. The campaign\u0026#x27;s configuration is /v1/campaigns/{id}. Required scope: reports_read\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://privy.mintlify.site/_mintlify/api/og/v2?division=Reports\u0026amp;title=Get+campaign+performance\u0026amp;description=One+message+campaign%27s+engagement+funnel+%E2%80%94+sends%2C+deliveries%2C+opens%2C%0Aclicks%2C+attribution%2C+and+the+derived+rates+%E2%80%94+plus+its+most-clicked%0Alinks.+Resolves+newslett\u0026amp;theme=a5dbdd3119e247d04186b21c\u0026amp;signature=bec5f30420752eac6e78c7cf7e52c4885a5bab48393c1d67342e2901a95acfdb\">\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/privy/fvbglk3MPcKWjtyG/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Privy Knowledge Base\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#254E5A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://help.privy.com/docs/api-reference/get-campaign-performance\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/api-reference/get-campaign-performance.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://help.privy.com/#organization\",\"name\":\"Privy Knowledge Base\",\"url\":\"https://help.privy.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/privy/fGrkZt933tBjY_zl/logo/light.svg?fit=max\u0026auto=format\u0026n=fGrkZt933tBjY_zl\u0026q=85\u0026s=36a01db426b7c94fac423778765cd517\"}},{\"@type\":\"WebSite\",\"@id\":\"https://help.privy.com#website\",\"name\":\"Privy Knowledge Base\",\"url\":\"https://help.privy.com\",\"publisher\":{\"@id\":\"https://help.privy.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://help.privy.com/docs/api-reference/get-campaign-performance#webpage\",\"url\":\"https://help.privy.com/docs/api-reference/get-campaign-performance\",\"name\":\"Get campaign performance\",\"description\":\"One message campaign's engagement funnel — sends, deliveries, opens, clicks, attribution, and the derived rates — plus its most-clicked links. Resolves newsletters and flow campaigns alike (flow campaigns carry no sent_date, and instead name the flow that sends them in flow). SMS campaigns return the SMS stat set (opted_out, failed) and no links. Without period parameters the funnel covers the campaign's whole life. Pass period (or period=custom with start_date/end_date) to scope it to a reporting window — the same window vocabulary as every other report read, so its numbers line up with /v1/reports/campaigns rows for the same period. The response echoes the window in period; null means lifetime. top_links is always lifetime — link clicks are not stored by day. The campaign's configuration is /v1/campaigns/{id}. Required scope: reports_read\",\"dateModified\":\"2026-10-22T23:08:30.128Z\",\"isPartOf\":{\"@id\":\"https://help.privy.com#website\"},\"breadcrumb\":{\"@id\":\"https://help.privy.com/docs/api-reference/get-campaign-performance#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://help.privy.com/docs/api-reference/get-campaign-performance#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Reports\",\"item\":\"https://help.privy.com/docs/api-reference/get-report-summary\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Get campaign performance\",\"item\":\"https://help.privy.com/docs/api-reference/get-campaign-performance\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://help.privy.com/docs/api-reference/get-campaign-performance#apireference\",\"headline\":\"Get campaign performance\",\"name\":\"Get campaign performance\",\"description\":\"One message campaign's engagement funnel — sends, deliveries, opens, clicks, attribution, and the derived rates — plus its most-clicked links. Resolves newsletters and flow campaigns alike (flow campaigns carry no sent_date, and instead name the flow that sends them in flow). SMS campaigns return the SMS stat set (opted_out, failed) and no links. Without period parameters the funnel covers the campaign's whole life. Pass period (or period=custom with start_date/end_date) to scope it to a reporting window — the same window vocabulary as every other report read, so its numbers line up with /v1/reports/campaigns rows for the same period. The response echoes the window in period; null means lifetime. top_links is always lifetime — link clicks are not stored by day. The campaign's configuration is /v1/campaigns/{id}. Required scope: reports_read\",\"url\":\"https://help.privy.com/docs/api-reference/get-campaign-performance\",\"mainEntityOfPage\":{\"@id\":\"https://help.privy.com/docs/api-reference/get-campaign-performance#webpage\"},\"dateModified\":\"2026-10-22T23:08:30.128Z\",\"publisher\":{\"@id\":\"https://help.privy.com/#organization\"},\"isPartOf\":{\"@id\":\"https://help.privy.com#website\"}}]}\u003c/script>","agentPointerHref":"/docs/api-reference/get-campaign-performance.md","siteName":"Privy Knowledge Base","nav":{"global":null,"tabs":[{"tab":"Learn","icon":"house","pages":[{"title":"Learn","href":"/docs/learn/home"}]},{"tab":"Developer","icon":"square-terminal","groups":[{"group":"API Reference","pages":[{"title":"API Overview","sidebarTitle":"Overview","icon":"book-open","href":"/docs/api-reference/overview"},{"title":"Authentication","sidebarTitle":"Authentication","icon":"lock","href":"/docs/api-reference/authentication"},{"title":"API Tokens","sidebarTitle":"API Tokens","icon":"key","href":"/docs/api-reference/api-tokens"},{"title":"Rate Limits","sidebarTitle":"Rate Limits","icon":"gauge","href":"/docs/api-reference/rate-limits"},{"title":"Errors","sidebarTitle":"Errors","icon":"triangle-exclamation","href":"/docs/api-reference/errors"},{"title":"API Changelog","sidebarTitle":"Changelog","icon":"clock-rotate-left","href":"/docs/api-reference/changelog"}]},{"group":"Account","pages":[{"title":"Get account","openapi":"openapi/privy-api.yaml GET /account","href":"/docs/api-reference/get-account"},{"title":"Get account setup","openapi":"openapi/privy-api.yaml GET /account/setup","href":"/docs/api-reference/get-account-setup"}]},{"group":"Contacts","pages":[{"title":"List contacts","openapi":"openapi/privy-api.yaml GET /contacts","href":"/docs/api-reference/list-contacts"},{"title":"Get a contact","openapi":"openapi/privy-api.yaml GET /contacts/{id}","href":"/docs/api-reference/get-contact"},{"title":"Create a contact","openapi":"openapi/privy-api.yaml POST /contacts","href":"/docs/api-reference/create-contact"},{"title":"Update a contact","openapi":"openapi/privy-api.yaml PATCH /contacts/{id}","href":"/docs/api-reference/update-contact"},{"title":"Delete a contact","openapi":"openapi/privy-api.yaml DELETE /contacts/{id}","href":"/docs/api-reference/delete-contact"},{"title":"List a contact's activity","openapi":"openapi/privy-api.yaml GET /contacts/{id}/events","href":"/docs/api-reference/list-contact-activity"}]},{"group":"Imports","pages":[{"title":"List contact imports","openapi":"openapi/privy-api.yaml GET /imports","href":"/docs/api-reference/list-imports"},{"title":"Get a contact import","openapi":"openapi/privy-api.yaml GET /imports/{id}","href":"/docs/api-reference/get-import"}]},{"group":"Tags","pages":[{"title":"List tags","openapi":"openapi/privy-api.yaml GET /tags","href":"/docs/api-reference/list-tags"},{"title":"Get a tag","openapi":"openapi/privy-api.yaml GET /tags/{id}","href":"/docs/api-reference/get-tag"}]},{"group":"Campaigns","pages":[{"title":"List campaigns","openapi":"openapi/privy-api.yaml GET /campaigns","href":"/docs/api-reference/list-campaigns"},{"title":"Get a campaign","openapi":"openapi/privy-api.yaml GET /campaigns/{id}","href":"/docs/api-reference/get-campaign"}]},{"group":"Displays","pages":[{"title":"List displays","openapi":"openapi/privy-api.yaml GET /displays","href":"/docs/api-reference/list-displays"},{"title":"Get a display","openapi":"openapi/privy-api.yaml GET /displays/{id}","href":"/docs/api-reference/get-display"}]},{"group":"Coupons","pages":[{"title":"List coupons","openapi":"openapi/privy-api.yaml GET /coupons","href":"/docs/api-reference/list-coupons"},{"title":"Get a coupon","openapi":"openapi/privy-api.yaml GET /coupons/{id}","href":"/docs/api-reference/get-coupon"},{"title":"Check a coupon code","openapi":"openapi/privy-api.yaml GET /coupons/{id}/codes/{code}","href":"/docs/api-reference/check-coupon-code"}]},{"group":"Reports","pages":[{"title":"Get business report summary","openapi":"openapi/privy-api.yaml GET /reports/summary","href":"/docs/api-reference/get-report-summary"},{"title":"List campaign performance","openapi":"openapi/privy-api.yaml GET /reports/campaigns","description":"Every message campaign **sent in the period**, ranked by attributed\nrevenue, each row carrying the full channel stat block (delivery,\nengagement, unsubscribes, attribution) scoped to the same period — so\nperiod comparisons need no per-campaign detail calls. Zero-revenue\nsends are listed too, ranked after the revenue rows; at most 100\ncampaigns are ranked, and a send with no recorded activity at all in\nthe period does not appear.\n\nBy default the list serves your **newsletters** — email and SMS\none-time sends. Pass `type=flows` to instead rank the **flow\ncampaigns**: the email and SMS messages your automation flows send\n(flow rows carry no `sent_date` or `audience`, and instead name the\nflow that sends them in `flow`, so attributing a message to its flow\nneeds no follow-up request). Use\n`/v1/reports/campaigns/{campaign_id}` for one campaign's\nmost-clicked links or its lifetime funnel.\n\n**Required scope:** `reports_read`\n","href":"/docs/api-reference/list-campaign-performance"},{"title":"Get campaign performance","openapi":"openapi/privy-api.yaml GET /reports/campaigns/{campaign_id}","href":"/docs/api-reference/get-campaign-performance"},{"title":"List flow performance","openapi":"openapi/privy-api.yaml GET /reports/flows","description":"Rank your flows by performance over a period — best performers first,\nremaining flows by recency. Each row combines email and SMS stats\nacross the flow's message steps. Use `/v1/reports/flows/{flow_id}`\nfor one flow's report including the per-node message breakdown.\n\nEvery flow with the requested status is listed, quiet ones included —\nunlike the display and campaign leaderboards nothing is dropped for\nhaving no activity, so this doubles as a performance-annotated flow\ninventory. A flow's configuration is `/v1/flows/{id}`.\n\n**Required scope:** `reports_read`\n","href":"/docs/api-reference/list-flow-performance"},{"title":"Get flow performance","openapi":"openapi/privy-api.yaml GET /reports/flows/{flow_id}","href":"/docs/api-reference/get-flow-performance"},{"title":"List display performance","openapi":"openapi/privy-api.yaml GET /reports/displays","href":"/docs/api-reference/list-display-performance"},{"title":"Get display performance","openapi":"openapi/privy-api.yaml GET /reports/displays/{display_id}","href":"/docs/api-reference/get-display-performance"},{"title":"List top products","openapi":"openapi/privy-api.yaml GET /reports/top_products","href":"/docs/api-reference/list-top-products"}]},{"group":"Flows","pages":[{"title":"List flows","openapi":"openapi/privy-api.yaml GET /flows","href":"/docs/api-reference/list-flows"},{"title":"Get a flow","openapi":"openapi/privy-api.yaml GET /flows/{id}","href":"/docs/api-reference/get-flow"}]},{"group":"Segments","pages":[{"title":"List segments","openapi":"openapi/privy-api.yaml GET /segments","href":"/docs/api-reference/list-segments"},{"title":"Get a segment","openapi":"openapi/privy-api.yaml GET /segments/{id}","href":"/docs/api-reference/get-segment"},{"title":"List a segment's contacts","openapi":"openapi/privy-api.yaml GET /segments/{id}/contacts","href":"/docs/api-reference/list-segment-contacts"}]},{"group":"Orders","pages":[{"title":"Order placed","openapi":"openapi/privy-api.yaml POST /orders/placed","href":"/docs/api-reference/order-placed"},{"title":"List orders","openapi":"openapi/privy-api.yaml GET /orders","href":"/docs/api-reference/list-orders"},{"title":"Get an order","openapi":"openapi/privy-api.yaml GET /orders/{order_id}","href":"/docs/api-reference/get-order"}]},{"group":"Products","pages":[{"title":"List products","openapi":"openapi/privy-api.yaml GET /products","href":"/docs/api-reference/list-products"},{"title":"Get a product","openapi":"openapi/privy-api.yaml GET /products/{id}","href":"/docs/api-reference/get-product"},{"title":"List product collections","openapi":"openapi/privy-api.yaml GET /product_collections","href":"/docs/api-reference/list-product-collections"},{"title":"Get a product collection","openapi":"openapi/privy-api.yaml GET /product_collections/{id}","href":"/docs/api-reference/get-product-collection"},{"title":"List a collection's products","openapi":"openapi/privy-api.yaml GET /product_collections/{id}/products","href":"/docs/api-reference/list-collection-products"},{"title":"List a product's collections","openapi":"openapi/privy-api.yaml GET /products/{id}/collections","href":"/docs/api-reference/list-collections-for-product"}]},{"group":"Events","pages":[{"title":"Ingest an event","openapi":"openapi/privy-api.yaml POST /events","href":"/docs/api-reference/ingest-event"},{"title":"Send cart events from your storefront","sidebarTitle":"Browser events","href":"/docs/api-reference/browser-events"}]}]}]},"basePath":"","title":"Get campaign performance - Privy Knowledge Base","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CybtLBIt.js","utils-BMLj2fvV.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-B6In562Y.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Dr8Mfhp9.js","snippetPresets-2rmQvMVl.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-WMqJYdZj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CJ-MlPHu.js","shallow-dY3TMRCk.js","getApiPlaygroundDisplay-v-1B2bKm.js","CodeSnippet-BDhiTB7U.js","CodeSnippets-D9hnzQcS.js","Page-C4GwDT3_.js","getPastedJson-Th2V45jI.js","icon-BQXch1W9.js","MethodPill-BCqUneP3.js","DuplicateIcon-Q_-bhurZ.js","createIcon-DUjLHRqp.js","DynamicMarkdown-B-f2cqXQ.js","SectionHeading-Da5NsV4v.js","axios-vUo_bRtp.js","Markdown-D13FWkIM.js","clsx-D3Isdib3.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-C-XZBk9h.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink--qIqmmVG.js"]}