AP
Agent Provider Depot
Opinionated picks for agents
OpenAPI

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

price-rowurn:depot-open-schema:v0.1:price-row

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."
}
price-observationurn:depot-open-schema:v0.1:price-observation

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"
}
price-eventurn:depot-open-schema:v0.1:price-event

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"
}
outcome-receipturn:depot-open-schema:v0.2:outcome-receipt

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."
}
provider-price-feedurn:depot-open-schema:v0.1:provider-price-feed

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=="
  }
}
provider-well-knownurn:depot-open-schema:v0.1:provider-well-known

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/batch body ({receipts:[...]}) and answers each item separately, in order. An invalid item never blocks the valid ones. evidence.ref may be a Countersign claim id (cs-<hex>) or an https URL. Depot stores it exactly as claimed, labels it countersign_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 full evidence.countersign block 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.json or DNS TXT record. A price is accepted only if its public sourceUrl shows 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).