MENU navbar-image

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:

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."
            }
        }
    }
}
 

Request      

GET api/currency/rates

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

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"
            ]
        }
    ]
}
 

Request      

GET api/customs/countries

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

locale   string  optional    

Language: en, ru, de, fr, es, pt, tr. Example: en

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"
        }
    ]
}
 

Request      

GET api/customs/countries/{code}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 of the country you enter. Example: PL

Query Parameters

from   string  optional    

ISO code of the country you are coming from. Example: UA

locale   string  optional    

Language of the wording: en, ru, de, fr, es, pt, tr. Example: en

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
    }
}
 

Request      

GET api/events

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

locale   string  optional    

Language code for localized names. One of: en, ru, de, fr, es, pt, tr. Defaults to en. Example: en

status   string  optional    

Filter by event status. One of: upcoming, ongoing, past, all. Defaults to upcoming. Example: upcoming

type   string  optional    

Filter by event type. One of: expo, festival, forum, meetup, roadtrip. Example: festival

country   string  optional    

2-letter ISO country code. Example: DE

search   string  optional    

Text search by event name. Example: Adventure Northside

page   integer  optional    

Page number. Defaults to 1. Example: 1

limit   integer  optional    

Results per page (max 100). Defaults to 30. Example: 30

Body Parameters

page   integer  optional    

Must be at least 1. Example: 16

limit   integer  optional    

Must be at least 1. Must not be greater than 100. Example: 22

search   string  optional    

Must not be greater than 200 characters. Example: g

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]."
}
 

Request      

GET api/event/{slug}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

slug   string     

The event slug. Example: adventure-northside-2026

Query Parameters

locale   string  optional    

Language for localized content. One of: en, ru, de, fr, es, pt, tr. Example: en

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"
    }
]
 

Request      

GET api/event/{slug}/articles

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

slug   string     

The event slug. Example: adventure-northside-2026

Query Parameters

locale   string  optional    

Language code to filter articles by source language. One of: en, ru, de, fr, es, pt, tr. Defaults to en. Example: en

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()

Request      

POST api/route-cost

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

waypoints   string[]     

2–10 place names in travel order.

tank   number  optional    

Tank volume, litres. Example: 80

cons   number  optional    

Consumption, litres per 100 km. Example: 10

fuel   string  optional    

diesel, gasoline or lpg. Example: diesel

currency   string  optional    

ISO 4217 code for the total. Example: EUR

locale   string  optional    

Language of country names: en, ru, de, fr, es, pt, tr. Example: en

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
    }
}
 

Request      

GET api/fuel/prices

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

country   string  optional    

Optional ISO 3166-1 alpha-2 code to return a single country instead of all. Unknown codes return 404. Example: `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.`

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"
            ]
        }
    ]
}
 

Request      

GET api/holidays/countries

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

locale   string  optional    

Language of country names: en, ru, de, fr, es, pt, tr. Example: en

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"
        }
    ]
}
 

Request      

GET api/holidays/countries/{code}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2. Example: FR

Query Parameters

from   string  optional    

date Start of the period (default today). Example: 2026-07-01

to   string  optional    

date End of the period (default +90 days, at most 400 days after from). Example: 2026-08-31

kind   string  optional    

Only one kind: public, school, traffic. Example: public

locale   string  optional    

Language of names: en, ru, de, fr, es, pt, tr. Example: en

Body Parameters

from   string  optional    

Must be a valid date in the format Y-m-d. Example: 2026-10-26

to   string  optional    

Must be a valid date in the format Y-m-d. Example: 2026-10-26

kind   string  optional    

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&region=KBL&v=7476f0f0",
                    "png": "https://openvan.camp/api/plates/af/plate.png?number=5+11585&region=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&region=NSW&v=ac7c71f3",
                    "png": "https://openvan.camp/api/plates/au/plate.png?number=CB%C2%B733%C2%B7GO&region=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&region=ABACO&v=ada69d6d",
                    "png": "https://openvan.camp/api/plates/bs/plate.png?number=1521&region=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&region=DHAKA+METRO&v=0e11bd04",
                    "png": "https://openvan.camp/api/plates/bd/plate.png?number=GA+31-9957&region=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&region=3&v=34246fc9",
                    "png": "https://openvan.camp/api/plates/by/plate.png?number=8682+%D0%90%D0%A5&region=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&region=BMP&v=9d1656b6",
                    "png": "https://openvan.camp/api/plates/bz/plate.png?number=C1942&region=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&region=L&v=73ccb13b",
                    "png": "https://openvan.camp/api/plates/bo/plate.png?number=1852PHD&region=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&region=BANTEAY+MEANCHEY&v=dc8e712a",
                    "png": "https://openvan.camp/api/plates/kh/plate.png?number=2A-3631&region=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&region=ON&v=f7867221",
                    "png": "https://openvan.camp/api/plates/ca/plate.png?number=CBPC+344&region=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&region=SEVILLA&v=ffbbd04b",
                    "png": "https://openvan.camp/api/plates/co/plate.png?number=NOJ+122&region=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&region=0613&v=df9ce9f2",
                    "png": "https://openvan.camp/api/plates/cy/plate.png?number=MAA+001&region=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&region=AA&v=8c2a5f46",
                    "png": "https://openvan.camp/api/plates/et/plate.png?number=49131&region=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&region=75&v=2883a430",
                    "png": "https://openvan.camp/api/plates/fr/plate.png?number=AB-725-FR&region=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&region=02&v=93d44bf4",
                    "png": "https://openvan.camp/api/plates/gn/plate.png?number=AH+0000&region=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&region=Ouest&v=d3323efb",
                    "png": "https://openvan.camp/api/plates/ht/plate.png?number=AA+88043&region=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&region=0828&v=fe98fc92",
                    "png": "https://openvan.camp/api/plates/id/plate.png?number=B+1234+ABC&region=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&region=01&v=b05e8ac9",
                    "png": "https://openvan.camp/api/plates/ci/plate.png?number=AA-573-EA&region=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&region=%E5%A4%9A%E6%91%A9&v=9461e1c2",
                    "png": "https://openvan.camp/api/plates/jp/plate.png?number=500+%E3%81%8D+12-34&region=%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&region=VIENTIANE+CAPITAL&v=0bc9a69d",
                    "png": "https://openvan.camp/api/plates/la/plate.png?number=%E0%BA%AE%E0%BA%8D+8118&region=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&region=9095&v=b2fffe1c",
                    "png": "https://openvan.camp/api/plates/ls/plate.png?number=C+5882&region=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&region=AGUASCALIENTES&v=578db114",
                    "png": "https://openvan.camp/api/plates/mx/plate.png?number=AGS-123-A&region=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&region=YAP&v=23a9fd89",
                    "png": "https://openvan.camp/api/plates/fm/plate.png?number=2945&region=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&region=MDY-14&v=03ed4ab9",
                    "png": "https://openvan.camp/api/plates/mm/plate.png?number=1P-3574&region=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&region=LAGOS&v=90bd0138",
                    "png": "https://openvan.camp/api/plates/ng/plate.png?number=APP-456CV&region=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&region=2026&v=62ed1e8f",
                    "png": "https://openvan.camp/api/plates/pa/plate.png?number=AB1234&region=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&region=197&v=0dccaf4d",
                    "png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%A1065%D0%9C%D0%9A&region=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&region=DK&v=3b11141d",
                    "png": "https://openvan.camp/api/plates/sn/plate.png?number=AA-012-BC&region=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&region=PRV&v=5974368e",
                    "png": "https://openvan.camp/api/plates/sl/plate.png?number=AIB+960&region=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&region=WP&v=d4abb57b",
                    "png": "https://openvan.camp/api/plates/lk/plate.png?number=ND-8740&region=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&region=%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&region=%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&region=34&v=76d2395a",
                    "png": "https://openvan.camp/api/plates/tr/plate.png?number=ABC+123&region=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&region=CA&v=19055a90",
                    "png": "https://openvan.camp/api/plates/us/plate.png?number=9KDV763&region=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&region=CARABOBO&v=6e9ee998",
                    "png": "https://openvan.camp/api/plates/ve/plate.png?number=AA128GG&region=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."
    }
}
 

Request      

GET api/plates

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

locale   string  optional    

Language of country and region names: en, ru, de, es, fr, pt, tr. Example: en

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&region=197&v=0dccaf4d",
                "png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%A1065%D0%9C%D0%9A&region=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&region=197&type=private&v=0dccaf4d",
                        "png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%A1065%D0%9C%D0%9A&region=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&region=78&type=taxi_bus&v=0dccaf4d",
                        "png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%92%D0%95166&region=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&region=78&type=motorcycle&v=0dccaf4d",
                        "png": "https://openvan.camp/api/plates/ru/plate.png?number=4407%D0%90%D0%9C&region=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&region=50&type=trailer&v=0dccaf4d",
                        "png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%95%D0%903015&region=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&region=35&type=tractor&v=0dccaf4d",
                        "png": "https://openvan.camp/api/plates/ru/plate.png?number=4509%D0%92%D0%A2&region=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&region=39&type=export_transit&v=0dccaf4d",
                        "png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%A2%D0%90%D0%9D516&region=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&region=77&type=diplomatic&v=0dccaf4d",
                        "png": "https://openvan.camp/api/plates/ru/plate.png?number=014D161&region=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&region=39&type=police&v=0dccaf4d",
                        "png": "https://openvan.camp/api/plates/ru/plate.png?number=%D0%900200&region=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&region=77&type=military&v=0dccaf4d",
                        "png": "https://openvan.camp/api/plates/ru/plate.png?number=5567%D0%90%D0%9C&region=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."
    }
}
 

Request      

GET api/plates/{code}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: ru

Query Parameters

locale   string  optional    

Language of names and texts. Example: en

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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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&region=%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."
    }
}
 

Request      

GET api/plates/{code}/types

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: th

Query Parameters

locale   string  optional    

Language of names and descriptions. Example: en

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&region=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."
}
 

Request      

GET api/plates/{code}/validate

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: ru

Query Parameters

number   string     

Plate number without the region. Example: A123BC

region   string  optional    

Region code, if the country shows one. Example: 77

type   string  optional    

Plate type key from GET /api/plates/{code}/types (e.g. taxi). Default type if omitted. Example: taxi

locale   string  optional    

Language of the region name. Example: en

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."
}
 

Request      

GET api/plates/{code}/random

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: ru

Query Parameters

type   string  optional    

Plate type key from GET /api/plates/{code}/types (e.g. taxi). Default type if omitted. Example: taxi

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&region=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."
}
 

Request      

GET api/plates/{code}/plate.svg

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: ru

Query Parameters

number   string     

Plate number without the region. Example: A123BC

region   string  optional    

Region code, if the country shows one. Example: 77

custom   boolean  optional    

Draw any text in the plate layout. Example: false

type   string  optional    

Plate type key from GET /api/plates/{code}/types (e.g. taxi). Default type if omitted. Example: taxi

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&region=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."
}
 

Request      

GET api/plates/{code}/plate.png

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: ru

Query Parameters

number   string     

Plate number without the region. Example: A123BC

region   string  optional    

Region code. Example: 77

custom   boolean  optional    

Draw any text in the plate layout. Example: false

type   string  optional    

Plate type key from GET /api/plates/{code}/types (e.g. taxi). Default type if omitted. Example: taxi

width   integer  optional    

Width in pixels, 200–2000. Example: 800

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
    }
}
 

Request      

GET api/electricity/countries

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

locale   string  optional    

Language of country names: en, ru, de, fr, es, pt, tr. Example: en

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"
    ]
}
 

Request      

GET api/electricity/countries/{code}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2. Example: GB

Query Parameters

locale   string  optional    

Language of the country name: en, ru, de, fr, es, pt, tr. Example: en

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"
}
 

Request      

POST api/roadbook/from-places

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

places   string[]     

Place names in travel order: cities or countries.

name   string  optional    

Roadbook title. Example: Munich — Venice

locale   string     

Language of the roadbook: en, ru, de, fr, es, pt, tr. Example: en

inputs   object  optional    

Traveller and vehicle answers: travelers (passports), plates, weight (le35/gt35), vehicle_class, fuel, cons, tank, date, hpd, round, avoid_tolls, currency.

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"
    }
}
 

Request      

GET api/roadbook/{code}/status

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

Roadbook code from the create response. Example: wqhk8

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
    }
}
 

Request      

GET api/stories

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

locale   string  optional    

Language for localized titles and summaries. One of: en, ru, de, fr, es, pt, tr. Defaults to en. Example: en

category   string  optional    

Filter by category slug. One of: lifestyle, industry, incident, opening, closing, law, builds, festival, expo, review, ban, other. Example: festival

country   string  optional    

2-letter ISO country code to filter by associated country. Example: DE

search   string  optional    

Full-text search by story title. Example: vanlife festival

page   integer  optional    

Page number. Defaults to 1. Example: 1

limit   integer  optional    

Results per page (max 50). Defaults to 20. Example: 20

Body Parameters

page   integer  optional    

Must be at least 1. Example: 16

limit   integer  optional    

Must be at least 1. Must not be greater than 50. Example: 22

search   string  optional    

Must not be greater than 200 characters. Example: g

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."
}
 

Request      

GET api/story/{slug}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

slug   string     

The story slug. Example: adac-camper-des-jahres-der-wettbewerb-fuer

Query Parameters

locale   string  optional    

Language for localized title and summary. One of: en, ru, de, fr, es, pt, tr. Defaults to en. Example: en

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."
    }
}
 

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
 

Request      

GET api/news/digest

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

locale   string  optional    

Digest language. Currently ru or en. Defaults to ru. Example: ru

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"
        }
    ]
}
 

Request      

GET api/tolls/countries

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

locale   string  optional    

Language of names: en, ru, de, fr, es, pt, tr. Example: en

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"
}
 

Request      

GET api/tolls/countries/{code}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2. Example: IT

Query Parameters

locale   string  optional    

Language of names: en, ru, de, fr, es, pt, tr. Example: en

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."
}
 

Request      

GET api/tolls/route

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

waypoints   string     

2–10 place names separated by "|" (or an array waypoints[]). Example: Rome|Paris

vehicle_class   string  optional    

car, van (campervan up to 3.5 t, default) or heavy (over 3.5 t). Example: van

locale   string  optional    

Language of bridge and section names. Example: en

Body Parameters

waypoints   string[]     

Must not be greater than 120 characters.

vehicle_class   string  optional    

Example: heavy

Must be one of:
  • car
  • van
  • heavy

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"
        }
    ]
}
 

Request      

GET api/hazards/countries/{code}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2. Example: TR

Query Parameters

locale   string  optional    

Language of the country name: en, ru, de, fr, es, pt, tr. Example: en

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"
        }
    ]
}
 

Request      

GET api/hazards/fires

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

bbox   string     

West,south,east,north in degrees. Example: 29,36,33,38

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
    }
}
 

Request      

GET api/vanbasket/countries

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

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
    }
}
 

Request      

GET api/vanbasket/compare

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

from   string     

ISO 3166-1 alpha-2 code of home country. Example: DE

to   string     

ISO 3166-1 alpha-2 code of destination country. Example: TR

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
            }
        ]
    }
}
 

Request      

GET api/vanbasket/countries/{code}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: DE

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)"
}
 

Request      

GET api/vansky/weather

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

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"
}
 

Request      

GET api/vansky/weather/{code}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: DE

Query Parameters

locale   string  optional    

Language of the recommendation texts. One of: en, ru, de, fr, es, pt, tr. Example: en

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"
}
 

Request      

GET api/vansky/weather/{code}/cities

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: GE

Query Parameters

sort   string  optional    

week (default) or today. Example: week

limit   integer  optional    

Cities per page, 1–200. Defaults to 50. Example: 10

offset   integer  optional    

Skip this many cities. Defaults to 0. Example: 0

locale   string  optional    

Language of city names. One of: en, ru, de, fr, es, pt, tr. Example: en

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&region=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."
    }
}
 

Request      

GET api/vansky/ranking

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

by   string  optional    

week (default) or today. Example: week

region   string  optional    

Only one region: europe, asia, africa, americas, oceania, cis, middle_east. Example: europe

limit   integer  optional    

Countries to return, 1–250. Defaults to 250. Example: 10

locale   string  optional    

Language of country names. One of: en, ru, de, fr, es, pt, tr. Example: en

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."
    }
}
 

Request      

GET api/vansky/methodology

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

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"
}
 

Request      

GET api/vansky/weather/{code}/{city}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: GE

city   string     

City slug as in the VanSky URL. Example: batumi

Query Parameters

locale   string  optional    

Language of the city name and recommendation texts. One of: en, ru, de, fr, es, pt, tr. Example: en

include   string  optional    

Pass hourly for the 3-hour forecast and the daily sea temperature. Example: hourly

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"
}
 

Request      

GET api/vansky/climate

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

lat   number     

Latitude, -90..90. Example: 41.64

lng   number     

Longitude, -180..180. Example: 41.63

date   string  optional    

Day of the year, MM-DD or YYYY-MM-DD (the year is ignored). Example: 09-18

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"
}
 

Request      

GET api/vansky/climate/{code}/{city}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 country code. Example: GE

city   string     

City slug as in the VanSky URL. Example: batumi

Query Parameters

date   string  optional    

Day of the year, MM-DD or YYYY-MM-DD (the year is ignored). Example: 09-18

locale   string  optional    

Language of the city name. One of: en, ru, de, fr, es, pt, tr. Example: en

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."
}
 

Request      

GET api/visa/check

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

passport   string     

ISO 3166-1 alpha-2 code of the passport. Example: RU

destination   string     

ISO alpha-2 code, slug or zone code. Example: TR

weight   string  optional    

Vehicle weight class for the vehicle rule: le35 (≤3.5t) or gt35. Example: le35

plate   string  optional    

Vehicle plate origin: a block (eu, non_eu, eaeu, third) or the ISO code of the plate country (RU, DE…). A country code also returns plate_ban when that plate is barred from entry. Example: third

locale   string  optional    

Language of place names, one of ru/en/de/es/fr/pt/tr. Defaults to en. Example: en

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."
}
 

Request      

GET api/visa/route

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

t   string     

Countries in travel order, comma separated ISO alpha-2 codes, slugs or zone codes. Up to 12. Example: RU,GE,TR

p   string  optional    

Passports to answer for, comma separated, up to 10. Defaults to the set matching locale, and meta.assumed_passports then says so. Example: RU,BY,KZ

w   string  optional    

Vehicle weight class: le35 (≤3.5t) or gt35. Example: le35

plate   string  optional    

Plate origin: a block (eu, non_eu, eaeu, third) or the ISO code of the plate country (RU, DE…). A country code also returns plate_ban per leg when that plate is barred from entry. Example: third

locale   string  optional    

Language of names and labels, one of ru/en/de/es/fr/pt/tr. Defaults to en. Example: ru

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"
    }
}
 

Request      

GET api/visa/rank

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

limit   integer  optional    

How many rows to return, 1..199. Defaults to all. Example: 10

locale   string  optional    

Language of passport names. Defaults to en. Example: en

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
    }
}
 

Request      

GET api/visa/history

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

subject_type   string  optional    

Filter: requirement, window, window_exception, curated_rule, vehicle_rule, place. Example: requirement

subject_key   string  optional    

Filter by subject, e.g. RU>TR for a pair or TR for a place. Example: RU>TR

since   string  optional    

ISO date, only changes on or after it. Example: 2026-01-01

limit   integer  optional    

1..500, defaults to 100. Example: 50

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
        }
    }
}
 

Request      

GET api/visa/passport/{code}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 code of the passport. Example: DE

Query Parameters

mode   string  optional    

Filter by entry mode: visa_free, visa_required, e_visa, eta, voa, no_admission. Example: visa_free

locale   string  optional    

Language of place names. Defaults to en. Example: en

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"
        ]
    }
}
 

Request      

GET api/visa/map/{code}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

code   string     

ISO 3166-1 alpha-2 code of the passport. Example: US

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"
        }
    }
}
 

Request      

GET api/visa/vehicle/{place}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

place   string     

ISO alpha-2 code, slug or zone code. Example: georgia

Query Parameters

locale   string  optional    

Language of the place name. Defaults to en. Example: en