No API anywhere
There is no national vanity plate API, and no state publishes one. The only source of truth is each DMV’s public web form.
No state offers an API for vanity plate availability. So PlatePing drives each DMV’s own public tool with a headless browser, and tells you plainly where it can’t.
Live checks 4 state DMVs Format checks 50 states + DC

Is the vanity plate I want still free? To find out, you usually have to find your state’s DMV site, click through its own multi-step form and decode its wording. Most states don’t offer a checker at all.
PlatePing puts that behind one search box. Pick a state, type a plate, and get a clear answer. For four states it’s a live answer from the DMV itself. For the rest it’s a format check against that state’s rules.
There is no national vanity plate API, and no state publishes one. The only source of truth is each DMV’s public web form.
Each form has its own steps, fields, wording and technology, from old ASP.NET postbacks to AJAX fragments.
Some DMV sites sit behind Akamai bot protection, and some vendors forbid automation in their terms.
I mapped each state’s flow in the browser’s network tab before writing any automation.
A wizard: vehicle type, then plate type, then the plate. The result is read from a status indicator and sorted into available, taken or not allowed.
An ASP.NET WebForms page. Submit triggers a full-page postback, so the check waits for navigation and then reads a status label.
Choosing Passenger and clicking “Check Availability” fires an AJAX request that returns an HTML fragment with a success or danger alert.
Redirects across PennDOT hosts, three postback steps, and the plate typed into one input per character.
The four live states sit above the search as one-tap chips. Every other state is one dropdown away, so the fastest path is also the most useful one.
The answer comes with a preview of the plate itself and a US map that zooms into the chosen state. The map is built with react-simple-maps and d3-geo, fitting each state to the frame.
Live checks return Available, Taken or Not allowed. Format checks say Format check passed, never “available,” because PlatePing can’t know that for those states.
A Recent checks page keeps the last 20 lookups in local storage, on the device only. The interface works in light and dark mode.




Each live state has its own API route that opens Chrome, fills in the DMV’s form like a person would, and turns the page into a clean result.
@sparticuz/chromium-min downloads a Chromium build at cold start, kept out of the bundle.Each live state has its own route (/api/check-nh, -fl, -oh, -pa) with the same steps. Errors are never cached.
Live checks run only where a state publishes its own public availability tool. Most states don’t, so they get a format check instead of a guess.
Texas has a checker, but its vendor’s terms forbid robots and scrapers. PlatePing keeps Texas to format checks and notes why in the code.
These are unofficial integrations. If a DMV redesigns its page, the check returns a clear error instead of a wrong answer until the adapter is updated.
PlatePing is live on Vercel, and live checks return real answers from the DMVs in production.
Mapping each form’s requests and responses before writing code made the adapters short and the edge cases predictable.
Timeouts, bot walls and redesigned pages are normal here. Typed results that never throw kept the UI simple.
Saying “format check passed” instead of “available” is less impressive, but it’s the only answer users can trust.
Tell me what you’re building. If I’m not the right fit, I’ll tell you that too.
or email hi@klep.dev