io.github.openvancamp/openvan-travel — Model Context Protocol (MCP) Server
The io.github.openvancamp/openvan-travel MCP server provides Model Context for vanlife and RV data. Its scope includes roadbooks, fuel, tolls, visas, holidays, hazards, weather, and currency. The server is associated with openvan.camp and is described as “Vanlife & RV data” focused.
🛠️ Key Features
Roadbooks
Fuel
Tolls
Visas
Holidays
Hazards
Weather
Currency
🚀 Use Cases
Retrieving travel planning context for vanlife and RV trips
Consulting location- and trip-related items such as weather, hazards, and currency
Organizing documents and constraints referenced by visas and holidays
⚡ Developer Benefits
Clear domain coverage across common travel data categories for vanlife and RV use
⚠️ Limitations
Available information does not specify tools, authentication, schema, or exact query behavior.
Plan a road trip by campervan or car between 2-10 places with the OpenVan.camp roadbook: distance, driving time and a day-by-day plan with overnights, budget (fuel, tolls, vignettes, ferries), and for every country on the way the entry rule for the given passports, residence permit and plates, how long you and the vehicle may stay (Schengen 90/180), road rules and city access (low-emission zones and stickers such as Umweltplakette and Crit'Air, Italian ZTL), holidays on the trip dates, safety and power plugs, plus the main warning and a checklist. Returns a link to the full roadbook the user can open, edit and share. Use this first when the user describes a trip from A to B.
Parameters17
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
waypoints
array
required
2-10 places in travel order: cities or countries (a country means its capital), e.g. ["Munich", "Venice"].
passports
string
optional
Passports of the travellers, comma separated ISO alpha-2 codes, e.g. RU or DE,RU. Enables visa terms and the Schengen counter.
residence
string
optional
Residence permit of the travellers, ISO alpha-2, in the same order as passports (one code applies to all), e.g. DE. A Schengen residence permit removes the visa and the 90/180 counter in Schengen.
kids
integer
optional
Number of children travelling (adds the documents children need abroad to the checklist).
pets
integer
optional
Number of pets travelling (adds pet passport, microchip, rabies and EU titre-test steps to the checklist).
plates
string
optional
Country of the vehicle's plates, ISO alpha-2 (entry bans and green card depend on it).
weight
string
optional
Vehicle weight: le35 (up to 3.5 t) or gt35.
vehicle_class
string
optional
car; van = campervan/motorhome up to 3.5 t (default); heavy = over 3.5 t.
fuel
string
optional
Fuel, e.g. diesel, gasoline, lpg.
consumption
number
optional
Consumption, litres per 100 km.
tank
number
optional
Tank volume, litres.
start_date
string
optional
Departure date, YYYY-MM-DD. Enables holidays, weather by day and visa deadlines.
hours_per_day
integer
optional
Driving hours per day for the day-by-day plan. Default 6.
round_trip
boolean
optional
Return to the start along the same route.
avoid_tolls
boolean
optional
Route avoiding toll roads.
currency
string
optional
Currency of the budget, ISO 4217. Default EUR.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"waypoints": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"minItems": 2,
"maxItems": 10,
"description": "2-10 places in travel order: cities or countries (a country means its capital), e.g. [\"Munich\", \"Venice\"]."
},
"passports": {
"type": "string",
"description": "Passports of the travellers, comma separated ISO alpha-2 codes, e.g. RU or DE,RU. Enables visa terms and the Schengen counter."
},
"residence": {
"type": "string",
"description": "Residence permit of the travellers, ISO alpha-2, in the same order as passports (one code applies to all), e.g. DE. A Schengen residence permit removes the visa and the 90/180 counter in Schengen."
},
"kids": {
"type": "integer",
"minimum": 0,
"maximum": 9,
"description": "Number of children travelling (adds the documents children need abroad to the checklist)."
},
"pets": {
"type": "integer",
"minimum": 0,
"maximum": 9,
"description": "Number of pets travelling (adds pet passport, microchip, rabies and EU titre-test steps to the checklist)."
},
"plates": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "Country of the vehicle's plates, ISO alpha-2 (entry bans and green card depend on it)."
},
"weight": {
"type": "string",
"enum": [
"le35",
"gt35"
],
"description": "Vehicle weight: le35 (up to 3.5 t) or gt35."
},
"vehicle_class": {
"type": "string",
"enum": [
"car",
"van",
"heavy"
],
"default": "van",
"description": "car; van = campervan/motorhome up to 3.5 t (default); heavy = over 3.5 t."
},
"fuel": {
"type": "string",
"description": "Fuel, e.g. diesel, gasoline, lpg."
},
"consumption": {
"type": "number",
"minimum": 1,
"maximum": 60,
"description": "Consumption, litres per 100 km."
},
"tank": {
"type": "number",
"minimum": 10,
"maximum": 2000,
"description": "Tank volume, litres."
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Departure date, YYYY-MM-DD. Enables holidays, weather by day and visa deadlines."
},
"hours_per_day": {
"type": "integer",
"minimum": 3,
"maximum": 12,
"description": "Driving hours per day for the day-by-day plan. Default 6."
},
"round_trip": {
"type": "boolean",
"description": "Return to the start along the same route."
},
"avoid_tolls": {
"type": "boolean",
"description": "Route avoiding toll roads."
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3,
"description": "Currency of the budget, ISO 4217. Default EUR."
}
},
"required": [
"waypoints"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_country_travel_brief
Everything to know before driving into one country by campervan or car, in one call: entry rule and how long the person and the vehicle may stay (with passport), travel weather now and this week, fuel prices, tolls and vignettes, public holidays in the next 30 days, safety advice, power plugs, customs limits and food prices. Use it when someone asks what to know about a country, the nuances or a guide for travelling there, or is preparing a trip to it; use the single-topic tools for one narrow question.
Parameters3
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country_code
string
required
ISO 3166-1 alpha-2 code of the country, e.g. ES.
passport
string
optional
Traveller's passport, ISO alpha-2 — adds the entry rule and how long the person and the vehicle may stay. Only if the user gave it.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 code of the country, e.g. ES."
},
"passport": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "Traveller's passport, ISO alpha-2 — adds the entry rule and how long the person and the vehicle may stay. Only if the user gave it."
}
},
"required": [
"country_code"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_fuel_prices
Current retail fuel prices for all API-supported countries. Covers gasoline, diesel, LPG, CNG, E85, kerosene and grade variants. Pass country_code to get one country in detail; omit it for a summary list. Use it for the price of petrol, diesel, LPG/autogas/propane or CNG in one country; without a country it gives an overview.
Parameters2
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country_code
string
optional
ISO 3166-1 alpha-2 country code, e.g. DE. If omitted, returns all countries.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. DE. If omitted, returns all countries."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
compare_fuel_prices
Compare current prices for one fuel type across 2-10 countries. Returns sorted table cheapest-first. Use it when someone asks which of two or more named countries has cheaper or more expensive fuel.
Parameters3
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country_codes
array
required
Array of 2-10 ISO 3166-1 alpha-2 country codes to compare.
fuel_type
string
optional
Fuel type to compare. e.g. gasoline, diesel, lpg, cng, e85.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country_codes": {
"type": "array",
"items": {
"type": "string",
"minLength": 2,
"maxLength": 2
},
"minItems": 2,
"maxItems": 10,
"description": "Array of 2-10 ISO 3166-1 alpha-2 country codes to compare."
},
"fuel_type": {
"type": "string",
"enum": [
"gasoline_regular",
"gasoline",
"gasoline_premium",
"gasoline_super",
"diesel_regular",
"diesel",
"diesel_premium",
"lpg",
"cng",
"e85",
"kerosene",
"premium"
],
"default": "diesel",
"description": "Fuel type to compare. e.g. gasoline, diesel, lpg, cng, e85."
}
},
"required": [
"country_codes"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
find_cheapest_fuel
Rank countries by the price of a fuel type in a region (or worldwide): the cheapest first, or with order=most_expensive the most expensive first. Useful for route planning. Use it for «where is fuel cheapest» and, with order=most_expensive, «where is fuel the most expensive», in a region or worldwide.
Parameters5
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
region
string
optional
Region to search. Default: world (all countries).
fuel_type
string
optional
Fuel type. e.g. gasoline, diesel, lpg, cng, e85.
limit
integer
optional
How many countries to return.
order
string
optional
cheapest first (default) or most_expensive first — «where is fuel the most expensive».
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"region": {
"type": "string",
"enum": [
"europe",
"asia",
"africa",
"north_america",
"south_america",
"oceania",
"world"
],
"default": "world",
"description": "Region to search. Default: world (all countries)."
},
"fuel_type": {
"type": "string",
"enum": [
"gasoline_regular",
"gasoline",
"gasoline_premium",
"gasoline_super",
"diesel_regular",
"diesel",
"diesel_premium",
"lpg",
"cng",
"e85",
"kerosene",
"premium"
],
"default": "diesel",
"description": "Fuel type. e.g. gasoline, diesel, lpg, cng, e85."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 5,
"description": "How many countries to return."
},
"order": {
"type": "string",
"enum": [
"cheapest",
"most_expensive"
],
"default": "cheapest",
"description": "cheapest first (default) or most_expensive first — «where is fuel the most expensive»."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_country_travel_weather
How suitable the weather in a whole country is for travelling and sleeping in a campervan, as a 0-100 score: overall travel score, sleep score, solar panel yield, driving conditions, awning safety, condensation risk, a 7-day forecast, and the 3 best and 3 toughest cities for the coming week. Country-level: for a named city use get_city_travel_weather. Use it when someone asks what the weather is like in a country, where in a country it is warmer, colder or sunnier, which of its cities are best or worst this week, or whether it is too cold or rainy to sleep in a van there now.
Parameters2
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country_code
string
required
ISO 3166-1 alpha-2 country code, e.g. DE.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. DE."
}
},
"required": [
"country_code"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_city_travel_weather
How suitable the weather in one city or town is for travelling and sleeping in a campervan, as a 0-100 score for today and for the coming 7 days, with sleep, driving and solar scores and daily scores. Use this, not get_country_travel_weather, when the user names a place (Barcelona, Málaga, Alicante). Use it for the weather in one named city, town or place today, tomorrow or this week.
Parameters3
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
city
string
required
City or town name in any language, e.g. Barcelona, Málaga, Alicante.
country_code
string
optional
ISO 3166-1 alpha-2 country code to disambiguate (Barcelona ES vs Barcelona VE).
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"city": {
"type": "string",
"minLength": 2,
"description": "City or town name in any language, e.g. Barcelona, Málaga, Alicante."
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code to disambiguate (Barcelona ES vs Barcelona VE)."
}
},
"required": [
"city"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
list_best_weather_countries
List the N countries where today's weather is best for travelling by campervan, highest 0-100 travel score first. Use it when no country is named and someone asks where to go for warm or good weather right now — worldwide or in a region (region=europe…); with sort=warmest only when they literally ask where it is warmest or hottest (it ranks by temperature alone, so deserts come first; «warm and pleasant», «warm and dry» → the default score). These are today's conditions and the coming days, not a forecast for a later month: for «in November» say so.
Parameters4
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
limit
integer
optional
How many top-scoring countries to return.
region
string
optional
Only countries of this region — «best weather in Europe». Default: world.
sort
string
optional
score = best overall travel weather (default, also for «warm and pleasant»); warmest = highest daytime temperature today — only for a literal «where is it warmest/hottest».
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 10,
"description": "How many top-scoring countries to return."
},
"region": {
"type": "string",
"enum": [
"world",
"europe",
"asia",
"africa",
"north_america",
"south_america",
"oceania"
],
"default": "world",
"description": "Only countries of this region — «best weather in Europe». Default: world."
},
"sort": {
"type": "string",
"enum": [
"score",
"warmest"
],
"default": "score",
"description": "score = best overall travel weather (default, also for «warm and pleasant»); warmest = highest daytime temperature today — only for a literal «where is it warmest/hottest»."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
list_events
List vanlife events: expos (Caravan Salon), festivals, meetups, forums, road trips. Filter by status, type, country, or free-text search.
Parameters6
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
status
string
optional
Event time status.
type
string
optional
Event type filter.
country
string
optional
ISO 3166-1 alpha-2 country code.
search
string
optional
Free-text search in event name.
limit
integer
optional
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"default": "en",
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"status": {
"type": "string",
"enum": [
"upcoming",
"ongoing",
"past",
"all"
],
"default": "upcoming",
"description": "Event time status."
},
"type": {
"type": "string",
"enum": [
"expo",
"festival",
"forum",
"meetup",
"roadtrip"
],
"description": "Event type filter."
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code."
},
"search": {
"type": "string",
"description": "Free-text search in event name."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 15
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_event
Get full details for a single vanlife event by its slug.
Parameters2
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
slug
string
required
Event slug, e.g. caravan-salon-duesseldorf-2026.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"default": "en",
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"slug": {
"type": "string",
"description": "Event slug, e.g. caravan-salon-duesseldorf-2026."
}
},
"required": [
"slug"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
search_stories
Search recent news about campervans, motorhomes and road travel collected by OpenVan.camp from public news sources. Returns for each story only a headline, a short summary of up to 300 characters, date, category, countries and a link to the story page on openvan.camp, which credits the original publishers. Never returns full article text. Filter by words in the headline, category, country and language.
Parameters5
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
search
string
optional
Words to look for in story headlines.
category
string
optional
Story category.
country
string
optional
ISO 3166-1 alpha-2 country code.
limit
integer
optional
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"default": "en",
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"search": {
"type": "string",
"maxLength": 100,
"description": "Words to look for in story headlines."
},
"category": {
"type": "string",
"enum": [
"law",
"ban",
"opening",
"closing",
"incident",
"industry",
"lifestyle",
"builds",
"festival",
"expo",
"review",
"other"
],
"description": "Story category."
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 10
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
compare_food_prices
Compare food price index between two countries (world average = 100). Higher number = more expensive food. Use it when someone asks where food is cheaper between two countries.
Parameters3
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
from
string
required
Home country ISO alpha-2 code.
to
string
required
Destination country ISO alpha-2 code.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"from": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "Home country ISO alpha-2 code."
},
"to": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "Destination country ISO alpha-2 code."
}
},
"required": [
"from",
"to"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_country_food_prices
Food price index for one country (world average = 100): how expensive groceries are there, with its yearly history. Use it when someone asks how expensive food, groceries or living is in a country.
Parameters2
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country_code
string
required
ISO 3166-1 alpha-2 country code.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code."
}
},
"required": [
"country_code"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
rank_food_prices
Rank countries by food price index (world average = 100) in a region or worldwide: the cheapest first, or with order=most_expensive the most expensive first. Use it when someone asks where food or groceries are cheapest or most expensive.
Parameters4
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
region
string
optional
Only countries of this region. Default: world.
order
string
optional
cheapest first (default) or most_expensive first.
limit
integer
optional
How many countries to return.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"region": {
"type": "string",
"enum": [
"world",
"europe",
"asia",
"africa",
"north_america",
"south_america",
"oceania"
],
"default": "world",
"description": "Only countries of this region. Default: world."
},
"order": {
"type": "string",
"enum": [
"cheapest",
"most_expensive"
],
"default": "cheapest",
"description": "cheapest first (default) or most_expensive first."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 10,
"description": "How many countries to return."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_currency_rate
Convert an amount between two currencies using live rates (150+ currencies, daily updates). Use it for exchange rates and converting an amount between currencies.
Parameters4
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
from
string
required
Source currency ISO 4217 code, e.g. EUR.
to
string
required
Target currency ISO 4217 code, e.g. USD.
amount
number
optional
Amount to convert. Default 1.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"from": {
"type": "string",
"minLength": 3,
"maxLength": 3,
"description": "Source currency ISO 4217 code, e.g. EUR."
},
"to": {
"type": "string",
"minLength": 3,
"maxLength": 3,
"description": "Target currency ISO 4217 code, e.g. USD."
},
"amount": {
"type": "number",
"exclusiveMinimum": 0,
"default": 1,
"description": "Amount to convert. Default 1."
}
},
"required": [
"from",
"to"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
check_visa_rules
Entry rules for one passport and destination: entry mode, allowed length of stay, how the days are counted (per entry or in a rolling window), whether a visa run resets the counter, and temporary vehicle import. Answers carry a confidence level and source — pass those on instead of stating a rule as certain.
Parameters5
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
passport
string
required
ISO 3166-1 alpha-2 code of the passport, e.g. RU.
destination
string
required
Destination: ISO alpha-2 code, slug or zone code, e.g. TR.
weight
string
optional
Vehicle weight class for the vehicle rule: le35 (<=3.5 t) or gt35.
plate
string
optional
Plate origin for the green card rule.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"passport": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 code of the passport, e.g. RU."
},
"destination": {
"type": "string",
"description": "Destination: ISO alpha-2 code, slug or zone code, e.g. TR."
},
"weight": {
"type": "string",
"enum": [
"le35",
"gt35"
],
"description": "Vehicle weight class for the vehicle rule: le35 (<=3.5 t) or gt35."
},
"plate": {
"type": "string",
"enum": [
"eu",
"non_eu",
"eaeu",
"third"
],
"description": "Plate origin for the green card rule."
}
},
"required": [
"passport",
"destination"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_route_visa_rules
Visa rules for every country of a route in one call, for up to 10 passports at once, plus the tightest leg of the route.
Parameters4
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
countries
string
required
Countries in travel order, comma separated ISO alpha-2 codes or slugs, up to 12, e.g. RU,GE,TR.
passports
string
optional
Passports to answer for, comma separated, up to 10, e.g. RU,BY.
weight
string
optional
Vehicle weight class for the vehicle rules.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"countries": {
"type": "string",
"description": "Countries in travel order, comma separated ISO alpha-2 codes or slugs, up to 12, e.g. RU,GE,TR."
},
"passports": {
"type": "string",
"description": "Passports to answer for, comma separated, up to 10, e.g. RU,BY."
},
"weight": {
"type": "string",
"enum": [
"le35",
"gt35"
],
"description": "Vehicle weight class for the vehicle rules."
}
},
"required": [
"countries"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_vehicle_import_rules
Temporary admission rules for a foreign-plated vehicle in one country: allowed days, per entry or per window, carnet requirement, green card. A country without a rule we can stand behind returns nothing rather than a guess.
Parameters2
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country
string
required
Country: ISO alpha-2 code, slug or zone code, e.g. georgia or GE.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country": {
"type": "string",
"description": "Country: ISO alpha-2 code, slug or zone code, e.g. georgia or GE."
}
},
"required": [
"country"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_toll_rates
Toll reference for one country: payment system, per-km rates by vehicle class (car, campervan up to 3.5 t, over 3.5 t), vignette prices for every duration, concession sections and toll bridges/tunnels, each with verification date and source. Use it for toll roads, motorway fees, whether a vignette is needed and what it costs in one country.
Parameters2
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country_code
string
required
ISO 3166-1 alpha-2 country code, e.g. FR.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. FR."
}
},
"required": [
"country_code"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
estimate_route_tolls
Estimate toll cost for a road trip from 2-10 place names: per-km tolls, vignettes, bridges and tunnels, as a EUR range with a per-country breakdown. Flags partial results when a country on the route has no data. Use it only for the toll cost between named places when no other trip details are asked; for a whole trip use plan_road_trip.
Parameters3
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
waypoints
array
required
2-10 place names in travel order: cities or countries (a country means its capital), e.g. ["Rome", "Paris"].
vehicle_class
string
optional
car; van = campervan/motorhome up to 3.5 t (default); heavy = over 3.5 t.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"waypoints": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"minItems": 2,
"maxItems": 10,
"description": "2-10 place names in travel order: cities or countries (a country means its capital), e.g. [\"Rome\", \"Paris\"]."
},
"vehicle_class": {
"type": "string",
"enum": [
"car",
"van",
"heavy"
],
"default": "van",
"description": "car; van = campervan/motorhome up to 3.5 t (default); heavy = over 3.5 t."
}
},
"required": [
"waypoints"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_holidays
Public holidays, school holidays (often regional, with ISO 3166-2 region codes) and official peak traffic days (France, Bison Futé) in one country for a period of up to 400 days. A country without data returns an error saying so — never present that as "no holidays". Use it for public holidays, days off, school holidays and peak traffic days.
Parameters5
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country_code
string
required
ISO 3166-1 alpha-2 country code, e.g. FR.
from
string
optional
Start of the period, YYYY-MM-DD. Defaults to today.
to
any
optional
End of the period, YYYY-MM-DD. Defaults to from + 90 days; at most 400 days after from.
kind
string
optional
Only one kind: public holidays, school holidays (often regional), or traffic = official peak traffic days — France only (Bison Futé). For «when are the roads busy» elsewhere omit it: public and school holidays are the busy days. Omit for all.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. FR."
},
"from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start of the period, YYYY-MM-DD. Defaults to today."
},
"to": {
"$ref": "#/properties/from",
"description": "End of the period, YYYY-MM-DD. Defaults to from + 90 days; at most 400 days after from."
},
"kind": {
"type": "string",
"enum": [
"public",
"school",
"traffic"
],
"description": "Only one kind: public holidays, school holidays (often regional), or traffic = official peak traffic days — France only (Bison Futé). For «when are the roads busy» elsewhere omit it: public and school holidays are the busy days. Omit for all."
}
},
"required": [
"country_code"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_travel_hazards
Situation now in one country: UK FCDO travel advice level and current GDACS natural disasters (flood, earthquake, tropical cyclone, wildfire, drought, volcano) with alert level green/orange/red. Not a forecast. Use it when someone asks whether it is safe to go to a country now, about travel warnings or natural disasters.
Parameters2
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country_code
string
required
ISO 3166-1 alpha-2 country code, e.g. TR.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. TR."
}
},
"required": [
"country_code"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_active_fires
NASA FIRMS VIIRS satellite fire detections of the last 48 hours in a bounding box up to 10°×10°, strongest first, with fire radiative power in MW. Use it for wildfires right now near a place or in a country: bbox is west,south,east,north in degrees — longitude first (Portugal ≈ -9.6,36.9,-6.1,42.2).
Parameters2
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
bbox
string
required
Bounding box west,south,east,north in degrees, at most 10° on each side, e.g. 29,36,33,38 (around Antalya).
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"bbox": {
"type": "string",
"pattern": "^-?\\d+(\\.\\d+)?(,-?\\d+(\\.\\d+)?){3}$",
"description": "Bounding box west,south,east,north in degrees, at most 10° on each side, e.g. 29,36,33,38 (around Antalya)."
}
},
"required": [
"bbox"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_power_plugs
Plug types (IEC A–N), mains voltage and frequency for one country, with the source of the value, plus the campsite hook-up connector in Europe (CEE17). Use it for socket and plug types, adapters, mains voltage and campsite hook-ups.
Parameters2
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country_code
string
required
ISO 3166-1 alpha-2 country code, e.g. GB.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. GB."
}
},
"required": [
"country_code"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_customs_rules
Customs rules when driving into a country, optionally from a given country: food bans, cash declaration, alcohol and tobacco limits, goods value, fuel in a canister. Each rule carries a verbatim official quote and source link. A country without data returns an error saying so — never present that as "nothing is restricted". Use it for what you may bring in by car: alcohol, tobacco, cash, meat and other food, goods limits.
Parameters3
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country_code
string
required
ISO 3166-1 alpha-2 code of the country you enter, e.g. PL.
from
string
optional
ISO 3166-1 alpha-2 code of the country you come from, e.g. UA. Matters: no customs inside the EU, and some bans have exemptions by origin.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 code of the country you enter, e.g. PL."
},
"from": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 code of the country you come from, e.g. UA. Matters: no customs inside the EU, and some bans have exemptions by origin."
}
},
"required": [
"country_code"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
list_license_plate_countries
Countries whose license plates are available: international code, number of regions and an example plate.
Parameters1
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"es",
"fr",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_license_plate_country
How a country's license plate looks and reads (standard, size, format), its plate types (standard, diplomatic, police, taxi…) with example numbers, and every region code on its plates, grouped by region — e.g. which region is 77 or 199 on Russian plates. Use it for what a plate region code means (77, 777, AA…) and a country's plate format.
Parameters2
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country
string
required
ISO 3166-1 alpha-2 country code, e.g. RU.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"es",
"fr",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. RU."
}
},
"required": [
"country"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
check_license_plate
Validate a plate number against the country's format (look-alike letters are normalized) and say which region its code belongs to. Pass type to check against a specific plate type's format. Never identifies the owner or the vehicle's location. Use it to check a specific plate number.
Parameters5
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country
string
required
ISO 3166-1 alpha-2 country code, e.g. RU.
number
string
required
Plate number without the region, e.g. A123BC. Look-alike Latin letters are normalized.
region
string
optional
Region code if the country shows one, e.g. 77.
type
string
optional
Plate type key from get_license_plate_country, e.g. on Russian plates diplomatic (red), police (blue), military (black), taxi_bus (yellow). Default: the country's standard plate.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"es",
"fr",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. RU."
},
"number": {
"type": "string",
"description": "Plate number without the region, e.g. A123BC. Look-alike Latin letters are normalized."
},
"region": {
"type": "string",
"description": "Region code if the country shows one, e.g. 77."
},
"type": {
"type": "string",
"description": "Plate type key from get_license_plate_country, e.g. on Russian plates diplomatic (red), police (blue), military (black), taxi_bus (yellow). Default: the country's standard plate."
}
},
"required": [
"country",
"number"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_license_plate_image
Draw an illustrative image of a country's standard civilian license plate (PNG shown inline, plus SVG/PNG links). The number must match the country's standard format. Official, police, military and diplomatic plates are not drawn. Use it to draw or show a picture of a plate.
Parameters4
locale
string
optional
Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language.
country
string
required
ISO 3166-1 alpha-2 country code, e.g. RU.
number
string
required
Plate number without the region, in the country's standard format.
region
string
optional
Region code if the country shows one.
Raw schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"ru",
"de",
"fr",
"es",
"pt",
"tr"
],
"description": "Language the user writes in (en, ru, de, fr, es, pt, tr). Set it on every call: the answer and the interactive card are shown in this language and units; without it the card falls back to the app's interface language."
},
"country": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "ISO 3166-1 alpha-2 country code, e.g. RU."
},
"number": {
"type": "string",
"description": "Plate number without the region, in the country's standard format."
},
"region": {
"type": "string",
"description": "Region code if the country shows one."
}
},
"required": [
"country",
"number"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
OpenVan.camp — free road-trip data API for every country
Free, no-auth API for vanlife data: fuel prices, route fuel cost, toll roads, holidays and peak traffic days, travel hazards, power plugs, customs rules, currency rates, food cost index, weather suitability scores, visa and vehicle-import rules, vanlife events, news stories, and license plates of the world — all in one place, no registration required.
Base URL:https://openvan.camp Auth: None required CORS: Enabled License: data is CC BY 4.0; code in this repository (SDK, MCP server, examples) is MITAttribution required: show Data: <a href="https://openvan.camp/">OpenVan.camp</a> wherever you display the data — see Attribution
Python SDK:openvan — pip install openvan. No dependencies, Python 3.9+, works with pandas. Python docs →
Daily CSV snapshots:openvancamp/openvan-travel-data — fuel prices, exchange rates, food cost index and weather scores as CSV/JSON, one commit a day, with history.
MCP Server (for AI agents):mcp-server/ — 29 read-only tools with interactive cards in Claude and ChatGPT (incl. plan_road_trip — a whole-trip roadbook), hosted at https://mcp.openvan.camp/mcp, or locally npx -y @openvancamp/mcp-server for Claude Desktop / Cursor / Windsurf. Install docs → · AI agents guide →
Gemini CLI extension: install this repository with gemini extensions install https://github.com/openvancamp/openvan-camp-public-api. The root gemini-extension.json connects Gemini CLI directly to the hosted OpenVan.camp MCP server; no API key is required.
The OpenAPI spec at /docs.openapi is generated from the live codebase and is the authoritative contract. Numbers in this README (country counts, story totals) are approximate and updated periodically — check /api/fuel/prices meta or /api/stories pagination for current totals.
Endpoints
Endpoint
Description
Coverage
GET /api/fuel/prices
Retail fuel prices (gasoline, diesel, LPG, E85)
160+ countries
POST /api/route-cost
Fuel cost for a route of 2–10 waypoints, per-country prices
—
POST /api/roadbook/from-places
Whole-trip roadbook from 2–10 place names: day-by-day plan, budget, per-country entry and vehicle rules; returns a shareable page
—
GET /api/roadbook/{code}/status
Build status of a roadbook (poll until ready)
—
GET /api/tolls/countries
Toll roads by country: payment system, per-km rates by vehicle class, vignettes
84 countries
GET /api/tolls/route
Toll cost for a route of 2–10 place names (car, van, heavy), EUR range
—
GET /api/holidays/countries/{code}?from=&to=
Public holidays, school holidays (regional) and peak traffic days
212 countries
GET /api/hazards/countries/{code}
UK FCDO travel advice level and current GDACS natural disasters
—
GET /api/hazards/fires?bbox=
NASA FIRMS active fires of the last 48 hours in a bounding box (up to 10°×10°)
worldwide
GET /api/electricity/countries/{code}
Plug types, mains voltage and frequency, campsite hook-up (CEE17)
229 countries
GET /api/customs/countries/{code}?from=
Customs rules on entry by car: food, cash, alcohol, tobacco, fuel canister
—
GET /api/currency/rates
Exchange rates relative to EUR
150+ currencies
GET /api/vanbasket/countries
Food price index relative to world average (100 = world avg)
90+ countries
GET /api/vanbasket/compare?from=DE&to=TR
Compare food costs between two countries
—
GET /api/vanbasket/countries/{code}
Single country + historical snapshots
—
GET /api/vansky/weather
Vanlife weather suitability scores (0–100) with 7-day forecast
160+ countries
GET /api/vansky/weather/{code}
One country, with marine and solar data
—
GET /api/vansky/weather/{code}/{city}
One city: score today and for the coming 7 days
—
GET /api/visa/check?passport=RU&destination=TR
Entry rules: entry mode, length of stay, how days are counted, vehicle import
Relative cost of a food basket compared to world average (World = 100).
Based on World Bank ICP 2021 data, adjusted with IMF CPI. Data source: CC BY 4.0
bash
# All countries
curl https://openvan.camp/api/vanbasket/countries
# Compare two countries
curl "https://openvan.camp/api/vanbasket/compare?from=DE&to=TR"# Single country with historical snapshots
curl https://openvan.camp/api/vanbasket/countries/DE
json
{"success":true,"data":{"CH":{"country_code":"CH","country_name":"Switzerland","vanbasket_index":162.3,"pct_vs_world":62.3},"DE":{"country_code":"DE","country_name":"Germany","vanbasket_index":118.7,"pct_vs_world":18.7},"TR":{"country_code":"TR","country_name":"Turkey","vanbasket_index":82.4,"pct_vs_world":-17.6},"GE":{"country_code":"GE","country_name":"Georgia","vanbasket_index":64.1,"pct_vs_world":-35.9}},"meta":{"total_countries":92,"world_avg":100,"base_year":2021,"source":"World Bank ICP 2021","license":"CC BY 4.0"}}
budget_100: if you spend €100 on food in the from country, you'd spend €69 in the to country.
Events — /api/events
Vanlife events: exhibitions, festivals, meetups, road trips. Updated in real time.
Query params:
Param
Values
Default
locale
enrudefrespttr
en
status
upcomingongoingpastall
upcoming
type
expofestivalforummeetuproadtrip
—
country
ISO 3166-1 alpha-2
—
search
text
—
page
integer
1
limit
integer (max 100)
30
bash
# Upcoming events in Germany
curl "https://openvan.camp/api/events?country=DE&status=upcoming&locale=en"# Event details
curl "https://openvan.camp/api/event/fit-camper-2026?locale=en"# Source articles linked to an event
curl "https://openvan.camp/api/event/fit-camper-2026/articles?locale=en"
json
{"events":[{"id":493,"slug":"fit-camper-2026","event_name":"Fit Your Camper","event_type":"expo","event_type_label":"Exhibition","start_date":"2026-04-09","end_date":"2026-04-12","city":"Bologna","country_code":"IT","country":{"code":"it","name":"Italy","flag_emoji":"🇮🇹"},"venue_name":"BolognaFiere","status":"upcoming","articles_count":7,"url":"https://openvan.camp/en/event/fit-camper-2026"}],"pagination":{"total":48,"page":1,"limit":30,"pages":2}}
Notes:
Unknown or missing locale silently falls back to en
/api/event/{slug}/articles returns source articles filtered by locale; if none match, all articles are returned (may be in the original publisher language)
Stories / News — /api/stories
Vanlife news stories aggregated from 200+ publishers and translated into 7 languages. Each story clusters multiple source articles covering the same topic.
# Latest stories in English
curl "https://openvan.camp/api/stories?locale=en"# German vanlife news in Germany
curl "https://openvan.camp/api/stories?locale=de&country=DE"# Full story with all source links
curl "https://openvan.camp/api/story/free-overnight-parking-netherlands?locale=en"
json
{"slug":"free-overnight-parking-netherlands","title":"Free Overnight Parking for Motorhomes in the Netherlands","summary":"The Dutch motorhome community is pushing for more designated free overnight spots...","image_url":"https://...","category":{"slug":"travel","name":"Travel"},"countries":[{"code":"nl","name":"Netherlands","flag_emoji":"🇳🇱"}],"first_published_at":"2026-04-01T10:00:00+00:00","last_updated_at":"2026-04-03T08:00:00+00:00","articles_count":5,"url":"https://openvan.camp/en/news/travel/free-overnight-parking-netherlands","sources":[{"title":"Gratis overnachten in je camper: de beste plekken","original_url":"https://www.campermagazine.nl/overnachten/gratis-plaatsen","source_name":"CamperMagazine.nl","published_at":"2026-04-01T10:00:00+00:00","language":"nl","image_url":"https://..."}]}
Notes:
title and summary are translated to the requested locale
sources[].language is always the original publisher language, regardless of locale
sources[].original_url is the direct link to the publisher article
License Plates — /api/plates/*
License plates of the world: plate formats, every region code grouped by region (with ISO 3166-2 units),
validation, and the plate itself as an image. Images are drawn by the same engine as
openvan.camp/en/license-plates — the plate typeface is inside
as vector outlines, so there are no fonts to install.
Look-alike Latin letters are normalized (A123BC → А123ВС on Russian plates)
A number outside the country format returns 422; add custom=1 to draw any text (e.g. a name)
Images are served Cache-Control: public, max-age=31536000, immutable; image URLs returned by the API
carry v=<engine version>, so an engine update arrives under a new URL
bash
curl https://openvan.camp/api/plates # countries
curl "https://openvan.camp/api/plates/ru?locale=en"# format, regions, codes, engine
curl "https://openvan.camp/api/plates/ru/validate?number=A123BC®ion=799"# valid? which region?
curl https://openvan.camp/api/plates/ru/random # random plate + image URLs
Plate types — special plates have their own colour and number format. GET /api/plates/{code}/types
lists them (on Russian plates: private, diplomatic red, police blue, military black, taxi_bus yellow,
motorcycle, trailer, tractor, export_transit), each with an example number. Pass type to the image,
/random and /validate; the response says which type was used:
bash
curl "https://openvan.camp/api/plates/ru/random?type=police"# a valid blue police plate + image URLs
curl "https://openvan.camp/api/plates/ru/validate?number=У7962®ion=790&type=police"
html
<imgsrc="https://openvan.camp/api/plates/ru/plate.svg?number=190Т307®ion=23&type=diplomatic"alt="190 Т 307 23">
To draw plates in the browser yourself (e.g. an interactive generator), load the scripts listed in
data.engine.scripts of /api/plates/{code} in order and call
Plates.render(code, number, region) → {svg} (an SVG element) or {error}.
Images and the engine are available for countries whose plate typeface may be redistributed
(glyphs_license: free or sharealike); for the rest the data endpoints still work.
Rate limit: 60 requests/minute for images and /random, 120 for the rest.
Roadbook — /api/roadbook/from-places
A whole trip plan — the same roadbook people build in the wizard: route, driving days and overnights, budget (fuel, tolls, vignettes, ferries), and for every country on the way the entry and vehicle rules for the given passports and plates, holidays, safety and power. Identical requests return the same roadbook.
bash
# 1. Create (all inputs are optional)
curl -X POST "https://openvan.camp/api/roadbook/from-places?source=your-app" \
-H "Content-Type: application/json" \
-d '{"places":["Munich","Venice"],"locale":"en","inputs":{"travelers":["DE"],"cons":10,"fuel":"diesel"}}'# → {"code":"wqhk8","url":"/en/roadbook/wqhk8-munich-venice","status":"pending","points":[...]}# 2. Poll until "ready" (long routes take up to a minute), then open https://openvan.camp + url
curl https://openvan.camp/api/roadbook/wqhk8/status
10 roadbooks per minute per IP. The MCP tool plan_road_trip does all of this and returns the plan itself.
Holidays, Hazards, Power Plugs, Customs
Trip-planning data for a country you are about to drive into. Every list endpoint has a
/countries index; pass locale for translated names.
bash
# Public, school (with ISO 3166-2 regions) and peak traffic days; kind=public|school|traffic
curl "https://openvan.camp/api/holidays/countries/FR?from=2026-10-01&to=2026-11-15"# FCDO travel advice level + current GDACS disasters (flood, earthquake, cyclone, wildfire…)
curl https://openvan.camp/api/hazards/countries/TR
# NASA FIRMS fire detections of the last 48 h; bbox = minLon,minLat,maxLon,maxLat, up to 10°×10°
curl "https://openvan.camp/api/hazards/fires?bbox=-1,38,1,40"# Plug types, voltage, frequency, campsite hook-up connector
curl https://openvan.camp/api/electricity/countries/GB
# Customs rules on entry by car, optionally from a given country; each rule quotes the official source
curl "https://openvan.camp/api/customs/countries/NO?from=DE"
A country without holiday or customs data returns an error that says so — it does not mean
"no holidays" or "nothing is restricted"
Hazards describe the situation now, not a forecast; fire data for a new area may return
"being loaded, retry in a minute" on the first request
"_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. ..."}
Errors:
json
{"success":false,"error":"Description of the error."}
If you call without Accept: application/json, some error responses may return HTML. Always send the header:
code
Accept: application/json
Rate Limiting
120 requests per minute per IP. Please be responsible:
Cache fuel prices for at least 6 hours
Cache currency rates for at least 1 hour
Cache stories/events for at least 15 minutes
Attribution
Attribution is required by the CC BY 4.0 license. Wherever you show the data — website, app, bot, dashboard, article — place a visible link next to it:
html
Data: <ahref="https://openvan.camp/">OpenVan.camp</a> (CC BY 4.0)
The same snippet comes in every response as _attribution.attribution_html, and in the X-Attribution-Required response header.
Building with an AI coding agent? Tell it to keep this link in the UI it generates — or just let it read _attribution.instructions from any response.
Identify your integration
Pass ?source=yoursite.com with any request — no registration needed. Your value is echoed back as _attribution.your_source so you can verify it's working:
{"success":true,"data":{"..."},"meta":{"..."},"_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. ...","your_source":"myapp.com"}}
This helps us understand how the data is being used and acknowledge active projects.