Skip to main content
Glama

PermitSnag

Check recorded openings for a permit or campground

check_availability
Read-onlyIdempotent

Shows what PermitSnag has recorded for one US backcountry permit or one campground over a range of up to 62 days. Answers come from PermitSnag's own stored checks of the booking site, not a live look, and nothing is booked. Each date has one state: observed_opening (an opening seen recently, with when it was last seen), observed_no_match (a recent check that saw no opening, with its time), stale (the newest check is older than staleAfterHours, with its time), unknown (no usable check of that date), unreleased (not on sale yet, by the agency's release rule or the booking site), off_season (outside the agency's published season), closed (closed by the agency) or unsupported (PermitSnag does not check this place). Neither stale nor unknown means sold out. Permit dates are shown as they stood 15 minutes ago. For a permit split into zones or entry points, our checks may cover only some of them, so a date with no opening seen comes back as unknown, never as observed_no_match.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
permitNoThe permit id or slug from search_permits. Give this or campground, not both.
endDateNoLast date, YYYY-MM-DD, inclusive. Defaults to startDate. The range covers at most 62 days, counting both ends.
startDateYesFirst date, YYYY-MM-DD, read as the place's own local calendar day (for a campground, the night you arrive).
campgroundNoThe campground id from search_campgrounds. Give this or permit, not both.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
daysNo
pastNoPresent only when every asked date has passed.
alertNo
datesNo
depthNo
foundNoPresent, and false, only when nothing matched.
sourceNo
subjectNo
checkedAtNo
freshnessNo
scanRouteNoHow PermitSnag reaches this permit for cancellation openings: direct, through a zone or starting area, through its entry points, or none.
partialScopeNoPermits only: true when our checks may cover only some zones or entry points, so no date is called "no opening".
staleAfterHoursNoHours. A check older than this is never reported as observed; it is reported as stale (or as unknown, when partialScope hides a check that saw no opening).
publicDelayMinutesNoPermits only: dates are described as they stood this many minutes ago.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / endDate / description
      Previous value: -"Last date, YYYY-MM-DD, inclusive. Defaults to startDate. At most 62 days after startDate."New value: +"Last date, YYYY-MM-DD, inclusive. Defaults to startDate. The range covers at most 62 days, counting both ends."
    • changedOutput schema / description
      Previous value: -"PermitSnag's recorded checks of one permit or campground on the asked dates, each with its age. Not a live look at the booking site. Or found: false, or past: true."New value: +"PermitSnag's recorded checks of one permit or campground on the asked dates; an observed or stale date carries the time and age of its check. Not a live look at the booking site. Or found: false, or past: true."
    • changedOutput schema / properties / days / items / properties / observedAt / description
      Previous value: -"When the check behind an observed or stale state was made, ISO 8601."New value: +"The time of the check behind an observed or stale state (for an opening, when it was last seen), ISO 8601. For a permit, never later than publicDelayMinutes ago."
    • changedOutput schema / properties / days / items / properties / state / description
      Previous value: -"What PermitSnag recorded for this date. unknown is never sold out."New value: +"What PermitSnag recorded for this date. Neither stale nor unknown means sold out."
    • changedOutput schema / properties / staleAfterHours / description
      Previous value: -"A check older than this is reported as stale."New value: +"Hours. A check older than this is never reported as observed; it is reported as stale (or as unknown, when partialScope hides a check that saw no opening)."
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": false,
      +  "anyOf": [
      +    {
      +      "required": [
      +        "subject",
      +        "depth",
      +        "dates",
      +        "staleAfterHours",
      +        "freshness",
      +        "days",
      +        "alert",
      +        "source",
      +        "checkedAt"
      +      ]
      +    },
      +    {
      +      "required": [
      +        "found"
      +      ]
      +    },
      +    {
      +      "required": [
      +        "past"
      +      ]
      +    }
      +  ],
      +  "description": "PermitSnag's recorded checks of one permit or campground on the asked dates, each with its age. Not a live look at the booking site. Or found: false, or past: true.",
      +  "properties": {
      +    "alert": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "available": {
      +          "description": "True only when PermitSnag can send an alert for this place right now.",
      +          "type": "boolean"
      +        },
      +        "pageUrl": {
      +          "description": "The PermitSnag page where an alert is set up, or where to read what to do instead.",
      +          "type": "string"
      +        },
      +        "reason": {
      +          "description": "Why an alert is or is not on offer.",
      +          "enum": [
      +            "eligible",
      +            "lottery_period",
      +            "out_of_season",
      +            "closed",
      +            "no_quota_now",
      +            "lottery_draw_only",
      +            "not_sold_online",
      +            "not_tracked"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "available",
      +        "reason",
      +        "pageUrl"
      +      ],
      +      "type": "object"
      +    },
      +    "checkedAt": {
      +      "type": "string"
      +    },
      +    "dates": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "calendar": {
      +          "const": "local_day"
      +        },
      +        "end": {
      +          "type": "string"
      +        },
      +        "start": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "start",
      +        "end",
      +        "calendar"
      +      ],
      +      "type": "object"
      +    },
      +    "days": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "ageMinutes": {
      +            "description": "Minutes since that check.",
      +            "type": "integer"
      +          },
      +          "date": {
      +            "description": "YYYY-MM-DD, the place's own local calendar day.",
      +            "type": "string"
      +          },
      +          "lastSeenState": {
      +            "description": "For a stale date: what that old check saw.",
      +            "enum": [
      +              "observed_opening",
      +              "observed_no_match"
      +            ]
      +          },
      +          "observedAt": {
      +            "description": "When the check behind an observed or stale state was made, ISO 8601.",
      +            "type": "string"
      +          },
      +          "openSites": {
      +            "description": "Campgrounds at site level only: sites seen open.",
      +            "type": "integer"
      +          },
      +          "releaseKind": {
      +            "enum": [
      +              "lottery",
      +              "reservations",
      +              null
      +            ]
      +          },
      +          "releasesOn": {
      +            "description": "For an unreleased date: the sourced day it goes on sale, when known.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "state": {
      +            "description": "What PermitSnag recorded for this date. unknown is never sold out.",
      +            "enum": [
      +              "observed_opening",
      +              "observed_no_match",
      +              "stale",
      +              "unknown",
      +              "unreleased",
      +              "off_season",
      +              "closed",
      +              "unsupported"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "date",
      +          "state"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 62,
      +      "type": "array"
      +    },
      +    "depth": {
      +      "enum": [
      +        "permit_level",
      +        "site_level",
      +        "campground_level"
      +      ]
      +    },
      +    "found": {
      +      "const": false,
      +      "description": "Present, and false, only when nothing matched."
      +    },
      +    "freshness": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "band": {
      +          "enum": [
      +            "none",
      +            "recent",
      +            "stale"
      +          ]
      +        },
      +        "newestObservedAt": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "oldestObservedAt": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "band",
      +        "newestObservedAt",
      +        "oldestObservedAt"
      +      ],
      +      "type": "object"
      +    },
      +    "partialScope": {
      +      "description": "Permits only: true when our checks may cover only some zones or entry points, so no date is called \"no opening\".",
      +      "type": "boolean"
      +    },
      +    "past": {
      +      "const": true,
      +      "description": "Present only when every asked date has passed."
      +    },
      +    "publicDelayMinutes": {
      +      "description": "Permits only: dates are described as they stood this many minutes ago.",
      +      "type": "number"
      +    },
      +    "scanRoute": {
      +      "description": "How PermitSnag reaches this permit for cancellation openings: direct, through a zone or starting area, through its entry points, or none.",
      +      "enum": [
      +        "direct",
      +        "via_zone",
      +        "via_children",
      +        "none",
      +        null
      +      ]
      +    },
      +    "source": {
      +      "const": "permitsnag_recorded_checks"
      +    },
      +    "staleAfterHours": {
      +      "description": "A check older than this is reported as stale.",
      +      "type": "number"
      +    },
      +    "subject": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "id": {
      +          "type": "string"
      +        },
      +        "kind": {
      +          "enum": [
      +            "permit",
      +            "campground"
      +          ]
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "pageUrl": {
      +          "type": "string"
      +        },
      +        "slug": {
      +          "description": "Permits only.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "id",
      +        "name",
      +        "pageUrl"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  3. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources