Scope3 Reporting API

Access performance metrics

Operations 3

GET /advertisers/{advertiserId}/events/summary Get event summary #
GET /reporting/metrics Get reporting #
GET /reporting/margin Get storefront margin (P&L) reporting #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/scope3-reporting-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

scope3-reporting-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Scope3 Reporting API
  version: 2.0.0
  description: 'Operations tagged Reporting across 2 of this provider''s published API definitions: scope3-buyer-openapi-original.yml, scope3-storefront-openapi-original.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.interchange.io/api/v2/buyer
  description: Production server
- url: https://api.interchange.io/api/v2/storefront
  description: Production server
tags:
- name: Reporting
  description: Access performance metrics
paths:
  /advertisers/{advertiserId}/events/summary:
    get:
      operationId: getEventSummary
      summary: Get event summary
      description: Get hourly-aggregated event counts for an advertiser. Returns event counts broken down by type and hour.
      tags:
      - Reporting
      security:
      - bearerAuth: []
      parameters:
      - in: query
        name: eventType
        schema:
          description: Filter by event type. When omitted, returns all event types.
          example: impression
          allOf:
          - $ref: '#/components/schemas/EventSummaryType'
        description: Filter by event type. When omitted, returns all event types.
      - in: query
        name: startHour
        schema:
          description: Start of the query range (inclusive). Must be hour-aligned. Defaults to the start of the last completed UTC hour.
          example: '2026-03-27T14:00:00Z'
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:00:00(Z|[+-]\d{2}:\d{2})$
        description: Start of the query range (inclusive). Must be hour-aligned. Defaults to the start of the last completed UTC hour.
      - in: query
        name: endHour
        schema:
          description: End of the query range (exclusive). Must be hour-aligned. Defaults to the end of the last completed UTC hour.
          example: '2026-03-27T15:00:00Z'
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:00:00(Z|[+-]\d{2}:\d{2})$
        description: End of the query range (exclusive). Must be hour-aligned. Defaults to the end of the last completed UTC hour.
      - in: path
        name: advertiserId
        schema:
          description: Unique identifier for the advertiser
          example: '12345'
          type: string
          minLength: 1
        required: true
        description: Unique identifier for the advertiser
      responses:
        '200':
          description: Get event summary
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EventSummaryResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    servers:
    - url: https://api.interchange.io/api/v2/buyer
      description: Production server
  /reporting/metrics:
    get:
      operationId: getReportingMetrics
      summary: Get reporting
      description: Get reporting metrics across all advertisers and campaigns. The response is hierarchical for view=summary, flat leaf-by-day rows for view=timeseries, or a signed CSV download descriptor when download=true.
      tags:
      - Reporting
      security:
      - bearerAuth: []
      parameters:
      - in: query
        name: advertiserId
        schema:
          description: Filter to campaigns on this advertiser
          type: string
        description: Filter to campaigns on this advertiser
      - in: query
        name: campaignId
        schema:
          description: Filter to a specific campaign. If advertiserId is also provided, the campaign must belong to that advertiser
          type: string
        description: Filter to a specific campaign. If advertiserId is also provided, the campaign must belong to that advertiser
      - in: query
        name: startDate
        schema:
          description: Start date in ISO format (YYYY-MM-DD)
          example: '2025-01-01'
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
        description: Start date in ISO format (YYYY-MM-DD)
      - in: query
        name: endDate
        schema:
          description: End date in ISO format (YYYY-MM-DD)
          example: '2025-01-31'
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
        description: End date in ISO format (YYYY-MM-DD)
      - in: query
        name: days
        schema:
          description: 'Number of days to include (default: 7, max: 90). Use 0 for the full campaign timeframe.'
          example: 7
          default: 7
          type: integer
          minimum: 0
          maximum: 90
        description: 'Number of days to include (default: 7, max: 90). Use 0 for the full campaign timeframe.'
      - in: query
        name: view
        schema:
          description: 'Response format: "summary" for hierarchical advertiser/campaign/media-buy/package breakdown, "timeseries" for flat rows with one entry per (advertiser → campaign → media buy → package) × day'
          default: summary
          type: string
          enum:
          - summary
          - timeseries
        description: 'Response format: "summary" for hierarchical advertiser/campaign/media-buy/package breakdown, "timeseries" for flat rows with one entry per (advertiser → campaign → media buy → package) × day'
      - in: query
        name: displayCurrency
        schema:
          description: ISO-4217 currency for the consolidated (FX-converted) cross-advertiser rollup. Defaults to the buyer home currency when the advertisers share one; must be a platform-supported currency. Summary view only. The converted figures are display estimates, never billing inputs
          example: EUR
          type: string
          pattern: ^[A-Za-z]{3}$
        description: ISO-4217 currency for the consolidated (FX-converted) cross-advertiser rollup. Defaults to the buyer home currency when the advertisers share one; must be a platform-supported currency. Summary view only. The converted figures are display estimates, never billing inputs
      - in: query
        name: download
        schema:
          description: When true, generates a CSV file and returns a signed download URL instead of JSON data
          default: false
          type: boolean
        description: When true, generates a CSV file and returns a signed download URL instead of JSON data
      - in: query
        name: demo
        schema:
          description: When true, returns auto-generated demo data instead of querying real data sources
          default: false
          type: boolean
        required: true
        description: When true, returns auto-generated demo data instead of querying real data sources
      responses:
        '200':
          description: Get reporting
          content:
            application/json:
              schema:
                anyOf:
                - $ref: '#/components/schemas/ReportingMetricsResponse'
                - $ref: '#/components/schemas/ReportingMetricsTimeseriesResponse'
                - $ref: '#/components/schemas/ReportingMetricsExportResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    servers:
    - url: https://api.interchange.io/api/v2/buyer
      description: Production server
  /reporting/margin:
    get:
      operationId: getStorefrontMarginReporting
      summary: Get storefront margin (P&L) reporting
      description: 'The curator''s resale P&L from the spread ledger: booked vs realized buy/sell/spread and margin %, rolled up buyer → media buy → package → source leg. Sourced from the storefront spread ledger (not BigQuery delivery); amounts are signed and never summed across settlement currencies. Cumulative as-of snapshot — there is no per-day timeseries.'
      tags:
      - Reporting
      security:
      - bearerAuth: []
      parameters:
      - in: query
        name: inventorySourceId
        schema:
          description: Narrow to the buy legs sourced from a single inventory source (storefront_spread_ledger.source_id). When omitted, includes every source on the storefront.
          type: string
        description: Narrow to the buy legs sourced from a single inventory source (storefront_spread_ledger.source_id). When omitted, includes every source on the storefront.
      - in: query
        name: buyerCustomerId
        schema:
          description: Narrow to a single buyer customer. Can only narrow within the calling storefront — it never widens scope.
          type: integer
          maximum: 9007199254740991
          minimum: 1
        description: Narrow to a single buyer customer. Can only narrow within the calling storefront — it never widens scope.
      responses:
        '200':
          description: Get storefront margin (P&L) reporting
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StorefrontMarginReportingResponse'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    servers:
    - url: https://api.interchange.io/api/v2/storefront
      description: Production server
components:
  schemas:
    MediaBuyReporting:
      description: Media buy-level reporting metrics with package breakdown
      type: object
      properties:
        mediaBuyId:
          description: Media buy identifier
          type: string
        name:
          description: Media buy name
          type: string
        status:
          description: Media buy status
          type: string
        budget:
          description: Total allocated budget for this media buy (sum of product budgets), GROSS (fee-inclusive — stored budgets are the buyer denomination since the gross-budgets flip). Legacy media buys created before fee terms were locked report their stored legacy (net) amount instead. Null if no budget set
          type:
          - number
          - 'null'
        metrics:
          $ref: '#/components/schemas/ReportingMetrics'
        deliveryFxConversion:
          description: FX conversion applied to delivery spend when the source reported in a different currency from the advertiser primary currency. Null when no conversion was needed.
          type:
          - object
          - 'null'
          properties:
            fromCurrency:
              description: ISO-4217 currency the source reported delivery spend in
              type: string
            rate:
              description: Multiplier applied to source spend to produce advertiser-currency spend (QUOTE per BASE, e.g. ZAR per USD)
              type: number
            asOfDate:
              description: UTC calendar date of the FX rate used
              type: string
              pattern: ^\d{4}-\d{2}-\d{2}$
            source:
              description: 'booked: rate locked in the spread ledger at buy time; snapshot: fx_rate_snapshots fallback on buy creation date'
              type: string
              enum:
              - booked
              - snapshot
          required:
          - fromCurrency
          - rate
          - asOfDate
          - source
          additionalProperties: false
        packages:
          description: Package-level breakdown
          type: array
          items:
            $ref: '#/components/schemas/PackageReporting'
      required:
      - mediaBuyId
      - name
      - status
      - budget
      - metrics
      - packages
      additionalProperties: false
    EventSummaryResponse:
      description: Response containing hourly-aggregated event counts for an advertiser
      type: object
      properties:
        periodStart:
          description: Start of the queried period (inclusive, ISO 8601)
          example: '2026-03-27T14:00:00.000Z'
          type: string
          format: date-time
          pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        periodEnd:
          description: End of the queried period (exclusive, ISO 8601)
          example: '2026-03-27T15:00:00.000Z'
          type: string
          format: date-time
          pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        entries:
          description: Aggregated event entries within the queried period
          type: array
          items:
            $ref: '#/components/schemas/EventSummaryEntry'
        totalEventCount:
          description: Sum of all event counts across all entries
          example: 5000
          type: integer
          minimum: 0
          maximum: 9007199254740991
      required:
      - periodStart
      - periodEnd
      - entries
      - totalEventCount
      additionalProperties: false
    EventSummaryEntry:
      description: A single hourly aggregation entry
      type: object
      properties:
        eventHour:
          description: Start of the aggregated hour window (ISO 8601)
          example: '2026-03-27T14:00:00.000Z'
          type: string
          format: date-time
          pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        eventType:
          description: Type of event
          allOf:
          - $ref: '#/components/schemas/EventSummaryType'
        eventCount:
          description: Number of events in this hour for this type
          example: 1500
          type: integer
          minimum: 0
          maximum: 9007199254740991
      required:
      - eventHour
      - eventType
      - eventCount
      additionalProperties: false
    TimeseriesEntry:
      description: One row of metrics for a single (advertiser → campaign → media buy → package) leaf on a single day
      type: object
      properties:
        date:
          description: Reporting date (YYYY-MM-DD)
          example: '2025-01-15'
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
        advertiserId:
          description: Advertiser identifier
          type: string
        advertiserName:
          description: Advertiser name
          type: string
        currency:
          description: ISO-4217 currency that actually denominates the row's spend, eCPM, and CPC; normally the advertiser's locked primary currency, or the reported source currency when FX conversion is unavailable
          type: string
        campaignId:
          description: Campaign identifier
          type: string
        campaignName:
          description: Campaign name
          type: string
        management:
          description: 'Management state of the row''s campaign: "tracked" (mirrored read-only from a connected seller account) or "managed" (authored or adopted through the platform). Rows without a campaign are managed.'
          allOf:
          - $ref: '#/components/schemas/CampaignManagement'
        mediaBuyId:
          description: Media buy identifier
          type: string
        mediaBuyName:
          description: Media buy name
          type: string
        mediaBuyStatus:
          description: Media buy status
          type: string
        packageId:
          description: Package identifier. Empty string when the media buy has no packages.
          type: string
        productId:
          description: Product identifier for this package. Empty string when no package.
          type: string
        productName:
          description: Human-readable product name for this package. Empty string when no package.
          type: string
        metrics:
          $ref: '#/components/schemas/ReportingMetrics'
      required:
      - date
      - advertiserId
      - advertiserName
      - currency
      - campaignId
      - campaignName
      - management
      - mediaBuyId
      - mediaBuyName
      - mediaBuyStatus
      - packageId
      - productId
      - productName
      - metrics
      additionalProperties: false
    CampaignReporting:
      description: Campaign-level reporting metrics with media buy breakdown
      type: object
      properties:
        campaignId:
          description: Campaign identifier
          type: string
        campaignName:
          description: Campaign name
          type: string
        management:
          description: 'Management state of this campaign: "tracked" (a campaign the platform did not set up, mirrored read-only from a connected seller account) or "managed" (authored or adopted through the platform). Buyer reporting currently includes managed campaigns only — tracked mirror delivery is excluded from this surface — so aggregates never silently mix the two states.'
          allOf:
          - $ref: '#/components/schemas/CampaignManagement'
        metrics:
          $ref: '#/components/schemas/ReportingMetrics'
        mediaBuys:
          description: Media buy-level breakdown
          type: array
          items:
            $ref: '#/components/schemas/MediaBuyReporting'
      required:
      - campaignId
      - campaignName
      - management
      - metrics
      - mediaBuys
      additionalProperties: false
    ReportingConversionInfo:
      description: How the consolidated (FX-converted) figures were produced
      type: object
      properties:
        displayCurrency:
          description: ISO-4217 currency the consolidated block is expressed in
          type: string
        asOf:
          description: UTC calendar day whose locked rate-of-the-day was applied (one rate across the whole window)
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
        rateSource:
          description: Where the rates came from (the platform rate-of-day table)
          type: string
          enum:
          - fx_rate_snapshots
        rateBasis:
          description: 'Conversion basis: ''as-of'' applies one current rate-of-the-day to the whole window (an estimate; a booked-rate basis is a later phase)'
          type: string
          enum:
          - as-of
        rates:
          description: Every rate applied in this conversion
          type: array
          items:
            type: object
            properties:
              pair:
                description: BASEQUOTE pair, e.g. USDZAR = ZAR per USD
                type: string
              rate:
                description: QUOTE units per 1 BASE
                type: number
            required:
            - pair
            - rate
            additionalProperties: false
        unconverted:
          description: Native currencies that could NOT be converted (no rate available); their spend is excluded from the consolidated money totals rather than guessed
          type: array
          items:
            type: string
        estimate:
          description: 'Always true: the consolidated figures are display estimates, never billing or settlement inputs'
          type: boolean
          enum:
          - true
      required:
      - displayCurrency
      - asOf
      - rateSource
      - rateBasis
      - rates
      - unconverted
      - estimate
      additionalProperties: false
    AdvertiserReporting:
      description: Advertiser-level reporting metrics with campaign breakdown
      type: object
      properties:
        advertiserId:
          description: Advertiser identifier
          type: string
        advertiserName:
          description: Advertiser name
          type: string
        currency:
          description: ISO-4217 currency used for money under this advertiser (the advertiser's locked primary currency); source delivery spend is normalized to it when an applicable FX rate is available
          type: string
        metrics:
          $ref: '#/components/schemas/ReportingMetrics'
        campaigns:
          description: Campaign-level breakdown
          type: array
          items:
            $ref: '#/components/schemas/CampaignReporting'
      required:
      - advertiserId
      - advertiserName
      - currency
      - metrics
      - campaigns
      additionalProperties: false
    ConsolidatedReporting:
      description: FX-converted cross-advertiser rollup (display estimate only — never billing)
      type: object
      properties:
        totals:
          description: 'Cross-advertiser totals in the display currency: counts summed natively, money converted per advertiser then summed; money-derived metrics are null when any advertiser could not be converted'
          allOf:
          - $ref: '#/components/schemas/ReportingTotalsMetrics'
        byAdvertiser:
          description: Per-advertiser converted spend so the consolidated total is auditable row by row
          type: array
          items:
            type: object
            properties:
              advertiserId:
                type: string
              currency:
                description: The advertiser native currency this row converted from
                type: string
              spend:
                description: This advertiser spend converted to the display currency; null when its pair had no rate
                type:
                - number
                - 'null'
            required:
            - advertiserId
            - currency
            - spend
            additionalProperties: false
        conversionInfo:
          $ref: '#/components/schemas/ReportingConversionInfo'
      required:
      - totals
      - byAdvertiser
      - conversionInfo
      additionalProperties: false
    ErrorResponse:
      description: Standard error response
      type: object
      properties:
        data:
          type:
          - string
          - 'null'
          enum:
          - null
        error:
          $ref: '#/components/schemas/ApiError'
      required:
      - data
      - error
      additionalProperties: false
    ReportingMetricsExportResponse:
      description: Response containing a signed URL to download the exported CSV
      type: object
      properties:
        downloadUrl:
          description: Signed URL to download the CSV file (expires in 7 days)
          type: string
          format: uri
        expiresAt:
          description: ISO 8601 timestamp when the download URL expires
          type: string
          format: date-time
          pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        fileName:
          description: Name of the generated CSV file
          type: string
        rowCount:
          description: Number of data rows in the CSV (excluding header)
          type: integer
          minimum: 0
          maximum: 9007199254740991
      required:
      - downloadUrl
      - expiresAt
      - fileName
      - rowCount
      additionalProperties: false
    ApiError:
      description: Structured error object
      type: object
      properties:
        code:
          description: Machine-readable error code
          type: string
        message:
          description: Human-readable error message
          type: string
        field:
          description: Field path associated with the error
          type: string
        details:
          description: Additional error context
          type: object
          additionalProperties: {}
      required:
      - code
      - message
      additionalProperties: false
    PackageReporting:
      description: Package-level reporting metrics
      type: object
      properties:
        packageId:
          description: Package identifier
          type: string
        productId:
          description: Product identifier for this package
          type:
          - string
          - 'null'
        productName:
          description: Human-readable product name for this package
          type:
          - string
          - 'null'
        metrics:
          $ref: '#/components/schemas/ReportingMetrics'
      required:
      - packageId
      - productId
      - productName
      - metrics
      additionalProperties: false
    EventSummaryType:
      description: 'Type of event to filter by: conversion, click, impression, measurement, or mmp'
      type: string
      enum:
      - conversion
      - click
      - impression
      - measurement
      - mmp
    ReportingTotalsMetrics:
      description: Reporting totals; money metrics are null when returned denominations mix or no denomination is available
      type: object
      properties:
        impressions:
          description: Total impressions
          type: integer
          minimum: 0
          maximum: 9007199254740991
        spend:
          description: Total spend (gross, fee-inclusive — the buyer denomination) in the currency named by totalsCurrency; null when the returned data spans currencies or has no denomination
          type:
          - number
          - 'null'
          minimum: 0
        clicks:
          description: Total clicks
          type: integer
          minimum: 0
          maximum: 9007199254740991
        views:
          description: Viewable impressions (the MRC-viewable subset of impressions, per AdCP). For viewability rate, divide by impressions.
          type: integer
          minimum: 0
          maximum: 9007199254740991
        completedViews:
          description: Video/audio completions (qualified by view_duration_seconds when set on the goal)
          type: integer
          minimum: 0
          maximum: 9007199254740991
        conversions:
          description: Total conversions
          type: integer
          minimum: 0
          maximum: 9007199254740991
        leads:
          description: Total leads
          type: integer
          minimum: 0
          maximum: 9007199254740991
        videoCompletions:
          description: Total video completions
          type: integer
          minimum: 0
          maximum: 9007199254740991
        conversionValue:
          description: Total conversion value in the currency named by totalsCurrency; null when the returned data spans currencies or has no denomination
          type:
          - number
          - 'null'
          minimum: 0
        ecpm:
          description: 'Effective CPM: (spend * 1000) / impressions, derived from spend in this surface''s denomination (gross fee-inclusive on buyer surfaces); null when impressions is 0'
          type:
          - number
          - 'null'
        cpc:
          description: 'Cost per click: spend / clicks, derived from spend in this surface''s denomination (gross fee-inclusive on buyer surfaces); null when clicks is 0'
          type:
          - number
          - 'null'
        ctr:
          description: 'Click-through rate: clicks / impressions'
          type:
          - number
          - 'null'
        completionRate:
          description: 'Completion rate: completedViews / impressions (completions per paid impression; impressions is the paid unit for CPM video)'
          type:
          - number
          - 'null'
        cpa:
          description: 'Cost per acquisition: spend / conversions, derived from spend in this surface''s denomination (gross fee-inclusive on buyer surfaces); null when conversions is 0'
          type:
          - number
          - 'null'
        roas:
          description: 'Return on ad spend: conversionValue / spend; null when spend is 0, or when there is no conversion signal at all (conversionValue and conversions are both 0). Reports a true 0 when conversions are real but attributed value is zero. conversionValue carries no platform fee while spend is gross fee-inclusive on buyer surfaces, so buyer ROAS reads lower than storefront ROAS for identical delivery — the same denomination difference that already separates buyer and storefront cpc/ecpm.'
          type:
          - number
          - 'null'
      required:
      - impressions
      - spend
      - clicks
      - views
      - completedViews
      - conversions
      - leads
      - videoCompletions
      - conversionValue
      - ecpm
      - cpc
      - ctr
      - completionRate
      - cpa
      - roas
      additionalProperties: false
    ReportingMetrics:
      description: Raw and calculated reporting metrics
      type: object
      properties:
        impressions:
          description: Total impressions
          type: integer
          minimum: 0
          maximum: 9007199254740991
        spend:
          description: 'Total spend, denominated in the advertiser''s primary currency (every campaign and buy is stamped in that currency; USD only for USD advertisers). On BUYER surfaces spend is GROSS (fee-inclusive): seller-reported net delivered spend is grossed up at read time at each buy''s own pinned terms (a buy without pinned terms reports net as stored). On STOREFRONT surfaces spend stays NET as the seller reported it.'
          type: number
          minimum: 0
        clicks:
          description: Total clicks
          type: integer
          minimum: 0
          maximum: 9007199254740991
        views:
          description: Viewable impressions (the MRC-viewable subset of impressions, per AdCP). For viewability rate, divide by impressions.
          type: integer
          minimum: 0
          maximum: 9007199254740991
        completedViews:
          description: Video/audio completions (qualified by view_duration_seconds when set on the goal)
          type: integer
          minimum: 0
          maximum: 9007199254740991
        conversions:
          description: Total conversions
          type: integer
          minimum: 0
          maximum: 9007199254740991
        leads:
          description: Total leads
          type: integer
          minimum: 0
          maximum: 9007199254740991
        videoCompletions:
          description: Total video completions
          type: integer
          minimum: 0
          maximum: 9007199254740991
        conversionValue:
          description: Total conversion value (advertiser-attributed revenue from conversions), denominated the same as spend. Unlike spend, conversion value is never grossed up on buyer surfaces — it is advertiser revenue, not marketplace spend, so it carries no platform fee.
          type: number
          minimum: 0
        ecpm:
          description: 'Effective CPM: (spend * 1000) / impressions, derived from spend in this surface''s denomination (gross fee-inclusive on buyer surfaces); null when impressions is 0'
          type:
          - number
          - 'null'
        cpc:
          description: 'Cost per click: spend / clicks, derived from spend in this surface''s denomination (gross fee-inclusive on buyer surfaces); null when clicks is 0'
          type:
          - number
          - 'null'
        ctr:
          description: 'Click-through

# --- truncated at 32 KB (51 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/scope3/refs/heads/main/openapi/scope3-reporting-api-openapi.yml