OpenVan.camp Public API

Free fuel price API and open travel data for road trips: toll roads, visas, license plates, holidays, travel hazards, power plugs, customs, currency rates, events and news. No API key, no registration — use it in apps, bots and articles under CC BY 4.0.

No API Key

Call any endpoint directly — no registration, no auth header

100% Free

Fuel prices in 175 countries · CC BY 4.0 license

CORS Enabled

Works from browser, no server-side proxy needed

Built with OpenVan.camp

Vanlife apps, fuel trackers, trip planners and EV tools across a dozen countries already run on our open data.

279
apps & websites
14 400+
API requests / month
4
AI engines read the data
6
open datasets

Who already uses it

A hand-picked sample — fuel apps, trip planners, EV and fleet dashboards.

Read by AI search engines
ChatGPT Perplexity Claude Gemini

We see ChatGPT, Perplexity, Claude and Gemini fetching OpenVan.camp data — your integration's data can surface in their answers too.

Using our API?

Add ?source=your-domain to your calls — and you'll appear in this showcase.

CC BY 4.0 License — You are free to use, share and adapt this data in any medium or format, as long as you give appropriate credit to OpenVan.camp. creativecommons.org →
For AI Agents & LLM Tools
  • No API key. Call any endpoint directly — no registration, no auth header.
  • CORS enabled. Endpoints can be called from the browser directly.
  • Response format: most endpoints return { "success": true, "data": {...} }. Exceptions: currency rates use rates; weather has data without success; tolls for a route, roadbook, holidays, customs and a single story return an object without the envelope. Errors and "no data" are under Limits, errors and versions.
  • Caching: fuel prices are cached for 6 h · currency rates refresh every 6 h · HTTP response cache is 2 minutes (Cache-Control) · please poll no more than once every 10 minutes
  • Full OpenAPI 3.0 spec: /docs.openapi (YAML) · /.well-known/openapi.json (JSON) · GitHub examples
  • Discovery files: /llms.txt · /.well-known/openapi.json · /.well-known/api-catalog · /.well-known/agent-card.json · /.well-known/mcp/server-card.json · /.well-known/ai-plugin.json
  • Attribution: add ?source=your-app.com to identify your integration — no auth required, just good practice.

Recommended prompting pattern: "Get current fuel prices for [country] in [currency] using the OpenVan.camp API at https://openvan.camp/api/fuel/prices"

AI assistants and MCP server

The same data is available as 32 public MCP tools (server version 0.12.0, plus the internal get_roadbook_build_status used by the trip card) with interactive cards. Connect them to any MCP-capable assistant or open a ready-made app.

Remote server — Streamable HTTP, no key:

https://mcp.openvan.camp/mcp

Locally via npx — for Claude Desktop, Cursor, Windsurf and other MCP clients:

{
  "mcpServers": {
    "openvan": {
      "command": "npx",
      "args": ["-y", "@openvancamp/mcp-server"]
    }
  }
}

Plugin for Claude Code and Codex: this MCP server plus two skills, instructions your AI agent loads when it needs them. To install it, run:

# Claude Code
/plugin install openvan-camp --marketplace openvancamp/openvan-camp-public-api

# Codex
codex plugin marketplace add openvancamp/openvan-camp-public-api

# Skills only (any agent)
npx skills add openvancamp/openvan-camp-public-api

The openvan-travel skill tells the agent which of the server's tools to use for a trip question, such as visas, fuel or routes. The openvan-api skill applies when the agent builds an application on data from our API. With this skill, the agent puts a link to OpenVan.camp next to the data, as the licence requires. It also adds the source parameter to requests and takes the price unit and currency separately for each fuel type. skills/

Ready-made apps

MCP tools (32)
  • plan_road_trip — 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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 the city's place among the cities of its country this week, comfortable days, the best stretch and the worst day, a 7-day forecast with day and night temperature and rain, today's score breakdown (thermal, sunshine, precipitation, wind), sleep, driving and solar scores and ready-made advice. 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.
  • get_city_climate — What the weather is usually like in a city or at any point on a given day of the year, from the ERA5 climate archive 2021–2025 (median of 35 archive days: the date ±3 days over five years): day and night temperature, on how many of the 35 days there was precipitation, the usual sky, sea or large-lake water temperature, solar radiation for panels and the VanSky climate index; plus all 12 months and the best month to travel. Climate, not a forecast. Use it for dates beyond the coming week ("weather in Batumi in mid-September", "is the sea warm in Antalya in May") and for "when is the best time to go"; for today and this week use get_city_travel_weather. Omit date to get the month overview.
  • list_best_weather_countries — List the N countries where the weather is best for travelling by campervan, highest 0-100 travel score first: today's score by default, or with period=week the score of the coming 7 days (the ranking used on OpenVan.camp). 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.
  • list_events — List vanlife events: expos (Caravan Salon), festivals, meetups, forums, road trips. Filter by status, type, country, or free-text search.
  • get_event — Get full details for a single vanlife event by its slug.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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.
  • 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).
  • 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.
  • find_ferries — Ferry and river crossing lines in a bounding box from OpenStreetMap: name, operator, countries, whether cars are carried, crossing time, the operator site checked by hand and a booking link where confirmed, and whether an open timetable exists. bbox is west,south,east,north in degrees — longitude first (Adriatic ≈ 12,39,20,46). Narrow with query (port or operator) or country_code. Use it for which ferries go to an island or across a sea, strait or river, and to get the id for get_ferry_schedule.
  • get_ferry_schedule — One ferry line by id from find_ferries: both ends with country, operator site and booking link, and a timetable digest from open GTFS feeds — next departures today in local time, sailings per day, daytime and night rhythm, weekdays over the next 8 days, crossing time. available: false means no open timetable is matched, not that the ferry does not run. Use it for when the next ferry leaves, how often it runs and how long the crossing takes.
  • 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.
  • list_license_plate_countries — Countries whose license plates are available: international code, number of regions and an example plate.
  • 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.
  • 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.
  • 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.

Server card: /.well-known/mcp/server-card.json · npm: @openvancamp/mcp-server
The npm package can lag a few versions behind the remote server; the remote URL is always the latest.

Available Endpoints

GET /api/fuel/prices 175 countries

Current retail fuel prices for 175 countries. The price key list is generated from the live API contract. Updated weekly from official government sources (EU Oil Bulletin, Statistics Norway, EIA, ANP, NRCan and others). Cached 6 hours. Fuel data last updated: 31 October 2026.

Price keys: gasoline_regular, gasoline, gasoline_premium, gasoline_super, diesel_regular, diesel, diesel_premium, lpg, cng, e85, kerosene, premium
Unit and currency are per fuel grade: units[grade] and currencies[grade] win over the country-level unit and currency. For example, Colombia prices per gallon, and petrol in Venezuela is in bolívars.

curl https://openvan.camp/api/fuel/prices

Example response:

{
    "success": true,
    "data": {
        "DE": {
            "country_code": "DE",
            "country_name": "Germany",
            "region": "europe",
            "currency": "EUR",
            "local_currency": "EUR",
            "unit": "liter",
            "units": {
                "diesel": "liter",
                "diesel_premium": "liter",
                "gasoline": "liter",
                "gasoline_premium": "liter",
                "lpg": "liter",
                "premium": "liter"
            },
            "currencies": {
                "diesel": "EUR",
                "diesel_premium": "EUR",
                "gasoline": "EUR",
                "gasoline_premium": "EUR",
                "lpg": "EUR",
                "premium": "EUR"
            },
            "prices": {
                "gasoline_regular": null,
                "gasoline": 2.1144,
                "gasoline_premium": 2.21,
                "gasoline_super": null,
                "diesel_regular": null,
                "diesel": 2.2683,
                "diesel_premium": 2.4693,
                "lpg": 1.1586,
                "cng": null,
                "e85": null,
                "kerosene": null,
                "premium": 2.21
            },
            "price_changes": {
                "gasoline_regular": null,
                "gasoline": -0.0281,
                "gasoline_premium": -0.03,
                "gasoline_super": null,
                "diesel_regular": null,
                "diesel": 0.0006,
                "diesel_premium": 0.0003,
                "lpg": 0.0636,
                "cng": null,
                "e85": null,
                "kerosene": null,
                "premium": null
            },
            "fetched_at": "2026-10-31T11:35:40+03:00",
            "sources": [
                "EU Weekly Oil Bulletin",
                "clever-tanken.de (Premium Diesel)",
                "Tankerkoenig (tankerkoenig.de)",
                "Fuelo.net",
                "Cargopedia.net",
                "BenzinpreisAktuell.de"
            ],
            "sources_count": 4,
            "is_excluded": false
        }
    },
    "meta": {
        "total_countries": 175,
        "updated_at": "2026-10-31 11:35:40",
        "cache_ttl_hours": 6
    }
}
GET /api/currency/rates 150+ currencies

Rates for 150+ currencies relative to EUR (EUR = 1) from several open sources with automatic failover. Refreshed every 6 hours: the refresh time is in meta.updated_at, and a rate older than 25 hours counts as stale.

curl https://openvan.camp/api/currency/rates

Live API response (a few of 152 currencies shown):

{
    "success": true,
    "rates": {
        "EUR": 1,
        "GBP": 0.83368921,
        "GEL": 2.9116,
        "KZT": 506.32837729,
        "RUB": 89.6603,
        "TRY": 55.8153,
        "USD": 1.11619968,
        "…": "…"
    },
    "meta": {
        "count": 152,
        "base": "EUR",
        "updated_at": "2026-10-31T18:05:17+03:00",
        "refreshed_every_hours": 6,
        "max_age_seconds": 90000
    }
}
GET /api/vanbasket/countries 90+ countries

VanBasket Food Price Index — how expensive food is relative to world average (World = 100). Based on World Bank ICP 2021, adjusted with IMF CPI.

# 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 history
curl https://openvan.camp/api/vanbasket/countries/DE
GET /api/visa/check 39,601 pairs

Visa and border rules: how long you may stay for any passport × destination pair, how the days are counted (per entry or a rolling window), whether a visa run resets the counter — plus temporary vehicle import rules. Every answer carries its confidence, its source and the layer it came from.

# One pair: stay rule, entry mode, shared-counter zone, vehicle rule
curl "https://openvan.camp/api/visa/check?passport=RU&destination=TR"

# All 199 destinations for one passport
curl "https://openvan.camp/api/visa/passport/DE?mode=visa_free"

# Several countries and passports at once: the tightest leg of a route
curl "https://openvan.camp/api/visa/route?t=GE,AM,TR&p=RU,DE"

# Compact payload for colouring a world map
curl https://openvan.camp/api/visa/map/US

# Temporary vehicle import rules (country slug, e.g. georgia)
curl https://openvan.camp/api/visa/vehicle/georgia

# Passport ranking and the change log
curl "https://openvan.camp/api/visa/rank?limit=10"
curl "https://openvan.camp/api/visa/history?subject_key=RU%3ETR"
confidence: low means the number of days is right but the counting window is an assumption — verify at the border. Reference data, not legal advice.
Parameters: passport destination weight plate mode locale limit Full documentation
GET /api/plates License plates

License plates of the world: format, region codes and a ready plate image. SVG/PNG are drawn by the same engine as on the site — the plate typeface is inside as outlines, nothing to install: just put the plate into an <img src>. Plus validation with letter normalization, random plates and a browser engine to draw plates yourself.

3554 RDZ — Spain
Spain
SO·51 — Switzerland
Switzerland
XRX-3298 TX — United States
United States
EQ-810-XL 971 — France
France
SX 70785 — Norway
Norway
# Ready plate image — put it into <img src> (PNG: plate.png?width=800)
curl "https://openvan.camp/api/plates/ru/plate.svg?number=A123BC&region=77"

# Countries, then one country: format, regions, codes, browser engine
curl https://openvan.camp/api/plates
curl "https://openvan.camp/api/plates/ru?locale=en"

# Validate a number and resolve its region; random plate
curl "https://openvan.camp/api/plates/ru/validate?number=A123BC&region=799"
curl https://openvan.camp/api/plates/ru/random
Parameters: number region width locale Plate generator on the site Full documentation
GET /api/tolls Route costs

Toll roads by country — per-km rates for a car, a campervan up to 3.5 t and heavier vehicles, vignettes, toll bridges and tunnels, each with a verification date and source — and the cost of a whole route from place names: tolls as a EUR range and fuel at the prices of every country on the way.

# Tolls for a route of 2–10 place names: car | van (up to 3.5 t, default) | heavy
curl "https://openvan.camp/api/tolls/route?waypoints=Munich|Venice&vehicle_class=van"

# Toll reference: all countries, then one country with vignettes, bridges and tunnels
curl https://openvan.camp/api/tolls/countries
curl https://openvan.camp/api/tolls/countries/FR

# Fuel cost for the same kind of route, at the prices of every country on the way
curl -X POST https://openvan.camp/api/route-cost \
  -H "Content-Type: application/json" \
  -d '{"waypoints":["Berlin","Prague"],"cons":10,"fuel":"diesel"}'
partial: true means some fees are missing: countries in unknown_countries have no data — that does not make them free.
Parameters: waypoints vehicle_class cons tank fuel currency locale See it in the Roadbook Full documentation
POST /api/roadbook/from-places Whole trip

The OpenVan.camp roadbook from 2–10 place names — the same plan people build in the roadbook wizard: driving days and overnights, budget for fuel, tolls, vignettes and ferries, and for every country on the way the entry and vehicle rules for the given passports and plates, holidays, safety and power. The answer is a shareable roadbook page; identical requests return the same roadbook.

# Roadbook for 2–10 place names: places and locale are required, everything else goes into "inputs"
curl -X POST https://openvan.camp/api/roadbook/from-places \
  -H "Content-Type: application/json" \
  -d '{"places":["Munich","Venice"],"locale":"en","inputs":{"travelers":["DE"],"plates":"DE","cons":10,"fuel":"diesel"}}'
# → { "code": "wqhk8", "status": "building", "url": "/en/roadbook/wqhk8-munich-venice", ... }

# While status is not "ready", poll it (returns only status and progress)
curl https://openvan.camp/api/roadbook/wqhk8/status
# → { "status": "ready", "error": null, "progress": ... }  then open https://openvan.camp + url
places and locale are required; every other parameter goes inside inputs. The create response already has code, status and url (a relative roadbook URL); until status is ready, poll /api/roadbook/{code}/status — it returns only status and progress. A long route takes up to a minute. 10 roadbooks per minute per IP.
Parameters: places locale name travelers plates weight fuel cons date currency See it in the Roadbook Full documentation
GET /api/holidays/countries/{code} Holidays

Public holidays, school holidays (often regional, with ISO 3166-2 codes) and official peak traffic days for a period of up to 400 days — to know when roads, campsites and ferries fill up.

# School holidays in Germany in December (kind = public | school | traffic)
curl "https://openvan.camp/api/holidays/countries/DE?from=2026-12-01&to=2026-12-31&kind=school"

# Countries and the kinds of data each has
curl https://openvan.camp/api/holidays/countries
With no data the answer is 404 with covered: false. That means "we don't know", not "no holidays" or "nothing is restricted".
Parameters: from to kind locale See it in the Roadbook Full documentation
GET /api/hazards/countries/{code} Hazards

The situation in a country now: UK FCDO travel advice level and current GDACS natural disasters with an alert level, plus NASA FIRMS satellite fire detections of the last 48 hours in a bounding box. Not a forecast.

# FCDO advice level + current GDACS disasters
curl https://openvan.camp/api/hazards/countries/TR

# Active fires of the last 48 h, bbox = west,south,east,north (up to 10°×10°)
curl "https://openvan.camp/api/hazards/fires?bbox=29,36,33,38"
Parameters: bbox locale See it in the Roadbook Full documentation
GET /api/ferries Ferries

Ferry and river crossing lines and their ports from OpenStreetMap in a map box, with operator sites checked by hand, online booking links where booking is confirmed, and a timetable digest from open GTFS feeds: next departures, days, rhythm and travel time. Line and port data are ODbL 1.0.

# Lines and ports in a box, bbox = west,south,east,north; zoom sets geometry detail
curl "https://openvan.camp/api/ferries?bbox=4.9,58.8,6.2,59.4&zoom=9"

# One crossing with both ends, then its timetable digest (local operator time)
curl https://openvan.camp/api/ferries/r5958961
curl https://openvan.camp/api/ferries/r5958961/schedule
Parameters: bbox zoom Full documentation
GET /api/electricity/countries/{code} Power plugs

Plug types (IEC A–N), mains voltage and frequency for every country, with the source of each value, plus the hook-up connector at European campsites (CEE17).

curl https://openvan.camp/api/electricity/countries/GB
curl https://openvan.camp/api/electricity/countries
GET /api/customs/countries/{code} Customs

What you may bring in by car: food bans, cash declaration, alcohol and tobacco limits, duty-free value, fuel in a canister. Optionally from a given country — there are no customs inside the EU. Every rule carries a verbatim quote of the official source and a link.

# Entering Norway from Germany: cash, alcohol, tobacco, food
curl "https://openvan.camp/api/customs/countries/NO?from=DE"

# Jurisdictions and blocs (EU, EAEU)
curl https://openvan.camp/api/customs/countries
With no data the answer is 404 with covered: false. That means "we don't know", not "no holidays" or "nothing is restricted".
Parameters: from locale See it in the Roadbook Full documentation
GET /api/vansky/weather/{code}/{city} 0–100

The VanSky index rates how suitable the weather is for a motorhome trip, on a scale of 0–100, where 100 means excellent. It is calculated for a country or a city, for today and for the next 7 days. The 'today' value matches the figure shown on the openvan.camp page. For a city, the API returns its position in the country's city ranking, based on the week index (the 7-day average, lowered when the days are uneven); a day-by-day forecast with the components of the index; sub-scores for overnight stays, driving, solar power and the sea; air quality; and advice written as full sentences. To list the cities of a country in that ranking, use /api/vansky/weather/{code}/cities. For the ranking of countries, use /api/vansky/ranking. The formula and weights of the index are at /api/vansky/methodology. Replace {code} with the two-letter ISO 3166-1 alpha-2 country code. A city is identified by its Latin slug, which is the last segment of its page address. In openvan.camp/ru/vansky/georgia/batumi, the slug is batumi. To find a slug, call /api/vansky/search?q=Batumi. Here q is the city name.

# One country: score, forecast, best and worst cities for the week
curl https://openvan.camp/api/vansky/weather/PT

# Find a city slug: the last part of "url" (…/vansky/portugal/lisbon → lisbon)
curl "https://openvan.camp/api/vansky/search?q=Lisbon"

# One city, as on its page: today, week, place in the country, score breakdown per day
curl "https://openvan.camp/api/vansky/weather/PT/lisbon?include=hourly"

# Rankings: cities of a country for the coming week, countries of a region
curl "https://openvan.camp/api/vansky/weather/PT/cities?limit=10"
curl "https://openvan.camp/api/vansky/ranking?region=europe&limit=10"

# How the score is calculated (curves, weights, adjustments) — recompute it yourself
curl https://openvan.camp/api/vansky/methodology
Parameters: code city sort by region include locale Weather on the site Full documentation
GET /api/vansky/climate 2021–2025

Typical weather for any coordinates or any VanSky city on a chosen day of the year. Each value is the median of 35 archive days: the same date ±3 days in each year of 2021–2025. The source is the ERA5 archive, a Copernicus reanalysis of observations. For a date, the response gives the daytime high and the night-time low, and how many of the 35 days had at least 1.5 mm of precipitation (rain or snow). It also gives the most common sky category (clear, cloudy, overcast), the water temperature of the sea or a large lake within ~50 km (no value is returned if there is no water in that range), solar radiation in kWh/m², useful for sizing solar panels, and the VanSky index on a scale of 0–100 (a higher value is more comfortable). For each of the 12 months, it gives the average number of clear, cloudy and overcast days without precipitation, and of days with precipitation, together with the month with the best index. In the request, pass either lat and lng (latitude and longitude) or an ISO country code with a city slug. The date parameter (format MM-DD) is optional. Without it, the response covers all 366 days.

# Any point: what the weather is usually like on 18 September
curl "https://openvan.camp/api/vansky/climate?lat=41.64&lng=41.63&date=09-18"

# A VanSky city, all 366 days + 12 months + best month
curl https://openvan.camp/api/vansky/climate/GE/batumi
Parameters: lat lng date code city Weather on the site Full documentation
GET /api/events vanlife events

Paginated list of vanlife events — exhibitions, festivals, meetups, road trips. Filter by status, type, country. Localized names in 7 languages.

# Upcoming events in Germany
curl "https://openvan.camp/api/events?country=DE&status=upcoming"

# Search by name, Russian locale
curl "https://openvan.camp/api/events?search=Adventure+Northside&locale=ru"

# Event details + linked source articles
curl "https://openvan.camp/api/event/adventure-northside-2026?locale=en"
curl "https://openvan.camp/api/event/adventure-northside-2026/articles?locale=en"
locale — one of en ru de fr es pt tr. Default: en. Unknown locale silently falls back to en. articles fallback: if no articles match the requested locale, all source articles are returned.
Params: locale status type country search page limit Full docs →
GET /api/stories 7 languages

Vanlife news stories aggregated from 200+ publishers, translated into 7 languages. Each story includes sources — original publisher articles with direct links, source names, publication dates, and language codes. Semantic news search (q, up to 15 results) and the ready evening digest (ru, en).

# Latest stories in English
curl "https://openvan.camp/api/stories?locale=en"

# Filter by category and country
curl "https://openvan.camp/api/stories?locale=de&category=festival&country=DE"

# Full story with all source articles
curl "https://openvan.camp/api/story/adac-camper-des-jahres-der-wettbewerb-fuer?locale=en"

# Semantic search over the news (1–15 results)
curl "https://openvan.camp/api/news/search?q=campervan+rules+Europe&locale=en&limit=5"

# Ready evening digest (ru or en)
curl "https://openvan.camp/api/news/digest?locale=en"

Example response for /api/story/{slug}:

{
  "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://..."
    }
  ]
}
locale — one of en ru de fr es pt tr. Default: en. Affects title, summary, and category.name. sources[].language is always the original publisher language, independent of locale.
Params: locale category country search page limit q Full docs →

Quick Start

JavaScript — cheapest diesel in Europe

const { data } = await fetch("https://openvan.camp/api/fuel/prices").then(r => r.json());

const cheapest = Object.values(data)
  .filter(c => c.region === "europe" && c.prices.diesel !== null)
  .sort((a, b) => a.prices.diesel - b.prices.diesel)
  .slice(0, 5);

cheapest.forEach(c => console.log(`${c.country_name}: ${c.prices.diesel} ${c.currency}/L`));

JavaScript — convert to USD using currency rates

const [{ data }, { rates }] = await Promise.all([
  fetch("https://openvan.camp/api/fuel/prices").then(r => r.json()),
  fetch("https://openvan.camp/api/currency/rates").then(r => r.json()),
]);

// Convert any price to USD/liter
// unit: "liter" | "gallon" (US, 3.78541 L) | "imperial_gallon" (4.54609 L)
const LITERS_PER_UNIT = { liter: 1, gallon: 3.78541, imperial_gallon: 4.54609 };
// Unit and currency are per grade: units[grade] / currencies[grade] win over unit / currency
function toUSD(country, grade) {
  const currency = country.currencies?.[grade] ?? country.currency;
  const unit = country.units?.[grade] ?? country.unit;
  const usd = (country.prices[grade] / rates[currency]) * rates["USD"];
  return usd / (LITERS_PER_UNIT[unit] || 1);
}

console.log(`Germany diesel: $${toUSD(data["DE"], "diesel").toFixed(3)}/L`);

Python — countries with LPG

import requests

data = requests.get("https://openvan.camp/api/fuel/prices").json()["data"]

lpg = [(v["country_name"], v["prices"]["lpg"], v["currency"])
       for v in data.values() if v["prices"]["lpg"] is not None]

for name, price, currency in sorted(lpg, key=lambda x: x[1])[:10]:
    print(f"{name}: {price} {currency}/L")

More examples (bash, pandas, widget): GitHub →

JavaScript / TypeScript SDK

Official typed SDK — zero-config, works in Node.js ≥ 18, browser, Cloudflare Workers, Deno, Bun. No API key required.

Install

npm install @openvancamp/sdk
# or: pnpm add @openvancamp/sdk

Quick start (TypeScript / ESM)

import { OpenVan } from "@openvancamp/sdk";

const ov = new OpenVan();

// Cheapest diesel in Europe (top 5, EUR-normalized)
const top5 = await ov.fuel.cheapest("diesel", 5);
top5.forEach(c => console.log(c.country_name, c.prices.diesel, c.currency));

// Is Portugal cheaper than Germany for van living?
const comp = await ov.basket.compare("DE", "PT");
console.log(`Portugal is ${Math.abs(comp.diff_percent)}% cheaper`);

// Vanlife weather suitability — top 10 countries right now
const weather = await ov.weather.top({ limit: 10 });

// Tolls and visa rules for a road trip
const tolls = await ov.tolls.route(["Munich", "Venice"], "van");
const visa = await ov.visa.check("RU", "TR");

// Holidays, hazards, plugs and customs for the next country
const traffic = await ov.holidays.country("FR", { kind: "traffic" });
const hazards = await ov.hazards.country("TR");
const plugs = await ov.electricity.country("GB");
const customs = await ov.customs.country("NO", { from: "DE" });

Python SDK

No dependencies, Python 3.9+, no API key.

pip install openvan

from openvan import OpenVan

ov = OpenVan(source="myapp.com")  # source is optional: it lets us see and credit your project

for c in ov.fuel.cheapest("diesel", 5):
    print(c["country_name"], c["prices"]["diesel"], c["currency"])

print(ov.visa.check("RU", "TR")["data"])
print(ov.tolls.route(["Rome", "Paris"], vehicle_class="van"))

Limits, errors and versions

Rate limits

Counted per IP: 120 requests per minute across the API, heavier requests have lower limits — the table shows the effective values. What is left is in the X-RateLimit-Limit and X-RateLimit-Remaining headers. Over the limit you get HTTP 429 and a Retry-After header: wait that many seconds and retry.

Request Per minute
Whole API 120
POST /api/route-cost 30
GET /api/tolls/route 10
GET /api/hazards/fires 15
GET /api/plates/{code}/plate.svg · plate.png · random 30
POST /api/roadbook/from-places 10
GET /api/roadbook/{code}/status 240

Errors

An error is HTTP 4xx/5xx. The body comes in three shapes: { "success": false, "error": "…" } or { "error": "…", "message": "…" }; a roadbook validation error is { "error": "validation", "fields": [ … ] }; rate limits and unknown URLs return { "message": "…" }. Check the HTTP status, not only the body.

# 422 — invalid parameters
{ "success": false, "error": "Parameters \"passport\" and \"destination\" are required." }

# 404 — no data for this object
{ "error": "not_found", "message": "No toll data for this country" }

# 422 — roadbook validation
{ "error": "validation", "fields": ["locale"] }

# 404 — country known to the API, but no data: "we don't know", not "nothing applies"
{ "country_code": "ZZ", "covered": false, "items": [] }

# 429 — rate limit (wait Retry-After seconds)
{ "message": "Too Many Attempts." }

No data does not mean "nothing"

Holidays and customs answer 404 with covered: false (the country fields are still there); the toll reference and weather answer 404 with an error field. Do not tell users "no holidays", "the road is free" or "nothing is restricted" when there is no data.

Versions

API version 1.10.0 (OpenAPI spec), MCP server 0.12.0. Every change is published in the changelog on GitHub. Changelog

Support

Questions and bugs — GitHub Issues or hello@openvan.camp. Data use is under CC BY 4.0; site terms are on the Terms page. GitHub Issues · /terms · /privacy

Attribution

Attribution is required by the CC BY 4.0 license: wherever you show our data (website, app, bot, article), place a visible link to OpenVan.camp next to it. If an AI agent writes your code, ask it to keep this link. Ready-to-use snippet:

Holidays come from the OpenHolidays API (ODbL) and Nager.Date (MIT): when you show holidays, credit these sources too — they are listed in the upstream field of the response.

Data: <a href="https://openvan.camp/">OpenVan.camp</a> (CC BY 4.0)

Identify your app — add ?source=yoursite.com

Pass source query parameter with your domain or app name. No registration needed — it helps us understand how data is being used and acknowledge active projects. The value is echoed back in every response under _attribution.your_source.

curl "https://openvan.camp/api/fuel/prices?source=myapp.com"

# Response includes:
# "_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"
# }
Suggest news or event

Sent to "Submissions" for moderation

All suggestions go through automated checks and moderation. We publish excerpts and a link to the original source. By submitting you agree to Copyright Holders, Terms, Privacy Policy and Cookies.

→ Glossary