Skip to main content
Reports how a vendor’s service was consumed after campaign delivery. Called by orchestrators to inform a vendor agent (signals, governance, creative) what was used so the vendor can track earned revenue and verify billing. Each usage record is self-contained — it carries its own account and media_buy_id. A single request can span multiple accounts and campaigns. Response Time: ~1s. Request Schema: /schemas/latest/account/report-usage-request.json Response Schema: /schemas/latest/account/report-usage-response.json

Request Parameters

ParameterTypeRequiredDescription
idempotency_keystringRecommendedClient-generated unique key for this request (UUID recommended). If a request with the same key has already been accepted, the server returns the original response without re-processing. Prevents duplicate billing on retries.
reporting_periodobjectYesstart and end as ISO 8601 date-time in UTC. Applies to all records in the request.
usageUsageRecord[]YesOne or more usage records.

Usage Record Fields

Each record requires account, vendor_cost, and currency. Additional fields depend on the vendor type:
FieldTypeRequiredDescription
accountAccountRefYesAccount for this record — by account_id or { brand, operator }.
vendor_costnumberYesAmount owed to the vendor for this record, in currency
currencystringYesISO 4217 currency code
pricing_option_idstringSignals: YesPricing option selected from pricing_options in the get_signals response. The vendor uses this to verify the correct rate was applied.
impressionsnumberSignals: YesImpressions delivered
media_spendnumberpercent_of_media: YesMedia spend for percent-of-media cost verification
signal_agent_segment_idstringSignals: YesSignal identifier from get_signals

Response

FieldDescription
acceptedNumber of usage records successfully stored
errorsValidation errors for individual records. Partial acceptance is valid — accepted records are stored even when some fail.

Examples

Signal usage — single campaign

{
  "idempotency_key": "550e8400-e29b-41d4-a716-446655440000",
  "reporting_period": {
    "start": "2025-03-01T00:00:00Z",
    "end": "2025-03-31T23:59:59Z"
  },
  "usage": [
    {
      "account": { "account_id": "acct_pinnacle_signals" },
      "signal_agent_segment_id": "luxury_auto_intenders",
      "pricing_option_id": "po_lux_auto_cpm",
      "impressions": 4200000,
      "media_spend": 21000.00,
      "vendor_cost": 2100.00,
      "currency": "USD"
    }
  ]
}

Multi-account batch

A single request spanning two campaigns across two accounts:
{
  "idempotency_key": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "reporting_period": {
    "start": "2025-03-01T00:00:00Z",
    "end": "2025-03-31T23:59:59Z"
  },
  "usage": [
    {
      "account": { "account_id": "acct_pinnacle_signals" },
      "signal_agent_segment_id": "luxury_auto_intenders",
      "pricing_option_id": "po_lux_auto_cpm",
      "impressions": 2100000,
      "vendor_cost": 1050.00,
      "currency": "USD"
    },
    {
      "account": { "account_id": "acct_nova" },
      "signal_agent_segment_id": "eco_conscious_shoppers",
      "pricing_option_id": "po_eco_cpm",
      "impressions": 800000,
      "vendor_cost": 400.00,
      "currency": "USD"
    }
  ]
}

Partial acceptance

If some records fail validation, the response identifies how many were accepted:
{
  "accepted": 1,
  "errors": [
    {
      "code": "INVALID_PRICING_OPTION",
      "message": "pricing_option_id 'po_unknown' does not exist on this account",
      "field": "usage[1].pricing_option_id"
    }
  ]
}

Retry Safety

Always include idempotency_key in production usage. If a request times out or returns a network error, retry with the same key — the server will return the original result without double-counting. Generate a fresh UUID per request, not per usage record. If you need to report additional records for the same period, submit a new request with a new key.

Reporting cadence

Report at regular intervals — monthly at minimum. For campaigns with significant spend, weekly reporting gives vendor agents timely visibility into earned revenue. Report upon campaign completion to close out the final period.

Error Handling

Error CodeDescriptionResolution
ACCOUNT_NOT_FOUNDAccount reference in a usage record not found or not accessibleVerify via list_accounts; re-run sync_accounts if needed
INVALID_USAGE_DATAA usage record has missing or invalid fieldsCheck required fields for your vendor type
INVALID_PRICING_OPTIONpricing_option_id not found on this accountVerify pricing_option_id from the vendor’s discovery response
DUPLICATE_REQUESTRequest with this idempotency_key was already acceptedSafe to ignore — original response is returned unchanged

Next Steps