/v1/brands/{brand_id}/openai-ads/performance Read OpenAI Ads performance
Delivery and conversion metrics of the brand's OpenAI Ads for a window: impressions, clicks, spend, CTR, CPC, CPM, conversions, CPA, attributed sales and ROAS. level picks the scope (the whole ad_account, or one campaign, ad_group or ad named by entity_id) and group_by what each row stands for, at that level or below: the account grouped by campaign is one row per campaign. granularity daily or monthly splits each row by date. The attribution settings change every conversion number and are echoed back. OpenAI's report is kept up to an hour (15 minutes when split by date). Pages with limit and cursor.
The brand owner needs Pro or higher (403 brand_plan_required). A brand without an OpenAI Ads connection answers 400 integration_not_connected with details.connect_url. Free: no credits. Money is in micros of the ad account's currency (1,000,000 is one unit). start_date and end_date are YYYY-MM-DD; they default to the last 28 days, the window is at most 365 days, and OpenAI reports up to yesterday (UTC). Ads are paid, labeled placements in ChatGPT, separate from the organic answers the visibility reports measure.
Path parameters
-
Brand UUID.
Query parameters
-
First day of the window (YYYY-MM-DD).
-
Last day of the window (YYYY-MM-DD).
-
The scope read.
one of ad_account, campaign, ad_group, ad · default: ad_account
-
The campaign, ad group or ad, with that
level. -
What each row stands for, at
levelor below. Defaults tolevel. -
nonetotals the window.one of none, daily, monthly · default: none
-
Days after a click a conversion still counts: 7, 14 or 30.
one of 7, 14, 30 · default: 30
-
Days after a view a conversion still counts: 0 leaves views out.
one of 0, 1 · default: 1
-
ad_event_timefiles a conversion on the click or view's day,conversion_timeon its own.one of ad_event_time, conversion_time · default: ad_event_time
-
Rows per page.
default: 200
-
next_cursorof the previous page, unchanged. -
Preview the call without executing it. Runs auth, scope, eligibility and body validation, then returns
200with adry_runobject reporting the request-unit and credit cost plus a non-consuming quota snapshot. Nothing is debited, reserved, dispatched or mutated. An invalid body still returns422.default: false
Responses
-
The attribution settings every conversion number in the response was counted with.
Show fields
-
ad_event_timefiles a conversion on the day of the click or view,conversion_timeon its own day. -
Days after a click a conversion still counts.
-
Days after an ad was only seen a conversion still counts; 0 leaves views out.
-
-
Last day read (YYYY-MM-DD); never later than yesterday in UTC.
-
nonetotals the window;dailyandmonthlysplit it. -
What each row stands for.
-
True when another page follows; pass
next_cursorascursorto read it. -
The scope read: the whole account or one entity.
-
First day read (YYYY-MM-DD).
- currency string (nullable) nullable
ISO 4217 code of the ad account, which money is in.
- entity_id string (nullable) nullable
The campaign, ad group or ad read; null for the account.
- next_cursor string (nullable) nullable
Opaque cursor for the next page; null on the last.
- object string
Example response
{
"attribution": {
"attribution_time_basis": "ad_event_time",
"attribution_window_days": 30,
"view_through_attribution_window_days": 1
},
"currency": "USD",
"data": [
{
"attributed_sales_currency": "USD",
"attributed_sales_micros": 5912000000,
"clicks": 912,
"conversions": 61,
"cpa_micros": 21057377,
"cpc_micros": 1408442,
"cpm_micros": 26643850,
"ctr": 0.018917,
"entity_id": "cmp_8f2a1c",
"entity_type": "campaign",
"impressions": 48210,
"name": "Running shoes, US",
"object": "openai_ads_performance_row",
"roas": 4.6,
"spend_micros": 1284500000
}
],
"end_date": "2026-10-15",
"granularity": "none",
"group_by": "campaign",
"has_more": false,
"level": "ad_account",
"object": "openai_ads_performance",
"start_date": "2026-09-18"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "validation_error",
"message": "Request validation failed"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "unauthorized",
"message": "Missing or invalid credentials"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "forbidden",
"message": "You do not have permission to access this resource"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "not_found",
"message": "Resource not found"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "conflict",
"message": "Resource conflict"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "rate_limit_exceeded",
"message": "Per-minute rate limit exceeded"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "internal_error",
"message": "An unexpected error occurred"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "service_unavailable",
"message": "Service temporarily unavailable, please retry"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}