Every message campaign sent in the period, ranked by attributed
revenue, each row carrying the full channel stat block (delivery,
engagement, unsubscribes, attribution) scoped to the same period — so
period comparisons need no per-campaign detail calls. Zero-revenue
sends are listed too, ranked after the revenue rows; at most 100
campaigns are ranked, and a send with no recorded activity at all in
the period does not appear.
By default the list serves your newsletters — email and SMS
one-time sends. Pass type=flows to instead rank the flow
campaigns: the email and SMS messages your automation flows send
(flow rows carry no sent_date or audience, and instead name the
flow that sends them in flow, so attributing a message to its flow
needs no follow-up request). Use
/v1/reports/campaigns/{campaign_id} for one campaign’s
most-clicked links or its lifetime funnel.
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 resolved date range the report covers, inclusive, in the account's
time zone. Every label except last_month ends today, so the last day
of the range is still in progress: last_7_days is the six days before
today plus today, this_month runs from the 1st through today, and
last_month is the whole previous calendar month. Custom ranges cannot
exceed 366 days.
{"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/list-campaign-performance","slug":"/docs/api-reference/list-campaign-performance","pageMetadata":{"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"},"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: [\"Every message campaign \", _jsx(_components.strong, {\n children: \"sent in the period\"\n }), \", 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 }), \"\\n\", _jsxs(_components.p, {\n children: [\"By default the list serves your \", _jsx(_components.strong, {\n children: \"newsletters\"\n }), \" — email and SMS\\none-time sends. Pass \", _jsx(_components.code, {\n children: \"type=flows\"\n }), \" to instead rank the \", _jsx(_components.strong, {\n children: \"flow\\ncampaigns\"\n }), \": the email and SMS messages your automation flows send\\n(flow rows carry no \", _jsx(_components.code, {\n children: \"sent_date\"\n }), \" or \", _jsx(_components.code, {\n children: \"audience\"\n }), \", and instead name the\\nflow that sends them in \", _jsx(_components.code, {\n children: \"flow\"\n }), \", so attributing a message to its flow\\nneeds no follow-up request). Use\\n\", _jsx(_components.code, {\n children: \"/v1/reports/campaigns/{campaign_id}\"\n }), \" for one campaign’s\\nmost-clicked links or its lifetime funnel.\"]\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":"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"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"listCampaignReports","summary":"List campaign performance","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","tags":["Reports"],"security":["f5b0681e-3d2c-4e3f-8fdd-4c57d5127e2c"],"parameters":["0eeb87ed-1376-4b70-a3c3-0cae6dab7a02","4e60499c-2252-4897-9044-2394d144e332","751116f3-ff10-4dd5-a20e-0a9e61a2ce8c","89743a8a-89c6-4113-9d96-0e6f723c9306","b20484ee-1bee-473e-91e5-6b9e5fa9ecd5","c8400f78-98e9-450a-b453-042bc343e7c1","dcd72611-31d6-4f40-882f-235d7071c2ef","33f1fb09-fa65-4766-af7a-d7a4e7bcb999"],"responses":{"200":"89d138f3-bb24-4b29-b6c5-1a56719d15bc","401":"a03f996c-fb07-4a55-b58b-41f809f26396","403":"bdcc6dab-c8e4-42b0-94a7-e19600d70c2c","422":"b5b00c78-02bf-455a-a9b8-3f2ef9288b21","429":"ddd3ad59-aae5-4c2b-b25f-ae83b9bb8a43"},"method":"get","type":"path","servers":["97f63e03-f020-41b7-a5b9-e312bbfed47d"],"path":"/reports/campaigns","baseUrlOptions":["https://api.privy.com/v1"],"title":"List campaign performance","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"0eeb87ed-1376-4b70-a3c3-0cae6dab7a02":{"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"},"4e60499c-2252-4897-9044-2394d144e332":{"name":"period","in":"query","description":"The date range to report over, resolved in the account's time zone. Pass `custom` together with `start_date` and `end_date`.","schema":{"type":"string","enum":["last_7_days","last_30_days","last_90_days","this_month","last_month","custom"],"default":"last_30_days","description":"The date range to report over, resolved in the account's time zone. Pass `custom` together with `start_date` and `end_date`.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"example":"last_30_days"},"751116f3-ff10-4dd5-a20e-0a9e61a2ce8c":{"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"},"89743a8a-89c6-4113-9d96-0e6f723c9306":{"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"},"b20484ee-1bee-473e-91e5-6b9e5fa9ecd5":{"name":"type","in":"query","description":"Pass `flows` to rank the messages your flows send instead of newsletters.","schema":{"type":"string","enum":["flows"],"description":"Pass `flows` to rank the messages your flows send instead of newsletters.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"example":"flows"},"c8400f78-98e9-450a-b453-042bc343e7c1":{"name":"channel","in":"query","description":"Filter by message channel. Works for both newsletters and flow campaigns.","schema":{"type":"string","enum":["email","sms"],"description":"Filter by message channel. Works for both newsletters and flow campaigns.","uniqueKey":"","typeLabel":"enum\u003cstring>"},"example":"email"},"dcd72611-31d6-4f40-882f-235d7071c2ef":{"name":"page","in":"query","description":"Page number (starts at 1).","schema":{"type":"integer","default":1,"minimum":1,"description":"Page number (starts at 1).","uniqueKey":"","typeLabel":"integer"},"example":1},"33f1fb09-fa65-4766-af7a-d7a4e7bcb999":{"name":"per_page","in":"query","description":"Campaigns per page. Values above 50 are clamped to 50; omitted or invalid values default to 10.","schema":{"type":"integer","default":10,"minimum":1,"maximum":50,"description":"Campaigns per page. Values above 50 are clamped to 50; omitted or invalid values default to 10.","uniqueKey":"","typeLabel":"integer"},"example":10}},"responses":{"89d138f3-bb24-4b29-b6c5-1a56719d15bc":{"description":"Campaigns ranked by attributed revenue over the resolved period.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"campaign_id":{"type":"string","description":"The campaign's unique identifier. Use this value in `/v1/reports/campaigns/{campaign_id}`; it matches `id` in `/v1/campaigns` responses.\n","example":"kD4qN8wZr1","uniqueKey":"data.items.[INDEX].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.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"title":{"oneOf":[{"type":"string","example":"June Restock Announcement","uniqueKey":"data.items.[INDEX].title.oneOf.0","typeLabel":"string"},{"type":"null","example":"June Restock Announcement","uniqueKey":"data.items.[INDEX].title.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].title","typeLabel":"string | null"},"channel":{"type":"string","enum":["email","sms"],"example":"email","uniqueKey":"data.items.[INDEX].channel","typeLabel":"enum\u003cstring>"},"sent_date":{"oneOf":[{"type":"string","format":"date","description":"Newsletter rows only — flow campaigns send continuously, so their rows omit this field.\n","example":"2026-06-18","uniqueKey":"data.items.[INDEX].sent_date.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"Newsletter rows only — flow campaigns send continuously, so their rows omit this field.\n","example":"2026-06-18","uniqueKey":"data.items.[INDEX].sent_date.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].sent_date","typeLabel":"string\u003cdate> | null"},"audience":{"type":"object","description":"Newsletter rows only — flow campaigns target no segments, so their rows omit this field.\n","properties":{"included_segments":{"type":"array","items":{"type":"string","uniqueKey":"data.items.[INDEX].audience.included_segments.items.[INDEX]","typeLabel":"string"},"example":["Engaged 90d"],"uniqueKey":"data.items.[INDEX].audience.included_segments","typeLabel":"string[]"},"excluded_segments":{"type":"array","items":{"type":"string","uniqueKey":"data.items.[INDEX].audience.excluded_segments.items.[INDEX]","typeLabel":"string"},"example":["Recent purchasers"],"uniqueKey":"data.items.[INDEX].audience.excluded_segments","typeLabel":"string[]"}},"uniqueKey":"data.items.[INDEX].audience","typeLabel":"object"},"flow":{"oneOf":[{"type":"object","description":"Flow rows only — the flow that sends this message, so ranking a flow's messages needs no follow-up request. Newsletter rows omit the field entirely; a flow row 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.items.[INDEX].flow.oneOf.0.id","typeLabel":"string"},"title":{"oneOf":[{"type":"string","example":"Welcome Series","uniqueKey":"data.items.[INDEX].flow.oneOf.0.title.oneOf.0","typeLabel":"string"},{"type":"null","example":"Welcome Series","uniqueKey":"data.items.[INDEX].flow.oneOf.0.title.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].flow.oneOf.0.title","typeLabel":"string | null"}},"uniqueKey":"data.items.[INDEX].flow.oneOf.0","typeLabel":"object"},{"type":"null","description":"Flow rows only — the flow that sends this message, so ranking a flow's messages needs no follow-up request. Newsletter rows omit the field entirely; a flow row whose node has since been deleted carries `null`.\n","uniqueKey":"data.items.[INDEX].flow.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.items.[INDEX].flow","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.items.[INDEX].stats.sent.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.items.[INDEX].stats.sent.unit","typeLabel":"string"}},"uniqueKey":"data.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.items.[INDEX].stats.delivered.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.items.[INDEX].stats.delivered.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.delivery_rate.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.opened_unique.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.open_rate.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.clicked_unique.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.click_rate.unit","typeLabel":"string"}},"uniqueKey":"data.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.items.[INDEX].stats.bounced.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.items.[INDEX].stats.bounced.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.bounce_rate.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.spam_reports.unit","typeLabel":"string"}},"uniqueKey":"data.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.items.[INDEX].stats.unsubscribed.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.items.[INDEX].stats.unsubscribed.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.unsubscribe_rate.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.opted_out.unit","typeLabel":"string"}},"uniqueKey":"data.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.items.[INDEX].stats.failed.value","typeLabel":"number"},"unit":{"type":"string","description":"`count`, `percent`, or a lowercased ISO 4217 currency code.","example":"count","uniqueKey":"data.items.[INDEX].stats.failed.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.attributed_orders.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.order_rate.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.attributed_revenue.unit","typeLabel":"string"}},"uniqueKey":"data.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.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.items.[INDEX].stats.average_order_value.unit","typeLabel":"string"}},"uniqueKey":"data.items.[INDEX].stats.average_order_value","typeLabel":"object"}},"uniqueKey":"data.items.[INDEX].stats","typeLabel":"object"}},"uniqueKey":"data.items.[INDEX]","typeLabel":"object"},"uniqueKey":"data","typeLabel":"object[]"},"period":{"type":"object","description":"The resolved date range the report covers, inclusive, in the account's\ntime zone. Every label except `last_month` ends today, so the last day\nof the range is still in progress: `last_7_days` is the six days before\ntoday plus today, `this_month` runs from the 1st through today, and\n`last_month` is the whole previous calendar month. Custom ranges cannot\nexceed 366 days.\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":"period.label","typeLabel":"enum\u003cstring>"},"start_date":{"type":"string","format":"date","example":"2026-06-21","uniqueKey":"period.start_date","typeLabel":"string\u003cdate>"},"end_date":{"type":"string","format":"date","example":"2026-07-20","uniqueKey":"period.end_date","typeLabel":"string\u003cdate>"}},"uniqueKey":"period","typeLabel":"object"},"pagination":{"type":"object","properties":{"page":{"type":"integer","example":1,"uniqueKey":"pagination.page","typeLabel":"integer"},"per_page":{"type":"integer","example":25,"uniqueKey":"pagination.per_page","typeLabel":"integer"},"total_count":{"type":"integer","example":142,"uniqueKey":"pagination.total_count","typeLabel":"integer"},"total_pages":{"type":"integer","example":6,"uniqueKey":"pagination.total_pages","typeLabel":"integer"}},"uniqueKey":"pagination","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"data":[{"campaign_id":"kD4qN8wZr1","type":"newsletter","title":"June Restock Announcement","channel":"email","sent_date":"2026-06-18","audience":{"included_segments":["Engaged 90d"],"excluded_segments":["Recent purchasers"]},"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"}}}],"period":{"label":"last_30_days","start_date":"2026-06-21","end_date":"2026-07-20"},"pagination":{"page":1,"per_page":10,"total_count":12,"total_pages":2}},"examples":{"Example":{"title":"Example","value":{"data":[{"campaign_id":"kD4qN8wZr1","type":"newsletter","title":"June Restock Announcement","channel":"email","sent_date":"2026-06-18","audience":{"included_segments":["Engaged 90d"],"excluded_segments":["Recent purchasers"]},"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"}}}],"period":{"label":"last_30_days","start_date":"2026-06-21","end_date":"2026-07-20"},"pagination":{"page":1,"per_page":10,"total_count":12,"total_pages":2}}}},"exampleType":"examples"}},"exampleType":"examples"},"a03f996c-fb07-4a55-b58b-41f809f26396":{"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"},"bdcc6dab-c8e4-42b0-94a7-e19600d70c2c":{"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"},"b5b00c78-02bf-455a-a9b8-3f2ef9288b21":{"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"},"ddd3ad59-aae5-4c2b-b25f-ae83b9bb8a43":{"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":{"f5b0681e-3d2c-4e3f-8fdd-4c57d5127e2c":{"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":"List campaign performance - Privy Knowledge Base","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T23:08:30.119Z","originalFileLocation":"docs/api-reference/list-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=\"Every message campaign sent in the period, ranked by attributed revenue, each row carrying the full channel stat block (delivery, engagement, unsubscribes, attribution) scoped to the same period — so period comparisons need no per-campaign detail calls. Zero-revenue sends are listed too, ranked after the revenue rows; at most 100 campaigns are ranked, and a send with no recorded activity at all in the period does not appear. By default the list serves your newsletters — email and SMS one-time sends. Pass type=flows to instead rank the flow campaigns: the email and SMS messages your automation flows send (flow rows carry no sent_date or audience, and instead name the flow that sends them in flow, so attributing a message to its flow needs no follow-up request). Use /v1/reports/campaigns/{campaign_id} for one campaign\u0026#x27;s most-clicked links or its lifetime funnel. 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=\"List campaign performance - Privy Knowledge Base\">\u003cmeta data-mint-head property=\"og:description\" content=\"Every message campaign sent in the period, ranked by attributed revenue, each row carrying the full channel stat block (delivery, engagement, unsubscribes, attribution) scoped to the same period — so period comparisons need no per-campaign detail calls. Zero-revenue sends are listed too, ranked after the revenue rows; at most 100 campaigns are ranked, and a send with no recorded activity at all in the period does not appear. By default the list serves your newsletters — email and SMS one-time sends. Pass type=flows to instead rank the flow campaigns: the email and SMS messages your automation flows send (flow rows carry no sent_date or audience, and instead name the flow that sends them in flow, so attributing a message to its flow needs no follow-up request). Use /v1/reports/campaigns/{campaign_id} for one campaign\u0026#x27;s most-clicked links or its lifetime funnel. 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/list-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=List+campaign+performance\u0026amp;description=Every+message+campaign+**sent+in+the+period**%2C+ranked+by+attributed%0Arevenue%2C+each+row+carrying+the+full+channel+stat+block+%28delivery%2C%0Aengagement%2C+unsubscribes%2C+\u0026amp;theme=a5dbdd3119e247d04186b21c\u0026amp;signature=9aab50340b391829a16bc65b0535de338ab2420babf0d51120e478868044dd2d\">\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=\"List campaign performance - Privy Knowledge Base\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Every message campaign sent in the period, ranked by attributed revenue, each row carrying the full channel stat block (delivery, engagement, unsubscribes, attribution) scoped to the same period — so period comparisons need no per-campaign detail calls. Zero-revenue sends are listed too, ranked after the revenue rows; at most 100 campaigns are ranked, and a send with no recorded activity at all in the period does not appear. By default the list serves your newsletters — email and SMS one-time sends. Pass type=flows to instead rank the flow campaigns: the email and SMS messages your automation flows send (flow rows carry no sent_date or audience, and instead name the flow that sends them in flow, so attributing a message to its flow needs no follow-up request). Use /v1/reports/campaigns/{campaign_id} for one campaign\u0026#x27;s most-clicked links or its lifetime funnel. Required scope: reports_read\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://privy.mintlify.site/_mintlify/api/og/v2?division=Reports\u0026amp;title=List+campaign+performance\u0026amp;description=Every+message+campaign+**sent+in+the+period**%2C+ranked+by+attributed%0Arevenue%2C+each+row+carrying+the+full+channel+stat+block+%28delivery%2C%0Aengagement%2C+unsubscribes%2C+\u0026amp;theme=a5dbdd3119e247d04186b21c\u0026amp;signature=9aab50340b391829a16bc65b0535de338ab2420babf0d51120e478868044dd2d\">\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/list-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/list-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/list-campaign-performance#webpage\",\"url\":\"https://help.privy.com/docs/api-reference/list-campaign-performance\",\"name\":\"List campaign performance\",\"description\":\"Every message campaign sent in the period, ranked by attributed revenue, each row carrying the full channel stat block (delivery, engagement, unsubscribes, attribution) scoped to the same period — so period comparisons need no per-campaign detail calls. Zero-revenue sends are listed too, ranked after the revenue rows; at most 100 campaigns are ranked, and a send with no recorded activity at all in the period does not appear. By default the list serves your newsletters — email and SMS one-time sends. Pass type=flows to instead rank the flow campaigns: the email and SMS messages your automation flows send (flow rows carry no sent_date or audience, and instead name the flow that sends them in flow, so attributing a message to its flow needs no follow-up request). Use /v1/reports/campaigns/{campaign_id} for one campaign's most-clicked links or its lifetime funnel. Required scope: reports_read\",\"dateModified\":\"2026-10-22T23:08:30.119Z\",\"isPartOf\":{\"@id\":\"https://help.privy.com#website\"},\"breadcrumb\":{\"@id\":\"https://help.privy.com/docs/api-reference/list-campaign-performance#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://help.privy.com/docs/api-reference/list-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\":\"List campaign performance\",\"item\":\"https://help.privy.com/docs/api-reference/list-campaign-performance\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://help.privy.com/docs/api-reference/list-campaign-performance#apireference\",\"headline\":\"List campaign performance\",\"name\":\"List campaign performance\",\"description\":\"Every message campaign sent in the period, ranked by attributed revenue, each row carrying the full channel stat block (delivery, engagement, unsubscribes, attribution) scoped to the same period — so period comparisons need no per-campaign detail calls. Zero-revenue sends are listed too, ranked after the revenue rows; at most 100 campaigns are ranked, and a send with no recorded activity at all in the period does not appear. By default the list serves your newsletters — email and SMS one-time sends. Pass type=flows to instead rank the flow campaigns: the email and SMS messages your automation flows send (flow rows carry no sent_date or audience, and instead name the flow that sends them in flow, so attributing a message to its flow needs no follow-up request). Use /v1/reports/campaigns/{campaign_id} for one campaign's most-clicked links or its lifetime funnel. Required scope: reports_read\",\"url\":\"https://help.privy.com/docs/api-reference/list-campaign-performance\",\"mainEntityOfPage\":{\"@id\":\"https://help.privy.com/docs/api-reference/list-campaign-performance#webpage\"},\"dateModified\":\"2026-10-22T23:08:30.119Z\",\"publisher\":{\"@id\":\"https://help.privy.com/#organization\"},\"isPartOf\":{\"@id\":\"https://help.privy.com#website\"}}]}\u003c/script>","agentPointerHref":"/docs/api-reference/list-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","description":"The business-level performance rollup for a period: signups, new\nsubscribers, attributed revenue and orders, engagement rates, and\nbusiness-wide order and revenue totals for context. Pass\n`compare=previous_period` to add previous-period values and typed\nchange deltas to every metric.\n\n`attributed_revenue` and `attributed_orders` credit the email and SMS\nmessages Privy sent, under the same last-touch rule as the rest of\nPrivy's reporting: an order counts when the contact's most recent\nengagement in the 7 days before it was an email open, an email click, or\nan SMS click. Orders credited to a display signup are excluded, and\nevery figure here is dated by when the crediting message was **sent**,\nnot by when the order or the engagement happened. A period's attributed\nrevenue is therefore the revenue driven by messages sent in that period,\nand it includes orders placed after the period closed, whenever the\ncontact engaged later — so the newest days keep filling in for a while\nafter the fact. The engagement counts and rates use the same send\nwindow: an open in this period on a message sent last month lands in\nlast month.\n\nThe rates each divide by something different. `open_rate` is opens\ncounted once per contact per campaign, over email deliveries — SMS\nmessages have no opens. `click_rate` counts clicks the same way but per\nchannel, over email and SMS deliveries combined. `unsubscribe_rate` is\nunsubscribe and opt-out events, not distinct contacts, over those same\ncombined deliveries. `order_rate` is attributed orders over delivered\nmessages. `revenue_per_recipient` divides attributed revenue by\n**email** sends only. `signup_rate` is display form submissions over\ndisplay views, so it measures on-site capture, not messaging. `signups`\ncounts form submissions on your displays, while `new_subscribers` counts\ncontacts becoming subscribed to marketing on either channel from any\nsource, so the two answer different questions and neither is\nde-duplicated by contact.\n\nPeriods reaching back before the account's reporting boundary\n(2026-07-01 for most accounts, earlier where more history was\nbackfilled) are served whole — comparison period included — from\nPrivy's historical rollups instead of the live reporting store. The\nrate formulas above still hold, but the basis differs: new\nsubscribers, every by_channel/by_type split, and `totals_context` are\nnull; attributed orders and revenue include display-credited orders\nand are dated by when the attribution was recorded, not by send time —\nso `order_rate`'s numerator counts orders its message denominator\nnever sent, and reads a little high for accounts with display-credited\norders; and days are bucketed in US Eastern time regardless of the\naccount's time zone. Treat comparisons that straddle the boundary as\napproximate, and say so.\n\n**Required scope:** `reports_read`\n","href":"/docs/api-reference/get-report-summary"},{"title":"List campaign performance","openapi":"openapi/privy-api.yaml GET /reports/campaigns","href":"/docs/api-reference/list-campaign-performance"},{"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"},{"title":"List flow performance","openapi":"openapi/privy-api.yaml GET /reports/flows","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":"List 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"]}