update_spot

Edit a spot (fields, arrival, facts, archive).

PATCH/v1/spots/{spotId}
MCP tool update_spotScope: writeStableSince 2026-09-17
Markdown

Only the fields you send change; an empty string clears a text field, null clears an object, [] clears a list. customValues, arrival, mapLinks and every list are full replacements. archived true hides the spot from buyers but keeps it editable (the safe alternative to deleting once a guide has buyers). The response carries warnings (an http link) that did not stop the write.

curl -X PATCH "https://sceniq.earth/api/v1/spots/k1709e2vj4sk8q6x0d3m5r7t9w1y3b5c" \
  -H "Authorization: Bearer $SCENIQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "areaId": "area_01m3gvdap06m6mx2kp4t553d6g",
  "fees": []
}'

Path parameters

  • spotIdstring · spot idrequired

    Id of the spot (spotId from list_spots).

Body parameters

  • accessModestring or nulloptional

    How visitors reach the spot, shown as Accessibility: drive_up, short_walk, hike, multi_day, boat, cable_car, train, flight, tour_only, aerial_only. null clears. Without it the cell shows the easiest required route's grade, or Drive-up only when arrival.byCar describes a drive.

    drive_upshort_walkhikemulti_dayboatcable_cartrainflighttour_onlyaerial_only
  • archivedbooleanoptional

    true hides the spot from every buyer surface.

  • areaIdstringoptional

    The area (park, island, region) the spot sits in, from set_area; its rules, fees and links show on the spot. Empty string clears.

  • arrivalArrival or nulloptional

    How to get there, full replacement, null clears: { byCar?: { directions, parking, walkToSpotMin, walkRoundTrip? (the minutes are there and back), none? (no car access), note? }, byTrainBus?: { route, walkFromStopMin, walkRoundTrip?, none? (no public transport, which reads differently from an empty field), note? }, byBoat?, byAir?: { airports? (IATA or ICAO codes), route?, minutes?, operatorUrl?, luggageKg?, none?, note? }, onFoot?: { route?, minutes?, roundTrip?, none?, note? }, byBike?: { same }, bestTime?, operating?, approaches?: [{ label (Argentine side), country? (AR), legs?: [{ mode: car|bus|train|tram|metro|cable_car|funicular|boat|ferry|plane|helicopter|shuttle|jeep|walk|bike|taxi|other, from?, to?, minutes?, roundTrip?, price?, payment?, note? }], hours?, entry?, note?, lat?, lon? }] (at most 6, for spots with several ways in or chains of legs), rules?: [{ text, kind?: reservation|permit|guide|registration|no_independent_travel|vehicle|other, months? [1-12] (shown only then), appliesTo?: car|all, bookingOpens?, sourceUrl? }] }.

    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).

  • cardOrientationstringoptional

    portrait or landscape (photo framing in the viewer); a spot without one reads as landscape.

    portraitlandscape
  • colorstringoptional

    Optional pin color hex, e.g. #0071e3. Empty string clears.

  • customNotesmap of stringsoptional

    One short note per custom property value, keyed by property key, shown next to the value (walls 40 EUR, morning from viewpoint 7). Full replacement ({} clears).

  • customPropsEnabledbooleanoptional

    false hides custom properties from buyers; values stay stored.

  • customValuesmap of valuesoptional

    Object keyed by property key (list_properties): text for shortLabel and longSection, a number for number, epoch ms for date, one option id for singleSelect, an array of option ids for checkbox (ids, never labels). Every required property needs a value; keys without a live property are kept unchecked. Sent for an existing spot it replaces the stored object; null for a key clears that value.

  • eventsarray of SpotEventoptional

    Recurring or one-off events worth timing a visit for, full replacement, at most 12: [{ name, when (in words: every night at 19:45 and 20:45), dates? [YYYY-MM-DD] (the apps show the next one), months?, url?, free?, note? }].

    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.

  • factsCheckedOnstringoptional

    The day the facts were last checked against their sources (YYYY-MM-DD). Empty string clears.

  • featuresarray of SpotFeatureoptional

    Parts of the site with their own rules (a monastery's closing day, a ticketed skyway), full replacement, at most 12: [{ name, note?, hours?, entry?, season?, fees? (as fees), status? (as status), url? }].

    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).

  • feesarray of Feeoptional

    Fees and tickets, full replacement ([] clears), at most 30: [{ label, amount? (major units, e.g. 40 or 12.5; needs currency), currency? (EUR), free?, seeOfficial? (a price left to the official page on purpose), per?: person|vehicle|night|group|entry|day|hour, audience?: all|adult|child|foreign|domestic|resident|student|senior, paidWhere?: online|on_site|in_tour, payment?: cash_only|card_only|cash_or_card, note?, validFrom?, validUntil?, sourceUrl?, checkedOn? }]. Buyers see the amount with an as-of date; readiness flags rows past validUntil or unchecked for a year.

    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).

  • foodFoodNote or nulloptional

    Why the spot lists no food places, null clears: { status: included (meals come with the lodge or boat) | none_nearby | bring_your_own, note? }.

    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.

  • imagesEnabledbooleanoptional

    false hides the photo section from buyers; photos stay stored.

  • kickerstringoptional

    Short eyebrow above the title, e.g. Patagonia, Bernese Oberland or Glacier lake. Empty string clears.

  • latnumberoptional

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

  • lonnumberoptional

    Longitude in decimal degrees (-180 to 180).

  • longDescriptionstringoptional

    The full write-up in the creator's voice. Empty string clears.

  • mapsUrlstringoptional

    The creator's own map link: https on Google Maps, Apple Maps, Swisstopo, OpenStreetMap or SchweizMobil, or a geo: URI. Empty string clears.

  • pinLabelstringoptional

    What the main pin marks for a spot that is an area or a line, shown as Pinned: <label> (Ti Top viewpoint). Empty string clears.

  • pinsarray of SpotPinoptional

    Extra points, full replacement ([] clears), at most 12: [{ kind: viewpoint|entrance|gate|trailhead|parking|stop|pier|summit|other, label, lat, lon, months? [1-12] (only reachable then), note? }]. Each gets its own map links and a place on the web map.

    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.

  • refstringoptional

    Your own stable key for this spot (af04-abu-simbel), unique in the guide; upsert_spots matches on it. Empty string clears.

  • restrictionsarray of Restrictionoptional

    Rules on site, full replacement, at most 20: [{ kind: no_photo|wide_only|no_drone|no_entry|no_stopping|no_parking|other, label, note?, lat?, lon?, radiusM?, line? ([[lon, lat], ...] for a stretch of road), sourceUrl? }].

    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).

  • reviewBystringoptional

    The day the facts need a new check (YYYY-MM-DD), e.g. when a season, fare or timetable runs out. get_guide_readiness and get_publish_status warn once it has passed. Empty string clears.

  • reviewNotesstringoptional

    Notes for the creator's review (why a value was chosen, what could not be verified). Never shown to buyers; get_guide_readiness lists them. Empty string clears.

  • scheduleSchedule or nulloptional

    Structured opening hours, null clears; the free-text hours stay the fallback: { hours?: [{ from? (MM-DD), to? (MM-DD, may wrap over the new year), weekdays? [1-7], closed?, open? (HH:MM or sunrise|sunset), close? (HH:MM or sunrise|sunset), openOffsetMin?, closeOffsetMin? (minutes around a sun anchor, -60 = an hour before), lastEntry? (HH:MM), leaveBy? (HH:MM), note? }], specialDays?: [{ date? or rule? (first Sunday of the month), closed?, open?, close?, note? }], slots?: { first, last, everyMin, cap?, note? }, validFrom?, validUntil?, sourceUrl?, checkedOn?, note? }. The last matching band wins, so list the year-round band first and exceptions after it. The apps show today's hours in the spot's time zone.

    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.

  • shortDescriptionstringoptional

    One or two sentences for the card. Empty string clears.

  • siteChangeSiteChange or nulloptional

    The day something at the spot changed (a bridge replaced, boats banned), null clears: { on (YYYY-MM-DD), note? }. Readiness flags photos captured before it.

    Show 2 fieldsof SiteChange
    • onstringrequired

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

    • notestringoptional

      What changed, at most 300 characters.

  • sourcesarray of SourceRefoptional

    Research evidence for reviewers, never shown to buyers; full replacement, at most 40: [{ url? or title?, kind?: page|api|archive|document|other, capturedOn?, note?, supports? (which facts it backs, e.g. fees, arrival.operating, lat/lon), conflict? (true when it disagrees with another source on those facts) }].

    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.

  • statusStatusNotice or nulloptional

    Closure or works notice, null clears: { state: open|partly_closed|closed|reopening, note?, since?, until? (the day the state is expected to end; buyers stop seeing the notice after it), sourceUrl?, checkedOn? }. reopening with until means reopens on that day.

    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).

  • timeZonestringoptional

    IANA zone (America/Phoenix). Derived from the pin on every write; set it only when the lookup is wrong near a border. Empty string hands it back to the pin.

  • titlestringoptional

    Place name as locals know it, e.g. Oeschinensee or Fushimi Inari-taisha. Cannot be empty.

  • tripFactsTripFacts or nulloptional

    The planning stats bar, null clears: { elevationM? (meters; 0 is a stated sea level, absent is unknown), elevationRefersTo?: viewpoint|summit|ground|water|trailhead, elevationSource?, busyness? (1 quiet to 5 packed, shown as Crowdedness), bestSeason? }.

    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.

Returns

200 OK with SpotWrite: A spot after create_spot or update_spot, with the write's warnings.

  • 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).

  • 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.

  • 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).

  • photosarray of objectsrequired

    The spot's photos in gallery order. list_media has every photo field.

    Show 7 fields
    • mediaIdstring · photo idrequired

      The photo's id.

    • urlstringrequired

      The photo's URL.

    • captionstring or nullrequired

      Caption.

    • creditstring or nullrequired

      Photographer credit.

    • widthnumber or nullrequired

      Width in pixels.

    • heightnumber or nullrequired

      Height in pixels.

    • ordernumberrequired

      Position in the spot's gallery (ascending).

  • chaptersarray of objectsrequired

    The chapters and collections the spot belongs to.

    Show 4 fields
    • collectionIdstring · chapter idrequired

      The chapter's or collection's id.

    • namestringrequired

      Its name.

    • kindstringrequired

      chapter carries prose; collection is a plain spot set.

      collectionchapter
    • ordernumberrequired

      The spot's position inside that chapter.

  • routesarray of objectsrequired

    The routes that reach the spot.

    Show 4 fields
    • routeIdstring · route idrequired

      The route's id.

    • namestring or nullrequired

      The route's name.

    • ordernumberrequired

      The spot's position on the route.

    • quickestbooleanrequired

      true when this route is the fastest approach to the spot.

  • warningsarray of stringsoptional

    Notes about things the write accepted but you should look at (a plain http link). Present only when there are any.

Response 200
{
  "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,
  "photos": [
    {
      "mediaId": "kg71s3d5f7g9h1j3k5k7z9x1c3v5b7n9",
      "url": "https://quiet-heron-512.convex.cloud/api/storage/grand-prismatic-overlook.webp",
      "caption": "From the overlook on a clear September morning",
      "credit": "Mara Lindgren",
      "width": 2048,
      "height": 1365,
      "order": 1
    },
    {
      "mediaId": "kg7p2p4j6v8y0t2r4e6w8q0a2s4d6f8g",
      "url": "https://quiet-heron-512.convex.cloud/api/storage/grand-prismatic-aerial.webp",
      "caption": "Runoff channels from the boardwalk",
      "credit": "Mara Lindgren",
      "width": 1365,
      "height": 2048,
      "order": 2
    }
  ],
  "chapters": [
    {
      "collectionId": "kn7e5r9t3y7v1j5p9p3a7s1d5f9g3h7j",
      "name": "Yellowstone",
      "kind": "chapter",
      "order": 1024
    },
    {
      "collectionId": "kn7a2s4d6f8g0h2j4k6k8z0x2c4v6b8n",
      "name": "Top picks",
      "kind": "collection",
      "order": 1024
    }
  ],
  "routes": [
    {
      "routeId": "kx7f2h8j4k0k6z2x8c4v0b6n2m8q4w0e",
      "name": "Fairy Falls trail",
      "order": 1024,
      "quickest": false
    }
  ]
}

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).
  • 400invalid_requestA writer refused a value: a map link on a host that is not allowed, a title that is too long, a date that does not exist, too many items in a list. The message is the writer's own sentence.
  • 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.
  • 403api_scope_requiredA read-only key called a write operation, or a key without the publish option called publish_changes.
  • 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.
  • 413payload_too_largeA JSON body over 2 MB, an image over 6 MB, a batch upload over 19 MB, or an MCP message over 2 MB.
  • 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.