License Plate OCR API

A photo goes in. A plate comes out.

Send any photo — a dashcam frame, a driveway shot, a lot walk. We find the plate, read it, correct it against the issuing state's format, and hand back the serial with ranked states and per-character confidences. Images are never stored.

POST /api/ocr
Request — driveway.jpg
plate · 0.91
ZZC-31V
Response
Plate
ZZC31V
State
New Jersey · 98%
Read confidence
98.5%
Plate type
Passenger
Trusted
true
Runner-up
New York · 1%
Image processed in memory and discarded — never stored.
Try it — free

Read a plate right now.

Drop in a photo — a dashcam frame, a driveway shot, a lot walk — and see exactly what the API returns: the plate, the issuing state, per-character confidence and the bounding box drawn on your image. No account, no key. Your photo is read in memory and never stored.

5 free reads a day · no account needed. Need more? Grab an API key.

100%
Plate detection
96.4%
Exact plate reads
98.7%
Character accuracy

Measured on the industry-standard OpenALPR US benchmark — 222 real-world images, no location hints.

98.8% accuracy on high-confidence reads median processing under 50 ms

Full photos, no cropping

We detect the plate anywhere in the scene — multi-vehicle shots included — so you can send frames exactly as your camera captures them.

State-aware reads

Characters are corrected against the issuing state's plate format, with up to five ranked candidate states — each carrying its own corrected serial.

Images never stored

Photos are processed in memory and discarded the moment the read completes. Only the structured result ever leaves the pipeline.

What you get

Everything you need to act on a read.

Every response is built for automation: enough signal to trust a clean read, and enough detail to build your own capture, review or retry flow around an uncertain one.

Corrected serial

The plate separator-free and corrected against the state's format — the exact string to feed into a lookup — plus a display variant with separators.

Issuing state

The most likely jurisdiction with its confidence, covering all 50 states, DC and US territories.

Ranked state candidates

Up to five alternative states, each with its own corrected serial — perfect for retrying a missed lookup, highest confidence first.

Per-character confidence

A score for every character alongside the whole-string confidence, so you can pinpoint exactly which glyph is uncertain.

Bounding box

Pixel coordinates of the plate in your image with a detection confidence — draw overlays or crop for human review.

Trust signal

A single trusted boolean, backed by explicit warnings that explain why a read wasn't trusted — blur, glare, low state confidence.

Plate type & vanity

Passenger, commercial, motorcycle and more, plus a flag when the plate looks personalized. Vanity plates still resolve to VINs.

Multi-vehicle scenes

Additional plates detected in the same photo, ordered by detection confidence, in the same shape as the primary read.

State suggestions

Pass ordered guesses for the issuing state — e.g. where your camera lives — as a prior that strongly improves accuracy without overriding evidence.

One endpoint

Post a photo.
Parse the read.

A single authenticated POST takes your image as a base64 JSON body or a multipart upload, and returns one clean, predictable JSON document — whatever the photo looks like.

JPEG or PNG up to 15 MB — base64 or multipart file upload
Four unambiguous statuses: ok, low_confidence, no_plate_found, non_us_plate
Optional state suggestions bias reads toward your camera's location
Monthly call allowance on OCR-enabled plans, with simple per-call overage
Full field reference in the docs
200 — /api/ocr
{
  "success": true,
  "status": "ok",
  "request_id": "9e177840deec",
  "image": { "width": 3913, "height": 2678 },
  "plate": {
    "plate": "ZZC31V",
    "plate_display": "ZZC-31V",
    "confidence": 0.985,
    "char_confidences": [0.999, 0.999, 0.996, 0.996, 0.999, 0.995],
    "bbox": [2690, 1753, 3076, 2059],
    "detection_confidence": 0.91,
    "state": {
      "code": "NJ",
      "name": "New Jersey",
      "confidence": 0.98
    },
    "state_candidates": [
      { "code": "NJ", "name": "New Jersey", "confidence": 0.98, "plate": "ZZC31V" },
      { "code": "NY", "name": "New York", "confidence": 0.01, "plate": "ZZC31V" }
    ],
    "plate_type": "passenger",
    "is_vanity_likely": false,
    "warnings": [],
    "trusted": true
  }
}

From pixels to a VIN — on your terms.

OCR is deliberately read-only: it never triggers a plate lookup on its own, so an uncertain read can't silently spend one. When a read comes back trusted, pass it to our License Plate to VIN API to resolve the vehicle.

1

POST /api/ocr

Send the photo. Get the plate, issuing state and confidences back.

2

Check trusted

Clean reads are marked trusted — uncertain ones tell you exactly why.

3

POST /api/convert

Send the plate and state, get the VIN — retry with candidate states if needed.

Plate OCR FAQ

What does the license plate OCR API return?

The corrected plate serial read from the photo, ranked candidate issuing states, per-character confidences and the plate's bounding box — from a single POST with the image as base64 JSON or multipart.

Are uploaded images stored?

No. Images are processed in memory to produce the OCR result and are never stored.

Does OCR automatically run a plate-to-VIN lookup?

No — OCR is read-only by design. You decide when a read is good enough to convert, then call /api/convert explicitly with the returned plate and state, so you're never charged for a lookup you didn't intend.

How is OCR accuracy measured?

Against a benchmark of real-world photos with published scoring conventions — exact-match plate reads and state identification are reported separately. Read the full methodology for details.

Read your first plate today.

Create an account, grab your API key, and turn your first photo into a plate and state in minutes.