Depot Open Pricing & Outcome Schema
Version 0.2.0 (draft). An open format for what agent infrastructure costs, how those prices were observed over time, what changed, how a job actually went for an agent, and how a provider publishes its own signed prices. JSON Schema draft 2020-12. MIT licensed: implement it, fork it, emit it. The Depot dataset itself is not covered by that licence (see data terms).
Machine index: /api/schemas (names open-*) · source: schemas/open/ in the repo
What's new in 0.2 (outcome-receipt only; backward compatible): evidenceTier (self_declared, reference_checked or outcome_verified: what the submitter claims; receivers re-derive their own and store it as claimed), attestedBy {role: buyer | provider | third_party, id}, metric {name, unit, baseline, result, window{start, end}}, an extensions slot (up to 16 x- keys with scalar values), and namespaced ids such as harbor:job/intake. Every valid v0.1 receipt is still valid. The other schemas are unchanged at v0.1. Depot's own endpoint still aggregates only Depot job and provider ids.
Schemas
One sourced price for one SKU of one provider, in one unit, as stated on an official public page on a given date. Units are never converted: a row states what the page states. Extra properties are allowed (prefix your own with x-).
Matches: every row of data/pricing-rows.json · /api/pricing
Illustrative example (not real data)
{
"id": "example-provider-example-model-input",
"providerId": "example-provider",
"sku": "example-model",
"unit": "usd_per_million_input_tokens",
"amountUsd": 1.25,
"currency": "USD",
"sourceUrl": "https://example.com/pricing",
"asOf": "2026-10-01",
"normalizationStatus": "sourced_token_price",
"normalizedUsdPerMillionTokens": 1.25,
"normalizationReason": null,
"priceSortEligible": true,
"qualifier": "Illustrative example only. Not a real price."
}What was observed for one series over consecutive runs that gave an identical answer. Series kinds: catalog (the amount the dataset stored), source_recheck (what the official page itself said), http (status of an official source page). A new answer starts a new segment; past segments are never edited (append-only).
Matches: every segment of data/history/price-history.json and page-status.json · /api/history?runs=1
Illustrative example (not real data)
{
"kind": "source_recheck",
"amountUsd": 1.25,
"unit": "usd_per_million_input_tokens",
"status": "reconfirmed",
"httpStatus": 200,
"observed": 1.25,
"observedBasis": "catalog_amount_next_to_sku",
"from": "2026-10-19",
"to": "2026-10-20",
"runs": 3,
"fromRun": "2026-10-19.1",
"toRun": "2026-10-20.2"
}A dated change in a price series. source_price_changed = the amount the official page states moved (observed); amount_changed = the dataset was re-priced by a reviewer; first_seen / removed / restored / unit_changed / source_url_changed describe the row itself. Events are append-only.
Matches: every event in data/history/price-history.json · /api/price-changes
Illustrative example (not real data)
{
"date": "2026-10-20",
"recordedOn": "2026-10-20",
"runId": "2026-10-20.2",
"observedAt": "2026-10-20T15:09:29-04:00",
"rowId": "example-provider-example-model-input",
"providerId": "example-provider",
"kind": "source_price_changed",
"from": 1.25,
"to": 1.5,
"unit": "usd_per_million_input_tokens",
"sourceUrl": "https://example.com/pricing",
"fromBasis": "previous_observation",
"previousObservedOn": "2026-10-19",
"previousRunId": "2026-10-19.1",
"catalogAmountUsd": 1.25,
"observedBasis": "jsonld_offer",
"evidence": "Illustrative example only: JSON-LD Offer \"example-model input\" price 1.5 USD"
}An agent's self-report of one outcome: which job, which provider, whether it succeeded, what it cost (with the unit) and how long it took, plus an optional evidence reference. Countersign-compatible: `agent` is the claimant, and `evidence.countersign` carries the exact `cs cite <claim_id>` block so the reader can re-check the claim. Receipts are observed self-reports, not measurements by the receiver. Never include prompts, payloads, secrets or personal data. v0.2 (backward compatible: every valid v0.1 receipt is a valid v0.2 receipt) adds evidenceTier (what the submitter claims; receivers re-derive their own), attestedBy, metric with a time window, an extensions slot for namespaced x- keys, and namespaced ids (e.g. harbor:job/intake) for jobs and providers outside the Depot catalog.
Matches: body of POST /api/outcomes/receipts (Countersign-compatible) · /api/outcomes/aggregate
Illustrative example (not real data)
{
"specVersion": "0.1",
"agent": "agent:example-agent",
"jtbd": "example-job",
"provider": "example-provider",
"observedAt": "2026-10-20T12:00:00-04:00",
"success": true,
"outcome": "worked",
"cost": {
"amount": 0.42,
"currency": "USD",
"unit": "usd_total"
},
"latency": {
"ms": 1800,
"metric": "end_to_end"
},
"evidence": {
"ref": "https://example.com/run/123"
},
"notes": "Illustrative example only. Not a real receipt."
}A provider's own signed statement of its public list prices. Signature: Ed25519 over the canonical JSON (RFC 8785 JCS rules) of the whole feed with the `signature` member removed, with a key published in the provider's /.well-known/depot-provider.json (provider-well-known schema) or DNS TXT record. A receiver accepts a price only after cross-checking it against the public page at its sourceUrl. A feed never affects rank.
Matches: signed feed a claimed provider submits (cross-checked against its public page) · /providers/claim
Illustrative example (not real data)
{
"specVersion": "0.1",
"providerId": "example-provider",
"domain": "example.com",
"issuedAt": "2026-10-20T12:00:00-04:00",
"sequence": 1,
"prices": [
{
"sku": "example-model",
"unit": "usd_per_million_input_tokens",
"amountUsd": 1.25,
"currency": "USD",
"sourceUrl": "https://example.com/pricing",
"effectiveFrom": "2026-10-01",
"qualifier": "Illustrative example only. Not a real price."
}
],
"signature": {
"alg": "ed25519",
"keyId": "example-2026-10",
"value": "Bt++yPK4rDfXtTPz7Gtft89lfq4NELzRsDpagRKNdeEbe+W3k24ErvwLip//5WynHhFpu8RgtYrJHGaj/avoAA=="
}
}Served by the provider at https://<domain>/.well-known/depot-provider.json. Proves domain control (the verificationToken issued for a claim) and publishes the Ed25519 public keys that sign the provider's price feed. The same token can instead be published as a DNS TXT record: _depot-verify.<domain> TXT "depot-verify=<token>".
Matches: https://<domain>/.well-known/depot-provider.json (domain control + signing keys) · /providers/claim
Illustrative example (not real data)
{
"specVersion": "0.1",
"providerId": "example-provider",
"verificationToken": "depot-verify-EXAMPLEonlyNOTreal0001",
"feedUrl": "https://example.com/.well-known/depot-price-feed.json",
"keys": [
{
"keyId": "example-2026-10",
"alg": "ed25519",
"publicKey": "se7S7qHgO7EwjrxSwdy8MhUwbuei0jRTRESJDORWbig="
}
]
}Rules that come with the format
- Units are never converted. A price row states the unit its source page states (
usd_per_<quantity>). - History is append-only. A new observation extends the last segment or starts a new one. Past observations and events are never rewritten. Depot also chains each run into a public attestation log (how to verify).
- Canonical JSON for hashes and signatures: RFC 8785 (JCS) rules: object keys sorted, no whitespace, ECMAScript number and string serialisation.
- Outcome receipts are self-reports. A receiver labels them as observed self-reports and never lets them change a ranking. Never put prompts, payloads, secrets or personal data in a receipt. The schema rejects unknown fields.
- Batches and Countersign references. Depot accepts up to 20 receipts in one
POST /api/outcomes/receipts/batchbody ({receipts:[...]}) and answers each item separately, in order. An invalid item never blocks the valid ones.evidence.refmay be a Countersign claim id (cs-<hex>) or an https URL. Depot stores it exactly as claimed, labels itcountersign_claim_referenced_unverified, and never counts it as verified on its own. Anyone can re-check it later, read-only, at/api/outcomes/receipts/check?claim=cs-<hex>. Only a fullevidence.countersignblock that Depot re-checks against the ledger can count as verified. - Provider feeds are signed and cross-checked. Ed25519 over the canonical feed minus
signature, with a key from the provider's/.well-known/depot-provider.jsonor DNS TXT record. A price is accepted only if its publicsourceUrlshows the same amount. A claim or a feed never affects rank.
Conformance and versioning
Depot validates its own current data against these schemas on every gate (node scripts/check-open-schemas.mjs, also run by npm run validate-data). Versioning is semantic: v0.x may change. After 1.0, breaking changes only come in a new major version, announced in the changelog with a deprecation window. Once there are outside implementers, Depot intends to move the standard to neutral governance (research/STRATEGY.md).