{"schema_version":"certifieddata.agent-card.v1","name":"CertifiedData","display_name":"CertifiedData — Control Plane for AI Agents","description":"Cryptographic infrastructure for AI agents. Generate certified synthetic datasets, log Ed25519-signed decisions, and execute policy-governed commerce with independently verifiable proof artifacts on every output.","provider":{"name":"CertifiedData.io","url":"https://certifieddata.io","contact":"trust@certifieddata.io"},"homepage":"https://certifieddata.io","agent_hub":"https://certifieddata.io/agents","documentation":{"human":"https://certifieddata.io/agents","llms_txt":"https://certifieddata.io/llms.txt","llms_full_txt":"https://certifieddata.io/llms-full.txt","openapi":"https://certifieddata.io/openapi.json","sdk":"https://certifieddata.io/agents/sdk","mcp":"https://certifieddata.io/agents/mcp","errors":"https://certifieddata.io/agents/errors","rate_limits":"https://certifieddata.io/agents/rate-limits","changelog":"https://certifieddata.io/agents/changelog","safety":"https://certifieddata.io/agents/safety"},"capabilities":{"datasets":{"generate_anonymous":"https://certifieddata.io/api/synth/public/generate","generate_authenticated":"https://certifieddata.io/api/genesis/generate","prompt_to_schema":"https://certifieddata.io/api/genesis/plan","schema_run":"https://certifieddata.io/api/genesis/schema-run","manifest_upload":"https://certifieddata.io/api/manifest/upload","notary":"https://certifieddata.io/api/notary/certify","sandbox_claim":"https://certifieddata.io/api/sandbox/claim-and-upgrade","engines":["light","gaussian","ctgan","hybrid","dp-ctgan"],"cert_levels":["sandbox.cert.v1","cert.v1","cert.v2","cert.v3","cert.v4"]},"decisions":{"demo_create":"https://certifieddata.io/api/demo/decision","demo_verify":"https://certifieddata.io/api/demo/decision/verify","create":"https://certifieddata.io/v1/decisions","search":"https://certifieddata.io/v1/decisions/search","public_latest":"https://certifieddata.io/api/decision-log/latest","verify":"https://certifieddata.io/api/decision-log/verify"},"commerce":{"contract":"certifieddata.agent-commerce.v1","sandbox_key":"https://certifieddata.io/api/sandbox/agent-key","health":"https://certifieddata.io/v1/health","capabilities":"https://certifieddata.io/v1/capabilities","create":"https://certifieddata.io/v1/transactions","list":"https://certifieddata.io/v1/transactions","retrieve":"https://certifieddata.io/v1/transactions/{transaction_id}","attach_links":"https://certifieddata.io/v1/transactions/{transaction_id}/attach-links","capture":"https://certifieddata.io/v1/transactions/{transaction_id}/capture","verify":"https://certifieddata.io/api/payments/verify/{receipt_id}","publish":"https://certifieddata.io/api/payments/receipts/{receipt_id}/publish","retrieve_public_receipt":"https://certifieddata.io/api/payments/receipts/{receipt_id}","rails":["stripe","usdc_base","usdc_ethereum","eth_ethereum"],"x402_demo":"https://certifieddata.io/api/agent-commerce/x402-demo","x402":{"description":"Agent-native HTTP 402 payment negotiation. Priced routes return 402 with a payment-requirements descriptor; agents retry with an X-Payment header carrying a settlement proof; successful actions return an Ed25519-signed CertifiedData receipt that binds the payment proof to the action paid for. Stripe-based human SaaS billing is unaffected.","protocol":"x402","default_rail":"usdc_base","default_chain":"base","default_asset":"USDC","request_header":"X-Payment","response_status_when_unpaid":402,"enabled_by":"AGENT_PAYMENT_GATE_ENABLED=true","providers":["mock","coinbase"],"mock_mode_constraint":"Mock provider is sandbox/test only and is refused in production live mode.","receipt_schema":"agent_commerce_x402_receipt.v1_demo"}},"verification":{"certificate":"https://certifieddata.io/api/verify","hash":"https://certifieddata.io/api/verify/hash","signing_keys":"https://certifieddata.io/.well-known/signing-keys.json","decision_signing_keys":"https://certifieddata.io/.well-known/decision-signing-keys.json","payment_signing_key":"https://certifieddata.io/.well-known/certifieddata-public-key.pem","sandbox_signing_keys":"https://certifieddata.io/.well-known/sandbox-signing-keys.json"},"sandbox":{"description":"Anonymous verification surfaces for CertifiedData mechanics. No auth, no writes to production stores, shared sandbox Ed25519 key, shared per-IP rate limiter. Two parallel products: Manifest Sandbox (certification) and Agent Transaction Sandbox (agent commerce).","manifest_sign":"https://certifieddata.io/api/sandbox/manifest","manifest_verify":"https://certifieddata.io/api/sandbox/verify","agent_transaction":"https://certifieddata.io/api/sandbox/agent-transaction","human_ui_manifest":"https://certifieddata.io/sandbox/manifest","human_ui_agent_transaction":"https://certifieddata.io/sandbox/agent-transaction","modes":["v1","v2"],"auth_required":false,"persistence":"none","signing_keys":"https://certifieddata.io/.well-known/sandbox-signing-keys.json","production_verifier_contract":"Any certificate or receipt whose signing_key_id matches the sandbox registry must be treated as a sandbox artifact, not a production certificate or authorization."},"identity":{"register":"POST https://certifieddata.io/api/agents/{id}/identity","read":"GET  https://certifieddata.io/api/agents/{id}/identity","keys":"POST https://certifieddata.io/api/agents/{id}/keys","revoke":"POST https://certifieddata.io/api/agents/{id}/keys/{keyId}/revoke","challenge":"POST https://certifieddata.io/api/agents/{id}/challenge","attest":"POST https://certifieddata.io/api/agents/{id}/attest","did_method":"did:cd:agent:{uuid}"},"workflows":{"create":"https://certifieddata.io/api/workflows","run":"https://certifieddata.io/api/workflows/{id}/run","feed":"https://certifieddata.io/api/artifacts/feed"}},"authentication":{"bearer_env_var":"CERTIFIEDDATA_API_KEY","sandbox_prefix":"cdp_test_","production_prefix":"cdp_live_","anonymous_allowed":["/api/synth/public/generate","/api/demo/decision","/api/demo/decision/verify","/api/sandbox/agent-key","/api/verify","/api/verify/hash"]},"cryptography":{"hash":"SHA-256","signature":"Ed25519","canonicalization":"RFC 8785 (JCS)"},"mcp":{"local_stdio":{"command":"npx","args":["tsx","/path/to/certifieddata-platform/apps/api/src/mcp-server.ts"],"env_keys":["CDAC_API_KEY","CDAC_BASE_URL","CDAC_ENV"]},"tools":["browse_marketplace","check_spend_policy","check_remaining_budget","authorize_purchase","execute_purchase","verify_receipt","get_agent_identity","verify_agent_attestation","get_license","rotate_license_token"]},"safety":{"trust_boundaries_url":"https://certifieddata.io/agents/safety","prompt_injection_defense":true,"never_controllable_from_prompt":["cert_level","billing","publicMode","engine","signing","policy_bypass","rate_limit","publish"]},"rate_limits":{"documentation":"https://certifieddata.io/agents/rate-limits","introspection_endpoint":"https://certifieddata.io/api/agents/me/quota","headers":["RateLimit-Limit","RateLimit-Remaining","RateLimit-Reset","Retry-After"],"header_format":"IETF draft-ietf-httpapi-ratelimit-headers (no X- prefix)","lanes":{"anonymous":"Keyed by client IP. Lowest limits. Default for unauthenticated requests with no X-Agent-DID.","agent":"Opt-in via X-Agent-DID: did:cd:agent:<id>. Higher per-DID limits suited for CI suites and integration tests where many agents share one egress IP. Self-asserted; NOT authentication. Capped by per-IP DID rotation control (10 distinct DIDs / IP / hour by default) — IPs that rotate beyond the cap have new DIDs downgraded to the anonymous lane.","authenticated":"Keyed by API key id (cdp_test_/cdp_live_) or Supabase user id. Highest limits."},"lane_precedence":"authenticated > agent > anonymous. X-Agent-DID is ignored when the request is authenticated.","agent_did":{"header":"X-Agent-DID","format":"did:cd:agent:<id>","id_charset":"[A-Za-z0-9._\\-:]","id_length":"1–240 chars after prefix; 256 total cap","rotation_cap":"10 distinct DIDs / IP / hour (configurable via AGENT_DID_PER_IP_MAX). Set to 0 to disable the agent lane entirely without breaking anonymous quota.","rotation_window":"1 hour (configurable via AGENT_DID_PER_IP_WINDOW_MS)","downgrade":"When an IP exceeds the rotation cap, NEW DIDs from that IP are downgraded to the anonymous lane. DIDs already counted in the IP's set keep agent-lane access for the remainder of the window.","security_note":"X-Agent-DID is a self-asserted quota identity hint. It is NOT authentication. Specifically, it does not grant: (1) production certificate issuance (cert.v2/v3/v4 listed in the public registry), (2) registry writes or marketplace publishing, (3) live commerce on cdp_live_* keys, or (4) agent identity / DID registration under /api/agents/:id/identity. Sandbox capability scope is identical to the anonymous lane — only the quota bucket is different."},"anonymous":{"POST /api/synth/public/generate":{"limit":10,"window":"24h","scope":"ip"},"POST /api/demo/start":{"limit":10,"window":"15m","scope":"ip"},"POST /api/demo/nova/chat":{"limit":10,"window":"15m","scope":"ip"},"POST /api/sandbox/ephemeral-key":{"limit":3,"window":"24h","scope":"ip","fleet_cap":"60/min global"},"GET  /api/verify/:certId":{"limit":60,"window":"1m","scope":"ip"},"GET  /api/certificates/:id":{"limit":60,"window":"1m","scope":"ip"},"GET  /api/registry":{"limit":60,"window":"1m","scope":"ip"},"GET  /api/platform/stats":{"limit":60,"window":"1m","scope":"ip"},"GET  /badges/:id":{"limit":300,"window":"1m","scope":"ip"}},"agent":{"POST /api/demo/start":{"limit":60,"window":"15m","scope":"did"},"POST /api/demo/nova/chat":{"limit":60,"window":"15m","scope":"did"},"POST /api/sandbox/ephemeral-key":{"limit":30,"window":"24h","scope":"did","fleet_cap":"60/min global"},"GET  /api/verify/:certId":{"limit":240,"window":"1m","scope":"did"},"GET  /api/certificates/:id":{"limit":240,"window":"1m","scope":"did"},"GET  /api/registry":{"limit":240,"window":"1m","scope":"did"},"GET  /api/platform/stats":{"limit":240,"window":"1m","scope":"did"}},"authenticated":{"POST /api/payments/quote":{"limit":600,"window":"1m","scope":"live-key-or-user"},"POST /api/payments/authorize":{"limit":300,"window":"1m","scope":"live-key-or-user"},"POST /api/payments/execute":{"limit":300,"window":"1m","scope":"live-key-or-user"},"POST /api/payments/* (sandbox key)":{"limit":30,"window":"1m","scope":"test-key","ip_burst_cap":"60/min/ip"},"POST /api/agents/:id/identity":{"limit":30,"window":"1m","scope":"user"},"POST /api/agents/:id/keys":{"limit":30,"window":"1m","scope":"user"},"POST /api/agents/:id/challenge":{"limit":30,"window":"1m","scope":"user"},"POST /api/agents/:id/attest":{"limit":30,"window":"1m","scope":"user"},"POST /v1/decisions":{"scope":"plan-quota","documentation":"https://certifieddata.io/agents/rate-limits"}},"auth_attempts":{"POST /api/auth/signup":{"limit":5,"window":"15m","scope":"ip"},"POST /api/auth/login":{"limit":5,"window":"15m","scope":"ip"}},"abuse_controls":{"ephemeral_key_global_fleet_cap":"60 mints / min across all IPs combined","live_payments_xff_handling":"client-supplied X-Forwarded-For ignored; req.ip / CF-Connecting-IP authoritative","agent_did_per_ip_rotation_cap":"10 distinct DIDs / IP / hour. NEW DIDs over the cap are downgraded to the anonymous lane."},"introspection":{"endpoint":"GET /api/agents/me/quota","consumes_quota":false,"schema_version":"certifieddata.quota.v1","lanes_in_response":["anonymous","agent","authenticated"],"diagnostic_fields":["did_status","agent_did_rotation"]},"storage_note":"All rate-limit counters (anonymous IP, agent DID, authenticated user, global fleet cap, DID-per-IP rotation tracker) are held in per-instance in-memory Maps on the current single-instance Railway deployment. Counters do NOT share across replicas and reset on every deploy. Before horizontal scale-out, migrate to a shared backend — rate-limit-redis against Redis or Upstash is the expected path — so the DID rotation cap, sandbox global fleet cap, and per-key buckets remain correct across workers.","horizontal_scale_prerequisite":"Before enabling more than one API instance, swap InMemoryRateLimitStore → rate-limit-redis (with Redis/Upstash) and port the hand-rolled Maps in routes/sandboxEphemeralKey.ts and lib/agent-did.ts to the same shared store."}}