{
  "markdown": "# OpenVan.camp Public API\n\nFree, no-auth API for vanlife data: fuel prices, currency rates, food cost index, vanlife events, and news stories — all in one place, no registration required.\n\n**Base URL:** `https://openvan.camp`  \n**Auth:** None required  \n**CORS:** Enabled  \n**License:** data is [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code in this repository (SDK, MCP server, examples) is [MIT](./LICENSE)\n\n**JavaScript/TypeScript SDK:** [`@openvancamp/sdk`](https://www.npmjs.com/package/@openvancamp/sdk) — `npm install @openvancamp/sdk`. Zero-config, typed, Node.js / browser / edge. [SDK docs →](./sdk/README.md)\n\n**MCP Server (for AI agents):** [`mcp-server/`](./mcp-server) — hosted at `https://mcp.openvan.camp/mcp`, also `npx -y mcp-remote https://mcp.openvan.camp/mcp` for Claude Desktop / Cursor / Windsurf. [Install docs →](./mcp-server/README.md)\n\n**Custom GPT:** [OpenVan Travel Assistant](https://chatgpt.com/g/g-69e723ddf2f48191b828b461cd7f57e0-openvan-travel-assistant) — live in ChatGPT GPT Store.\n\n---\n\n## What is authoritative\n\n| Resource | Purpose |\n|----------|---------|\n| This README | Quick overview and code examples |\n| [`/docs`](https://openvan.camp/docs) | Interactive documentation with \"Try it out\" |\n| [`/docs.openapi`](https://openvan.camp/docs.openapi) | Full OpenAPI 3.0 contract (always up to date) |\n| [`/docs.postman`](https://openvan.camp/docs.postman) | Postman collection |\n\nThe 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.\n\n---\n\n## Endpoints\n\n| Endpoint | Description | Coverage |\n|----------|-------------|----------|\n| `GET /api/fuel/prices` | Retail fuel prices (gasoline, diesel, LPG, E85) | 120+ countries |\n| `GET /api/currency/rates` | Exchange rates relative to EUR | 150+ currencies |\n| `GET /api/vanbasket/countries` | Food price index relative to world average (100 = world avg) | 90+ countries |\n| `GET /api/vanbasket/compare?from=DE&to=TR` | Compare food costs between two countries | — |\n| `GET /api/vanbasket/countries/{code}` | Single country + historical snapshots | — |\n| `GET /api/events` | Vanlife events: expos, festivals, meetups, road trips | 695 events |\n| `GET /api/event/{slug}` | Full event details with geo coordinates | — |\n| `GET /api/event/{slug}/articles` | Source articles linked to an event | — |\n| `GET /api/stories` | News stories aggregated from 200+ publishers | 8200+ stories |\n| `GET /api/story/{slug}` | Full story with all source articles and direct links | — |\n\n---\n\n## Quick Start\n\n```bash\n# Fuel prices\ncurl https://openvan.camp/api/fuel/prices\n\n# Currency rates (EUR-based)\ncurl https://openvan.camp/api/currency/rates\n\n# Food price index\ncurl https://openvan.camp/api/vanbasket/countries\n\n# Upcoming vanlife events in Germany\ncurl \"https://openvan.camp/api/events?country=DE&status=upcoming&locale=en\"\n\n# Latest vanlife news stories in English\ncurl \"https://openvan.camp/api/stories?locale=en\"\n```\n\n---\n\n## Fuel Prices — `/api/fuel/prices`\n\nWeekly retail prices from 45+ official government sources.  \n**Cache TTL:** 6 hours. Please poll no faster than every 10 minutes.\n\n```bash\ncurl https://openvan.camp/api/fuel/prices\n```\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"DE\": {\n      \"country_code\": \"DE\",\n      \"country_name\": \"Germany\",\n      \"region\": \"europe\",\n      \"currency\": \"EUR\",\n      \"local_currency\": \"EUR\",\n      \"unit\": \"liter\",\n      \"prices\": {\n        \"gasoline\": 1.79,\n        \"diesel\": 1.69,\n        \"lpg\": 0.89,\n        \"e85\": null,\n        \"premium\": null\n      },\n      \"price_changes\": { \"gasoline\": -0.02, \"diesel\": 0.01, \"lpg\": 0.0 },\n      \"fetched_at\": \"2026-04-05T10:00:00+00:00\",\n      \"sources\": [\"EU Weekly Oil Bulletin\", \"Fuelo.net\"],\n      \"sources_count\": 2,\n      \"is_excluded\": false\n    }\n  },\n  \"meta\": {\n    \"total_countries\": 121,\n    \"updated_at\": \"2026-04-05 10:00:00\",\n    \"cache_ttl_hours\": 6\n  }\n}\n```\n\n**Notes:**\n- `unit` is `\"liter\"` for most countries, `\"gallon\"` for US and Ecuador\n- `is_excluded: true` means the country has heavy fuel subsidies (prices don't reflect market rates)\n- `price_changes` = delta vs last week's prices\n\n---\n\n## Currency Rates — `/api/currency/rates`\n\nEUR-based exchange rates from multiple open-source providers with automatic fallback.  \n**Cache TTL:** 25 hours. Refreshed daily at 07:00 UTC.\n\n```bash\ncurl https://openvan.camp/api/currency/rates\n```\n\n```json\n{\n  \"success\": true,\n  \"rates\": {\n    \"EUR\": 1,\n    \"USD\": 1.08,\n    \"GBP\": 0.85,\n    \"TRY\": 38.5,\n    \"GEL\": 2.95,\n    \"KZT\": 510,\n    \"RUB\": 98.5\n  },\n  \"cached\": true,\n  \"updated_at\": \"2026-04-08T07:00:00+00:00\"\n}\n```\n\n**Convert to any currency:**\n```js\nconst priceInUSD = (priceEUR / rates.EUR) * rates.USD;\nconst priceInTRY = (priceEUR / rates.EUR) * rates.TRY;\n```\n\n---\n\n## VanBasket Food Price Index — `/api/vanbasket/*`\n\nRelative cost of a food basket compared to world average (World = 100).  \nBased on World Bank ICP 2021 data, adjusted with IMF CPI.  \n**Data source:** CC BY 4.0\n\n```bash\n# All countries\ncurl https://openvan.camp/api/vanbasket/countries\n\n# Compare two countries\ncurl \"https://openvan.camp/api/vanbasket/compare?from=DE&to=TR\"\n\n# Single country with historical snapshots\ncurl https://openvan.camp/api/vanbasket/countries/DE\n```\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"CH\": { \"country_code\": \"CH\", \"country_name\": \"Switzerland\", \"vanbasket_index\": 162.3, \"pct_vs_world\": 62.3 },\n    \"DE\": { \"country_code\": \"DE\", \"country_name\": \"Germany\",     \"vanbasket_index\": 118.7, \"pct_vs_world\": 18.7 },\n    \"TR\": { \"country_code\": \"TR\", \"country_name\": \"Turkey\",      \"vanbasket_index\":  82.4, \"pct_vs_world\": -17.6 },\n    \"GE\": { \"country_code\": \"GE\", \"country_name\": \"Georgia\",     \"vanbasket_index\":  64.1, \"pct_vs_world\": -35.9 }\n  },\n  \"meta\": {\n    \"total_countries\": 92,\n    \"world_avg\": 100,\n    \"base_year\": 2021,\n    \"source\": \"World Bank ICP 2021\",\n    \"license\": \"CC BY 4.0\"\n  }\n}\n```\n\n**Compare response:**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"from\": { \"country_code\": \"DE\", \"country_name\": \"Germany\", \"vanbasket_index\": 118.7 },\n    \"to\":   { \"country_code\": \"TR\", \"country_name\": \"Turkey\",  \"vanbasket_index\":  82.4 },\n    \"diff_percent\": -30.6,\n    \"budget_100\": 69,\n    \"cheaper\": true\n  }\n}\n```\n\n`budget_100`: if you spend €100 on food in the `from` country, you'd spend €69 in the `to` country.\n\n---\n\n## Events — `/api/events`\n\nVanlife events: exhibitions, festivals, meetups, road trips. Updated in real time.\n\n**Query params:**\n\n| Param | Values | Default |\n|-------|--------|---------|\n| `locale` | `en` `ru` `de` `fr` `es` `pt` `tr` | `en` |\n| `status` | `upcoming` `ongoing` `past` `all` | `upcoming` |\n| `type` | `expo` `festival` `forum` `meetup` `roadtrip` | — |\n| `country` | ISO 3166-1 alpha-2 | — |\n| `search` | text | — |\n| `page` | integer | `1` |\n| `limit` | integer (max 100) | `30` |\n\n```bash\n# Upcoming events in Germany\ncurl \"https://openvan.camp/api/events?country=DE&status=upcoming&locale=en\"\n\n# Event details\ncurl \"https://openvan.camp/api/event/fit-camper-2026?locale=en\"\n\n# Source articles linked to an event\ncurl \"https://openvan.camp/api/event/fit-camper-2026/articles?locale=en\"\n```\n\n```json\n{\n  \"events\": [\n    {\n      \"id\": 493,\n      \"slug\": \"fit-camper-2026\",\n      \"event_name\": \"Fit Your Camper\",\n      \"event_type\": \"expo\",\n      \"event_type_label\": \"Exhibition\",\n      \"start_date\": \"2026-04-09\",\n      \"end_date\": \"2026-04-12\",\n      \"city\": \"Bologna\",\n      \"country_code\": \"IT\",\n      \"country\": { \"code\": \"it\", \"name\": \"Italy\", \"flag_emoji\": \"🇮🇹\" },\n      \"venue_name\": \"BolognaFiere\",\n      \"status\": \"upcoming\",\n      \"articles_count\": 7,\n      \"url\": \"https://openvan.camp/en/event/fit-camper-2026\"\n    }\n  ],\n  \"pagination\": { \"total\": 48, \"page\": 1, \"limit\": 30, \"pages\": 2 }\n}\n```\n\n**Notes:**\n- Unknown or missing `locale` silently falls back to `en`\n- `/api/event/{slug}/articles` returns source articles filtered by `locale`; if none match, all articles are returned (may be in the original publisher language)\n\n---\n\n## Stories / News — `/api/stories`\n\nVanlife news stories aggregated from 200+ publishers and translated into 7 languages. Each story clusters multiple source articles covering the same topic.\n\n**Query params:**\n\n| Param | Values | Default |\n|-------|--------|---------|\n| `locale` | `en` `ru` `de` `fr` `es` `pt` `tr` | `en` |\n| `category` | category slug (e.g. `camping`, `travel`, `gear`, `incident`) | — |\n| `country` | ISO 3166-1 alpha-2 | — |\n| `search` | text | — |\n| `page` | integer | `1` |\n| `limit` | integer (max 50) | `20` |\n\n```bash\n# Latest stories in English\ncurl \"https://openvan.camp/api/stories?locale=en\"\n\n# German vanlife news in Germany\ncurl \"https://openvan.camp/api/stories?locale=de&country=DE\"\n\n# Full story with all source links\ncurl \"https://openvan.camp/api/story/free-overnight-parking-netherlands?locale=en\"\n```\n\n```json\n{\n  \"slug\": \"free-overnight-parking-netherlands\",\n  \"title\": \"Free Overnight Parking for Motorhomes in the Netherlands\",\n  \"summary\": \"The Dutch motorhome community is pushing for more designated free overnight spots...\",\n  \"image_url\": \"https://...\",\n  \"category\": { \"slug\": \"travel\", \"name\": \"Travel\" },\n  \"countries\": [{ \"code\": \"nl\", \"name\": \"Netherlands\", \"flag_emoji\": \"🇳🇱\" }],\n  \"first_published_at\": \"2026-04-01T10:00:00+00:00\",\n  \"last_updated_at\": \"2026-04-03T08:00:00+00:00\",\n  \"articles_count\": 5,\n  \"url\": \"https://openvan.camp/en/news/travel/free-overnight-parking-netherlands\",\n  \"sources\": [\n    {\n      \"title\": \"Gratis overnachten in je camper: de beste plekken\",\n      \"original_url\": \"https://www.campermagazine.nl/overnachten/gratis-plaatsen\",\n      \"source_name\": \"CamperMagazine.nl\",\n      \"published_at\": \"2026-04-01T10:00:00+00:00\",\n      \"language\": \"nl\",\n      \"image_url\": \"https://...\"\n    }\n  ]\n}\n```\n\n**Notes:**\n- `title` and `summary` are translated to the requested `locale`\n- `sources[].language` is always the **original publisher language**, regardless of `locale`\n- `sources[].original_url` is the direct link to the publisher article\n\n---\n\n## Response Format\n\nAll JSON endpoints follow a consistent envelope:\n\n```json\n{ \"success\": true, \"data\": { ... }, \"meta\": { ... }, \"_attribution\": { ... } }\n```\n\nEvery response includes an `_attribution` object:\n\n```json\n\"_attribution\": {\n  \"data_source\": \"openvan.camp\",\n  \"license\": \"CC BY 4.0\",\n  \"attribution_url\": \"https://openvan.camp/\",\n  \"attribution_html\": \"Data: <a href=\\\"https://openvan.camp/\\\">OpenVan.camp</a> (CC BY 4.0)\"\n}\n```\n\nErrors:\n```json\n{ \"success\": false, \"error\": \"Description of the error.\" }\n```\n\nIf you call without `Accept: application/json`, some error responses may return HTML. Always send the header:\n```\nAccept: application/json\n```\n\n---\n\n## Rate Limiting\n\n120 requests per minute per IP. Please be responsible:\n- Cache fuel prices for at least 6 hours\n- Cache currency rates for at least 1 hour\n- Cache stories/events for at least 15 minutes\n\n---\n\n## Attribution\n\nRequired by CC BY 4.0. Suggested format:\n\n```html\nData: <a href=\"https://openvan.camp/\">OpenVan.camp</a> — CC BY 4.0\n```\n\n### Identify your integration\n\nPass `?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:\n\n```bash\ncurl \"https://openvan.camp/api/fuel/prices?source=myapp.com\"\n```\n\n```json\n{\n  \"success\": true,\n  \"data\": { \"...\" },\n  \"meta\": { \"...\" },\n  \"_attribution\": {\n    \"data_source\": \"openvan.camp\",\n    \"license\": \"CC BY 4.0\",\n    \"attribution_url\": \"https://openvan.camp/\",\n    \"attribution_html\": \"Data: <a href=\\\"https://openvan.camp/\\\">OpenVan.camp</a> (CC BY 4.0)\",\n    \"your_source\": \"myapp.com\"\n  }\n}\n```\n\nThis helps us understand how the data is being used and acknowledge active projects.\n\n---\n\n## JavaScript / TypeScript SDK\n\n```bash\nnpm install @openvancamp/sdk\n# or: pnpm add @openvancamp/sdk\n```\n\n```ts\nimport { OpenVan } from \"@openvancamp/sdk\";\n\nconst ov = new OpenVan();\n\n// Cheapest diesel in Europe (top 5, EUR-normalized)\nconst top5 = await ov.fuel.cheapest(\"diesel\", 5);\ntop5.forEach(c => console.log(c.country_name, c.prices.diesel, c.currency));\n\n// Is Portugal cheaper than Germany for van living?\nconst comp = await ov.basket.compare(\"DE\", \"PT\");\nconsole.log(`Portugal is ${Math.abs(comp.diff_percent)}% cheaper`);\n\n// Vanlife weather suitability — top 10 countries right now\nconst weather = await ov.weather.top({ limit: 10 });\n```\n\nESM-native, fully typed (TypeScript included), works in Node.js ≥ 18, browser, Cloudflare Workers, Deno, Bun. No API key.\n\nnpm: [`@openvancamp/sdk`](https://www.npmjs.com/package/@openvancamp/sdk) · [Full SDK docs →](./sdk/README.md)\n\n---\n\n## Resources\n\n- **Interactive docs:** https://openvan.camp/docs\n- **OpenAPI 3.0 spec:** https://openvan.camp/docs.openapi\n- **Postman collection:** https://openvan.camp/docs.postman\n- **JavaScript SDK:** https://www.npmjs.com/package/@openvancamp/sdk\n- **Developer page:** https://openvan.camp/en/developers\n",
  "bytes": 13152,
  "sha": "8e57083256b6761ec9b88ae7d3f34704d4f50ca04c64a00c34485b3a6d6fcf69",
  "repo_slug": "kopaev/openvan-camp-public-api",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_kopaev_openvan_travel_9abf8289/readme"
}