---
title: "Citation waiver eligibility + reduction guidance for supplied charges (no case)"
method: POST
path: "/api/citation-check"
---

# Citation waiver eligibility + reduction guidance for supplied charges (no case)

`POST /api/citation-check`

## Request

- Base URL: `https://app.courtdelta.com`
- URL: `https://app.courtdelta.com/api/citation-check`
- Auth: none required

Answers "must I appear in court for this ticket?" from charges the caller supplies — no case number, no court-portal request, so it returns in well under a second. Runs the SAME rules as the citationOptions block on /api/case-lookup-public (both call buildCitationOptions), so the two can never disagree. THE STATUTE DRIVES THE ANSWER: pass the G.S. number printed on the citation; a charge without a parseable statute cannot be classified and is listed in `unclassified`. PASS EVERY CHARGE ON THE CITATION — eligibility is computed across the whole citation, and one mandatory charge forces an appearance for all of them. A charge carrying `viaCompanionCharge:true` is waivable on its own but is mandatory on THIS citation under AOC mandatory-appearance item #39; never say it can be paid off separately or handled by mail, and name the charge that is forcing the appearance. Speeding with no charged speed returns `conditional`, not waivable (over 80 mph, or more than 15 over while over 55, is mandatory); the offense text is parsed for a speed, so 'SPEEDING 85 IN A 65' is enough. A null citationOptions means the charges are not NC Chapter-20 traffic, or include a serious criminal charge (impaired driving, death by vehicle, eluding) or a felony — say so, do not report it as 'no appearance required'. amountDue is always null (there is no case to read a balance from). General guidance, not a case lookup, not legal advice. Also exposed as the `check_traffic_charge` tool on the MCP server.

## Request body

- object
  - `charges` object[], required: Charges from the citation (max 20). Pass them all — eligibility is computed across the citation.
    - `offense` string: Offense line verbatim; parsed for a charged speed, e.g. 'SPEEDING 85 IN A 65'.
    - `statute` string: G.S. section from the citation, e.g. '20-141(J1)'. Required for classification.
    - `degree` string
    - `actual_speed` union
      - string
      - number
    - `speed_limit` union
      - string
      - number
    - `school_zone` string
    - `construction_zone` string
  - `county` string: NC county, with or without ' County'. Decides the online Guide & File path vs in-person District Attorney.
  - `courtDate` string: Court date from the citation (YYYY-MM-DD, or a full ISO timestamp). PASS IT WHEN THE CITATION SHOWS ONE, AND PASS THE REAL ONE. Without it the answer assumes there is no upcoming hearing, returns state 'noCourtDate' with 'contact the Clerk of Superior Court' guidance instead of the resolution options, and cannot report reductionSubmitBy — NC's online reduction request must be filed several business days BEFORE the court date, so a missing date silently hides that cutoff. A date that has already passed (by Eastern wall clock, including earlier the same day) also returns 'noCourtDate': the hearing has been called. A date that is TODAY returns state 'lastDay' — the citation can still be settled with the clerk, but only before the case is called, and there is no time left to file online.

## Response `200`

citationOptions (same shape as on a case lookup), isTraffic, unclassified[], note, disclaimer. citationOptions.state is the resolution path: 'mandatory' | 'conditional' | 'lastDay' | 'onlineWaivable' | 'inPersonWaivable' | 'noCourtDate'. NEVER report 'no appearance needed' on 'lastDay' or 'noCourtDate' — relay howToRequest verbatim. citationOptions.reduction is the online speeding-reduction pre-screen: per-gate pass/fail/unknown, never an eligibility verdict — 'unknown' means the court record cannot decide that gate and MUST NOT be reported as a disqualification. citationOptions.reductionSubmitBy is the date the online request must be submitted by (ISO yyyy-mm-dd); null means UNDETERMINED, never 'no cutoff'. The 10-19 mph band and 80 mph ceiling are AOC/DA program criteria, NOT statute — do not cite a G.S. for them.

## Other responses

- `400`: Missing/empty charges, more than 20 charges, or a non-JSON body

---

[API](https://skmtc.dev/courtdelta/apis/court-delta-public-api.md) · [All operations](https://skmtc.dev/courtdelta/apis/court-delta-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/courtdelta/apis/court-delta-public-api/revisions/813e5b14be89?raw)
