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
| Parameter | Type | Required | Description |
|---|---|---|---|
idempotency_key | string | Recommended | Client-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_period | object | Yes | start and end as ISO 8601 date-time in UTC. Applies to all records in the request. |
usage | UsageRecord[] | Yes | One or more usage records. |
Usage Record Fields
Each record requiresaccount, vendor_cost, and currency. Additional fields depend on the vendor type:
| Field | Type | Required | Description |
|---|---|---|---|
account | AccountRef | Yes | Account for this record — by account_id or { brand, operator }. |
vendor_cost | number | Yes | Amount owed to the vendor for this record, in currency |
currency | string | Yes | ISO 4217 currency code |
pricing_option_id | string | Signals: Yes | Pricing option selected from pricing_options in the get_signals response. The vendor uses this to verify the correct rate was applied. |
impressions | number | Signals: Yes | Impressions delivered |
media_spend | number | percent_of_media: Yes | Media spend for percent-of-media cost verification |
signal_agent_segment_id | string | Signals: Yes | Signal identifier from get_signals |
Response
| Field | Description |
|---|---|
accepted | Number of usage records successfully stored |
errors | Validation errors for individual records. Partial acceptance is valid — accepted records are stored even when some fail. |
Examples
Signal usage — single campaign
Multi-account batch
A single request spanning two campaigns across two accounts:Partial acceptance
If some records fail validation, the response identifies how many were accepted:Retry Safety
Always includeidempotency_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 Code | Description | Resolution |
|---|---|---|
ACCOUNT_NOT_FOUND | Account reference in a usage record not found or not accessible | Verify via list_accounts; re-run sync_accounts if needed |
INVALID_USAGE_DATA | A usage record has missing or invalid fields | Check required fields for your vendor type |
INVALID_PRICING_OPTION | pricing_option_id not found on this account | Verify pricing_option_id from the vendor’s discovery response |
DUPLICATE_REQUEST | Request with this idempotency_key was already accepted | Safe to ignore — original response is returned unchanged |
Next Steps
- sync_accounts — Sync advertiser accounts with a seller before reporting
- Accounts Protocol — How account establishment and settlement fit together
- Accounts and agents — Billing hierarchy and operator model