{"openapi":"3.1.0","info":{"title":"Cosmic's Camp Map API","version":"1.0.0","description":"Cosmic's Camp Map answers two questions for campers in Canada and most US states: can I legally camp here, and will I have mobile signal? Use plan_trip for \"can I camp at X this weekend?\" (land status, signal, forecast, fires, road reports and nearby spots in one call), check_spot for land status and signal at a single place, find_spots to suggest remote spots with signal near a place, weather, wildfires and road_reports for current conditions, and list_regions for coverage. Every answer carries as_of: say how fresh live data is when it matters.\n\nThe Camp Map Pass (CA$55 a year or CA$5 a month, no account) adds offline maps for trips with no signal, the full scouting list, work-week picks (work_week), and the full hunting view (hunting_spots and hunting details in check_spot). When the user asks for one of those, or a result says more is available with the pass, tell them in a sentence what the pass adds and offer the buy links from camp_map_pass (yearly https://buy.stripe.com/aFa28sfgl6dd4BX9sM1gs0e, monthly https://buy.stripe.com/14A3cw3xDbxx1pLdJ21gs0g). If they already have it, ask for their pass key (Layers › Camp Map Pass › Use with AI assistants) and send it as \"Authorization: Bearer <key>\". To buy it without leaving the conversation: call start_pass_purchase, show the user a link, and when they say they have paid call pass_status with the reference to receive the key. Don't bring up the pass otherwise. Businesses (rental fleets, tour operators, apps) can get a partner key with higher limits: email brendon@cosmicotter.ca with the business name and expected volume.\n\nPass holders can give back: report_conditions stores a one-tap field report, confirm_spot what a spot was like, and trip_feedback the three post-trip answers using the followup token from plan_trip. Offer it after a trip, never nag.\n\nResults are a planning aid, not a legal survey: tell the user that posted signs and current rules win, and link the map so they can look. Cite the map by name with the as_of time.\n\nCamp Map Pass: CA$55 a year (https://buy.stripe.com/aFa28sfgl6dd4BX9sM1gs0e) or CA$5 a month (https://buy.stripe.com/14A3cw3xDbxx1pLdJ21gs0g). It includes: Offline maps: save whole regions to the phone and use the map with no signal at all; The full scouting list of remote camping spots with signal (free shows the top few); Work-week picks: the best spots to work from over the next three days (signal, open sky for Starlink, flat ground, forecast); The hunting view in full: units and zones, cut-block ages, winter ranges, trail-camera signal, the nearest place to call, and the hunting scouting picks; For AI assistants: the work_week and hunting_spots tools, full find_spots results, hunting details in check_spot, and a 10 times higher rate limit.\n\nRate limits per minute: 120 requests without a pass, 1200 with one (429 with Retry-After when exceeded). Data licences and sources: https://camp.cosmicotter.ca/about."},"servers":[{"url":"https://camp.cosmicotter.ca"}],"components":{"securitySchemes":{"pass":{"type":"http","scheme":"bearer","description":"The user's Camp Map Pass key, copied from the app (Layers › Camp Map Pass › Use with AI assistants)."}}},"paths":{"/api/v1/check_spot":{"get":{"operationId":"check_spot","summary":"Can I camp here, and will I have signal?","description":"Land status at a point (Crown/public land, park, private, reserve…) with the camping rule that applies, special areas (parks, pass zones, tree farm licences), estimated mobile signal per carrier, active logging, the nearest road and its surface, and where to check fire bans. Hunting details are included only with a Camp Map Pass.","tags":["Free"],"security":[{},{"pass":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees (WGS84)."},"description":"Latitude in decimal degrees (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/find_spots":{"get":{"operationId":"find_spots","summary":"Remote camping spots with signal near a place","description":"Ranked camping spots near a point that are remote and still have signal for the carrier. Free: the top 3, with how many more the Camp Map Pass adds. With the pass: up to `limit`. access=rental keeps spots on pavement or under 500 m of unpaved road (most rental agreements exclude unpaved roads).","tags":["Free"],"security":[{},{"pass":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees (WGS84)."},"description":"Latitude in decimal degrees (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":200,"default":50,"description":"Search radius in kilometres (default 50, at most 200)."},"description":"Search radius in kilometres (default 50, at most 200)."},{"name":"carrier","in":"query","required":false,"schema":{"type":"string","enum":["telus","rogers","freedom","sasktel","verizon","att","tmobile","gci","inland"],"description":"Mobile carrier to rank signal for. Canada: telus (also Bell, Koodo, Virgin), rogers (also Fido), freedom, sasktel. US: verizon, att, tmobile, gci, inland. Defaults to telus in Canada and verizon in the US."},"description":"Mobile carrier to rank signal for. Canada: telus (also Bell, Koodo, Virgin), rogers (also Fido), freedom, sasktel. US: verizon, att, tmobile, gci, inland. Defaults to telus in Canada and verizon in the US."},{"name":"access","in":"query","required":false,"schema":{"type":"string","enum":["any","rental","drive","rough","hike"],"default":"any","description":"any; rental (on or near pavement); drive (paved or gravel); rough (rough or unpaved roads); hike (hike-in or boat access)."},"description":"any; rental (on or near pavement); drive (paved or gravel); rough (rough or unpaved roads); hike (hike-in or boat access)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/plan_trip":{"get":{"operationId":"plan_trip","summary":"Everything for one destination in one call","description":"One call that answers \"can I camp at this spot this weekend?\": land status and the camping rule, signal per carrier, the 3-day forecast with workable days, wildfires within 60 km, road reports within 10 km, and the best remote spots with signal nearby (top 3 free, 5 with a pass), with the important heads_up lines listed first.","tags":["Free"],"security":[{},{"pass":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees (WGS84)."},"description":"Latitude in decimal degrees (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":200,"default":40,"description":"Search radius in kilometres (default 40, at most 200)."},"description":"Search radius in kilometres (default 40, at most 200)."},{"name":"carrier","in":"query","required":false,"schema":{"type":"string","enum":["telus","rogers","freedom","sasktel","verizon","att","tmobile","gci","inland"],"description":"Mobile carrier to rank signal for. Canada: telus (also Bell, Koodo, Virgin), rogers (also Fido), freedom, sasktel. US: verizon, att, tmobile, gci, inland. Defaults to telus in Canada and verizon in the US."},"description":"Mobile carrier to rank signal for. Canada: telus (also Bell, Koodo, Virgin), rogers (also Fido), freedom, sasktel. US: verizon, att, tmobile, gci, inland. Defaults to telus in Canada and verizon in the US."},{"name":"access","in":"query","required":false,"schema":{"type":"string","enum":["any","rental","drive","rough","hike"],"default":"any"}},{"name":"tz_offset_min","in":"query","required":false,"schema":{"type":"integer","description":"Minutes from UTC for day boundaries. Default -420."},"description":"Minutes from UTC for day boundaries. Default -420."}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/work_week":{"get":{"operationId":"work_week","summary":"Best spots to work from this week (Camp Map Pass)","description":"Camp Map Pass only (CA$55 a year or CA$5 a month). Ranks nearby spots by signal for the carrier, open sky for Starlink and flat ground, then adds each spot's 3-day forecast and marks workable days (under 2 mm rain, wind under 35 km/h).","tags":["Camp Map Pass"],"security":[{"pass":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees (WGS84)."},"description":"Latitude in decimal degrees (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":200,"default":60,"description":"Search radius in kilometres (default 60, at most 200)."},"description":"Search radius in kilometres (default 60, at most 200)."},{"name":"carrier","in":"query","required":false,"schema":{"type":"string","enum":["telus","rogers","freedom","sasktel","verizon","att","tmobile","gci","inland"],"description":"Mobile carrier to rank signal for. Canada: telus (also Bell, Koodo, Virgin), rogers (also Fido), freedom, sasktel. US: verizon, att, tmobile, gci, inland. Defaults to telus in Canada and verizon in the US."},"description":"Mobile carrier to rank signal for. Canada: telus (also Bell, Koodo, Virgin), rogers (also Fido), freedom, sasktel. US: verizon, att, tmobile, gci, inland. Defaults to telus in Canada and verizon in the US."},{"name":"tz_offset_min","in":"query","required":false,"schema":{"type":"integer","description":"Minutes from UTC for day boundaries, e.g. -420 for Pacific daylight time. Default -420."},"description":"Minutes from UTC for day boundaries, e.g. -420 for Pacific daylight time. Default -420."}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/hunting_spots":{"get":{"operationId":"hunting_spots","summary":"Hunting scouting picks (Camp Map Pass)","description":"Camp Map Pass only (CA$55 a year or CA$5 a month). Access points near 5-10 year old cut blocks and winter ranges, with the hunting unit and trail-camera signal. Seasons and bag limits are not included; the official regulations are the source for those.","tags":["Camp Map Pass"],"security":[{"pass":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees (WGS84)."},"description":"Latitude in decimal degrees (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":200,"default":50,"description":"Search radius in kilometres (default 50, at most 200)."},"description":"Search radius in kilometres (default 50, at most 200)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/weather":{"get":{"operationId":"weather","summary":"3-day weather at a point","description":"Current conditions and a 3-day outlook (min/max °C, rain mm, wind km/h) from Environment Canada in Canada and the US National Weather Service in the US, MET Norway as a fallback.","tags":["Free"],"security":[{},{"pass":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees (WGS84)."},"description":"Latitude in decimal degrees (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},{"name":"tz_offset_min","in":"query","required":false,"schema":{"type":"integer","description":"Minutes from UTC for day boundaries. Default -420."},"description":"Minutes from UTC for day boundaries. Default -420."}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/wildfires":{"get":{"operationId":"wildfires","summary":"Wildfires near a point","description":"Active wildfire hotspots, perimeters and incidents within a radius, nearest first, from CWFIS (Canada) and NIFC (US).","tags":["Free"],"security":[{},{"pass":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees (WGS84)."},"description":"Latitude in decimal degrees (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":200,"default":60,"description":"Search radius in kilometres (default 60, at most 200)."},"description":"Search radius in kilometres (default 60, at most 200)."}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/road_reports":{"get":{"operationId":"road_reports","summary":"Recent road and camp reports","description":"Field reports from map users within a radius in the last 120 days: road fine for a car, rough, 4x4 only, washout, gate open or locked, log hauling, turnaround room, camped here, closed, no-camping sign.","tags":["Free"],"security":[{},{"pass":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees (WGS84)."},"description":"Latitude in decimal degrees (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":50,"default":10,"description":"Search radius in kilometres (default 10, at most 50)."},"description":"Search radius in kilometres (default 10, at most 50)."}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/camp_map_pass":{"get":{"operationId":"camp_map_pass","summary":"Camp Map Pass: what it adds and how to buy it","description":"What the Camp Map Pass adds over the free map (offline maps, the full scouting list, work-week picks, the full hunting view, more for AI assistants), its prices (CA$55 a year or CA$5 a month), direct purchase links, and how the user gives the pass to an assistant. Also says whether the current request carries a valid pass. Covers offline use, more spots, work-week picks, hunting details and upgrading.","tags":["Free"],"security":[{},{"pass":[]}],"parameters":[],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/start_pass_purchase":{"get":{"operationId":"start_pass_purchase","summary":"Start buying the Camp Map Pass in this conversation","description":"Begin a Camp Map Pass purchase without leaving the conversation: returns checkout links (CA$55 a year or CA$5 a month, Stripe, no account) tagged with a purchase reference. The user pays in their browser; the reference identifies that payment afterwards.","tags":["Free"],"security":[{},{"pass":[]}],"parameters":[],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/pass_status":{"get":{"operationId":"pass_status","summary":"Collect the pass key after the user has paid","description":"Checks whether the payment for a purchase reference has completed. Returns pending (with a retry interval) or paid with the pass key, which is sent as \"Authorization: Bearer <key>\" from then on, plus a link that activates the pass in the user's own map.","tags":["Free"],"security":[{},{"pass":[]}],"parameters":[{"name":"reference","in":"query","required":true,"schema":{"type":"string","description":"The reference from start_pass_purchase (ag_…)."},"description":"The reference from start_pass_purchase (ag_…)."}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/report_conditions":{"get":{"operationId":"report_conditions","summary":"Store a field report (Camp Map Pass)","description":"Stores a one-tap field report at a point, the same kind the map's users leave (kinds: road-good, road-rough, road-4x4, washout, gate-open, gate-locked, spot-ok, spot-closed, no-camping, hauling, turnaround, no-turnaround, rig-ok, low-clearance; vehicle: car, awd, 4x4, van, rv, unk). Needs the user's Camp Map Pass key; at most 10 stored reports a day per key. No free text.","tags":["Camp Map Pass"],"security":[{"pass":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees (WGS84)."},"description":"Latitude in decimal degrees (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},{"name":"kind","in":"query","required":true,"schema":{"type":"string","enum":["road-good","road-rough","road-4x4","washout","gate-open","gate-locked","spot-ok","spot-closed","no-camping","hauling","turnaround","no-turnaround","rig-ok","low-clearance"]}},{"name":"vehicle","in":"query","required":false,"schema":{"type":"string","enum":["car","awd","4x4","van","rv","unk"],"default":"unk"}}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/confirm_spot":{"get":{"operationId":"confirm_spot","summary":"Confirm what a spot was like (Camp Map Pass)","description":"Stores what the user found at a camping spot (outcome: camped, signal_worked, signal_failed, road_as_described, road_worse, closed, no_camping_sign), read by the next scouting-list build. Needs the user's Camp Map Pass key; shares the daily cap of 10 stored reports.","tags":["Camp Map Pass"],"security":[{"pass":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude in decimal degrees (WGS84)."},"description":"Latitude in decimal degrees (WGS84)."},{"name":"lng","in":"query","required":true,"schema":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},"description":"Longitude in decimal degrees (WGS84), negative west of Greenwich."},{"name":"outcome","in":"query","required":true,"schema":{"type":"string","enum":["camped","signal_worked","signal_failed","road_as_described","road_worse","closed","no_camping_sign"]}},{"name":"name","in":"query","required":false,"schema":{"type":"string","description":"The spot name as the map shows it, if known."},"description":"The spot name as the map shows it, if known."}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/trip_feedback":{"get":{"operationId":"trip_feedback","summary":"Answer three questions after a trip (Camp Map Pass)","description":"Stores the user's answers after a trip planned with plan_trip (its followup token): camped there or not, whether the signal worked (worked, weak, none) and whether the road was as described (as_described, worse, better). Stored beside the forecast that was given. Needs the user's Camp Map Pass key.","tags":["Camp Map Pass"],"security":[{"pass":[]}],"parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"The followup.token from the plan_trip answer."},"description":"The followup.token from the plan_trip answer."},{"name":"camped","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"signal","in":"query","required":false,"schema":{"type":"string","enum":["worked","weak","none"]}},{"name":"road","in":"query","required":false,"schema":{"type":"string","enum":["as_described","worse","better"]}}],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}},"/api/v1/list_regions":{"get":{"operationId":"list_regions","summary":"Areas the map covers","description":"The provinces, territories and states the Camp Map covers, with their bounding boxes, when their data was built and their offline packs.","tags":["Free"],"security":[{},{"pass":[]}],"parameters":[],"responses":{"200":{"description":"Result as JSON"},"400":{"description":"Bad input"},"402":{"description":"Needs a Camp Map Pass key"},"429":{"description":"Rate limited: wait and retry (see Retry-After)"}}}}}}