ZEVRA › Integrate the Kennzeichen-Check · Last updated:
Integration in 4 steps

Integrate the Kennzeichen-Check: activate it yourself, no waiting

With Zevra Kennzeichen-Check you integrate the live check for custom plates (Wunschkennzeichen) yourself. You register, copy your key and add one line of code or one call.

To the Kennzeichen-Check · See coverage · Data security at Zevra

How is the Kennzeichen-Check activated?

1

Register

Enter company, contact person, email and website. Registration is open to every company.

Register now →

2

Confirm your email and copy your key

After confirmation, your test key with 100 free checks appears in the customer area. It is shown once.

3

Integrate

For the widget you add one line to your page. For the API you send one call from your system.

4

Try the first check

In the customer area you check a combination and see usage and cost. Then you take out the subscription.

How do I add the widget?

One line before the closing body element is enough. The widget shows the input field, the result and free alternatives and does not take over any styles of your page.

<script src="https://zevra24.de/kc.js"
  data-site-key="IHR_SITE_SCHLUESSEL"
  data-prefix="RE"
  async></script>

The site key is bound to your domain. The secret API key does not belong in a web page.

Example: widget in a dealer page, combination taken with 3 free alternatives

Example: widget in a dealer page, combination taken with 3 free alternatives

How do I call the API?

Every call needs the header X-WKZ-Key with your key. The key belongs in the header, never in the URL and never in the browser.

curl "https://app.zevra24.de/api/kc/v1/search?prefix=RE&letters=AB&numbers=123" \
  -H "X-WKZ-Key: IHR_SCHLUESSEL"
{
 "plate": "RE-AB 123",
 "available": true,
 "reason": "checked",
 "latency_ms": 3771
}

Machine-readable description of the API (OpenAPI 3.1)

Which calls are there?

CallPurpose
GET /searchIs this combination free?
POST /search/batchUp to 50 combinations in one call
GET /offices?code=REWhich registration office belongs to a district code? No key needed.
GET /usageUsage and cost of the current period
POST /reservationsCreate a reservation (in preparation, testable in the sandbox)
GET /reservations/IDQuery the status of a reservation
curl -X POST https://app.zevra24.de/api/kc/v1/search/batch \
  -H "X-WKZ-Key: IHR_SCHLUESSEL" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"prefix":"RE","letters":"AB","numbers":"123"},{"prefix":"RE","letters":"AB","numbers":"124"}]}'

What does the answer mean?

Value of availableMeaning
trueThe authority reports the combination as free
falseThe authority reports it as taken
nullNo statement possible. Never show this as taken.

Which answers are counted?

reasonMeaningCounted
checkedAnswer from the authorityyes
checked_via_twinAnswer from the partner office that manages the codeyes
check_failedThe authority's portal does not answer, or not reliablyno
office_not_queryableThe office does not allow automatic checks; portal_url leads to its portalno
ambiguous_prefixThe code belongs to several offices; repeat with plz or office_idno
unknown_prefixUnknown codeno
invalidThe form of the combination is not permittedno

How do I test in the sandbox at no cost?

In the customer area you create a sandbox key. It starts with wkz_sbx_, reaches no authority and is not charged. The letters of the combination determine the result.

LettersCheckReservation
OKfreereserved
NOtakennot available
ERportal does not answerportal does not answer
FEfreereserved, authority fee of 12,80 € advanced
QQfreestays in the queue

How do I reserve through the API?

You send the combination and the holder's data with the header Idempotency-Key. The same key with the same content returns the same job, never a second reservation. The answer names the job; the status follows by query or webhook.

Real reservation is in preparation. In the sandbox the flow can be tested at launch.

curl -X POST https://app.zevra24.de/api/kc/v1/reservations \
  -H "X-WKZ-Key: wkz_sbx_IHR_SANDBOX_SCHLUESSEL" \
  -H "Idempotency-Key: auftrag-2026-0001" \
  -H "Content-Type: application/json" \
  -d '{"prefix":"RE","letters":"OK","numbers":"123","customerReference":"Auftrag 0001",
       "halter":{"name":"Mustermann","vorname":"Max","plz":"45657","ort":"Recklinghausen"}}'
{
 "id": "RES-7F3K2M9Q",
 "status": "queued",
 "environment": "sandbox",
 "plate": "RE-OK 123",
 "customerReference": "Auftrag 0001",
 "reservationCode": null,
 "authorityFeeAdvancedCents": 0
}

How do I learn the status of a reservation?

In the customer area you store an https address. Zevra sends the event reservation.updated on every status change. Every message is signed with HMAC-SHA256.

  • X-Zevra-Timestamp names the time of the message in seconds.
  • X-Zevra-Signature is HMAC-SHA256 over timestamp, dot and body, with your secret.
  • If your system does not answer with 2xx, Zevra repeats the delivery after 1, 5, 30, 120 and 720 minutes.
import hmac, hashlib

def echt(secret, timestamp, body, signature):
    soll = hmac.new(secret.encode(), f"{timestamp}.{body}".encode(), hashlib.sha256).hexdigest()
    return hmac.compare_digest(soll, signature)

Which errors does the API report?

HTTPerrorMeaning
401unauthorizedKey missing or invalid
403revokedKey is no longer active
403subscription_requiredReservation only with an active subscription
409idem_conflictThe idempotency key was already used with different content
429quota_exhaustedMonthly limit reached; checking pauses until the next period
429rate_limitedMore than 120 requests in one minute

Which response times and limits apply?

  • Response time of a check, measured over 7 days and 7.020 checks: half under 4,2 seconds, 75 % under 7,3 seconds, 95 % under 14,6 seconds.
  • An answer arrives after 58 seconds at the latest. Please set your timeout to 65 seconds.
  • Each key allows 120 requests per minute. A batch search counts per combination.
  • A free plate is not an allocation. The plate is allocated only at registration.

Questions about the integration

Do I need a developer for the widget?
No. The widget is one line of code that you add to your page. For the API you need someone who builds an HTTP call into your system.
How long does activation take?
The test key appears right after you confirm your email address. No approval by Zevra is needed for that.
What happens after the 100 trial checks?
Checking pauses until you take out the subscription. It costs 50 € per month and 0,05 € per check.
Which data is transmitted?
For a check, the district code and the requested combination are transmitted. Only for a reservation are the holder's name and address added. They are stored encrypted and deleted after 30 days.
Does the key belong in the browser?
No. The secret key belongs on your server. For web pages there is the widget with a site key that is bound to your domain.

Ready for the first check?

50 € base fee per month · 0,05 € per check · 100 checks free to try