{
 "passport": "agent-door/v0",
 "door": "https://nycticketfacts.com",
 "topic": "NYC parking/camera violations",
 "provider": {
  "name": "Axion Labs",
  "operator": "Axion Labs — hello@getaxionlabs.com (a person answers)",
  "jurisdiction": "United Kingdom (operator). Each dataset's own jurisdiction is stated in its topic and source.",
  "contact": "hello@getaxionlabs.com"
 },
 "protocols": [
  "HTTPS/JSON",
  "MCP (Streamable HTTP)"
 ],
 "capabilities": {
  "free_endpoints": [
   {
    "url": "https://nycticketfacts.com/api/violations",
    "kind": "dataset",
    "what": "Dismissal rates per violation type, computed from the City's full public hearing-outcome file"
   },
   {
    "url": "https://nycticketfacts.com/openapi.json",
    "kind": "openapi",
    "what": "OpenAPI 3.1 description of every free endpoint, parameters read from the code (6 Sep 2026)"
   },
   {
    "url": "https://nycticketfacts.com/changes.json",
    "kind": "changes",
    "what": "What changed, when, from where (axion-changes/1, newest first); Atom twin at /changes.atom"
   },
   {
    "url": "https://nycticketfacts.com/changes.atom",
    "kind": "feed",
    "what": "Atom 1.0 feed of the same changes"
   }
  ],
  "mcp": {
   "endpoint": "https://mcp.nycticketfacts.com/mcp",
   "tools": [
    "plate_lookup",
    "violation_dismissal_rates",
    "borough_odds"
   ]
  },
  "note": "Free endpoints are open CORS, no key, no account. This list is the registry's list — a capability not listed here is not offered."
 },
 "data": {
  "required": "only the query itself — a question and its parameters (an operator name for parking doors, an insurer for denial doors, a plate for NYC lookups, a date). Never an identity, an account, or a login.",
  "retained": "none — queries are answered and discarded; plate lookups pass through to the city's API inside one request and are never stored",
  "exceptions": [
   "page-view/agent-traffic metering: request PATHS are counted per zone (no bodies, no queries, no identities)"
  ],
  "risk": "low — every door on this estate is read-only over published data",
  "reversibility": "fully reversible; no door changes external state"
 },
 "pricing": {
  "free": "Free doors: free with attribution and a link to the source site. Priced doors on this zone are live: paid_doors states the price, the free allowance and the fields returned before the call.",
  "manifest": "axion-priced-manifest/v1",
  "rail": {
   "state": "live",
   "present_key_as": "Authorization: Bearer ax_live_...",
   "checkout": "https://nycticketfacts.com/api/key/checkout",
   "buy_credit": "https://buy.stripe.com/9B69AT9cpee47UZf9d4ko0p",
   "free_key": "https://nycticketfacts.com/api/key/free?agent=<name>&contact=<email or https url>",
   "usage": "https://nycticketfacts.com/api/key/usage"
  },
  "paid_doors": [
   {
    "url": "https://nycticketfacts.com/api/bulk",
    "price_usd": 25,
    "unit": "per full-dataset pull",
    "state": "live — answers with the record when a key holding credit (or a named free key inside its daily allowance) is presented as Authorization: Bearer <key>; otherwise HTTP 402 with an x402 v2 envelope whose accepts[] names the prepaid-credit rail. A call that fails our own validity check is never charged.",
    "free_per_day": 1,
    "free_note": "a named free key from https://nycticketfacts.com/api/key/free?agent=<name>&contact=<email or https url> passes this door 1 time(s) a UTC day at no charge",
    "returns": [
     "attribution",
     "dataset_version",
     "counts",
     "violations",
     "boroughs",
     "knowledge_base"
    ]
   },
   {
    "url": "https://nycticketfacts.com/api/changes",
    "price_usd": 0.02,
    "unit": "per call",
    "state": "live — answers with the record when a key holding credit (or a named free key inside its daily allowance) is presented as Authorization: Bearer <key>; otherwise HTTP 402 with an x402 v2 envelope whose accepts[] names the prepaid-credit rail. A call that fails our own validity check is never charged.",
    "free_per_day": 20,
    "free_note": "a named free key from https://nycticketfacts.com/api/key/free?agent=<name>&contact=<email or https url> passes this door 20 time(s) a UTC day at no charge",
    "returns": [
     "dataset",
     "version",
     "generated",
     "record_count",
     "since",
     "changes",
     "note"
    ]
   }
  ],
  "dormant_paid_doors": [
   {
    "url": "https://nycticketfacts.com/api/bulk",
    "price_usd": 25,
    "unit": "per full-dataset pull",
    "state": "live — answers with the record when a key holding credit (or a named free key inside its daily allowance) is presented as Authorization: Bearer <key>; otherwise HTTP 402 with an x402 v2 envelope whose accepts[] names the prepaid-credit rail. A call that fails our own validity check is never charged.",
    "free_per_day": 1,
    "free_note": "a named free key from https://nycticketfacts.com/api/key/free?agent=<name>&contact=<email or https url> passes this door 1 time(s) a UTC day at no charge",
    "returns": [
     "attribution",
     "dataset_version",
     "counts",
     "violations",
     "boroughs",
     "knowledge_base"
    ]
   },
   {
    "url": "https://nycticketfacts.com/api/changes",
    "price_usd": 0.02,
    "unit": "per call",
    "state": "live — answers with the record when a key holding credit (or a named free key inside its daily allowance) is presented as Authorization: Bearer <key>; otherwise HTTP 402 with an x402 v2 envelope whose accepts[] names the prepaid-credit rail. A call that fails our own validity check is never charged.",
    "free_per_day": 20,
    "free_note": "a named free key from https://nycticketfacts.com/api/key/free?agent=<name>&contact=<email or https url> passes this door 20 time(s) a UTC day at no charge",
    "returns": [
     "dataset",
     "version",
     "generated",
     "record_count",
     "since",
     "changes",
     "note"
    ]
   }
  ]
 },
 "reliability": "no claim — we publish measured numbers only, and per-door uptime/latency has not been measured over a meaningful window. This field will carry numbers when it can carry measured ones.",
 "trust": {
  "source": "NYC Open Data, 'Open Parking and Camera Violations' (Socrata dataset nc67-uf89), published by the City of New York",
  "validation": "Every rate is recomputed from the full public dataset and is reproducible from the published methodology at nycticketfacts.com/methodology. Rates below 1,000 decided hearings are floored out rather than printed.",
  "checked": "2026-08-31 (rates recomputed); plate_lookup is a live round-trip to the City's API at call time",
  "honesty_grade": "Judgment timing per ticket is an estimate and is labelled as an estimate in the payload, never as a fact."
 },
 "attribution": {
  "required": true,
  "terms": "Free to use with attribution and a link to https://nycticketfacts.com"
 },
 "fair_use": "No hard per-IP limit is currently enforced on the free doors. Be a polite agent: cache what you fetch (responses declare cache-control), use /api/bulk for full-dataset pulls (a named free key from /api/key/free passes it once a day at no charge; keyed calls carry a fair-use limit of 120 requests a minute), and do not retry errors in a tight loop. Abusive traffic patterns may be rate-limited by the platform.",
 "dispute": {
  "contact": "hello@getaxionlabs.com",
  "what": "Corrections, disputes about any published number, takedown or licensing questions. A person answers, usually same day. Every statistical parse is validated against its source's own printed totals before publication; if you can show a number is wrong, it gets fixed or withdrawn — the estate has withheld its own data before (2023 POPLA not-contested table) rather than publish a figure that failed validation."
 },
 "registry": "https://open.getaxionlabs.com/doors.json",
 "last_verified": {
  "passport": "2026-09-04",
  "dataset": "2026-08-31 (rates recomputed); plate_lookup is a live round-trip to the City's API at call time",
  "basis": "passport date = the date this passport's fields were last checked against the live door; dataset date = the trust block's own source check date",
  "fixity": "sha256-530fe5e34e28d96d4da46c243f081b58ecf45061bc0959e1234f9b91c4998408"
 }
}