# American Adventurer > Free public-land camping data for the United States: 19,179 campsites across > 130 national forests and grasslands, 21,390 recorded toilets, and 417,380 resupply points > (fuel, groceries, water, dump stations and more). Every record has a page you can open and > check. There is an open, keyless JSON API. Fetch the root first — it describes itself and lists every other endpoint. ## Start here - [API root](https://davelalande.com/api/): self-describing; read its `how_to_use` field - [OpenAPI spec](https://davelalande.com/api/openapi.json): full machine-readable spec - [Guide for people](https://davelalande.com/ai): a ready-made menu-driven prompt - [The data catalog](https://davelalande.com/data/): the human-readable catalog of everything the site holds — every endpoint, every open file with its real size, and an honest list of the datasets that are on the site but have no endpoint yet. Every figure on it is read from this same corpus at build time. ## Data - [Campsite search](https://davelalande.com/api/camps?q=): filter by state, cost, water, forest, EV charger distance, and `open=today` (only camps whose agency season window reads OPEN that day) - Campsite detail, `/api/camps/{slug}`: water, nearest town, nearest toilet, its forest, `services_mi`, and `ev` (EV charging, below) — [worked example](https://davelalande.com/api/camps/upper-burnt-corral-dispersed-az-33633n111204w). Its `season.state` is evaluated for today (UTC) — `season.state_on` names the day; add `?date=YYYY-MM-DD` for another day - [Forest search](https://davelalande.com/api/forests?q=): the 130 forests and grasslands - Forest detail, `/api/forests/{slug}`: camp counts, how many have water, how many are free — [worked example](https://davelalande.com/api/forests/bighorn-national-forest) - [Season changes](https://davelalande.com/season-changes.json): camps whose agency-stated season window opened or closed in the last 7 days or will in the next 7 (also [RSS](https://davelalande.com/season-changes.xml)) - [Radius search](https://davelalande.com/api/near?lat=44.69&lon=-107.45&radius=25): camps or toilets within N miles — the worked example above is in the Bighorn NF and returns camps; a point inside a national PARK returns nothing, because national parks are not in this corpus - Trip planner for a person: `https://davelalande.com/trip/?from=denver-co&to=moab-ut&start=2026-10-03&end=2026-10-05&w=15` lists every camp within N straight-line miles (10/15/25) of the line between two towns, with cost, the season verdict for each night, water, toilet and the nearest DC fast charger; printable. Town ids are `-` from /towns.json. v1 is a straight corridor, not a route; the API has no corridor endpoint yet - Map for a person, centered anywhere: `https://davelalande.com/map?lat=&lon=&mi=30` (a dashed circle of that straight-line radius) or `&z=1..40` (the map's own zoom: 1 = the country, 40 = one site) ## Resupply next to a camp Every campsite detail record carries `services_mi`: the nearest of each of 8 categories, as `"category": [miles, name]`. The categories are `grocery`, `fuel`, `hospital`, `hardware`, `pharmacy`, `dump`, `water`, `propane`. A category is simply absent when nothing was found near that camp — that is unrecorded, not "none nearby". How often each one is present, across the 18,658 camps with a services record: grocery 96%, fuel 94%, hospital 81%, hardware 74%, pharmacy 68%, dump 59%, water 34%, propane 22%. Only 8% of camps carry all 8; 2% carry none. ## EV charging next to a camp Every campsite detail record carries `ev`, joined from the US DOE Alternative Fuels Data Center station locator (public domain). `ev.snapshot` is the date of that data; quote it. - `ev.nearest_dc_fast`: the nearest public, open, unrestricted DC fast station within 150 STRAIGHT-LINE miles — its AFDC id and page, listed connectors, fast-port count, network, hours, pricing and `last_confirmed` date, all verbatim. `null` = none listed within 150 mi, which is a real answer. `ev.dc_fast_within` counts them at 25 / 50 / 100 / 150 mi. - `ev.nearest_dc_fast_listing.CCS|NACS|CHAdeMO`: the nearest station that LISTS that plug. This is the listing filtered, not a fit judgement — adapters are the driver's call. - `ev.nearest_level2_j1772`: the nearest public Level 2 that lists J1772. - `ev.also_listed_not_counted`: nearer units that are restricted-access, planned, or NACS-only Level 2 — shown with their label, never in a count. - `kw` is not listed by AFDC; "DC fast" spans roughly 24 to 350 kW. - Search filters: `/api/camps?dcfc_within=25`, `&connector=CCS`, `&charge_desert=1` (more than 50 straight-line miles from any counted fast charger, or none within 150). - Say "listed open", never "works" or "available". Say straight-line, never compute a round trip. Tell the reader to check the network before committing. ## Resupply everywhere (POI layers) Bulk point layers, one file per category, for drawing a map or answering "what is near this road". These are plain static JSON — no query parameters, no filtering server-side. Fetch [the index](https://davelalande.com/poi/index.json) (3 KB) first: it lists every layer with its exact point count and byte size, so you can decide what is worth downloading. All 14 layers together are 417,380 points and 15.0 MB. Do not fetch them all. Pick the one category you need — or use `/api/near` instead, which does the distance work for you. - [grocery](https://davelalande.com/poi/grocery.json) — 124,430 points, 4.4 MB - [fuel](https://davelalande.com/poi/fuel.json) — 108,665 points, 3.2 MB - [mechanic](https://davelalande.com/poi/mechanic.json) — 46,981 points, 2.0 MB - [mail](https://davelalande.com/poi/mail.json) — 29,724 points, 1.4 MB - [potable_water](https://davelalande.com/poi/potable_water.json) — 24,981 points, 640 KB - [urgent_care](https://davelalande.com/poi/urgent_care.json) — 22,914 points, 1.2 MB - [pharmacy](https://davelalande.com/poi/pharmacy.json) — 20,250 points, 772 KB - [hardware](https://davelalande.com/poi/hardware.json) — 15,507 points, 659 KB - [laundry](https://davelalande.com/poi/laundry.json) — 9,658 points, 398 KB - [shower](https://davelalande.com/poi/shower.json) — 4,209 points, 112 KB - [propane](https://davelalande.com/poi/propane.json) — 3,106 points, 90 KB - [outfitter](https://davelalande.com/poi/outfitter.json) — 3,164 points, 151 KB - [air](https://davelalande.com/poi/air.json) — 2,158 points, 56 KB - [dump_station](https://davelalande.com/poi/dump_station.json) — 1,633 points, 45 KB ### Reading a layer file Each layer is one object. The points are packed into `pts` as arrays, not objects, to keep the files small — you have to unpack them: pts[i] = [lat, lon, name, code0, code1, ...] - `name` is `""` when the place is unnamed. Fall back to the file's `fallback_name`. - Rows are RAGGED. Trailing codes are dropped when unrecorded, so a row may be 3 items long. A missing code means unrecorded — never read it as "no". - `extras[n]` describes the code at position `3 + n`. Decode by its `kind`: - `enum` — the code indexes `extras[n].vals` - `bool` — the code is `1`, meaning true - `dict` — the code indexes the top-level array named by `extras[n].key` (e.g. `brand`) - `extras[n].fill` is the fraction of points that recorded that field. It is often low. - `by_state` gives per-state point counts for that layer, and `count` the total. Layers do not share a schema. `fuel` carries `brand`, `hours`, `diesel`; `potable_water` carries `fee` and `access`; `dump_station` also carries `water` and `charge`. Read `extras` from the file you fetched — do not assume. ### How far the POI layers reach This is a complete national extract: all 50 states are covered. Coverage is not uniform, though — a state can be present but thin, so an empty result means nobody recorded one there, NOT that no such place exists. Say so plainly rather than reporting zero. `index.json` carries the live `states_covered` and `states_missing` lists; trust those over this file. ## Pages - [All camps](https://davelalande.com/camps/) - [Camps by state](https://davelalande.com/camps/states/) - [All forests](https://davelalande.com/forests/) - [Map](https://davelalande.com/map) - [Camp finder](https://davelalande.com/find) ## How to use this honestly - State nothing you did not fetch. A null field is unrecorded — "no water recorded at this site" is the correct answer. Never estimate one; people drive to these places. - Always show the record's `url` so the reader can verify you. - All distances are in MILES. - Absence of data is not proof of absence. "No water recorded" means nobody recorded one. This applies twice over to the POI layers, whose density varies a lot by state. - POI opening hours and brands come from OpenStreetMap and go stale. A fuel station in the file may be closed. Never promise a place is open — say when the data was built. - SOMETIMES COVERED, in `rules` — use it when it is there, and only then. Counted at this build, as camps whose record carries the field: permit text 2,690 camps, open season 877, closure status 261, fee note 715, booking link 204, stay limit 2,254. These are extracted from the managing agency's own published text. When a camp has the field, lead with it. When it is absent, say it is unrecorded. (This list previously said seasonal closures and reservations were "not safe to infer", which told you to discard the very field the API was serving you.) - NOT COVERED, and not safe to infer: road and trail conditions, current fire danger, permit prices, real-time availability, whether a site is occupied. Say you cannot verify these and link the official forest page. - RULES GO STALE. A closure or open season was true when the agency page was read, not today. Always show the record's date and tell the reader to confirm before driving. ## Terms Data built 2026-09-24T06:19:08Z (the API root's `data_built_at`; counts above are from that build). Free to use, no key required. Please keep to roughly two requests per second. Credit "American Adventurer / davelalande.com". The POI layers are derived from OpenStreetMap. If you show or redistribute them you must credit "© OpenStreetMap contributors" and honor the ODbL. Each layer file repeats this in its own `attribution` field. ## Also by the same studio - momatio.com — Dave Lalande's digital studio. Town research and simulators: 29 towns with cited research packs, a robotaxi fleet ladder, a fast-charger sim and a coin-laundromat sim, plus a library of menu-driven prompts with an API. https://momatio.com - tinycorp.ai — TinyCorp Signal. A free paper-trading sandbox for prediction markets: build a bot from a library of plain-English signals, backtest it, watch an AI try to improve it, and read the Graveyard of what failed. No real money. https://tinycorp.ai - 223hampshire.com — 223 Hampshire. A commercial building for sale in Quincy, Illinois, listed with Century 21 — the site is the listing, with a buyer's calculator. https://223hampshire.com Contact: https://davelalande.com/contact