{
 "openapi": "3.1.0",
 "info": {
  "title": "nycticketfacts.com free machine endpoints",
  "version": "2026-08-31",
  "description": "Free, open-CORS, no key. Every JSON response carries a top-level `cite` (axion-cite/v1) and a Link: <canonical> header. Conditional requests honoured (ETag, Last-Modified, 304).",
  "contact": {
   "email": "hello@getaxionlabs.com"
  },
  "x-dataset-fixity": "sha256-530fe5e34e28d96d4da46c243f081b58ecf45061bc0959e1234f9b91c4998408"
 },
 "servers": [
  {
   "url": "https://nycticketfacts.com"
  }
 ],
 "x-axion-passport": "https://nycticketfacts.com/.well-known/agent-door.json",
 "paths": {
  "/api/violations": {
   "get": {
    "summary": "All violation types with dismissal / reduction rates and decided-hearing counts",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK — carries a `receipt` (answer-receipt/v1, Ed25519, with `policy`); ETag = the receipt's payload_sha256 prefix. Verify at /api/verify-receipt; key at /.well-known/answer-key.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      },
      "x-axion-cite": true,
      "x-axion-receipt": true
     }
    }
   }
  },
  "/api/violations/{slug}": {
   "get": {
    "summary": "One violation type: guide content, fine, rates, defenses, evidence list",
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string",
       "pattern": "^[a-z0-9-]+$"
      },
      "description": "The violation guide slug, as in the `page` URL of /api/violations"
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      },
      "x-axion-cite": true
     },
     "404": {
      "description": "Unknown slug"
     }
    }
   }
  },
  "/api/boroughs": {
   "get": {
    "summary": "Hearing outcomes for all five boroughs",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      },
      "x-axion-cite": true
     }
    }
   }
  },
  "/changes.json": {
   "get": {
    "summary": "What moved, when, from where (axion-changes/1)",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     }
    }
   }
  },
  "/changes.atom": {
   "get": {
    "summary": "The same change items as an Atom 1.0 feed",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/atom+xml": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/llms.txt": {
   "get": {
    "summary": "Plain-text orientation for assistants, generated from the live dataset",
    "parameters": [],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "/api/bulk": {
   "get": {
    "summary": "The complete corpus in one response: every violation-type rate, every borough rate, and the full defense/evidence knowledge base",
    "description": "PRICED, NOT YET ACTIVATED. Returns HTTP 402 with an x402 v2 PaymentRequired body carrying a real preview of the payload and a contact address. No rail is wired yet; nothing can be bought on it today. To buy, or to say which rail you want (MPP or x402): hello@getaxionlabs.com.",
    "parameters": [],
    "responses": {
     "402": {
      "description": "Payment required - x402 v2 PaymentRequired envelope. $25 per full-dataset pull.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     }
    },
    "x-status": "not-yet-activated",
    "x-price-usd": 25,
    "x-price-unit": "per full-dataset pull",
    "x-payment-protocol": "x402/v2",
    "x-contact": "hello@getaxionlabs.com",
    "x-payment-info": {
     "intent": "charge",
     "method": "stripe",
     "amount": 25,
     "currency": "USD",
     "description": "The complete corpus in one response: every violation-type rate, every borough, every defence list; USD 25 per pull, paid through a Stripe Payment Link named in the 402 envelope; credit rides on a key from https://nycticketfacts.com/api/key/checkout"
    },
    "security": [
     {
      "axionKey": []
     },
     {
      "axionOAuth": [
       "read",
       "bulk",
       "changes"
      ]
     }
    ]
   }
  },
  "/api/changes": {
   "get": {
    "summary": "Records whose hearing-outcome rates changed since a given date",
    "description": "PRICED, NOT YET ACTIVATED. Returns HTTP 402 with an x402 v2 PaymentRequired body carrying a real preview of the payload and a contact address. No rail is wired yet; nothing can be bought on it today. To buy, or to say which rail you want (MPP or x402): hello@getaxionlabs.com.",
    "parameters": [
     {
      "name": "since",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "pattern": "^d{4}-d{2}-d{2}$"
      },
      "description": "ISO date; records changed since this date"
     }
    ],
    "responses": {
     "402": {
      "description": "Payment required - x402 v2 PaymentRequired envelope. $0.02 per call.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     }
    },
    "x-status": "not-yet-activated",
    "x-price-usd": 0.02,
    "x-price-unit": "per call",
    "x-payment-protocol": "x402/v2",
    "x-contact": "hello@getaxionlabs.com",
    "x-payment-info": {
     "intent": "charge",
     "method": "stripe",
     "amount": 0.02,
     "currency": "USD",
     "description": "Records whose hearing-outcome rates changed since a given date; USD 0.02 per call, paid through a Stripe Payment Link named in the 402 envelope; credit rides on a key from https://nycticketfacts.com/api/key/checkout"
    },
    "security": [
     {
      "axionKey": []
     },
     {
      "axionOAuth": [
       "read",
       "bulk",
       "changes"
      ]
     }
    ]
   }
  }
 },
 "x-service-info": {
  "name": "NYC Ticket Facts",
  "provider": "Axion Labs",
  "categories": [
   "data",
   "parking-tickets",
   "public-records",
   "new-york"
  ],
  "contact": "hello@getaxionlabs.com",
  "auth": "https://nycticketfacts.com/auth.md",
  "a2a": "https://nycticketfacts.com/.well-known/agent-card.json"
 },
 "components": {
  "securitySchemes": {
   "axionKey": {
    "type": "http",
    "scheme": "bearer",
    "description": "An API key from https://nycticketfacts.com/agent/identity or https://nycticketfacts.com/api/key/free. Every free operation answers without one."
   },
   "axionOAuth": {
    "type": "oauth2",
    "flows": {
     "clientCredentials": {
      "tokenUrl": "https://nycticketfacts.com/oauth/token",
      "scopes": {
       "read": "every free endpoint (they answer without a token too)",
       "bulk": "/api/bulk, the whole corpus in one pull",
       "changes": "/api/changes, records whose rates changed since a date"
      }
     }
    }
   }
  }
 }
}