MENU navbar-image

Introduction

Open data API for fuel prices, currency rates and vanlife events. Free to use with attribution (CC BY 4.0).

Welcome to the **OpenVan.camp Public API** — open data for fuel prices, currency rates and vanlife events across 70+ countries.

## License
All data is available under **[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)**.
You are free to use it in your apps, bots, and articles — please cite **OpenVan.camp (openvan.camp)** as the source.

## Base URL
All endpoints are available at `https://openvan.camp`.

## Authentication
No authentication required. All endpoints are public.

## Rate Limits
No strict rate limits. Data is cached — please don't poll more often than every 10 minutes.

<aside>Code examples are shown in the right panel. Switch language with the tabs at the top right.</aside>

Authenticating requests

This API is not authenticated.

Currency Rates

Get currency rates

Returns exchange rates for 150+ currencies relative to EUR. Data is fetched from multiple open-source APIs with automatic fallback. Cached for 1 hour.

Example request:
curl --request GET \
    --get "https://openvan.camp/api/currency/rates" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://openvan.camp/api/currency/rates"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://openvan.camp/api/currency/rates'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Success):


{
    "success": true,
    "rates": {
        "EUR": 1,
        "USD": 1.08,
        "GBP": 0.85,
        "RUB": 98.5,
        "TRY": 35.2,
        "GEL": 2.95,
        "KZT": 520,
        "UAH": 42.5
    },
    "cached": true,
    "updated_at": "2026-03-15T09:00:00+00:00"
}
 

Request      

GET api/currency/rates

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Events

List events

Returns a paginated list of vanlife events (exhibitions, festivals, meetups, road trips). Filter by status, type, country, or search by name.

Example request:
curl --request GET \
    --get "https://openvan.camp/api/events?locale=en&status=upcoming&type=festival&country=DE&search=Nauticampo&page=1&limit=30" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://openvan.camp/api/events"
);

const params = {
    "locale": "en",
    "status": "upcoming",
    "type": "festival",
    "country": "DE",
    "search": "Nauticampo",
    "page": "1",
    "limit": "30",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://openvan.camp/api/events'
params = {
  'locale': 'en',
  'status': 'upcoming',
  'type': 'festival',
  'country': 'DE',
  'search': 'Nauticampo',
  'page': '1',
  'limit': '30',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Success):


{
    "events": [
        {
            "id": 42,
            "slug": "nauticampo-2026",
            "event_name": "Nauticampo 2026",
            "event_type": "festival",
            "start_date": "2026-03-11",
            "end_date": "2026-03-15",
            "city": "Lisbon",
            "country_code": "PT",
            "country": {
                "code": "pt",
                "name": "Portugal",
                "flag_emoji": "🇵🇹"
            },
            "status": "published",
            "url": "https://openvan.camp/en/event/nauticampo-2026"
        }
    ],
    "pagination": {
        "total": 48,
        "page": 1,
        "limit": 30,
        "pages": 2
    }
}
 

Request      

GET api/events

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

locale   string  optional    

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

status   string  optional    

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

type   string  optional    

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

country   string  optional    

2-letter ISO country code. Example: DE

search   string  optional    

Text search by event name. Example: Nauticampo

page   integer  optional    

Page number. Defaults to 1. Example: 1

limit   integer  optional    

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

Get event details

Returns full details for a single vanlife event by slug, including location, description, and social links.

Example request:
curl --request GET \
    --get "https://openvan.camp/api/event/nauticampo-2026?locale=en" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://openvan.camp/api/event/nauticampo-2026"
);

const params = {
    "locale": "en",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://openvan.camp/api/event/nauticampo-2026'
params = {
  'locale': 'en',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Success):


{
    "id": 42,
    "slug": "nauticampo-2026",
    "event_name": "Nauticampo 2026",
    "event_type": "festival",
    "start_date": "2026-03-11",
    "end_date": "2026-03-15",
    "city": "Lisbon",
    "country_code": "PT",
    "description": "Annual vanlife and camping festival...",
    "official_url": "https://nauticampo.pt",
    "image_url": "https://...",
    "status": "published",
    "url": "https://openvan.camp/en/event/nauticampo-2026"
}
 

Example response (404, Not found):


{
    "message": "No query results for model [App\\Models\\Event]."
}
 

Request      

GET api/event/{slug}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

slug   string     

The event slug. Example: nauticampo-2026

Query Parameters

locale   string  optional    

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

Get event articles

Returns news articles (sources) linked to this event, filtered by locale.

Example request:
curl --request GET \
    --get "https://openvan.camp/api/event/nauticampo-2026/articles?locale=en" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://openvan.camp/api/event/nauticampo-2026/articles"
);

const params = {
    "locale": "en",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://openvan.camp/api/event/nauticampo-2026/articles'
params = {
  'locale': 'en',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200, Success):


[
    {
        "id": 1001,
        "title": "Nauticampo 2026 opens its doors",
        "image_url": "https://...",
        "published_at": "2026-03-11T10:00:00+00:00",
        "source_name": "CamperVan Magazine",
        "original_url": "https://...",
        "language": "en"
    }
]
 

Request      

GET api/event/{slug}/articles

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

slug   string     

The event slug. Example: nauticampo-2026

Query Parameters

locale   string  optional    

Language code for filtering articles. Example: en

Fuel Prices

Get fuel prices

Returns current retail fuel prices (gasoline, diesel, LPG) for 70+ countries. Data is updated weekly from GlobalPetrolPrices and regional government sources.

License: CC BY 4.0 — free to use with attribution to OpenVan.camp.

Example request:
curl --request GET \
    --get "https://openvan.camp/api/fuel/prices" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://openvan.camp/api/fuel/prices"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://openvan.camp/api/fuel/prices'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200, Success):


{
    "success": true,
    "data": {
        "DE": {
            "country_code": "DE",
            "country_name": "Germany",
            "region": "europe",
            "currency": "EUR",
            "prices": {
                "gasoline": 1.79,
                "diesel": 1.65,
                "lpg": 0.82,
                "e85": null,
                "premium": null
            },
            "fetched_at": "2026-03-15T09:31:25+03:00",
            "source": "GlobalPetrolPrices.com"
        }
    },
    "meta": {
        "total_countries": 72,
        "updated_at": "2026-03-15 09:33:33",
        "cache_ttl_hours": 6
    }
}
 

Request      

GET api/fuel/prices

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json