Product updates

ANPR API Changelog

Notable changes to the ANPR API - endpoints, recognition capability, accuracy and performance.

Current versionv3.2.1

v3.2.1

Latest4 October 2026

More accurate car colour detection.

Improved
  • Car colour detection is more accurate — We have updated how the API recognises a vehicle's colour. The color reported for each car is now noticeably more accurate.

v3.2.0

9 August 2026

A confidence score for the read itself, a detector built to find every vehicle in a frame, and vehicle details on photos that used to return none.

Breaking change
  • Each plate's confidence is now detection_confidence — Same number, clearer name. It is the plate detector's score for the box - "a plate is here" - and it was never a statement about the text: a 0.95 box routinely holds an unreadable plate, and plates found by the cropped-photo fallback carry 0.0 while reading perfectly. The short name invited exactly that mistake, so it is gone. If you gate on it, switch to the read scores below. Everything else about the field is unchanged.

Added
  • How sure the OCR is of the text: text.confidence and text.min_char_confidence — Every plate now reports the mean of its per-character scores and the score of its weakest character. Prefer the minimum when the whole string has to be right - a plate number is not partially correct, and one glyph at 0.31 makes it wrong while the mean still reads 0.88. Both are null when nothing was read, so a "below 0.5" filter never mistakes silence for a bad read. The same two fields appear inside text on /v1/read.

  • all_cars=true now uses a detector built for counting vehicles — Enumerating a forecourt is a different problem from picking the car a photo is of, and it now has its own model - one trained to find every vehicle in a frame, near and far. On a real forecourt frame the previous approach found 1 vehicle; this finds 15. Each vehicle big enough to read is then described in full: its own body type, colour, view angle, brand and model, and its own plate detected and read inside its crop. Vehicles too small to identify are still reported so the count is right, marked described: false with unknown attributes rather than invented ones.

Improved
  • Vehicle details on photos that used to return none — The car detector holds out for near-certainty before it will say "this is the car", which is right for choosing one - and on ordinary customer photos it means body sometimes came back null, with no brand, model, colour or view angle at all, even when the plate read fine. When it abstains, the vehicle-counting model now supplies the car instead. Measured on 14 real customer uploads: body was empty on 5 of them before, 1 after. body.car_source tells you which detector answered.

Notes
  • Running high volume, or need images to stay on your own network? The models are also licensed as a Docker container you run on your own server, with no request limits - reply to any of our emails or write to [email protected].

v3.1.0

29 July 2026

Character-level OCR detail, honest provenance on Arabic strings, a plate-resolution quality band, and plate-logo compositing as a documented endpoint.

Added
  • POST /v1/plate-logo — Detects the plate, removes it with natural lighting and shadow, and warps a supplied logo onto the plate plane. Send two files, file (the car photo) and logo (PNG with transparency gives the cleanest result); opacity (0–1, default 0.95) controls blend strength. Returns the edited image as image/jpeg, with plate box, skew and detection confidence in X-Plate-* response headers, or 422 if no plate is found. Counts as one request against your rate and monthly limits. Also available unauthenticated on the demo API.

  • Per-character OCR confidence — text.characters[] is now filled in. Each entry is one character the model actually read: the glyph, whether it's Arabic or Latin, its own confidence score and its box on the plate. Useful for rejecting weak reads yourself instead of trusting the whole string. The key existed before but was always empty.

  • Know when Arabic was read vs. converted — plate_number_ar_source and plate_code_ar_source say whether an Arabic string was genuinely read off the plate (detected), converted from the Latin read (transliterated), or a mix. Characters that were converted rather than read are deliberately left out of characters[], so a guess is never presented as a reading.

  • /v1/read now returns a confidence — The mean per-character OCR score - the read-quality counterpart to the detection score /v1/detect returns per plate.

  • quality - how many pixels the plate actually got — Plate width, not image width, is what predicts a correct read, so both endpoints now state it outright instead of leaving you to derive it. Every plate carries a quality object with plate_width_px, a band (poor | marginal | good | optimal) and a plain-language note - for example "below 80px - expect reduced accuracy, especially on letters". On /v1/detect the width comes from the detected box (x2 − x1); on /v1/read the crop is the plate, so it is the image width. The bands are our measured accuracy buckets: poor under 80 px, marginal 80–100, good 100–150, optimal 150 and above.

  • Country-specific Arabic letters on /v1/read — The endpoint classifies the plate's country first and uses that country's Latin→Arabic letter table, matching what /v1/detect already did. UAE, Saudi and Oman each have their own mapping; for Qatar, Kuwait and Bahrain no letter is invented where the model didn't read one.

Improved
  • Cropped plate photos now return a result — If you send an image that is already just the plate - no car in frame - detection previously found no plate box and answered "nothing found". The whole image is now classified and read as the plate instead. On a sample of 120 real customer uploads this took the share that come back with a result from 55% to 76%. These plates carry "source": "whole_image_fallback", confidence: 0.0 and a box covering the full image, so you can tell them apart. Images that aren't plates still report zero plates.

  • Significantly better Arabic letter recognition — The OCR model is markedly more accurate on Arabic characters, cutting misreads on Arabic plate codes and numbers.

  • UAE classic plates — Classification and OCR retrained for classic plates. More reliable plate type, emirate and code/number reads on classic formats.

  • Plate detector retrained for better small and angled plate recall.

Changed
  • Free plan is now 100 requests/month — Down from 300. Paid tiers are unchanged. You'll get an email once you pass 90 requests in a month, so a top-up never catches you by surprise.

  • Suspended accounts get a clearer answer — An account that has been suspended now returns 403 with "Your account has been blocked. Please contact [email protected] to restore access." - previously a 401 that looked like a bad API key.

Notes
  • Running high volume, or need images to stay on your own network? The models are also licensed as a Docker container you run on your own server, with no request limits - reply to any of our emails or write to [email protected].

v3.0.0

4 July 2026

Car intelligence as a first-class surface, and controls to pay only for the models you actually need.

Added
  • POST /v1/car — All car attributes, no plate work. Per-model query toggles (body_type, color, position, brand, car_model), all default true; set any to false to skip that model.

  • POST /v1/detect/{country} — Force the country and skip the country classifier. Accepts uae, saudi / saudi_arabia, kuwait, qatar, bahrain, oman.

  • plate_only on /v1/detect — Skips every car model (body, color, position, brand, car model). body returns null.

Performance
  • On a 1280×1440 image: default 1.3s, plate_only 0.54s, country-forced 1.06s, both together 0.30s.

Notes
  • With plate_only, parking direction from camera_id stays "unknown" - the position model is what derives it.

v2.5.0

29 June 2026
Added
  • Car model recognition — 2,003 Brand|Model classes.

  • make_model — The fused source of truth for brand + model. The brand network owns the brand; the model network is re-decoded within that brand. The API refuses to guess when uncertain, rather than returning a confident wrong model (brand_uncertain, decision).

Changed
  • The raw model label is withheld when it names a different brand than a more-confident brand prediction. Read make_model; brand and model are raw per-network signals.

v2.4.0

27 June 2026
Added
  • Car brand recognition — 181 brands, returned as body.brand.

v2.3.0

24 June 2026
Improved
  • 99%+ accuracy on country detection — Across all six supported markets - UAE, Saudi Arabia, Kuwait, Qatar, Bahrain and Oman.

  • Significantly improved plate classification — Emirate, color, type and size are now predicted by a dedicated classifier per country instead of one shared model, which markedly raises accuracy on every market.

Added
  • main_only on /v1/detect — Skip the full-frame pass and return only the main car’s plate.

v2.2.0

1 June 2026
Added
  • Parking management — Podiums → Zones → Cameras, with full CRUD.

  • Movement log — Passing camera_id to /v1/detect records an entry/exit event per detected plate, with direction derived from the camera’s configured entrance and exit views.

  • Parking queries — /api/parking/search (plate substring → current location and history), /api/parking/current, /api/parking/movements.

  • View angle detection — Front / back / side, plus four oriented three-quarter views (semiside_front_left, semiside_front_right, semiside_back_left, semiside_back_right), returned as body.position. A probs_coarse block folds the four back into semi_side for callers that only need the coarse view.

v2.1.0

15 May 2026
Added
  • Car color detection — body.color with name, hex and RGB.

v2.0.0

13 May 2026

Vehicle attributes join plate recognition.

Added
  • Car detection — Locates the main car and returns car_bbox / car_confidence. Plate detection now runs on the car crop as well as the full frame, improving recall on wide shots.

  • Body classification — Sedan, hatchback, wagon, coupe, convertible, SUV, pickup, minivan.

  • POST /v1/body — Body classification on its own.

v1.6.0

12 May 2026
Added
  • POST /v1/read — Read a pre-cropped plate image and get text plus attributes back without running full-frame detection.

v1.5.0

21 February 2026
Improved
  • Country detection accuracy.

v1.4.0

17 February 2026
Breaking change
  • Plate text is now split into a code group and a number group, and the fields were renamed:

  • zone / zone_ar → plate_code_en / plate_code_ar

  • full_plate_en / full_plate_ar → plate_number_en / plate_number_ar

v1.3.0

15 February 2026
Improved
  • OCR model retrained — Substantially better Arabic handling. English and Arabic readings now cross-fill, so a character recognised in one script populates the other.

v1.2.0

14 February 2026
Added
  • Public API documentation and webhook documentation.

  • Explicit English and Arabic formatting for every plate text field.

v1.1.0

2 February 2026
Added
  • Webhooks — Endpoint management, secret rotation, test delivery, and a delivery log with retry history.

  • Usage and logs — Request logs, log detail, log export, usage charts and quota.

  • Playground — Try detection interactively and send feedback on results.

  • Request parameter passthrough on detection endpoints.

v1.0.0

26 January 2026

Public launch.

Added
  • POST /v1/detect — Detect plates in an image and return position, confidence, English and Arabic text, and plate attributes.

  • POST /v1/read — Read a pre-cropped plate.

  • GET /v1/usage — Usage statistics.

  • API key authentication and key management.

Build on the latest version

Every account starts with 100 free credits. No credit card required.