Gc APIreservation.pc.gc.ca ↗
Access campground availability, site metadata, equipment filters, and date schedules across Parks Canada locations via a structured REST API.
What is the Gc API?
This API exposes 6 endpoints covering the Parks Canada reservation system at reservation.pc.gc.ca, returning real-time campsite and cabin availability, location metadata, resource listings, equipment categories, and operating schedules. The get_availability endpoint delivers day-by-day availability status with quota counts for any individual resource across a date range up to 90 days, while get_map_availability aggregates that data across an entire campground map section.
curl -X GET 'https://api.parse.bot/scraper/45959601-ad42-4b32-bad3-8431a603ed7f/get_availability?end_date=2026-07-29&language=en-CA&start_date=2026-07-22&resource_id=-2147475657&booking_category_id=1&equipment_category_id=-32768&sub_equipment_category_id=-32768' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace reservation-pc-gc-ca-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Parks Canada Reservation API — find campgrounds, check availability, browse equipment."""
from parse_apis.parks_canada_reservation_api import ParksCanada, Language, NotFound
client = ParksCanada()
# List all park locations and pick the first Banff campground.
for location in client.locations.list(language=Language.EN_CA, limit=5):
print(location.full_name, location.resource_location_id)
# Drill into a specific location's resources (campsites).
banff = client.location(resource_location_id=-2147483644)
site = banff.resources.list(limit=1).first()
if site:
print(site.name, site.max_capacity, site.allowed_equipment)
# Check daily availability for that campsite.
if site:
for slot in site.availability.list(start_date="2026-07-01", end_date="2026-07-05", limit=5):
print(slot.date, slot.availability_label, slot.is_available)
# Get operating schedules for the location.
schedule = banff.schedules.list(limit=1).first()
if schedule:
print(schedule.name, schedule.check_in_time, schedule.check_out_time)
# Map-level availability overview for the campground section.
try:
overview = client.mapavailabilities.get(map_id="-2147483626", start_date="2026-07-01", end_date="2026-07-02")
print(overview.map_id, overview.total_resources, overview.available_resources)
except NotFound as exc:
print(f"Map not found: {exc}")
# Browse equipment categories for filtering.
for cat in client.equipmentcategories.list(limit=3):
print(cat.name, cat.equipment_category_id, cat.subcategories)
print("exercised: locations.list / resources.list / availability.list / schedules.list / mapavailabilities.get / equipmentcategories.list")
Retrieve daily availability time slots for a specific resource (campsite, cabin, oTENTik). Returns day-by-day availability status for a date range, including availability codes, remaining quota, and processed availability labels. Defaults to a 90-day window from today if dates are not specified.
| Param | Type | Description |
|---|---|---|
| end_date | string | End date in YYYY-MM-DD format. Defaults to start_date + 90 days. |
| language | string | Language code for localized content. |
| start_date | string | Start date in YYYY-MM-DD format. Defaults to today. |
| resource_idrequired | string | Resource ID (campsite/cabin). Get these from get_resources endpoint (resource_id field). |
| booking_category_id | string | Booking category ID (1=Frontcountry Camping). |
| equipment_category_id | string | Equipment category ID. Get from get_equipment. |
| sub_equipment_category_id | string | Sub-equipment category ID. Get from get_equipment. |
{
"type": "object",
"fields": {
"end_date": "string YYYY-MM-DD",
"start_date": "string YYYY-MM-DD",
"time_slots": "array of TimeSlot objects with date, availability, availability_label, processed_availability, processed_label, remaining_quota, is_available",
"total_days": "integer number of days in range",
"resource_id": "integer resource ID",
"available_days": "integer count of available days",
"unavailable_days": "integer count of unavailable days"
},
"sample": {
"data": {
"end_date": "2026-09-09",
"start_date": "2026-06-11",
"time_slots": [
{
"date": "2026-06-11",
"availability": 1,
"is_available": true,
"processed_label": "available_good",
"remaining_quota": null,
"availability_label": "available",
"processed_availability": 5
}
],
"total_days": 91,
"resource_id": -2147475657,
"available_days": 91,
"unavailable_days": 0
},
"status": "success"
}
}About the Gc API
Locations and Resources
get_locations returns the full list of Parks Canada campground and park locations, including resource_location_id, short_name, full_name, GPS coordinates, website URLs, and driving directions. Pass a resource_location_id to get_resources to retrieve all bookable units at that location — individual campsites, oTENTiks, cabins, and other accommodation types — with fields like resource_id, name, resource_category_id, max_capacity, min_capacity, and max_adult_capacity. Both endpoints accept a language parameter (en-CA or fr-CA) for bilingual output.
Availability Queries
get_availability accepts a resource_id (sourced from get_resources) alongside optional start_date and end_date in YYYY-MM-DD format, defaulting to today through 90 days out. The response breaks down each day in the range with availability, availability_label, remaining_quota, and is_available, plus summary integers available_days, unavailable_days, and total_days. To filter by camping type, pass booking_category_id (e.g., 1 for Frontcountry Camping) and equipment identifiers from get_equipment.
get_map_availability takes a map_id (from the root_map_id field in get_locations) and returns availability rolled up across all resources in that campground section. The response includes resource_availabilities (keyed by resource_id) and map_link_availabilities (keyed by link_id), each with per-day availability codes and is_available flags. available_resources gives a quick integer count of sites that have at least one open day in the window.
Equipment and Schedules
get_equipment lists all equipment categories and subcategories used to filter availability queries — tent sizes, RV types, and similar — returning equipment_category_id, name, order, and a subcategories array with sub_equipment_category_id values. get_date_schedule retrieves operating and reservable windows for a location, including check_in_time, check_out_time, minimum_stay_days, maximum_stay_days, and display_online flags. These schedule objects clarify booking window constraints before querying availability.
The Gc API is a managed, monitored endpoint for reservation.pc.gc.ca — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when reservation.pc.gc.ca changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official reservation.pc.gc.ca API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Find all available campsites at a specific Parks Canada location for a given weekend using
get_map_availabilitywith amap_id. - Build a campsite availability calendar by iterating
get_availabilityacross multipleresource_idvalues withremaining_quotafor quota tracking. - Filter RV-compatible sites by passing equipment category IDs from
get_equipmentinto availability queries. - Enumerate all oTENTik and cabin resources across parks using
get_resourceswith theirresource_category_idfields. - Display GPS-mapped park locations with driving directions pulled from
get_locationscoordinates. - Check minimum and maximum stay rules before booking by querying
get_date_schedulefor a location'sminimum_stay_daysandcheck_out_time. - Aggregate cross-park availability data for a trip-planning tool covering multiple
resource_location_idvalues.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Parks Canada offer an official developer API for reservation.pc.gc.ca?+
What does `get_availability` return for a single campsite, and how granular is it?+
get_availability returns one record per day in the requested date range. Each record includes availability, availability_label, processed_availability, processed_label, remaining_quota, and is_available. The range defaults to today through 90 days if no end_date is provided. You can further narrow results by supplying booking_category_id, equipment_category_id, and sub_equipment_category_id.Does the API return actual booking prices or reservation fees?+
Can I retrieve user reviews or site-level ratings for individual campsites?+
How do I identify which `map_id` to pass to `get_map_availability`?+
get_locations first. Each location object includes a root_map_id field, which is the value to pass as map_id. The map corresponds to a campground section and groups all bookable resources within it for the aggregate availability response.