{"openapi":"3.1.0","info":{"title":"Fineprint","description":"Terms of service, translated for machines.","version":"0.1.0"},"paths":{"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/v1/policies":{"post":{"summary":"Create Policy","operationId":"create_policy_v1_policies_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyProfile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Policies","description":"Built-in system policies plus your own custom policies.","operationId":"list_policies_v1_policies_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PolicyProfile"},"title":"Response List Policies V1 Policies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/policies/{policy_id}":{"get":{"summary":"Get Policy","operationId":"get_policy_v1_policies__policy_id__get","parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","title":"Policy Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyProfile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Policy","operationId":"delete_policy_v1_policies__policy_id__delete","parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","title":"Policy Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Policy V1 Policies  Policy Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customers":{"post":{"summary":"Create Customer","operationId":"create_customer_v1_customers_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Customer V1 Customers Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customers/anonymous":{"post":{"summary":"Create Anonymous Customer","description":"No-email trial key for agents: 5 scans/month, 1 monitor. Rate-limited\nto a few keys per IP per day to blunt farming.","operationId":"create_anonymous_customer_v1_customers_anonymous_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Anonymous Customer V1 Customers Anonymous Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"summary":"Me","operationId":"me_v1_me_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Me V1 Me Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scans":{"post":{"summary":"Create Scan","operationId":"create_scan_v1_scans_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scans/x402":{"post":{"summary":"Scan X402","description":"Pay-per-call scan: $0.25 via x402, no API key needed.\n\nRails: USDC on Base (EVM), or XRP / RLUSD on the XRP Ledger.\nWithout an X-PAYMENT header this returns 402 with payment requirements\n(one entry per configured rail/asset). The agent picks an entry, signs\nthe payment with its wallet, retries with the base64 payment payload in\nX-PAYMENT, we verify + settle via the facilitator for that rail, then\nserve the scan.","operationId":"scan_x402_v1_scans_x402_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scans/{scan_id}":{"get":{"summary":"Get Scan","operationId":"get_scan_v1_scans__scan_id__get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","title":"Scan Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scans/{scan_id}/playbook":{"get":{"summary":"Get Playbook","description":"Negotiation playbook for a scan: for each flagged clause, what to ask\nthe vendor for, an acceptable fallback, your leverage, and the walk-away\nsignal. Ordered riskiest first. Negotiation guidance, not legal advice.","operationId":"get_playbook_v1_scans__scan_id__playbook_get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","title":"Scan Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Playbook V1 Scans  Scan Id  Playbook Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scans/batch":{"post":{"summary":"Batch Scan","description":"Scan up to 20 vendor URLs in one call; each scan costs one quota unit.\nPer-URL failures are reported inline and never fail the whole batch.","operationId":"batch_scan_v1_scans_batch_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchScanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Batch Scan V1 Scans Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scans/compare":{"post":{"summary":"Compare Scans","description":"Vendor comparison matrix: worst severity per category per vendor.\nUses already-paid-for scans; consumes no quota.","operationId":"compare_scans_v1_scans_compare_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Compare Scans V1 Scans Compare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scans/{scan_id}/report.pdf":{"get":{"summary":"Scan Report Pdf","description":"Branded single-vendor audit report PDF. Rendering is free: the scan\nwas already paid for.","operationId":"scan_report_pdf_v1_scans__scan_id__report_pdf_get","parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","title":"Scan Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/audit-pack.pdf":{"post":{"summary":"Audit Pack Pdf","description":"Multi-vendor audit pack PDF: ranking, comparison matrix, per-vendor\ndetail. The $2,000 five-vendor deliverable, generated in one call.","operationId":"audit_pack_pdf_v1_reports_audit_pack_pdf_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditPackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/checkout":{"post":{"summary":"Billing Checkout","operationId":"billing_checkout_v1_billing_checkout_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Billing Checkout V1 Billing Checkout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/webhook":{"post":{"summary":"Billing Webhook","operationId":"billing_webhook_v1_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Billing Webhook V1 Billing Webhook Post"}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/.well-known/fineprint.json":{"get":{"summary":"Agent Manifest","operationId":"agent_manifest__well_known_fineprint_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Agent Manifest  Well Known Fineprint Json Get"}}}}}}},"/v1/leaderboard/publish":{"post":{"summary":"Publish Leaderboard Entry","description":"Publish a scan to the public leaderboard. Admin-gated via the same\nADMIN_TOKEN as /admin: the public board is the operator's asset, and no\ncustomer key — not even a farmable anonymous trial key — may write it.","operationId":"publish_leaderboard_entry_v1_leaderboard_publish_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaderboardPublishRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Publish Leaderboard Entry V1 Leaderboard Publish Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/leaderboard/service/{service}":{"delete":{"summary":"Delete Leaderboard Entry","description":"Remove a leaderboard entry (e.g. a bad scan). Admin-gated, same as\npublish. Deletes by exact URL match: the entry's URL is its primary key,\nso at most one row is ever removed.","operationId":"delete_leaderboard_entry_v1_leaderboard_service__service__delete","parameters":[{"name":"service","in":"path","required":true,"schema":{"type":"string","title":"Service"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Leaderboard Entry V1 Leaderboard Service  Service  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Leaderboard Service Report","description":"Full published report for one service, clauses and verbatim quotes\nincluded. Public by design — this is what publication means. Powers the\nlanding-page demo and lets agents inspect evidence without a key.","operationId":"get_leaderboard_service_report_v1_leaderboard_service__service__get","parameters":[{"name":"service","in":"path","required":true,"schema":{"type":"string","title":"Service"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Leaderboard Service Report V1 Leaderboard Service  Service  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/leaderboard":{"get":{"summary":"Get Leaderboard","description":"Public ToS risk ranking. No auth, free reads, no quota consumed.","operationId":"get_leaderboard_v1_leaderboard_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Leaderboard V1 Leaderboard Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agent-access/{service}":{"get":{"summary":"Get Agent Access","description":"Pre-flight agent-access check for one service — the cheap question\nan agent asks BEFORE deciding to scan or sign up: \"can an agent even\nuse this?\" Answered from the published leaderboard (no auth, no\nquota). Always 200: `known` says whether a verified report exists;\nagents branch on the structured agent_access fields, not prose.\nUnknown services return known=false with a scan hint.","operationId":"get_agent_access_v1_agent_access__service__get","parameters":[{"name":"service","in":"path","required":true,"schema":{"type":"string","title":"Service"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Agent Access V1 Agent Access  Service  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/badge/{service}.svg":{"get":{"summary":"Get Badge","description":"Embeddable 'nutrition label' SVG badge with a service's published ToS\nrisk score. Public — no key needed, so vendors can hotlink it.\n\nEmbed:\n  <a href=\"https://YOUR-API/methodology.html\">\n    <img src=\"https://YOUR-API/v1/badge/acme.svg\" alt=\"Fineprint ToS risk score for Acme\">\n  </a>","operationId":"get_badge_v1_badge__service__svg_get","parameters":[{"name":"service","in":"path","required":true,"schema":{"type":"string","title":"Service"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors":{"post":{"summary":"Create Monitor","description":"Watch a ToS URL. The baseline scan runs immediately (1 scan of quota);\nlater checks are free until the document actually changes.","operationId":"create_monitor_v1_monitors_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Monitor V1 Monitors Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Monitors","operationId":"list_monitors_v1_monitors_get","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Monitors V1 Monitors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watch":{"post":{"summary":"Watch Service","description":"No-API monitoring signup: watch a leaderboard vendor's terms with\njust an email. Finds or creates the customer (a new customer's API key\nis returned once, exactly like signup — it is also the watchlist\nsign-in), then creates the monitor through the normal monitor path:\nsame tier limits, same baseline scan. Re-watching a vendor returns the\nexisting monitor instead of duplicating it.","operationId":"watch_service_v1_watch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Watch Service V1 Watch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchlist":{"get":{"summary":"Watchlist Page","description":"Human-readable monitor list — the no-API surface for watchers.\nAuth is the customer's API key (?key= or X-API-Key header), the same\ncredential issued at signup. Shows baselines, latest checks, alerts.","operationId":"watchlist_page_v1_watchlist_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/check-due":{"post":{"summary":"Check Due Monitors","description":"Check every due monitor for this API key. Point a cron job here\n(cron-job.org, Railway cron) with X-API-Key to automate monitoring.","operationId":"check_due_monitors_v1_monitors_check_due_post","parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Check Due Monitors V1 Monitors Check Due Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/{monitor_id}":{"get":{"summary":"Get Monitor","operationId":"get_monitor_v1_monitors__monitor_id__get","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Monitor V1 Monitors  Monitor Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Monitor","operationId":"delete_monitor_v1_monitors__monitor_id__delete","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Monitor V1 Monitors  Monitor Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/{monitor_id}/check":{"post":{"summary":"Check Monitor Now","operationId":"check_monitor_now_v1_monitors__monitor_id__check_post","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Check Monitor Now V1 Monitors  Monitor Id  Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin":{"get":{"summary":"Admin Dashboard","operationId":"admin_dashboard_admin_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AgentAccess":{"properties":{"automated_access":{"type":"string","enum":["allowed","restricted","prohibited","unclear"],"title":"Automated Access","default":"unclear"},"account_delegation":{"type":"string","enum":["allowed","restricted","prohibited","unclear"],"title":"Account Delegation","default":"unclear"},"ai_agent_terms":{"type":"string","enum":["mentioned","not_mentioned"],"title":"Ai Agent Terms","default":"not_mentioned"},"official_channels_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Official Channels Required","description":"True when automation is allowed only through the vendor's sanctioned channels (ban + explicit permission); False when permission stands alone; None when unknown."}},"type":"object","title":"AgentAccess","description":"Structured agent-access decision: can an agent use this service, and\non what terms? Derived deterministically from the extracted clauses by\npolicies.agent_access — the machine-readable form of the\nagent_friendliness verdict, so agents branch on fields, not prose."},"AuditPackRequest":{"properties":{"scan_ids":{"items":{"type":"string"},"type":"array","title":"Scan Ids","description":"2–20 scan ids for the audit pack PDF."},"title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Title","description":"Cover title for the PDF."}},"type":"object","required":["scan_ids"],"title":"AuditPackRequest"},"BatchScanRequest":{"properties":{"urls":{"items":{"type":"string"},"type":"array","title":"Urls","description":"ToS / policy document URLs to scan (max 20)."},"policy_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Id","description":"Policy profile to evaluate all scans against."}},"type":"object","required":["urls"],"title":"BatchScanRequest"},"Clause":{"properties":{"id":{"type":"string","title":"Id","description":"Stable id within the report, e.g. c_001"},"category":{"type":"string","title":"Category","description":"One of the taxonomy ids in taxonomy.py"},"title":{"type":"string","maxLength":140,"title":"Title"},"summary":{"type":"string","maxLength":600,"title":"Summary","description":"One plain-English sentence: who is bound, what happens."},"severity":{"type":"string","enum":["critical","high","medium","low","info"],"title":"Severity"},"quote":{"type":"string","minLength":20,"title":"Quote","description":"Exact verbatim quote from the document supporting this clause."},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section","description":"Heading or section number where the quote appears."},"quote_match":{"anyOf":[{"type":"string","enum":["verbatim","fuzzy"]},{"type":"null"}],"title":"Quote Match","description":"How the quote grounded against the source at extraction: 'verbatim' (exact after normalization) or 'fuzzy' (approximate, see quote_match_ratio). None on clauses extracted before this was recorded."},"quote_match_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quote Match Ratio","description":"Grounding similarity of the quote against the source document, 0..1; 1.0 = verbatim. Kept clauses are always >= 0.85."}},"type":"object","required":["id","category","title","summary","severity","quote"],"title":"Clause","description":"A single extracted clause. The `quote` is load-bearing: no verbatim\nquote, no clause. Every claim an agent acts on must be auditable."},"CompareRequest":{"properties":{"scan_ids":{"items":{"type":"string"},"type":"array","title":"Scan Ids","description":"2–20 scan ids to compare."}},"type":"object","required":["scan_ids"],"title":"CompareRequest"},"CustomerCreateRequest":{"properties":{"email":{"type":"string","title":"Email"},"ref":{"type":"string","title":"Ref","default":"direct"}},"type":"object","required":["email"],"title":"CustomerCreateRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LeaderboardPublishRequest":{"properties":{"scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scan Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"service":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service"}},"type":"object","title":"LeaderboardPublishRequest"},"MonitorCreateRequest":{"properties":{"url":{"type":"string","title":"Url"},"service":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service"},"policy_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Id"},"interval_days":{"type":"integer","maximum":90.0,"minimum":1.0,"title":"Interval Days","description":"Days between automatic checks.","default":7},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"POSTed a JSON alert when a material change is detected."}},"type":"object","required":["url"],"title":"MonitorCreateRequest"},"PolicyCreateRequest":{"properties":{"name":{"type":"string","maxLength":120,"title":"Name"},"description":{"type":"string","title":"Description","default":""},"rules":{"items":{"$ref":"#/components/schemas/PolicyRule"},"type":"array","maxItems":200,"title":"Rules","default":[]}},"type":"object","required":["name"],"title":"PolicyCreateRequest"},"PolicyProfile":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""},"rules":{"items":{"$ref":"#/components/schemas/PolicyRule"},"type":"array","title":"Rules","default":[]},"owner_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Customer Id","description":"Customer id that owns this policy. None = built-in system policy, visible to everyone."},"system":{"type":"boolean","title":"System","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name"],"title":"PolicyProfile"},"PolicyRule":{"properties":{"id":{"type":"string","title":"Id"},"clause_category":{"type":"string","title":"Clause Category"},"action":{"type":"string","enum":["block","flag"],"title":"Action"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["id","clause_category","action"],"title":"PolicyRule"},"ScanReport":{"properties":{"id":{"type":"string","title":"Id"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"doc_type":{"type":"string","enum":["terms_of_service","privacy_policy","eula","dpa","other"],"title":"Doc Type","default":"terms_of_service"},"fetched_at":{"type":"string","format":"date-time","title":"Fetched At"},"word_count":{"type":"integer","title":"Word Count","default":0},"language":{"type":"string","title":"Language","default":"en"},"risk_score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Risk Score"},"risk_level":{"type":"string","enum":["low","medium","high","critical"],"title":"Risk Level"},"verdict":{"type":"string","enum":["pass","flag","block"],"title":"Verdict","default":"pass"},"summary":{"type":"string","title":"Summary","default":""},"clauses":{"items":{"$ref":"#/components/schemas/Clause"},"type":"array","title":"Clauses","default":[]},"agent_friendliness":{"type":"string","enum":["friendly","restricted","hostile","unclear"],"title":"Agent Friendliness","default":"unclear"},"agent_friendliness_notes":{"items":{"type":"string"},"type":"array","title":"Agent Friendliness Notes","description":"Why the agent-friendliness verdict was reached; quote-backed notes."},"agent_access":{"$ref":"#/components/schemas/AgentAccess","description":"Structured agent-access decision derived from the clauses; see policies.agent_access."},"score_breakdown":{"$ref":"#/components/schemas/ScoreBreakdown","description":"Per-severity counts/points behind risk_score."},"analysis_complete":{"type":"boolean","title":"Analysis Complete","description":"False when the source document exceeded the processing cap and was truncated — findings cover only the processed portion, and the verdict is never a clean 'pass' in that case.","default":true},"scoring_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scoring Version","description":"Version of the deterministic scoring/verdict ruleset (policies.SCORING_VERSION) that produced this report's score and verdicts. None on reports pre-dating version stamping."},"content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Hash","description":"SHA-256 of the exact document text this report was computed from — the document's version fingerprint. Matches the hash monitors use for change detection."},"dealbreakers":{"items":{"type":"string"},"type":"array","title":"Dealbreakers","description":"Clause ids that violate block rules."},"recommended_actions":{"items":{"type":"string"},"type":"array","title":"Recommended Actions"},"meta":{"additionalProperties":true,"type":"object","title":"Meta"},"disclaimer":{"type":"string","title":"Disclaimer","description":"Product disclaimer: informational analysis, not legal advice.","default":"Fineprint provides automated informational analysis only. It is not legal advice, and Fineprint is not a law firm. Verify material findings against the quoted source text and consult a licensed attorney before acting."}},"type":"object","required":["id","risk_score","risk_level"],"title":"ScanReport"},"ScanRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"URL of the ToS / policy document to scan."},"text":{"anyOf":[{"type":"string","maxLength":2000000},{"type":"null"}],"title":"Text","description":"Raw document text (alternative to url)."},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","description":"Attribution URL when text is pasted."},"policy_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Id","description":"Policy profile to evaluate against."}},"type":"object","title":"ScanRequest"},"ScoreBreakdown":{"properties":{"critical":{"$ref":"#/components/schemas/SeverityScore"},"high":{"$ref":"#/components/schemas/SeverityScore"},"medium":{"$ref":"#/components/schemas/SeverityScore"},"low":{"$ref":"#/components/schemas/SeverityScore"},"info":{"$ref":"#/components/schemas/SeverityScore"},"raw_total":{"type":"integer","title":"Raw Total","default":0},"capped":{"type":"boolean","title":"Capped","default":false}},"type":"object","title":"ScoreBreakdown","description":"Why risk_score is what it is: clause counts and points per severity\n(critical 25, high 12, medium 5, low 2, info 0). raw_total is the\nuncapped sum; risk_score = min(100, raw_total)."},"SeverityScore":{"properties":{"count":{"type":"integer","title":"Count","default":0},"points":{"type":"integer","title":"Points","default":0}},"type":"object","title":"SeverityScore"},"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"},"WatchRequest":{"properties":{"email":{"type":"string","title":"Email"},"service":{"type":"string","title":"Service","description":"Leaderboard service slug to watch, e.g. 'discord'."}},"type":"object","required":["email","service"],"title":"WatchRequest"}}}}