{"openapi":"3.1.0","info":{"title":"AEGIS Commerce API","version":"1.1"},"paths":{"/ui":{"get":{"summary":"Landing","operationId":"landing_ui_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/":{"get":{"summary":"Catalog","operationId":"catalog__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/x402list.txt":{"get":{"summary":"X402List Domain Proof","description":"Domain ownership proof for x402-list.com listing updates.\n\nReads the current token from Vault on every request so a token can be\nset or cleared without restarting a service that is taking payments.\nReturns 404 when no token is set, which is the accurate resting state —\nthe proof file genuinely does not exist outside a verification window.","operationId":"x402list_domain_proof__well_known_x402list_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","description":"Plain-text service description for AI agents and LLM-driven crawlers.\n\nGenerated from live config (PRICES, PRODUCT_ROUTES, SLAS) rather than\nhardcoded, so it cannot drift from actual pricing the way a static file\nwould. Served because the buyers for this service are agents, and this\nis the convention they read.","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/.well-known/x402":{"get":{"summary":"Well Known X402 Alias","description":"Extensionless alias. Indexers request both /.well-known/x402 and\n/.well-known/x402.json depending on which convention they follow;\nserving only the .json form returns 404 to a large share of crawlers.","operationId":"well_known_x402_alias__well_known_x402_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/x402.json":{"get":{"summary":"Well Known X402","description":"Static x402 discovery manifest.\n\nThis is the passive-discovery convention that third-party x402 indexers\nscrape. It requires no facilitator account and no registration, which is\nwhy it is worth serving regardless of CDP approval status.\n\nEvery listed endpoint returns a spec-valid 402 when called without\npayment, so an indexer probing these paths will validate successfully.","operationId":"well_known_x402__well_known_x402_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/forensics":{"get":{"summary":"V1 Price Discovery","description":"Price discovery for the /v1 routes.\n\nA client that finds this service has no way to learn the price without\nalready knowing to use POST — GET previously returned 405. That is a\ndiscovery failure: 71 GET probes hit /v2/forensics in a single day.\n\nDeliberately side-effect free. POST creates a job record and returns a\njob_id; GET must not, or every crawler probing this service would\naccumulate junk job files. GET is defined as a safe method, so it\nreturns the payment terms only. To actually buy, POST.","operationId":"v1_price_discovery_v1_forensics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Forensics","description":"Network forensics scan — single stateless run.\n\nNo payload is required. The scan runs against the engine's canonical\ntarget basket. Buyer-supplied targets are explicitly rejected rather\nthan silently ignored, so callers are never misled into thinking a\ncustom target list was honored.","operationId":"forensics_v1_forensics_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/synthesize":{"get":{"summary":"V1 Price Discovery","description":"Price discovery for the /v1 routes.\n\nA client that finds this service has no way to learn the price without\nalready knowing to use POST — GET previously returned 405. That is a\ndiscovery failure: 71 GET probes hit /v2/forensics in a single day.\n\nDeliberately side-effect free. POST creates a job record and returns a\njob_id; GET must not, or every crawler probing this service would\naccumulate junk job files. GET is defined as a safe method, so it\nreturns the payment terms only. To actually buy, POST.","operationId":"v1_price_discovery_v1_synthesize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Synthesize","operationId":"synthesize_v1_synthesize_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/verify":{"get":{"summary":"V1 Price Discovery","description":"Price discovery for the /v1 routes.\n\nA client that finds this service has no way to learn the price without\nalready knowing to use POST — GET previously returned 405. That is a\ndiscovery failure: 71 GET probes hit /v2/forensics in a single day.\n\nDeliberately side-effect free. POST creates a job record and returns a\njob_id; GET must not, or every crawler probing this service would\naccumulate junk job files. GET is defined as a safe method, so it\nreturns the payment terms only. To actually buy, POST.","operationId":"v1_price_discovery_v1_verify_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Verify","operationId":"verify_v1_verify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v2/forensics":{"get":{"summary":"Forensics V2 Discovery","description":"Price discovery for the facilitator-settled route.\n\nThe x402 middleware is registered for \"POST /v2/forensics\" only, so a\nGET never reaches it — FastAPI's router returns 405 first. That means a\nclient (or a human clicking a link) has no way to see what this costs.\n\nThis returns the same payment terms the middleware would advertise, but\nsettles nothing and runs no scan. GET is a safe method; it must not\ncreate a job or move money. To actually buy, POST and let the middleware\nhandle the 402 / PAYMENT-SIGNATURE exchange.","operationId":"forensics_v2_discovery_v2_forensics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Forensics V2","description":"Network forensics scan, settled inline via the x402 facilitator.\n\nBy the time this handler executes, the middleware has already verified\nand settled payment — so the work runs unconditionally here. There is no\n402 logic in this function; that is entirely the middleware's job.\n\nRuns the scan in a worker thread so the event loop is not blocked for\nthe ~13s the six checks take. Uses the same FORENSICS_LOCK as /v1, so\nconcurrent paid scans across both rails are serialized.","operationId":"forensics_v2_v2_forensics_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/webhook/payment":{"post":{"summary":"Payment Webhook","description":"Payment confirmation webhook.\nVerifies the USDC transfer actually happened on Base L2 before\ntrusting it — real on-chain check, not caller-trust.","operationId":"payment_webhook_v1_webhook_payment_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/job/{job_id}":{"get":{"summary":"Get Job","operationId":"get_job_v1_job__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}