openapi: 3.2.0 info: contact: email: nicholas@csoai.org name: CSOAI Ltd url: https://councilof.ai/ description: 'Verification is free forever. Agents pay per artefact: issuance, assembly, cadence — never a grade. 22 axes measured · 14 model fleets · 3 public leader scores · 8 fact runs · TIE is TIE · not a certificate. Operations with security [] are free and unauthenticated. Operations with x-payment-info are x402 doors; an amount appears only inside a door''s 402 challenge (documented as each door''s 402 example).' license: name: CC-BY-4.0 url: https://creativecommons.org/licenses/by/4.0/ title: Council of AI — Public Issuance API version: 0.2+820f7aa0ad7a x-guidance: 'Free board: GET /api/gspc — quote totals.lid verbatim, never compose a count. Paid doors are the operations carrying x-payment-info: GET without payment answers HTTP 402 with the x402 v2 challenge (accepts[0]: scheme exact, network eip155:8453, USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, payTo 0x212686404A7D1E1fD88F35eD6200c3aF7A78ae31); pay it and retry with the X-PAYMENT header. Required query parameters carry an example that reaches the 402. Free previews are named per door under x-csoai.free_preview. Catalog: https://councilof.ai/.well-known/x402.json and https://councilof.ai/api/x402. Verify is free: https://councilof.ai/gspc-verify. Offer & Receipt emission is conditional: a 402 carries server-signed offers only when the Pages signing key is available; a settled 200 carries a signed receipt only when settlement exposes the required payer and transaction evidence and that key is available. The extension uses JWS/EdDSA, kid did:web:csoai.org#board-attestation-1, published at https://csoai.org/.well-known/did.json. Check either without trusting this document: POST it to /api/receipts/verify, or run scripts/verify_receipt.py, which reads did.json and contacts nobody. 22 axes measured · 14 model fleets · 3 public leader scores · 8 fact runs · TIE is TIE · not a certificate.' servers: - url: https://councilof.ai tags: - description: sells issuance of a signed artefact name: Issuance paths: /api/request-attestation: get: description: A card-v0 commission receipt for one named subject, signed when the Pages signing key is available, plus references to up to 24 signed measurement cards whose model field contains the requested subject text. reserve_count reports the full match count. Payment never mints a MEASURED cell. operationId: x402_request_attestation parameters: - description: Subject to commission (model id, instrument id, or card sha) example: model-or-subject-id in: query name: subject required: true schema: const: model-or-subject-id type: string - description: Optional axis slug; omit for the subject-level commission in: query name: axis required: false schema: type: string responses: '200': content: application/json: schema: description: A card-v0 commission receipt for one named subject, signed when the Pages signing key is available, plus references to up to 24 signed measurement cards whose model field contains the requested subject text. reserve_count reports the full match count. Payment never mints a MEASURED cell. type: object description: A card-v0 commission receipt for one named subject, signed when the Pages signing key is available, plus references to up to 24 signed measurement cards whose model field contains the requested subject text. reserve_count reports the full match count. Payment never mints a MEASURED cell. '402': content: application/json: example: accepts: - amount: '10000' asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' csoai_pricing: campaign_id: csoai-launch-30d-20260911 ends_at: '2026-10-11T00:00:00Z' fresh_compute_excluded: true normal_amount_atomic: '20000' offered_amount_atomic: '10000' pricing_basis: PROMO_EXISTING_DATA product_id: csoai.product.request_attestation sku_id: request_attestation starts_at: '2026-09-11T00:00:00Z' tier: per_request description: A card-v0 commission receipt for one named subject, signed when the Pages signing key is available, plus references to up to 24 signed measurement cards whose model field contains the requested subject text. reserve_count reports the full match count. Payment never mints a MEASURED cell. extra: decimals: 6 name: USD Coin symbol: USDC version: '2' maxAmountRequired: '10000' maxTimeoutSeconds: 300 mimeType: application/json network: eip155:8453 payTo: '0x212686404A7D1E1fD88F35eD6200c3aF7A78ae31' resource: https://councilof.ai/api/request-attestation scheme: exact error: Payment required extensions: bazaar: info: input: method: GET queryParams: subject: model-or-subject-id type: http output: example: payload: fresh_run: UNMEASURED reserve: [] status: COMMISSIONED schema: https://councilof.ai/schema/card-v0.json sig_ed25519: subject: model-or-subject-id surface: ras.commission unmeasured: - root_inclusion type: json schema: $schema: https://json-schema.org/draft/2020-12/schema properties: input: additionalProperties: false properties: method: enum: - GET - HEAD - DELETE type: string queryParams: properties: axis: description: Optional axis slug; omit for the subject-level commission type: string subject: description: Subject to commission (model id, instrument id, or card sha) type: string required: - subject type: object type: const: http type: string required: - type - method type: object output: properties: example: type: object type: type: string required: - type type: object required: - input type: object offer-receipt: info: offers: - acceptIndex: 0 format: jws signature: eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDp3ZWI6Y3NvYWkub3JnI2JvYXJkLWF0dGVzdGF0aW9uLTEifQ.eyJhbW91bnQiOiIxMDAwMCIsImFzc2V0IjoiMHg4MzM1ODlmQ0Q2ZURiNkUwOGY0YzdDMzJENGY3MWI1NGJkQTAyOTEzIiwibmV0d29yayI6ImVpcDE1NTo4NDUzIiwicGF5VG8iOiIweDIxMjY4NjQwNEE3RDFFMWZEODhGMzVlRDYyMDBjM2FGN0E3OGFlMzEiLCJyZXNvdXJjZVVybCI6Imh0dHBzOi8vY291bmNpbG9mLmFpL2FwaS9yZXF1ZXN0LWF0dGVzdGF0aW9uIiwic2NoZW1lIjoiZXhhY3QiLCJ2YWxpZFVudGlsIjoxNzg5MzE1MTc3LCJ2ZXJzaW9uIjoxfQ.DtunHm4mvTVLpUH9Kb0tiV8cClXdHxJcw9jRklSGmPFKMv2E6_5pbtTf_Ct355hshvsySCaAin5cOjrTLtZ0BA schema: $schema: https://json-schema.org/draft/2020-12/schema properties: offers: items: properties: acceptIndex: type: integer format: const: jws type: string signature: description: JWS compact serialization containing the offer payload type: string required: - format - signature type: object type: array required: - offers type: object resource: description: A card-v0 commission receipt for one named subject, signed when the Pages signing key is available, plus references to up to 24 signed measurement cards whose model field contains the requested subject text. reserve_count reports the full match count. Payment never mints a MEASURED cell. mimeType: application/json serviceName: CSOAI Request Attest tags: - attestation - ras - measurement - x402 url: https://councilof.ai/api/request-attestation x402Version: 2 schema: $ref: '#/components/schemas/X402PaymentRequired' description: Payment required — the x402 v2 challenge. The same JSON is base64-encoded in the PAYMENT-REQUIRED response header. Pay accepts[0] (scheme exact, network eip155:8453, USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, payTo 0x212686404A7D1E1fD88F35eD6200c3aF7A78ae31; amount in atomic units) and retry the same request with the X-PAYMENT header. Verification of the artefact stays free. headers: PAYMENT-REQUIRED: description: base64(JSON) of this challenge body schema: type: string summary: Commission a signed card (request-attestation) tags: - Issuance x-csoai: challenge: amount_source: captured live 402 (challenges/request_attestation.json) captured: true payment_required_header_bytes: 7064 door: https://councilof.ai/api/request-attestation?subject=model-or-subject-id free_preview: https://councilof.ai/api/request-attestation?subject= never: - a score - a rank - a certificate - a MEASURED cell minted by payment paid_for: issuance tier: issuance x-payment-info: protocols: - x402 /api/rwa/evidence: get: description: 'A signed XRPL evidence card for RLUSD: AccountRoot flags, Domain, two-way TOML check, and cited raw-fetch hashes. Historical state — not a rating or a guarantee. preview=1 is free unsigned. Paid signed card requires asset (HTTP 402).' operationId: x402_rwa_evidence parameters: - description: XRPL issued-asset symbol (see /api/xrpl) or issuer r-address example: RLUSD in: query name: asset required: true schema: const: RLUSD type: string - description: 'Free preview: same request, no payment, no signature' in: query name: preview required: false schema: const: '1' type: string responses: '200': content: application/json: schema: description: 'A signed XRPL evidence card: AccountRoot flags, Domain, two-way TOML check, and cited raw-fetch hashes. Historical state — not a rating or a guarantee.' type: object description: 'A signed XRPL evidence card: AccountRoot flags, Domain, two-way TOML check, and cited raw-fetch hashes. Historical state — not a rating or a guarantee.' '402': content: application/json: example: accepts: - amount: '10000' asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' csoai_pricing: campaign_id: csoai-launch-30d-20260911 ends_at: '2026-10-11T00:00:00Z' fresh_compute_excluded: true normal_amount_atomic: '20000' offered_amount_atomic: '10000' pricing_basis: PROMO_EXISTING_DATA product_id: csoai.product.request_attestation sku_id: request_attestation starts_at: '2026-09-11T00:00:00Z' tier: per_request description: 'A signed XRPL evidence card for RLUSD: AccountRoot flags, Domain, two-way TOML check, and cited raw-fetch hashes. Historical state — not a rating or a guarantee.' extra: decimals: 6 name: USD Coin symbol: USDC version: '2' maxAmountRequired: '10000' maxTimeoutSeconds: 300 mimeType: application/json network: eip155:8453 payTo: '0x212686404A7D1E1fD88F35eD6200c3aF7A78ae31' resource: https://councilof.ai/api/rwa/evidence?asset=RLUSD scheme: exact error: Payment required extensions: bazaar: info: input: method: GET queryParams: asset: RLUSD type: http output: example: payload: account_root: flags_decoded: {} inputs_sha256: kind: csoai.eater.xrpl-issuer/0.1 onchain_obligation: {} state: PROBED schema: https://councilof.ai/schema/card-v0.json sha256: sig_ed25519: subject: XRPL () two-way domain + on-chain obligation surface: public.notice unmeasured: [] type: json schema: $schema: https://json-schema.org/draft/2020-12/schema properties: input: additionalProperties: false properties: method: enum: - GET - HEAD - DELETE type: string queryParams: properties: asset: description: XRPL issued-asset symbol (see /api/xrpl) or issuer r-address type: string required: - asset type: object type: const: http type: string required: - type - method type: object output: properties: example: type: object type: type: string required: - type type: object required: - input type: object offer-receipt: info: offers: - acceptIndex: 0 format: jws signature: eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDp3ZWI6Y3NvYWkub3JnI2JvYXJkLWF0dGVzdGF0aW9uLTEifQ.eyJhbW91bnQiOiIxMDAwMCIsImFzc2V0IjoiMHg4MzM1ODlmQ0Q2ZURiNkUwOGY0YzdDMzJENGY3MWI1NGJkQTAyOTEzIiwibmV0d29yayI6ImVpcDE1NTo4NDUzIiwicGF5VG8iOiIweDIxMjY4NjQwNEE3RDFFMWZEODhGMzVlRDYyMDBjM2FGN0E3OGFlMzEiLCJyZXNvdXJjZVVybCI6Imh0dHBzOi8vY291bmNpbG9mLmFpL2FwaS9yd2EvZXZpZGVuY2UiLCJzY2hlbWUiOiJleGFjdCIsInZhbGlkVW50aWwiOjE3ODkzMTUxNzgsInZlcnNpb24iOjF9.D69jVlO8tHeoilx9Ek6YULEV_pcFjV85i8J5C3KSWl4yfW-n8efmu-10TSSxsPD3CBpA74yDk_GreoIHzvxbCg schema: $schema: https://json-schema.org/draft/2020-12/schema properties: offers: items: properties: acceptIndex: type: integer format: const: jws type: string signature: description: JWS compact serialization containing the offer payload type: string required: - format - signature type: object type: array required: - offers type: object resource: description: 'A signed XRPL evidence card for RLUSD: AccountRoot flags, Domain, two-way TOML check, and cited raw-fetch hashes. Historical state — not a rating or a guarantee.' mimeType: application/json serviceName: CSOAI RWA Evidence tags: - rwa - xrpl - evidence - attestation - x402 url: https://councilof.ai/api/rwa/evidence?asset=RLUSD x402Version: 2 schema: $ref: '#/components/schemas/X402PaymentRequired' description: Payment required — the x402 v2 challenge. The same JSON is base64-encoded in the PAYMENT-REQUIRED response header. Pay accepts[0] (scheme exact, network eip155:8453, USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, payTo 0x212686404A7D1E1fD88F35eD6200c3aF7A78ae31; amount in atomic units) and retry the same request with the X-PAYMENT header. Verification of the artefact stays free. headers: PAYMENT-REQUIRED: description: base64(JSON) of this challenge body schema: type: string summary: XRPL asset evidence card (per request) tags: - Issuance x-csoai: challenge: amount_source: captured live 402 (challenges/rwa_evidence.json) captured: true payment_required_header_bytes: 6736 door: https://councilof.ai/api/rwa/evidence?asset=RLUSD free_preview: https://councilof.ai/api/rwa/evidence?asset=&preview=1 never: - a rating - a guarantee - a verdict - a rank - a paywall on /api/xrpl or /root.json paid_for: issuance tier: rwa_evidence x-payment-info: protocols: - x402 /api/wrapper: get: description: 'A signed wrapped-asset parity card for usdc.e:arbitrum: wrapped totalSupply on its chain and the canonical token''s bridge-escrow balance on the origin chain, both at pinned finalized blocks, raw reads sha256''d. A ratio — not a rate, a grade or a reserve attestation. preview=1 is free unsigned. Paid signed card requires id (HTTP 402).' operationId: x402_wrapper parameters: - description: roster id :, e.g. usdc.e:arbitrum (free ledger lists them) example: usdc.e:arbitrum in: query name: id required: true schema: const: usdc.e:arbitrum type: string - description: 'Free preview: same request, no payment, no signature' in: query name: preview required: false schema: const: '1' type: string responses: '200': content: application/json: schema: description: 'A signed wrapped-asset parity card: wrapped totalSupply on its chain and the canonical token''s bridge-escrow balance on the origin chain at pinned finalized blocks, raw reads sha256''d, BigInt ratio. A read — not a rate, a grade or a reserve attestation.' type: object description: 'A signed wrapped-asset parity card: wrapped totalSupply on its chain and the canonical token''s bridge-escrow balance on the origin chain at pinned finalized blocks, raw reads sha256''d, BigInt ratio. A read — not a rate, a grade or a reserve attestation.' '402': content: application/json: example: accepts: - amount: '10000' asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' csoai_pricing: campaign_id: csoai-launch-30d-20260911 ends_at: '2026-10-11T00:00:00Z' fresh_compute_excluded: true normal_amount_atomic: '20000' offered_amount_atomic: '10000' pricing_basis: PROMO_EXISTING_DATA product_id: csoai.product.request_attestation sku_id: request_attestation starts_at: '2026-09-11T00:00:00Z' tier: per_request description: 'A signed wrapped-asset parity card for usdc.e:arbitrum: wrapped totalSupply on its chain and the canonical token''s bridge-escrow balance on the origin chain, both at pinned finalized blocks, raw reads sha256''d. A ratio — not a rate, a grade or a reserve attestation.' extra: decimals: 6 name: USD Coin symbol: USDC version: '2' maxAmountRequired: '10000' maxTimeoutSeconds: 300 mimeType: application/json network: eip155:8453 payTo: '0x212686404A7D1E1fD88F35eD6200c3aF7A78ae31' resource: https://councilof.ai/api/wrapper?id=usdc.e%3Aarbitrum scheme: exact error: Payment required extensions: bazaar: info: input: method: GET queryParams: id: usdc.e:arbitrum type: http output: example: payload: escrow_over_wrapped: inputs_sha256: kind: csoai.wrapper.parity/0.1 reads: escrow_balance: {} wrapped_total_supply: {} state: ESCROW_PARITY_READ schema: https://councilof.ai/schema/card-v0.json sha256: sig_ed25519: subject: wrapped on vs — ESCROW_PARITY_READ surface: public.notice unmeasured: [] type: json schema: $schema: https://json-schema.org/draft/2020-12/schema properties: input: additionalProperties: false properties: method: enum: - GET - HEAD - DELETE type: string queryParams: properties: id: description: roster id :, e.g. usdc.e:arbitrum (free ledger lists them) type: string required: - id type: object type: const: http type: string required: - type - method type: object output: properties: example: type: object type: type: string required: - type type: object required: - input type: object offer-receipt: info: offers: - acceptIndex: 0 format: jws signature: eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDp3ZWI6Y3NvYWkub3JnI2JvYXJkLWF0dGVzdGF0aW9uLTEifQ.eyJhbW91bnQiOiIxMDAwMCIsImFzc2V0IjoiMHg4MzM1ODlmQ0Q2ZURiNkUwOGY0YzdDMzJENGY3MWI1NGJkQTAyOTEzIiwibmV0d29yayI6ImVpcDE1NTo4NDUzIiwicGF5VG8iOiIweDIxMjY4NjQwNEE3RDFFMWZEODhGMzVlRDYyMDBjM2FGN0E3OGFlMzEiLCJyZXNvdXJjZVVybCI6Imh0dHBzOi8vY291bmNpbG9mLmFpL2FwaS93cmFwcGVyIiwic2NoZW1lIjoiZXhhY3QiLCJ2YWxpZFVudGlsIjoxNzg5MzE1MTc4LCJ2ZXJzaW9uIjoxfQ.SdV8dTMTTepF1pLyCWf88nwHGQKx59EwZZEN8HmnokeS5GYLhYoc9v-bJr-QUJd8mJkTw4kt5YsCUWSEk0u0Dg schema: $schema: https://json-schema.org/draft/2020-12/schema properties: offers: items: properties: acceptIndex: type: integer format: const: jws type: string signature: description: JWS compact serialization containing the offer payload type: string required: - format - signature type: object type: array required: - offers type: object resource: description: 'A signed wrapped-asset parity card for usdc.e:arbitrum: wrapped totalSupply on its chain and the canonical token''s bridge-escrow balance on the origin chain, both at pinned finalized blocks, raw reads sha256''d. A ratio — not a rate, a grade or a reserve attestation.' mimeType: application/json serviceName: CSOAI Wrapped-Asset Parity tags: - stablecoin - bridge - wrapped - parity - evidence url: https://councilof.ai/api/wrapper?id=usdc.e%3Aarbitrum x402Version: 2 schema: $ref: '#/components/schemas/X402PaymentRequired' description: Payment required — the x402 v2 challenge. The same JSON is base64-encoded in the PAYMENT-REQUIRED response header. Pay accepts[0] (scheme exact, network eip155:8453, USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913, payTo 0x212686404A7D1E1fD88F35eD6200c3aF7A78ae31; amount in atomic units) and retry the same request with the X-PAYMENT header. Verification of the artefact stays free. headers: PAYMENT-REQUIRED: description: base64(JSON) of this challenge body schema: type: string summary: Wrapped-asset parity card (per pair) tags: - Issuance x-csoai: challenge: amount_source: captured live 402 (challenges/wrapper.json) captured: true payment_required_header_bytes: 7100 door: https://councilof.ai/api/wrapper?id=usdc.e:arbitrum free_preview: https://councilof.ai/api/wrapper?id=&preview=1 never: - a rating - a guarantee - a verdict - a rank - a reserve attestation - a paywall on the free ledger or /root.json paid_for: issuance tier: wrapper_parity x-payment-info: protocols: - x402 components: schemas: X402PaymentRequired: properties: accepts: items: $ref: '#/components/schemas/X402Accept' minItems: 1 type: array error: type: string extensions: description: extensions.bazaar carries info.input (a sample request) and schema (input/output JSON Schema). extensions['offer-receipt'].info.offers[] carries one server-signed offer per accepts[] entry, format 'jws' — a compact EdDSA JWS whose payload is the offer (x402 Offer & Receipt extension §4.1). It is present only when the edge holds its signing key; csoai.offer_receipt.signed says which, and why, on every 402. properties: offer-receipt: properties: info: properties: offers: items: properties: acceptIndex: description: unsigned convenience field; match offers to accepts[] by payload fields, never by index (§4.1.1) type: integer format: const: jws type: string signature: description: JWS compact serialization containing the offer payload type: string required: - format - signature type: object type: array type: object type: object type: object resource: properties: description: type: string mimeType: type: string serviceName: type: string tags: items: type: string type: array url: type: string type: object x402Version: const: 2 type: integer required: - x402Version - accepts type: object X402Accept: properties: amount: description: atomic units (x402 v2) pattern: ^[0-9]+$ type: string asset: const: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' description: USDC contract, 6 decimals type: string extra: description: EIP-712 domain of the asset properties: name: type: string version: type: string type: object maxAmountRequired: description: atomic units (x402 v1 name for the same figure) pattern: ^[0-9]+$ type: string maxTimeoutSeconds: type: integer network: const: eip155:8453 description: CAIP-2 type: string payTo: const: '0x212686404A7D1E1fD88F35eD6200c3aF7A78ae31' type: string scheme: const: exact type: string required: - scheme - network - asset - payTo - amount - maxTimeoutSeconds type: object securitySchemes: ed25519: description: Ed25519 signature of canonical body, under did:web:csoai.org#card-attestation-1 in: header name: X-CSOAI-Signed-Card type: apiKey githubOidc: bearerFormat: JWT description: GitHub Actions OIDC token satisfying the handler's issuer, audience, repository and workflow checks. scheme: bearer type: http operatorBearer: description: Operation-specific configured operator or writer credential. Not interchangeable across operations. scheme: bearer type: http x-x402: amounts: only inside each resource's 402 challenge (accepts[].amount) — never on this catalog, never in prose asset: contract: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' decimals: 6 symbol: USDC catalog: https://councilof.ai/api/x402 doors: - /api/free-door - /api/request-attestation - /api/evidence-bundle - /api/eunomia-data - /api/proof - /api/rwa/evidence - /api/wrapper - /api/art50/marking-evidence - /api/feeds/provider-diff - /api/receipts/batch facilitator: configured: true note: the facilitator URL is a Cloudflare Pages env var (X402_FACILITATOR_URL) that no public surface publishes; /api/x402 reports only whether one is configured url: null mcp: https://councilof.ai/mcp mode: live mode_note: A settled receipt (facilitator /verify then /settle) unlocks the paid artefact. Verification of every artefact stays free. network: eip155:8453 not: - score - certificate - filled-cells - pay-to-pass - rank offer_receipt: alg: EdDSA did_document: https://csoai.org/.well-known/did.json formats_emitted: - jws formats_not_emitted: - eip712 kid: did:web:csoai.org#board-attestation-1 receipts_by_payer: https://councilof.ai/api/receipts?payer=0x… spec: https://github.com/x402-foundation/x402/blob/69652a69798f0b08f95bef33318896e36e210f7e/specs/extensions/extension-offer-and-receipt.md spec_commit: 69652a69798f0b08f95bef33318896e36e210f7e supported: true verify_hosted: https://councilof.ai/api/receipts/verify verify_offline: scripts/verify_receipt.py why_no_eip712: the edge holds one Ed25519 signing key (a Cloudflare Pages secret) and no secp256k1 signer; eip712 would require a key nobody has provisioned, so we emit none rather than a format we cannot produce payTo: '0x212686404A7D1E1fD88F35eD6200c3aF7A78ae31' public_operations: 104 quarantined: - buyable: false free_status: https://councilof.ai/api/witness/status?sha256=<64-hex> lifecycle: QUARANTINED_PRE_RELEASE reason: paid witness issuance is disabled until a release gate verifies leaf → signed root → sidecar → Rekor → OpenTimestamps url: https://councilof.ai/api/witness?sha256=<64-hex> revenue_truth: https://councilof.ai/api/revenue schema_of_source: catalog: csoai.x402-catalog/0.2 well_known: csoai.x402/0.2 scheme: exact well_known: https://councilof.ai/.well-known/x402.json