Event payloads
Every payload has version (its contract, for example price-change.v1), type and id (equal to the webhook-id header; use it to deduplicate, as Delivery describes). Every event below also has provider, and type is <event>.<provider>; the test delivery (webhook.test) has no provider. Switch on version to parse.
When the change was published: eligibleAt on every event except tos.changed, which has firstSeenAt (when the version was first seen) and, for a version that was approved before publication, approvedAt.
Prices are decimal strings in currency, never floats. canonicalResource is null when no canonical id is known. Times are RFC 3339 in UTC. Values shown as … or <sha256> are abbreviated here.
price.changed · Price changes
A published price of a resource changed.
previousPrice is the price published before this one. approvedAt is present when a person approved the new price before it was published; eligibleAt is when it was published.
{
"version": "price-change.v1",
"type": "price.changed.openai",
"id": "6f1c0b0e9d1a4c7f8e2b5a3d1c0e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e",
"provider": "openai",
"source": "openai-docs",
"resource": "gpt-5",
"canonicalResource": "openai/gpt-5",
"dimension": "input",
"unit": "usd_per_token",
"previousPrice": "0.000001",
"price": "0.0000008",
"currency": "USD",
"pricingTier": "standard",
"recordedAt": "2026-08-31T11:00:00.000000Z",
"runId": "run_01J8Z5Q2W3",
"contentHash": "b2c9…",
"eligibleAt": "2026-08-31T11:30:00.000000Z",
"approvedAt": "2026-08-31T11:30:00.000000Z"
}resource.added · New resources
A resource (a model, a GPU type, …) was priced for the first time.
Sent once per resource. prices holds every price line first recorded for it, sorted by dimension, unit and tier. Price lines added to the resource later (a new tier, a new dimension) do not send another resource.added.
{
"version": "resource-added.v1",
"type": "resource.added.openai",
"id": "<sha256>",
"provider": "openai",
"source": "openai-docs",
"resource": "gpt-6-astra",
"canonicalResource": "openai/gpt-6-astra",
"recordedAt": "2026-09-03T20:20:00.000000Z",
"eligibleAt": "2026-09-03T20:20:00.000000Z",
"prices": [
{
"dimension": "input",
"unit": "usd_per_token",
"price": "0.00001",
"currency": "USD",
"pricingTier": "standard",
"recordedAt": "2026-09-03T20:20:00.000000Z",
"runId": "run_01J8Z5Q2W3",
"contentHash": "…"
}
]
}tos.changed · Terms of service changes
A legal document a provider publishes (terms of use, usage policy, …) changed.
doc is the document's slug and url where it is published. diffSummary describes the changed region of the normalized text, or is null when no diff was recorded. A version held for review is announced only once approved; the event then carries approvedAt.
{
"version": "tos-change.v1",
"type": "tos.changed.anthropic",
"id": "<sha256>",
"provider": "anthropic",
"doc": "usage-policy",
"url": "https://www.anthropic.com/legal/aup",
"previousContentHash": "…",
"contentHash": "…",
"contentLength": 41230,
"firstSeenAt": "2026-09-01T06:10:00.500000Z",
"runId": "run_01J8Z5Q2W3",
"diffSummary": {
"identical": false,
"removedTokens": 3,
"addedTokens": 5,
"before": "…",
"after": "…"
}
}price.revised · Price revisions
A price kept its value but another money field changed: its effective date, its canonical resource, its category or a billing condition.
changed names the money fields that differ. previous and current hold every money field each revision has, including the ones that did not change. Changes to descriptive fields only (a display name, notes) are not announced.
{
"version": "price-revised.v1",
"type": "price.revised.openai",
"id": "<sha256>",
"provider": "openai",
"source": "openai-docs",
"resource": "gpt-5",
"canonicalResource": "openai/gpt-5",
"dimension": "input",
"unit": "usd_per_token",
"currency": "USD",
"pricingTier": "standard",
"price": "0.00000125",
"contentHash": "…",
"revisionHash": "…",
"previousRevisionHash": "…",
"changed": [
"effectiveDate"
],
"previous": {
"effectiveDate": "2026-08-01",
"serviceCategory": "llm_tokens"
},
"current": {
"effectiveDate": "2026-09-15",
"serviceCategory": "llm_tokens"
},
"revisedAt": "2026-09-30T10:00:00.000000Z",
"eligibleAt": "2026-09-30T10:00:00.000000Z"
}price.corrected · Price corrections
A published price was withdrawn because it was wrong, or a withdrawn price was restored.
revoked is the withdrawn price and replacement the price served in its place now, or null when there is none. A restore (the withdrawal itself was the mistake) is a second price.corrected with its own id: replacement is then the restored row (the same contentHash as revoked) and restoredAt is present. Replacing revoked with replacement gives the right price in both cases.
{
"version": "price-corrected.v1",
"type": "price.corrected.openai",
"id": "<sha256>",
"provider": "openai",
"source": "openai-docs",
"resource": "gpt-5",
"canonicalResource": "openai/gpt-5",
"dimension": "input",
"unit": "usd_per_token",
"currency": "USD",
"pricingTier": "standard",
"revoked": {
"contentHash": "…",
"price": "0.001",
"recordedAt": "2026-09-30T09:00:00.000000Z",
"publishedAt": "2026-09-30T09:00:00.000000Z"
},
"revokedAt": "2026-09-30T11:40:00.000000Z",
"replacement": {
"contentHash": "…",
"price": "0.00000125",
"recordedAt": "2026-09-30T11:40:00.000000Z"
},
"eligibleAt": "2026-09-30T11:40:00.000000Z"
}resource.removed · Removed resources
A resource's price lines were removed: the provider stopped listing it and the removal was confirmed.
Sent only for a confirmed removal, never because a price was not seen for a while. One event per resource and removal; prices lists the last published price of each removed line; lastPrice, lastContentHash and lastSeenAt are null when no published price of the line is found. When a rename caused the removal the event carries renamedTo, and it is sent only to webhooks that do not subscribe to resource.renamed.
{
"version": "resource-removed.v1",
"type": "resource.removed.openai",
"id": "<sha256>",
"provider": "openai",
"source": "openai-docs",
"resource": "gpt-4.5",
"canonicalResource": "openai/gpt-4.5",
"removedAt": "2026-09-30T11:42:00.000000Z",
"eligibleAt": "2026-09-30T11:42:00.000000Z",
"prices": [
{
"dimension": "input",
"unit": "usd_per_token",
"currency": "USD",
"pricingTier": "standard",
"lastPrice": "0.000075",
"lastContentHash": "…",
"lastSeenAt": "2026-09-29T00:00:00.000000Z"
}
]
}resource.renamed · Renamed resources
A provider renamed a resource; its price history continues under the new name.
resource is the new name and previousResource the old one. prices pairs each price line of the new name with the old name's line at the same dimension, unit, currency and tier (null where one side has none). The new name may already have sent a resource.added when it first appeared.
{
"version": "resource-renamed.v1",
"type": "resource.renamed.xai",
"id": "<sha256>",
"provider": "xai",
"source": "xai-models",
"resource": "voice-sts",
"previousResource": "voice-agent",
"canonicalResource": null,
"previousCanonicalResource": null,
"renamedAt": "2026-10-05T10:00:00.000000Z",
"eligibleAt": "2026-10-05T10:00:00.000000Z",
"prices": [
{
"dimension": "generation",
"unit": "usd_per_minute",
"currency": "USD",
"pricingTier": "standard",
"price": "0.08",
"contentHash": "…",
"previousPrice": "0.08",
"previousContentHash": "…"
}
]
}provider.added · New providers
A provider became available for the first time.
Sent once, to webhooks subscribed to * and to webhooks that already list the provider while it is being added. Filters do not apply.
{
"version": "provider-added.v1",
"type": "provider.added.example-gpu",
"id": "<sha256>",
"provider": "example-gpu",
"displayName": "Example GPU",
"activatedAt": "2026-09-30T11:50:00.000Z",
"eligibleAt": "2026-09-30T11:50:00.000Z",
"sources": [
{
"key": "example-gpu",
"kind": "prices"
},
{
"key": "tos-example-gpu-terms",
"kind": "terms"
}
]
}alias.member_added · Alias group: member added
A provider's resource joined an alias group.
prices holds every line the resource is priced at now, sorted by source, dimension, unit and tier (empty when it is no longer priced). A resource usually joins its group some hours after its resource.added.
{
"version": "alias-member-added.v1",
"type": "alias.member_added.azure",
"id": "<sha256>",
"alias": {
"id": "8c4e7b1a-2f3d-4e5a-9b6c-0d1e2f3a4b5c",
"name": "claude-opus-5.5"
},
"provider": "azure",
"resource": "claude-opus-5-5",
"canonicalResource": "anthropic/claude-opus-5.5",
"addedAt": "2026-10-13T19:07:41.000Z",
"eligibleAt": "2026-10-13T19:07:41.000Z",
"prices": [
{
"source": "azure-retail-api",
"dimension": "input",
"unit": "usd_per_token",
"price": "0.000005",
"currency": "USD",
"pricingTier": "global",
"recordedAt": "2026-10-13T06:20:00.000000Z",
"runId": "run_01J8Z5Q2W3",
"contentHash": "…"
}
]
}alias.member_removed · Alias group: member removed
A provider's resource left an alias group, or the group was deleted.
groupDeleted: true is present when the whole group was deleted (one event per member). This says the grouping changed, not that the provider stopped selling the resource: that is resource.removed.
{
"version": "alias-member-removed.v1",
"type": "alias.member_removed.azure",
"id": "<sha256>",
"alias": {
"id": "8c4e7b1a-2f3d-4e5a-9b6c-0d1e2f3a4b5c",
"name": "claude-opus-5.5"
},
"provider": "azure",
"resource": "claude-opus-5-5",
"canonicalResource": "anthropic/claude-opus-5.5",
"removedAt": "2026-10-14T09:12:03.000Z",
"eligibleAt": "2026-10-14T09:12:03.000Z"
}