list_spots

All spots of a guide in editor order.

GET/v1/guides/{productId}/spots
MCP tool list_spotsScope: readStableSince 2026-09-17
Markdown

Includes archived spots (flagged). Each spot carries its spotKey, which chapters and routes reference.

curl "https://sceniq.earth/api/v1/guides/j5738kd1q9x2m7v4c6b8n0p3r5t1w9y2/spots" \
  -H "Authorization: Bearer $SCENIQ_API_KEY"

Path parameters

Returns

200 OK with this object.

  • productIdstring · guide idrequired

    The guide's id.

  • spotsarray of Spotrequired

    Every spot in editor order, archived ones included.

    Show 42 fieldsof Spot
    • spotIdstring · spot idrequired

      The spot's id.

    • spotKeystringrequired

      The spot's stable key within the guide; chapters and routes reference spots by it.

    • productIdstring · guide idrequired

      The guide the spot belongs to.

    • titlestringrequired

      The place name.

    • kickerstring or nullrequired

      The short line above the title (region or type).

    • latnumber or nullrequired

      Latitude in decimal degrees, or null when the pin is not set yet.

    • lonnumber or nullrequired

      Longitude in decimal degrees, or null when the pin is not set yet.

    • mapsUrlstring or nullrequired

      The creator's own map link.

    • shortDescriptionstring or nullrequired

      One or two sentences for the card.

    • longDescriptionstring or nullrequired

      The full write-up.

    • colorstring or nullrequired

      Pin color as a hex value, or null for the default.

    • cardOrientationstringrequired

      Photo framing in the viewer.

      portraitlandscape
    • customValuesmap of valuesrequired

      Custom property values keyed by property key; option values are option ids.

    • tripFactsTripFacts or nullrequired

      The planning stats bar.

      Show 5 fieldsof TripFacts
      • elevationMnumberoptional

        Elevation in meters (-500 to 9,000). 0 is a stated sea level; absent is unknown.

      • elevationRefersTostringoptional

        What the elevation measures: viewpoint, summit, ground, water or trailhead.

        viewpointsummitgroundwatertrailhead
      • elevationSourcestringoptional

        Where the number comes from, at most 300 characters.

      • busynessnumberoptional

        Crowds from 1 (quiet) to 5 (packed), shown as Crowdedness.

      • bestSeasonstringoptional

        The best season in words, at most 200 characters.

    • arrivalArrival or nullrequired

      How to get there.

      Show 10 fieldsof Arrival
      • byCarobjectoptional

        Driving and parking.

        Show 6 fields
        • directionsstringoptional

          The drive in words, at most 2,000 characters.

        • parkingstringoptional

          Where to park, at most 1,000 characters.

        • walkToSpotMinnumberoptional

          Minutes on foot from the car to the spot.

        • walkRoundTripbooleanoptional

          true when walkToSpotMin is there and back.

        • nonebooleanoptional

          true when the spot has no car access.

        • notestringoptional

          One more line about driving, at most 500 characters.

      • byTrainBusobjectoptional

        Public transport.

        Show 5 fields
        • routestringoptional

          The connection in words, at most 2,000 characters.

        • walkFromStopMinnumberoptional

          Minutes on foot from the stop to the spot.

        • walkRoundTripbooleanoptional

          true when walkFromStopMin is there and back.

        • nonebooleanoptional

          true when there is no public transport.

        • notestringoptional

          One more line about public transport, at most 500 characters.

      • byBoatstringoptional

        The boat connection in words, at most 2,000 characters.

      • byAirobjectoptional

        Flights or helicopter.

        Show 7 fields
        • airportsarray of stringsoptional

          Up to 8 IATA or ICAO codes (LUA, VNLK).

        • routestringoptional

          The flight in words, at most 2,000 characters.

        • minutesnumberoptional

          Flight time in minutes.

        • operatorUrlstringoptional

          The operator's page (http or https).

        • luggageKgnumberoptional

          The luggage limit in kilograms (1 to 200).

        • nonebooleanoptional

          true when there is no air access.

        • notestringoptional

          One more line about flying, at most 500 characters.

      • onFootArrivalModeBlockoptional

        Walking in.

        Show 5 fieldsof ArrivalModeBlock
        • routestringoptional

          The way in words, at most 2,000 characters.

        • minutesnumberoptional

          Minutes it takes.

        • roundTripbooleanoptional

          true when minutes is there and back.

        • nonebooleanoptional

          true when this mode is not possible.

        • notestringoptional

          One more line, at most 500 characters.

      • byBikeArrivalModeBlockoptional

        Cycling in.

        Show 5 fieldsof ArrivalModeBlock
        • routestringoptional

          The way in words, at most 2,000 characters.

        • minutesnumberoptional

          Minutes it takes.

        • roundTripbooleanoptional

          true when minutes is there and back.

        • nonebooleanoptional

          true when this mode is not possible.

        • notestringoptional

          One more line, at most 500 characters.

      • bestTimestringoptional

        The best time to go in words, at most 1,000 characters.

      • operatingstringoptional

        When the access runs (seasons, hours of a road or a ferry), at most 2,000 characters.

      • approachesarray of objectsoptional

        Up to 6 ways in, for spots with several approaches or chains of legs (a flight, then a jeep, then a walk).

        Show 8 fields
        • labelstringrequired

          The approach's name, at most 80 characters (Argentine side).

        • countrystringoptional

          ISO 3166-1 alpha-2 code of the country it starts in (AR).

        • legsarray of objectsoptional

          Up to 12 legs in order.

          Show 8 fields
          • modestringrequired

            car, bus, train, tram, metro, cable_car, funicular, boat, ferry, plane, helicopter, shuttle, jeep, walk, bike, taxi or other.

            carbustraintrammetrocable_carfunicularboatferryplanehelicoptershuttlejeepwalkbiketaxiother
          • fromstringoptional

            Where the leg starts, at most 120 characters.

          • tostringoptional

            Where the leg ends, at most 120 characters.

          • minutesnumberoptional

            Minutes the leg takes.

          • roundTripbooleanoptional

            true when minutes is there and back.

          • pricestringoptional

            The leg's price in words, at most 80 characters.

          • paymentstringoptional

            How the leg is paid, at most 80 characters.

          • notestringoptional

            One line for the leg, at most 300 characters.

        • hoursstringoptional

          When the approach runs, at most 300 characters.

        • entrystringoptional

          What entry takes on this side, at most 300 characters.

        • notestringoptional

          One more line, at most 500 characters.

        • latnumberoptional

          Latitude of the approach's start.

        • lonnumberoptional

          Longitude of the approach's start.

      • rulesarray of AccessRuleoptional

        Up to 20 access rules (reservations, permits), each shown in its months.

        Show 6 fieldsof AccessRule
        • textstringrequired

          The rule in the creator's words, at most 300 characters.

        • kindstringoptional

          reservation, permit, guide, registration, no_independent_travel, vehicle or other.

          reservationpermitguideregistrationno_independent_travelvehicleother
        • monthsarray of numbersoptional

          The months the rule applies (1 to 12); the apps show it only then. Absent means all year.

        • appliesTostringoptional

          car for a rule that only binds drivers (a timed entry for vehicles), all for everyone.

          carall
        • bookingOpensstringoptional

          When booking opens, in words, at most 100 characters (90 days ahead at 07:00).

        • sourceUrlstringoptional

          The page that states the rule (http or https).

    • mapLinksarray of MapLinkrequired

      Extra map links, drawn as map pills.

      Show 2 fieldsof MapLink
      • labelstringrequired

        The pill text, at most 40 characters.

      • urlstringrequired

        An https page or an allowlisted map link.

    • imagesEnabledbooleanrequired

      false hides the photo section from buyers.

    • customPropsEnabledbooleanrequired

      false hides the custom properties from buyers.

    • archivedbooleanrequired

      true when the spot is hidden from buyers but kept.

    • refstring or nullrequired

      Your own stable key for upsert_spots.

    • accessModestring or nullrequired

      How visitors reach the spot, shown as Accessibility.

      drive_upshort_walkhikemulti_dayboatcable_cartrainflighttour_onlyaerial_only
    • pinLabelstring or nullrequired

      What the main pin marks, for a spot that is an area or a line.

    • pinsarray of SpotPinrequired

      Extra points: viewpoints, entrances, trailheads, parking.

      Show 6 fieldsof SpotPin
      • kindstringrequired

        viewpoint, entrance, gate, trailhead, parking, stop, pier, summit or other.

        viewpointentrancegatetrailheadparkingstoppiersummitother
      • labelstringrequired

        What buyers read next to the pin, at most 80 characters (South rim viewpoint).

      • latnumberrequired

        Latitude in decimal degrees (-90 to 90), from the creator's material or a cited source.

      • lonnumberrequired

        Longitude in decimal degrees (-180 to 180).

      • monthsarray of numbersoptional

        The months the point is reachable (1 to 12). Absent means all year.

      • notestringoptional

        One line of context, at most 300 characters.

    • linksarray of GuideLinkrequired

      Links with a purpose.

      Show 5 fieldsof GuideLink
      • kindstringrequired

        What the link is for. official and website are the place's own pages; tickets and booking sell entry or rooms; status, timetable and tide carry live conditions; listing, social, authority and app cover the rest.

        officialwebsiteticketsbookingstatustimetabletidelistingsocialauthorityappother
      • labelstringoptional

        The link text buyers see, at most 60 characters. Without it the apps name the link by its kind.

      • urlstringoptional

        An http or https page. http is accepted with a warning.

      • valuestringoptional

        A channel that is not a URL, at most 200 characters, for example a WeChat mini program and its search term.

      • notestringoptional

        One line of context shown under the link, at most 300 characters.

    • statusStatusNotice or nullrequired

      A closure or works notice.

      Show 6 fieldsof StatusNotice
      • statestringrequired

        open, partly_closed, closed or reopening. reopening with until means it reopens on that day.

        openpartly_closedclosedreopening
      • notestringoptional

        What is closed or changed, in the creator's words, at most 500 characters.

      • sincestringoptional

        The day the state began (YYYY-MM-DD).

      • untilstringoptional

        The day the state is expected to end (YYYY-MM-DD). Must not be before since.

      • sourceUrlstringoptional

        The page that announced it (http or https).

      • checkedOnstringoptional

        The day the value was last checked against its source (YYYY-MM-DD).

    • feesarray of Feerequired

      Fees and tickets.

      Show 14 fieldsof Fee
      • labelstringrequired

        What the fee is for, at most 80 characters (Adult entry, Car park, Boat transfer).

      • amountnumberoptional

        The price in major units (40, 12.5). Needs currency. Absent when the fee is free or left to the official page.

      • currencystringoptional

        ISO 4217 code (USD, EUR, ARS). Required with amount.

      • freebooleanoptional

        true for no charge. Cannot be combined with an amount.

      • seeOfficialbooleanoptional

        true for a price the guide leaves to the official page on purpose (it changes too often to copy).

      • perstringoptional

        What one amount pays for: person, vehicle, night, group, entry, day or hour.

        personvehiclenightgroupentrydayhour
      • audiencestringoptional

        Who pays this rate: all, adult, child, foreign, domestic, resident, student or senior.

        alladultchildforeigndomesticresidentstudentsenior
      • paidWherestringoptional

        Where it is paid: online, on_site or in_tour (part of a tour price).

        onlineon_sitein_tour
      • paymentstringoptional

        How it can be paid: cash_only, card_only or cash_or_card.

        cash_onlycard_onlycash_or_card
      • notestringoptional

        One line of context, at most 300 characters (free on the first Sunday of the month).

      • validFromstringoptional

        The first day the price applies (YYYY-MM-DD).

      • validUntilstringoptional

        The last day the price applies (YYYY-MM-DD). Readiness flags the row after it.

      • sourceUrlstringoptional

        The page the price comes from (http or https).

      • checkedOnstringoptional

        The day the value was last checked against its source (YYYY-MM-DD).

    • scheduleSchedule or nullrequired

      Structured opening hours.

      Show 8 fieldsof Schedule
      • hoursarray of HoursBandoptional

        Up to 24 bands; the last matching band wins.

        Show 11 fieldsof HoursBand
        • fromstringoptional

          First day of the band as MM-DD. Absent means the start of the year.

        • tostringoptional

          Last day of the band as MM-DD. May wrap over the new year (from 11-01 to 03-31).

        • weekdaysarray of numbersoptional

          The weekdays it covers, 1 (Monday) to 7 (Sunday). Absent means every day.

        • closedbooleanoptional

          true when the place is closed in this band. Otherwise open and close are required.

        • openstringoptional

          Opening time as HH:MM, or sunrise or sunset.

        • closestringoptional

          Closing time as HH:MM, or sunrise or sunset.

        • openOffsetMinnumberoptional

          Minutes around a sun anchor for open (-240 to 240; -60 is an hour before sunrise).

        • closeOffsetMinnumberoptional

          Minutes around a sun anchor for close (-240 to 240).

        • lastEntrystringoptional

          Last entry as HH:MM.

        • leaveBystringoptional

          The time visitors must be out as HH:MM.

        • notestringoptional

          One line for the band, at most 200 characters.

      • specialDaysarray of objectsoptional

        Up to 40 days that differ from the bands: a date or a rule, closed or with their own times.

        Show 6 fields
        • datestringoptional

          The day (YYYY-MM-DD). Give a date or a rule.

        • rulestringoptional

          A recurring day in words, at most 120 characters (first Sunday of the month).

        • closedbooleanoptional

          true when the place is closed that day.

        • openstringoptional

          Opening time that day as HH:MM, or sunrise or sunset.

        • closestringoptional

          Closing time that day as HH:MM, or sunrise or sunset.

        • notestringoptional

          One line for the day, at most 200 characters.

      • slotsobjectoptional

        Timed entry: entries every everyMin minutes from first to last.

        Show 5 fields
        • firststringrequired

          The first entry time as HH:MM.

        • laststringrequired

          The last entry time as HH:MM.

        • everyMinnumberrequired

          Minutes between entries.

        • capnumberoptional

          People per slot, when the source states it (1 to 100,000).

        • notestringoptional

          One line about booking a slot, at most 200 characters.

      • validFromstringoptional

        The first day these hours apply (YYYY-MM-DD).

      • validUntilstringoptional

        The last day these hours apply (YYYY-MM-DD).

      • sourceUrlstringoptional

        The page the hours come from (http or https).

      • checkedOnstringoptional

        The day the value was last checked against its source (YYYY-MM-DD).

      • notestringoptional

        A note for the whole schedule, at most 500 characters.

    • featuresarray of SpotFeaturerequired

      Parts of the site with their own rules.

      Show 8 fieldsof SpotFeature
      • namestringrequired

        The part's name, at most 80 characters.

      • notestringoptional

        What to know about it, at most 500 characters.

      • hoursstringoptional

        Its hours in words, at most 200 characters.

      • entrystringoptional

        Its entry rule or price in words, at most 200 characters.

      • seasonstringoptional

        When it is open in words, at most 200 characters.

      • feesarray of Feeoptional

        Its own fees, as the spot's fees.

        Show 14 fieldsof Fee
        • labelstringrequired

          What the fee is for, at most 80 characters (Adult entry, Car park, Boat transfer).

        • amountnumberoptional

          The price in major units (40, 12.5). Needs currency. Absent when the fee is free or left to the official page.

        • currencystringoptional

          ISO 4217 code (USD, EUR, ARS). Required with amount.

        • freebooleanoptional

          true for no charge. Cannot be combined with an amount.

        • seeOfficialbooleanoptional

          true for a price the guide leaves to the official page on purpose (it changes too often to copy).

        • perstringoptional

          What one amount pays for: person, vehicle, night, group, entry, day or hour.

          personvehiclenightgroupentrydayhour
        • audiencestringoptional

          Who pays this rate: all, adult, child, foreign, domestic, resident, student or senior.

          alladultchildforeigndomesticresidentstudentsenior
        • paidWherestringoptional

          Where it is paid: online, on_site or in_tour (part of a tour price).

          onlineon_sitein_tour
        • paymentstringoptional

          How it can be paid: cash_only, card_only or cash_or_card.

          cash_onlycard_onlycash_or_card
        • notestringoptional

          One line of context, at most 300 characters (free on the first Sunday of the month).

        • validFromstringoptional

          The first day the price applies (YYYY-MM-DD).

        • validUntilstringoptional

          The last day the price applies (YYYY-MM-DD). Readiness flags the row after it.

        • sourceUrlstringoptional

          The page the price comes from (http or https).

        • checkedOnstringoptional

          The day the value was last checked against its source (YYYY-MM-DD).

      • statusStatusNoticeoptional

        Its own closure notice.

        Show 6 fieldsof StatusNotice
        • statestringrequired

          open, partly_closed, closed or reopening. reopening with until means it reopens on that day.

          openpartly_closedclosedreopening
        • notestringoptional

          What is closed or changed, in the creator's words, at most 500 characters.

        • sincestringoptional

          The day the state began (YYYY-MM-DD).

        • untilstringoptional

          The day the state is expected to end (YYYY-MM-DD). Must not be before since.

        • sourceUrlstringoptional

          The page that announced it (http or https).

        • checkedOnstringoptional

          The day the value was last checked against its source (YYYY-MM-DD).

      • urlstringoptional

        Its own page (http or https).

    • restrictionsarray of Restrictionrequired

      Rules on site.

      Show 8 fieldsof Restriction
      • kindstringrequired

        no_photo, wide_only (shown as Wide shots only), no_drone, no_entry, no_stopping, no_parking or other.

        no_photowide_onlyno_droneno_entryno_stoppingno_parkingother
      • labelstringrequired

        The rule as buyers read it, at most 80 characters.

      • notestringoptional

        More context, at most 300 characters.

      • latnumberoptional

        Latitude of the point the rule applies around.

      • lonnumberoptional

        Longitude of the point the rule applies around.

      • radiusMnumberoptional

        The radius around lat and lon in meters (1 to 100,000).

      • linearray of array of numbersoptional

        A stretch of road or trail instead of a point: 2 to 200 [lon, lat] positions.

      • sourceUrlstringoptional

        The page that states the rule (http or https).

    • eventsarray of SpotEventrequired

      Events worth timing a visit for.

      Show 7 fieldsof SpotEvent
      • namestringrequired

        The event's name, at most 80 characters.

      • whenstringrequired

        When, in words, at most 200 characters (every night at 19:45 and 20:45).

      • datesarray of stringsoptional

        Exact dates when known (YYYY-MM-DD, up to 60). Readiness lists events whose dates have all passed.

      • monthsarray of numbersoptional

        The months it happens (1 to 12).

      • urlstringoptional

        The event's page (http or https).

      • freebooleanoptional

        true when it costs nothing to watch.

      • notestringoptional

        One line of context, at most 300 characters.

    • foodFoodNote or nullrequired

      Why the spot lists no food places.

      Show 2 fieldsof FoodNote
      • statusstringrequired

        included (meals come with the lodge or boat), none_nearby, or bring_your_own.

        includednone_nearbybring_your_own
      • notestringoptional

        One line of context, at most 300 characters.

    • areaIdstring or nullrequired

      The area (park, island, region) the spot sits in.

    • timeZonestring or nullrequired

      IANA time zone, derived from the pin unless set by hand.

    • timeZoneManualbooleanrequired

      true when the time zone was set by hand rather than from the pin.

    • customNotesmap of stringsrequired

      One short note per custom property value, keyed by property key.

    • sourcesarray of SourceRefrequired

      Research evidence for the review, never shown to buyers.

      Show 7 fieldsof SourceRef
      • urlstringoptional

        The page, API or archive copy the facts come from (http or https).

      • titlestringoptional

        A name for a source without a URL (a park leaflet, a phone call with the operator), at most 200 characters.

      • kindstringoptional

        page, api, archive, document or other.

        pageapiarchivedocumentother
      • capturedOnstringoptional

        The day the source was read (YYYY-MM-DD).

      • notestringoptional

        What the source says or why it was chosen, at most 500 characters.

      • supportsarray of stringsoptional

        Which facts it backs, up to 12 entries of at most 60 characters (fees, arrival.operating, lat/lon).

      • conflictbooleanoptional

        true when this source disagrees with another on the facts it backs. Say which one the value follows in note or reviewNotes.

    • reviewNotesstring or nullrequired

      Notes for the creator's review, never shown to buyers.

    • factsCheckedOnstring or nullrequired

      The day the facts were last checked (YYYY-MM-DD).

    • reviewBystring or nullrequired

      The day the facts need a new check (YYYY-MM-DD).

    • siteChangeSiteChange or nullrequired

      The day something at the spot changed.

      Show 2 fieldsof SiteChange
      • onstringrequired

        The day of the change (YYYY-MM-DD). Required.

      • notestringoptional

        What changed, at most 300 characters.

    • createdAtnumberrequired

      When the row was created (Unix time in milliseconds).

    • updatedAtnumberrequired

      When the row last changed (Unix time in milliseconds).

Response 200
{
  "productId": "j5738kd1q9x2m7v4c6b8n0p3r5t1w9y2",
  "spots": [
    {
      "spotId": "k1709e2vj4sk8q6x0d3m5r7t9w1y3b5c",
      "spotKey": "01M2Z1G0Y0QG7M2V6N9R3T5W8Y",
      "productId": "j5738kd1q9x2m7v4c6b8n0p3r5t1w9y2",
      "title": "Grand Prismatic Spring",
      "kicker": "Yellowstone, Midway Geyser Basin",
      "lat": 44.5251,
      "lon": -110.8382,
      "mapsUrl": "https://maps.apple.com/?ll=44.5251,-110.8382&q=Grand%20Prismatic%20Spring",
      "shortDescription": "The largest hot spring in the United States. See it from the boardwalk, then from the overlook above the Fairy Falls trail.",
      "longDescription": "Grand Prismatic is about 110 meters across, and from the boardwalk you mostly see steam and the orange mats that run off toward the Firehole River. For the colors, park at the Fairy Falls trailhead and follow the trail to the signed spur for the overlook: about 1 km each way, 20 minutes up. The whole spring opens up below the platform. Come on a warm, dry morning; on a cold day the steam hides everything.",
      "color": null,
      "cardOrientation": "landscape",
      "customValues": {
        "best_time": "morning",
        "crowds": "packed",
        "photo_notes": "From the overlook a 24 mm lens takes in the whole spring. On the boardwalk, shoot the runoff channels instead of the steam."
      },
      "tripFacts": {
        "elevationM": 2176,
        "elevationRefersTo": "ground",
        "busyness": 5,
        "bestSeason": "Late May to September"
      },
      "arrival": {
        "byCar": {
          "directions": "Grand Loop Road, 11 km north of Old Faithful. Midway Geyser Basin lot.",
          "parking": "Midway Geyser Basin lot, full by 10:00 in summer. Fairy Falls trailhead lot 1.6 km south.",
          "walkToSpotMin": 10
        },
        "byTrainBus": {
          "none": true
        },
        "bestTime": "Mid morning on a warm, dry day: cold air turns the steam into fog that hides the colors."
      },
      "mapLinks": [],
      "imagesEnabled": true,
      "customPropsEnabled": true,
      "archived": false,
      "ref": null,
      "accessMode": "short_walk",
      "pinLabel": null,
      "pins": [
        {
          "kind": "viewpoint",
          "label": "Grand Prismatic Overlook",
          "lat": 44.5192,
          "lon": -110.8391,
          "note": "Platform on a spur of the Fairy Falls trail, about 1 km from the trailhead lot."
        },
        {
          "kind": "parking",
          "label": "Fairy Falls trailhead lot",
          "lat": 44.5153,
          "lon": -110.8325,
          "note": "For the overlook. Full by mid morning in July and August."
        }
      ],
      "links": [
        {
          "kind": "official",
          "url": "https://www.nps.gov/places/000/grand-prismatic-spring.htm",
          "label": "Grand Prismatic Spring (NPS)"
        },
        {
          "kind": "status",
          "url": "https://www.nps.gov/yell/planyourvisit/conditions.htm",
          "label": "Park road status"
        }
      ],
      "status": null,
      "fees": [],
      "schedule": null,
      "features": [],
      "restrictions": [
        {
          "kind": "no_drone",
          "label": "No drones in the park",
          "note": "Drones are banned in all US national parks."
        },
        {
          "kind": "no_entry",
          "label": "Stay on the boardwalk",
          "note": "The crust around the spring is thin, and the water under it is scalding."
        }
      ],
      "events": [],
      "food": null,
      "areaId": "area_01m3gvdap06m6mx2kp4t553d6g",
      "timeZone": "America/Denver",
      "timeZoneManual": false,
      "customNotes": {
        "crowds": "Quieter before 9:00 and after 18:00"
      },
      "sources": [
        {
          "url": "https://www.nps.gov/places/000/grand-prismatic-spring.htm",
          "kind": "page",
          "capturedOn": "2026-09-20",
          "supports": [
            "arrival",
            "restrictions"
          ]
        }
      ],
      "reviewNotes": "The overlook pin comes from your GPX of 18 September; please confirm it. The trail distance is from the NPS page (0.6 mi each way).",
      "factsCheckedOn": "2026-09-20",
      "reviewBy": "2027-04-01",
      "siteChange": null,
      "createdAt": 1789895640000,
      "updatedAt": 1790586840000
    },
    {
      "spotId": "k17bc3xz8h6f4d2s0q9w7e5r3t1y2v4j",
      "spotKey": "01M2Z1G0Y0R2K5P8S1V4X7Z0C3",
      "productId": "j5738kd1q9x2m7v4c6b8n0p3r5t1w9y2",
      "title": "Tunnel View",
      "kicker": "Yosemite Valley",
      "lat": 37.7156,
      "lon": -119.677,
      "mapsUrl": "https://www.google.com/maps/search/?api=1&query=37.7156,-119.677",
      "shortDescription": "El Capitan, Half Dome and Bridalveil Fall in one frame, at the east end of the Wawona Tunnel.",
      "longDescription": null,
      "color": null,
      "cardOrientation": "landscape",
      "customValues": {
        "best_time": "sunset",
        "crowds": "busy"
      },
      "tripFacts": null,
      "arrival": {
        "byCar": {
          "directions": "Wawona Road (Highway 41), at the east end of the Wawona Tunnel.",
          "parking": "Lots on both sides of the road; the north lot fills first at sunset.",
          "walkToSpotMin": 1
        },
        "bestTime": "The hour before sunset, or when a winter storm starts to clear."
      },
      "mapLinks": [],
      "imagesEnabled": true,
      "customPropsEnabled": true,
      "archived": false,
      "ref": "yose-tunnel-view",
      "accessMode": "drive_up",
      "pinLabel": null,
      "pins": [],
      "links": [],
      "status": null,
      "fees": [],
      "schedule": null,
      "features": [],
      "restrictions": [],
      "events": [],
      "food": null,
      "areaId": "area_01m3gvgcb04pf38p66vz544w1b",
      "timeZone": "America/Los_Angeles",
      "timeZoneManual": false,
      "customNotes": {},
      "sources": [],
      "reviewNotes": null,
      "factsCheckedOn": null,
      "reviewBy": null,
      "siteChange": null,
      "createdAt": 1789895640000,
      "updatedAt": 1790586840000
    },
    {
      "spotId": "k17rwzt006kbqwjbs5jrqk4jjf5srec9",
      "spotKey": "01M3GYV6A0Y3SYC62RBPEA9S0C",
      "productId": "j5738kd1q9x2m7v4c6b8n0p3r5t1w9y2",
      "title": "Lamar Valley",
      "kicker": "Yellowstone, northeast entrance road",
      "lat": null,
      "lon": null,
      "mapsUrl": null,
      "shortDescription": null,
      "longDescription": null,
      "color": null,
      "cardOrientation": "landscape",
      "customValues": {},
      "tripFacts": null,
      "arrival": null,
      "mapLinks": [],
      "imagesEnabled": true,
      "customPropsEnabled": true,
      "archived": false,
      "ref": null,
      "accessMode": null,
      "pinLabel": null,
      "pins": [],
      "links": [],
      "status": null,
      "fees": [],
      "schedule": null,
      "features": [],
      "restrictions": [],
      "events": [],
      "food": null,
      "areaId": null,
      "timeZone": null,
      "timeZoneManual": false,
      "customNotes": {},
      "sources": [],
      "reviewNotes": "No pin yet: the creator is sending the pullout they use for the bison herds.",
      "factsCheckedOn": null,
      "reviewBy": null,
      "siteChange": null,
      "createdAt": 1789895640000,
      "updatedAt": 1789895640000
    }
  ]
}

Errors

Every error is { error: { code, message } }. Act on the code.

  • 400invalid_argumentA required field is missing, a field is unknown, or a value does not match its type (the Convex validator's path and value are in the message).
  • 401unauthenticatedThe request carries no key. Send it as Authorization: Bearer sk_sceniq_... (or X-Api-Key).
  • 401invalid_api_keyThe key is unknown, revoked or expired.
  • 403forbiddenThe key belongs to a creator account that is no longer active.
  • 404not_foundThe id does not exist or belongs to another creator. The two answers are identical on purpose, so ids never reveal what exists.
  • 429rate_limitedOver a limit: requests per key per minute, per creator per hour, uploads per key per minute, or check_links per guide per hour.
  • 500internal_errorAn unexpected failure. The message is hidden on purpose.