{"openapi":"3.1.0","info":{"title":"Overwing API","version":"0.21.0","contact":{"name":"Overwing","email":"support@overwing.ai","url":"https://overwing.ai"},"x-guidance":"To check text before it is sent or acted on, POST /api/x402/evaluate with {\"input\": \"<text>\"} and pay $0.002 in USDC over x402; branch on recommended_action in the response (block, redact, review, allow). The text can be in any language; responses are in English, and GET /api/v1/languages lists the languages tested. Add rule_set \"outbound-message\" and a context object (recipient, channel, owns_contact_info) when the text is a message to a known recipient. To identify a bot, GET /api/x402/atlas/lookup?user_agent=<string> for $0.001. To try either with no payment and no key, call POST /api/v1/evaluate or GET /api/v1/atlas/lookup with no Authorization header, 10 a day each. Everything under /api/v1 other than those two needs a key from POST /api/v1/signup. Full guide: /llms.txt.","summary":"Guardrails that check text before an agent sends it, open data on AI agents (Atlas), a check of whether a site is reachable by agents (Beacon), and clearance for agents on legacy systems (Tower).","description":"Overwing makes five products, all in this API. Preflight (/api/v1/preflight): one check of an unsigned Solana transaction against the caller's policy, answering allow or refuse before an agent signs it. Guardrails (/api/v1/evaluate): send any text and a rule set slug; receive a pass/fail/review verdict per rule and in aggregate, one recommended action (block, redact, review, allow) and calibrated confidence, typically in under 500 ms. Atlas (/api/v1/atlas): a registry of AI crawlers, fetchers and browser agents, and a lookup that says what a User-Agent claims to be and whether the claim can be verified. Beacon (/api/v1/beacon): one paid lookup that says whether a site is reachable by agents, that is whether they can find it, read it and use it; $1 over x402 at /api/x402/beacon, or $5 by card. Tower (/api/v1/tower): typed operations on legacy business systems, where each write is executed, sent to a person for review, or refused, with a signed receipt for every step; in pilot, against a mock adapter. POST /api/v1/evaluate and GET /api/v1/atlas/lookup work with no key, 10 calls a day each; everything else takes `Authorization: Bearer ow_live_...` from POST /api/v1/signup (Tower actions take an agent key, `ow_agent_...`). Every error is `{ \"error\": \"...\" }`. The same operations are available over MCP (hosted at /mcp, or the overwing-mcp npm package) and, for evaluate and lookup, over A2A at /a2a. Plain-text guide at /llms.txt; human-readable reference at /docs."},"servers":[{"url":"https://overwing.ai"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Tower","description":"Overwing Tower: clearance for agents operating legacy systems. Typed operations, per-agent keys, policy decisions (auto / review / reject), human review, signed receipts."},{"name":"Preflight","description":"Overwing Preflight: should an agent sign this Solana transaction? Simulates the unsigned transaction, compares what it would take from the wallet against the caller's policy, and answers allow or refuse. Every verdict is published."},{"name":"Beacon","description":"Overwing Beacon: is a site reachable by agents? One paid lookup that checks robots.txt, llms.txt, MCP, A2A and OpenAPI and how the home page reads to a model. No key: pay per check."},{"name":"Atlas","description":"Overwing Atlas: open data on AI agents. Registry, user-agent lookups, datasets, and reports. Separate product, same API key."},{"name":"Evaluate","description":"Score text against a rule set"},{"name":"Rule sets","description":"Prebuilt and custom rule sets"},{"name":"Account","description":"Keys, usage, webhooks, identity"},{"name":"Onboarding","description":"Self-serve account creation"},{"name":"Billing","description":"Plans and subscriptions (Stripe)"},{"name":"Meta","description":"Health and discovery"}],"paths":{"/api/v1/evaluate/batch":{"post":{"tags":["Evaluate"],"operationId":"evaluateBatch","summary":"Evaluate up to 50 inputs against one rule set in a single call","description":"Each item counts as one evaluation against the daily quota and the per-minute burst limit; the whole batch is reserved up front (429 if it would not fit). Items succeed or fail independently and are processed with bounded concurrency. Supports Idempotency-Key.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255,"pattern":"^[A-Za-z0-9_.:-]{1,255}$"},"description":"Optional. Retrying with the same key and body within 24 hours returns the stored response (header Idempotency-Replayed: true) without re-running or re-charging. Same key with a different body returns 422; a still-running original returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"},"example":{"rule_set":"content-safety","items":[{"id":"msg-1","input":"Hello there."},{"id":"msg-2","input":"Call me at 555-123-4567.","metadata":{"thread":"t1"}}]}}}},"responses":{"200":{"description":"Per-item results (some items may carry an error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResponse"}}}},"400":{"description":"Invalid input; the message names the offending item","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Rule set not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency-Key still in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Idempotency-Key reused with a different body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Batch would exceed the daily quota or the per-minute limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Every item failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResponse"}}}}}}},"/api/v1/evaluate":{"post":{"tags":["Evaluate"],"operationId":"evaluate","summary":"Evaluate text against a rule set. Works with no key (10 a day, inputs up to 2,000 characters, prebuilt rule sets); a key lifts the limits","security":[{},{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255,"pattern":"^[A-Za-z0-9_.:-]{1,255}$"},"description":"Optional. Retrying with the same key and body within 24 hours returns the stored response (header Idempotency-Replayed: true) without re-running or re-charging. Same key with a different body returns 422; a still-running original returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluateRequest"},"example":{"input":"Hello, this is a test.","rule_set":"content-safety","metadata":{"session":"abc"}}}}},"responses":{"200":{"description":"Verdict","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Daily evaluation limit"},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix seconds at next UTC midnight"},"X-Burst-Limit":{"schema":{"type":"integer"},"description":"Evaluations allowed per minute on this plan"},"X-Burst-Remaining":{"schema":{"type":"integer"}},"X-Burst-Reset":{"schema":{"type":"integer"},"description":"Unix seconds when the current minute window ends"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Evaluation"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Rule set not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency-Key still in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Idempotency-Key reused with a different body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily quota and prepaid credits exhausted, or per-minute burst limit reached (see Retry-After and the X-RateLimit-* / X-Burst-* headers)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Evaluation engine error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/evaluations":{"delete":{"tags":["Evaluate"],"operationId":"purgeEvaluations","summary":"Bulk delete stored evaluations (all, or those before a date)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirm"],"properties":{"confirm":{"type":"string","const":"delete"},"before":{"type":"string","format":"date-time"}}}}}},"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"integer"},"before":{"type":["string","null"]}}}}}},"400":{"description":"Missing confirmation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["Evaluate"],"operationId":"listEvaluations","summary":"List evaluations, newest first","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from next_cursor"},{"name":"verdict","in":"query","schema":{"$ref":"#/components/schemas/Verdict"}},{"name":"rule_set","in":"query","schema":{"type":"string"},"description":"Rule set slug"}],"responses":{"200":{"description":"Page of evaluations","content":{"application/json":{"schema":{"type":"object","required":["evaluations","next_cursor"],"properties":{"evaluations":{"type":"array","items":{"$ref":"#/components/schemas/EvaluationSummary"}},"next_cursor":{"type":["string","null"]}}}}}},"400":{"description":"Invalid query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/evaluations/{id}":{"delete":{"tags":["Evaluate"],"operationId":"deleteEvaluation","summary":"Delete one stored evaluation","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["Evaluate"],"operationId":"getEvaluation","summary":"Fetch one evaluation with input and per-rule results","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^eval_[A-Za-z0-9_-]{16}$"}}],"responses":{"200":{"description":"Evaluation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationDetail"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/rule-sets":{"get":{"tags":["Rule sets"],"operationId":"listRuleSets","summary":"List rule sets visible to this org","parameters":[{"name":"include_inactive","in":"query","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Rule sets","content":{"application/json":{"schema":{"type":"object","properties":{"rule_sets":{"type":"array","items":{"$ref":"#/components/schemas/RuleSet"}}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Rule sets"],"operationId":"createRuleSet","summary":"Create a custom rule set","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleSetCreate"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleSet"}}}},"400":{"description":"Validation error; the message names the offending field","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Slug already taken","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/rule-sets/{slug}":{"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Rule sets"],"operationId":"getRuleSet","summary":"Fetch a rule set with its rules","responses":{"200":{"description":"Rule set","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleSet"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Rule sets"],"operationId":"updateRuleSet","summary":"Update a custom rule set (rules, if given, replace the full list)","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleSetUpdate"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleSet"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"System rule sets are read-only","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Rule sets"],"operationId":"deleteRuleSet","summary":"Deactivate a custom rule set (soft delete)","responses":{"200":{"description":"Deactivated","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"is_active":{"type":"boolean"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"System rule sets are read-only","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/usage":{"get":{"tags":["Account"],"operationId":"getUsage","summary":"Daily usage and remaining quota","parameters":[{"name":"days","in":"query","schema":{"type":"integer","minimum":1,"maximum":90,"default":30}}],"responses":{"200":{"description":"Usage","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usage"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me":{"get":{"tags":["Account"],"operationId":"whoAmI","summary":"Identify the org behind the key","responses":{"200":{"description":"Identity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/api-keys":{"get":{"tags":["Account"],"operationId":"listApiKeys","summary":"List API keys (prefixes only)","responses":{"200":{"description":"Keys","content":{"application/json":{"schema":{"type":"object","properties":{"api_keys":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Account"],"operationId":"createApiKey","summary":"Mint a new API key (returned once)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":100},"scope":{"$ref":"#/components/schemas/KeyScope"}}}}}},"responses":{"201":{"description":"Issued key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedApiKey"}}}},"400":{"description":"name is required, or scope is not one of full, evaluate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Active key limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/api-keys/{id}":{"delete":{"tags":["Account"],"operationId":"revokeApiKey","summary":"Revoke an API key","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Revoked","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"is_active":{"type":"boolean","const":false}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/webhook":{"get":{"tags":["Account"],"operationId":"getWebhook","summary":"Current webhook configuration","responses":{"200":{"description":"Webhook","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"tags":["Account"],"operationId":"setWebhook","summary":"Set or rotate the webhook; the signing secret is returned once","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"https URL (http allowed for localhost)"}}}}}},"responses":{"200":{"description":"Configured","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSecret"}}}},"400":{"description":"Invalid URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Account"],"operationId":"clearWebhook","summary":"Remove the webhook","responses":{"200":{"description":"Cleared"},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/signup":{"post":{"tags":["Onboarding"],"operationId":"signup","summary":"Create an account, organization and first API key in one call. With no email (an empty body is enough) it is an agent's account: a key and no login, with a domain standing in for the email (see /api/v1/org/domain)","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","description":"Send email and password together for an account a person signs in to, or neither for an agent's account","properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":12,"maxLength":128},"org_name":{"type":"string","maxLength":200}}}}}},"responses":{"201":{"description":"Account created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Email already registered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Signup throttled for this address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Signup with an email is not enabled; signup with no email still works","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/org":{"get":{"tags":["Account"],"operationId":"getOrganization","summary":"The organization's data settings","responses":{"200":{"description":"Settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgSettings"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scope does not allow this","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Account"],"operationId":"updateOrganization","summary":"Set whether input text is stored and how long evaluations are kept","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"store_inputs":{"type":"boolean","description":"False: evaluation records keep the verdict, scores and metadata, never the input text or context"},"retention_days":{"type":["integer","null"],"minimum":1,"maximum":3650,"description":"Evaluations older than this are deleted once a day. Null keeps them until you delete them"}}},"example":{"store_inputs":false,"retention_days":30}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgSettings"}}}},"400":{"description":"Invalid value","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scope does not allow this","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Account"],"operationId":"deleteOrganization","summary":"Delete the organization and all its data; cancels any subscription first","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirm"],"properties":{"confirm":{"type":"string","description":"The exact organization name"}}}}}},"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"org_id":{"type":"string"},"subscription_canceled":{"type":"boolean"}}}}}},"400":{"description":"Confirmation mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Subscription could not be canceled; nothing deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/audit-log":{"get":{"tags":["Account"],"operationId":"listAuditEvents","summary":"Security-relevant events for this org (keys, webhooks, rule sets, billing, rejected keys)","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"},"description":"Return events created before this timestamp (from next_before)"}],"responses":{"200":{"description":"Events, newest first","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/AuditEvent"}},"next_before":{"type":["string","null"]}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tower/template":{"post":{"tags":["Tower"],"operationId":"towerLoadTemplate","summary":"Load the starter workflow (email PO to order entry, mock IBM i). Idempotent (organization key)","responses":{"200":{"description":"Template already present"},"201":{"description":"Template created"},"401":{"description":"Missing or invalid organization key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}}}}},"/api/v1/tower/agents":{"get":{"tags":["Tower"],"operationId":"towerListAgents","summary":"List agents; keys are never returned (organization key)","responses":{"200":{"description":"Agents","content":{"application/json":{"schema":{"type":"object","properties":{"agents":{"type":"array","items":{"$ref":"#/components/schemas/TowerAgent"}},"active_limit":{"type":"integer"}}}}}}}},"post":{"tags":["Tower"],"operationId":"towerCreateAgent","summary":"Create an agent identity; the key is returned once (organization key)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","scopes"],"properties":{"name":{"type":"string","maxLength":100},"scopes":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"string","pattern":"^(\\*|[a-z][a-z0-9_]{0,63})$"},"description":"Operation names, or * for every operation"}}}}}},"responses":{"201":{"description":"Agent with its key","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/TowerAgent"},{"type":"object","properties":{"key":{"type":"string"},"key_shown_once":{"type":"boolean"}}}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}},"409":{"description":"Active agent limit reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}}}}},"/api/v1/tower/agents/{id}":{"delete":{"tags":["Tower"],"operationId":"towerRevokeAgent","summary":"Revoke an agent; its key stops working at once (organization key)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Revoked"},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}}}}},"/api/v1/tower/capabilities":{"get":{"tags":["Tower"],"operationId":"towerCapabilities","summary":"Operations this agent may call, with JSON Schema inputs (agent key)","responses":{"200":{"description":"Capabilities","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid agent key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}}}}},"/api/v1/tower/decide":{"post":{"tags":["Tower"],"operationId":"towerDecide","summary":"Run the policy for an operation without side effects","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["operation","input"],"properties":{"operation":{"type":"string"},"input":{"type":"object"}}}}}},"responses":{"200":{"description":"Decision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerDecision"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}},"403":{"description":"Out of scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}},"429":{"description":"Decision quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}}}}},"/api/v1/tower/actions":{"post":{"tags":["Tower"],"operationId":"towerSubmitAction","summary":"Request an action; auto-executes, queues for review, or rejects. Idempotent per agent on idempotency_key","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["operation","input","idempotency_key"],"properties":{"operation":{"type":"string"},"input":{"type":"object"},"idempotency_key":{"type":"string","maxLength":128},"dry_run":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Executed (or dry run)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerAction"}}}},"202":{"description":"Pending human review","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerAction"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}},"422":{"description":"Rejected by policy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerAction"}}}}}}},"/api/v1/tower/actions/{id}":{"get":{"tags":["Tower"],"operationId":"towerGetAction","summary":"Action status and result","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerAction"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}}}}},"/api/v1/tower/actions/{id}/compensate":{"post":{"tags":["Tower"],"operationId":"towerCompensate","summary":"Run the compensating operation for an executed action (idempotent)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Compensated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerAction"}}}},"409":{"description":"Not compensable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerError"}}}}}}},"/api/v1/tower/receipts/{id}":{"get":{"tags":["Tower"],"operationId":"towerGetReceipt","summary":"One receipt by id or sequence number","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Receipt","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TowerReceipt"}}}}}}},"/api/v1/tower/receipts/verify":{"get":{"tags":["Tower"],"operationId":"towerVerifyReceipts","summary":"Recompute hashes and check signatures over a sequence range","parameters":[{"name":"from","in":"query","schema":{"type":"integer","minimum":1}},{"name":"to","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"Verification report","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"checked":{"type":"integer"},"first_break":{"type":["object","null"]},"latest_sequence":{"type":"integer"}}}}}}}}},"/api/v1/tower/receipts/public-key":{"get":{"tags":["Tower"],"operationId":"towerPublicKey","summary":"Ed25519 public key that signs receipts","security":[],"responses":{"200":{"description":"Key","content":{"application/json":{"schema":{"type":"object","properties":{"key_id":{"type":"string"},"algorithm":{"type":"string"},"public_key_pem":{"type":"string"}}}}}}}}},"/api/v1/tower/checkout":{"post":{"tags":["Tower"],"operationId":"towerCheckout","summary":"Start the metered Tower subscription (organization key)","responses":{"201":{"description":"Checkout URL"},"409":{"description":"Already subscribed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Billing not enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tower/subscription":{"get":{"tags":["Tower"],"operationId":"towerSubscription","summary":"Tower status, quota, usage this month, pricing (organization key)","responses":{"200":{"description":"Status"}}},"delete":{"tags":["Tower"],"operationId":"towerCancel","summary":"Cancel the Tower subscription at period end","responses":{"200":{"description":"Scheduled"},"409":{"description":"No active subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas":{"get":{"tags":["Atlas"],"operationId":"atlasOverview","summary":"Overwing Atlas overview: registry counts, datasets, tiers, endpoints","security":[],"responses":{"200":{"description":"Overview","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/atlas/agents":{"get":{"tags":["Atlas"],"operationId":"atlasListAgents","summary":"Browse the agent registry (public fields; curated fields with Atlas Pro or Team)","security":[],"parameters":[{"name":"q","in":"query","schema":{"type":"string"},"description":"Free text over name, operator, user agents, description"},{"name":"purpose","in":"query","schema":{"type":"string"},"description":"Purpose class substring, e.g. training, search, browser, coding"},{"name":"operator","in":"query","schema":{"type":"string"}},{"name":"verification","in":"query","schema":{"type":"string"},"description":"e.g. 'Web Bot Auth', 'spoofable', 'Unattributable'"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":250,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Agents","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasAgentList"}}}}}}},"/api/v1/atlas/agents/{slug}":{"get":{"tags":["Atlas"],"operationId":"atlasGetAgent","summary":"One registry entry (with operator OSINT for Pro or Team)","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Agent","content":{"application/json":{"schema":{"type":"object","properties":{"fields":{"type":"string","enum":["public","full"]},"agent":{"$ref":"#/components/schemas/AtlasAgent"},"osint":{"type":"array","items":{"type":"object"}}}}}}},"404":{"description":"No agent with that slug","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/org/domain":{"post":{"tags":["Onboarding"],"operationId":"startDomainProof","summary":"Begin proving that this organization controls a domain. For an agent's account the domain stands in for an email: it lifts the limits, opens full Beacon reports, and recovers the account if the key is lost","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"}}},"example":{"domain":"example.com"}}}},"responses":{"200":{"description":"The value to publish at the domain","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainProof"}}}},"400":{"description":"domain is not a public hostname","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The domain is already verified by another account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/org/domain/verify":{"post":{"tags":["Onboarding"],"operationId":"verifyDomainProof","summary":"Look for the proof at the domain (TXT record at _overwing-atlas.<domain>, or /.well-known/overwing-atlas.txt). Safe to call again","responses":{"200":{"description":"Verified","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainProof"}}}},"409":{"description":"No proof is in progress, or another account verified the domain first","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No proof found at the domain yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/org/claim":{"post":{"tags":["Onboarding"],"operationId":"claimAccount","summary":"A person takes charge of an agent's account: attaches an email and password, which gives it a dashboard login. Keys and history are unchanged","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":12,"maxLength":128}}}}}},"responses":{"201":{"description":"Claimed; a confirmation email was sent"},"409":{"description":"The account already has a login, or the email is already registered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Not enabled on this deployment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/signup/recover":{"post":{"tags":["Onboarding"],"operationId":"startRecovery","summary":"Begin recovering an agent's account whose key is lost, by the domain it proved. No key. The answer is the same whether or not an account holds the domain","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"}}}}}},"responses":{"200":{"description":"The value to publish at the domain; it counts for 24 hours","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainProof"}}}},"400":{"description":"domain is not a public hostname","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many attempts from this address today","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/signup/recover/verify":{"post":{"tags":["Onboarding"],"operationId":"finishRecovery","summary":"Finish a recovery: with the proof at the domain, every key on the account is revoked and one new key is returned, once","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string"}}}}}},"responses":{"200":{"description":"A new key","content":{"application/json":{"schema":{"type":"object","properties":{"org_id":{"type":"string"},"domain":{"type":"string"},"api_key":{"type":"string"},"key_prefix":{"type":"string"},"revoked_keys":{"type":"integer"}}}}}},"422":{"description":"No recovery in progress for this domain, or the proof was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many attempts from this address today","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas/registrations":{"post":{"tags":["Atlas"],"operationId":"atlasRegisterAgent","summary":"Register your own agent in the registry. Free. Returns a value to publish at the operator's domain to prove control of it","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","operator","domain","tokens"],"properties":{"name":{"type":"string","maxLength":80},"operator":{"type":"string","maxLength":120,"description":"The company or person that runs the agent"},"domain":{"type":"string","description":"The operator's domain, which you will prove control of"},"tokens":{"type":"array","minItems":1,"maxItems":3,"items":{"type":"string","minLength":5,"maxLength":60},"description":"The product name your User-Agent carries, such as AcmeBot. May not contain, or sit inside, a token already in the registry"},"purpose":{"type":"string","enum":["training_crawl","search_index","user_fetch","browser_agent","coding_agent","api_agent","other"],"default":"other"},"user_agent":{"type":"string","maxLength":500},"description":{"type":"string","maxLength":600},"policy_url":{"type":"string","format":"uri"},"key_directory_url":{"type":"string","format":"uri","description":"A Web Bot Auth key directory on the operator's domain. With one that answers, the entry is listed as signed"},"follows_robots_txt":{"type":["boolean","null"]}}},"example":{"name":"AcmeBot","operator":"Acme, Inc.","domain":"acme.com","tokens":["AcmeBot"],"purpose":"user_fetch"}}}},"responses":{"201":{"description":"Started; publish the verification value, then call verify","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pending_verification","pending_review","published","rejected","withdrawn"]},"name":{"type":"string"},"operator":{"type":"string"},"domain":{"type":"string"},"tokens":{"type":"array","items":{"type":"string"}},"purpose":{"type":"string"},"note":{"type":["string","null"]},"verification":{"type":"object","description":"Present while unverified: the value to publish, as a DNS TXT record or as a file","properties":{"value":{"type":"string"},"dns":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"}}},"http":{"type":"object","properties":{"url":{"type":"string"},"body":{"type":"string"}}}}},"agent":{"type":"string","description":"Present once published: the registry entry"}}}}}},"400":{"description":"A field is missing or not valid; `field` names it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scope does not allow this","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The name or a token collides with an entry already in the registry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This organization already has 10 registrations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["Atlas"],"operationId":"atlasListRegistrations","summary":"This organization's registrations, newest first","responses":{"200":{"description":"Registrations","content":{"application/json":{"schema":{"type":"object","properties":{"registrations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pending_verification","pending_review","published","rejected","withdrawn"]},"name":{"type":"string"},"operator":{"type":"string"},"domain":{"type":"string"},"tokens":{"type":"array","items":{"type":"string"}},"purpose":{"type":"string"},"note":{"type":["string","null"]},"verification":{"type":"object","description":"Present while unverified: the value to publish, as a DNS TXT record or as a file","properties":{"value":{"type":"string"},"dns":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"}}},"http":{"type":"object","properties":{"url":{"type":"string"},"body":{"type":"string"}}}}},"agent":{"type":"string","description":"Present once published: the registry entry"}}}}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas/registrations/{id}":{"get":{"tags":["Atlas"],"operationId":"atlasGetRegistration","summary":"Where one registration stands, with the verification values while it is unverified","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^areg_[A-Za-z0-9_-]{16}$"}}],"responses":{"200":{"description":"Registration","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pending_verification","pending_review","published","rejected","withdrawn"]},"name":{"type":"string"},"operator":{"type":"string"},"domain":{"type":"string"},"tokens":{"type":"array","items":{"type":"string"}},"purpose":{"type":"string"},"note":{"type":["string","null"]},"verification":{"type":"object","description":"Present while unverified: the value to publish, as a DNS TXT record or as a file","properties":{"value":{"type":"string"},"dns":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"}}},"http":{"type":"object","properties":{"url":{"type":"string"},"body":{"type":"string"}}}}},"agent":{"type":"string","description":"Present once published: the registry entry"}}}}}},"404":{"description":"No such registration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Atlas"],"operationId":"atlasWithdrawRegistration","summary":"Withdraw a registration. A published entry leaves the registry","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^areg_[A-Za-z0-9_-]{16}$"}}],"responses":{"200":{"description":"Withdrawn"},"404":{"description":"No such registration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas/registrations/{id}/verify":{"post":{"tags":["Atlas"],"operationId":"atlasVerifyRegistration","summary":"Look for the proof at the domain (TXT record at _overwing-atlas.<domain>, or /.well-known/overwing-atlas.txt). Found: the entry is published, or held for review when the operator name is already someone's. Safe to call again","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^areg_[A-Za-z0-9_-]{16}$"}}],"responses":{"200":{"description":"Published, or held for review","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pending_verification","pending_review","published","rejected","withdrawn"]},"name":{"type":"string"},"operator":{"type":"string"},"domain":{"type":"string"},"tokens":{"type":"array","items":{"type":"string"}},"purpose":{"type":"string"},"note":{"type":["string","null"]},"verification":{"type":"object","description":"Present while unverified: the value to publish, as a DNS TXT record or as a file","properties":{"value":{"type":"string"},"dns":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"}}},"http":{"type":"object","properties":{"url":{"type":"string"},"body":{"type":"string"}}}}},"agent":{"type":"string","description":"Present once published: the registry entry"}}}}}},"404":{"description":"No such registration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The name or a token now collides with another entry, or the registration was withdrawn or rejected","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"No proof found at the domain yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas/lookup":{"get":{"tags":["Atlas"],"operationId":"atlasLookup","summary":"Identify a User-Agent string: what it claims to be and whether the claim can be trusted. Works with no key (10 a day per client); a key raises the limit","security":[{},{"bearerAuth":[]}],"parameters":[{"name":"user_agent","in":"query","required":true,"schema":{"type":"string","maxLength":2000}}],"responses":{"200":{"description":"Lookup result","headers":{"X-Atlas-Lookup-Limit":{"schema":{"type":"integer"}},"X-Atlas-Lookup-Remaining":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasLookup"}}}},"400":{"description":"user_agent missing or too long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily lookup limit reached for your Atlas tier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas/summary":{"get":{"tags":["Atlas"],"operationId":"atlasSummary","summary":"Registry counts, browser-agent traffic shares, and the report summary","security":[],"responses":{"200":{"description":"Summary","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/atlas/sightings":{"get":{"tags":["Atlas"],"operationId":"atlasSightings","summary":"Which registered agents visited overwing.ai, by day: requests, what they asked for, identity checks, answers (7 days keyless, 90 with a key)","security":[{},{"bearerAuth":[]}],"parameters":[{"name":"days","in":"query","schema":{"type":"integer","minimum":1}},{"name":"agent","in":"query","schema":{"type":"string"},"description":"One registry agent name"},{"name":"format","in":"query","schema":{"type":"string","enum":["json","csv"]}}],"responses":{"200":{"description":"Daily sightings of registered agents, aggregated, with per-day totals for everything else"}}}},"/api/v1/atlas/traffic":{"get":{"tags":["Atlas"],"operationId":"atlasTrafficReport","summary":"State of agent traffic: shares by kind of client, busiest registered agents, what they ask for, identity checks, readiness panel; the whole observed period, updated nightly","security":[],"responses":{"200":{"description":"The report as JSON, with the findings as sentences","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No sightings recorded yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas/datasets":{"get":{"tags":["Atlas"],"operationId":"atlasListDatasets","summary":"Datasets with formats, row counts, license, and availability for your tier","security":[],"responses":{"200":{"description":"Datasets","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/atlas/datasets/{id}":{"get":{"tags":["Atlas"],"operationId":"atlasDownloadDataset","summary":"Download a dataset (Atlas Pro or Team)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","enum":["agents","traffic-shares","osint","sector-scans","agent-consumer-matrix","fiat-vs-crypto","agent-consumers-2026-09"]}},{"name":"format","in":"query","schema":{"type":"string","enum":["json","csv","md"]}}],"responses":{"200":{"description":"File","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}},"402":{"description":"Needs Atlas Pro or Team","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No dataset with that id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas/report":{"get":{"tags":["Atlas"],"operationId":"atlasReport","summary":"The research report as Markdown (?section=summary is free)","security":[],"parameters":[{"name":"section","in":"query","schema":{"type":"string","enum":["summary"]}}],"responses":{"200":{"description":"Markdown","content":{"text/markdown":{"schema":{"type":"string"}}}},"402":{"description":"Needs Atlas Pro or Team, or $9 over x402 at /api/x402/atlas/report","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas/subscription":{"get":{"tags":["Atlas"],"operationId":"atlasSubscription","summary":"Your Atlas tier, limits, and lookups used today","responses":{"200":{"description":"Status","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Atlas"],"operationId":"atlasCancel","summary":"Cancel the Atlas subscription at period end","responses":{"200":{"description":"Scheduled"},"409":{"description":"No active Atlas subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Billing not enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/atlas/checkout":{"post":{"tags":["Atlas"],"operationId":"atlasCheckout","summary":"Start an Atlas subscription (hosted Checkout URL) or switch plans in place","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["plan"],"properties":{"plan":{"type":"string","enum":["pro","team"]},"success_url":{"type":"string","format":"uri"},"cancel_url":{"type":"string","format":"uri"}}}}}},"responses":{"200":{"description":"Plan switched in place"},"201":{"description":"Checkout session","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"plan":{"type":"string"}}}}}},"400":{"description":"Invalid plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Already on that plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Billing not enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/feedback":{"get":{"tags":["Evaluate"],"operationId":"describeFeedback","summary":"How to send feedback: what the route takes and its limits","security":[],"responses":{"200":{"description":"Description","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"tags":["Evaluate"],"operationId":"sendFeedback","summary":"Tell Overwing what went wrong: a wrong verdict, an error you could not act on, a 402 you could not pay. No key needed; read by a person","security":[{},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","maxLength":2000,"description":"What happened and what you expected"},"about":{"type":"string","maxLength":300,"description":"A path, a tool name or a product"},"evaluation_id":{"type":"string","maxLength":64},"request_id":{"type":"string","maxLength":64},"contact":{"type":"string","maxLength":200,"description":"Where an answer can reach you: an email, a URL, an agent name"}}}}}},"responses":{"201":{"description":"Recorded","content":{"application/json":{"schema":{"type":"object","properties":{"received":{"type":"boolean"},"id":{"type":"string"}}}}}},"400":{"description":"message missing or too long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily allowance for this address used","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/languages":{"get":{"tags":["Evaluate"],"operationId":"listLanguages","summary":"Input languages the prebuilt rule sets were tested in, with the date and size of the test","security":[],"responses":{"200":{"description":"Languages","content":{"application/json":{"schema":{"type":"object","properties":{"input_languages":{"type":"string"},"response_language":{"type":"string"},"tested":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"native_name":{"type":"string"},"checks":{"type":"integer"},"matched_expected":{"type":"integer"}}}},"test":{"type":"object"}}}}}}}}},"/api/v1/plans":{"get":{"tags":["Billing"],"operationId":"listPlans","summary":"Public plan catalog with limits and prices","security":[],"responses":{"200":{"description":"Plans","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanCatalog"}}}}}}},"/api/v1/billing":{"get":{"tags":["Billing"],"operationId":"getBilling","summary":"Current plan, limit and subscription status","responses":{"200":{"description":"Billing status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingStatus"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Billing"],"operationId":"cancelSubscription","summary":"Cancel at the end of the current period","responses":{"200":{"description":"Scheduled","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"string"},"cancels_at":{"type":["string","null"]},"subscription_status":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"No active subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Billing not enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/billing/checkout":{"post":{"tags":["Billing"],"operationId":"createCheckout","summary":"Hosted Stripe Checkout URL for a person to complete","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["plan"],"properties":{"plan":{"type":"string","enum":["starter","growth","scale"]},"success_url":{"type":"string","format":"uri"},"cancel_url":{"type":"string","format":"uri"}}}}}},"responses":{"201":{"description":"Checkout session","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"plan":{"type":"string"},"expires_in_seconds":{"type":"integer"}}}}}},"400":{"description":"Invalid plan or URLs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Already subscribed; use subscribe or portal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Billing not enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/billing/subscribe":{"post":{"tags":["Billing"],"operationId":"subscribe","summary":"Subscribe or switch plans with no browser","description":"New subscriptions need a Stripe payment method id (pm_...), created with Stripe.js, a Stripe test token, or an agent payment provider. Switching an existing subscription needs only the plan and is prorated. Returns 202 with payment_url when the bank requires an extra confirmation step.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["plan"],"properties":{"plan":{"type":"string","enum":["starter","growth","scale"]},"payment_method":{"type":"string","pattern":"^pm_[A-Za-z0-9]+$"}}}}}},"responses":{"201":{"description":"Active","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeResponse"}}}},"202":{"description":"Requires action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment method rejected","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Already on that plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Billing not enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/billing/credits/checkout":{"post":{"tags":["Billing"],"operationId":"createCreditCheckout","summary":"One-time Checkout for a prepaid credit pack (card or stablecoin)","description":"Credits are spent after the day's plan allowance is used and never expire. Packs: small (10,000 for $19), medium (100,000 for $149), large (1,000,000 for $999). Evaluate responses carry X-Credits-Remaining and X-Quota-Source: credits when credits are used.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["pack"],"properties":{"pack":{"type":"string","enum":["small","medium","large"]},"success_url":{"type":"string","format":"uri"},"cancel_url":{"type":"string","format":"uri"}}}}}},"responses":{"201":{"description":"Checkout session","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"pack":{"type":"string"},"credits":{"type":"integer"},"price_usd":{"type":"number"},"expires_in_seconds":{"type":"integer"}}}}}},"400":{"description":"Invalid pack or URLs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Billing not enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/x402/evaluate":{"post":{"tags":["Evaluate"],"operationId":"x402Evaluate","summary":"Evaluate and pay per call in USDC (x402), no account needed","security":[],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{}}]},"description":"Same body and response as POST /api/v1/evaluate. Without an X-PAYMENT header the response is 402 with x402 payment requirements. Sign them with an x402 client and resend; settlement happens only after a successful evaluation. The response adds a `paid` object.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluateRequest"}}}},"responses":{"200":{"description":"Verdict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Evaluation"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required (x402 requirements in the body)"},"429":{"description":"Capacity exhausted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Evaluation engine error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/x402/execute":{"post":{"tags":["Evaluate"],"operationId":"x402Execute","summary":"The same paid evaluation, called as {service, params} (MoltsPay form)","security":[],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{}}]},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"service":{"type":"string","enum":["evaluate"]},"params":{"$ref":"#/components/schemas/EvaluateRequest"}}}}}},"responses":{"200":{"description":"Verdict, also under `result`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Evaluation"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required"}}}},"/api/v1/atlas/lookup/sample":{"get":{"tags":["Atlas"],"operationId":"atlasLookupSample","summary":"A free preview of the lookup: the live answer for one fixed User-Agent. Unmetered","security":[],"responses":{"200":{"description":"Lookup result for the sample input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasLookup"}}}}}}},"/api/x402/atlas/lookup":{"get":{"tags":["Atlas"],"operationId":"x402AtlasLookup","summary":"Identify a User-Agent and pay per lookup in USDC (x402), no account needed","security":[],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.001000"},"protocols":[{"x402":{}}]},"parameters":[{"name":"user_agent","in":"query","required":true,"schema":{"type":"string","maxLength":2000}}],"responses":{"200":{"description":"Lookup result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtlasLookup"}}}},"400":{"description":"user_agent missing or too long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required"}}}},"/api/v1/beacon":{"get":{"tags":["Beacon"],"operationId":"beaconOverview","summary":"What Beacon checks, what it costs, and how to call it","security":[],"responses":{"200":{"description":"Overview","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/beacon/sample":{"get":{"tags":["Beacon"],"operationId":"beaconSample","summary":"A real report, free: the check of overwing.ai itself, refreshed daily","security":[],"responses":{"200":{"description":"Report","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeaconReport"}}}},"503":{"description":"The sample has not been generated yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/beacon/checks":{"post":{"tags":["Beacon"],"operationId":"beaconStart","summary":"Start a check. Free. With a key the status address answers with the full report and the check is saved to that organization's dashboard; with no key it answers with the summary","security":[{},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","maxLength":500,"description":"The site to check: a domain or an https URL. Public sites on the default port only"}}},"example":{"url":"example.com"}}}},"responses":{"201":{"description":"Started; the check runs when status_url is first asked for","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"status":{"type":"string","const":"queued"},"price_usd":{"type":"number","const":0},"access":{"type":"string","enum":["full","summary"],"description":"What status_url will answer with for this caller"},"status_url":{"type":"string"},"report_url":{"type":"string"},"saved_to_dashboard":{"type":"boolean"},"next":{"type":"string"},"full_report":{"type":"object","description":"Present with no key: how to open the full report"}}}}}},"400":{"description":"url is missing or not a public https address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"A key was sent and is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The site did not answer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"The daily limit of free checks is spent: 5 per address with no key, 30 per organization with one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/beacon/checks/{id}":{"get":{"tags":["Beacon"],"operationId":"beaconReport","summary":"The report for a check, as JSON or markdown, inline or as a file. The first request runs the check. With a key, the full report; with no key, the summary of a free check (\"access\" says which). A check paid over x402 is open in full to whoever holds its id","security":[{},{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^bcn_[A-Za-z0-9_-]{16}$"}},{"name":"format","in":"query","schema":{"type":"string","enum":["json","md"],"default":"json"},"description":"md returns the report as a markdown document. Accept: text/markdown does the same"},{"name":"download","in":"query","schema":{"type":"string","enum":["1"]},"description":"Send the report as a file (Content-Disposition: attachment)"}],"responses":{"200":{"description":"The full report (access: full), or with no key the summary of a free check (access: summary): the same fields without checks, with the first of top_fixes, plus counts and full_report","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeaconReport"}}}},"202":{"description":"Running; ask again in a few seconds (Retry-After)"},"401":{"description":"A key was sent and is not valid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such check","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/beacon/saved":{"get":{"tags":["Beacon"],"operationId":"beaconListSaved","summary":"Reports this organization has saved to its dashboard, newest first","responses":{"200":{"description":"Saved reports","content":{"application/json":{"schema":{"type":"object","properties":{"saved":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"status":{"type":"string"},"score":{"type":["integer","null"]},"verdict":{"type":["string","null"]},"checked_at":{"type":["string","null"]},"saved_at":{"type":"string"},"report":{"type":"string"},"page":{"type":"string"}}}}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key's scope does not allow this","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/beacon/saved/{id}":{"put":{"tags":["Beacon"],"operationId":"beaconSave","summary":"Save a report to this organization's dashboard. Holding the report's id is what allows it","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Saved"},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such check","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Beacon"],"operationId":"beaconUnsave","summary":"Remove a report from the dashboard. The report stays readable at its address","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Removed"},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not saved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/preflight":{"get":{"tags":["Preflight"],"operationId":"preflightOverview","summary":"What Preflight checks, the policy fields, the reason codes, the guarantee and how to call it","security":[],"responses":{"200":{"description":"Overview","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/preflight/x402":{"get":{"tags":["Preflight"],"operationId":"describePreflightX402","summary":"How to check an x402 payment before signing it","security":[],"responses":{"200":{"description":"Description","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"tags":["Preflight"],"operationId":"preflightX402","summary":"Should the agent sign this x402 payment? Terms against policy, payee against the directory and the server's manifest, price against the record (10 a day keyless)","security":[{},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["payment_required"],"properties":{"payment_required":{"description":"The PAYMENT-REQUIRED header value (base64) or its decoded JSON","oneOf":[{"type":"string"},{"type":"object"}]},"requested_url":{"type":"string","format":"uri"},"network":{"type":"string","description":"CAIP-2 network to pay on"},"policy":{"type":"object","properties":{"max_per_call_usd":{"type":"number"},"new_payee_max_usd":{"type":"number"},"allowed_networks":{"type":"array","items":{"type":"string"}},"allowed_payees":{"type":"array","items":{"type":"string"}},"blocked_payees":{"type":"array","items":{"type":"string"}},"allow_testnets":{"type":"boolean"},"max_price_drift":{"type":"number"}}},"fresh_quote":{"type":"boolean","description":"Also fetch the resource unpaid and compare its quote"}}}}}},"responses":{"200":{"description":"Verdict","content":{"application/json":{"schema":{"type":"object","properties":{"decision":{"type":"string","enum":["allow","review","refuse"]},"reasons":{"type":"array"},"terms":{"type":"object"},"payee":{"type":"object"},"price":{"type":"object"}}}}}},"400":{"description":"payment_required missing or unreadable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily allowance for this address used","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/preflight/checks":{"post":{"tags":["Preflight"],"operationId":"preflightCheck","summary":"Check one unsigned Solana transaction against a policy before an agent signs it. Counts as one evaluation; a check that cannot be made is not counted","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightRequest"},"example":{"transaction":"<base64 serialized transaction>","policy":{"wallet":"<the wallet that signs>","max_sol_out":0.05,"allowed_programs":["11111111111111111111111111111111"]}}}}},"responses":{"200":{"description":"The verdict: allow or refuse, with every reason","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightVerdict"}}}},"400":{"description":"transaction or policy is missing or malformed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Daily allowance reached and no prepaid credits left","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The Solana node could not be reached; no verdict was given","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Preflight is not enabled on this deployment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/preflight/checks/{id}":{"get":{"tags":["Preflight"],"operationId":"preflightVerdict","summary":"The public record of one verdict and of every transaction reported against it. Never the wallet, the amounts or the transaction","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The verdict as published","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"No such verdict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/preflight/checks/{id}/reports":{"post":{"tags":["Preflight"],"operationId":"preflightReport","summary":"Report the transaction that landed after a verdict. The answer (miss or not_a_miss) is read from the chain and published. No key","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signature"],"properties":{"signature":{"type":"string","description":"The landed transaction's signature in base58"}}}}}},"responses":{"200":{"description":"The outcome","content":{"application/json":{"schema":{"type":"object","properties":{"outcome":{"type":"string","enum":["miss","not_a_miss"]},"why":{"type":["string","null"]},"covered":{"type":"boolean"}}}}}},"400":{"description":"signature is not a transaction signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such verdict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many reports from this address today","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The Solana node could not be reached; nothing was recorded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/preflight/record":{"get":{"tags":["Preflight"],"operationId":"preflightRecord","summary":"The public record: counts, every miss, the latest verdicts, and what the guarantee's reserve holds","security":[],"responses":{"200":{"description":"The record","content":{"application/json":{"schema":{"type":"object"}}}},"503":{"description":"The record is not available right now","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/x402/preflight":{"post":{"tags":["Preflight"],"operationId":"x402Preflight","summary":"Check one unsigned Solana transaction and pay $0.01 in USDC (x402), no account","security":[],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.010000"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightRequest"}}}},"responses":{"200":{"description":"The verdict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightVerdict"}}}},"400":{"description":"transaction or policy is missing or malformed; not charged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required"},"502":{"description":"The Solana node could not be reached; not charged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/x402/preflight/x402":{"post":{"tags":["Preflight"],"operationId":"x402PreflightX402","summary":"Should the agent sign this x402 payment? The same check as POST /api/v1/preflight/x402, paid $0.002 in USDC (x402), no account and no daily limit","security":[],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.002000"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["payment_required"],"properties":{"payment_required":{"description":"The PAYMENT-REQUIRED header value (base64 JSON) or the decoded x402 v2 object"},"requested_url":{"type":"string"},"network":{"type":"string"},"policy":{"type":"object"},"fresh_quote":{"type":"boolean"}}}}}},"responses":{"200":{"description":"The verdict: decision, reasons, terms, payee, price","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"payment_required is missing or not x402 terms; not charged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required"}}}},"/api/x402/beacon":{"get":{"tags":["Beacon"],"operationId":"x402Beacon","summary":"Check whether a site is reachable by agents and pay $1 in USDC (x402), no account","security":[],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"1.000000"},"protocols":[{"x402":{}}]},"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","maxLength":500},"description":"The site to check: a domain or an https URL"}],"responses":{"200":{"description":"Report","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeaconReport"}}}},"400":{"description":"url is missing or not a public https address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Payment required"},"422":{"description":"The site did not answer; not charged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/x402/atlas/report":{"get":{"tags":["Atlas"],"operationId":"x402AtlasReport","summary":"The full Agent Consumers report as Markdown, paid once in USDC (x402)","security":[],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"9.000000"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Markdown","content":{"text/markdown":{"schema":{"type":"string"}}}},"402":{"description":"Payment required"}}}},"/api/v1/billing/portal":{"post":{"tags":["Billing"],"operationId":"createPortal","summary":"Stripe customer portal URL (invoices, cards, cancel)","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"return_url":{"type":"string","format":"uri"}}}}}},"responses":{"201":{"description":"Portal session","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"No billing account yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Billing not enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/health":{"get":{"tags":["Meta"],"operationId":"health","summary":"Liveness","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"service":{"type":"string"},"version":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}}}}}}}},"/api/v1/openapi.json":{"get":{"tags":["Meta"],"operationId":"openapi","summary":"This document","security":[],"responses":{"200":{"description":"OpenAPI 3.1 document"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"ow_live_<32 hex>","description":"API key from the dashboard, from POST /api/v1/api-keys, or from POST /api/v1/signup (one call, no browser). A key has a scope: full (every endpoint) or evaluate (POST evaluate and evaluate/batch, GET rule-sets, me, usage and the Atlas reads; everything else answers 403). Give agents an evaluate key."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable message"}}},"Verdict":{"type":"string","enum":["pass","fail","review"],"description":"fail: a rule's fail condition matched. review: a rule's confidence was below its review threshold and nothing failed. pass: otherwise."},"QuestionType":{"type":"string","enum":["choice","score","noul"]},"PreflightRequest":{"type":"object","required":["transaction","policy"],"properties":{"transaction":{"type":"string","maxLength":2000,"description":"The serialized Solana transaction in base64, legacy or v0, signed or not. Signatures are ignored"},"policy":{"type":"object","required":["wallet"],"additionalProperties":false,"properties":{"wallet":{"type":"string","description":"The address to protect. It must sign the transaction"},"max_sol_out":{"type":"number","minimum":0,"description":"Required unless max_sol_out_lamports is given. The most SOL the transaction may take from the wallet, fees included"},"max_sol_out_lamports":{"type":["integer","string"],"description":"The same limit as a whole number of lamports"},"max_token_out":{"type":"object","additionalProperties":{"type":["integer","string"]},"description":"Atomic units that may leave, by mint. A mint not listed may not leave at all"},"min_token_in":{"type":"object","additionalProperties":{"type":["integer","string"]},"description":"Atomic units that must arrive, by mint"},"allowed_programs":{"type":"array","items":{"type":"string"},"description":"When given, every program the transaction runs, top-level or inner, must be listed"},"allow_delegation":{"type":"boolean","default":false,"description":"Whether a spending approval on the wallet's token accounts is acceptable"}}}}},"PreflightVerdict":{"type":"object","properties":{"id":{"type":"string"},"decision":{"type":"string","enum":["allow","refuse"],"description":"The one field to branch on. Sign only on allow"},"reasons":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"detail":{"type":"string"}}},"description":"Every reason to refuse. Empty on an allow. Codes are listed at GET /api/v1/preflight"},"effects":{"type":["object","null"],"description":"What the simulation says would happen to the wallet: sol_out_lamports, token_out, token_in (atomic units as strings, by mint) and control changes. Null when it could not be simulated"},"programs":{"type":"array","items":{"type":"string"},"description":"Every program the transaction would run"},"digest":{"type":"string","description":"sha256 of the message with its blockhash zeroed"},"slot":{"type":["integer","null"]},"covered":{"type":"boolean","description":"Whether the guarantee applies: an allow made only of programs Overwing names"},"decided_at":{"type":"string","format":"date-time"},"valid_for_seconds":{"type":"integer","description":"A verdict covers a transaction that lands within this many seconds"},"receipt":{"type":"object","description":"The published payload, its hash, and an Ed25519 signature over the hash"},"record_url":{"type":"string"}}},"BeaconReport":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"host":{"type":"string"},"scanned_at":{"type":"string","format":"date-time"},"score":{"type":"integer","minimum":0,"maximum":100},"verdict":{"type":"string","enum":["yes","partly","no"],"description":"Is the product reachable by agents"},"summary":{"type":"string"},"categories":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["find","read","use"]},"title":{"type":"string"},"question":{"type":"string"},"answer":{"type":"string","enum":["yes","partly","no"]},"points":{"type":"integer"},"max":{"type":"integer"}}}},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"category":{"type":"string","enum":["find","read","use"]},"title":{"type":"string"},"status":{"type":"string","enum":["pass","warn","fail"]},"points":{"type":"integer"},"max":{"type":"integer"},"detail":{"type":"string","description":"What was found"},"fix":{"type":"string","description":"What to change. Absent when the check passed"},"evidence":{"type":"string","description":"The address that was read"}}}},"top_fixes":{"type":"array","items":{"type":"object","properties":{"check":{"type":"string"},"fix":{"type":"string"},"gain":{"type":"integer","description":"Points the fix is worth"}}}},"judged":{"type":"boolean","description":"False when the model judgments could not be made; their checks are then left out"},"duration_ms":{"type":"integer"},"requests":{"type":"integer"}}},"KeyScope":{"type":"string","enum":["full","evaluate"],"default":"full","description":"full: every endpoint. evaluate: run checks and read rule sets, usage and Atlas data; cannot read stored evaluations, change rule sets, manage keys, webhooks, billing or Tower, or delete anything"},"OrgSettings":{"type":"object","properties":{"org_id":{"type":"string"},"name":{"type":"string"},"plan":{"type":"string"},"store_inputs":{"type":"boolean"},"retention_days":{"type":["integer","null"]}}},"EvaluateRequest":{"type":"object","required":["input","rule_set"],"properties":{"input":{"type":"string","maxLength":100000,"description":"The LLM output (or any text) to evaluate. The input can be in any language the model reads. Tested on 2026-09-29 in Spanish, Portuguese, French, German, Japanese, Chinese (Simplified), Korean, Arabic and Hindi: 7 checks in each, and every verdict matched the English one. A small test, not a benchmark: the texts were written by a model and have not been reviewed by native speakers. Responses are in English whatever the input language."},"rule_set":{"type":"string","description":"Rule set slug. Prebuilt: content-safety (toxicity, PII, self-harm, sexual content, severity) and outbound-message (adds unauthorized_pii and confidential_leak, and reads the context object)"},"metadata":{"type":"object","additionalProperties":true,"description":"Opaque context echoed back and stored with the evaluation"},"context":{"type":"object","additionalProperties":true,"description":"Structured facts about the situation, passed to the model as state next to the text so rules can reference them: e.g. { recipient: \"known customer\", channel: \"email\", owns_contact_info: true }. Max 8 KB."},"store":{"type":"boolean","description":"False runs the check without keeping the input text or the context: the record holds the verdict, scores and metadata only. It cannot turn storage back on when the organization has store_inputs off (PATCH /api/v1/org). The response header X-Input-Stored says which happened."}}},"RuleResult":{"type":"object","required":["rule","type","answer","probability","confidence","verdict","action"],"properties":{"rule":{"type":"string"},"action":{"type":"string","enum":["block","redact","review"],"description":"The rule's declared action: what to do when this rule fails"},"type":{"$ref":"#/components/schemas/QuestionType"},"answer":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}],"description":"choice: selected option; score: position on the level scale (may be fractional); noul: boolean"},"probability":{"type":"number","minimum":0,"maximum":1},"confidence":{"type":"number","minimum":0,"maximum":1},"verdict":{"$ref":"#/components/schemas/Verdict"}}},"Evaluation":{"type":"object","required":["id","verdict","recommended_action","aggregate_score","confidence","latency_ms","results"],"properties":{"id":{"type":"string","example":"eval_aBcDeFgHiJkLmNoP"},"verdict":{"$ref":"#/components/schemas/Verdict"},"recommended_action":{"type":"string","enum":["block","redact","review","allow"],"description":"One word to act on, derived from the failed rules' actions: block if any failed rule says block, else redact, else review (a review verdict or a review-action fail), else allow."},"aggregate_score":{"type":"number","minimum":0,"maximum":1,"description":"Weighted score: pass=1, review=0.5, fail=0 per rule, weighted by rule weight. A ranking signal for sorting or thresholds, not a decision: use verdict and recommended_action to act."},"confidence":{"type":"number","description":"Minimum confidence across rules"},"latency_ms":{"type":"integer"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RuleResult"}}}},"BatchRequest":{"type":"object","required":["rule_set","items"],"properties":{"rule_set":{"type":"string"},"context":{"type":"object","additionalProperties":true,"description":"Default context for every item; an item's own context overrides it"},"store":{"type":"boolean","description":"Applies to every item. False keeps no input text or context"},"items":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["input"],"properties":{"id":{"type":"string","maxLength":128,"description":"Your own identifier, echoed back; must be unique within the batch"},"input":{"type":"string","maxLength":100000},"metadata":{"type":"object","additionalProperties":true},"context":{"type":"object","additionalProperties":true}}}}}},"BatchResponse":{"type":"object","properties":{"summary":{"type":"object","properties":{"total":{"type":"integer"},"pass":{"type":"integer"},"fail":{"type":"integer"},"review":{"type":"integer"},"errors":{"type":"integer"}}},"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":["string","null"]},"index":{"type":"integer"},"evaluation":{"oneOf":[{"$ref":"#/components/schemas/Evaluation"},{"type":"null"}]},"error":{"type":["string","null"]}}}}}},"EvaluationSummary":{"type":"object","properties":{"id":{"type":"string"},"verdict":{"$ref":"#/components/schemas/Verdict"},"aggregate_score":{"type":["number","null"]},"confidence":{"type":["number","null"]},"latency_ms":{"type":["integer","null"]},"rule_set":{"type":"string"},"metadata":{"type":["object","null"]},"created_at":{"type":"string","format":"date-time"}}},"EvaluationDetail":{"allOf":[{"$ref":"#/components/schemas/EvaluationSummary"},{"type":"object","properties":{"input":{"type":"string"},"context":{"type":["object","null"]},"input_token_count":{"type":["integer","null"]},"results":{"type":"array","items":{"$ref":"#/components/schemas/RuleResult"}}}}]},"Rule":{"type":"object","required":["name","question_type","question_config","fail_condition"],"properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","maxLength":100},"description":{"type":["string","null"]},"question_type":{"$ref":"#/components/schemas/QuestionType"},"question_config":{"oneOf":[{"type":"object","title":"choice","required":["options","instructions"],"properties":{"options":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":255},"instructions":{"type":"string"}}},{"type":"object","title":"score","required":["levels","instructions"],"properties":{"levels":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":10,"description":"Ordered from lowest to highest"},"instructions":{"type":"string"}}},{"type":"object","title":"noul","required":["question"],"properties":{"question":{"type":"string","description":"A yes/no question"}}}]},"fail_condition":{"oneOf":[{"type":"object","title":"choice","required":["failOn"],"properties":{"failOn":{"type":"array","items":{"type":"string"},"description":"Options that fail"}}},{"type":"object","title":"noul","required":["failOn"],"properties":{"failOn":{"type":"boolean"}}},{"type":"object","title":"score","required":["failAbove"],"properties":{"failAbove":{"type":"number","description":"Fail when the score is at or above this level index"}}}]},"review_condition":{"type":["object","null"],"properties":{"confidenceBelow":{"type":"number","exclusiveMinimum":0,"maximum":1}}},"action":{"type":"string","enum":["block","redact","review"],"default":"block","description":"What a caller should do when this rule fails. Echoed on every result and folded into recommended_action."},"weight":{"type":"number","exclusiveMinimum":0,"maximum":100,"default":1},"sort_order":{"type":"integer","readOnly":true},"is_active":{"type":"boolean","readOnly":true}}},"RuleSet":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"is_system_prebuilt":{"type":"boolean"},"is_active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"rules":{"type":"array","items":{"$ref":"#/components/schemas/Rule"}}}},"RuleSetCreate":{"type":"object","required":["name","slug","rules"],"properties":{"name":{"type":"string","maxLength":100},"slug":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","maxLength":100},"description":{"type":["string","null"]},"rules":{"type":"array","minItems":1,"maxItems":25,"items":{"$ref":"#/components/schemas/Rule"}}}},"RuleSetUpdate":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":["string","null"]},"is_active":{"type":"boolean"},"rules":{"type":"array","minItems":1,"maxItems":25,"items":{"$ref":"#/components/schemas/Rule"}}}},"Usage":{"type":"object","properties":{"org":{"type":"string"},"plan":{"type":"string"},"daily_limit":{"type":"integer"},"today":{"type":"object","properties":{"date":{"type":"string"},"eval_count":{"type":"integer"},"remaining":{"type":"integer"}}},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"eval_count":{"type":"integer"},"pass_count":{"type":"integer"},"fail_count":{"type":"integer"},"review_count":{"type":"integer"},"avg_latency_ms":{"type":["number","null"]},"total_input_tokens":{"type":"integer"}}}}}},"Me":{"type":"object","properties":{"org_id":{"type":"string"},"org":{"type":"string"},"plan":{"type":"string"},"daily_limit":{"type":"integer"},"key_scope":{"$ref":"#/components/schemas/KeyScope"},"store_inputs":{"type":"boolean"},"retention_days":{"type":["integer","null"]},"webhook_configured":{"type":"boolean"},"docs":{"type":"object"}}},"ApiKey":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"key_prefix":{"type":"string"},"scope":{"$ref":"#/components/schemas/KeyScope"},"is_active":{"type":"boolean"},"last_used_at":{"type":["string","null"]},"created_at":{"type":"string"}}},"IssuedApiKey":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"key":{"type":"string","description":"Full key. Shown once."},"key_prefix":{"type":"string"},"scope":{"$ref":"#/components/schemas/KeyScope"},"created_at":{"type":"string"},"notice":{"type":"string"}}},"Webhook":{"type":"object","properties":{"url":{"type":["string","null"]},"configured":{"type":"boolean"},"secret_prefix":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string"}},"delivers_on":{"type":"array","items":{"type":"string"}}}},"WebhookSecret":{"type":"object","properties":{"url":{"type":"string"},"secret":{"type":"string","description":"HMAC-SHA256 signing secret. Shown once."},"signature_header":{"type":"string"},"signature_format":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"delivers_on":{"type":"array","items":{"type":"string"}}}},"AuditEvent":{"type":"object","properties":{"id":{"type":"string"},"event":{"type":"string","example":"api_key.created"},"actor":{"type":"string","description":"key:<prefix>, user:<id>, stripe, or system"},"ip":{"type":["string","null"]},"details":{"type":["object","null"]},"created_at":{"type":"string","format":"date-time"}}},"TowerAgent":{"type":"object","properties":{"agent_id":{"type":"string"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","revoked"]},"key_prefix":{"type":"string"},"created_at":{"type":"string"},"last_used_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]}}},"TowerError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","retryable"],"properties":{"code":{"type":"string"},"field":{"type":"string"},"message":{"type":"string"},"retryable":{"type":"boolean"},"suggested_fix":{"type":"string"}}}}},"TowerDecision":{"type":"object","properties":{"decision_id":{"type":"string"},"outcome":{"type":"string","enum":["auto","review","reject"]},"score":{"type":["number","null"]},"reason":{"type":"string"},"provider":{"type":"string","enum":["jev","local_rules"]},"thresholds":{"type":"object","properties":{"auto":{"type":"number"},"review":{"type":"number"}}},"results":{"type":"array","items":{"type":"object","properties":{"question_id":{"type":"string"},"answer":{},"probability":{"type":"number"},"confidence":{"type":"number"},"passed":{"type":"boolean"},"gated":{"type":"boolean"}}}},"checks":{"type":"array","items":{"type":"object","properties":{"check":{"type":"string"},"passed":{"type":"boolean"},"detail":{"type":"string"}}}},"latency_ms":{"type":["integer","null"]}}},"TowerAction":{"type":"object","properties":{"action_id":{"type":"string"},"operation":{"type":"string"},"status":{"type":"string","enum":["pending","approved","executed","failed","compensated","rejected"]},"dry_run":{"type":"boolean"},"idempotency_key":{"type":"string"},"decision":{"$ref":"#/components/schemas/TowerDecision"},"result":{"type":["object","null"]},"error":{"type":["object","null"]},"review_id":{"type":"string"},"replayed":{"type":"boolean"}}},"TowerReceipt":{"type":"object","properties":{"receipt_id":{"type":"string"},"sequence":{"type":"integer"},"kind":{"type":"string","enum":["decision","action","review","compensation"]},"action_id":{"type":["string","null"]},"decision_id":{"type":["string","null"]},"payload":{"type":"object"},"payload_hash":{"type":"string"},"prev_hash":{"type":"string"},"chain_hash":{"type":"string"},"signature":{"type":"string"},"signing_key_id":{"type":"string"}}},"AtlasAgent":{"type":"object","properties":{"slug":{"type":"string"},"agent":{"type":"string"},"operator":{"type":["string","null"]},"sources":{"type":["string","null"]},"cloudflare_category":{"type":["string","null"]},"cloudflare_kind":{"type":["string","null"]},"user_agents":{"type":["string","null"]},"user_agent_tokens":{"type":"array","items":{"type":"string"}},"web_bot_auth_key_directory":{"type":["string","null"]},"key_revocation":{"type":["string","null"],"enum":["keys_expire","removal_only","directory_unreachable",null],"description":"How a withdrawn signing key would stop working. keys_expire: the directory gives each key a validity period (nbf/exp), the rotation path in the directory draft. removal_only: bare keys; a verifier learns of a withdrawal only when it refetches the directory. directory_unreachable: the directory could not be fetched at review. Null without a directory"},"key_directory_max_age_seconds":{"type":["integer","null"],"description":"The directory's Cache-Control max-age: how long a verifier may keep trusting a copy, so how long a withdrawn key can keep working"},"key_revocation_checked":{"type":["string","null"],"description":"The day the directory was last reviewed (YYYY-MM-DD)"},"follows_robots_txt_cloudflare":{"type":["string","null"]},"respects_robots_txt_ai_robots_txt":{"type":["string","null"]},"description":{"type":["string","null"]},"purpose_class":{"type":["string","null"],"description":"Pro/Team"},"verification":{"type":["string","null"],"description":"Pro/Team and lookups: 'Web Bot Auth signature', 'User-agent string only (spoofable)', 'Unattributable / spoofed'"},"evasion_or_compliance_flag":{"type":["string","null"],"description":"Pro/Team"},"published_traffic_share":{"type":["string","null"],"description":"Pro/Team"}}},"AtlasAgentList":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"fields":{"type":"string","enum":["public","full"]},"tier":{"type":"string"},"agents":{"type":"array","items":{"$ref":"#/components/schemas/AtlasAgent"}}}},"AtlasLookup":{"type":"object","properties":{"user_agent":{"type":"string"},"identified":{"type":"boolean"},"claims":{"type":["object","null"],"properties":{"agent":{"type":"string"},"operator":{"type":["string","null"]},"purpose_class":{"type":["string","null"]},"verification":{"type":["string","null"]},"matched_token":{"type":"string"}}},"trust_note":{"type":"string"},"matches":{"type":"array","items":{"type":"object","properties":{"matched_token":{"type":"string"},"strength":{"type":"string","enum":["exact","token"]},"agent":{"$ref":"#/components/schemas/AtlasAgent"}}}}}},"PlanCatalog":{"type":"object","properties":{"currency":{"type":"string"},"billing_enabled":{"type":"boolean"},"plans":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"price_monthly_usd":{"type":"number"},"daily_eval_limit":{"type":"integer"},"per_minute_limit":{"type":"integer"},"description":{"type":"string"},"purchasable":{"type":"boolean"}}}},"how_to_upgrade":{"type":"object"}}},"BillingStatus":{"type":"object","properties":{"plan":{"type":"string"},"plan_name":{"type":"string"},"price_monthly_usd":{"type":"number"},"daily_limit":{"type":"integer"},"credit_balance":{"type":"integer"},"subscription_status":{"type":"string","enum":["none","trialing","active","past_due","canceled","incomplete","unpaid"]},"current_period_end":{"type":["string","null"],"format":"date-time"},"has_payment_customer":{"type":"boolean"},"billing_enabled":{"type":"boolean"}}},"SubscribeResponse":{"type":"object","properties":{"plan":{"type":"string"},"daily_limit":{"type":"integer"},"subscription_status":{"type":"string"},"current_period_end":{"type":["string","null"]},"requires_action":{"type":"boolean"},"payment_url":{"type":["string","null"]},"notice":{"type":"string"}}},"SignupResponse":{"type":"object","properties":{"org_id":{"type":"string"},"org":{"type":"string"},"plan":{"type":"string"},"account":{"type":"string","enum":["key_only"],"description":"Present on an account created with no email"},"daily_limit":{"type":"integer"},"api_key":{"type":"string"},"key_prefix":{"type":"string"},"notice":{"type":"string"},"next_steps":{"type":"object"}}},"DomainProof":{"type":"object","properties":{"domain":{"type":"string"},"status":{"type":"string","enum":["pending_verification","verified"]},"verification":{"type":"object","description":"The one value to publish at the domain, as a DNS TXT record or as a file","properties":{"value":{"type":"string"},"dns":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"}}},"http":{"type":"object","properties":{"url":{"type":"string"},"body":{"type":"string"}}}}},"next":{"type":"string"}}}}}}