---
title: "NC driver's-licence point comparator (G.S. 20-16(c))"
method: POST
path: "/api/license-points"
---

# NC driver's-licence point comparator (G.S. 20-16(c))

`POST /api/license-points`

## Request

- Base URL: `https://app.courtdelta.com`
- URL: `https://app.courtdelta.com/api/license-points`
- Auth: none required

Returns what each outcome would cost in LICENCE points — convicted as charged, reduced to improper equipment, prayer for judgment, dismissed. No case number, no portal call. LICENCE POINTS ONLY: insurance (SDIP) points are a separate, non-statutory system and are NOT included. THE PJC SCENARIO'S ZERO HAS TWO EXCEPTIONS that must be stated: under G.S. 20-4.01(4a) a prayer for judgment counts as a CONVICTION if it is the third or subsequent within any five-year period, or for ANY PJC where the driver holds a CDL or the offence was in a commercial vehicle — and PJC history is not in court records. `unmatched[]` lists charges that could not be scored and must always be mentioned; a charge that matched the statutory catch-all (`viaCatchAll:true`) is different from one we failed to classify. Non-Chapter-20 charges score nothing (a drug or assault charge is not a traffic offence). Non-moving violations (improper equipment, parking, inspection, registration, adult seat belt) are 0 — which is why 'reduce to improper equipment' is the outcome people seek. SPEEDING TURNS ON ABSOLUTE SPEED: the row is 'speeding in excess of 55 mph = 3', so 50-in-a-45 is 2, not 3; without `actual_speed` a speeding charge cannot be scored. POINTS ARE NOT THE WHOLE CONSEQUENCE: check `excessiveSpeedingSuspension` and report it whenever it applies — G.S. 20-16.1(a) mandates a 30-DAY licence suspension, imposed without a preliminary hearing, on conviction of either more than 15 mph over the limit while ALSO above 55 mph, or any speed above 80 mph. An 85-in-a-65 is only 3 points but also costs the licence for 30 days, so the points alone leave a false impression. Pass `speed_limit` as well as `actual_speed`, or the over-the-limit branch cannot be assessed and the tool abstains (`determinable:false`) rather than implying no suspension. That suspension attaches only ON CONVICTION, so a reduction, PJC or dismissal avoids it — usually a bigger factor than the points. G.S. 20-16.1(b)(1) lets the judge 'when feasible' allow a limited driving privilege on a first conviction only, for purposes reasonably connected with the HEALTH, EDUCATION AND WELFARE of the person and their family — there is no listed 'work' privilege, so do not describe it as one; the permit is valid 30 days from issuance. This endpoint CANNOT tell whether a conviction would be a first (prior convictions are not in the record, so the seven-year look-back cannot be applied) and the privilege is discretionary; present it as something to ask the court about, never as something that will be granted. Do not import limited-privilege rules from the DWI statute (G.S. 20-179.3) — there is no 'hard suspension period' in G.S. 20-16.1. Suspension for ACCUMULATED POINTS is a separate mechanism with TWO thresholds (G.S. 20-16(a)(5)): 12 points in three years, and 8 in the three years after reinstatement — supply `priorPoints`/`recentlyReinstated` or no assessment is made. Setting `commercialLicense` or `outOfStateLicense` makes the tool REFUSE rather than guess. Also exposed as the `estimate_license_points` MCP tool.

## Request body

- object
  - `charges` object[], required
    - `offense` string
    - `statute` string: Chapter 20 statute; anything else scores nothing.
    - `actual_speed` union
      - string
      - number
    - `speed_limit` union
      - string
      - number
  - `priorPoints` integer, nullable: Points already on the licence. Not in any court record.
  - `recentlyReinstated` boolean: Licence reinstated within three years — lowers the suspension threshold to 8.
  - `commercialLicense` boolean
  - `outOfStateLicense` boolean

## Response `200`

matches[], unmatched[], scenarios[], suspension, notApplicable, source

## Other responses

- `400`: Missing/empty charges or more than 20

---

[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)
