Introduction
Free road-trip data API for 160+ countries: fuel prices, route fuel cost, toll roads, visa and vehicle-import rules, holidays, travel hazards, customs, power plugs, currency rates, food cost index, weather scores, events, news and license plates. No API key. Free to use with attribution (CC BY 4.0).
Welcome to the **OpenVan.camp Public API** — open road-trip data for 160+ countries: fuel prices and route fuel cost, toll roads, visa and vehicle-import rules, public and school holidays, travel hazards, customs rules, power plugs, currency rates, food cost index, vanlife weather scores, events, news and license plates. The fuel endpoint returns the current country count in `meta.total_countries`.
Clients: [JavaScript SDK](https://www.npmjs.com/package/@openvancamp/sdk), [Python SDK](https://pypi.org/project/openvan/), [MCP server for AI agents](https://github.com/openvancamp/openvan-camp-public-api/tree/main/mcp-server), [daily CSV snapshots](https://github.com/openvancamp/openvan-travel-data).
## License
All data is available under **[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)**.
You are free to use it in your apps, bots, and articles. **Attribution is required:** show a visible link "Data: OpenVan.camp" to [https://openvan.camp/](https://openvan.camp/) next to the data.
## Base URL
All endpoints are available at `https://openvan.camp`.
## Authentication
No authentication required. All endpoints are public.
## Rate Limits
Public endpoints are limited to **120 requests/minute per IP** (some helper endpoints 30–60/min).
Watch the `X-RateLimit-Limit` / `X-RateLimit-Remaining` response headers; exceeding the limit returns **HTTP 429**.
Data is cached — please don't poll more often than every 10 minutes.
## Attribution
Every response includes an `_attribution` object. Wherever you show the data, render `attribution_html` visibly next to it — this is a license requirement, not a suggestion. If an AI agent writes your code, it should include this link in the generated UI.
```json
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. ..."
}
```
The same is sent in HTTP headers: `X-Attribution-Required` and `Link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"`.
Pass `?source=yoursite.com` to identify your integration — no registration required. Your value is echoed back as `_attribution.your_source`:
```
GET /api/fuel/prices?source=myapp.com
```
<aside>Code examples are shown in the right panel. Switch language with the tabs at the top right.</aside>
Authenticating requests
This API is not authenticated.
Currency Rates
Get currency rates
Returns EUR-base exchange rates. By default the response is limited to ~165 ISO 4217 active fiat currencies that are realistic for travel/fuel-price use cases.
Source chain: national central banks (RUB/TRY/GEL/UAH/BYN/UZS) for precision, then Fawaz API / ExchangeRate-API / Frankfurter / ECB for the long tail.
Refresh: Redis-backed cache stored forever; refreshed by cron every 6 hours.
A separate hourly watchdog alerts in Telegram if cache > 25h old.
HTTP cache: Cache-Control: public, max-age=1800 (edge X-Accel-Expires: 1800) —
30 minutes, well within the 6-hour refresh interval.
Query parameters:
include=all— return the raw upstream set (~340 codes), including crypto, metals and historical/legacy codes (BTC, ETH, USDT, XAU, ATS, DEM, VEF, TRL, ZWL, etc.). Without this parameter, those are filtered out.
Market overrides: the meta.overrides field lists codes whose rate is a manual
market-rate override rather than an official feed. Currently only CUP (Cuba uses
a parallel market rate of ~120 CUP/USD; the official fixing of ~24 CUP/USD does not
reflect retail fuel pricing).
License: CC BY 4.0 — free to use with attribution to OpenVan.camp.
Example request:
curl --request GET \
--get "https://openvan.camp/api/currency/rates" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/currency/rates"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/currency/rates'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success):
{
"success": true,
"rates": {
"EUR": 1,
"USD": 1.16698,
"GBP": 0.855238,
"RUB": 98.2897,
"TRY": 56.1398,
"GEL": 3.0551
},
"meta": {
"count": 152,
"base": "EUR",
"updated_at": "2026-08-27T03:05:15+00:00",
"refreshed_every_hours": 6,
"max_age_seconds": 90000,
"scope": "fiat",
"overrides": {
"CUP": {
"reason": "dual_exchange_rate",
"source": "market_rate_120_cup_per_usd",
"note": "Cuba: the official fixing (~24 CUP/USD) differs from the real market rate (~120 CUP/USD). Fuel prices in Cuban pesos follow the market rate."
}
}
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Customs
List customs jurisdictions and blocs
A bloc (EU, EAEU) holds rules shared by all its members; they apply when entering from outside the bloc.
Example request:
curl --request GET \
--get "https://openvan.camp/api/customs/countries?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/customs/countries"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/customs/countries'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"blocs": {
"EU": {
"members": [
"AT",
"BE"
],
"name": "European Union"
}
},
"jurisdictions": [
{
"code": "EU",
"topics": [
"food",
"cash"
]
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get customs rules on entry into a country by car
The country's own rules and those of its bloc, each with a verbatim official quote and
source link. With from, the country you are coming from is taken into account: there
are no customs inside the EU, and the EU ban on meat and dairy does not apply to
travellers from Switzerland, Norway, Iceland, Andorra, San Marino and Liechtenstein.
A country without data returns an error — that does not mean "nothing is restricted".
Example request:
curl --request GET \
--get "https://openvan.camp/api/customs/countries/PL?from=UA&locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/customs/countries/PL"
);
const params = {
"from": "UA",
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/customs/countries/PL'
params = {
'from': 'UA',
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"country_code": "PL",
"name": "Poland",
"from": "UA",
"covered": true,
"items": [
{
"jurisdiction": "EU",
"topic": "food",
"severity": "ban",
"summary": "No meat or dairy at all (sausage, cheese, milk) — not even in the motorhome fridge.",
"value": {
"meat": false,
"dairy": false
},
"quote": "If you travel to the EU from a non-EU country, you are not allowed to bring any meat or dairy products with you.",
"source_name": "Your Europe (European Commission)",
"source_url": "https://europa.eu/youreurope/citizens/travel/carry/meat-dairy-animal/index_en.htm",
"checked": "2026-10-02"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Events
List events
Returns a paginated list of vanlife events (exhibitions, festivals, meetups, road trips). Filter by status, type, country, or search by name.
Example request:
curl --request GET \
--get "https://openvan.camp/api/events?locale=en&status=upcoming&type=festival&country=DE&search=Adventure+Northside&page=1&limit=30" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"page\": 16,
\"limit\": 22,
\"search\": \"g\"
}"
const url = new URL(
"https://openvan.camp/api/events"
);
const params = {
"locale": "en",
"status": "upcoming",
"type": "festival",
"country": "DE",
"search": "Adventure Northside",
"page": "1",
"limit": "30",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"page": 16,
"limit": 22,
"search": "g"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/events'
payload = {
"page": 16,
"limit": 22,
"search": "g"
}
params = {
'locale': 'en',
'status': 'upcoming',
'type': 'festival',
'country': 'DE',
'search': 'Adventure Northside',
'page': '1',
'limit': '30',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, json=payload, params=params)
response.json()Example response (200, Success):
{
"events": [
{
"id": 960,
"slug": "adventure-northside-2026",
"event_name": "Adventure Northside 2026",
"event_type": "festival",
"event_type_emoji": "🎉",
"start_date": "2026-09-18",
"end_date": "2026-09-20",
"city": "Basthorst",
"country_code": "DE",
"country": {
"code": "de",
"slug": "germany",
"name": "Germany",
"flag_emoji": "🇩🇪"
},
"status": "upcoming",
"url": "https://openvan.camp/en/event/adventure-northside-2026"
}
],
"pagination": {
"total": 48,
"page": 1,
"limit": 30,
"pages": 2
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get event details
Returns full details for a single vanlife event by slug, including location, description, and social links.
Example request:
curl --request GET \
--get "https://openvan.camp/api/event/adventure-northside-2026?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/event/adventure-northside-2026"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/event/adventure-northside-2026'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200, Success):
{
"id": 960,
"slug": "adventure-northside-2026",
"event_name": "Adventure Northside 2026",
"event_type": "festival",
"event_type_emoji": "🎉",
"start_date": "2026-09-18",
"end_date": "2026-09-20",
"city": "Basthorst",
"country_code": "DE",
"description": "Northern Germany's Overland & Self-build expo and festival...",
"official_url": "https://adventurenorthside.de/",
"image_url": "https://...",
"status": "upcoming",
"url": "https://openvan.camp/en/event/adventure-northside-2026"
}
Example response (404, Not found):
{
"message": "No query results for model [App\\Models\\Event]."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get event articles
Returns source articles linked to this event.
When locale is provided, attempts to return only articles in that language.
If no articles match the requested locale, all articles are returned as a fallback
(they may be in the original source language, e.g. Japanese or German).
The language field on each article indicates the actual language of the source.
Example request:
curl --request GET \
--get "https://openvan.camp/api/event/adventure-northside-2026/articles?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/event/adventure-northside-2026/articles"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/event/adventure-northside-2026/articles'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200, Success):
[
{
"id": 1001,
"title": "Adventure Northside 2026 opens its doors",
"image_url": "https://...",
"published_at": "2026-03-11T10:00:00+00:00",
"source_name": "CamperVan Magazine",
"original_url": "https://...",
"language": "en"
}
]
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Fuel Prices
Fuel cost for a route
Routes between 2–10 place names and prices the fuel with the current price of every
country on the way. per_country splits distance, litres and cost by country.
Example request:
curl --request POST \
"https://openvan.camp/api/route-cost" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"waypoints\": [
\"Berlin\",
\"Prague\",
\"Vienna\"
],
\"tank\": 80,
\"cons\": 10,
\"fuel\": \"diesel\",
\"currency\": \"EUR\",
\"locale\": \"en\"
}"
const url = new URL(
"https://openvan.camp/api/route-cost"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"waypoints": [
"Berlin",
"Prague",
"Vienna"
],
"tank": 80,
"cons": 10,
"fuel": "diesel",
"currency": "EUR",
"locale": "en"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/route-cost'
payload = {
"waypoints": [
"Berlin",
"Prague",
"Vienna"
],
"tank": 80,
"cons": 10,
"fuel": "diesel",
"currency": "EUR",
"locale": "en"
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get fuel prices
Returns current retail fuel prices for all supported countries.
Price keys follow FuelGradeCatalog::ORDER plus the legacy premium alias.
Data is updated weekly from 45+ official government sources and independent aggregators.
Prices are weighted averages from multiple sources per country. The sources array
lists all contributing data providers (sorted by trust weight, highest first).
License: CC BY 4.0 — free to use with attribution to OpenVan.camp.
Example request:
curl --request GET \
--get "https://openvan.camp/api/fuel/prices?country=tr%0A%0AThe+%60unit%60+field+is+the+unit+the+country%27s+price+is+published+in%3A+%60liter%60%2C+%60gallon%60%0A%28US%2C+3.78541+l%29+or+%60imperial_gallon%60+%284.54609+l%2C+former+British+territories%29.+Values+are%0Areturned+as+the+source+publishes+them+%E2%80%94+converting+to+litres+is+up+to+the+consumer.%0AA+grade+can+be+priced+in+its+own+currency+%28Venezuela%3A+diesel+in+USD%2C+gasoline+in+VES%29%3A%0Ause+%60currencies%5Bgrade%5D%60+when+present%2C+otherwise+%60currency%60." \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/fuel/prices"
);
const params = {
"country": "tr
The `unit` field is the unit the country's price is published in: `liter`, `gallon`
(US, 3.78541 l) or `imperial_gallon` (4.54609 l, former British territories). Values are
returned as the source publishes them — converting to litres is up to the consumer.
A grade can be priced in its own currency (Venezuela: diesel in USD, gasoline in VES):
use `currencies[grade]` when present, otherwise `currency`.",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/fuel/prices'
params = {
'country': 'tr
The `unit` field is the unit the country's price is published in: `liter`, `gallon`
(US, 3.78541 l) or `imperial_gallon` (4.54609 l, former British territories). Values are
returned as the source publishes them — converting to litres is up to the consumer.
A grade can be priced in its own currency (Venezuela: diesel in USD, gasoline in VES):
use `currencies[grade]` when present, otherwise `currency`.',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200, Success):
{
"success": true,
"data": {
"DE": {
"country_code": "DE",
"country_name": "Germany",
"region": "europe",
"currency": "EUR",
"local_currency": "EUR",
"unit": "liter",
"prices": {
"gasoline_regular": null,
"gasoline": 2.1313,
"gasoline_premium": null,
"gasoline_super": null,
"diesel_regular": null,
"diesel": 2.2845,
"diesel_premium": null,
"lpg": 1.113,
"cng": null,
"e85": null,
"kerosene": null,
"premium": null
},
"price_changes": {
"gasoline_regular": null,
"gasoline": -0.02,
"gasoline_premium": null,
"gasoline_super": null,
"diesel_regular": null,
"diesel": 0.01,
"diesel_premium": null,
"lpg": 0,
"cng": null,
"e85": null,
"kerosene": null,
"premium": null
},
"fetched_at": "2026-08-22T08:50:59+03:00",
"sources": [
"Fuelo.net",
"EU Weekly Oil Bulletin",
"Cargopedia.net"
],
"sources_count": 3,
"is_excluded": false
}
},
"meta": {
"total_countries": 142,
"updated_at": "2026-08-22 08:51:00",
"cache_ttl_hours": 6
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Holidays
List countries with holiday data
Which kinds of data each country has: public — public holidays, school — school
holidays (by region), traffic — official forecast of peak traffic days (currently
France, Bison Futé).
Example request:
curl --request GET \
--get "https://openvan.camp/api/holidays/countries?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/holidays/countries"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/holidays/countries'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"count": 1,
"countries": [
{
"country_code": "FR",
"name": "France",
"public": true,
"school": true,
"traffic": true,
"sources": [
"nager",
"openholidays",
"bisonfute"
]
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get holidays of one country for a period
Entries in date order. School holidays are often regional: nationwide=false and a
regions list (ISO 3166-2 codes). For traffic, details holds the colour of the day
for departures and returns: green, orange, red, black. A country without data returns
an error — that does not mean "no holidays".
Example request:
curl --request GET \
--get "https://openvan.camp/api/holidays/countries/FR?from=2026-07-01&to=2026-08-31&kind=public&locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"from\": \"2026-10-26\",
\"to\": \"2026-10-26\"
}"
const url = new URL(
"https://openvan.camp/api/holidays/countries/FR"
);
const params = {
"from": "2026-07-01",
"to": "2026-08-31",
"kind": "public",
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"from": "2026-10-26",
"to": "2026-10-26"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/holidays/countries/FR'
payload = {
"from": "2026-10-26",
"to": "2026-10-26"
}
params = {
'from': '2026-07-01',
'to': '2026-08-31',
'kind': 'public',
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, json=payload, params=params)
response.json()Example response (200):
{
"country_code": "IT",
"name": "Italy",
"from": "2026-08-01",
"to": "2026-08-31",
"count": 1,
"items": [
{
"country_code": "IT",
"kind": "public",
"start": "2026-08-15",
"end": "2026-08-15",
"name": "Assumption Day",
"name_en": "Assumption Day",
"name_local": "Ferragosto",
"category": null,
"nationwide": true,
"regions": [],
"details": null,
"source": "nager",
"source_url": "https://date.nager.at/PublicHoliday/Country/IT"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
License Plates
List countries
Countries whose license plates are available: international code, plate size, example plate, how the region is shown and ready image URLs of the example.
License: data CC BY 4.0 — free to use with attribution to OpenVan.camp.
Plate images carry the license of the plate typeface (glyphs_license).
Example request:
curl --request GET \
--get "https://openvan.camp/api/plates?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/plates"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/plates'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: max-age=300, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 119
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"success": true,
"data": [
{
"country_code": "AF",
"country_name": "Afghanistan",
"intl_code": "AFG",
"region_marking": "mixed",
"size_mm": [
340,
150
],
"example": {
"number": "5 11585",
"region": "KBL",
"formatted": "5 11585 KBL",
"image": {
"svg": "https://openvan.camp/api/plates/af/plate.svg?number=5+11585®ion=KBL&v=7476f0f0",
"png": "https://openvan.camp/api/plates/af/plate.png?number=5+11585®ion=KBL&v=7476f0f0"
}
},
"regions_count": 34,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/afghanistan"
},
{
"country_code": "AL",
"country_name": "Albania",
"intl_code": "AL",
"region_marking": "legacy_only",
"size_mm": [
520,
110
],
"example": {
"number": "AB 115 XX",
"region": "",
"formatted": "AB 115 XX",
"image": {
"svg": "https://openvan.camp/api/plates/al/plate.svg?number=AB+115+XX&v=ea085827",
"png": "https://openvan.camp/api/plates/al/plate.png?number=AB+115+XX&v=ea085827"
}
},
"regions_count": 36,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/albania"
},
{
"country_code": "DZ",
"country_name": "Algeria",
"intl_code": "DZ",
"region_marking": "suffix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "56789 120 34",
"region": "",
"formatted": "56789 120 34",
"image": {
"svg": "https://openvan.camp/api/plates/dz/plate.svg?number=56789+120+34&v=0d8c9779",
"png": "https://openvan.camp/api/plates/dz/plate.png?number=56789+120+34&v=0d8c9779"
}
},
"regions_count": 58,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/algeria"
},
{
"country_code": "AD",
"country_name": "Andorra",
"intl_code": "AND",
"region_marking": "none",
"size_mm": [
440,
150
],
"example": {
"number": "B0944",
"region": "",
"formatted": "B0944",
"image": {
"svg": "https://openvan.camp/api/plates/ad/plate.svg?number=B0944&v=805777b3",
"png": "https://openvan.camp/api/plates/ad/plate.png?number=B0944&v=805777b3"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/andorra"
},
{
"country_code": "AO",
"country_name": "Angola",
"intl_code": null,
"region_marking": "legacy_only",
"size_mm": [
520,
110
],
"example": {
"number": "LD-38-75-CL",
"region": "",
"formatted": "LD-38-75-CL",
"image": {
"svg": "https://openvan.camp/api/plates/ao/plate.svg?number=LD-38-75-CL&v=7225cb72",
"png": "https://openvan.camp/api/plates/ao/plate.png?number=LD-38-75-CL&v=7225cb72"
}
},
"regions_count": 5,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/angola"
},
{
"country_code": "AG",
"country_name": "Antigua and Barbuda",
"intl_code": null,
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "A 1587",
"region": "",
"formatted": "A 1587",
"image": {
"svg": "https://openvan.camp/api/plates/ag/plate.svg?number=A+1587&v=ffe51383",
"png": "https://openvan.camp/api/plates/ag/plate.png?number=A+1587&v=ffe51383"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/antigua-and-barbuda"
},
{
"country_code": "AR",
"country_name": "Argentina",
"intl_code": "RA",
"region_marking": "legacy_only",
"size_mm": [
400,
130
],
"example": {
"number": "AJ 707 RU",
"region": "",
"formatted": "AJ 707 RU",
"image": {
"svg": "https://openvan.camp/api/plates/ar/plate.svg?number=AJ+707+RU&v=a84168ad",
"png": "https://openvan.camp/api/plates/ar/plate.png?number=AJ+707+RU&v=a84168ad"
}
},
"regions_count": 24,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/argentina"
},
{
"country_code": "AM",
"country_name": "Armenia",
"intl_code": "AM",
"region_marking": "prefix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "77 LU 555",
"region": "",
"formatted": "77 LU 555",
"image": {
"svg": "https://openvan.camp/api/plates/am/plate.svg?number=77+LU+555&v=dcc25a78",
"png": "https://openvan.camp/api/plates/am/plate.png?number=77+LU+555&v=dcc25a78"
}
},
"regions_count": 12,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/armenia"
},
{
"country_code": "AU",
"country_name": "Australia",
"intl_code": "AUS",
"region_marking": "text_name",
"size_mm": [
372,
134
],
"example": {
"number": "CB·33·GO",
"region": "NSW",
"formatted": "CB·33·GO NSW",
"image": {
"svg": "https://openvan.camp/api/plates/au/plate.svg?number=CB%C2%B733%C2%B7GO®ion=NSW&v=ac7c71f3",
"png": "https://openvan.camp/api/plates/au/plate.png?number=CB%C2%B733%C2%B7GO®ion=NSW&v=ac7c71f3"
}
},
"regions_count": 9,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/australia"
},
{
"country_code": "AT",
"country_name": "Austria",
"intl_code": "A",
"region_marking": "prefix_letters",
"size_mm": [
520,
120
],
"example": {
"number": "GB 471AP",
"region": "",
"formatted": "GB 471AP",
"image": {
"svg": "https://openvan.camp/api/plates/at/plate.svg?number=GB+471AP&v=04e422a2",
"png": "https://openvan.camp/api/plates/at/plate.png?number=GB+471AP&v=04e422a2"
}
},
"regions_count": 106,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/austria"
},
{
"country_code": "AZ",
"country_name": "Azerbaijan",
"intl_code": "AZ",
"region_marking": "prefix_digits",
"size_mm": [
520,
112
],
"example": {
"number": "09-BR-763",
"region": "",
"formatted": "09-BR-763",
"image": {
"svg": "https://openvan.camp/api/plates/az/plate.svg?number=09-BR-763&v=fc20e21b",
"png": "https://openvan.camp/api/plates/az/plate.png?number=09-BR-763&v=fc20e21b"
}
},
"regions_count": 74,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/azerbaijan"
},
{
"country_code": "BS",
"country_name": "Bahamas",
"intl_code": "BS",
"region_marking": "text_name",
"size_mm": [
305,
152
],
"example": {
"number": "1521",
"region": "ABACO",
"formatted": "1521 ABACO",
"image": {
"svg": "https://openvan.camp/api/plates/bs/plate.svg?number=1521®ion=ABACO&v=ada69d6d",
"png": "https://openvan.camp/api/plates/bs/plate.png?number=1521®ion=ABACO&v=ada69d6d"
}
},
"regions_count": 12,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/bahamas"
},
{
"country_code": "BH",
"country_name": "Bahrain",
"intl_code": "BRN",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "568",
"region": "",
"formatted": "568",
"image": {
"svg": "https://openvan.camp/api/plates/bh/plate.svg?number=568&v=71f740e6",
"png": "https://openvan.camp/api/plates/bh/plate.png?number=568&v=71f740e6"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/bahrain"
},
{
"country_code": "BD",
"country_name": "Bangladesh",
"intl_code": "BD",
"region_marking": "text_name",
"size_mm": [
330,
165
],
"example": {
"number": "GA 31-9957",
"region": "DHAKA METRO",
"formatted": "GA 31-9957 DHAKA METRO",
"image": {
"svg": "https://openvan.camp/api/plates/bd/plate.svg?number=GA+31-9957®ion=DHAKA+METRO&v=0e11bd04",
"png": "https://openvan.camp/api/plates/bd/plate.png?number=GA+31-9957®ion=DHAKA+METRO&v=0e11bd04"
}
},
"regions_count": 70,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/bangladesh"
},
{
"country_code": "BB",
"country_name": "Barbados",
"intl_code": "BDS",
"region_marking": "prefix_letters",
"size_mm": [
520,
111
],
"example": {
"number": "X5706",
"region": "",
"formatted": "X5706",
"image": {
"svg": "https://openvan.camp/api/plates/bb/plate.svg?number=X5706&v=3aa5e243",
"png": "https://openvan.camp/api/plates/bb/plate.png?number=X5706&v=3aa5e243"
}
},
"regions_count": 11,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/barbados"
},
{
"country_code": "BY",
"country_name": "Belarus",
"intl_code": "BY",
"region_marking": "separate_field",
"size_mm": [
520,
110
],
"example": {
"number": "8682 АХ",
"region": "3",
"formatted": "8682 АХ 3",
"image": {
"svg": "https://openvan.camp/api/plates/by/plate.svg?number=8682+%D0%90%D0%A5®ion=3&v=34246fc9",
"png": "https://openvan.camp/api/plates/by/plate.png?number=8682+%D0%90%D0%A5®ion=3&v=34246fc9"
}
},
"regions_count": 7,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/belarus"
},
{
"country_code": "BE",
"country_name": "Belgium",
"intl_code": "B",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "1-ABC-123",
"region": "",
"formatted": "1-ABC-123",
"image": {
"svg": "https://openvan.camp/api/plates/be/plate.svg?number=1-ABC-123&v=e18a7e8a",
"png": "https://openvan.camp/api/plates/be/plate.png?number=1-ABC-123&v=e18a7e8a"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/belgium"
},
{
"country_code": "BZ",
"country_name": "Belize",
"intl_code": "BH",
"region_marking": "prefix_letters",
"size_mm": [
305,
152
],
"example": {
"number": "C1942",
"region": "BMP",
"formatted": "C1942 BMP",
"image": {
"svg": "https://openvan.camp/api/plates/bz/plate.svg?number=C1942®ion=BMP&v=9d1656b6",
"png": "https://openvan.camp/api/plates/bz/plate.png?number=C1942®ion=BMP&v=9d1656b6"
}
},
"regions_count": 6,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/belize"
},
{
"country_code": "BJ",
"country_name": "Benin",
"intl_code": "DY",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "AE 8888",
"region": "",
"formatted": "AE 8888",
"image": {
"svg": "https://openvan.camp/api/plates/bj/plate.svg?number=AE+8888&v=4e5c9084",
"png": "https://openvan.camp/api/plates/bj/plate.png?number=AE+8888&v=4e5c9084"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/benin"
},
{
"country_code": "BT",
"country_name": "Bhutan",
"intl_code": null,
"region_marking": "mixed",
"size_mm": [
340,
125
],
"example": {
"number": "BP-2-A7662",
"region": "",
"formatted": "BP-2-A7662",
"image": {
"svg": "https://openvan.camp/api/plates/bt/plate.svg?number=BP-2-A7662&v=5f9f10a6",
"png": "https://openvan.camp/api/plates/bt/plate.png?number=BP-2-A7662&v=5f9f10a6"
}
},
"regions_count": 4,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/bhutan"
},
{
"country_code": "BA",
"country_name": "Bih",
"intl_code": "BIH",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "M48-E-415",
"region": "",
"formatted": "M48-E-415",
"image": {
"svg": "https://openvan.camp/api/plates/ba/plate.svg?number=M48-E-415&v=29fb0a49",
"png": "https://openvan.camp/api/plates/ba/plate.png?number=M48-E-415&v=29fb0a49"
}
},
"regions_count": 22,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/bosnia-and-herzegovina"
},
{
"country_code": "BO",
"country_name": "Bolivia",
"intl_code": "BOL",
"region_marking": "separate_field",
"size_mm": [
305,
152
],
"example": {
"number": "1852PHD",
"region": "L",
"formatted": "1852PHD L",
"image": {
"svg": "https://openvan.camp/api/plates/bo/plate.svg?number=1852PHD®ion=L&v=73ccb13b",
"png": "https://openvan.camp/api/plates/bo/plate.png?number=1852PHD®ion=L&v=73ccb13b"
}
},
"regions_count": 9,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/bolivia"
},
{
"country_code": "BW",
"country_name": "Botswana",
"intl_code": "BW",
"region_marking": "none",
"size_mm": [
520,
113
],
"example": {
"number": "B 962 ATH",
"region": "",
"formatted": "B 962 ATH",
"image": {
"svg": "https://openvan.camp/api/plates/bw/plate.svg?number=B+962+ATH&v=9fee2a06",
"png": "https://openvan.camp/api/plates/bw/plate.png?number=B+962+ATH&v=9fee2a06"
}
},
"regions_count": 13,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/botswana"
},
{
"country_code": "BR",
"country_name": "Brazil",
"intl_code": "BR",
"region_marking": "mixed",
"size_mm": [
400,
130
],
"example": {
"number": "BRA2E19",
"region": "",
"formatted": "BRA2E19",
"image": {
"svg": "https://openvan.camp/api/plates/br/plate.svg?number=BRA2E19&v=5112b6dc",
"png": "https://openvan.camp/api/plates/br/plate.png?number=BRA2E19&v=5112b6dc"
}
},
"regions_count": 27,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/brazil"
},
{
"country_code": "BN",
"country_name": "Brunei",
"intl_code": "BRU",
"region_marking": "legacy_only",
"size_mm": [
300,
150
],
"example": {
"number": "KN 232",
"region": "",
"formatted": "KN 232",
"image": {
"svg": "https://openvan.camp/api/plates/bn/plate.svg?number=KN+232&v=3357a2b5",
"png": "https://openvan.camp/api/plates/bn/plate.png?number=KN+232&v=3357a2b5"
}
},
"regions_count": 4,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/brunei"
},
{
"country_code": "BG",
"country_name": "Bulgaria",
"intl_code": "BG",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "CA 1234 AB",
"region": "",
"formatted": "CA 1234 AB",
"image": {
"svg": "https://openvan.camp/api/plates/bg/plate.svg?number=CA+1234+AB&v=f29b4a79",
"png": "https://openvan.camp/api/plates/bg/plate.png?number=CA+1234+AB&v=f29b4a79"
}
},
"regions_count": 28,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/bulgaria"
},
{
"country_code": "BF",
"country_name": "Burkina Faso",
"intl_code": "BF",
"region_marking": "prefix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "11 GK 1844",
"region": "",
"formatted": "11 GK 1844",
"image": {
"svg": "https://openvan.camp/api/plates/bf/plate.svg?number=11+GK+1844&v=e7222b9b",
"png": "https://openvan.camp/api/plates/bf/plate.png?number=11+GK+1844&v=e7222b9b"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/burkina-faso"
},
{
"country_code": "BI",
"country_name": "Burundi",
"intl_code": "RU",
"region_marking": "none",
"size_mm": [
520,
113
],
"example": {
"number": "C 0100 A",
"region": "",
"formatted": "C 0100 A",
"image": {
"svg": "https://openvan.camp/api/plates/bi/plate.svg?number=C+0100+A&v=252283d5",
"png": "https://openvan.camp/api/plates/bi/plate.png?number=C+0100+A&v=252283d5"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/burundi"
},
{
"country_code": "KH",
"country_name": "Cambodia",
"intl_code": "K",
"region_marking": "text_name",
"size_mm": [
520,
155
],
"example": {
"number": "2A-3631",
"region": "BANTEAY MEANCHEY",
"formatted": "2A-3631 BANTEAY MEANCHEY",
"image": {
"svg": "https://openvan.camp/api/plates/kh/plate.svg?number=2A-3631®ion=BANTEAY+MEANCHEY&v=dc8e712a",
"png": "https://openvan.camp/api/plates/kh/plate.png?number=2A-3631®ion=BANTEAY+MEANCHEY&v=dc8e712a"
}
},
"regions_count": 25,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/cambodia"
},
{
"country_code": "CM",
"country_name": "Cameroon",
"intl_code": "CAM",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "LT 780 FQ",
"region": "",
"formatted": "LT 780 FQ",
"image": {
"svg": "https://openvan.camp/api/plates/cm/plate.svg?number=LT+780+FQ&v=89c65bdb",
"png": "https://openvan.camp/api/plates/cm/plate.png?number=LT+780+FQ&v=89c65bdb"
}
},
"regions_count": 10,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/cameroon"
},
{
"country_code": "CA",
"country_name": "Canada",
"intl_code": "CDN",
"region_marking": "text_name",
"size_mm": [
305,
152
],
"example": {
"number": "CBPC 344",
"region": "ON",
"formatted": "CBPC 344 ON",
"image": {
"svg": "https://openvan.camp/api/plates/ca/plate.svg?number=CBPC+344®ion=ON&v=f7867221",
"png": "https://openvan.camp/api/plates/ca/plate.png?number=CBPC+344®ion=ON&v=f7867221"
}
},
"regions_count": 13,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/canada"
},
{
"country_code": "CV",
"country_name": "Cape Verde",
"intl_code": "CV",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "FA-06-86",
"region": "",
"formatted": "FA-06-86",
"image": {
"svg": "https://openvan.camp/api/plates/cv/plate.svg?number=FA-06-86&v=0f29be26",
"png": "https://openvan.camp/api/plates/cv/plate.png?number=FA-06-86&v=0f29be26"
}
},
"regions_count": 11,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/cape-verde"
},
{
"country_code": "CF",
"country_name": "Central African Republic",
"intl_code": "RCA",
"region_marking": "mixed",
"size_mm": [
520,
110
],
"example": {
"number": "BB 534 DG",
"region": "",
"formatted": "BB 534 DG",
"image": {
"svg": "https://openvan.camp/api/plates/cf/plate.svg?number=BB+534+DG&v=7893423a",
"png": "https://openvan.camp/api/plates/cf/plate.png?number=BB+534+DG&v=7893423a"
}
},
"regions_count": 17,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/central-african-republic"
},
{
"country_code": "TD",
"country_name": "Chad",
"intl_code": "TCH",
"region_marking": "prefix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "23V1234A",
"region": "",
"formatted": "23V1234A",
"image": {
"svg": "https://openvan.camp/api/plates/td/plate.svg?number=23V1234A&v=cabcdf59",
"png": "https://openvan.camp/api/plates/td/plate.png?number=23V1234A&v=cabcdf59"
}
},
"regions_count": 24,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/chad"
},
{
"country_code": "CL",
"country_name": "Chile",
"intl_code": "RCH",
"region_marking": "legacy_only",
"size_mm": [
360,
130
],
"example": {
"number": "BB·BB★10",
"region": "",
"formatted": "BB·BB★10",
"image": {
"svg": "https://openvan.camp/api/plates/cl/plate.svg?number=BB%C2%B7BB%E2%98%8510&v=bb8fb1b6",
"png": "https://openvan.camp/api/plates/cl/plate.png?number=BB%C2%B7BB%E2%98%8510&v=bb8fb1b6"
}
},
"regions_count": 11,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/chile"
},
{
"country_code": "CN",
"country_name": "China",
"intl_code": "CHN",
"region_marking": "prefix_letters",
"size_mm": [
440,
140
],
"example": {
"number": "京A·12345",
"region": "",
"formatted": "京A·12345",
"image": {
"svg": "https://openvan.camp/api/plates/cn/plate.svg?number=%E4%BA%ACA%C2%B712345&v=b3c1c83c",
"png": "https://openvan.camp/api/plates/cn/plate.png?number=%E4%BA%ACA%C2%B712345&v=b3c1c83c"
}
},
"regions_count": 406,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/china"
},
{
"country_code": "CO",
"country_name": "Colombia",
"intl_code": "CO",
"region_marking": "text_name",
"size_mm": [
330,
165
],
"example": {
"number": "NOJ 122",
"region": "SEVILLA",
"formatted": "NOJ 122 SEVILLA",
"image": {
"svg": "https://openvan.camp/api/plates/co/plate.svg?number=NOJ+122®ion=SEVILLA&v=ffbbd04b",
"png": "https://openvan.camp/api/plates/co/plate.png?number=NOJ+122®ion=SEVILLA&v=ffbbd04b"
}
},
"regions_count": 26,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/colombia"
},
{
"country_code": "KM",
"country_name": "Comoros",
"intl_code": null,
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "1284 A 73",
"region": "",
"formatted": "1284 A 73",
"image": {
"svg": "https://openvan.camp/api/plates/km/plate.svg?number=1284+A+73&v=b728e571",
"png": "https://openvan.camp/api/plates/km/plate.png?number=1284+A+73&v=b728e571"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/comoros"
},
{
"country_code": "CG",
"country_name": "Congo",
"intl_code": "RCB",
"region_marking": "suffix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "229 EA 2",
"region": "",
"formatted": "229 EA 2",
"image": {
"svg": "https://openvan.camp/api/plates/cg/plate.svg?number=229+EA+2&v=d7c025da",
"png": "https://openvan.camp/api/plates/cg/plate.png?number=229+EA+2&v=d7c025da"
}
},
"regions_count": 14,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/congo"
},
{
"country_code": "CR",
"country_name": "Costa Rica",
"intl_code": "CR",
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "BBB-123",
"region": "",
"formatted": "BBB-123",
"image": {
"svg": "https://openvan.camp/api/plates/cr/plate.svg?number=BBB-123&v=5799efd4",
"png": "https://openvan.camp/api/plates/cr/plate.png?number=BBB-123&v=5799efd4"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/costa-rica"
},
{
"country_code": "HR",
"country_name": "Croatia",
"intl_code": "HR",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "ZD 608-EC",
"region": "",
"formatted": "ZD 608-EC",
"image": {
"svg": "https://openvan.camp/api/plates/hr/plate.svg?number=ZD+608-EC&v=c58e6f0b",
"png": "https://openvan.camp/api/plates/hr/plate.png?number=ZD+608-EC&v=c58e6f0b"
}
},
"regions_count": 34,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/croatia"
},
{
"country_code": "CU",
"country_name": "Cuba",
"intl_code": "CU",
"region_marking": "legacy_only",
"size_mm": [
420,
110
],
"example": {
"number": "P 025 245",
"region": "",
"formatted": "P 025 245",
"image": {
"svg": "https://openvan.camp/api/plates/cu/plate.svg?number=P+025+245&v=9cbb17b6",
"png": "https://openvan.camp/api/plates/cu/plate.png?number=P+025+245&v=9cbb17b6"
}
},
"regions_count": 15,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/cuba"
},
{
"country_code": "CY",
"country_name": "Cyprus",
"intl_code": "CY",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "MAA 001",
"region": "0613",
"formatted": "MAA 001 0613",
"image": {
"svg": "https://openvan.camp/api/plates/cy/plate.svg?number=MAA+001®ion=0613&v=df9ce9f2",
"png": "https://openvan.camp/api/plates/cy/plate.png?number=MAA+001®ion=0613&v=df9ce9f2"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/cyprus"
},
{
"country_code": "CZ",
"country_name": "Czech Republic",
"intl_code": "CZ",
"region_marking": "mixed",
"size_mm": [
520,
110
],
"example": {
"number": "1BA 3236",
"region": "",
"formatted": "1BA 3236",
"image": {
"svg": "https://openvan.camp/api/plates/cz/plate.svg?number=1BA+3236&v=db777dd5",
"png": "https://openvan.camp/api/plates/cz/plate.png?number=1BA+3236&v=db777dd5"
}
},
"regions_count": 90,
"glyphs_license": "sharealike",
"url": "https://openvan.camp/en/license-plates/czech-republic"
},
{
"country_code": "DK",
"country_name": "Denmark",
"intl_code": "DK",
"region_marking": "none",
"size_mm": [
504,
120
],
"example": {
"number": "EW 40 672",
"region": "",
"formatted": "EW 40 672",
"image": {
"svg": "https://openvan.camp/api/plates/dk/plate.svg?number=EW+40+672&v=55d8f4a2",
"png": "https://openvan.camp/api/plates/dk/plate.png?number=EW+40+672&v=55d8f4a2"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/denmark"
},
{
"country_code": "DJ",
"country_name": "Djibouti",
"intl_code": "DJI",
"region_marking": "none",
"size_mm": [
520,
112
],
"example": {
"number": "683D30",
"region": "",
"formatted": "683D30",
"image": {
"svg": "https://openvan.camp/api/plates/dj/plate.svg?number=683D30&v=c10c3388",
"png": "https://openvan.camp/api/plates/dj/plate.png?number=683D30&v=c10c3388"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/djibouti"
},
{
"country_code": "DM",
"country_name": "Dominica",
"intl_code": "WD",
"region_marking": "none",
"size_mm": [
350,
110
],
"example": {
"number": "P570",
"region": "",
"formatted": "P570",
"image": {
"svg": "https://openvan.camp/api/plates/dm/plate.svg?number=P570&v=bf0fa2ff",
"png": "https://openvan.camp/api/plates/dm/plate.png?number=P570&v=bf0fa2ff"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/dominica"
},
{
"country_code": "DO",
"country_name": "Dominican Republic",
"intl_code": "DOM",
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "A554189",
"region": "",
"formatted": "A554189",
"image": {
"svg": "https://openvan.camp/api/plates/do/plate.svg?number=A554189&v=ccdae5f6",
"png": "https://openvan.camp/api/plates/do/plate.png?number=A554189&v=ccdae5f6"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/dominican-republic"
},
{
"country_code": "CD",
"country_name": "DR Congo",
"intl_code": "CGO",
"region_marking": "separate_field",
"size_mm": [
520,
110
],
"example": {
"number": "8762AA 19",
"region": "",
"formatted": "8762AA 19",
"image": {
"svg": "https://openvan.camp/api/plates/cd/plate.svg?number=8762AA+19&v=00ede505",
"png": "https://openvan.camp/api/plates/cd/plate.png?number=8762AA+19&v=00ede505"
}
},
"regions_count": 31,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/dr-congo"
},
{
"country_code": "EC",
"country_name": "Ecuador",
"intl_code": "EC",
"region_marking": "prefix_letters",
"size_mm": [
404,
154
],
"example": {
"number": "PBB-3239",
"region": "",
"formatted": "PBB-3239",
"image": {
"svg": "https://openvan.camp/api/plates/ec/plate.svg?number=PBB-3239&v=1116e6c1",
"png": "https://openvan.camp/api/plates/ec/plate.png?number=PBB-3239&v=1116e6c1"
}
},
"regions_count": 24,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/ecuador"
},
{
"country_code": "EG",
"country_name": "Egypt",
"intl_code": "ET",
"region_marking": "mixed",
"size_mm": [
340,
188
],
"example": {
"number": "2594 سجط",
"region": "",
"formatted": "2594 سجط",
"image": {
"svg": "https://openvan.camp/api/plates/eg/plate.svg?number=2594+%D8%B3%D8%AC%D8%B7&v=7b0eef8a",
"png": "https://openvan.camp/api/plates/eg/plate.png?number=2594+%D8%B3%D8%AC%D8%B7&v=7b0eef8a"
}
},
"regions_count": 27,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/egypt"
},
{
"country_code": "SV",
"country_name": "El Salvador",
"intl_code": "ES",
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "P171-737",
"region": "",
"formatted": "P171-737",
"image": {
"svg": "https://openvan.camp/api/plates/sv/plate.svg?number=P171-737&v=7c214cdf",
"png": "https://openvan.camp/api/plates/sv/plate.png?number=P171-737&v=7c214cdf"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/el-salvador"
},
{
"country_code": "GQ",
"country_name": "Equatorial Guinea",
"intl_code": null,
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "LT-557-G",
"region": "",
"formatted": "LT-557-G",
"image": {
"svg": "https://openvan.camp/api/plates/gq/plate.svg?number=LT-557-G&v=4d263bc6",
"png": "https://openvan.camp/api/plates/gq/plate.png?number=LT-557-G&v=4d263bc6"
}
},
"regions_count": 7,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/equatorial-guinea"
},
{
"country_code": "ER",
"country_name": "Eritrea",
"intl_code": "ER",
"region_marking": "none",
"size_mm": [
340,
186
],
"example": {
"number": "ER-3 01860",
"region": "",
"formatted": "ER-3 01860",
"image": {
"svg": "https://openvan.camp/api/plates/er/plate.svg?number=ER-3+01860&v=510e693f",
"png": "https://openvan.camp/api/plates/er/plate.png?number=ER-3+01860&v=510e693f"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/eritrea"
},
{
"country_code": "EE",
"country_name": "Estonia",
"intl_code": "EST",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "622 MHT",
"region": "",
"formatted": "622 MHT",
"image": {
"svg": "https://openvan.camp/api/plates/ee/plate.svg?number=622+MHT&v=6adbe17a",
"png": "https://openvan.camp/api/plates/ee/plate.png?number=622+MHT&v=6adbe17a"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/estonia"
},
{
"country_code": "SZ",
"country_name": "Eswatini",
"intl_code": "SD",
"region_marking": "mixed",
"size_mm": [
520,
134
],
"example": {
"number": "ASD 351 CM",
"region": "",
"formatted": "ASD 351 CM",
"image": {
"svg": "https://openvan.camp/api/plates/sz/plate.svg?number=ASD+351+CM&v=abba38b6",
"png": "https://openvan.camp/api/plates/sz/plate.png?number=ASD+351+CM&v=abba38b6"
}
},
"regions_count": 4,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/eswatini"
},
{
"country_code": "ET",
"country_name": "Ethiopia",
"intl_code": "ETH",
"region_marking": "legacy_only",
"size_mm": [
280,
185
],
"example": {
"number": "49131",
"region": "AA",
"formatted": "49131 AA",
"image": {
"svg": "https://openvan.camp/api/plates/et/plate.svg?number=49131®ion=AA&v=8c2a5f46",
"png": "https://openvan.camp/api/plates/et/plate.png?number=49131®ion=AA&v=8c2a5f46"
}
},
"regions_count": 12,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/ethiopia"
},
{
"country_code": "FJ",
"country_name": "Fiji",
"intl_code": "FJI",
"region_marking": "none",
"size_mm": [
372,
134
],
"example": {
"number": "FQ·587",
"region": "",
"formatted": "FQ·587",
"image": {
"svg": "https://openvan.camp/api/plates/fj/plate.svg?number=FQ%C2%B7587&v=5debd716",
"png": "https://openvan.camp/api/plates/fj/plate.png?number=FQ%C2%B7587&v=5debd716"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/fiji"
},
{
"country_code": "FI",
"country_name": "Finland",
"intl_code": "FIN",
"region_marking": "none",
"size_mm": [
442,
118
],
"example": {
"number": "KRR-442",
"region": "",
"formatted": "KRR-442",
"image": {
"svg": "https://openvan.camp/api/plates/fi/plate.svg?number=KRR-442&v=cd47c535",
"png": "https://openvan.camp/api/plates/fi/plate.png?number=KRR-442&v=cd47c535"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/finland"
},
{
"country_code": "FR",
"country_name": "France",
"intl_code": "F",
"region_marking": "separate_field",
"size_mm": [
520,
110
],
"example": {
"number": "AB-725-FR",
"region": "75",
"formatted": "AB-725-FR 75",
"image": {
"svg": "https://openvan.camp/api/plates/fr/plate.svg?number=AB-725-FR®ion=75&v=2883a430",
"png": "https://openvan.camp/api/plates/fr/plate.png?number=AB-725-FR®ion=75&v=2883a430"
}
},
"regions_count": 102,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/france"
},
{
"country_code": "GA",
"country_name": "Gabon",
"intl_code": "G",
"region_marking": "legacy_only",
"size_mm": [
520,
112
],
"example": {
"number": "CC-444-AA",
"region": "",
"formatted": "CC-444-AA",
"image": {
"svg": "https://openvan.camp/api/plates/ga/plate.svg?number=CC-444-AA&v=7edbfbac",
"png": "https://openvan.camp/api/plates/ga/plate.png?number=CC-444-AA&v=7edbfbac"
}
},
"regions_count": 16,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/gabon"
},
{
"country_code": "GM",
"country_name": "Gambia",
"intl_code": "WAG",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "BJL 7309 C",
"region": "",
"formatted": "BJL 7309 C",
"image": {
"svg": "https://openvan.camp/api/plates/gm/plate.svg?number=BJL+7309+C&v=1dae23c6",
"png": "https://openvan.camp/api/plates/gm/plate.png?number=BJL+7309+C&v=1dae23c6"
}
},
"regions_count": 7,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/gambia"
},
{
"country_code": "GE",
"country_name": "Georgia",
"intl_code": "GE",
"region_marking": "legacy_only",
"size_mm": [
520,
110
],
"example": {
"number": "QQ-800-QQ",
"region": "",
"formatted": "QQ-800-QQ",
"image": {
"svg": "https://openvan.camp/api/plates/ge/plate.svg?number=QQ-800-QQ&v=c7da120b",
"png": "https://openvan.camp/api/plates/ge/plate.png?number=QQ-800-QQ&v=c7da120b"
}
},
"regions_count": 13,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/georgia"
},
{
"country_code": "DE",
"country_name": "Germany",
"intl_code": "D",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "N NN 203",
"region": "",
"formatted": "N NN 203",
"image": {
"svg": "https://openvan.camp/api/plates/de/plate.svg?number=N+NN+203&v=e7495a04",
"png": "https://openvan.camp/api/plates/de/plate.png?number=N+NN+203&v=e7495a04"
}
},
"regions_count": 744,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/germany"
},
{
"country_code": "GH",
"country_name": "Ghana",
"intl_code": "GH",
"region_marking": "prefix_letters",
"size_mm": [
320,
150
],
"example": {
"number": "GE 1899-18",
"region": "",
"formatted": "GE 1899-18",
"image": {
"svg": "https://openvan.camp/api/plates/gh/plate.svg?number=GE+1899-18&v=efd692f9",
"png": "https://openvan.camp/api/plates/gh/plate.png?number=GE+1899-18&v=efd692f9"
}
},
"regions_count": 11,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/ghana"
},
{
"country_code": "GR",
"country_name": "Greece",
"intl_code": "GR",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "KNK-6949",
"region": "",
"formatted": "KNK-6949",
"image": {
"svg": "https://openvan.camp/api/plates/gr/plate.svg?number=KNK-6949&v=ab55face",
"png": "https://openvan.camp/api/plates/gr/plate.png?number=KNK-6949&v=ab55face"
}
},
"regions_count": 58,
"glyphs_license": "sharealike",
"url": "https://openvan.camp/en/license-plates/greece"
},
{
"country_code": "GD",
"country_name": "Grenada",
"intl_code": "WG",
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "GAA876",
"region": "",
"formatted": "GAA876",
"image": {
"svg": "https://openvan.camp/api/plates/gd/plate.svg?number=GAA876&v=db6ec4a0",
"png": "https://openvan.camp/api/plates/gd/plate.png?number=GAA876&v=db6ec4a0"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/grenada"
},
{
"country_code": "GT",
"country_name": "Guatemala",
"intl_code": "GCA",
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "P123ABC",
"region": "",
"formatted": "P123ABC",
"image": {
"svg": "https://openvan.camp/api/plates/gt/plate.svg?number=P123ABC&v=e86964fb",
"png": "https://openvan.camp/api/plates/gt/plate.png?number=P123ABC&v=e86964fb"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/guatemala"
},
{
"country_code": "GN",
"country_name": "Guinea",
"intl_code": "RG",
"region_marking": "separate_field",
"size_mm": [
520,
110
],
"example": {
"number": "AH 0000",
"region": "02",
"formatted": "AH 0000 02",
"image": {
"svg": "https://openvan.camp/api/plates/gn/plate.svg?number=AH+0000®ion=02&v=93d44bf4",
"png": "https://openvan.camp/api/plates/gn/plate.png?number=AH+0000®ion=02&v=93d44bf4"
}
},
"regions_count": 6,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/guinea"
},
{
"country_code": "GW",
"country_name": "Guinea-Bissau",
"intl_code": "RGB",
"region_marking": "legacy_only",
"size_mm": [
520,
110
],
"example": {
"number": "1133 CC",
"region": "",
"formatted": "1133 CC",
"image": {
"svg": "https://openvan.camp/api/plates/gw/plate.svg?number=1133+CC&v=0ffaa77e",
"png": "https://openvan.camp/api/plates/gw/plate.png?number=1133+CC&v=0ffaa77e"
}
},
"regions_count": 4,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/guinea-bissau"
},
{
"country_code": "GY",
"country_name": "Guyana",
"intl_code": "GUY",
"region_marking": "none",
"size_mm": [
520,
111
],
"example": {
"number": "PCC 9140",
"region": "",
"formatted": "PCC 9140",
"image": {
"svg": "https://openvan.camp/api/plates/gy/plate.svg?number=PCC+9140&v=ef1ac1c5",
"png": "https://openvan.camp/api/plates/gy/plate.png?number=PCC+9140&v=ef1ac1c5"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/guyana"
},
{
"country_code": "HT",
"country_name": "Haiti",
"intl_code": "RH",
"region_marking": "text_name",
"size_mm": [
305,
152
],
"example": {
"number": "AA 88043",
"region": "Ouest",
"formatted": "AA 88043 Ouest",
"image": {
"svg": "https://openvan.camp/api/plates/ht/plate.svg?number=AA+88043®ion=Ouest&v=d3323efb",
"png": "https://openvan.camp/api/plates/ht/plate.png?number=AA+88043®ion=Ouest&v=d3323efb"
}
},
"regions_count": 10,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/haiti"
},
{
"country_code": "HN",
"country_name": "Honduras",
"intl_code": "HN",
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "HAB0123",
"region": "",
"formatted": "HAB0123",
"image": {
"svg": "https://openvan.camp/api/plates/hn/plate.svg?number=HAB0123&v=42792dd2",
"png": "https://openvan.camp/api/plates/hn/plate.png?number=HAB0123&v=42792dd2"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/honduras"
},
{
"country_code": "HK",
"country_name": "Hong Kong",
"intl_code": "HK",
"region_marking": "none",
"size_mm": [
520,
111
],
"example": {
"number": "KT 8264",
"region": "",
"formatted": "KT 8264",
"image": {
"svg": "https://openvan.camp/api/plates/hk/plate.svg?number=KT+8264&v=aa8da224",
"png": "https://openvan.camp/api/plates/hk/plate.png?number=KT+8264&v=aa8da224"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/hong-kong"
},
{
"country_code": "HU",
"country_name": "Hungary",
"intl_code": "H",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "AA AA-123",
"region": "",
"formatted": "AA AA-123",
"image": {
"svg": "https://openvan.camp/api/plates/hu/plate.svg?number=AA+AA-123&v=2bb2d40b",
"png": "https://openvan.camp/api/plates/hu/plate.png?number=AA+AA-123&v=2bb2d40b"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/hungary"
},
{
"country_code": "IS",
"country_name": "Iceland",
"intl_code": "IS",
"region_marking": "legacy_only",
"size_mm": [
520,
110
],
"example": {
"number": "MO R58",
"region": "",
"formatted": "MO R58",
"image": {
"svg": "https://openvan.camp/api/plates/is/plate.svg?number=MO+R58&v=5168ef31",
"png": "https://openvan.camp/api/plates/is/plate.png?number=MO+R58&v=5168ef31"
}
},
"regions_count": 25,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/iceland"
},
{
"country_code": "IN",
"country_name": "India",
"intl_code": "IND",
"region_marking": "prefix_letters",
"size_mm": [
500,
120
],
"example": {
"number": "MH 12 AB 1234",
"region": "",
"formatted": "MH 12 AB 1234",
"image": {
"svg": "https://openvan.camp/api/plates/in/plate.svg?number=MH+12+AB+1234&v=efc06872",
"png": "https://openvan.camp/api/plates/in/plate.png?number=MH+12+AB+1234&v=efc06872"
}
},
"regions_count": 1252,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/india"
},
{
"country_code": "ID",
"country_name": "Indonesia",
"intl_code": "RI",
"region_marking": "prefix_letters",
"size_mm": [
430,
126
],
"example": {
"number": "B 1234 ABC",
"region": "0828",
"formatted": "B 1234 ABC 0828",
"image": {
"svg": "https://openvan.camp/api/plates/id/plate.svg?number=B+1234+ABC®ion=0828&v=fe98fc92",
"png": "https://openvan.camp/api/plates/id/plate.png?number=B+1234+ABC®ion=0828&v=fe98fc92"
}
},
"regions_count": 62,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/indonesia"
},
{
"country_code": "IR",
"country_name": "Iran",
"intl_code": "IR",
"region_marking": "suffix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "12 ب 345 11",
"region": "",
"formatted": "12 ب 345 11",
"image": {
"svg": "https://openvan.camp/api/plates/ir/plate.svg?number=12+%D8%A8+345+11&v=ffdd7207",
"png": "https://openvan.camp/api/plates/ir/plate.png?number=12+%D8%A8+345+11&v=ffdd7207"
}
},
"regions_count": 31,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/iran"
},
{
"country_code": "IQ",
"country_name": "Iraq",
"intl_code": "IRQ",
"region_marking": "prefix_digits",
"size_mm": [
520,
115
],
"example": {
"number": "14 G 34567",
"region": "",
"formatted": "14 G 34567",
"image": {
"svg": "https://openvan.camp/api/plates/iq/plate.svg?number=14+G+34567&v=c41351a8",
"png": "https://openvan.camp/api/plates/iq/plate.png?number=14+G+34567&v=c41351a8"
}
},
"regions_count": 19,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/iraq"
},
{
"country_code": "IE",
"country_name": "Ireland",
"intl_code": "IRL",
"region_marking": "mixed",
"size_mm": [
520,
110
],
"example": {
"number": "201-D-9024",
"region": "",
"formatted": "201-D-9024",
"image": {
"svg": "https://openvan.camp/api/plates/ie/plate.svg?number=201-D-9024&v=26786d9d",
"png": "https://openvan.camp/api/plates/ie/plate.png?number=201-D-9024&v=26786d9d"
}
},
"regions_count": 26,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/ireland"
},
{
"country_code": "IL",
"country_name": "Israel",
"intl_code": "IL",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "403-13-401",
"region": "",
"formatted": "403-13-401",
"image": {
"svg": "https://openvan.camp/api/plates/il/plate.svg?number=403-13-401&v=6b0a905c",
"png": "https://openvan.camp/api/plates/il/plate.png?number=403-13-401&v=6b0a905c"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/israel"
},
{
"country_code": "IT",
"country_name": "Italy",
"intl_code": "I",
"region_marking": "separate_field",
"size_mm": [
520,
110
],
"example": {
"number": "GJ 240JN",
"region": "",
"formatted": "GJ 240JN",
"image": {
"svg": "https://openvan.camp/api/plates/it/plate.svg?number=GJ+240JN&v=2f53b9e2",
"png": "https://openvan.camp/api/plates/it/plate.png?number=GJ+240JN&v=2f53b9e2"
}
},
"regions_count": 111,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/italy"
},
{
"country_code": "CI",
"country_name": "Ivory Coast",
"intl_code": "CI",
"region_marking": "suffix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "AA-573-EA",
"region": "01",
"formatted": "AA-573-EA 01",
"image": {
"svg": "https://openvan.camp/api/plates/ci/plate.svg?number=AA-573-EA®ion=01&v=b05e8ac9",
"png": "https://openvan.camp/api/plates/ci/plate.png?number=AA-573-EA®ion=01&v=b05e8ac9"
}
},
"regions_count": 10,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/ivory-coast"
},
{
"country_code": "JM",
"country_name": "Jamaica",
"intl_code": "JA",
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "7654 HD",
"region": "",
"formatted": "7654 HD",
"image": {
"svg": "https://openvan.camp/api/plates/jm/plate.svg?number=7654+HD&v=d5cae117",
"png": "https://openvan.camp/api/plates/jm/plate.png?number=7654+HD&v=d5cae117"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/jamaica"
},
{
"country_code": "JP",
"country_name": "Japan",
"intl_code": "J",
"region_marking": "text_name",
"size_mm": [
330,
165
],
"example": {
"number": "500 き 12-34",
"region": "多摩",
"formatted": "500 き 12-34 多摩",
"image": {
"svg": "https://openvan.camp/api/plates/jp/plate.svg?number=500+%E3%81%8D+12-34®ion=%E5%A4%9A%E6%91%A9&v=9461e1c2",
"png": "https://openvan.camp/api/plates/jp/plate.png?number=500+%E3%81%8D+12-34®ion=%E5%A4%9A%E6%91%A9&v=9461e1c2"
}
},
"regions_count": 138,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/japan"
},
{
"country_code": "JO",
"country_name": "Jordan",
"intl_code": "HKJ",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "10-23456",
"region": "",
"formatted": "10-23456",
"image": {
"svg": "https://openvan.camp/api/plates/jo/plate.svg?number=10-23456&v=b0c67d6a",
"png": "https://openvan.camp/api/plates/jo/plate.png?number=10-23456&v=b0c67d6a"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/jordan"
},
{
"country_code": "KZ",
"country_name": "Kazakhstan",
"intl_code": "KZ",
"region_marking": "separate_field",
"size_mm": [
520,
112
],
"example": {
"number": "143 ABA 12",
"region": "",
"formatted": "143 ABA 12",
"image": {
"svg": "https://openvan.camp/api/plates/kz/plate.svg?number=143+ABA+12&v=1e57cf1d",
"png": "https://openvan.camp/api/plates/kz/plate.png?number=143+ABA+12&v=1e57cf1d"
}
},
"regions_count": 22,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/kazakhstan"
},
{
"country_code": "KE",
"country_name": "Kenya",
"intl_code": "EAK",
"region_marking": "none",
"size_mm": [
520,
113
],
"example": {
"number": "KDK 101A",
"region": "",
"formatted": "KDK 101A",
"image": {
"svg": "https://openvan.camp/api/plates/ke/plate.svg?number=KDK+101A&v=1d221660",
"png": "https://openvan.camp/api/plates/ke/plate.png?number=KDK+101A&v=1d221660"
}
},
"regions_count": 15,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/kenya"
},
{
"country_code": "KI",
"country_name": "Kiribati",
"intl_code": null,
"region_marking": "prefix_letters",
"size_mm": [
372,
134
],
"example": {
"number": "XMS247",
"region": "",
"formatted": "XMS247",
"image": {
"svg": "https://openvan.camp/api/plates/ki/plate.svg?number=XMS247&v=630a83e9",
"png": "https://openvan.camp/api/plates/ki/plate.png?number=XMS247&v=630a83e9"
}
},
"regions_count": 7,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/kiribati"
},
{
"country_code": "XK",
"country_name": "Kosovo",
"intl_code": "RKS",
"region_marking": "prefix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "01 999-AD",
"region": "",
"formatted": "01 999-AD",
"image": {
"svg": "https://openvan.camp/api/plates/xk/plate.svg?number=01+999-AD&v=4ba38244",
"png": "https://openvan.camp/api/plates/xk/plate.png?number=01+999-AD&v=4ba38244"
}
},
"regions_count": 7,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/kosovo"
},
{
"country_code": "KW",
"country_name": "Kuwait",
"intl_code": "KWT",
"region_marking": "none",
"size_mm": [
340,
170
],
"example": {
"number": "4 66759",
"region": "",
"formatted": "4 66759",
"image": {
"svg": "https://openvan.camp/api/plates/kw/plate.svg?number=4+66759&v=608be80b",
"png": "https://openvan.camp/api/plates/kw/plate.png?number=4+66759&v=608be80b"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/kuwait"
},
{
"country_code": "KG",
"country_name": "Kyrgyzstan",
"intl_code": "KG",
"region_marking": "separate_field",
"size_mm": [
520,
112
],
"example": {
"number": "01 123 ABC",
"region": "",
"formatted": "01 123 ABC",
"image": {
"svg": "https://openvan.camp/api/plates/kg/plate.svg?number=01+123+ABC&v=304021c3",
"png": "https://openvan.camp/api/plates/kg/plate.png?number=01+123+ABC&v=304021c3"
}
},
"regions_count": 9,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/kyrgyzstan"
},
{
"country_code": "LA",
"country_name": "Laos",
"intl_code": "LAO",
"region_marking": "text_name",
"size_mm": [
340,
160
],
"example": {
"number": "ຮຍ 8118",
"region": "VIENTIANE CAPITAL",
"formatted": "ຮຍ 8118 VIENTIANE CAPITAL",
"image": {
"svg": "https://openvan.camp/api/plates/la/plate.svg?number=%E0%BA%AE%E0%BA%8D+8118®ion=VIENTIANE+CAPITAL&v=0bc9a69d",
"png": "https://openvan.camp/api/plates/la/plate.png?number=%E0%BA%AE%E0%BA%8D+8118®ion=VIENTIANE+CAPITAL&v=0bc9a69d"
}
},
"regions_count": 18,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/laos"
},
{
"country_code": "LV",
"country_name": "Latvia",
"intl_code": "LV",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "HN-5867",
"region": "",
"formatted": "HN-5867",
"image": {
"svg": "https://openvan.camp/api/plates/lv/plate.svg?number=HN-5867&v=fd5578c9",
"png": "https://openvan.camp/api/plates/lv/plate.png?number=HN-5867&v=fd5578c9"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/latvia"
},
{
"country_code": "LB",
"country_name": "Lebanon",
"intl_code": "RL",
"region_marking": "prefix_letters",
"size_mm": [
520,
115
],
"example": {
"number": "A 123456",
"region": "",
"formatted": "A 123456",
"image": {
"svg": "https://openvan.camp/api/plates/lb/plate.svg?number=A+123456&v=b86f98f2",
"png": "https://openvan.camp/api/plates/lb/plate.png?number=A+123456&v=b86f98f2"
}
},
"regions_count": 10,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/lebanon"
},
{
"country_code": "LS",
"country_name": "Lesotho",
"intl_code": "LS",
"region_marking": "prefix_letters",
"size_mm": [
520,
148
],
"example": {
"number": "C 5882",
"region": "9095",
"formatted": "C 5882 9095",
"image": {
"svg": "https://openvan.camp/api/plates/ls/plate.svg?number=C+5882®ion=9095&v=b2fffe1c",
"png": "https://openvan.camp/api/plates/ls/plate.png?number=C+5882®ion=9095&v=b2fffe1c"
}
},
"regions_count": 10,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/lesotho"
},
{
"country_code": "LR",
"country_name": "Liberia",
"intl_code": "LB",
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "A13557",
"region": "",
"formatted": "A13557",
"image": {
"svg": "https://openvan.camp/api/plates/lr/plate.svg?number=A13557&v=867de201",
"png": "https://openvan.camp/api/plates/lr/plate.png?number=A13557&v=867de201"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/liberia"
},
{
"country_code": "LY",
"country_name": "Libya",
"intl_code": "LAR",
"region_marking": "prefix_digits",
"size_mm": [
520,
113
],
"example": {
"number": "8 616192",
"region": "",
"formatted": "8 616192",
"image": {
"svg": "https://openvan.camp/api/plates/ly/plate.svg?number=8+616192&v=d43823f0",
"png": "https://openvan.camp/api/plates/ly/plate.png?number=8+616192&v=d43823f0"
}
},
"regions_count": 62,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/libya"
},
{
"country_code": "LI",
"country_name": "Liechtenstein",
"intl_code": "FL",
"region_marking": "none",
"size_mm": [
500,
110
],
"example": {
"number": "FL 40001",
"region": "",
"formatted": "FL 40001",
"image": {
"svg": "https://openvan.camp/api/plates/li/plate.svg?number=FL+40001&v=3f78eac5",
"png": "https://openvan.camp/api/plates/li/plate.png?number=FL+40001&v=3f78eac5"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/liechtenstein"
},
{
"country_code": "LT",
"country_name": "Lithuania",
"intl_code": "LT",
"region_marking": "legacy_only",
"size_mm": [
520,
110
],
"example": {
"number": "ECK 649",
"region": "",
"formatted": "ECK 649",
"image": {
"svg": "https://openvan.camp/api/plates/lt/plate.svg?number=ECK+649&v=8ca8460d",
"png": "https://openvan.camp/api/plates/lt/plate.png?number=ECK+649&v=8ca8460d"
}
},
"regions_count": 10,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/lithuania"
},
{
"country_code": "LU",
"country_name": "Luxembourg",
"intl_code": "L",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "KS 9412",
"region": "",
"formatted": "KS 9412",
"image": {
"svg": "https://openvan.camp/api/plates/lu/plate.svg?number=KS+9412&v=081f5922",
"png": "https://openvan.camp/api/plates/lu/plate.png?number=KS+9412&v=081f5922"
}
},
"regions_count": 0,
"glyphs_license": "sharealike",
"url": "https://openvan.camp/en/license-plates/luxembourg"
},
{
"country_code": "MO",
"country_name": "Macao",
"intl_code": "MO",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "MA-12-34",
"region": "",
"formatted": "MA-12-34",
"image": {
"svg": "https://openvan.camp/api/plates/mo/plate.svg?number=MA-12-34&v=2fdff55d",
"png": "https://openvan.camp/api/plates/mo/plate.png?number=MA-12-34&v=2fdff55d"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/macao"
},
{
"country_code": "MG",
"country_name": "Madagascar",
"intl_code": "RM",
"region_marking": "mixed",
"size_mm": [
520,
110
],
"example": {
"number": "8847 TAK",
"region": "",
"formatted": "8847 TAK",
"image": {
"svg": "https://openvan.camp/api/plates/mg/plate.svg?number=8847+TAK&v=4763f392",
"png": "https://openvan.camp/api/plates/mg/plate.png?number=8847+TAK&v=4763f392"
}
},
"regions_count": 6,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/madagascar"
},
{
"country_code": "MW",
"country_name": "Malawi",
"intl_code": "MW",
"region_marking": "prefix_letters",
"size_mm": [
520,
122
],
"example": {
"number": "BC 5049",
"region": "",
"formatted": "BC 5049",
"image": {
"svg": "https://openvan.camp/api/plates/mw/plate.svg?number=BC+5049&v=48788c4e",
"png": "https://openvan.camp/api/plates/mw/plate.png?number=BC+5049&v=48788c4e"
}
},
"regions_count": 4,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/malawi"
},
{
"country_code": "MY",
"country_name": "Malaysia",
"intl_code": "MAL",
"region_marking": "prefix_letters",
"size_mm": [
520,
112
],
"example": {
"number": "PFQ 5217",
"region": "",
"formatted": "PFQ 5217",
"image": {
"svg": "https://openvan.camp/api/plates/my/plate.svg?number=PFQ+5217&v=6df70ce7",
"png": "https://openvan.camp/api/plates/my/plate.png?number=PFQ+5217&v=6df70ce7"
}
},
"regions_count": 16,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/malaysia"
},
{
"country_code": "MV",
"country_name": "Maldives",
"intl_code": "MV",
"region_marking": "none",
"size_mm": [
330,
175
],
"example": {
"number": "AB1A S8708",
"region": "",
"formatted": "AB1A S8708",
"image": {
"svg": "https://openvan.camp/api/plates/mv/plate.svg?number=AB1A+S8708&v=5afd0e23",
"png": "https://openvan.camp/api/plates/mv/plate.png?number=AB1A+S8708&v=5afd0e23"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/maldives"
},
{
"country_code": "ML",
"country_name": "Mali",
"intl_code": "RMM",
"region_marking": "separate_field",
"size_mm": [
520,
110
],
"example": {
"number": "AB 1234 MD",
"region": "",
"formatted": "AB 1234 MD",
"image": {
"svg": "https://openvan.camp/api/plates/ml/plate.svg?number=AB+1234+MD&v=0c1e4090",
"png": "https://openvan.camp/api/plates/ml/plate.png?number=AB+1234+MD&v=0c1e4090"
}
},
"regions_count": 20,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/mali"
},
{
"country_code": "MT",
"country_name": "Malta",
"intl_code": "M",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "CQZ 774",
"region": "",
"formatted": "CQZ 774",
"image": {
"svg": "https://openvan.camp/api/plates/mt/plate.svg?number=CQZ+774&v=36869774",
"png": "https://openvan.camp/api/plates/mt/plate.png?number=CQZ+774&v=36869774"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/malta"
},
{
"country_code": "MH",
"country_name": "Marshall Islands",
"intl_code": null,
"region_marking": "text_name",
"size_mm": [
305,
152
],
"example": {
"number": "3425",
"region": "",
"formatted": "3425",
"image": {
"svg": "https://openvan.camp/api/plates/mh/plate.svg?number=3425&v=5feb84cb",
"png": "https://openvan.camp/api/plates/mh/plate.png?number=3425&v=5feb84cb"
}
},
"regions_count": 1,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/marshall-islands"
},
{
"country_code": "MR",
"country_name": "Mauritania",
"intl_code": "RIM",
"region_marking": "suffix_digits",
"size_mm": [
520,
112
],
"example": {
"number": "1234AK00",
"region": "",
"formatted": "1234AK00",
"image": {
"svg": "https://openvan.camp/api/plates/mr/plate.svg?number=1234AK00&v=89f7b4c9",
"png": "https://openvan.camp/api/plates/mr/plate.png?number=1234AK00&v=89f7b4c9"
}
},
"regions_count": 13,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/mauritania"
},
{
"country_code": "MU",
"country_name": "Mauritius",
"intl_code": "MS",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "1234 JN 12",
"region": "",
"formatted": "1234 JN 12",
"image": {
"svg": "https://openvan.camp/api/plates/mu/plate.svg?number=1234+JN+12&v=2393eaf2",
"png": "https://openvan.camp/api/plates/mu/plate.png?number=1234+JN+12&v=2393eaf2"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/mauritius"
},
{
"country_code": "MX",
"country_name": "Mexico",
"intl_code": "MEX",
"region_marking": "mixed",
"size_mm": [
305,
152
],
"example": {
"number": "AGS-123-A",
"region": "AGUASCALIENTES",
"formatted": "AGS-123-A AGUASCALIENTES",
"image": {
"svg": "https://openvan.camp/api/plates/mx/plate.svg?number=AGS-123-A®ion=AGUASCALIENTES&v=578db114",
"png": "https://openvan.camp/api/plates/mx/plate.png?number=AGS-123-A®ion=AGUASCALIENTES&v=578db114"
}
},
"regions_count": 32,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/mexico"
},
{
"country_code": "FM",
"country_name": "Micronesia",
"intl_code": null,
"region_marking": "text_name",
"size_mm": [
305,
152
],
"example": {
"number": "2945",
"region": "YAP",
"formatted": "2945 YAP",
"image": {
"svg": "https://openvan.camp/api/plates/fm/plate.svg?number=2945®ion=YAP&v=23a9fd89",
"png": "https://openvan.camp/api/plates/fm/plate.png?number=2945®ion=YAP&v=23a9fd89"
}
},
"regions_count": 4,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/micronesia"
},
{
"country_code": "MD",
"country_name": "Moldova",
"intl_code": "MD",
"region_marking": "legacy_only",
"size_mm": [
520,
112
],
"example": {
"number": "LEL 979",
"region": "",
"formatted": "LEL 979",
"image": {
"svg": "https://openvan.camp/api/plates/md/plate.svg?number=LEL+979&v=8042e216",
"png": "https://openvan.camp/api/plates/md/plate.png?number=LEL+979&v=8042e216"
}
},
"regions_count": 47,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/moldova"
},
{
"country_code": "MC",
"country_name": "Monaco",
"intl_code": "MC",
"region_marking": "none",
"size_mm": [
340,
110
],
"example": {
"number": "179C",
"region": "",
"formatted": "179C",
"image": {
"svg": "https://openvan.camp/api/plates/mc/plate.svg?number=179C&v=610daf87",
"png": "https://openvan.camp/api/plates/mc/plate.png?number=179C&v=610daf87"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/monaco"
},
{
"country_code": "MN",
"country_name": "Mongolia",
"intl_code": "MGL",
"region_marking": "mixed",
"size_mm": [
520,
112
],
"example": {
"number": "0878 УНК",
"region": "",
"formatted": "0878 УНК",
"image": {
"svg": "https://openvan.camp/api/plates/mn/plate.svg?number=0878+%D0%A3%D0%9D%D0%9A&v=55df60fe",
"png": "https://openvan.camp/api/plates/mn/plate.png?number=0878+%D0%A3%D0%9D%D0%9A&v=55df60fe"
}
},
"regions_count": 22,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/mongolia"
},
{
"country_code": "ME",
"country_name": "Montenegro",
"intl_code": "MNE",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "NK AA034",
"region": "",
"formatted": "NK AA034",
"image": {
"svg": "https://openvan.camp/api/plates/me/plate.svg?number=NK+AA034&v=928236d3",
"png": "https://openvan.camp/api/plates/me/plate.png?number=NK+AA034&v=928236d3"
}
},
"regions_count": 25,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/montenegro"
},
{
"country_code": "MA",
"country_name": "Morocco",
"intl_code": "MA",
"region_marking": "suffix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "62407 A 34",
"region": "",
"formatted": "62407 A 34",
"image": {
"svg": "https://openvan.camp/api/plates/ma/plate.svg?number=62407+A+34&v=078b44ad",
"png": "https://openvan.camp/api/plates/ma/plate.png?number=62407+A+34&v=078b44ad"
}
},
"regions_count": 75,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/morocco"
},
{
"country_code": "MZ",
"country_name": "Mozambique",
"intl_code": "MOC",
"region_marking": "separate_field",
"size_mm": [
340,
170
],
"example": {
"number": "ACZ 259 MC",
"region": "",
"formatted": "ACZ 259 MC",
"image": {
"svg": "https://openvan.camp/api/plates/mz/plate.svg?number=ACZ+259+MC&v=dbbb2c82",
"png": "https://openvan.camp/api/plates/mz/plate.png?number=ACZ+259+MC&v=dbbb2c82"
}
},
"regions_count": 11,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/mozambique"
},
{
"country_code": "MM",
"country_name": "Myanmar",
"intl_code": "MYA",
"region_marking": "separate_field",
"size_mm": [
330,
150
],
"example": {
"number": "1P-3574",
"region": "MDY-14",
"formatted": "1P-3574 MDY-14",
"image": {
"svg": "https://openvan.camp/api/plates/mm/plate.svg?number=1P-3574®ion=MDY-14&v=03ed4ab9",
"png": "https://openvan.camp/api/plates/mm/plate.png?number=1P-3574®ion=MDY-14&v=03ed4ab9"
}
},
"regions_count": 15,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/myanmar"
},
{
"country_code": "NA",
"country_name": "Namibia",
"intl_code": "NAM",
"region_marking": "separate_field",
"size_mm": [
440,
120
],
"example": {
"number": "N 123-456 W",
"region": "",
"formatted": "N 123-456 W",
"image": {
"svg": "https://openvan.camp/api/plates/na/plate.svg?number=N+123-456+W&v=bd0e183a",
"png": "https://openvan.camp/api/plates/na/plate.png?number=N+123-456+W&v=bd0e183a"
}
},
"regions_count": 43,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/namibia"
},
{
"country_code": "NR",
"country_name": "Nauru",
"intl_code": "NAU",
"region_marking": "none",
"size_mm": [
372,
134
],
"example": {
"number": "AAA 595",
"region": "",
"formatted": "AAA 595",
"image": {
"svg": "https://openvan.camp/api/plates/nr/plate.svg?number=AAA+595&v=a911a052",
"png": "https://openvan.camp/api/plates/nr/plate.png?number=AAA+595&v=a911a052"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/nauru"
},
{
"country_code": "NP",
"country_name": "Nepal",
"intl_code": "NEP",
"region_marking": "text_name",
"size_mm": [
340,
186
],
"example": {
"number": "BA 12 CHA 3456",
"region": "",
"formatted": "BA 12 CHA 3456",
"image": {
"svg": "https://openvan.camp/api/plates/np/plate.svg?number=BA+12+CHA+3456&v=e4a5a3fd",
"png": "https://openvan.camp/api/plates/np/plate.png?number=BA+12+CHA+3456&v=e4a5a3fd"
}
},
"regions_count": 21,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/nepal"
},
{
"country_code": "NL",
"country_name": "Netherlands",
"intl_code": "NL",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "4-KSK-02",
"region": "",
"formatted": "4-KSK-02",
"image": {
"svg": "https://openvan.camp/api/plates/nl/plate.svg?number=4-KSK-02&v=f8ca1e25",
"png": "https://openvan.camp/api/plates/nl/plate.png?number=4-KSK-02&v=f8ca1e25"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/netherlands"
},
{
"country_code": "NZ",
"country_name": "New Zealand",
"intl_code": "NZ",
"region_marking": "none",
"size_mm": [
384,
122
],
"example": {
"number": "FAR441",
"region": "",
"formatted": "FAR441",
"image": {
"svg": "https://openvan.camp/api/plates/nz/plate.svg?number=FAR441&v=a8f3c777",
"png": "https://openvan.camp/api/plates/nz/plate.png?number=FAR441&v=a8f3c777"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/new-zealand"
},
{
"country_code": "NI",
"country_name": "Nicaragua",
"intl_code": "NIC",
"region_marking": "prefix_letters",
"size_mm": [
305,
152
],
"example": {
"number": "M 123 456",
"region": "",
"formatted": "M 123 456",
"image": {
"svg": "https://openvan.camp/api/plates/ni/plate.svg?number=M+123+456&v=bde2da6d",
"png": "https://openvan.camp/api/plates/ni/plate.png?number=M+123+456&v=bde2da6d"
}
},
"regions_count": 17,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/nicaragua"
},
{
"country_code": "NE",
"country_name": "Niger",
"intl_code": "RN",
"region_marking": "mixed",
"size_mm": [
520,
110
],
"example": {
"number": "8H 7654",
"region": "",
"formatted": "8H 7654",
"image": {
"svg": "https://openvan.camp/api/plates/ne/plate.svg?number=8H+7654&v=380ca9d2",
"png": "https://openvan.camp/api/plates/ne/plate.png?number=8H+7654&v=380ca9d2"
}
},
"regions_count": 8,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/niger"
},
{
"country_code": "NG",
"country_name": "Nigeria",
"intl_code": "WAN",
"region_marking": "mixed",
"size_mm": [
310,
150
],
"example": {
"number": "APP-456CV",
"region": "LAGOS",
"formatted": "APP-456CV LAGOS",
"image": {
"svg": "https://openvan.camp/api/plates/ng/plate.svg?number=APP-456CV®ion=LAGOS&v=90bd0138",
"png": "https://openvan.camp/api/plates/ng/plate.png?number=APP-456CV®ion=LAGOS&v=90bd0138"
}
},
"regions_count": 37,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/nigeria"
},
{
"country_code": "KP",
"country_name": "North Korea",
"intl_code": null,
"region_marking": "text_name",
"size_mm": [
520,
147
],
"example": {
"number": "74-1551",
"region": "",
"formatted": "74-1551",
"image": {
"svg": "https://openvan.camp/api/plates/kp/plate.svg?number=74-1551&v=70ca3a6c",
"png": "https://openvan.camp/api/plates/kp/plate.png?number=74-1551&v=70ca3a6c"
}
},
"regions_count": 13,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/north-korea"
},
{
"country_code": "MK",
"country_name": "North Macedonia",
"intl_code": "NMK",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "OH 1731 AF",
"region": "",
"formatted": "OH 1731 AF",
"image": {
"svg": "https://openvan.camp/api/plates/mk/plate.svg?number=OH+1731+AF&v=cd18bc09",
"png": "https://openvan.camp/api/plates/mk/plate.png?number=OH+1731+AF&v=cd18bc09"
}
},
"regions_count": 34,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/north-macedonia"
},
{
"country_code": "NO",
"country_name": "Norway",
"intl_code": "N",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "DN 96650",
"region": "",
"formatted": "DN 96650",
"image": {
"svg": "https://openvan.camp/api/plates/no/plate.svg?number=DN+96650&v=b4d8f8c5",
"png": "https://openvan.camp/api/plates/no/plate.png?number=DN+96650&v=b4d8f8c5"
}
},
"regions_count": 74,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/norway"
},
{
"country_code": "OM",
"country_name": "Oman",
"intl_code": "OM",
"region_marking": "legacy_only",
"size_mm": [
520,
112
],
"example": {
"number": "91169 A",
"region": "",
"formatted": "91169 A",
"image": {
"svg": "https://openvan.camp/api/plates/om/plate.svg?number=91169+A&v=c98db04a",
"png": "https://openvan.camp/api/plates/om/plate.png?number=91169+A&v=c98db04a"
}
},
"regions_count": 6,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/oman"
},
{
"country_code": "PK",
"country_name": "Pakistan",
"intl_code": "PK",
"region_marking": "text_name",
"size_mm": [
330,
165
],
"example": {
"number": "AB-123",
"region": "",
"formatted": "AB-123",
"image": {
"svg": "https://openvan.camp/api/plates/pk/plate.svg?number=AB-123&v=55bfc805",
"png": "https://openvan.camp/api/plates/pk/plate.png?number=AB-123&v=55bfc805"
}
},
"regions_count": 7,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/pakistan"
},
{
"country_code": "PW",
"country_name": "Palau",
"intl_code": null,
"region_marking": "text_name",
"size_mm": [
305,
152
],
"example": {
"number": "18374",
"region": "",
"formatted": "18374",
"image": {
"svg": "https://openvan.camp/api/plates/pw/plate.svg?number=18374&v=1ac41113",
"png": "https://openvan.camp/api/plates/pw/plate.png?number=18374&v=1ac41113"
}
},
"regions_count": 16,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/palau"
},
{
"country_code": "PS",
"country_name": "Palestine",
"intl_code": null,
"region_marking": "mixed",
"size_mm": [
520,
112
],
"example": {
"number": "6-1234-95",
"region": "",
"formatted": "6-1234-95",
"image": {
"svg": "https://openvan.camp/api/plates/ps/plate.svg?number=6-1234-95&v=eb9c340c",
"png": "https://openvan.camp/api/plates/ps/plate.png?number=6-1234-95&v=eb9c340c"
}
},
"regions_count": 19,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/palestine"
},
{
"country_code": "PA",
"country_name": "Panama",
"intl_code": "PA",
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "AB1234",
"region": "2026",
"formatted": "AB1234 2026",
"image": {
"svg": "https://openvan.camp/api/plates/pa/plate.svg?number=AB1234®ion=2026&v=62ed1e8f",
"png": "https://openvan.camp/api/plates/pa/plate.png?number=AB1234®ion=2026&v=62ed1e8f"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/panama"
},
{
"country_code": "PG",
"country_name": "Papua New Guinea",
"intl_code": "PNG",
"region_marking": "prefix_letters",
"size_mm": [
372,
134
],
"example": {
"number": "BAA·000",
"region": "",
"formatted": "BAA·000",
"image": {
"svg": "https://openvan.camp/api/plates/pg/plate.svg?number=BAA%C2%B7000&v=a23460cc",
"png": "https://openvan.camp/api/plates/pg/plate.png?number=BAA%C2%B7000&v=a23460cc"
}
},
"regions_count": 22,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/papua-new-guinea"
},
{
"country_code": "PY",
"country_name": "Paraguay",
"intl_code": "PY",
"region_marking": "legacy_only",
"size_mm": [
400,
130
],
"example": {
"number": "AAMO 061",
"region": "",
"formatted": "AAMO 061",
"image": {
"svg": "https://openvan.camp/api/plates/py/plate.svg?number=AAMO+061&v=256b75c6",
"png": "https://openvan.camp/api/plates/py/plate.png?number=AAMO+061&v=256b75c6"
}
},
"regions_count": 18,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/paraguay"
},
{
"country_code": "PE",
"country_name": "Peru",
"intl_code": "PE",
"region_marking": "prefix_letters",
"size_mm": [
305,
152
],
"example": {
"number": "F5U-597",
"region": "",
"formatted": "F5U-597",
"image": {
"svg": "https://openvan.camp/api/plates/pe/plate.svg?number=F5U-597&v=f1b3921f",
"png": "https://openvan.camp/api/plates/pe/plate.png?number=F5U-597&v=f1b3921f"
}
},
"regions_count": 13,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/peru"
},
{
"country_code": "PH",
"country_name": "Philippines",
"intl_code": "RP",
"region_marking": "prefix_letters",
"size_mm": [
390,
140
],
"example": {
"number": "CCK 6781",
"region": "",
"formatted": "CCK 6781",
"image": {
"svg": "https://openvan.camp/api/plates/ph/plate.svg?number=CCK+6781&v=449ac189",
"png": "https://openvan.camp/api/plates/ph/plate.png?number=CCK+6781&v=449ac189"
}
},
"regions_count": 16,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/philippines"
},
{
"country_code": "PL",
"country_name": "Poland",
"intl_code": "PL",
"region_marking": "prefix_letters",
"size_mm": [
520,
114
],
"example": {
"number": "WI 255RY",
"region": "",
"formatted": "WI 255RY",
"image": {
"svg": "https://openvan.camp/api/plates/pl/plate.svg?number=WI+255RY&v=25bf610c",
"png": "https://openvan.camp/api/plates/pl/plate.png?number=WI+255RY&v=25bf610c"
}
},
"regions_count": 396,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/poland"
},
{
"country_code": "PT",
"country_name": "Portugal",
"intl_code": "P",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "AE 36 EM",
"region": "",
"formatted": "AE 36 EM",
"image": {
"svg": "https://openvan.camp/api/plates/pt/plate.svg?number=AE+36+EM&v=99f0ee9d",
"png": "https://openvan.camp/api/plates/pt/plate.png?number=AE+36+EM&v=99f0ee9d"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/portugal"
},
{
"country_code": "QA",
"country_name": "Qatar",
"intl_code": "Q",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "123456",
"region": "",
"formatted": "123456",
"image": {
"svg": "https://openvan.camp/api/plates/qa/plate.svg?number=123456&v=e6585054",
"png": "https://openvan.camp/api/plates/qa/plate.png?number=123456&v=e6585054"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/qatar"
},
{
"country_code": "RO",
"country_name": "Romania",
"intl_code": "RO",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "GL 11 JIP",
"region": "",
"formatted": "GL 11 JIP",
"image": {
"svg": "https://openvan.camp/api/plates/ro/plate.svg?number=GL+11+JIP&v=de341af9",
"png": "https://openvan.camp/api/plates/ro/plate.png?number=GL+11+JIP&v=de341af9"
}
},
"regions_count": 42,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/romania"
},
{
"country_code": "RU",
"country_name": "Russia",
"intl_code": "RUS",
"region_marking": "separate_field",
"size_mm": [
520,
112
],
"example": {
"number": "С065МК",
"region": "197",
"formatted": "С065МК 197",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=%D0%A1065%D0%9C%D0%9A®ion=197&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%A1065%D0%9C%D0%9A®ion=197&v=0dccaf4d"
}
},
"regions_count": 96,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/russia"
},
{
"country_code": "RW",
"country_name": "Rwanda",
"intl_code": "RWA",
"region_marking": "none",
"size_mm": [
520,
113
],
"example": {
"number": "RAB 272H",
"region": "",
"formatted": "RAB 272H",
"image": {
"svg": "https://openvan.camp/api/plates/rw/plate.svg?number=RAB+272H&v=9e7e065a",
"png": "https://openvan.camp/api/plates/rw/plate.png?number=RAB+272H&v=9e7e065a"
}
},
"regions_count": 10,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/rwanda"
},
{
"country_code": "KN",
"country_name": "Saint Kitts and Nevis",
"intl_code": null,
"region_marking": "none",
"size_mm": [
520,
119
],
"example": {
"number": "P 884",
"region": "",
"formatted": "P 884",
"image": {
"svg": "https://openvan.camp/api/plates/kn/plate.svg?number=P+884&v=05e4e6db",
"png": "https://openvan.camp/api/plates/kn/plate.png?number=P+884&v=05e4e6db"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/saint-kitts-and-nevis"
},
{
"country_code": "LC",
"country_name": "Saint Lucia",
"intl_code": "WL",
"region_marking": "none",
"size_mm": [
520,
120
],
"example": {
"number": "HU870",
"region": "",
"formatted": "HU870",
"image": {
"svg": "https://openvan.camp/api/plates/lc/plate.svg?number=HU870&v=f58b280b",
"png": "https://openvan.camp/api/plates/lc/plate.png?number=HU870&v=f58b280b"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/saint-lucia"
},
{
"country_code": "VC",
"country_name": "Saint Vincent and the Grenadines",
"intl_code": "WV",
"region_marking": "none",
"size_mm": [
520,
125
],
"example": {
"number": "P 2401",
"region": "",
"formatted": "P 2401",
"image": {
"svg": "https://openvan.camp/api/plates/vc/plate.svg?number=P+2401&v=b761c1d6",
"png": "https://openvan.camp/api/plates/vc/plate.png?number=P+2401&v=b761c1d6"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/saint-vincent-and-the-grenadines"
},
{
"country_code": "WS",
"country_name": "Samoa",
"intl_code": "WS",
"region_marking": "none",
"size_mm": [
372,
134
],
"example": {
"number": "5511",
"region": "",
"formatted": "5511",
"image": {
"svg": "https://openvan.camp/api/plates/ws/plate.svg?number=5511&v=cfc78abd",
"png": "https://openvan.camp/api/plates/ws/plate.png?number=5511&v=cfc78abd"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/samoa"
},
{
"country_code": "SM",
"country_name": "San Marino",
"intl_code": "RSM",
"region_marking": "none",
"size_mm": [
340,
100
],
"example": {
"number": "J0484",
"region": "",
"formatted": "J0484",
"image": {
"svg": "https://openvan.camp/api/plates/sm/plate.svg?number=J0484&v=0f91928a",
"png": "https://openvan.camp/api/plates/sm/plate.png?number=J0484&v=0f91928a"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/san-marino"
},
{
"country_code": "ST",
"country_name": "Sao Tome and Principe",
"intl_code": null,
"region_marking": "none",
"size_mm": [
520,
108
],
"example": {
"number": "STP-87-63S",
"region": "",
"formatted": "STP-87-63S",
"image": {
"svg": "https://openvan.camp/api/plates/st/plate.svg?number=STP-87-63S&v=acb3079d",
"png": "https://openvan.camp/api/plates/st/plate.png?number=STP-87-63S&v=acb3079d"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/sao-tome-and-principe"
},
{
"country_code": "SA",
"country_name": "Saudi Arabia",
"intl_code": "KSA",
"region_marking": "none",
"size_mm": [
320,
173
],
"example": {
"number": "7653 TNJ",
"region": "",
"formatted": "7653 TNJ",
"image": {
"svg": "https://openvan.camp/api/plates/sa/plate.svg?number=7653+TNJ&v=40a0de8b",
"png": "https://openvan.camp/api/plates/sa/plate.png?number=7653+TNJ&v=40a0de8b"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/saudi-arabia"
},
{
"country_code": "SN",
"country_name": "Senegal",
"intl_code": "SN",
"region_marking": "separate_field",
"size_mm": [
520,
110
],
"example": {
"number": "AA-012-BC",
"region": "DK",
"formatted": "AA-012-BC DK",
"image": {
"svg": "https://openvan.camp/api/plates/sn/plate.svg?number=AA-012-BC®ion=DK&v=3b11141d",
"png": "https://openvan.camp/api/plates/sn/plate.png?number=AA-012-BC®ion=DK&v=3b11141d"
}
},
"regions_count": 14,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/senegal"
},
{
"country_code": "RS",
"country_name": "Serbia",
"intl_code": "SRB",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "KŠ 055-HI",
"region": "",
"formatted": "KŠ 055-HI",
"image": {
"svg": "https://openvan.camp/api/plates/rs/plate.svg?number=K%C5%A0+055-HI&v=a64bdb88",
"png": "https://openvan.camp/api/plates/rs/plate.png?number=K%C5%A0+055-HI&v=a64bdb88"
}
},
"regions_count": 83,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/serbia"
},
{
"country_code": "SC",
"country_name": "Seychelles",
"intl_code": "SY",
"region_marking": "none",
"size_mm": [
330,
150
],
"example": {
"number": "S6362",
"region": "",
"formatted": "S6362",
"image": {
"svg": "https://openvan.camp/api/plates/sc/plate.svg?number=S6362&v=ae1959cf",
"png": "https://openvan.camp/api/plates/sc/plate.png?number=S6362&v=ae1959cf"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/seychelles"
},
{
"country_code": "SL",
"country_name": "Sierra Leone",
"intl_code": "WAL",
"region_marking": "separate_field",
"size_mm": [
520,
109
],
"example": {
"number": "AIB 960",
"region": "PRV",
"formatted": "AIB 960 PRV",
"image": {
"svg": "https://openvan.camp/api/plates/sl/plate.svg?number=AIB+960®ion=PRV&v=5974368e",
"png": "https://openvan.camp/api/plates/sl/plate.png?number=AIB+960®ion=PRV&v=5974368e"
}
},
"regions_count": 14,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/sierra-leone"
},
{
"country_code": "SG",
"country_name": "Singapore",
"intl_code": "SGP",
"region_marking": "none",
"size_mm": [
520,
111
],
"example": {
"number": "SBA 1234 G",
"region": "",
"formatted": "SBA 1234 G",
"image": {
"svg": "https://openvan.camp/api/plates/sg/plate.svg?number=SBA+1234+G&v=f556bbb2",
"png": "https://openvan.camp/api/plates/sg/plate.png?number=SBA+1234+G&v=f556bbb2"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/singapore"
},
{
"country_code": "SK",
"country_name": "Slovakia",
"intl_code": "SK",
"region_marking": "legacy_only",
"size_mm": [
520,
110
],
"example": {
"number": "AA 328AD",
"region": "",
"formatted": "AA 328AD",
"image": {
"svg": "https://openvan.camp/api/plates/sk/plate.svg?number=AA+328AD&v=d2cf5aea",
"png": "https://openvan.camp/api/plates/sk/plate.png?number=AA+328AD&v=d2cf5aea"
}
},
"regions_count": 72,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/slovakia"
},
{
"country_code": "SI",
"country_name": "Slovenia",
"intl_code": "SLO",
"region_marking": "prefix_letters",
"size_mm": [
520,
110
],
"example": {
"number": "LJ 60-CFB",
"region": "",
"formatted": "LJ 60-CFB",
"image": {
"svg": "https://openvan.camp/api/plates/si/plate.svg?number=LJ+60-CFB&v=b15ef8fd",
"png": "https://openvan.camp/api/plates/si/plate.png?number=LJ+60-CFB&v=b15ef8fd"
}
},
"regions_count": 11,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/slovenia"
},
{
"country_code": "SB",
"country_name": "Solomon Islands",
"intl_code": null,
"region_marking": "none",
"size_mm": [
372,
134
],
"example": {
"number": "MB·0378",
"region": "",
"formatted": "MB·0378",
"image": {
"svg": "https://openvan.camp/api/plates/sb/plate.svg?number=MB%C2%B70378&v=b81e7cb3",
"png": "https://openvan.camp/api/plates/sb/plate.png?number=MB%C2%B70378&v=b81e7cb3"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/solomon-islands"
},
{
"country_code": "SO",
"country_name": "Somalia",
"intl_code": "SO",
"region_marking": "none",
"size_mm": [
340,
130
],
"example": {
"number": "AD 4657",
"region": "",
"formatted": "AD 4657",
"image": {
"svg": "https://openvan.camp/api/plates/so/plate.svg?number=AD+4657&v=67fd7409",
"png": "https://openvan.camp/api/plates/so/plate.png?number=AD+4657&v=67fd7409"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/somalia"
},
{
"country_code": "ZA",
"country_name": "South Africa",
"intl_code": "ZA",
"region_marking": "mixed",
"size_mm": [
520,
113
],
"example": {
"number": "CA 123-456",
"region": "",
"formatted": "CA 123-456",
"image": {
"svg": "https://openvan.camp/api/plates/za/plate.svg?number=CA+123-456&v=71f44313",
"png": "https://openvan.camp/api/plates/za/plate.png?number=CA+123-456&v=71f44313"
}
},
"regions_count": 457,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/south-africa"
},
{
"country_code": "KR",
"country_name": "South Korea",
"intl_code": "ROK",
"region_marking": "mixed",
"size_mm": [
520,
110
],
"example": {
"number": "123가 4568",
"region": "",
"formatted": "123가 4568",
"image": {
"svg": "https://openvan.camp/api/plates/kr/plate.svg?number=123%EA%B0%80+4568&v=6eb390cf",
"png": "https://openvan.camp/api/plates/kr/plate.png?number=123%EA%B0%80+4568&v=6eb390cf"
}
},
"regions_count": 17,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/south-korea"
},
{
"country_code": "SS",
"country_name": "South Sudan",
"intl_code": "SSD",
"region_marking": "legacy_only",
"size_mm": [
340,
180
],
"example": {
"number": "860 AJ",
"region": "",
"formatted": "860 AJ",
"image": {
"svg": "https://openvan.camp/api/plates/ss/plate.svg?number=860+AJ&v=850419dd",
"png": "https://openvan.camp/api/plates/ss/plate.png?number=860+AJ&v=850419dd"
}
},
"regions_count": 4,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/south-sudan"
},
{
"country_code": "ES",
"country_name": "Spain",
"intl_code": "E",
"region_marking": "legacy_only",
"size_mm": [
520,
110
],
"example": {
"number": "0202 ZBF",
"region": "",
"formatted": "0202 ZBF",
"image": {
"svg": "https://openvan.camp/api/plates/es/plate.svg?number=0202+ZBF&v=020194ec",
"png": "https://openvan.camp/api/plates/es/plate.png?number=0202+ZBF&v=020194ec"
}
},
"regions_count": 52,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/spain"
},
{
"country_code": "LK",
"country_name": "Sri Lanka",
"intl_code": "CL",
"region_marking": "separate_field",
"size_mm": [
520,
110
],
"example": {
"number": "ND-8740",
"region": "WP",
"formatted": "ND-8740 WP",
"image": {
"svg": "https://openvan.camp/api/plates/lk/plate.svg?number=ND-8740®ion=WP&v=d4abb57b",
"png": "https://openvan.camp/api/plates/lk/plate.png?number=ND-8740®ion=WP&v=d4abb57b"
}
},
"regions_count": 9,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/sri-lanka"
},
{
"country_code": "SD",
"country_name": "Sudan",
"intl_code": "SUD",
"region_marking": "mixed",
"size_mm": [
340,
180
],
"example": {
"number": "7 KH 10346",
"region": "",
"formatted": "7 KH 10346",
"image": {
"svg": "https://openvan.camp/api/plates/sd/plate.svg?number=7+KH+10346&v=8ee821ad",
"png": "https://openvan.camp/api/plates/sd/plate.png?number=7+KH+10346&v=8ee821ad"
}
},
"regions_count": 1,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/sudan"
},
{
"country_code": "SR",
"country_name": "Suriname",
"intl_code": "SME",
"region_marking": "none",
"size_mm": [
305,
152
],
"example": {
"number": "PN·40·77",
"region": "",
"formatted": "PN·40·77",
"image": {
"svg": "https://openvan.camp/api/plates/sr/plate.svg?number=PN%C2%B740%C2%B777&v=c2d4e8fd",
"png": "https://openvan.camp/api/plates/sr/plate.png?number=PN%C2%B740%C2%B777&v=c2d4e8fd"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/suriname"
},
{
"country_code": "SE",
"country_name": "Sweden",
"intl_code": "S",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "MLB 84A",
"region": "",
"formatted": "MLB 84A",
"image": {
"svg": "https://openvan.camp/api/plates/se/plate.svg?number=MLB+84A&v=7be7f87d",
"png": "https://openvan.camp/api/plates/se/plate.png?number=MLB+84A&v=7be7f87d"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/sweden"
},
{
"country_code": "CH",
"country_name": "Switzerland",
"intl_code": "CH",
"region_marking": "prefix_letters",
"size_mm": [
500,
110
],
"example": {
"number": "ZH·272577",
"region": "",
"formatted": "ZH·272577",
"image": {
"svg": "https://openvan.camp/api/plates/ch/plate.svg?number=ZH%C2%B7272577&v=2bff68ab",
"png": "https://openvan.camp/api/plates/ch/plate.png?number=ZH%C2%B7272577&v=2bff68ab"
}
},
"regions_count": 28,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/switzerland"
},
{
"country_code": "SY",
"country_name": "Syria",
"intl_code": "SYR",
"region_marking": "legacy_only",
"size_mm": [
520,
115
],
"example": {
"number": "12 12345",
"region": "",
"formatted": "12 12345",
"image": {
"svg": "https://openvan.camp/api/plates/sy/plate.svg?number=12+12345&v=dd88bb42",
"png": "https://openvan.camp/api/plates/sy/plate.png?number=12+12345&v=dd88bb42"
}
},
"regions_count": 14,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/syria"
},
{
"country_code": "TW",
"country_name": "Taiwan",
"intl_code": "RC",
"region_marking": "legacy_only",
"size_mm": [
380,
160
],
"example": {
"number": "BFG-9000",
"region": "",
"formatted": "BFG-9000",
"image": {
"svg": "https://openvan.camp/api/plates/tw/plate.svg?number=BFG-9000&v=d26cb22f",
"png": "https://openvan.camp/api/plates/tw/plate.png?number=BFG-9000&v=d26cb22f"
}
},
"regions_count": 5,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/taiwan"
},
{
"country_code": "TJ",
"country_name": "Tajikistan",
"intl_code": "TJ",
"region_marking": "suffix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "9999WT02",
"region": "",
"formatted": "9999WT02",
"image": {
"svg": "https://openvan.camp/api/plates/tj/plate.svg?number=9999WT02&v=442919f5",
"png": "https://openvan.camp/api/plates/tj/plate.png?number=9999WT02&v=442919f5"
}
},
"regions_count": 5,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/tajikistan"
},
{
"country_code": "TZ",
"country_name": "Tanzania",
"intl_code": "EAT",
"region_marking": "prefix_letters",
"size_mm": [
520,
113
],
"example": {
"number": "T 995 AGT",
"region": "",
"formatted": "T 995 AGT",
"image": {
"svg": "https://openvan.camp/api/plates/tz/plate.svg?number=T+995+AGT&v=da813776",
"png": "https://openvan.camp/api/plates/tz/plate.png?number=T+995+AGT&v=da813776"
}
},
"regions_count": 32,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/tanzania"
},
{
"country_code": "TH",
"country_name": "Thailand",
"intl_code": "T",
"region_marking": "text_name",
"size_mm": [
340,
150
],
"example": {
"number": "กว 2283",
"region": "ภูเก็ต",
"formatted": "กว 2283 ภูเก็ต",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=%E0%B8%81%E0%B8%A7+2283®ion=%E0%B8%A0%E0%B8%B9%E0%B9%80%E0%B8%81%E0%B9%87%E0%B8%95&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=%E0%B8%81%E0%B8%A7+2283®ion=%E0%B8%A0%E0%B8%B9%E0%B9%80%E0%B8%81%E0%B9%87%E0%B8%95&v=587b518f"
}
},
"regions_count": 77,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/thailand"
},
{
"country_code": "TL",
"country_name": "Timor-Leste",
"intl_code": "TL",
"region_marking": "mixed",
"size_mm": [
340,
120
],
"example": {
"number": "14-875",
"region": "",
"formatted": "14-875",
"image": {
"svg": "https://openvan.camp/api/plates/tl/plate.svg?number=14-875&v=c1d83cb8",
"png": "https://openvan.camp/api/plates/tl/plate.png?number=14-875&v=c1d83cb8"
}
},
"regions_count": 2,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/timor-leste"
},
{
"country_code": "TG",
"country_name": "Togo",
"intl_code": "TG",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "9867 AE",
"region": "",
"formatted": "9867 AE",
"image": {
"svg": "https://openvan.camp/api/plates/tg/plate.svg?number=9867+AE&v=be4ee354",
"png": "https://openvan.camp/api/plates/tg/plate.png?number=9867+AE&v=be4ee354"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/togo"
},
{
"country_code": "TO",
"country_name": "Tonga",
"intl_code": "TO",
"region_marking": "none",
"size_mm": [
372,
134
],
"example": {
"number": "C 10792",
"region": "",
"formatted": "C 10792",
"image": {
"svg": "https://openvan.camp/api/plates/to/plate.svg?number=C+10792&v=f26b4f3e",
"png": "https://openvan.camp/api/plates/to/plate.png?number=C+10792&v=f26b4f3e"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/tonga"
},
{
"country_code": "TT",
"country_name": "Trinidad and Tobago",
"intl_code": "TT",
"region_marking": "none",
"size_mm": [
520,
111
],
"example": {
"number": "PBJ 4763",
"region": "",
"formatted": "PBJ 4763",
"image": {
"svg": "https://openvan.camp/api/plates/tt/plate.svg?number=PBJ+4763&v=55301f47",
"png": "https://openvan.camp/api/plates/tt/plate.png?number=PBJ+4763&v=55301f47"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/trinidad-and-tobago"
},
{
"country_code": "TN",
"country_name": "Tunisia",
"intl_code": "TN",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "165 8908",
"region": "",
"formatted": "165 8908",
"image": {
"svg": "https://openvan.camp/api/plates/tn/plate.svg?number=165+8908&v=730ba25f",
"png": "https://openvan.camp/api/plates/tn/plate.png?number=165+8908&v=730ba25f"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/tunisia"
},
{
"country_code": "TR",
"country_name": "Turkey",
"intl_code": "TR",
"region_marking": "prefix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "ABC 123",
"region": "34",
"formatted": "ABC 123 34",
"image": {
"svg": "https://openvan.camp/api/plates/tr/plate.svg?number=ABC+123®ion=34&v=76d2395a",
"png": "https://openvan.camp/api/plates/tr/plate.png?number=ABC+123®ion=34&v=76d2395a"
}
},
"regions_count": 81,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/turkey"
},
{
"country_code": "TM",
"country_name": "Turkmenistan",
"intl_code": "TM",
"region_marking": "mixed",
"size_mm": [
520,
112
],
"example": {
"number": "BZ 6472 LB",
"region": "",
"formatted": "BZ 6472 LB",
"image": {
"svg": "https://openvan.camp/api/plates/tm/plate.svg?number=BZ+6472+LB&v=3f383924",
"png": "https://openvan.camp/api/plates/tm/plate.png?number=BZ+6472+LB&v=3f383924"
}
},
"regions_count": 7,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/turkmenistan"
},
{
"country_code": "TV",
"country_name": "Tuvalu",
"intl_code": null,
"region_marking": "none",
"size_mm": [
372,
134
],
"example": {
"number": "A01792",
"region": "",
"formatted": "A01792",
"image": {
"svg": "https://openvan.camp/api/plates/tv/plate.svg?number=A01792&v=b4eaaa58",
"png": "https://openvan.camp/api/plates/tv/plate.png?number=A01792&v=b4eaaa58"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/tuvalu"
},
{
"country_code": "AE",
"country_name": "UAE",
"intl_code": "UAE",
"region_marking": "text_name",
"size_mm": [
520,
110
],
"example": {
"number": "K 20226",
"region": "",
"formatted": "K 20226",
"image": {
"svg": "https://openvan.camp/api/plates/ae/plate.svg?number=K+20226&v=f8ec8941",
"png": "https://openvan.camp/api/plates/ae/plate.png?number=K+20226&v=f8ec8941"
}
},
"regions_count": 7,
"glyphs_license": "sharealike",
"url": "https://openvan.camp/en/license-plates/uae"
},
{
"country_code": "UG",
"country_name": "Uganda",
"intl_code": "EAU",
"region_marking": "none",
"size_mm": [
520,
113
],
"example": {
"number": "UAG 679C",
"region": "",
"formatted": "UAG 679C",
"image": {
"svg": "https://openvan.camp/api/plates/ug/plate.svg?number=UAG+679C&v=eefb68e4",
"png": "https://openvan.camp/api/plates/ug/plate.png?number=UAG+679C&v=eefb68e4"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/uganda"
},
{
"country_code": "UA",
"country_name": "Ukraine",
"intl_code": "UA",
"region_marking": "prefix_letters",
"size_mm": [
520,
112
],
"example": {
"number": "AK 9265 AK",
"region": "",
"formatted": "AK 9265 AK",
"image": {
"svg": "https://openvan.camp/api/plates/ua/plate.svg?number=AK+9265+AK&v=8ea28a55",
"png": "https://openvan.camp/api/plates/ua/plate.png?number=AK+9265+AK&v=8ea28a55"
}
},
"regions_count": 29,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/ukraine"
},
{
"country_code": "GB",
"country_name": "United Kingdom",
"intl_code": "UK",
"region_marking": "prefix_letters",
"size_mm": [
520,
111
],
"example": {
"number": "BD51 SMR",
"region": "",
"formatted": "BD51 SMR",
"image": {
"svg": "https://openvan.camp/api/plates/gb/plate.svg?number=BD51+SMR&v=f41a5ec2",
"png": "https://openvan.camp/api/plates/gb/plate.png?number=BD51+SMR&v=f41a5ec2"
}
},
"regions_count": 123,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/united-kingdom"
},
{
"country_code": "US",
"country_name": "United States",
"intl_code": "USA",
"region_marking": "text_name",
"size_mm": [
305,
152
],
"example": {
"number": "9KDV763",
"region": "CA",
"formatted": "9KDV763 CA",
"image": {
"svg": "https://openvan.camp/api/plates/us/plate.svg?number=9KDV763®ion=CA&v=19055a90",
"png": "https://openvan.camp/api/plates/us/plate.png?number=9KDV763®ion=CA&v=19055a90"
}
},
"regions_count": 56,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/united-states"
},
{
"country_code": "UY",
"country_name": "Uruguay",
"intl_code": "ROU",
"region_marking": "prefix_letters",
"size_mm": [
400,
130
],
"example": {
"number": "STP 3480",
"region": "",
"formatted": "STP 3480",
"image": {
"svg": "https://openvan.camp/api/plates/uy/plate.svg?number=STP+3480&v=0ea7e654",
"png": "https://openvan.camp/api/plates/uy/plate.png?number=STP+3480&v=0ea7e654"
}
},
"regions_count": 19,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/uruguay"
},
{
"country_code": "UZ",
"country_name": "Uzbekistan",
"intl_code": "UZ",
"region_marking": "separate_field",
"size_mm": [
520,
112
],
"example": {
"number": "30 A 674 PA",
"region": "",
"formatted": "30 A 674 PA",
"image": {
"svg": "https://openvan.camp/api/plates/uz/plate.svg?number=30+A+674+PA&v=d5c621a1",
"png": "https://openvan.camp/api/plates/uz/plate.png?number=30+A+674+PA&v=d5c621a1"
}
},
"regions_count": 14,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/uzbekistan"
},
{
"country_code": "VU",
"country_name": "Vanuatu",
"intl_code": null,
"region_marking": "none",
"size_mm": [
372,
134
],
"example": {
"number": "10346",
"region": "",
"formatted": "10346",
"image": {
"svg": "https://openvan.camp/api/plates/vu/plate.svg?number=10346&v=23a5a2ec",
"png": "https://openvan.camp/api/plates/vu/plate.png?number=10346&v=23a5a2ec"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/vanuatu"
},
{
"country_code": "VA",
"country_name": "Vatican City",
"intl_code": "V",
"region_marking": "none",
"size_mm": [
520,
110
],
"example": {
"number": "SCV 01177",
"region": "",
"formatted": "SCV 01177",
"image": {
"svg": "https://openvan.camp/api/plates/va/plate.svg?number=SCV+01177&v=0598f964",
"png": "https://openvan.camp/api/plates/va/plate.png?number=SCV+01177&v=0598f964"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/vatican-city"
},
{
"country_code": "VE",
"country_name": "Venezuela",
"intl_code": "YV",
"region_marking": "mixed",
"size_mm": [
305,
152
],
"example": {
"number": "AA128GG",
"region": "CARABOBO",
"formatted": "AA128GG CARABOBO",
"image": {
"svg": "https://openvan.camp/api/plates/ve/plate.svg?number=AA128GG®ion=CARABOBO&v=6e9ee998",
"png": "https://openvan.camp/api/plates/ve/plate.png?number=AA128GG®ion=CARABOBO&v=6e9ee998"
}
},
"regions_count": 24,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/venezuela"
},
{
"country_code": "VN",
"country_name": "Vietnam",
"intl_code": "VN",
"region_marking": "prefix_digits",
"size_mm": [
520,
110
],
"example": {
"number": "30F-256.58",
"region": "",
"formatted": "30F-256.58",
"image": {
"svg": "https://openvan.camp/api/plates/vn/plate.svg?number=30F-256.58&v=dcd0c460",
"png": "https://openvan.camp/api/plates/vn/plate.png?number=30F-256.58&v=dcd0c460"
}
},
"regions_count": 34,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/vietnam"
},
{
"country_code": "YE",
"country_name": "Yemen",
"intl_code": "YAR",
"region_marking": "prefix_digits",
"size_mm": [
340,
188
],
"example": {
"number": "2 12345",
"region": "",
"formatted": "2 12345",
"image": {
"svg": "https://openvan.camp/api/plates/ye/plate.svg?number=2+12345&v=86162da0",
"png": "https://openvan.camp/api/plates/ye/plate.png?number=2+12345&v=86162da0"
}
},
"regions_count": 22,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/yemen"
},
{
"country_code": "ZM",
"country_name": "Zambia",
"intl_code": "Z",
"region_marking": "legacy_only",
"size_mm": [
520,
113
],
"example": {
"number": "ADD 4077 T",
"region": "",
"formatted": "ADD 4077 T",
"image": {
"svg": "https://openvan.camp/api/plates/zm/plate.svg?number=ADD+4077+T&v=94cf3239",
"png": "https://openvan.camp/api/plates/zm/plate.png?number=ADD+4077+T&v=94cf3239"
}
},
"regions_count": 21,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/zambia"
},
{
"country_code": "ZW",
"country_name": "Zimbabwe",
"intl_code": "ZW",
"region_marking": "none",
"size_mm": [
430,
110
],
"example": {
"number": "ADV 5517",
"region": "",
"formatted": "ADV 5517",
"image": {
"svg": "https://openvan.camp/api/plates/zw/plate.svg?number=ADV+5517&v=eaec2960",
"png": "https://openvan.camp/api/plates/zw/plate.png?number=ADV+5517&v=eaec2960"
}
},
"regions_count": 0,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/zimbabwe"
}
],
"meta": {
"total_countries": 199,
"api_version": 1
},
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get a country
Plate passport of one country (standard, size, how to read the plate), all region codes grouped by region, and the browser engine that draws the plate on your own page.
Example request:
curl --request GET \
--get "https://openvan.camp/api/plates/ru?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/plates/ru"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/plates/ru'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: max-age=300, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 119
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"success": true,
"data": {
"country_code": "RU",
"country_name": "Russia",
"intl_code": "RUS",
"region_marking": "separate_field",
"size_mm": [
520,
112
],
"example": {
"number": "С065МК",
"region": "197",
"formatted": "С065МК 197",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=%D0%A1065%D0%9C%D0%9A®ion=197&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%A1065%D0%9C%D0%9A®ion=197&v=0dccaf4d"
}
},
"regions_count": 96,
"glyphs_license": "free",
"url": "https://openvan.camp/en/license-plates/russia",
"standard": "GOST R 50577-2018, type 1",
"description": "A Russian plate reads left to right: one letter, three digits and two more letters — the series and number. A separate field on the right holds the two- or three-digit region code, with RUS and the flag below it. Only 12 Cyrillic letters that look like Latin ones are used: А, В, Е, К, М, Н, О, Р, С, Т, У, Х. Many regions have several codes: when one code runs out, a three-digit code with 1, 7, 2 and so on in front is issued — Moscow has eleven.",
"history": "The current system dates from 1993: region codes 01–89 follow the order of federal subjects in the Constitution. Three-digit codes appeared in the late 1990s. Before 1993 the region was shown by letters at the end of the number (e.g. «МО» for Moscow) — such plates have almost vanished. Codes of abolished autonomous okrugs (80, 81, 82, 84, 85, 88) were later reassigned.",
"regions": [
{
"name": "Republic of Adygea",
"iso3166_2": "RU-AD",
"codes": [
"01",
"101"
],
"legacy_codes": [],
"note": null
},
{
"name": "Republic of Bashkortostan",
"iso3166_2": "RU-BA",
"codes": [
"02",
"102",
"702"
],
"legacy_codes": [],
"note": null
},
{
"name": "Republic of Buryatia",
"iso3166_2": "RU-BU",
"codes": [
"03",
"103"
],
"legacy_codes": [],
"note": null
},
{
"name": "Altai Republic",
"iso3166_2": "RU-AL",
"codes": [
"04"
],
"legacy_codes": [],
"note": null
},
{
"name": "Republic of Dagestan",
"iso3166_2": "RU-DA",
"codes": [
"05",
"105"
],
"legacy_codes": [],
"note": null
},
{
"name": "Republic of Ingushetia",
"iso3166_2": "RU-IN",
"codes": [
"06"
],
"legacy_codes": [],
"note": null
},
{
"name": "Kabardino-Balkarian Republic",
"iso3166_2": "RU-KB",
"codes": [
"07"
],
"legacy_codes": [],
"note": null
},
{
"name": "Republic of Kalmykia",
"iso3166_2": "RU-KL",
"codes": [
"08"
],
"legacy_codes": [],
"note": null
},
{
"name": "Karachay-Cherkess Republic",
"iso3166_2": "RU-KC",
"codes": [
"09",
"109"
],
"legacy_codes": [],
"note": null
},
{
"name": "Republic of Karelia",
"iso3166_2": "RU-KR",
"codes": [
"10"
],
"legacy_codes": [],
"note": null
},
{
"name": "Komi Republic",
"iso3166_2": "RU-KO",
"codes": [
"11",
"111"
],
"legacy_codes": [],
"note": null
},
{
"name": "Mari El Republic",
"iso3166_2": "RU-ME",
"codes": [
"12"
],
"legacy_codes": [],
"note": null
},
{
"name": "Republic of Mordovia",
"iso3166_2": "RU-MO",
"codes": [
"13",
"113"
],
"legacy_codes": [],
"note": null
},
{
"name": "Sakha (Yakutia) Republic",
"iso3166_2": "RU-SA",
"codes": [
"14"
],
"legacy_codes": [],
"note": null
},
{
"name": "Republic of North Ossetia–Alania",
"iso3166_2": "RU-SE",
"codes": [
"15",
"115"
],
"legacy_codes": [],
"note": null
},
{
"name": "Republic of Tatarstan",
"iso3166_2": "RU-TA",
"codes": [
"16",
"116",
"716"
],
"legacy_codes": [],
"note": null
},
{
"name": "Tuva Republic",
"iso3166_2": "RU-TY",
"codes": [
"17"
],
"legacy_codes": [],
"note": null
},
{
"name": "Udmurt Republic",
"iso3166_2": "RU-UD",
"codes": [
"18",
"118"
],
"legacy_codes": [],
"note": null
},
{
"name": "Republic of Khakassia",
"iso3166_2": "RU-KK",
"codes": [
"19"
],
"legacy_codes": [],
"note": null
},
{
"name": "Chuvash Republic",
"iso3166_2": "RU-CU",
"codes": [
"21",
"121"
],
"legacy_codes": [],
"note": null
},
{
"name": "Altai Krai",
"iso3166_2": "RU-ALT",
"codes": [
"22",
"122"
],
"legacy_codes": [],
"note": null
},
{
"name": "Krasnodar Krai",
"iso3166_2": "RU-KDA",
"codes": [
"23",
"93",
"123",
"193",
"323"
],
"legacy_codes": [],
"note": null
},
{
"name": "Krasnoyarsk Krai",
"iso3166_2": "RU-KYA",
"codes": [
"24",
"124",
"224"
],
"legacy_codes": [],
"note": null
},
{
"name": "Primorsky Krai",
"iso3166_2": "RU-PRI",
"codes": [
"25",
"125"
],
"legacy_codes": [],
"note": null
},
{
"name": "Stavropol Krai",
"iso3166_2": "RU-STA",
"codes": [
"26",
"126"
],
"legacy_codes": [],
"note": null
},
{
"name": "Khabarovsk Krai",
"iso3166_2": "RU-KHA",
"codes": [
"27"
],
"legacy_codes": [],
"note": null
},
{
"name": "Amur Oblast",
"iso3166_2": "RU-AMU",
"codes": [
"28"
],
"legacy_codes": [],
"note": null
},
{
"name": "Arkhangelsk Oblast",
"iso3166_2": "RU-ARK",
"codes": [
"29"
],
"legacy_codes": [],
"note": null
},
{
"name": "Astrakhan Oblast",
"iso3166_2": "RU-AST",
"codes": [
"30"
],
"legacy_codes": [],
"note": null
},
{
"name": "Belgorod Oblast",
"iso3166_2": "RU-BEL",
"codes": [
"31",
"131"
],
"legacy_codes": [],
"note": null
},
{
"name": "Bryansk Oblast",
"iso3166_2": "RU-BRY",
"codes": [
"32"
],
"legacy_codes": [],
"note": null
},
{
"name": "Vladimir Oblast",
"iso3166_2": "RU-VLA",
"codes": [
"33",
"133"
],
"legacy_codes": [],
"note": null
},
{
"name": "Volgograd Oblast",
"iso3166_2": "RU-VGG",
"codes": [
"34",
"134"
],
"legacy_codes": [],
"note": null
},
{
"name": "Vologda Oblast",
"iso3166_2": "RU-VLG",
"codes": [
"35"
],
"legacy_codes": [],
"note": null
},
{
"name": "Voronezh Oblast",
"iso3166_2": "RU-VOR",
"codes": [
"36",
"136"
],
"legacy_codes": [],
"note": null
},
{
"name": "Ivanovo Oblast",
"iso3166_2": "RU-IVA",
"codes": [
"37"
],
"legacy_codes": [],
"note": null
},
{
"name": "Irkutsk Oblast",
"iso3166_2": "RU-IRK",
"codes": [
"38",
"138"
],
"legacy_codes": [],
"note": null
},
{
"name": "Kaliningrad Oblast",
"iso3166_2": "RU-KGD",
"codes": [
"39",
"91"
],
"legacy_codes": [],
"note": null
},
{
"name": "Kaluga Oblast",
"iso3166_2": "RU-KLU",
"codes": [
"40"
],
"legacy_codes": [],
"note": null
},
{
"name": "Kamchatka Krai",
"iso3166_2": "RU-KAM",
"codes": [
"41"
],
"legacy_codes": [],
"note": null
},
{
"name": "Kemerovo Oblast – Kuzbass",
"iso3166_2": "RU-KEM",
"codes": [
"42",
"142"
],
"legacy_codes": [],
"note": null
},
{
"name": "Kirov Oblast",
"iso3166_2": "RU-KIR",
"codes": [
"43"
],
"legacy_codes": [],
"note": null
},
{
"name": "Kostroma Oblast",
"iso3166_2": "RU-KOS",
"codes": [
"44"
],
"legacy_codes": [],
"note": null
},
{
"name": "Kurgan Oblast",
"iso3166_2": "RU-KGN",
"codes": [
"45"
],
"legacy_codes": [],
"note": null
},
{
"name": "Kursk Oblast",
"iso3166_2": "RU-KRS",
"codes": [
"46"
],
"legacy_codes": [],
"note": null
},
{
"name": "Leningrad Oblast",
"iso3166_2": "RU-LEN",
"codes": [
"47",
"147"
],
"legacy_codes": [],
"note": null
},
{
"name": "Lipetsk Oblast",
"iso3166_2": "RU-LIP",
"codes": [
"48"
],
"legacy_codes": [],
"note": null
},
{
"name": "Magadan Oblast",
"iso3166_2": "RU-MAG",
"codes": [
"49"
],
"legacy_codes": [],
"note": null
},
{
"name": "Moscow Oblast",
"iso3166_2": "RU-MOS",
"codes": [
"50",
"90",
"150",
"190",
"250",
"550",
"750",
"790"
],
"legacy_codes": [],
"note": null
},
{
"name": "Murmansk Oblast",
"iso3166_2": "RU-MUR",
"codes": [
"51"
],
"legacy_codes": [],
"note": null
},
{
"name": "Nizhny Novgorod Oblast",
"iso3166_2": "RU-NIZ",
"codes": [
"52",
"152",
"252"
],
"legacy_codes": [],
"note": null
},
{
"name": "Novgorod Oblast",
"iso3166_2": "RU-NGR",
"codes": [
"53"
],
"legacy_codes": [],
"note": null
},
{
"name": "Novosibirsk Oblast",
"iso3166_2": "RU-NVS",
"codes": [
"54",
"154"
],
"legacy_codes": [],
"note": null
},
{
"name": "Omsk Oblast",
"iso3166_2": "RU-OMS",
"codes": [
"55",
"155"
],
"legacy_codes": [],
"note": null
},
{
"name": "Orenburg Oblast",
"iso3166_2": "RU-ORE",
"codes": [
"56",
"156"
],
"legacy_codes": [],
"note": null
},
{
"name": "Oryol Oblast",
"iso3166_2": "RU-ORL",
"codes": [
"57"
],
"legacy_codes": [],
"note": null
},
{
"name": "Penza Oblast",
"iso3166_2": "RU-PNZ",
"codes": [
"58",
"158"
],
"legacy_codes": [],
"note": null
},
{
"name": "Perm Krai",
"iso3166_2": "RU-PER",
"codes": [
"59",
"159"
],
"legacy_codes": [],
"note": null
},
{
"name": "Pskov Oblast",
"iso3166_2": "RU-PSK",
"codes": [
"60"
],
"legacy_codes": [],
"note": null
},
{
"name": "Rostov Oblast",
"iso3166_2": "RU-ROS",
"codes": [
"61",
"161",
"761"
],
"legacy_codes": [],
"note": null
},
{
"name": "Ryazan Oblast",
"iso3166_2": "RU-RYA",
"codes": [
"62"
],
"legacy_codes": [],
"note": null
},
{
"name": "Samara Oblast",
"iso3166_2": "RU-SAM",
"codes": [
"63",
"163",
"763"
],
"legacy_codes": [],
"note": null
},
{
"name": "Saratov Oblast",
"iso3166_2": "RU-SAR",
"codes": [
"64",
"164"
],
"legacy_codes": [],
"note": null
},
{
"name": "Sakhalin Oblast",
"iso3166_2": "RU-SAK",
"codes": [
"65"
],
"legacy_codes": [],
"note": null
},
{
"name": "Sverdlovsk Oblast",
"iso3166_2": "RU-SVE",
"codes": [
"66",
"96",
"166",
"196"
],
"legacy_codes": [],
"note": null
},
{
"name": "Smolensk Oblast",
"iso3166_2": "RU-SMO",
"codes": [
"67"
],
"legacy_codes": [],
"note": null
},
{
"name": "Tambov Oblast",
"iso3166_2": "RU-TAM",
"codes": [
"68"
],
"legacy_codes": [],
"note": null
},
{
"name": "Tver Oblast",
"iso3166_2": "RU-TVE",
"codes": [
"69"
],
"legacy_codes": [],
"note": null
},
{
"name": "Tomsk Oblast",
"iso3166_2": "RU-TOM",
"codes": [
"70"
],
"legacy_codes": [],
"note": null
},
{
"name": "Tula Oblast",
"iso3166_2": "RU-TUL",
"codes": [
"71"
],
"legacy_codes": [],
"note": null
},
{
"name": "Tyumen Oblast",
"iso3166_2": "RU-TYU",
"codes": [
"72",
"172"
],
"legacy_codes": [],
"note": null
},
{
"name": "Ulyanovsk Oblast",
"iso3166_2": "RU-ULY",
"codes": [
"73",
"173"
],
"legacy_codes": [],
"note": null
},
{
"name": "Chelyabinsk Oblast",
"iso3166_2": "RU-CHE",
"codes": [
"74",
"174",
"774"
],
"legacy_codes": [],
"note": null
},
{
"name": "Zabaykalsky Krai",
"iso3166_2": "RU-ZAB",
"codes": [
"75"
],
"legacy_codes": [],
"note": null
},
{
"name": "Yaroslavl Oblast",
"iso3166_2": "RU-YAR",
"codes": [
"76"
],
"legacy_codes": [],
"note": null
},
{
"name": "Moscow",
"iso3166_2": "RU-MOW",
"codes": [
"77",
"97",
"99",
"177",
"197",
"199",
"777",
"797",
"799",
"977",
"997"
],
"legacy_codes": [],
"note": null
},
{
"name": "Saint Petersburg",
"iso3166_2": "RU-SPE",
"codes": [
"78",
"98",
"178",
"198",
"778"
],
"legacy_codes": [],
"note": null
},
{
"name": "Jewish Autonomous Oblast",
"iso3166_2": "RU-YEV",
"codes": [
"79"
],
"legacy_codes": [],
"note": null
},
{
"name": "Donetsk Oblast",
"iso3166_2": "UA-14",
"codes": [
"80",
"180"
],
"legacy_codes": [],
"note": "Codes issued by Russia; under international law the territory is part of Ukraine."
},
{
"name": "Luhansk Oblast",
"iso3166_2": "UA-09",
"codes": [
"81",
"181"
],
"legacy_codes": [],
"note": "Codes issued by Russia; under international law the territory is part of Ukraine."
},
{
"name": "Crimea",
"iso3166_2": "UA-43",
"codes": [
"82"
],
"legacy_codes": [],
"note": "Codes issued by Russia; under international law the territory is part of Ukraine."
},
{
"name": "Nenets Autonomous Okrug",
"iso3166_2": "RU-NEN",
"codes": [
"83"
],
"legacy_codes": [],
"note": null
},
{
"name": "Kherson Oblast",
"iso3166_2": "UA-65",
"codes": [
"84",
"184"
],
"legacy_codes": [],
"note": "Codes issued by Russia; under international law the territory is part of Ukraine."
},
{
"name": "Zaporizhzhia Oblast",
"iso3166_2": "UA-23",
"codes": [
"85",
"185"
],
"legacy_codes": [],
"note": "Codes issued by Russia; under international law the territory is part of Ukraine."
},
{
"name": "Khanty-Mansi Autonomous Okrug – Yugra",
"iso3166_2": "RU-KHM",
"codes": [
"86",
"186"
],
"legacy_codes": [],
"note": null
},
{
"name": "Chukotka Autonomous Okrug",
"iso3166_2": "RU-CHU",
"codes": [
"87"
],
"legacy_codes": [],
"note": null
},
{
"name": "Yamalo-Nenets Autonomous Okrug",
"iso3166_2": "RU-YAN",
"codes": [
"89"
],
"legacy_codes": [],
"note": null
},
{
"name": "Sevastopol",
"iso3166_2": "UA-40",
"codes": [
"92"
],
"legacy_codes": [],
"note": "Codes issued by Russia; under international law the territory is part of Ukraine."
},
{
"name": "Chechen Republic",
"iso3166_2": "RU-CE",
"codes": [
"95"
],
"legacy_codes": [
"20"
],
"note": "The code was cancelled and is no longer issued."
},
{
"name": "Kharkiv Oblast",
"iso3166_2": "UA-63",
"codes": [],
"legacy_codes": [
"188"
],
"note": "Codes issued by Russia; under international law the territory is part of Ukraine."
},
{
"name": "Agin-Buryat Autonomous Okrug",
"iso3166_2": "RU-ZAB",
"codes": [],
"legacy_codes": [
"80"
],
"note": "The okrug was abolished; the code is no longer issued for this territory."
},
{
"name": "Komi-Permyak Autonomous Okrug",
"iso3166_2": "RU-PER",
"codes": [],
"legacy_codes": [
"81"
],
"note": "The okrug was abolished; the code is no longer issued for this territory."
},
{
"name": "Koryak Autonomous Okrug",
"iso3166_2": "RU-KAM",
"codes": [],
"legacy_codes": [
"82"
],
"note": "The okrug was abolished; the code is no longer issued for this territory."
},
{
"name": "Taymyr Autonomous Okrug",
"iso3166_2": "RU-KYA",
"codes": [],
"legacy_codes": [
"84"
],
"note": "The okrug was abolished; the code is no longer issued for this territory."
},
{
"name": "Ust-Orda Buryat Autonomous Okrug",
"iso3166_2": "RU-IRK",
"codes": [],
"legacy_codes": [
"85"
],
"note": "The okrug was abolished; the code is no longer issued for this territory."
},
{
"name": "Evenk Autonomous Okrug",
"iso3166_2": "RU-KYA",
"codes": [],
"legacy_codes": [
"88"
],
"note": "The okrug was abolished; the code is no longer issued for this territory."
}
],
"types": [
{
"key": "private",
"class": "private",
"is_default": true,
"name": "Standard (type 1)",
"description": "The everyday plate for private and company cars: black characters on white, one letter, three digits, two letters, and the region code with RUS and the flag on the right.",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#FBFBFB"
},
"size_mm": [
520,
112
],
"format": "А 000 АА / 77",
"example": {
"number": "С065МК",
"region": "197",
"formatted": "С065МК 197",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=%D0%A1065%D0%9C%D0%9A®ion=197&type=private&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%A1065%D0%9C%D0%9A®ion=197&type=private&v=0dccaf4d"
}
}
},
{
"key": "taxi_bus",
"class": "taxi",
"is_default": false,
"name": "Yellow — taxi and passenger transport (type 1Б)",
"description": "Black characters on yellow, two letters and three digits. Issued to vehicles carrying passengers for hire — taxis, minibuses (marshrutkas) and buses. Plates made since 2025 also carry the flag; older ones show RUS only.",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#F5C400"
},
"size_mm": [
520,
112
],
"format": "АА 000 / 77",
"example": {
"number": "ВЕ166",
"region": "78",
"formatted": "ВЕ166 78",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=%D0%92%D0%95166®ion=78&type=taxi_bus&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%92%D0%95166®ion=78&type=taxi_bus&v=0dccaf4d"
}
}
},
{
"key": "motorcycle",
"class": "motorcycle",
"is_default": false,
"name": "Motorcycle (type 4)",
"description": "A small near-square white plate, 245×185 mm: four digits on top, RUS in the middle, two letters and the region code below. The letters are as tall as the digits.",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#FBFBFB"
},
"size_mm": [
245,
185
],
"format": "0000 / RUS / АА 77",
"example": {
"number": "4407АМ",
"region": "78",
"formatted": "4407АМ 78",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=4407%D0%90%D0%9C®ion=78&type=motorcycle&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=4407%D0%90%D0%9C®ion=78&type=motorcycle&v=0dccaf4d"
}
}
},
{
"key": "trailer",
"class": "trailer",
"is_default": false,
"name": "Trailer (type 2)",
"description": "Same white plate as type 1, but two letters and four digits. Fitted to trailers and semi-trailers — including caravans and camper trailers.",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#FBFBFB"
},
"size_mm": [
520,
112
],
"format": "АА 0000 / 77",
"example": {
"number": "ЕА3015",
"region": "50",
"formatted": "ЕА3015 50",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=%D0%95%D0%903015®ion=50&type=trailer&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%95%D0%903015®ion=50&type=trailer&v=0dccaf4d"
}
}
},
{
"key": "tractor",
"class": "trailer",
"is_default": false,
"name": "Tractors and special machinery (type 3)",
"description": "A large white plate, 288×206 mm, with no RUS: four big digits on top, two letters and the framed region code below. Issued by the machinery inspectorate (Gostekhnadzor) to tractors, road and construction machines.",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#FBFBFB"
},
"size_mm": [
288,
206
],
"format": "0000 / АА 77",
"example": {
"number": "4509ВТ",
"region": "35",
"formatted": "4509ВТ 35",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=4509%D0%92%D0%A2®ion=35&type=tractor&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=4509%D0%92%D0%A2®ion=35&type=tractor&v=0dccaf4d"
}
}
},
{
"key": "export_transit",
"class": "temporary",
"is_default": false,
"name": "Transit «T» — leaving Russia (type 19)",
"description": "A white plate with a separate boxed letter T on the left, then two letters and three digits. Issued for a limited time to vehicles being exported abroad permanently.",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#FBFBFB"
},
"size_mm": [
520,
112
],
"format": "Т АА 000 / 77",
"example": {
"number": "ТАН516",
"region": "39",
"formatted": "ТАН516 39",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=%D0%A2%D0%90%D0%9D516®ion=39&type=export_transit&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%A2%D0%90%D0%9D516®ion=39&type=export_transit&v=0dccaf4d"
}
}
},
{
"key": "diplomatic",
"class": "diplomatic",
"is_default": false,
"name": "Red — diplomatic (types 9–11)",
"description": "White characters on red. The first three digits are the code of the embassy or organisation, the letter shows the status: CD — head of mission, D — diplomatic staff, T — administrative and technical staff. RUS without the flag.",
"colors": {
"text": "#FBFBFB",
"border": "#FBFBFB",
"background": "#E8302F"
},
"size_mm": [
520,
112
],
"format": "000 D 000 / 77",
"example": {
"number": "014D161",
"region": "77",
"formatted": "014D161 77",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=014D161®ion=77&type=diplomatic&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=014D161®ion=77&type=diplomatic&v=0dccaf4d"
}
}
},
{
"key": "police",
"class": "police",
"is_default": false,
"name": "Blue — police and Rosgvardia (types 20–22)",
"description": "White characters on dark blue: one letter and four digits, then the region. Used on vehicles of the police (MVD) and the National Guard (Rosgvardia).",
"colors": {
"text": "#FBFBFB",
"border": "#FBFBFB",
"background": "#1747AE"
},
"size_mm": [
520,
112
],
"format": "А 0000 / 77",
"example": {
"number": "А0200",
"region": "39",
"formatted": "А0200 39",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=%D0%900200®ion=39&type=police&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%900200®ion=39&type=police&v=0dccaf4d"
}
}
},
{
"key": "military",
"class": "military",
"is_default": false,
"name": "Black — military (types 5–8)",
"description": "White characters on black: four digits and two letters. The code on the right is not a region but the code of the military unit or branch. Used on vehicles of the armed forces and other military bodies.",
"colors": {
"text": "#F2F2F2",
"border": "#F2F2F2",
"background": "#1C1D22"
},
"size_mm": [
520,
112
],
"format": "0000 АА / 77",
"example": {
"number": "5567АМ",
"region": "77",
"formatted": "5567АМ 77",
"image": {
"svg": "https://openvan.camp/api/plates/ru/plate.svg?number=5567%D0%90%D0%9C®ion=77&type=military&v=0dccaf4d",
"png": "https://openvan.camp/api/plates/ru/plate.png?number=5567%D0%90%D0%9C®ion=77&type=military&v=0dccaf4d"
}
}
}
],
"sources": [
"https://ru.wikipedia.org/wiki/Коды_субъектов_Российской_Федерации",
"https://ru.wikipedia.org/wiki/Регистрационные_знаки_транспортных_средств_в_России",
"https://en.wikipedia.org/wiki/ISO_3166-2:RU",
"ГОСТ Р 50577-2018 (https://protect.gost.ru/document1.aspx?control=31&id=233955)",
"Приказ МВД России от 26.06.2018 № 399 (ред. 2023)",
"https://publication.pravo.gov.ru/Document/View/0001202208170034 (приказ МВД № 553 от 26.07.2022)"
],
"reviewed_at": "2026-09-26",
"engine": {
"scripts": [
"https://openvan.camp/vendor/license-plates/core/plate-core.cd4456178a.js",
"https://openvan.camp/vendor/license-plates/fonts/ru-gost-r-50577.e80db784f9.js",
"https://openvan.camp/vendor/license-plates/countries/ru.38dc249c87.js"
],
"code": "RU",
"usage": "Load the scripts in order, then: const r = Plates.render('RU', number, region); r.error or r.svg (an SVG element); Plates.toFile(r.svg) gives an .svg file."
}
},
"meta": {
"api_version": 1
},
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List plate types
Divisions of the country's plates — private, taxi, motorcycle, diplomatic and so on — each with its own example, colors and size where they differ from the standard passport. Countries without a breakdown return an empty list; the section stays as before for them.
Example request:
curl --request GET \
--get "https://openvan.camp/api/plates/th/types?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/plates/th/types"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/plates/th/types'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: max-age=300, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 119
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"success": true,
"data": [
{
"key": "private",
"class": "private",
"is_default": true,
"name": "Private car (up to 7 seats)",
"description": "Standard private car plate: black characters on white, 2 Thai consonants (กว อักษร) + up to 4 digits, province name in Thai below.",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#FBFBFB"
},
"size_mm": [
340,
150
],
"format": "1กข 1234 / จังหวัด",
"example": {
"number": "กว 2283",
"region": "ภูเก็ต",
"formatted": "กว 2283 ภูเก็ต",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=%E0%B8%81%E0%B8%A7+2283®ion=%E0%B8%A0%E0%B8%B9%E0%B9%80%E0%B8%81%E0%B9%87%E0%B8%95&type=private&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=%E0%B8%81%E0%B8%A7+2283®ion=%E0%B8%A0%E0%B8%B9%E0%B9%80%E0%B8%81%E0%B9%87%E0%B8%95&type=private&v=587b518f"
}
}
},
{
"key": "van",
"class": "private",
"is_default": false,
"name": "Private van (over 7 seats)",
"description": "Private van/minibus with more than 7 seats: blue characters on white, same layout as the standard private plate.",
"colors": {
"text": "#215AB0",
"border": "#215AB0",
"background": "#FBFBFB"
},
"size_mm": [
340,
150
],
"format": "1กข 1234 / จังหวัด",
"example": {
"number": "อห 2502",
"region": "กรุงเทพมหานคร",
"formatted": "อห 2502 กรุงเทพมหานคร",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=%E0%B8%AD%E0%B8%AB+2502®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=van&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=%E0%B8%AD%E0%B8%AB+2502®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=van&v=587b518f"
}
}
},
{
"key": "pickup",
"class": "private",
"is_default": false,
"name": "Private pickup (two-door)",
"description": "Private two-door pickup truck: green characters on white, same layout as the standard private plate (often with a leading digit).",
"colors": {
"text": "#1A432E",
"border": "#1A432E",
"background": "#FBFBFB"
},
"size_mm": [
340,
150
],
"format": "1กข 1234 / จังหวัด",
"example": {
"number": "2ฒย 3201",
"region": "กรุงเทพมหานคร",
"formatted": "2ฒย 3201 กรุงเทพมหานคร",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=2%E0%B8%92%E0%B8%A2+3201®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=pickup&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=2%E0%B8%92%E0%B8%A2+3201®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=pickup&v=587b518f"
}
}
},
{
"key": "tricycle",
"class": "private",
"is_default": false,
"name": "Private motorized tricycle",
"description": "Private motorized tricycle: red characters on white, same layout as the standard private plate.",
"colors": {
"text": "#521C17",
"border": "#521C17",
"background": "#FBFBFB"
},
"size_mm": [
340,
150
],
"format": "1กข 1234 / จังหวัด",
"example": {
"number": "ศก 234",
"region": "นนทบุรี",
"formatted": "ศก 234 นนทบุรี",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=%E0%B8%A8%E0%B8%81+234®ion=%E0%B8%99%E0%B8%99%E0%B8%97%E0%B8%9A%E0%B8%B8%E0%B8%A3%E0%B8%B5&type=tricycle&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=%E0%B8%A8%E0%B8%81+234®ion=%E0%B8%99%E0%B8%99%E0%B8%97%E0%B8%9A%E0%B8%B8%E0%B8%A3%E0%B8%B5&type=tricycle&v=587b518f"
}
}
},
{
"key": "taxi",
"class": "taxi",
"is_default": false,
"name": "Taxi (metered car)",
"description": "Metered car taxi: black digits on yellow, numeric plate \"NN-NNNN\" (no Thai letters) with \"THAILAND\" caption, province below.",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#F5B81B"
},
"size_mm": [
340,
150
],
"format": "12-3456 / จังหวัด",
"example": {
"number": "31-4304",
"region": "กรุงเทพมหานคร",
"formatted": "31-4304 กรุงเทพมหานคร",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=31-4304®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=taxi&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=31-4304®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=taxi&v=587b518f"
}
}
},
{
"key": "taxi_intercity",
"class": "taxi",
"is_default": false,
"name": "Inter-provincial taxi",
"description": "Same numeric plate as the metered taxi, but red characters on yellow.",
"colors": {
"text": "#521C17",
"border": "#521C17",
"background": "#F5B81B"
},
"size_mm": [
340,
150
],
"format": "12-3456 / จังหวัด",
"example": {
"number": "45-1178",
"region": "ชลบุรี",
"formatted": "45-1178 ชลบุรี",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=45-1178®ion=%E0%B8%8A%E0%B8%A5%E0%B8%9A%E0%B8%B8%E0%B8%A3%E0%B8%B5&type=taxi_intercity&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=45-1178®ion=%E0%B8%8A%E0%B8%A5%E0%B8%9A%E0%B8%B8%E0%B8%A3%E0%B8%B5&type=taxi_intercity&v=587b518f"
}
}
},
{
"key": "tuktuk",
"class": "taxi",
"is_default": false,
"name": "Tuk-tuk taxi",
"description": "Three-wheeler (tuk-tuk) taxi: green characters on yellow, (optional digit +) 1 Thai consonant - up to 4 digits, province below.",
"colors": {
"text": "#1A432E",
"border": "#1A432E",
"background": "#F5B81B"
},
"size_mm": [
340,
150
],
"format": "1ก-1234 / จังหวัด",
"example": {
"number": "1ส-0576",
"region": "กรุงเทพมหานคร",
"formatted": "1ส-0576 กรุงเทพมหานคร",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=1%E0%B8%AA-0576®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=tuktuk&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=1%E0%B8%AA-0576®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=tuktuk&v=587b518f"
}
}
},
{
"key": "truck_taxi",
"class": "taxi",
"is_default": false,
"name": "Pick-up taxi (songthaew)",
"description": "Shared pick-up taxi (songthaew): same numeric plate as the metered taxi, but blue characters on yellow.",
"colors": {
"text": "#215AB0",
"border": "#215AB0",
"background": "#F5B81B"
},
"size_mm": [
340,
150
],
"format": "12-3456 / จังหวัด",
"example": {
"number": "20-8236",
"region": "เชียงใหม่",
"formatted": "20-8236 เชียงใหม่",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=20-8236®ion=%E0%B9%80%E0%B8%8A%E0%B8%B5%E0%B8%A2%E0%B8%87%E0%B9%83%E0%B8%AB%E0%B8%A1%E0%B9%88&type=truck_taxi&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=20-8236®ion=%E0%B9%80%E0%B8%8A%E0%B8%B5%E0%B8%A2%E0%B8%87%E0%B9%83%E0%B8%AB%E0%B8%A1%E0%B9%88&type=truck_taxi&v=587b518f"
}
}
},
{
"key": "rental",
"class": "rental",
"is_default": false,
"name": "Service / tourist / rental vehicle",
"description": "Service, tourist or rental vehicle: white characters on aquamarine (teal-green), same layout as the private plate.",
"colors": {
"text": "#FBFBFB",
"border": "#FBFBFB",
"background": "#139690"
},
"size_mm": [
340,
150
],
"format": "1กข 1234 / จังหวัด",
"example": {
"number": "ฌข 1992",
"region": "กรุงเทพมหานคร",
"formatted": "ฌข 1992 กรุงเทพมหานคร",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=%E0%B8%8C%E0%B8%82+1992®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=rental&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=%E0%B8%8C%E0%B8%82+1992®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=rental&v=587b518f"
}
}
},
{
"key": "truck",
"class": "commercial",
"is_default": false,
"name": "Private bus or truck",
"description": "Large-format bus/truck plate (220x440 mm): black on white, same series-letters + number / province layout as the private car plate, just bigger. No reference photo was available; size from DLT norm (en/th Wikipedia).",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#FBFBFB"
},
"size_mm": [
440,
220
],
"format": "1กข 1234 / จังหวัด",
"example": {
"number": "บษ 1234",
"region": "กรุงเทพมหานคร",
"formatted": "บษ 1234 กรุงเทพมหานคร",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=%E0%B8%9A%E0%B8%A9+1234®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=truck&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=%E0%B8%9A%E0%B8%A9+1234®ion=%E0%B8%81%E0%B8%A3%E0%B8%B8%E0%B8%87%E0%B9%80%E0%B8%97%E0%B8%9E%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%99%E0%B8%84%E0%B8%A3&type=truck&v=587b518f"
}
}
},
{
"key": "truck_hire",
"class": "commercial",
"is_default": false,
"name": "Hired bus or truck",
"description": "Large-format bus/truck plate (220x440 mm): same layout as the private bus/truck plate, but black on yellow. No reference photo was available.",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#F5B81B"
},
"size_mm": [
440,
220
],
"format": "1กข 1234 / จังหวัด",
"example": {
"number": "นค 5678",
"region": "ชลบุรี",
"formatted": "นค 5678 ชลบุรี",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=%E0%B8%99%E0%B8%84+5678®ion=%E0%B8%8A%E0%B8%A5%E0%B8%9A%E0%B8%B8%E0%B8%A3%E0%B8%B5&type=truck_hire&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=%E0%B8%99%E0%B8%84+5678®ion=%E0%B8%8A%E0%B8%A5%E0%B8%9A%E0%B8%B8%E0%B8%A3%E0%B8%B5&type=truck_hire&v=587b518f"
}
}
},
{
"key": "motorcycle",
"class": "motorcycle",
"is_default": false,
"name": "Private motorcycle",
"description": "Private motorcycle plate: black on white, three lines (series letters / province / number), 220x172 mm (wider than tall).",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#FBFBFB"
},
"size_mm": [
220,
172
],
"format": "กขค / จังหวัด / 123",
"example": {
"number": "ขนษ 660",
"region": "ระยอง",
"formatted": "ขนษ 660 ระยอง",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=%E0%B8%82%E0%B8%99%E0%B8%A9+660®ion=%E0%B8%A3%E0%B8%B0%E0%B8%A2%E0%B8%AD%E0%B8%87&type=motorcycle&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=%E0%B8%82%E0%B8%99%E0%B8%A9+660®ion=%E0%B8%A3%E0%B8%B0%E0%B8%A2%E0%B8%AD%E0%B8%87&type=motorcycle&v=587b518f"
}
}
},
{
"key": "trailer",
"class": "trailer",
"is_default": false,
"name": "Trailer / roller / tractor / farm vehicle",
"description": "Small trailer, roller, tractor or farm vehicle: black characters on orange, (optional digit +) 1 Thai consonant - up to 4 digits, province below.",
"colors": {
"text": "#111111",
"border": "#111111",
"background": "#E55351"
},
"size_mm": [
340,
150
],
"format": "1ก-1234 / จังหวัด",
"example": {
"number": "ก-0920",
"region": "ระยอง",
"formatted": "ก-0920 ระยอง",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=%E0%B8%81-0920®ion=%E0%B8%A3%E0%B8%B0%E0%B8%A2%E0%B8%AD%E0%B8%87&type=trailer&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=%E0%B8%81-0920®ion=%E0%B8%A3%E0%B8%B0%E0%B8%A2%E0%B8%AD%E0%B8%87&type=trailer&v=587b518f"
}
}
},
{
"key": "international",
"class": "international",
"is_default": false,
"name": "International plate (Latin script)",
"description": "Temporary plate for a Thai-registered vehicle leaving the country: Latin letter+digit code and number, \"THAILAND\" + year code below. Reference photo shows green characters on white (DLT's own reference text says black; kept the photographed colour, both noted in sources).",
"colors": {
"text": "#263740",
"border": "#263740",
"background": "#FBFBFB"
},
"size_mm": [
340,
150
],
"format": "R1 8535 / THAILAND",
"example": {
"number": "R1 8535",
"region": "",
"formatted": "R1 8535",
"image": {
"svg": "https://openvan.camp/api/plates/th/plate.svg?number=R1+8535&type=international&v=587b518f",
"png": "https://openvan.camp/api/plates/th/plate.png?number=R1+8535&type=international&v=587b518f"
}
}
}
],
"meta": {
"api_version": 1
},
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Validate a plate
Checks a number against the country's format, normalizes look-alike letters (Latin A → Cyrillic А on Russian plates) and resolves the region code.
Example request:
curl --request GET \
--get "https://openvan.camp/api/plates/ru/validate?number=A123BC®ion=77&type=taxi&locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/plates/ru/validate"
);
const params = {
"number": "A123BC",
"region": "77",
"type": "taxi",
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/plates/ru/validate'
params = {
'number': 'A123BC',
'region': '77',
'type': 'taxi',
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (422):
Show headers
cache-control: no-cache, private
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 119
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"success": false,
"error": "invalid_type",
"message": "Unknown plate type; see GET /api/plates/{code}/types."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Random plate
A random plate in the country's current format with a real region code, plus image URLs.
Example request:
curl --request GET \
--get "https://openvan.camp/api/plates/ru/random?type=taxi" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/plates/ru/random"
);
const params = {
"type": "taxi",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/plates/ru/random'
params = {
'type': 'taxi',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (422):
Show headers
cache-control: no-cache, private
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 60
x-ratelimit-remaining: 58
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"success": false,
"error": "invalid_type",
"message": "Unknown plate type; see GET /api/plates/{code}/types."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Plate image (SVG)
The plate drawn exactly as on openvan.camp: vector SVG with the real plate typeface
as outlines (no fonts to install), physical size in millimetres. Embed with <img src>.
Text outside the country's format returns 422 unless custom=1 — then it is drawn
in the plate layout as custom text (e.g. a name).
Example request:
curl --request GET \
--get "https://openvan.camp/api/plates/ru/plate.svg?number=A123BC®ion=77&custom=&type=taxi" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/plates/ru/plate.svg"
);
const params = {
"number": "A123BC",
"region": "77",
"custom": "0",
"type": "taxi",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/plates/ru/plate.svg'
params = {
'number': 'A123BC',
'region': '77',
'custom': '0',
'type': 'taxi',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Binary data - SVG image (image/svg+xml)
Example response (422, Not a valid plate):
{
"success": false,
"error": "invalid_plate",
"message": "The number does not match the country format; pass custom=1 to draw any text."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Plate image (PNG)
Same plate as the SVG endpoint, rasterized with a transparent background.
Example request:
curl --request GET \
--get "https://openvan.camp/api/plates/ru/plate.png?number=A123BC®ion=77&custom=&type=taxi&width=800" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/plates/ru/plate.png"
);
const params = {
"number": "A123BC",
"region": "77",
"custom": "0",
"type": "taxi",
"width": "800",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/plates/ru/plate.png'
params = {
'number': 'A123BC',
'region': '77',
'custom': '0',
'type': 'taxi',
'width': '800',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Binary data - PNG image (image/png)
Example response (422, Not a valid plate):
{
"success": false,
"error": "invalid_plate",
"message": "The number does not match the country format; pass custom=1 to draw any text."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Power Plugs
List power plugs and mains voltage by country
Plug types by the IEC classification (A–N), nominal voltage (V) and frequency (Hz), plus the hook-up connector at European campsites (CEE17, blue three-pin, 16 A).
Example request:
curl --request GET \
--get "https://openvan.camp/api/electricity/countries?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/electricity/countries"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/electricity/countries'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"count": 1,
"countries": [
{
"country_code": "IT",
"name": "Italy",
"plugs": [
"C",
"F",
"L"
],
"voltage": 230,
"frequency": 50
}
],
"campsites": {
"scope": "europe",
"connector": "CEE17",
"share_percent": 80,
"amps": [
3,
10
],
"reversed_polarity_common": true
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get power plugs and mains voltage of one country
With the source of the value (a Wikipedia article revision) and the Wikidata answer for cross-checking.
Example request:
curl --request GET \
--get "https://openvan.camp/api/electricity/countries/GB?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/electricity/countries/GB"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/electricity/countries/GB'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"country_code": "GB",
"name": "United Kingdom",
"plugs": [
"D",
"G",
"M"
],
"voltage": 230,
"frequency": 50,
"source": {
"name": "Wikipedia: Mains electricity by country",
"url": "https://en.wikipedia.org/wiki/Mains_electricity_by_country?oldid=1377814492",
"row": "United Kingdom"
},
"wikidata_plugs": [
"G"
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Roadbook
Create a roadbook from place names
Builds an OpenVan roadbook — the same trip plan people make in the roadbook wizard — from 2-10 place names. Identical requests return the same roadbook. The route is built in the background: poll the status endpoint until it is ready, then open the url.
Example request:
curl --request POST \
"https://openvan.camp/api/roadbook/from-places" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"places\": [
\"Munich\",
\"Venice\"
],
\"name\": \"Munich — Venice\",
\"locale\": \"en\",
\"inputs\": []
}"
const url = new URL(
"https://openvan.camp/api/roadbook/from-places"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"places": [
"Munich",
"Venice"
],
"name": "Munich — Venice",
"locale": "en",
"inputs": []
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/roadbook/from-places'
payload = {
"places": [
"Munich",
"Venice"
],
"name": "Munich — Venice",
"locale": "en",
"inputs": []
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Example response (201, New roadbook):
{
"code": "wqhk8",
"url": "/en/roadbook/wqhk8-munich-venice",
"status": "pending",
"points": [
{
"name": "Munich",
"lat": 48.13743,
"lng": 11.57549,
"country_code": "DE"
}
]
}
Example response (422, Place not found):
{
"error": "geocode",
"message": "Place not found: Atlantis",
"failed": "Atlantis"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Roadbook build status
Status of the background route build: pending, building, ready or failed (no road route between the places). Poll every 1-2 seconds; long routes take up to a minute.
Example request:
curl --request GET \
--get "https://openvan.camp/api/roadbook/wqhk8/status" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/roadbook/wqhk8/status"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/roadbook/wqhk8/status'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Ready):
{
"status": "ready",
"error": null,
"progress": {
"stage": "done"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Stories
Vanlife news stories — clustered and translated into 7 languages. Each story aggregates multiple source articles from different publishers.
List stories
Returns a paginated list of vanlife news stories in the requested language.
Titles and summaries are translated; sources are original-language articles.
Example request:
curl --request GET \
--get "https://openvan.camp/api/stories?locale=en&category=festival&country=DE&search=vanlife+festival&page=1&limit=20" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"page\": 16,
\"limit\": 22,
\"search\": \"g\"
}"
const url = new URL(
"https://openvan.camp/api/stories"
);
const params = {
"locale": "en",
"category": "festival",
"country": "DE",
"search": "vanlife festival",
"page": "1",
"limit": "20",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"page": 16,
"limit": 22,
"search": "g"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/stories'
payload = {
"page": 16,
"limit": 22,
"search": "g"
}
params = {
'locale': 'en',
'category': 'festival',
'country': 'DE',
'search': 'vanlife festival',
'page': '1',
'limit': '20',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, json=payload, params=params)
response.json()Example response (200, Success):
{
"stories": [
{
"slug": "adac-camper-des-jahres-der-wettbewerb-fuer",
"title": "ADAC launches 'Camper of the Year' competition for motorhome drivers",
"summary": "ADAC is holding the national 'Camper des Jahres 2026' competition for motorhome owners...",
"image_url": "https://...",
"category": {
"slug": "festival",
"name": "Festivals"
},
"countries": [
{
"code": "de",
"name": "Germany",
"flag_emoji": "🇩🇪"
}
],
"first_published_at": "2026-01-22T11:00:00+03:00",
"articles_count": 5,
"url": "https://openvan.camp/en/news/festival/adac-camper-des-jahres-der-wettbewerb-fuer"
}
],
"pagination": {
"total": 120,
"page": 1,
"limit": 20,
"pages": 6
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get story details
Returns full details for a single news story including all source articles.
The sources array contains original publisher articles with direct links.
Example request:
curl --request GET \
--get "https://openvan.camp/api/story/adac-camper-des-jahres-der-wettbewerb-fuer?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/story/adac-camper-des-jahres-der-wettbewerb-fuer"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/story/adac-camper-des-jahres-der-wettbewerb-fuer'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200, Success):
{
"slug": "adac-camper-des-jahres-der-wettbewerb-fuer",
"title": "ADAC launches 'Camper of the Year' competition for motorhome drivers",
"summary": "ADAC is holding the national 'Camper des Jahres 2026' competition for motorhome owners...",
"image_url": "https://...",
"category": {
"slug": "festival",
"name": "Festivals"
},
"countries": [
{
"code": "de",
"name": "Germany",
"flag_emoji": "🇩🇪"
}
],
"first_published_at": "2026-01-22T11:00:00+03:00",
"last_updated_at": "2026-07-04T04:16:47+03:00",
"articles_count": 5,
"url": "https://openvan.camp/en/news/festival/adac-camper-des-jahres-der-wettbewerb-fuer",
"sources": [
{
"title": "Nürburgring: Bundesweiter Wettbewerb «Camper des Jahres»",
"original_url": "https://www.blick-aktuell.de/Berichte/...",
"source_name": "BLICK aktuell",
"published_at": "2026-04-30T09:24:20+03:00",
"language": "de",
"image_url": "https://..."
}
]
}
Example response (404, Not found):
{
"error": "Story not found."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Semantic news search (RAG)
Semantic search over news via the same engine as the /{locale}/search page (SemanticSearchService: Jina embeddings + pgvector). Returns matching news stories ranked by similarity. Story summary shape matches /stories.
Example request:
curl --request GET \
--get "https://openvan.camp/api/news/search?q=ford+camper+2026&locale=ru&limit=8" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/news/search"
);
const params = {
"q": "ford camper 2026",
"locale": "ru",
"limit": "8",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/news/search'
params = {
'q': 'ford camper 2026',
'locale': 'ru',
'limit': '8',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: no-cache, private
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 119
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"results": [
{
"slug": "usogo-10-ekzemplyariv-u-sviti-yak-viglyadaye",
"title": "Всего 10 экземпляров в мире: как выглядит роскошный дом на колесах на базе Ford",
"summary": "На продажу выставлен EarthRoamer XV-HD 2016 года на базе Ford F-750 Super Duty 4x4. Цена — $485 000. Всего выпущено 10 таких машин. Автомобиль оснащен дизельным V8 объемом 6,7 л мощностью 330 л.с., запас хода — 4000 км, запас воды — 946 л. Кузов покрыт защитным составом Line-X, масса — 13 608 кг. В 2019 году модель была обновлена.",
"image_url": "https://i.infocar.ua/i/7/191471/600x396.jpg",
"category": {
"slug": "review",
"name": "Обзоры"
},
"countries": [
{
"code": "us",
"name": "США",
"flag_emoji": "🇺🇸"
}
],
"first_published_at": "2026-08-14T09:46:31+03:00",
"articles_count": 1,
"url": "https://openvan.camp/ru/news/review/usogo-10-ekzemplyariv-u-sviti-yak-viglyadaye",
"score": 0.562
},
{
"slug": "nuggets-slowselling-ford-camper-axed-uk-auto",
"title": "Ford Transit Nugget снят с продажи в Великобритании",
"summary": "Ford прекратил продажи кемпера Transit Nugget в Великобритании из-за низкого спроса. Модель, созданная совместно с Westfalia, остаётся доступной на континентальных рынках с левым рулём. На сайте Ford Nugget ещё указан по цене от 63 150 фунтов стерлингов без НДС, но отсутствует в конфигураторе, и запасы ограничены.",
"image_url": null,
"category": {
"slug": "industry",
"name": "Индустрия"
},
"countries": [
{
"code": "gb",
"name": "Великобритания",
"flag_emoji": "🇬🇧"
}
],
"first_published_at": "2026-09-22T11:24:14+03:00",
"articles_count": 1,
"url": "https://openvan.camp/ru/news/industry/nuggets-slowselling-ford-camper-axed-uk-auto",
"score": 0.562
},
{
"slug": "notable-camper-vans-weve-found-2026-far-gear",
"title": "Самые заметные кемперы 2026 года: обзор",
"summary": "В 2026 году сегмент кемперов активно развивается: появляются новые электрические модели от Hyundai, Kia и Volkswagen, а также многочисленные доработки от сторонних производителей. Среди традиционных платформ по-прежнему популярны Mercedes Sprinter и Ram ProMaster.",
"image_url": "https://www.gearpatrol.com/wp-content/uploads/sites/2/2026/08/Camper-Vans-Roundup-Lead.webp",
"category": {
"slug": "industry",
"name": "Индустрия"
},
"countries": [],
"first_published_at": "2026-08-12T20:04:31+03:00",
"articles_count": 1,
"url": "https://openvan.camp/ru/news/industry/notable-camper-vans-weve-found-2026-far-gear",
"score": 0.555
},
{
"slug": "6wheel-ford-ranger-super-duty-rv-pure-excess",
"title": "Шестиколесный Ford Ranger Super Duty RV: немецкий избыток, недоступный американцам",
"summary": "Компания Kerkamm представила первый в Европе кемпер на базе Ford Ranger Super Duty с дополнительной осью, увеличивающей полную массу до 5,9 тонны. Модель дебютировала на выставке Caravan Salon в Дюссельдорфе и доступна по цене 379 900 евро. Ford не планирует продавать Ranger Super Duty в США.",
"image_url": "https://assets.newatlas.com/dims4/default/2596778/2147483647/strip/true/crop/1841x967+0+197/resize/1200x630!/quality/90/?url=https%3A%2F%2Fnewatlas-brightspot.s3.ap-southeast-2.amazonaws.com%2Ff0%2Fb2%2F680ad3134239a9f0bf8587a0d600%2Ffullsizeoutput-171f.jpeg&na.image_optimisation=0",
"category": {
"slug": "industry",
"name": "Индустрия"
},
"countries": [
{
"code": "de",
"name": "Германия",
"flag_emoji": "🇩🇪"
}
],
"first_published_at": "2026-09-05T20:34:27+03:00",
"articles_count": 1,
"url": "https://openvan.camp/ru/news/industry/6wheel-ford-ranger-super-duty-rv-pure-excess",
"score": 0.555
},
{
"slug": "vintage-homeonwheels-1965-ford-f250-mitchell-sons",
"title": "Ford F-250 1965 года с кемпером Mitchell & Sons выставлен на продажу",
"summary": "На Bring a Trailer выставлен восстановленный пикап Ford F-250 1965 года с кемпером Mitchell & Sons Fishing Hut Delux 1976 года. Текущая ставка — 15 000 долларов, торги завершаются через день.",
"image_url": "https://silodrome.com/wp-content/uploads/2026/09/Ford-F-250-Mitchell-Sons-Campers.jpg",
"category": {
"slug": "industry",
"name": "Индустрия"
},
"countries": [
{
"code": "us",
"name": "США",
"flag_emoji": "🇺🇸"
}
],
"first_published_at": "2026-09-12T06:30:43+03:00",
"articles_count": 2,
"url": "https://openvan.camp/ru/news/industry/vintage-homeonwheels-1965-ford-f250-mitchell-sons",
"score": 0.551
},
{
"slug": "ford-feiert-40-jahre-nugget-auf-dem-caravan-salon",
"title": "Caravan Salon: Ford Nugget отмечает юбилей",
"summary": "На выставке Caravan Salon в Дюссельдорфе компания Ford Pro представит ограниченную серию «40 лет Nugget», основанную на комплектации Active с длинной колесной базой L2 и 2,0-литровым дизелем EcoBlue мощностью 170 л.с. Цена спецверсии — 89 647 евро. Также будет показан отреставрированный Nugget первого поколения 1986 года. Пятое поколение модели впервые доступно с плагин-гибридной силовой установкой (233 л.с.), а также с новым жестким высоким верхом, делающим кемпер пригодным для круглогодичного использования.",
"image_url": "https://www.auto-medienportal.net/bild/detail/ford-nugget-sonderedition-40-jahre-nugget-0",
"category": {
"slug": "expo",
"name": "Выставки"
},
"countries": [
{
"code": "de",
"name": "Германия",
"flag_emoji": "🇩🇪"
}
],
"first_published_at": "2026-08-25T15:27:12+03:00",
"articles_count": 4,
"url": "https://openvan.camp/ru/news/expo/ford-feiert-40-jahre-nugget-auf-dem-caravan-salon",
"score": 0.55
},
{
"slug": "sleep-inside-ford-bronco-patent-makes-strong-case",
"title": "Ford запатентовала спальные аксессуары для внедорожника Bronco",
"summary": "Ford подала патент на складную платформу для сна и палатку на крышу для Bronco. Заявка описывает варианты с обогреваемым матрасом и доступом из салона.",
"image_url": null,
"category": {
"slug": "builds",
"name": "Самоделки"
},
"countries": [
{
"code": "us",
"name": "США",
"flag_emoji": "🇺🇸"
}
],
"first_published_at": "2026-09-03T20:56:53+03:00",
"articles_count": 2,
"url": "https://openvan.camp/ru/news/builds/sleep-inside-ford-bronco-patent-makes-strong-case",
"score": 0.546
},
{
"slug": "toscana-protagonista-al-salone-del-camper-agipress",
"title": "Тоскана станет главным экспонентом на Salone del Camper в Парме",
"summary": "На выставке Salone del Camper, которая пройдет в Парме с 12 по 20 сентября 2026 года, Тоскана будет представлена значительной экспозиционной площадью. Регион является центром итальянской «Camper Valley»: между провинциями Флоренция и Сиена производится около 80% итальянских домов на колесах, с годовым оборотом более 500 миллионов евро, а с учетом смежных отраслей — свыше миллиарда. На стенде Toscana Promozione Turistica посетителям представят маршруты, включая тематические туры, посвященные Джакомо Пуччини, а также предложения от компаний Laika и Giottiline с новыми моделями на сезон 2026/2027.",
"image_url": null,
"category": {
"slug": "expo",
"name": "Выставки"
},
"countries": [
{
"code": "it",
"name": "Италия",
"flag_emoji": "🇮🇹"
}
],
"first_published_at": "2026-08-30T08:24:37+03:00",
"articles_count": 3,
"url": "https://openvan.camp/ru/news/expo/toscana-protagonista-al-salone-del-camper-agipress",
"score": 0.546
}
],
"timing_ms": 425,
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Daily news digest (raw content)
Returns the structured evening news digest for the requested locale, assembled once per evening by the site. Consumers (site social channels,
Example request:
curl --request GET \
--get "https://openvan.camp/api/news/digest?locale=ru" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/news/digest"
);
const params = {
"locale": "ru",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/news/digest'
params = {
'locale': 'ru',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200, Success):
{
"locale": "ru",
"date": "2026-07-25",
"intro": "Дороги сегодня подкинули всё…",
"groups": [
{
"key": "incident",
"title": "⚠️ Происшествия",
"items": [
{
"id": 123,
"flag": "🇩🇪",
"hook": "Заголовок-зацепка",
"detail": "Деталь сюжета",
"url": "https://openvan.camp/ru/news/incident/slug"
}
]
}
]
}
Example response (204, No digest yet):
Empty response
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Toll Roads
List countries with toll data
Every country with verified toll rates: payment system, per-km rate by vehicle class,
vignettes, number of sections with their own tariff and of toll bridges/tunnels.
system_type: closed (ticket system), open (toll plazas on the road), free_flow
(no barriers), vignette (time-based fee), free (no toll roads).
Example request:
curl --request GET \
--get "https://openvan.camp/api/tolls/countries?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/tolls/countries"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/tolls/countries'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"count": 1,
"countries": [
{
"country_code": "FR",
"name": "France",
"system_type": "closed",
"rates": [
{
"vehicle_class": "van",
"system_type": "closed",
"rate_per_km_local": 0.145,
"currency": "EUR",
"rate_per_km_eur": 0.145,
"verified_at": "2026-09-22",
"source_url": "https://www.vinci-autoroutes.com/"
}
],
"vignettes": [],
"sections_count": 0,
"objects_count": 3,
"verified_at": "2026-09-22"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get toll data of one country
The full country reference: rates by vehicle class, every vignette duration, sections with their own tariff (concessions) and toll bridges, tunnels and passes with coordinates.
Example request:
curl --request GET \
--get "https://openvan.camp/api/tolls/countries/IT?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/tolls/countries/IT"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/tolls/countries/IT'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: max-age=3600, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 119
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"country_code": "IT",
"name": "Italy",
"system_type": "closed",
"rates": [
{
"vehicle_class": "car",
"system_type": "closed",
"rate_per_km_local": 0.09,
"currency": "EUR",
"rate_per_km_eur": 0.09,
"seasonal": null,
"verified_at": "2026-10-16",
"source_url": "https://www.autostrade.it/en/servizi-al-cliente/pedaggio/come-si-calcola-il-pedaggio"
},
{
"vehicle_class": "heavy",
"system_type": "closed",
"rate_per_km_local": 0.0922,
"currency": "EUR",
"rate_per_km_eur": 0.0922,
"seasonal": null,
"verified_at": "2026-10-16",
"source_url": "https://www.autostrade.it/en/servizi-al-cliente/pedaggio/come-si-calcola-il-pedaggio"
},
{
"vehicle_class": "van",
"system_type": "closed",
"rate_per_km_local": 0.0922,
"currency": "EUR",
"rate_per_km_eur": 0.0922,
"seasonal": null,
"verified_at": "2026-10-16",
"source_url": "https://www.autostrade.it/en/servizi-al-cliente/pedaggio/come-si-calcola-il-pedaggio"
}
],
"vignettes": [],
"sections_count": 0,
"objects_count": 7,
"verified_at": "2026-10-16",
"sections": [],
"objects": [
{
"slug": "it-ancona-igoumenitsa-ferry",
"name": "Ancona — Igoumenitsa ferry",
"kind": "ferry",
"length_km": 740,
"lat": 41.73886,
"lng": 17.11428,
"prices_by_class": {
"car": 310,
"van": 600
},
"currency": "EUR",
"prices_eur_by_class": {
"car": 310,
"van": 600
},
"verified_at": "2026-10-01",
"source_url": "https://www.ferries.gr/en/ferry-companies/minoan-lines/route/ancona-corfu-igoumenitsa-patras/"
},
{
"slug": "it-bari-dubrovnik-ferry",
"name": "Bari — Dubrovnik ferry",
"kind": "ferry",
"length_km": 208,
"lat": 41.92517,
"lng": 17.45498,
"prices_by_class": {
"car": 275,
"van": 355
},
"currency": "EUR",
"prices_eur_by_class": {
"car": 275,
"van": 355
},
"verified_at": "2026-10-01",
"source_url": "https://www.croatiaferries.com/bari-dubrovnik-ferry.htm"
},
{
"slug": "it-brindisi-igoumenitsa-ferry",
"name": "Brindisi — Igoumenitsa ferry",
"kind": "ferry",
"length_km": 255,
"lat": 40.56734,
"lng": 18.37716,
"prices_by_class": {
"car": 240,
"van": 290
},
"currency": "EUR",
"prices_eur_by_class": {
"car": 240,
"van": 290
},
"verified_at": "2026-10-01",
"source_url": "https://www.ferries.gr/en/ferry-companies/grimaldi-lines/route/brindisi-corfu-igoumenitsa/"
},
{
"slug": "it-livorno-bastia-ferry",
"name": "Livorno — Bastia ferry",
"kind": "ferry",
"length_km": 123,
"lat": 43.07514,
"lng": 9.98726,
"prices_by_class": {
"car": 170,
"van": 300
},
"currency": "EUR",
"prices_eur_by_class": {
"car": 170,
"van": 300
},
"verified_at": "2026-10-01",
"source_url": "https://www.moby.it/offerte/corsica/camper-furgone-minibus/"
},
{
"slug": "it-piombino-portoferraio-ferry",
"name": "Piombino — Portoferraio ferry (Elba)",
"kind": "ferry",
"length_km": 21,
"lat": 42.89292,
"lng": 10.50394,
"prices_by_class": {
"car": 100,
"van": 190
},
"currency": "EUR",
"prices_eur_by_class": {
"car": 100,
"van": 190
},
"verified_at": "2026-10-01",
"source_url": "https://www.moby.it/offerte/elba/camper/"
},
{
"slug": "it-santa-teresa-bonifacio-ferry",
"name": "Santa Teresa Gallura — Bonifacio ferry",
"kind": "ferry",
"length_km": 18,
"lat": 41.32172,
"lng": 9.17572,
"prices_by_class": {
"car": 100,
"van": 190
},
"currency": "EUR",
"prices_eur_by_class": {
"car": 100,
"van": 190
},
"verified_at": "2026-10-01",
"source_url": "https://www.moby.it/rotte/traghetti-corsica/santa-teresa-bonifacio-santa-teresa/"
},
{
"slug": "it-villa-san-giovanni-messina-ferry",
"name": "Villa San Giovanni — Messina ferry",
"kind": "ferry",
"length_km": 7,
"lat": 38.22205,
"lng": 15.60731,
"prices_by_class": {
"car": 43.7,
"van": 62.4,
"heavy": 62.4,
"multiaxle": 62.4
},
"currency": "EUR",
"prices_eur_by_class": {
"car": 43.7,
"van": 62.4,
"heavy": 62.4,
"multiaxle": 62.4
},
"verified_at": "2026-10-16",
"source_url": "https://www.carontetourist.it/en/strait-messina/rates-camper"
}
],
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Example response (404):
{
"error": "not_found",
"message": "No toll data for this country"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Estimate tolls for a route
Routes between place names (a city, an address, or a country — then its capital) with
the same engine as the openvan.camp map and adds up the tolled parts: kilometres at
country rates, vignettes, bridges and tunnels. The answer is a range: in ticket systems
the price depends on the exact exits. partial: true means not every fee is included:
unknown_countries have no reference data, unchecked_countries charge per kilometre
but the tolled sections of this route could not be measured. points shows where each
name resolved (country and coordinates).
Example request:
curl --request GET \
--get "https://openvan.camp/api/tolls/route?waypoints=Rome%7CParis&vehicle_class=van&locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"waypoints\": [
\"b\"
],
\"vehicle_class\": \"heavy\"
}"
const url = new URL(
"https://openvan.camp/api/tolls/route"
);
const params = {
"waypoints": "Rome|Paris",
"vehicle_class": "van",
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"waypoints": [
"b"
],
"vehicle_class": "heavy"
};
fetch(url, {
method: "GET",
headers,
body: JSON.stringify(body),
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/tolls/route'
payload = {
"waypoints": [
"b"
],
"vehicle_class": "heavy"
}
params = {
'waypoints': 'Rome|Paris',
'vehicle_class': 'van',
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, json=payload, params=params)
response.json()Example response (200):
{
"waypoints": [
"Rome",
"Paris"
],
"points": [
{
"name": "Rome",
"lat": 41.89193,
"lon": 12.51133,
"country_code": "IT"
},
{
"name": "Paris",
"lat": 48.85341,
"lon": 2.3488,
"country_code": "FR"
}
],
"distance_km": 1421,
"vehicle_class": "van",
"route_countries": [
"IT",
"FR"
],
"total_eur": 248.95,
"range_eur": {
"min": 211.61,
"max": 311.19
},
"partial": false,
"unknown_countries": [],
"unchecked_countries": [],
"items": [
{
"type": "per_km",
"country": "IT",
"amount_local": 90.96,
"currency": "EUR",
"amount_eur": 90.96,
"meta": {
"km": 758,
"rate_per_km": 0.12,
"system": "closed"
},
"verified_at": "2026-09-21",
"source_url": "https://tollguru.com/italy-toll"
}
]
}
Example response (422):
{
"error": "geocode",
"message": "Place not found: Qwertyville",
"failed": "Qwertyville"
}
Example response (422):
{
"error": "route_not_found",
"message": "No road route between these places (sea crossing or no road network)."
}
Example response (503):
{
"error": "routing_unavailable",
"message": "Routing is temporarily unavailable, retry in a minute."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Travel Hazards
Get travel advice level and current disasters in a country
UK FCDO travel advice level (advisory.level, from calm to strict: none,
avoid_all_but_essential_travel_to_parts, avoid_all_but_essential_travel_to_whole_country,
avoid_all_travel_to_parts, avoid_all_travel_to_whole_country) and current GDACS natural
disasters: type FL flood, EQ earthquake, TC tropical cyclone, WF wildfire, DR drought,
VO volcano; alert_level green / orange / red. The situation now, not a forecast.
Example request:
curl --request GET \
--get "https://openvan.camp/api/hazards/countries/TR?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/hazards/countries/TR"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/hazards/countries/TR'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"country_code": "TR",
"name": "Turkey",
"advisory": {
"level": "avoid_all_travel_to_parts",
"severity": 3,
"url": "https://www.gov.uk/foreign-travel-advice/turkey",
"updated_at": "2026-09-21",
"summary": "...",
"source": "fcdo"
},
"events": [
{
"type": "WF",
"alert_level": "green",
"name": "Forest fires in Turkey",
"country_code": "TR",
"lat": 36.9,
"lng": 31.1,
"starts_at": "2026-09-30T00:00:00+00:00",
"ends_at": "2026-10-01T00:00:00+00:00",
"severity": "Burned area 1200 ha",
"url": "https://www.gdacs.org/report.aspx?eventid=1&eventtype=WF",
"source": "gdacs"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get active fires in a bounding box
NASA FIRMS detections from the VIIRS satellites (NOAA-20, Suomi NPP) of the last
48 hours, low confidence excluded. frp is fire radiative power in MW: single digits
are a small fire or a gas flare, tens and hundreds a real wildfire. The box is at most
10°×10°. A new area answers 503 while its data loads — retry in a minute.
Example request:
curl --request GET \
--get "https://openvan.camp/api/hazards/fires?bbox=29%2C36%2C33%2C38" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/hazards/fires"
);
const params = {
"bbox": "29,36,33,38",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/hazards/fires'
params = {
'bbox': '29,36,33,38',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"bbox": [
29,
36,
33,
38
],
"count": 1,
"fires": [
{
"lat": 36.91,
"lng": 31.12,
"frp": 42.5,
"seen_at": "2026-10-01T10:38:00+00:00",
"confidence": "h"
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
VanBasket Food Price Index
VanBasket Index shows how expensive food is in a country relative to the world average (World = 100). Based on World Bank ICP 2021 data, adjusted with IMF CPI.
Get all countries with VanBasket index.
Returns food price index for 90+ countries. World average = 100. Above 100 = more expensive, below 100 = cheaper.
Example request:
curl --request GET \
--get "https://openvan.camp/api/vanbasket/countries" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vanbasket/countries"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vanbasket/countries'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200):
{
"success": true,
"data": {
"DE": {
"country_code": "DE",
"country_name": "Germany",
"vanbasket_index": 124.9,
"pct_vs_world": 24.9
}
},
"meta": {
"total_countries": 92
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Compare food prices between two countries.
Example request:
curl --request GET \
--get "https://openvan.camp/api/vanbasket/compare?from=DE&to=TR" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vanbasket/compare"
);
const params = {
"from": "DE",
"to": "TR",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vanbasket/compare'
params = {
'from': 'DE',
'to': 'TR',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"success": true,
"data": {
"from": {
"country_code": "DE",
"country_name": "Germany",
"vanbasket_index": 124.9
},
"to": {
"country_code": "TR",
"country_name": "Turkey",
"vanbasket_index": 88
},
"diff_percent": -29.5,
"budget_100": 70,
"cheaper": true
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get VanBasket country details
Detailed data for a single country including historical snapshots.
Example request:
curl --request GET \
--get "https://openvan.camp/api/vanbasket/countries/DE" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vanbasket/countries/DE"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vanbasket/countries/DE'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200):
{
"success": true,
"data": {
"country": {
"country_code": "DE",
"vanbasket_index": 124.9
},
"snapshots": [
{
"snapshot_date": "2021-01-01",
"vanbasket_index": 124.9
}
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
VanSky Weather
VanSky weather for all countries
Summary for every country: VanScore (0–100), day and night temperature, solar yield, sea temperature. The response is about 900 KB and cached for 1 hour.
Example request:
curl --request GET \
--get "https://openvan.camp/api/vansky/weather" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vansky/weather"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vansky/weather'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Success (truncated)):
{
"data": [
{
"country_code": "DE",
"country_slug": "germany",
"van_score": 90,
"temp_day": 24.1,
"temp_night": 14.3,
"solar_kwh": 2.8,
"sea_temp": 18.2,
"is_coastal": true,
"label": "ideal"
}
],
"count": 162,
"updated_at": "2026-08-27T02:00:00+03:00",
"source": "Open-Meteo (api.open-meteo.com)"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
VanSky weather for one country
Detailed data of one country with a 7-day forecast, marine and solar data.
Example request:
curl --request GET \
--get "https://openvan.camp/api/vansky/weather/DE?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vansky/weather/DE"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vansky/weather/DE'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: max-age=3600, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 118
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"data": {
"code": "DE",
"marine": {
"sea_temp": 12.9,
"wave_dir": 289,
"swell_dir": 299,
"wave_height": 3.82,
"wave_period": 9.6,
"swell_height": 1.72,
"swell_period": 12.6,
"wind_wave_dir": 287,
"wind_wave_height": 3.42,
"wind_wave_period": 8.7
},
"region": "europe",
"weather": {
"sunset": "2026-10-26T16:48+01:00",
"uv_max": null,
"sunrise": "2026-10-26T06:51+01:00",
"humidity": 74,
"temp_day": 12.4,
"wind_dir": 233,
"wind_max": 15,
"dew_point": 4.2,
"precip_sum": 0,
"temp_night": 7.6,
"cloud_cover": 63,
"temp_current": 8.6,
"weather_code": 2,
"feels_like_day": 9.7,
"peak_sun_hours": 1.5,
"sunshine_hours": 7.1,
"wind_gusts_max": 41.4,
"precip_prob_max": 5,
"feels_like_night": 4.7,
"feels_like_current": 5.4,
"shortwave_radiation_sum": 5.34
},
"forecast": [
{
"date": "2026-10-26",
"temp_day": 12.4,
"solar_kwh": 0.7,
"van_score": 65,
"temp_night": 7.6,
"drive_score": 96,
"score_label": "comfortable",
"sleep_score": 76,
"weather_code": 2
},
{
"date": "2026-10-27",
"temp_day": 16.5,
"solar_kwh": 0.9,
"van_score": 80,
"temp_night": 8.3,
"drive_score": 97,
"score_label": "ideal",
"sleep_score": 68,
"weather_code": 2
},
{
"date": "2026-10-28",
"temp_day": 13.2,
"solar_kwh": 0.5,
"van_score": 67,
"temp_night": 7.4,
"drive_score": 93,
"score_label": "comfortable",
"sleep_score": 61,
"weather_code": 2
},
{
"date": "2026-10-29",
"temp_day": 12.6,
"solar_kwh": 0.6,
"van_score": 72,
"temp_night": 5.3,
"drive_score": 99,
"score_label": "comfortable",
"sleep_score": 57,
"weather_code": 2
},
{
"date": "2026-10-30",
"temp_day": 11.8,
"solar_kwh": 0.8,
"van_score": 70,
"temp_night": 4.5,
"drive_score": 95,
"score_label": "comfortable",
"sleep_score": 55,
"weather_code": 51
},
{
"date": "2026-10-31",
"temp_day": 10.4,
"solar_kwh": 0.5,
"van_score": 60,
"temp_night": 5.2,
"drive_score": 97,
"score_label": "comfortable",
"sleep_score": 57,
"weather_code": 3
},
{
"date": "2026-11-01",
"temp_day": 9.3,
"solar_kwh": 0.3,
"van_score": 63,
"temp_night": 4.8,
"drive_score": 97,
"score_label": "comfortable",
"sleep_score": 53,
"weather_code": 2
}
],
"sea_score": null,
"solar_kwh": 0.7,
"van_score": 65,
"confidence": "high",
"fetched_at": "2026-10-26T03:00:52.302631Z",
"is_coastal": true,
"week_score": 62,
"band_counts": {
"hard": 3,
"ideal": 0,
"extreme": 0,
"acceptable": 801,
"comfortable": 971
},
"drive_score": 96,
"score_label": "comfortable",
"sleep_score": 72,
"solar_score": 13,
"drive_window": null,
"awning_status": "caution",
"best_move_day": {
"date": "2026-10-26",
"temp_day": 12.4,
"solar_kwh": 0.7,
"van_score": 68,
"temp_night": 7.6,
"drive_score": 100,
"score_label": "comfortable",
"sleep_score": 76,
"weather_code": 2
},
"sample_points": 1775,
"typical_score": 61,
"ideal_coverage": 0,
"sample_regions": 16,
"best_area_score": 63,
"recommendations": [
{
"key": "vansky.rec.solar_weak",
"type": "warning",
"params": {
"kwh": 0.6
},
"text": "Low solar output (~0.6 kWh) — reduce power use or connect to shore power."
},
{
"key": "vansky.rec.awning_caution",
"type": "warning",
"params": {
"gusts": 41.4
},
"text": "Gusts up to 41 km/h — open awning with caution and watch the forecast."
}
],
"condensation_risk": "medium",
"aggregation_version": 2,
"comfortable_coverage": 75
},
"updated_at": "2026-10-26T03:01:39+03:00",
"source": "Open-Meteo (api.open-meteo.com)",
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Example response (404, Not found):
{
"error": "Country not found or not supported"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
VanSky city ranking of a country
All cities of a country ranked by the VanSky score of the coming 7 days (sort=week, the
ranking on the site) or of today (sort=today), with the place, daily scores, comfortable and
rainy days, temperatures, sea and solar. Cities whose forecast is more than 2 days old are left
out, as on the site. Paginated: up to 200 cities per request.
Example request:
curl --request GET \
--get "https://openvan.camp/api/vansky/weather/GE/cities?sort=week&limit=10&offset=0&locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vansky/weather/GE/cities"
);
const params = {
"sort": "week",
"limit": "10",
"offset": "0",
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vansky/weather/GE/cities'
params = {
'sort': 'week',
'limit': '10',
'offset': '0',
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: max-age=600, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 117
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"data": [
{
"rank": 1,
"code": "ozurgeti",
"city_name": "Ozurgeti",
"url": "https://openvan.camp/en/vansky/georgia/ozurgeti",
"van_score": 87,
"week_score": 77,
"week_label": "comfortable",
"comfortable_days": 7,
"rain_days": 2,
"daily_scores": [
87,
90,
88,
88,
70,
65,
88
],
"sleep_score": 88,
"drive_score": 99,
"solar_kwh": 1.3,
"is_coastal": false,
"temp_day": 24.6,
"temp_night": 12.7,
"weather_code": 1,
"sea_temp": null
},
{
"rank": 2,
"code": "zestaponi",
"city_name": "Zestaponi",
"url": "https://openvan.camp/en/vansky/georgia/zestaponi",
"van_score": 91,
"week_score": 76,
"week_label": "comfortable",
"comfortable_days": 7,
"rain_days": 2,
"daily_scores": [
91,
90,
88,
86,
73,
61,
83
],
"sleep_score": 100,
"drive_score": 99,
"solar_kwh": 1.3,
"is_coastal": false,
"temp_day": 22.6,
"temp_night": 15.1,
"weather_code": 1,
"sea_temp": null
},
{
"rank": 3,
"code": "akhaltsikhe",
"city_name": "Akhaltsikhe",
"url": "https://openvan.camp/en/vansky/georgia/akhaltsikhe",
"van_score": 87,
"week_score": 73,
"week_label": "comfortable",
"comfortable_days": 7,
"rain_days": 2,
"daily_scores": [
87,
88,
88,
77,
68,
62,
80
],
"sleep_score": 63,
"drive_score": 99,
"solar_kwh": 1.4,
"is_coastal": false,
"temp_day": 17.2,
"temp_night": 6.6,
"weather_code": 2,
"sea_temp": null
},
{
"rank": 4,
"code": "kobuleti",
"city_name": "Kobuleti",
"url": "https://openvan.camp/en/vansky/georgia/kobuleti",
"van_score": 91,
"week_score": 73,
"week_label": "comfortable",
"comfortable_days": 6,
"rain_days": 2,
"daily_scores": [
91,
90,
87,
88,
66,
56,
89
],
"sleep_score": 95,
"drive_score": 99,
"solar_kwh": 1.4,
"is_coastal": true,
"temp_day": 24.3,
"temp_night": 16.7,
"weather_code": 1,
"sea_temp": 21
},
{
"rank": 5,
"code": "kvariati",
"city_name": "Kvariati",
"url": "https://openvan.camp/en/vansky/georgia/kvariati",
"van_score": 90,
"week_score": 73,
"week_label": "comfortable",
"comfortable_days": 6,
"rain_days": 2,
"daily_scores": [
90,
85,
86,
85,
71,
55,
91
],
"sleep_score": 93,
"drive_score": 99,
"solar_kwh": 1.4,
"is_coastal": false,
"temp_day": 23.6,
"temp_night": 16.3,
"weather_code": 2,
"sea_temp": null
},
{
"rank": 6,
"code": "poti",
"city_name": "Poti",
"url": "https://openvan.camp/en/vansky/georgia/poti",
"van_score": 89,
"week_score": 73,
"week_label": "comfortable",
"comfortable_days": 6,
"rain_days": 2,
"daily_scores": [
89,
87,
83,
81,
73,
55,
90
],
"sleep_score": 97,
"drive_score": 92,
"solar_kwh": 1.3,
"is_coastal": true,
"temp_day": 24,
"temp_night": 16.9,
"weather_code": 1,
"sea_temp": 20.9
},
{
"rank": 7,
"code": "zugdidi",
"city_name": "Zugdidi",
"url": "https://openvan.camp/en/vansky/georgia/zugdidi",
"van_score": 89,
"week_score": 73,
"week_label": "comfortable",
"comfortable_days": 6,
"rain_days": 2,
"daily_scores": [
89,
90,
87,
80,
74,
53,
88
],
"sleep_score": 100,
"drive_score": 99,
"solar_kwh": 1.3,
"is_coastal": false,
"temp_day": 23.6,
"temp_night": 12.1,
"weather_code": 0,
"sea_temp": null
},
{
"rank": 8,
"code": "samtredia",
"city_name": "Samtredia",
"url": "https://openvan.camp/en/vansky/georgia/samtredia",
"van_score": 88,
"week_score": 72,
"week_label": "comfortable",
"comfortable_days": 6,
"rain_days": 2,
"daily_scores": [
88,
86,
83,
81,
71,
55,
88
],
"sleep_score": 97,
"drive_score": 87,
"solar_kwh": 1.3,
"is_coastal": false,
"temp_day": 23.8,
"temp_night": 17.2,
"weather_code": 0,
"sea_temp": null
},
{
"rank": 9,
"code": "ureki",
"city_name": "Ureki",
"url": "https://openvan.camp/en/vansky/georgia/ureki",
"van_score": 90,
"week_score": 72,
"week_label": "comfortable",
"comfortable_days": 6,
"rain_days": 2,
"daily_scores": [
90,
89,
87,
81,
72,
52,
88
],
"sleep_score": 93,
"drive_score": 99,
"solar_kwh": 1.3,
"is_coastal": false,
"temp_day": 24.7,
"temp_night": 14.9,
"weather_code": 2,
"sea_temp": null
},
{
"rank": 10,
"code": "batumi",
"city_name": "Batumi",
"url": "https://openvan.camp/en/vansky/georgia/batumi",
"van_score": 89,
"week_score": 71,
"week_label": "comfortable",
"comfortable_days": 6,
"rain_days": 2,
"daily_scores": [
89,
83,
88,
88,
66,
52,
93
],
"sleep_score": 100,
"drive_score": 99,
"solar_kwh": 1.4,
"is_coastal": true,
"temp_day": 24.7,
"temp_night": 15.2,
"weather_code": 2,
"sea_temp": 21.4
}
],
"meta": {
"country_code": "GE",
"sort": "week",
"total": 32,
"offset": 0,
"limit": 10
},
"updated_at": "2026-10-26T03:01:39+03:00",
"methodology": "https://openvan.camp/api/vansky/methodology",
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Example response (404, Not found):
{
"error": "Country not found or not supported"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
VanSky country ranking
Countries ranked by the VanSky score of the coming 7 days (by=week) or of today
(by=today): a light list with the place, scores, labels, temperatures, sea and solar —
instead of downloading every country with GET /api/vansky/weather.
Example request:
curl --request GET \
--get "https://openvan.camp/api/vansky/ranking?by=week®ion=europe&limit=10&locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vansky/ranking"
);
const params = {
"by": "week",
"region": "europe",
"limit": "10",
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vansky/ranking'
params = {
'by': 'week',
'region': 'europe',
'limit': '10',
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: max-age=600, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 117
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"data": [
{
"rank": 1,
"code": "PT",
"name": "Portugal",
"url": "https://openvan.camp/en/vansky/portugal",
"region": "europe",
"van_score": 90,
"score_label": "ideal",
"week_score": 88,
"week_label": "ideal",
"temp_day": 22.5,
"temp_night": 13.8,
"weather_code": 0,
"sea_temp": 19.1,
"solar_kwh": 1.7
},
{
"rank": 2,
"code": "ES",
"name": "Spain",
"url": "https://openvan.camp/en/vansky/spain",
"region": "europe",
"van_score": 91,
"score_label": "ideal",
"week_score": 87,
"week_label": "ideal",
"temp_day": 23.5,
"temp_night": 13.6,
"weather_code": 0,
"sea_temp": 22.7,
"solar_kwh": 1.6
},
{
"rank": 3,
"code": "MT",
"name": "Malta",
"url": "https://openvan.camp/en/vansky/malta",
"region": "europe",
"van_score": 94,
"score_label": "ideal",
"week_score": 87,
"week_label": "ideal",
"temp_day": 22.8,
"temp_night": 19.2,
"weather_code": 2,
"sea_temp": 23.1,
"solar_kwh": 1.1
},
{
"rank": 4,
"code": "CY",
"name": "Cyprus",
"url": "https://openvan.camp/en/vansky/cyprus",
"region": "europe",
"van_score": 88,
"score_label": "ideal",
"week_score": 80,
"week_label": "ideal",
"temp_day": 24.8,
"temp_night": 19.1,
"weather_code": 3,
"sea_temp": 24.1,
"solar_kwh": 1.3
},
{
"rank": 5,
"code": "XN",
"name": "Turkish Republic of Northern Cyprus",
"url": "https://openvan.camp/en/vansky/northern-cyprus",
"region": "europe",
"van_score": 82,
"score_label": "ideal",
"week_score": 80,
"week_label": "ideal",
"temp_day": 24.9,
"temp_night": 19.7,
"weather_code": 51,
"sea_temp": 24.6,
"solar_kwh": 1.4
},
{
"rank": 6,
"code": "AL",
"name": "Albania",
"url": "https://openvan.camp/en/vansky/albania",
"region": "europe",
"van_score": 85,
"score_label": "ideal",
"week_score": 77,
"week_label": "comfortable",
"temp_day": 20.4,
"temp_night": 12.7,
"weather_code": 0,
"sea_temp": 22.2,
"solar_kwh": 1.1
},
{
"rank": 7,
"code": "IT",
"name": "Italy",
"url": "https://openvan.camp/en/vansky/italy",
"region": "europe",
"van_score": 87,
"score_label": "ideal",
"week_score": 77,
"week_label": "comfortable",
"temp_day": 20.9,
"temp_night": 9.4,
"weather_code": 1,
"sea_temp": 21.8,
"solar_kwh": 1.4
},
{
"rank": 8,
"code": "GR",
"name": "Greece",
"url": "https://openvan.camp/en/vansky/greece",
"region": "europe",
"van_score": 78,
"score_label": "comfortable",
"week_score": 71,
"week_label": "comfortable",
"temp_day": 20.7,
"temp_night": 16.6,
"weather_code": 0,
"sea_temp": 20.9,
"solar_kwh": 1
},
{
"rank": 9,
"code": "FR",
"name": "France",
"url": "https://openvan.camp/en/vansky/france",
"region": "europe",
"van_score": 81,
"score_label": "ideal",
"week_score": 68,
"week_label": "comfortable",
"temp_day": 19.4,
"temp_night": 9.6,
"weather_code": 3,
"sea_temp": 21.5,
"solar_kwh": 1.3
},
{
"rank": 10,
"code": "HR",
"name": "Croatia",
"url": "https://openvan.camp/en/vansky/croatia",
"region": "europe",
"van_score": 78,
"score_label": "comfortable",
"week_score": 67,
"week_label": "comfortable",
"temp_day": 18.5,
"temp_night": 11.2,
"weather_code": 3,
"sea_temp": 21.2,
"solar_kwh": 1.3
}
],
"meta": {
"by": "week",
"region": "europe"
},
"updated_at": "2026-10-26T03:01:39+03:00",
"methodology": "https://openvan.camp/api/vansky/methodology",
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
VanSky methodology
How the VanSky index is calculated, machine-readable: score labels, the four sub-scores with
their curves and weights, night adjustment, extreme caps, solar and sea bonuses, air quality
and heat caps, the week score, comfortable and rainy days, solar output, the country score,
data sources and units. Enough to reproduce the day score from the forecast fields of
GET /api/vansky/weather/{code}/{city}.
Example request:
curl --request GET \
--get "https://openvan.camp/api/vansky/methodology" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vansky/methodology"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vansky/methodology'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200):
Show headers
cache-control: max-age=86400, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 118
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"data": {
"version": "2026-10-26",
"scale": "VanSky index 0–100: how suitable the weather is for travelling and sleeping in a campervan (not how warm it is).",
"labels": [
{
"min": 80,
"label": "ideal"
},
{
"min": 60,
"label": "comfortable"
},
{
"min": 40,
"label": "acceptable"
},
{
"min": 20,
"label": "hard"
},
{
"min": 0,
"label": "extreme"
}
],
"interpolation": "Every curve is piecewise linear between its [x, y] points; below the first point and above the last the end value is used.",
"day_score": {
"inputs": "One forecast day: feels_like_day (fallback temp_day), temp_night, feels_like_night, dew_point_mean (fallback dew_point), humidity, shortwave_radiation_sum (MJ/m²), precip_prob_max, precip_sum (mm), wind_max and wind_gusts_max (km/h); sea_temp for coastal places; air quality (dust, pm2_5, aqi, pollen_max) on day 0 only.",
"steps": [
"1. Four sub-scores (sub_scores in the API), then weighted = round(thermal×0.35 + sunshine×0.25 + precipitation×0.25 + wind×0.15).",
"2. Night adjustment is added; extreme caps are applied; solar and sea bonuses are added; air quality and pollen penalties are added; the heat cap is applied last; the result is clamped to 0–100. adjustments in the API = day score − weighted."
],
"weights": {
"thermal": 0.35,
"sunshine": 0.25,
"precipitation": 0.25,
"wind": 0.15
},
"sub_scores": {
"thermal": {
"curve": {
"x": "feels_like_day °C",
"points": [
[
-10,
0
],
[
0,
12
],
[
8,
52
],
[
15,
85
],
[
18,
97
],
[
22,
100
],
[
26,
88
],
[
30,
60
],
[
34,
38
],
[
40,
12
],
[
46,
0
]
]
},
"dew_point_penalty": [
{
"min": 24,
"add": -30
},
{
"min": 21,
"add": -22
},
{
"min": 18,
"add": -14
},
{
"min": 16,
"add": -6
}
],
"dry_air": "With a dew point: humidity < 20 % adds −5. Without a dew point: humidity > 90 % −20, > 80 % −10, < 20 % −5."
},
"sunshine": {
"curve": {
"x": "peak sun hours = shortwave_radiation_sum × 277.78 / 1000",
"points": [
[
0,
10
],
[
1,
35
],
[
3,
62
],
[
5,
82
],
[
7,
100
]
]
},
"heat_factor": {
"x": "feels_like_day °C",
"multiply_by": [
[
28,
1
],
[
33,
0.55
],
[
38,
0.25
]
]
}
},
"precipitation": {
"curve": {
"x": "precip_prob_max %",
"points": [
[
0,
95
],
[
20,
88
],
[
40,
68
],
[
60,
48
],
[
80,
28
],
[
100,
12
]
]
},
"amount_penalty": [
{
"over_mm": 30,
"add": -40
},
{
"over_mm": 15,
"add": -25
},
{
"over_mm": 5,
"add": -10
}
],
"probability_when_missing": {
"x": "precip_sum mm",
"points": [
[
0,
5
],
[
0.1,
25
],
[
0.5,
40
],
[
1,
48
],
[
3,
68
],
[
7,
80
],
[
15,
88
],
[
25,
95
]
]
}
},
"wind": {
"curve": {
"x": "wind_max km/h",
"points": [
[
0,
100
],
[
15,
100
],
[
25,
80
],
[
35,
58
],
[
50,
33
],
[
65,
12
],
[
90,
0
]
]
}
}
},
"night_adjustment": "temp_night < 0 → −20; < 5 → −10; feels_like_night ≥ 30 → −15; ≥ 27 → −10; ≥ 24 → −5; 14 ≤ temp_night ≤ 21 → +3; otherwise 0 (first matching rule).",
"caps": "temp_night < 0 → at most 50; precip_sum > 20 mm → at most 55; wind_gusts_max > 70 km/h → at most 45.",
"bonuses": "Solar for a 500 W panel ≥ 3 kWh/day → +3. Sea: ≥ 22 °C +4, ≥ 18 °C +1, < 15 °C −3.",
"air_quality": "dust µg/m³ > 200 −25, > 100 −15, > 50 −10; pm2_5 > 75 −15, > 35 −10, > 25 −5; aqi (only when dust ≤ 50 and pm2_5 ≤ 25) > 100 −10, > 80 −5; dust > 200 → at most 50. Pollen (pollen_max) > 100 −8, > 30 −4.",
"heat_cap": "feels_like_day ≥ 41 → at most 25; ≥ 38 → 35; ≥ 35 → 45; ≥ 32 → 58; feels_like_night ≥ 29 → at most 55."
},
"week_score": "mean of the 7 day scores − 0.6 × their standard deviation (population); if the worst day is below 30 the week is at most worst + 30; rounded, clamped to 0–100.",
"comfortable_day": "day score ≥ 60",
"rain_day": "precip_sum ≥ 1 mm or precip_prob_max ≥ 50 % (rain_days in city ranks)",
"solar_kwh": "panel_watts × peak sun hours × 0.80 / 1000, rounded to 0.1; panel_watts = 500 unless stated.",
"scores_now_today_week": "van_score and today_score are the score of forecast day 0 (today in the city's time zone); week_score is the 7-day score above. City ranks use week_score.",
"country_score": "Countries with 3+ cities: cities → regions (median) → country = 0.65 × P80 of regions + 0.35 × median of regions (best_area_score, typical_score). Fewer cities: one reference point.",
"other_scores": "sleep_score (night comfort), drive_score (driving conditions), solar_score and sea_score are separate 0–100 scores and are not part of the van_score formula above.",
"data": {
"forecast": "Open-Meteo, DWD ICON model (icon_seamless), 7 days, refreshed several times a day; days are local to the city (timezone auto).",
"marine": "Open-Meteo Marine (sea surface temperature, waves) at the nearest sea point.",
"air_quality": "Open-Meteo Air Quality (CAMS).",
"climate": "GET /api/vansky/climate: ERA5 2021–2025, Copernicus Climate Change Service.",
"times": "Sunrise and sunset are ISO 8601 with the local UTC offset (2026-10-26T07:38+04:00).",
"units": "Temperatures °C, wind km/h, precipitation mm, solar kWh, radiation MJ/m²."
}
},
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
VanSky weather for one city
Everything the city page shows: the score of today (van_score, today_score) and of the
coming 7 days (week_score), the city's place among the cities of its country this week
(rank), comfortable days, the worst day and the best 3-day window, sleep / driving / solar /
sea scores, awning and condensation, current weather with local sunrise and sunset, sea and air
quality, recommendations as text, and a 7-day forecast where each day has its score broken
down: sub_scores (thermal, sunshine, precipitation, wind), weighted_score and
adjustments (night, extremes, sea, air). The formula is at GET /api/vansky/methodology.
Only precomputed data — the endpoint never triggers a live weather fetch; include=hourly
adds the forecast in 3-hour steps and the sea temperature per day (cached for 1 hour).
Example request:
curl --request GET \
--get "https://openvan.camp/api/vansky/weather/GE/batumi?locale=en&include=hourly" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vansky/weather/GE/batumi"
);
const params = {
"locale": "en",
"include": "hourly",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vansky/weather/GE/batumi'
params = {
'locale': 'en',
'include': 'hourly',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: max-age=1800, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 118
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"data": {
"code": "batumi",
"city_name": "Batumi",
"country_code": "GE",
"country_name": "Georgia",
"url": "https://openvan.camp/en/vansky/georgia/batumi",
"is_coastal": true,
"van_score": 89,
"today_score": 89,
"score_label": "ideal",
"week_score": 71,
"week_label": "comfortable",
"rank": {
"position": 10,
"total": 32,
"by": "week"
},
"comfortable_days": 6,
"worst_day": {
"date": "2026-10-31",
"van_score": 52,
"score_label": "acceptable"
},
"best_window": {
"from": "2026-10-26",
"to": "2026-10-28",
"avg_score": 87
},
"sleep_score": 100,
"drive_score": 99,
"solar_kwh": 1.4,
"solar_score": 30,
"sea_score": 100,
"awning_status": "safe",
"condensation_risk": "low",
"drive_window": null,
"weather": {
"sunset": "2026-10-26T18:16+04:00",
"uv_max": null,
"sunrise": "2026-10-26T07:38+04:00",
"humidity": 64,
"temp_day": 24.7,
"wind_dir": 106,
"wind_max": 8.7,
"dew_point": 9.6,
"precip_sum": 0,
"temp_night": 15.2,
"cloud_cover": 57,
"temp_current": 16.5,
"weather_code": 2,
"feels_like_day": 26.3,
"peak_sun_hours": 3.4,
"sunshine_hours": 10,
"wind_gusts_max": 13,
"precip_prob_max": 5,
"feels_like_night": 14.1,
"feels_like_current": 15.8,
"shortwave_radiation_sum": 12.38
},
"marine": {
"sea_temp": 21.4,
"wave_dir": 301,
"swell_dir": 301,
"wave_height": 0.12,
"wave_period": 3.7,
"swell_height": 0.12,
"swell_period": 3.7,
"wind_wave_dir": 180,
"wind_wave_height": 0.02,
"wind_wave_period": 1
},
"air_quality": {
"aqi": 19,
"no2": 4.3,
"dust": 4,
"pm10": 13.2,
"ozone": 47,
"pm2_5": 8.4,
"us_aqi": 37,
"fetched": true,
"pollen_max": null,
"pollen_alder": 0,
"pollen_birch": 0,
"pollen_grass": 0,
"pollen_olive": 0
},
"recommendations": [
{
"key": "vansky.rec.awning_safe",
"type": "success",
"params": [],
"text": "Wind is calm — safe to open the awning and leave it out overnight."
},
{
"key": "vansky.rec.night_ideal",
"type": "success",
"params": {
"temp": 15.2
},
"text": "Perfect night (15 °C) — comfortable without heating or air conditioning."
},
{
"key": "vansky.rec.day_comfortable",
"type": "success",
"params": {
"temp": 24.7
},
"text": "Comfortable temperature (25 °C) — ideal for outdoor work and hiking."
},
{
"key": "vansky.rec.sea_warm",
"type": "success",
"params": {
"temp": 21.4
},
"text": "Sea temperature is 21 °C — great conditions for swimming and coastal camping."
},
{
"key": "vansky.rec.air_clean",
"type": "success",
"params": [],
"text": "Air quality is excellent — windows open, enjoy fresh air."
}
],
"forecast": [
{
"date": "2026-10-26",
"humidity": 62,
"temp_day": 24.7,
"wind_dir": 106,
"wind_max": 8.7,
"dew_point": 17.9,
"solar_kwh": 1.4,
"van_score": 89,
"precip_sum": 0,
"temp_night": 15.2,
"drive_score": 99,
"score_label": "ideal",
"sleep_score": 85,
"weather_code": 1,
"dew_point_mean": 12,
"feels_like_day": 26.3,
"wind_gusts_max": 13,
"precip_prob_max": 5,
"feels_like_night": 14.1,
"shortwave_radiation_sum": 12.38,
"sub_scores": {
"thermal": 86,
"sunshine": 66,
"precipitation": 93,
"wind": 100
},
"weighted_score": 85,
"adjustments": 4,
"sea_temp": 21.5
},
{
"date": "2026-10-27",
"humidity": 46,
"temp_day": 28.1,
"wind_dir": 107,
"wind_max": 9.8,
"dew_point": 18.3,
"solar_kwh": 1.3,
"van_score": 83,
"precip_sum": 0,
"temp_night": 20.9,
"drive_score": 99,
"score_label": "ideal",
"sleep_score": 93,
"weather_code": 2,
"dew_point_mean": 11.2,
"feels_like_day": 28.5,
"wind_gusts_max": 14.8,
"precip_prob_max": 5,
"feels_like_night": 19.2,
"shortwave_radiation_sum": 11.99,
"sub_scores": {
"thermal": 71,
"sunshine": 62,
"precipitation": 93,
"wind": 100
},
"weighted_score": 79,
"adjustments": 4,
"sea_temp": 21.4
},
{
"date": "2026-10-28",
"humidity": 67,
"temp_day": 23.7,
"wind_dir": 174,
"wind_max": 8.2,
"dew_point": 17.2,
"solar_kwh": 1,
"van_score": 88,
"precip_sum": 0,
"temp_night": 18.1,
"drive_score": 99,
"score_label": "ideal",
"sleep_score": 85,
"weather_code": 3,
"dew_point_mean": 14.4,
"feels_like_day": 24.9,
"wind_gusts_max": 14.8,
"precip_prob_max": 5,
"feels_like_night": 18.2,
"shortwave_radiation_sum": 9.22,
"sub_scores": {
"thermal": 91,
"sunshine": 56,
"precipitation": 93,
"wind": 100
},
"weighted_score": 84,
"adjustments": 4,
"sea_temp": 21.4
},
{
"date": "2026-10-29",
"humidity": 84,
"temp_day": 20.7,
"wind_dir": 184,
"wind_max": 5.8,
"dew_point": 17.1,
"solar_kwh": 0.9,
"van_score": 88,
"precip_sum": 0,
"temp_night": 16.7,
"drive_score": 99,
"score_label": "ideal",
"sleep_score": 73,
"weather_code": 3,
"dew_point_mean": 16,
"feels_like_day": 22.2,
"wind_gusts_max": 12.2,
"precip_prob_max": 5,
"feels_like_night": 17.3,
"shortwave_radiation_sum": 8.12,
"sub_scores": {
"thermal": 93,
"sunshine": 52,
"precipitation": 93,
"wind": 100
},
"weighted_score": 84,
"adjustments": 4,
"sea_temp": 21.3
},
{
"date": "2026-10-30",
"humidity": 91,
"temp_day": 19.5,
"wind_dir": 232,
"wind_max": 8,
"dew_point": 17.5,
"solar_kwh": 0.5,
"van_score": 66,
"precip_sum": 7.3,
"temp_night": 16.9,
"drive_score": 81,
"score_label": "comfortable",
"sleep_score": 73,
"weather_code": 65,
"dew_point_mean": 16.5,
"feels_like_day": 20.9,
"wind_gusts_max": 13.7,
"precip_prob_max": 80,
"feels_like_night": 18.6,
"shortwave_radiation_sum": 4.92,
"sub_scores": {
"thermal": 93,
"sunshine": 40,
"precipitation": 18,
"wind": 100
},
"weighted_score": 62,
"adjustments": 4,
"sea_temp": 21.1
},
{
"date": "2026-10-31",
"humidity": 94,
"temp_day": 17.8,
"wind_dir": 213,
"wind_max": 6.9,
"dew_point": 17.3,
"solar_kwh": 0.3,
"van_score": 52,
"precip_sum": 33.8,
"temp_night": 16.4,
"drive_score": 61,
"score_label": "acceptable",
"sleep_score": 63,
"weather_code": 65,
"dew_point_mean": 16.2,
"feels_like_day": 19.3,
"wind_gusts_max": 19.1,
"precip_prob_max": 95,
"feels_like_night": 17.8,
"shortwave_radiation_sum": 2.71,
"sub_scores": {
"thermal": 92,
"sunshine": 29,
"precipitation": -24,
"wind": 100
},
"weighted_score": 48,
"adjustments": 4,
"sea_temp": 20.7
},
{
"date": "2026-11-01",
"humidity": 89,
"temp_day": 19.6,
"wind_dir": 76,
"wind_max": 6.6,
"dew_point": 16.5,
"solar_kwh": 1.3,
"van_score": 93,
"precip_sum": 0,
"temp_night": 14.2,
"drive_score": 99,
"score_label": "ideal",
"sleep_score": 73,
"weather_code": 2,
"dew_point_mean": 14.9,
"feels_like_day": 20.7,
"wind_gusts_max": 13.3,
"precip_prob_max": 5,
"feels_like_night": 14,
"shortwave_radiation_sum": 11.26,
"sub_scores": {
"thermal": 99,
"sunshine": 63,
"precipitation": 93,
"wind": 100
},
"weighted_score": 89,
"adjustments": 4,
"sea_temp": 20.6
}
],
"hourly": {
"2026-10-26": [
{
"hour": 0,
"temp": 15.4,
"feels": 15.4,
"precip_prob": null,
"precip_mm": 0,
"wind": 6.6,
"gusts": 10.4,
"weather_code": 2,
"is_day": 0,
"score": 89
},
{
"hour": 3,
"temp": 15.2,
"feels": 14.1,
"precip_prob": null,
"precip_mm": 0,
"wind": 5.7,
"gusts": 8.6,
"weather_code": 2,
"is_day": 0,
"score": 87
},
{
"hour": 6,
"temp": 15.8,
"feels": 14.7,
"precip_prob": null,
"precip_mm": 0,
"wind": 5.6,
"gusts": 8.6,
"weather_code": 2,
"is_day": 0,
"score": 88
},
{
"hour": 9,
"temp": 18.3,
"feels": 18.1,
"precip_prob": null,
"precip_mm": 0,
"wind": 3.3,
"gusts": 6.1,
"weather_code": 1,
"is_day": 1,
"score": 93
},
{
"hour": 12,
"temp": 24,
"feels": 24.5,
"precip_prob": null,
"precip_mm": 0,
"wind": 6,
"gusts": 10.1,
"weather_code": 1,
"is_day": 1,
"score": 91
},
{
"hour": 15,
"temp": 24.6,
"feels": 25.1,
"precip_prob": null,
"precip_mm": 0,
"wind": 5.7,
"gusts": 12.6,
"weather_code": 0,
"is_day": 1,
"score": 91
},
{
"hour": 18,
"temp": 23,
"feels": 25.1,
"precip_prob": null,
"precip_mm": 0,
"wind": 3.1,
"gusts": 4.7,
"weather_code": 0,
"is_day": 1,
"score": 91
},
{
"hour": 21,
"temp": 21,
"feels": 19.4,
"precip_prob": null,
"precip_mm": 0,
"wind": 8.4,
"gusts": 13,
"weather_code": 0,
"is_day": 0,
"score": 93
}
],
"2026-10-27": [
{
"hour": 0,
"temp": 21.4,
"feels": 19.2,
"precip_prob": null,
"precip_mm": 0,
"wind": 9.2,
"gusts": 13.7,
"weather_code": 1,
"is_day": 0,
"score": 93
},
{
"hour": 3,
"temp": 21.2,
"feels": 19.3,
"precip_prob": null,
"precip_mm": 0,
"wind": 7.9,
"gusts": 12.6,
"weather_code": 2,
"is_day": 0,
"score": 93
},
{
"hour": 6,
"temp": 21.5,
"feels": 19.5,
"precip_prob": null,
"precip_mm": 0,
"wind": 8.9,
"gusts": 13,
"weather_code": 0,
"is_day": 0,
"score": 93
},
{
"hour": 9,
"temp": 24.3,
"feels": 22.7,
"precip_prob": null,
"precip_mm": 0,
"wind": 7.2,
"gusts": 14,
"weather_code": 2,
"is_day": 1,
"score": 93
},
{
"hour": 12,
"temp": 27.6,
"feels": 27.6,
"precip_prob": null,
"precip_mm": 0,
"wind": 6.5,
"gusts": 12.2,
"weather_code": 1,
"is_day": 1,
"score": 86
},
{
"hour": 15,
"temp": 27.6,
"feels": 28.4,
"precip_prob": null,
"precip_mm": 0,
"wind": 7.6,
"gusts": 13.3,
"weather_code": 3,
"is_day": 1,
"score": 83
},
{
"hour": 18,
"temp": 24.6,
"feels": 26.9,
"precip_prob": null,
"precip_mm": 0,
"wind": 4.3,
"gusts": 7.2,
"weather_code": 2,
"is_day": 1,
"score": 87
},
{
"hour": 21,
"temp": 23.1,
"feels": 22.4,
"precip_prob": null,
"precip_mm": 0,
"wind": 8.2,
"gusts": 12.6,
"weather_code": 1,
"is_day": 0,
"score": 93
}
],
"2026-10-28": [
{
"hour": 0,
"temp": 22.5,
"feels": 21.6,
"precip_prob": null,
"precip_mm": 0,
"wind": 7.1,
"gusts": 11.5,
"weather_code": 3,
"is_day": 0,
"score": 91
},
{
"hour": 3,
"temp": 20,
"feels": 20.1,
"precip_prob": null,
"precip_mm": 0,
"wind": 4.5,
"gusts": 7.9,
"weather_code": 3,
"is_day": 0,
"score": 91
},
{
"hour": 6,
"temp": 18.2,
"feels": 18.3,
"precip_prob": null,
"precip_mm": 0,
"wind": 4.1,
"gusts": 6.5,
"weather_code": 3,
"is_day": 0,
"score": 90
},
{
"hour": 9,
"temp": 19.5,
"feels": 20.1,
"precip_prob": null,
"precip_mm": 0,
"wind": 3.7,
"gusts": 6.5,
"weather_code": 2,
"is_day": 1,
"score": 91
},
{
"hour": 12,
"temp": 23.5,
"feels": 24.9,
"precip_prob": null,
"precip_mm": 0,
"wind": 5.3,
"gusts": 9,
"weather_code": 3,
"is_day": 1,
"score": 88
},
{
"hour": 15,
"temp": 23.7,
"feels": 24.8,
"precip_prob": null,
"precip_mm": 0,
"wind": 3.7,
"gusts": 9,
"weather_code": 3,
"is_day": 1,
"score": 88
},
{
"hour": 18,
"temp": 21.4,
"feels": 23,
"precip_prob": null,
"precip_mm": 0,
"wind": 3.9,
"gusts": 11.9,
"weather_code": 3,
"is_day": 1,
"score": 90
},
{
"hour": 21,
"temp": 19.6,
"feels": 21.8,
"precip_prob": null,
"precip_mm": 0,
"wind": 2.2,
"gusts": 4.3,
"weather_code": 3,
"is_day": 0,
"score": 91
}
],
"2026-10-29": [
{
"hour": 0,
"temp": 18.7,
"feels": 20.2,
"precip_prob": null,
"precip_mm": 0,
"wind": 4.2,
"gusts": 6.5,
"weather_code": 3,
"is_day": 0,
"score": 88
},
{
"hour": 3,
"temp": 17.6,
"feels": 18.8,
"precip_prob": null,
"precip_mm": 0,
"wind": 4.1,
"gusts": 6.1,
"weather_code": 3,
"is_day": 0,
"score": 87
},
{
"hour": 6,
"temp": 16.7,
"feels": 17.3,
"precip_prob": null,
"precip_mm": 0,
"wind": 5.4,
"gusts": 7.9,
"weather_code": 3,
"is_day": 0,
"score": 86
},
{
"hour": 9,
"temp": 18.3,
"feels": 19.6,
"precip_prob": null,
"precip_mm": 0,
"wind": 2.3,
"gusts": 6.5,
"weather_code": 3,
"is_day": 1,
"score": 88
},
{
"hour": 12,
"temp": 20.3,
"feels": 21.9,
"precip_prob": null,
"precip_mm": 0,
"wind": 4.1,
"gusts": 9.4,
"weather_code": 2,
"is_day": 1,
"score": 88
},
{
"hour": 15,
"temp": 20.6,
"feels": 22.1,
"precip_prob": null,
"precip_mm": 0,
"wind": 5.2,
"gusts": 12.2,
"weather_code": 3,
"is_day": 1,
"score": 88
},
{
"hour": 18,
"temp": 19.7,
"feels": 21.6,
"precip_prob": null,
"precip_mm": 0,
"wind": 2.9,
"gusts": 10.1,
"weather_code": 3,
"is_day": 1,
"score": 88
},
{
"hour": 21,
"temp": 18.5,
"feels": 20.8,
"precip_prob": null,
"precip_mm": 0,
"wind": 0.7,
"gusts": 5.8,
"weather_code": 3,
"is_day": 0,
"score": 88
}
],
"2026-10-30": [
{
"hour": 0,
"temp": 17.6,
"feels": 19.2,
"precip_prob": null,
"precip_mm": 0,
"wind": 4.7,
"gusts": 9.4,
"weather_code": 3,
"is_day": 0,
"score": 82
},
{
"hour": 3,
"temp": 17,
"feels": 18.6,
"precip_prob": null,
"precip_mm": 0,
"wind": 3.4,
"gusts": 11.2,
"weather_code": 3,
"is_day": 0,
"score": 82
},
{
"hour": 6,
"temp": 17,
"feels": 18.7,
"precip_prob": null,
"precip_mm": 0.2,
"wind": 1.9,
"gusts": 6.1,
"weather_code": 3,
"is_day": 0,
"score": 78
},
{
"hour": 9,
"temp": 17.9,
"feels": 19.6,
"precip_prob": null,
"precip_mm": 0.1,
"wind": 2.8,
"gusts": 5,
"weather_code": 3,
"is_day": 1,
"score": 80
},
{
"hour": 12,
"temp": 19.3,
"feels": 20.9,
"precip_prob": null,
"precip_mm": 0,
"wind": 4.8,
"gusts": 9.7,
"weather_code": 3,
"is_day": 1,
"score": 82
},
{
"hour": 15,
"temp": 19.3,
"feels": 20.6,
"precip_prob": null,
"precip_mm": 0,
"wind": 8,
"gusts": 13,
"weather_code": 3,
"is_day": 1,
"score": 82
},
{
"hour": 18,
"temp": 18.4,
"feels": 19.8,
"precip_prob": null,
"precip_mm": 0,
"wind": 5.9,
"gusts": 13.3,
"weather_code": 3,
"is_day": 1,
"score": 82
},
{
"hour": 21,
"temp": 17.7,
"feels": 19.5,
"precip_prob": null,
"precip_mm": 2.2,
"wind": 4,
"gusts": 8.5,
"weather_code": 61,
"is_day": 0,
"score": 71
}
],
"2026-10-31": [
{
"hour": 0,
"temp": 17.3,
"feels": 19.3,
"precip_prob": null,
"precip_mm": 8.2,
"wind": 4.6,
"gusts": 14.8,
"weather_code": 61,
"is_day": 0,
"score": 55
},
{
"hour": 3,
"temp": 17.2,
"feels": 18.6,
"precip_prob": null,
"precip_mm": 9.2,
"wind": 6,
"gusts": 16.9,
"weather_code": 61,
"is_day": 0,
"score": 55
},
{
"hour": 6,
"temp": 17.2,
"feels": 18.5,
"precip_prob": null,
"precip_mm": 8.3,
"wind": 6.7,
"gusts": 18.7,
"weather_code": 61,
"is_day": 0,
"score": 55
},
{
"hour": 9,
"temp": 17.1,
"feels": 18.3,
"precip_prob": null,
"precip_mm": 6.1,
"wind": 6.9,
"gusts": 18.7,
"weather_code": 61,
"is_day": 1,
"score": 56
},
{
"hour": 12,
"temp": 17.5,
"feels": 18.7,
"precip_prob": null,
"precip_mm": 3.9,
"wind": 6.1,
"gusts": 18.7,
"weather_code": 61,
"is_day": 1,
"score": 56
},
{
"hour": 15,
"temp": 17.8,
"feels": 19.1,
"precip_prob": null,
"precip_mm": 2.3,
"wind": 4.8,
"gusts": 17.6,
"weather_code": 51,
"is_day": 1,
"score": 56
},
{
"hour": 18,
"temp": 17.2,
"feels": 18.9,
"precip_prob": null,
"precip_mm": 0.6,
"wind": 2.8,
"gusts": 9,
"weather_code": 3,
"is_day": 1,
"score": 56
},
{
"hour": 21,
"temp": 16.7,
"feels": 18.4,
"precip_prob": null,
"precip_mm": 0,
"wind": 1.6,
"gusts": 2.9,
"weather_code": 3,
"is_day": 0,
"score": 56
}
],
"2026-11-01": [
{
"hour": 0,
"temp": 16.2,
"feels": 17.4,
"precip_prob": null,
"precip_mm": 0,
"wind": 3.3,
"gusts": 4.3,
"weather_code": 3,
"is_day": 0,
"score": 91
},
{
"hour": 3,
"temp": 15.1,
"feels": 15.5,
"precip_prob": null,
"precip_mm": 0,
"wind": 5,
"gusts": 9.4,
"weather_code": 3,
"is_day": 0,
"score": 89
},
{
"hour": 6,
"temp": 14.2,
"feels": 14,
"precip_prob": null,
"precip_mm": 0,
"wind": 6.6,
"gusts": 11.5,
"weather_code": 2,
"is_day": 0,
"score": 86
},
{
"hour": 9,
"temp": 16.5,
"feels": 17.6,
"precip_prob": null,
"precip_mm": 0,
"wind": 2.5,
"gusts": 9.4,
"weather_code": 2,
"is_day": 1,
"score": 92
},
{
"hour": 12,
"temp": 19.1,
"feels": 20.4,
"precip_prob": null,
"precip_mm": 0,
"wind": 4.2,
"gusts": 11.9,
"weather_code": 1,
"is_day": 1,
"score": 93
},
{
"hour": 15,
"temp": 19.5,
"feels": 20.7,
"precip_prob": null,
"precip_mm": 0,
"wind": 5.6,
"gusts": 13.3,
"weather_code": 2,
"is_day": 1,
"score": 93
},
{
"hour": 18,
"temp": 17.4,
"feels": 19.3,
"precip_prob": null,
"precip_mm": 0,
"wind": 3.1,
"gusts": 8.6,
"weather_code": 2,
"is_day": 1,
"score": 92
},
{
"hour": 21,
"temp": 16.2,
"feels": 18.1,
"precip_prob": null,
"precip_mm": 0,
"wind": 1.4,
"gusts": 6.8,
"weather_code": 2,
"is_day": 0,
"score": 92
}
]
},
"fetched_at": "2026-10-26T03:08:56.655645Z"
},
"updated_at": "2026-10-26T03:08:56.655645Z",
"source": "Open-Meteo (DWD ICON), Open-Meteo Marine and Air Quality (CAMS)",
"methodology": "https://openvan.camp/api/vansky/methodology",
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Example response (404, Not found):
{
"error": "City not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Typical weather (climate) at a point
What the weather is usually like on any day of the year at any point on Earth: the median of 35 archive days (the date ±3 days over 2021–2025) from the ERA5 reanalysis, counted in local solar days on a 0.25° grid (~25 km). This is climate, not a forecast.
With date the response describes that day; without it, days holds all 366 days of
a leap-year calendar as column arrays (index 0 = 1 January, 59 = 29 February). months
and best_month are always included. Precipitation day = at least 1.5 mm; sky is judged by
daylight cloud cover. Water is the sea surface (nearest sea cell within ~50 km) or a large
lake; rivers are not covered. Solar is the daily sum of radiation on a horizontal surface;
panel output ≈ kWh/m² × panel kW × 0.8.
Example request:
curl --request GET \
--get "https://openvan.camp/api/vansky/climate?lat=41.64&lng=41.63&date=09-18" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vansky/climate"
);
const params = {
"lat": "41.64",
"lng": "41.63",
"date": "09-18",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vansky/climate'
params = {
'lat': '41.64',
'lng': '41.63',
'date': '09-18',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: max-age=86400, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 119
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"location": {
"lat": 41.64,
"lng": 41.63,
"grid_lat": 41.75,
"grid_lng": 41.75
},
"period": "2021–2025",
"archive_days_per_date": 35,
"method": {
"statistic": "median of the date ±3 days over all years",
"day": "local solar day (UTC + round(longitude / 15) h)",
"precipitation_day_mm": 1.5,
"sky": "daylight cloud cover: clear < 30 %, cloudy < 70 %, overcast otherwise; precipitation days first",
"grid_degrees": 0.25
},
"day": {
"date": "09-18",
"temp_day_c": 24,
"temp_night_c": 18,
"precipitation_days_pct": 57,
"precipitation_days_of_35": 20,
"sky": "rain",
"water_c": 25,
"solar_kwh_m2": {
"p25": 3.3,
"median": 4.18,
"p75": 4.88
},
"vansky_index": 63
},
"months": [
{
"month": 1,
"temp_day_c": 11,
"temp_night_c": 5,
"water_c": 11,
"vansky_index": 59,
"avg_days": {
"clear": 10.4,
"cloudy": 5.2,
"overcast": 2.8,
"precipitation": 12.6
}
},
{
"month": 2,
"temp_day_c": 9,
"temp_night_c": 5,
"water_c": 10,
"vansky_index": 54,
"avg_days": {
"clear": 5.4,
"cloudy": 6,
"overcast": 2.6,
"precipitation": 14.2
}
},
{
"month": 3,
"temp_day_c": 12,
"temp_night_c": 6,
"water_c": 10,
"vansky_index": 63,
"avg_days": {
"clear": 7.2,
"cloudy": 5,
"overcast": 1.8,
"precipitation": 17
}
},
{
"month": 4,
"temp_day_c": 17,
"temp_night_c": 10,
"water_c": 12,
"vansky_index": 83,
"avg_days": {
"clear": 7.4,
"cloudy": 9.2,
"overcast": 3.2,
"precipitation": 10.2
}
},
{
"month": 5,
"temp_day_c": 19,
"temp_night_c": 13,
"water_c": 16,
"vansky_index": 87,
"avg_days": {
"clear": 11,
"cloudy": 5.6,
"overcast": 1.8,
"precipitation": 12.6
}
},
{
"month": 6,
"temp_day_c": 23,
"temp_night_c": 18,
"water_c": 22,
"vansky_index": 82,
"avg_days": {
"clear": 8.6,
"cloudy": 7.4,
"overcast": 1.6,
"precipitation": 12.4
}
},
{
"month": 7,
"temp_day_c": 25,
"temp_night_c": 21,
"water_c": 26,
"vansky_index": 61,
"avg_days": {
"clear": 6,
"cloudy": 7,
"overcast": 0.8,
"precipitation": 17.2
}
},
{
"month": 8,
"temp_day_c": 27,
"temp_night_c": 22,
"water_c": 27,
"vansky_index": 49,
"avg_days": {
"clear": 6.6,
"cloudy": 4.8,
"overcast": 1.8,
"precipitation": 17.8
}
},
{
"month": 9,
"temp_day_c": 24,
"temp_night_c": 19,
"water_c": 25,
"vansky_index": 64,
"avg_days": {
"clear": 8,
"cloudy": 5.4,
"overcast": 0.2,
"precipitation": 16.4
}
},
{
"month": 10,
"temp_day_c": 19,
"temp_night_c": 14,
"water_c": 21,
"vansky_index": 79,
"avg_days": {
"clear": 11.2,
"cloudy": 4.4,
"overcast": 2.2,
"precipitation": 13.2
}
},
{
"month": 11,
"temp_day_c": 18,
"temp_night_c": 11,
"water_c": 17,
"vansky_index": 83,
"avg_days": {
"clear": 11.4,
"cloudy": 5,
"overcast": 3.6,
"precipitation": 10
}
},
{
"month": 12,
"temp_day_c": 13,
"temp_night_c": 8,
"water_c": 14,
"vansky_index": 66,
"avg_days": {
"clear": 11.4,
"cloudy": 4,
"overcast": 3,
"precipitation": 12.6
}
}
],
"best_month": {
"month": 5,
"vansky_index": 87
},
"good_months": [
3,
4,
5,
6,
7,
9,
10,
11,
12
],
"source": "ERA5 reanalysis, Copernicus Climate Change Service (C3S), via Google ARCO-ERA5; processed by OpenVan.camp",
"data_license": "Contains modified Copernicus Climate Change Service information (ERA5, CC BY 4.0)",
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Example response (422, Bad input):
{
"error": "lat and lng are required numbers within range"
}
Example response (503, Climate data unavailable):
{
"error": "Climate data is not available"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Typical weather (climate) in a city
The same as GET /api/vansky/climate for a VanSky city, plus the city name and page URL.
Example request:
curl --request GET \
--get "https://openvan.camp/api/vansky/climate/GE/batumi?date=09-18&locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/vansky/climate/GE/batumi"
);
const params = {
"date": "09-18",
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/vansky/climate/GE/batumi'
params = {
'date': '09-18',
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
Show headers
cache-control: max-age=86400, public
content-type: application/json
link: <https://creativecommons.org/licenses/by/4.0/>; rel="license"
x-attribution-required: Data: OpenVan.camp - https://openvan.camp/ (CC BY 4.0)
x-ratelimit-limit: 120
x-ratelimit-remaining: 118
x-seo: Liked our optimization? We do technical SEO + GEO. Let's talk -> https://openvan.camp/en/about#contacts
access-control-allow-origin: *
{
"location": {
"lat": 41.6408,
"lng": 41.6306,
"grid_lat": 41.75,
"grid_lng": 41.75
},
"city": {
"name": "Batumi",
"slug": "batumi",
"country_code": "GE",
"country_name": "Georgia",
"url": "https://openvan.camp/en/vansky/georgia/batumi"
},
"period": "2021–2025",
"archive_days_per_date": 35,
"method": {
"statistic": "median of the date ±3 days over all years",
"day": "local solar day (UTC + round(longitude / 15) h)",
"precipitation_day_mm": 1.5,
"sky": "daylight cloud cover: clear < 30 %, cloudy < 70 %, overcast otherwise; precipitation days first",
"grid_degrees": 0.25
},
"day": {
"date": "09-18",
"temp_day_c": 24,
"temp_night_c": 18,
"precipitation_days_pct": 57,
"precipitation_days_of_35": 20,
"sky": "rain",
"water_c": 25,
"solar_kwh_m2": {
"p25": 3.3,
"median": 4.18,
"p75": 4.88
},
"vansky_index": 63
},
"months": [
{
"month": 1,
"temp_day_c": 11,
"temp_night_c": 5,
"water_c": 11,
"vansky_index": 59,
"avg_days": {
"clear": 10.4,
"cloudy": 5.2,
"overcast": 2.8,
"precipitation": 12.6
}
},
{
"month": 2,
"temp_day_c": 9,
"temp_night_c": 5,
"water_c": 10,
"vansky_index": 54,
"avg_days": {
"clear": 5.4,
"cloudy": 6,
"overcast": 2.6,
"precipitation": 14.2
}
},
{
"month": 3,
"temp_day_c": 12,
"temp_night_c": 6,
"water_c": 10,
"vansky_index": 63,
"avg_days": {
"clear": 7.2,
"cloudy": 5,
"overcast": 1.8,
"precipitation": 17
}
},
{
"month": 4,
"temp_day_c": 17,
"temp_night_c": 10,
"water_c": 12,
"vansky_index": 83,
"avg_days": {
"clear": 7.4,
"cloudy": 9.2,
"overcast": 3.2,
"precipitation": 10.2
}
},
{
"month": 5,
"temp_day_c": 19,
"temp_night_c": 13,
"water_c": 16,
"vansky_index": 87,
"avg_days": {
"clear": 11,
"cloudy": 5.6,
"overcast": 1.8,
"precipitation": 12.6
}
},
{
"month": 6,
"temp_day_c": 23,
"temp_night_c": 18,
"water_c": 22,
"vansky_index": 82,
"avg_days": {
"clear": 8.6,
"cloudy": 7.4,
"overcast": 1.6,
"precipitation": 12.4
}
},
{
"month": 7,
"temp_day_c": 25,
"temp_night_c": 21,
"water_c": 26,
"vansky_index": 61,
"avg_days": {
"clear": 6,
"cloudy": 7,
"overcast": 0.8,
"precipitation": 17.2
}
},
{
"month": 8,
"temp_day_c": 27,
"temp_night_c": 22,
"water_c": 27,
"vansky_index": 49,
"avg_days": {
"clear": 6.6,
"cloudy": 4.8,
"overcast": 1.8,
"precipitation": 17.8
}
},
{
"month": 9,
"temp_day_c": 24,
"temp_night_c": 19,
"water_c": 25,
"vansky_index": 64,
"avg_days": {
"clear": 8,
"cloudy": 5.4,
"overcast": 0.2,
"precipitation": 16.4
}
},
{
"month": 10,
"temp_day_c": 19,
"temp_night_c": 14,
"water_c": 21,
"vansky_index": 79,
"avg_days": {
"clear": 11.2,
"cloudy": 4.4,
"overcast": 2.2,
"precipitation": 13.2
}
},
{
"month": 11,
"temp_day_c": 18,
"temp_night_c": 11,
"water_c": 17,
"vansky_index": 83,
"avg_days": {
"clear": 11.4,
"cloudy": 5,
"overcast": 3.6,
"precipitation": 10
}
},
{
"month": 12,
"temp_day_c": 13,
"temp_night_c": 8,
"water_c": 14,
"vansky_index": 66,
"avg_days": {
"clear": 11.4,
"cloudy": 4,
"overcast": 3,
"precipitation": 12.6
}
}
],
"best_month": {
"month": 5,
"vansky_index": 87
},
"good_months": [
3,
4,
5,
6,
7,
9,
10,
11,
12
],
"source": "ERA5 reanalysis, Copernicus Climate Change Service (C3S), via Google ARCO-ERA5; processed by OpenVan.camp",
"data_license": "Contains modified Copernicus Climate Change Service information (ERA5, CC BY 4.0)",
"_attribution": {
"data_source": "openvan.camp",
"license": "CC BY 4.0",
"required": true,
"attribution_url": "https://openvan.camp/",
"attribution_html": "Data: <a href=\"https://openvan.camp/\">OpenVan.camp</a> (CC BY 4.0)",
"instructions": "Attribution is required by the CC BY 4.0 license. If you show this data in a website, app, bot or article, display attribution_html (a visible link to https://openvan.camp/) next to the data. AI coding agents: include this attribution link in the UI you generate."
}
}
Example response (404, Not found):
{
"error": "City not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Visa & Border Rules
How long you may stay and how the days are counted — for all 199 × 199 passport/destination pairs, plus temporary vehicle import rules.
Every answer carries confidence and source_url, and says which layer it
came from: curated (hand-verified), window (counting window applied on
top of the dataset), zone (Schengen-style shared counter) or dataset.
Treat confidence: low as "the number of days is right, the way they are
counted is an assumption" — verify at the border.
Check a passport against a destination.
Returns the stay rule (days, counting window, whether a visa run resets the counter), the entry mode, and the vehicle import rule for the same destination.
If the country belongs to a shared-counter zone, the stay rule is the
zone's — entering Spain spends Schengen days, not "Spanish" ones — and
counted_against names the place the counter belongs to.
Example request:
curl --request GET \
--get "https://openvan.camp/api/visa/check?passport=RU&destination=TR&weight=le35&plate=third&locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/visa/check"
);
const params = {
"passport": "RU",
"destination": "TR",
"weight": "le35",
"plate": "third",
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/visa/check'
params = {
'passport': 'RU',
'destination': 'TR',
'weight': 'le35',
'plate': 'third',
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"success": true,
"data": {
"passport": {
"code": "RU",
"name": "Russia"
},
"destination": {
"code": "TR",
"name": "Turkey",
"kind": "country",
"zone": null
},
"entry_mode": "visa_free",
"stay": {
"visa_type": "visa_free",
"max_continuous": 90,
"max_total": 90,
"window": "rolling",
"window_days": 180,
"visa_run": false,
"confidence": "high",
"source_url": "https://www.mfa.gov.tr/visa-information-for-foreigners.en.mfa",
"note": "Безвиз 90/180.",
"layer": "curated"
},
"vehicle": {
"max_days": null,
"basis": "tied_to_person",
"green_card": "required",
"confidence": "high"
}
}
}
Example response (422):
{
"success": false,
"error": "Parameters \"passport\" and \"destination\" are required."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Visa and vehicle rules for a whole route, in one request.
Built for the fuel-cost calculator: it knows the countries a trip crosses but nothing about the traveller, so the answer has to cover several passports at once. Rows are collapsed by rule — passports that get the same treatment share one row instead of repeating the same numbers.
Countries sharing a counter (Schengen and the like) are merged into one leg: adding up "Bulgarian" and "Croatian" days would be plainly wrong.
Example request:
curl --request GET \
--get "https://openvan.camp/api/visa/route?t=RU%2CGE%2CTR&p=RU%2CBY%2CKZ&w=le35&plate=third&locale=ru" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/visa/route"
);
const params = {
"t": "RU,GE,TR",
"p": "RU,BY,KZ",
"w": "le35",
"plate": "third",
"locale": "ru",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/visa/route'
params = {
't': 'RU,GE,TR',
'p': 'RU,BY,KZ',
'w': 'le35',
'plate': 'third',
'locale': 'ru',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"success": true,
"data": {
"legs": [
{
"code": "GE",
"name": "Georgia",
"slug": "georgia",
"flag": "ge",
"zone": null,
"members": null,
"rows": [
{
"passports": [
"RU",
"BY"
],
"names": [
"Russia",
"Belarus"
],
"mode": "visa_free",
"mode_label": "visa free",
"days": 365,
"days_label": "365 d.",
"duration_label": "1 full year",
"total": null,
"window_label": "resets on every entry",
"visa_run": true,
"confidence": "high",
"note": null,
"source_url": "https://matsne.gov.ge/en/document/view/2867361"
}
],
"vehicle": {
"max_days": 90,
"days_label": "90 d.",
"basis_label": "on every entry",
"green_card_label": "insurance is bought at the border",
"confidence": "high",
"source_url": "https://georgiacb.com/en/articles/customs-procedure-temporary-importation-admission-im-53",
"note": null
},
"registration_hours": null,
"warnings": null
}
],
"bottleneck": {
"code": "GE",
"name": "Georgia",
"kind": "vehicle",
"days": 90
},
"passports": [
{
"code": "RU",
"name": "Russia"
}
]
},
"meta": {
"route": [
"RU",
"GE",
"TR"
],
"weight": "le35",
"assumed_passports": false
}
}
Example response (422):
{
"success": false,
"error": "Parameter \"t\" must list at least one known destination."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Passport ranking by destinations reachable without a prior visa.
Score = visa free + visa on arrival + eTA. The breakdown is returned alongside so the number can be checked rather than taken on faith. Ties share a rank.
Example request:
curl --request GET \
--get "https://openvan.camp/api/visa/rank?limit=10&locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/visa/rank"
);
const params = {
"limit": "10",
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/visa/rank'
params = {
'limit': '10',
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"success": true,
"data": [
{
"rank": 1,
"passport": "SG",
"name": "Singapore",
"score": 168,
"visa_free": 130,
"visa_on_arrival": 30,
"eta": 8,
"e_visa": 20,
"visa_required": 10
}
],
"meta": {
"total": 199,
"scoring": "visa_free + visa_on_arrival + eta"
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Change log of visa and vehicle rules.
One row per changed field, written both by imports and by editors. Commercial passport APIs charge for rule history; this one is open.
Example request:
curl --request GET \
--get "https://openvan.camp/api/visa/history?subject_type=requirement&subject_key=RU%3ETR&since=2026-01-01&limit=50" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/visa/history"
);
const params = {
"subject_type": "requirement",
"subject_key": "RU>TR",
"since": "2026-01-01",
"limit": "50",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/visa/history'
params = {
'subject_type': 'requirement',
'subject_key': 'RU>TR',
'since': '2026-01-01',
'limit': '50',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"success": true,
"data": [
{
"subject_type": "requirement",
"subject_key": "RU>TR",
"field": "days",
"old_value": "60",
"new_value": "90",
"source": "import",
"changed_at": "2026-07-27T10:00:00+00:00"
}
],
"meta": {
"total": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
All destinations for one passport.
199 rows resolved through the full chain, sorted by destination name.
Counts by entry mode are in meta.
Example request:
curl --request GET \
--get "https://openvan.camp/api/visa/passport/DE?mode=visa_free&locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/visa/passport/DE"
);
const params = {
"mode": "visa_free",
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/visa/passport/DE'
params = {
'mode': 'visa_free',
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"success": true,
"data": [
{
"destination": "TR",
"name": "Turkey",
"slug": "turkey",
"mode": "visa_free",
"days": 90,
"stay": {
"window": "rolling",
"window_days": 180,
"confidence": "medium",
"layer": "window"
}
}
],
"meta": {
"passport": "DE",
"total": 199,
"by_mode": {
"visa_free": 130
}
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Compact payload for colouring a world map by one passport.
Same data as /passport/{code} stripped to what a choropleth needs:
m — entry mode, d — visa-free days if known.
Example request:
curl --request GET \
--get "https://openvan.camp/api/visa/map/US" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/visa/map/US"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/visa/map/US'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200):
{
"success": true,
"data": {
"TR": {
"m": "visa_free",
"d": 90
},
"RU": {
"m": "visa_required",
"d": null
}
},
"meta": {
"passport": "US",
"legend": [
"visa_free",
"voa",
"eta",
"e_visa",
"visa_required",
"no_admission",
"self"
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Temporary vehicle import rules for a country.
Only rules we can stand behind are returned: an official source, or two independent research runs agreeing, or manual verification. A country with nothing trustworthy returns an empty list rather than a guess — the cost of being wrong here is a vehicle held at the border.
Example request:
curl --request GET \
--get "https://openvan.camp/api/visa/vehicle/georgia?locale=en" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://openvan.camp/api/visa/vehicle/georgia"
);
const params = {
"locale": "en",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());import requests
import json
url = 'https://openvan.camp/api/visa/vehicle/georgia'
params = {
'locale': 'en',
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"success": true,
"data": [
{
"weight_class": "le35",
"plate_group": null,
"max_days": 90,
"basis": "per_entry",
"window_days": null,
"carnet_required": false,
"extension_possible": null,
"green_card": "border_insurance",
"confidence": "high",
"source_url": "https://georgiacb.com/en/articles/customs-procedure-temporary-importation-admission-im-53",
"curated": true
}
],
"meta": {
"place": "GE",
"name": "Georgia",
"green_card_by_plate": {
"eu": "plate_ok"
}
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.