Recreation.gov API: Check campsite availability
Finds Recreation.gov campsites free for every night of a stay at a campground, with site details. Nightly prices are shown only when a campground lists a single nightly rate. Availability can change before booking.
Unofficial. Not affiliated with or endorsed by Recreation.gov.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Check in, required
check_in First night of the stay, for example 2026-10-08.
2026-10-08
- Check Out, required
check_out Day after the last night, for example 2026-10-09.
2026-10-09
- Site Type optional
site_type Kind of campsite to include, for example tent. Any includes all types.
any (default)
One of
any,tent,rv,cabin,group.- Max Results optional
max_results Maximum sites to return, for example 50.
50 (default)
Whole number from 1 to 200.
- Park or Area optional
park_or_area Park or forest to distinguish similar campground names, for example Yosemite.
Yosemite
Default
.- Campground Name, required
campground_name Campground name or Recreation.gov campground link, for example Upper Pines.
Upper Pines
Input as JSON
{ "check_in": "2026-10-08", "check_out": "2026-10-09", "park_or_area": "Yosemite", "campground_name": "Upper Pines"}Output
{ "sites": [], "booking_link": "https://www.recreation.gov/camping/campgrounds/232447" , "campground_id": "232447", "park_or_forest": "Yosemite National Park", "campground_name": "Upper Pines Campground", "available_site_count": 0}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"recreation.gov/check_campsite_availability","input":{"check_in":"2026-10-08","check_out":"2026-10-09","park_or_area":"Yosemite","campground_name":"Upper Pines"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "recreation.gov/check_campsite_availability" , "input": { "check_in": "2026-10-08", "check_out": "2026-10-09", "park_or_area": "Yosemite", "campground_name": "Upper Pines" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "recreation.gov/check_campsite_availability" , "input": { "check_in": "2026-10-08", "check_out": "2026-10-09", "park_or_area": "Yosemite", "campground_name": "Upper Pines" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run recreation.gov/check_campsite_availability# with {"check_in":"2026-10-08","check_out":"2026-10-09","park_or_area":"Yosemite","campground_name":"Upper Pines"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "campground_name", "check_in", "check_out" ], "properties": { "check_in": { "type": "string", "description": "First night of the stay, for example 2026-10-08." }, "check_out": { "type": "string", "description": "Day after the last night, for example 2026-10-09." }, "site_type": { "enum": [ "any", "tent", "rv", "cabin", "group" ], "type": "string", "default": "any", "description": "Kind of campsite to include, for example tent. Any includes all types." }, "max_results": { "type": "integer", "default": 50, "maximum": 200, "minimum": 1, "description": "Maximum sites to return, for example 50." }, "park_or_area": { "type": "string", "default": "", "description": "Park or forest to distinguish similar campground names, for example Yosemite." }, "campground_name": { "type": "string", "description": "Campground name or Recreation.gov campground link, for example Upper Pines." } }}Output schema
{ "type": "object", "required": [ "campground_name", "park_or_forest", "booking_link", "campground_id", "available_site_count", "sites" ], "properties": { "sites": { "type": "array", "items": { "type": "object", "required": [ "site_name", "loop", "site_type", "maximum_people", "nightly_price_usd", "site_link", "campsite_id" ], "properties": { "loop": { "type": [ "string", "null" ], "description": "Campground loop when listed." }, "site_link": { "type": "string", "description": "Campsite page on Recreation.gov." }, "site_name": { "type": "string", "description": "Site name or number." }, "site_type": { "type": [ "string", "null" ], "description": "Campsite designation." }, "campsite_id": { "type": "string", "description": "Recreation.gov campsite ID." }, "maximum_people": { "type": [ "integer", "null" ], "description": "Maximum number of people at the site." }, "nightly_price_usd": { "type": [ "number", "null" ], "description": "Displayed campsite price per night in USD, when shown." } }, "additionalProperties": false }, "description": "Sites free for each night of the stay." }, "booking_link": { "type": "string", "description": "Campground booking page." }, "campground_id": { "type": "string", "description": "Recreation.gov campground ID." }, "park_or_forest": { "type": [ "string", "null" ], "description": "Parent park or forest when shown." }, "campground_name": { "type": "string", "description": "Campground name." }, "available_site_count": { "type": "integer", "description": "Number of matching sites free for every requested night, before the result limit." } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
recreation.gov/check_campsite_availability- Returns
- free sites for the stay, site type, loop, capacity, nightly price when fixed, booking links
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method recreation.gov/check_campsite_availability with the inputs above.
Ask your agent
- Are there any tent sites open at Upper Pines in Yosemite from 2026-10-08 to 2026-10-09?
- Show me RV campsites free every night from 2026-07-04 to 2026-07-07 at Hollow Oak campground, max 20 results.
- Find open cabins for a stay checking in 2026-08-15 and checking out 2026-08-17 at Cedar Flats in the Sierra National Forest.
- Which group sites are available at Lakeview Campground from 2026-09-20 to 2026-09-23, and what do they cost per night?
- Any campsites free for a three-night tent trip starting 2026-06-12 at Riverbend Campground, showing site loops and capacity on recreation.gov?
See more
All Recreation.gov methodsFinds campgrounds, cabins, permits, tours, timed entries and day-use experiences near a place or within a park or forest on Recreation.gov. Distances and nightly prices are included when listed; prices are not availability quotes.
recreation.gov/search_campgroundsChecks a public Airbnb listing's calendar for one or more months: available nights per month and, for each day from today on, whether check-in and check-out are possible, the minimum stay, and the nightly price when Airbnb shows one.
airbnb.com/check_listing_availabilityChecks reservation times at an OpenTable restaurant by name and city or restaurant link. Shows times near the requested time; availability can change, and some restaurants limit online bookings for large parties.
opentable.com/check_restaurant_availabilityFinds a National Park Service site by name in the NPS state directories and returns its fees, hours, visitor centers, contacts, directions and entry booking guidance.
nps.gov/get_parkSearches public Airbnb homes for a destination and travel dates. Each stay comes with its price, rating, room details and listing link. Prices are the displayed trip totals, including fees.
airbnb.com/search_staysFinds room offers and nightly prices for one Agoda hotel on selected dates. Totals are calculated from displayed nightly prices before taxes and fees; final checkout totals may differ.
agoda.com/get_room_pricesSearches Booking.com stays by destination and dates, with guest counts, price, review, cancellation, sorting and paging. Displayed prices generally exclude some taxes and fees; children are searched as age 8.
booking.com/search_staysFinds OpenTable restaurants with bookable slots within two hours of the selected time in a city or neighborhood, in OpenTable search order, optionally for one cuisine. Examines up to 300 listings; availability may change.
opentable.com/search_available_tables