# AX Check: nycticketfacts.com
Checked 2026-09-21.

Docs and pricing are readable instantly, no login needed
Fines, surcharges, and API pricing (free tier, $25 bulk, $0.02/call) are all stated openly on the page with no gating or signup.

## End-to-end onboarding not demonstrated

## Coding sessions
Of three independent sessions, only Kimi K3 completed, confirming pricing details straight from the site's own data and citing the exact free-vs-paid tier breakdown. The other two sessions did not finish, so no comparable result is available from them.

### DeepSeek V4 Pro
[View public run](https://agents.withgauge.com/p/runs/650d1c83-b262-4d7f-9578-782729f605b1) · [Read transcript](https://www.ax-check.com/nycticketfacts.com/sessions/deepseek.json)

#### End-to-end onboarding
- **End-to-end onboarding not demonstrated**: Agent only used NYC Ticket Facts' free, keyless endpoints (REST /api/violations, /api/boroughs, /api/violations/{slug}) and a public MCP probe. It never obtained an API key or performed any authenticated operation. The paid doors (/api/bulk, /api/changes) were called anonymously and correctly returned 402 Payment Required; agent did not attempt registration or checkout. Since the documented workflow is fully usable free with no credentials, this is not a login wall — hence not_verified rather than login_required.
  Event 94:

  ```text
  GET /api/violations           all 80 violation types with outcome rates
  ```
  Event 71:

  ```text
  "error": "payment_required",
  ```

#### Hallucinated URLs
None identified in this transcript.

#### Blockers
- **Paid bulk/changes endpoints require purchased credit**: Product behavior, not agent error: /api/bulk ($25/pull) and /api/changes ($0.02/call) both return HTTP 402 with an x402 payment envelope when called without a key. This is documented, expected gating rather than a defect, and the agent correctly treated it as out of scope for a free-tier example rather than a blocker to the core deliverable.
  Event 71:

  ```text
  "message": "This endpoint is metered. Buy credit, then send the key as Authorization: Bearer …",
  ```
  Event 71:

  ```text
  "price_usd": 25,
  ```

#### Suggested Changes
- **Reconcile dormant-vs-live status text for paid endpoints**: In /for-agents.json and /openapi.json, the paid door descriptions state 'PRICED, NOT YET ACTIVATED' / 'dormant — answers HTTP 402 ... no payment rail is live', while a live call to the same endpoint returns header x-payment-status: live and a working Stripe payment link. Update the static docs to match actual endpoint behavior, then verify by re-fetching /openapi.json and confirming its x-status field agrees with the live 402 response's x-payment-status header.
  Event 59:

  ```text
  "state": "dormant \u2014 answers HTTP 402 with an x402 v2 envelope and an empty accepts[] list; no payment rail is live and no payment is accepted today. The price shown is the price that will apply."
  ```
  Event 71:

  ```text
  x-payment-status: live
  ```
- **Sync MCP server dataset version with REST API version**: The MCP server's tool responses report rates_computed 2026-08-06, while the REST /api/violations and /api/boroughs endpoints report dataset version 2026-08-31 with slightly different decided_hearings counts for the same violation types. Update the MCP server's data refresh job to pull from the same computed snapshot as the REST API, then verify by comparing decided_hearings for a sample violation across both surfaces.
  Event 60:

  ```text
  "rates_computed": "2026-08-06",
  ```
  Event 24:

  ```text
  "version": "2026-08-31",
  ```

### Kimi K3
[View public run](https://agents.withgauge.com/p/runs/8151d046-7f51-46a3-9c29-34c098f57c6e) · [Read transcript](https://www.ax-check.com/nycticketfacts.com/sessions/kimi.json)
Final output states free tier vs paid tiers ($25 for /api/bulk, $0.02/call for /api/changes) sourced directly from the site's own JSON metadata at seq 29, naming the plan/workload basis for each figure.
#### End-to-end onboarding
- **End-to-end onboarding not demonstrated**: The product is a free, keyless JSON API for the endpoints exercised (violations, boroughs, violation detail). No credential acquisition or authenticated operation occurred because none was required; the paid endpoints (/api/bulk at $25, /api/changes at $0.02/call) were never called. Since no auth flow was needed or attempted, this does not meet the bar for verified self-service onboarding with real credentials.
  Event 50:

  ```text
  Dataset 2026-08-31 — 80 violation types
  
  Top 5 most-dismissed violation types:
     89.8% dismissed  ( 2,040 hearings)  NO STOP/STANDNG EXCEPT PAS P/U
  ```
  Event 29:

  ```text
  "v1": { "path": "/api/v1", "is": "/api/bulk", "usd": 25 }
  ```

#### Hallucinated URLs
None identified in this transcript.

#### Blockers
- **Default HTTP client User-Agent triggers a 403**: The first run of the example script failed with an HTTP 403 Forbidden when using Python's default urllib User-Agent. This was product/API behavior (a bot-filtering rule) rather than a credential or environment issue, and the agent resolved it itself in one edit by setting an explicit User-Agent header, after which all calls succeeded.
  Event 43:

  ```text
  urllib.error.HTTPError: HTTP Error 403: Forbidden
  ```
  Event 50:

  ```text
  Dataset 2026-08-31 — 80 violation types
  ```
- **Borough response schema differs from initial guess**: The agent's first attempt to parse the /api/boroughs response guessed at field names (borough/dismissed_pct) that don't exist, producing 'None%' output. This was agent error from assuming a shape rather than checking the actual payload; it was corrected within two tool calls by inspecting the real JSON keys (name, ng_pct, win_pct, decided).
  Event 62:

  ```text
  Staten Island    31.1% not guilty,  40.2% win-or-reduced (324,764 hearings)
  ```
  Event 56:

  ```text
  {
   "name": "Staten Island",
   "decided": 324764,
   "ng_pct": 31.1,
   "win_pct": 40.2
  }
  ```

#### Suggested Changes
- **Document the required User-Agent header in the OpenAPI spec or /api info page**: A default urllib.request call without a custom User-Agent returned 403 Forbidden on /api/violations, forcing a debug-and-fix cycle. Add a note to the openapi.json description or the /api JSON response (both fetched during this session) stating that a non-empty/non-default User-Agent header is required. Verify by confirming a stdlib HTTP client succeeds with the documented header on first try, no trial and error.
  Event 43:

  ```text
  urllib.error.HTTPError: HTTP Error 403: Forbidden
  ```
  Event 29:

  ```text
  "description": "New York City parking-ticket hearing outcomes from the city's own decided-hearing records
  ```
- **Publish a sample JSON response or field schema for /api/boroughs**: The OpenAPI spec's /api/boroughs schema is typed as a generic 'object' with no properties, so the agent had to guess field names (borough, dismissed_pct) that turned out wrong before inspecting the live payload to find the actual keys (name, ng_pct, win_pct, decided). Add a concrete schema or example response to openapi.json for this path; verify by checking that the schema's property names match the live response fields exactly.
  Event 56:

  ```text
  {
   "name": "Staten Island",
   "decided": 324764,
   "ng_pct": 31.1,
   "win_pct": 40.2
  }
  ```
  Event 23:

  ```text
  "summary": "Hearing outcomes for all five boroughs"
  ```

### Qwen 3.8 Max
[View public run](https://agents.withgauge.com/p/runs/c1149dcc-15c5-4f4b-b019-5bdd02f731e2) · [Read transcript](https://www.ax-check.com/nycticketfacts.com/sessions/qwen.json)

#### End-to-end onboarding
- **End-to-end onboarding not demonstrated**: Session never authenticated against NYC Ticket Facts. Every operation used the site's free, keyless surfaces (REST endpoints, MCP tools, plate_lookup with a dummy plate). The agent inspected the priced doors (/api/bulk, /api/changes) and decoded their HTTP 402 x402 envelopes but never purchased credit or obtained a Bearer key, so no authenticated product operation was demonstrated. This is a case where the product itself has no required signup for its core workflow, not a login wall the agent got stuck behind.
  Event 92:

  ```text
  == paid changes no key\n402
  ```
  Event 84:

  ```text
  \"plate\": \"ZZZ0000\",\n \"state\": \"NY\"
  ```
  Event 62:

  ```text
  Status of the two paid API doors: **OPEN.** Both return HTTP 402 with an x402 v2 PaymentRequired body
  ```

#### Hallucinated URLs
None identified in this transcript.

#### Blockers
- **Priced bulk/changes endpoints require prepaid Stripe credit**: The two monetized doors (/api/bulk at $25/pull and /api/changes at $0.02/call) are gated behind a prepaid-credit checkout via Stripe, returning HTTP 402 until a key is purchased or a free daily-limited key is requested with an agent name and contact. This is expected product behavior (a paid tier), not a bug or agent error, and the agent correctly avoided spending money or completing checkout, sticking to the free tier which covers the core use case.
  Event 56:

  ```text
  == bulk no key\n402
  ```
  Event 62:

  ```text
  why_prepaid": "Stripe's machine-payments card rail has a USD 0.50 minimum per payment
  ```

#### Suggested Changes
None identified in this transcript.

### Task given to each agent
Help me build a simple example using NYC Ticket Facts. Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage. Let me know if you get blocked. If this product has no developer workflow you can act on, say so plainly and stop. Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop.

No product credentials were supplied and no purchases were authorized.

## Score: A · 100/100 (provisional)
Grades come from completed site checks. Coding sessions and skipped checks do not affect the score.

### Clarity
- **Pass** — Homepage answers Markdown requests

  ```text
  Homepage returned text/markdown with 673 tokens when requested with Accept: text/markdown.
  ```

- **Pass** — llms.txt provides an actionable documentation index

  ```text
  llms.txt indexes pages, 20 violation guides, free JSON API, OpenAPI, MCP endpoint and pricing.
  ```

- **Pass** — llms.txt provides navigation guidance

  ```text
  llms.txt gives URL index, per-violation guide slugs, and agent orientation links.
  ```

- **Pass** — llms.txt mentions offered API, MCP, and skills

  ```text
  llms.txt documents MCP tools, free JSON API endpoints, and OpenAPI spec.
  ```

- **Pass** — A compact guide representation exists

  ```text
  Homepage serves text/markdown; llms.txt is a standalone Markdown guide with orientation and URL index.
  ```

- **Pass** — A focused guide is directly retrievable

  ```text
  llms.txt is directly retrievable as text/plain Markdown with full workflow, rates, and API/MCP orientation.
  ```

- **Pass** — Equivalent instructions fit a token budget

  ```text
  llms.txt is 9808 tokens but the homepage Markdown is 673 tokens, so the compact guide is well under 40%.
  ```

- **Pass** — Product-docs links survive format changes

  ```text
  Homepage Markdown retains docs, API, OpenAPI, llms.txt, and data-source links; equivalent routes survive.
  ```

- **Pass** — The compact guide is independently actionable

  ```text
  llms.txt gives machine-first orientation, MCP tools, API endpoints, plate lookup, and pricing in one fetch.
  ```

- **Pass** — Install and next-step links resolve

  ```text
  Homepage links to /check, /violations, /lookup, /pack, /api/violations all resolve on subject domain.
  ```


### Onboarding
- **Skipped** — Docs lead to a relevant quickstart

  ```text
  llms.txt lists pages and API endpoints but no quickstart or first-steps guide was fetched.
  ```

- **Skipped** — Installation commands are extractable

  ```text
  No installation or setup commands appear; the site offers a free JSON API and MCP, not an installable package.
  ```

- **Skipped** — Code examples are available without interaction

  ```text
  llms.txt describes API endpoints and an OpenAPI spec but shows no code examples.
  ```

- **Pass** — Prerequisites and auth boundaries are explicit

  ```text
  llms.txt states the free API needs no key, no signup, no rate limit; paid doors use Bearer ax_live_ keys.
  ```


### Pricing
- **Pass** — Pricing is readable without interaction

  ```text
  Homepage states fine spread $35–$250 and examples: street cleaning $65, hydrant $115, red light $50.
  ```

- **Pass** — Prices are stated, not gated

  ```text
  Prices stated openly on page, including $12.99 statement builder; no gating or interaction required.
  ```

- **Pass** — Pricing units and limits are explicit

  ```text
  Units explicit: dollar fine amounts per violation type, $15 surcharge included, $350 boot threshold.
  ```

- **Pass** — Agents identify pricing and its assumptions

  ```text
  1 of 3 sessions were judged on pricing; 0 fell short. Kimi K3: Final output states free tier vs paid tiers ($25 for /api/bulk, $0.02/call for /api/changes) sourced directly from the site's own JSON metadata at seq 29, naming the plan/workload basis for each figure. This behavioural item does not affect the fast grade.
  ```


### Activation
- **Pass** — An API reference or OpenAPI spec is reachable

  ```text
  OpenAPI 3.1 spec fetched at /openapi.json describing free endpoints.
  ```

- **Pass** — An MCP server is documented and well-formed

  ```text
  MCP endpoint documented with transport and three named tools; GET returns JSON-RPC method-not-allowed, normal for Streamable HTTP.
  ```

- **Skipped** — A CLI install path is documented

  ```text
  No CLI install path documented; site offers only web pages, API and MCP.
  ```

- **Skipped** — SDK packages resolve on their registries

  ```text
  No SDK or packaged CLI distributed; no registry package to resolve.
  ```

- **Skipped** — Agent skills are published

  ```text
  No agent skills published; site offers API, MCP and llms.txt only.
  ```



[Full report data](https://www.ax-check.com/nycticketfacts.com/report.json)
