# create_facility

Add a place: a stay, transport, tour, food or parking.

`POST /v1/guides/{productId}/facilities` · MCP tool `create_facility` · scope `write` · stable · since 2026-09-17

costRaw and openRaw stay the creator's own words (180 USD a night, June to October); they are never parsed. website is optional and may be http (accepted with a warning); a place with only a map link is fine. mapsUrl is an allowlisted map link; give lat and lon too so the apps can map the place and show its distance to the spot (a text search link can open a namesake). Link it to routes with set_route_facilities, to spots with spotKeys. The response carries warnings that did not stop the write.

## Path parameters

- `productId` (string, required): Id of the guide (a product of type map). From list_guides or create_guide.

## Body parameters

- `kind` (string, required): hut (a stay), cable_car (transport), activity (tours and activities), food (food and drink) or parking. One of `hut`, `cable_car`, `activity`, `food`, `parking`.
- `name` (string, required): Name of the place. Cannot be empty.
- `activity` (ActivityInfo or null, optional): Tours and activities (kind activity), null clears: { meetingPoint?, meetingLat?, meetingLon?, durationMin?, departures?, requiredToSee? (the only way to see the spot), authorizedBy?, authorizedByUrl? }.
  Fields of ActivityInfo: https://developers.sceniq.earth/fields/activity-info.md
- `bookingRequired` (boolean, optional): true shows Booking required.
- `bookingUrl` (string, optional): The page to book on (http or https).
- `conditions` (PlaceConditions or null, optional): null clears: { minAge?, guestsOnly?, swimmersOnly?, luggageKg?, soldAsPackage?, cashOnly? }, shown as chips.
  Fields of PlaceConditions: https://developers.sceniq.earth/fields/place-conditions.md
- `costRaw` (string, optional): Price as the creator states it, e.g. 180 USD a night or 92 CHF half board; never parsed (costUnit says what it counts). Empty string clears.
- `costUnit` (string or null, optional): What costRaw counts: per_person, per_night, per_person_night, per_room, per_vehicle, per_trip, per_hour, per_day. null clears. One of `per_person`, `per_night`, `per_person_night`, `per_room`, `per_vehicle`, `per_trip`, `per_hour`, `per_day`.
- `country` (string, optional): ISO 3166-1 alpha-2 code (AR, BR): places on two sides of a border read right.
- `description` (string, optional): The place in the creator's words. Empty string clears.
- `extraKinds` (array of strings, optional): Further roles of the same place (a hut that is also a restaurant): [hut|cable_car|activity|food|parking]. It then shows under each. One of `hut`, `cable_car`, `activity`, `food`, `parking`.
- `extraProps` (array of ExtraProp, optional): Free label and value rows shown on the card, full replacement ([] clears), at most 24: [{ label (at most 60 characters), value (at most 500) }]. A row with both sides empty is dropped, a half-empty one refused.
  Fields of ExtraProp: https://developers.sceniq.earth/fields/extra-prop.md
- `factsCheckedOn` (string, optional): The day the facts were last checked against their sources (YYYY-MM-DD). Empty string clears.
- `fees` (array of Fee, optional): 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.
  Fields of Fee: https://developers.sceniq.earth/fields/fee.md
- `gatewayTown` (string, optional): The town the place sits in when it is far from the spot on purpose (Ushuaia for an Antarctic cruise); no distance is shown then. Empty string clears.
- `googlePlaceId` (string, optional): Google place id the pin came from, as a reference.
- `insideId` (string or null, optional): facilityId of the place this one sits inside (a restaurant inside a lodge); one level only. null clears.
- `lat` (number or null, optional): The place's own latitude. With lon, the apps show it on the map and compute its distance to the spot; null clears.
- `links` (array of GuideLink, optional): Links with a purpose, full replacement ([] clears), at most 12: [{ kind: official|website|tickets|booking|status|timetable|tide|listing|social|authority|app|other, label?, url? (http or https; http is accepted with a warning), value? (a channel that is not a URL, e.g. WeChat mini program: Li River boats), note? }]. Each needs a url or a value.
  Fields of GuideLink: https://developers.sceniq.earth/fields/guide-link.md
- `lon` (number or null, optional): The place's own longitude.
- `mapsUrl` (string, optional): Map link: https on Google Maps, Apple Maps, Swisstopo, OpenStreetMap or SchweizMobil, or a geo: URI. Give lat and lon too. Empty string clears.
- `needsParentTicket` (boolean, optional): true when entering needs the parent place's ticket.
- `openRaw` (string, optional): Season or hours as text, never parsed (schedule holds structured hours). Empty string clears.
- `operator` (string, optional): Who runs it. Empty string clears.
- `osmId` (string, optional): OpenStreetMap reference the pin came from: node/123, way/456 or relation/789.
- `parking` (ParkingInfo or null, optional): Parking places, null clears: { fillsBy? (10:00), rule? (the only legal pullout) }.
  Fields of ParkingInfo: https://developers.sceniq.earth/fields/parking-info.md
- `reviewBy` (string, optional): 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.
- `reviewNotes` (string, optional): 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.
- `schedule` (Schedule or null, optional): 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.
  Fields of Schedule: https://developers.sceniq.earth/fields/schedule.md
- `sources` (array of SourceRef, optional): 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) }].
  Fields of SourceRef: https://developers.sceniq.earth/fields/source-ref.md
- `spotKeys` (array of strings, optional): spotKeys of the spots it serves directly (a hotel near a viewpoint), in order and each once, full replacement ([] clears), at most 200. Archived spots are allowed.
- `status` (StatusNotice or null, optional): 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.
  Fields of StatusNotice: https://developers.sceniq.earth/fields/status-notice.md
- `transport` (TransportInfo or null, optional): Transport places, null clears: { stops?: [{ name, lat?, lon?, registerId? (NSR or GTFS stop id), note? }], serviceDays? [1-7], timetableUrl?, timetableValidFrom?, timetableValidUntil?, verifyBeforeTravel? }.
  Fields of TransportInfo: https://developers.sceniq.earth/fields/transport-info.md
- `type` (string, optional): Optional sub-type. Stays: hotel, guesthouse, hostel, hut, campsite, rental, liveaboard, pontoon. Transport: cable_car, chairlift, funicular, cog_railway, train, bus, ferry, shuttle, flight, helicopter, tram, metro, taxi, bike_rental, jeep, elevator, toboggan, hub. Tours and activities: guided_tour, boat_tour, balloon, scenic_flight, jeep_safari, gear_rental. Food: restaurant, cafe, bar, bakery, grocery, market, picnic_site. Parking: parking_lot, parking_garage, street, campervan. A place without one reads as its kind's default (hut, cable_car, guided_tour, restaurant or parking_lot); empty string clears.
- `website` (string, optional): Link to the official site (https, or http with a warning). Empty string clears.

## Returns

201: PlaceWrite.

- `facilityId` (string, required): The place's id.
- `kind` (string, required): hut (a stay), cable_car (transport), activity (tours), food or parking. One of `hut`, `cable_car`, `activity`, `food`, `parking`.
- `type` (string or null, required): The sub-type (hotel, ferry, restaurant ...), or null for the kind's default.
- `spotKeys` (array of strings, required): The spots it serves directly, in order.
- `name` (string, required): The place's name.
- `operator` (string or null, required): Who runs it.
- `description` (string or null, required): The place in the creator's words.
- `costRaw` (string or null, required): The price as the creator states it.
- `openRaw` (string or null, required): Season or hours as text.
- `website` (string or null, required): The official site.
- `mapsUrl` (string or null, required): Map link.
- `extraProps` (array of ExtraProp, required): Free label and value rows.
  Fields of ExtraProp: https://developers.sceniq.earth/fields/extra-prop.md
- `lat` (number or null, required): The place's own latitude.
- `lon` (number or null, required): The place's own longitude.
- `osmId` (string or null, required): OpenStreetMap reference.
- `googlePlaceId` (string or null, required): Google place id.
- `country` (string or null, required): ISO 3166-1 alpha-2 code.
- `timeZone` (string or null, required): IANA time zone, from the pin.
- `links` (array of GuideLink, required): Links with a purpose.
  Fields of GuideLink: https://developers.sceniq.earth/fields/guide-link.md
- `bookingRequired` (boolean, required): true shows Booking required.
- `bookingUrl` (string or null, required): The page to book on.
- `extraKinds` (array of strings, required): Further roles of the same place. One of `hut`, `cable_car`, `activity`, `food`, `parking`.
- `insideId` (string or null, required): The place this one sits inside.
- `needsParentTicket` (boolean, required): true when entering needs the parent place's ticket.
- `conditions` (PlaceConditions or null, required): Conditions shown as chips.
  Fields of PlaceConditions: https://developers.sceniq.earth/fields/place-conditions.md
- `costUnit` (string or null, required): What costRaw counts. One of `per_person`, `per_night`, `per_person_night`, `per_room`, `per_vehicle`, `per_trip`, `per_hour`, `per_day`.
- `parking` (ParkingInfo or null, required): Parking details.
  Fields of ParkingInfo: https://developers.sceniq.earth/fields/parking-info.md
- `transport` (TransportInfo or null, required): Transport details.
  Fields of TransportInfo: https://developers.sceniq.earth/fields/transport-info.md
- `activity` (ActivityInfo or null, required): Tour and activity details.
  Fields of ActivityInfo: https://developers.sceniq.earth/fields/activity-info.md
- `gatewayTown` (string or null, required): The town the place sits in when it is far from the spot on purpose.
- `status` (StatusNotice or null, required): A closure notice.
  Fields of StatusNotice: https://developers.sceniq.earth/fields/status-notice.md
- `fees` (array of Fee, required): Fees and tickets.
  Fields of Fee: https://developers.sceniq.earth/fields/fee.md
- `schedule` (Schedule or null, required): Structured opening hours.
  Fields of Schedule: https://developers.sceniq.earth/fields/schedule.md
- `sources` (array of SourceRef, required): Research evidence, never shown to buyers.
  Fields of SourceRef: https://developers.sceniq.earth/fields/source-ref.md
- `reviewNotes` (string or null, required): Notes for the creator's review, never shown to buyers.
- `factsCheckedOn` (string or null, required): The day the facts were last checked (YYYY-MM-DD).
- `reviewBy` (string or null, required): The day the facts need a new check (YYYY-MM-DD).
- `createdAt` (number, required): When the row was created (Unix time in milliseconds).
- `updatedAt` (number, required): When the row last changed (Unix time in milliseconds).
- `warnings` (array of strings, optional): Notes about things the write accepted but you should look at (a plain http link). Present only when there are any.

## Examples

### Add a stay near a spot, with its pin, booking link, season and sources

```bash
curl -X POST "https://sceniq.earth/api/v1/guides/j5738kd1q9x2m7v4c6b8n0p3r5t1w9y2/facilities" \
  -H "Authorization: Bearer $SCENIQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "kind": "hut",
  "type": "hotel",
  "name": "Old Faithful Inn",
  "operator": "Yellowstone National Park Lodges",
  "description": "The 1904 log lodge next to Old Faithful, 15 minutes by car from the Fairy Falls trailhead. Old House rooms sell out first.",
  "costRaw": "From 190 USD a night, Old House room with a shared bath (summer 2026)",
  "costUnit": "per_night",
  "openRaw": "Early May to early October",
  "website": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
  "mapsUrl": "https://maps.apple.com/?ll=44.4598,-110.8311&q=Old%20Faithful%20Inn",
  "lat": 44.4598,
  "lon": -110.8311,
  "country": "US",
  "spotKeys": [
    "01M2Z1G0Y0QG7M2V6N9R3T5W8Y"
  ],
  "bookingRequired": true,
  "bookingUrl": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
  "links": [
    {
      "kind": "booking",
      "label": "Book a room",
      "url": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/"
    },
    {
      "kind": "official",
      "label": "Old Faithful area (NPS)",
      "url": "https://www.nps.gov/yell/planyourvisit/exploreoldfaithful.htm"
    }
  ],
  "schedule": {
    "hours": [
      {
        "closed": true,
        "note": "Closed in winter"
      },
      {
        "from": "05-08",
        "to": "10-04",
        "note": "Open to overnight guests. Check-in from 16:00."
      }
    ],
    "validFrom": "2026-05-08",
    "validUntil": "2026-10-04",
    "sourceUrl": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
    "checkedOn": "2026-09-20"
  },
  "sources": [
    {
      "url": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
      "kind": "page",
      "capturedOn": "2026-09-20",
      "supports": [
        "costRaw",
        "openRaw",
        "schedule"
      ]
    }
  ],
  "factsCheckedOn": "2026-09-20",
  "reviewBy": "2027-03-01"
}'
```

MCP `tools/call`:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "create_facility",
    "arguments": {
      "productId": "j5738kd1q9x2m7v4c6b8n0p3r5t1w9y2",
      "kind": "hut",
      "type": "hotel",
      "name": "Old Faithful Inn",
      "operator": "Yellowstone National Park Lodges",
      "description": "The 1904 log lodge next to Old Faithful, 15 minutes by car from the Fairy Falls trailhead. Old House rooms sell out first.",
      "costRaw": "From 190 USD a night, Old House room with a shared bath (summer 2026)",
      "costUnit": "per_night",
      "openRaw": "Early May to early October",
      "website": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
      "mapsUrl": "https://maps.apple.com/?ll=44.4598,-110.8311&q=Old%20Faithful%20Inn",
      "lat": 44.4598,
      "lon": -110.8311,
      "country": "US",
      "spotKeys": [
        "01M2Z1G0Y0QG7M2V6N9R3T5W8Y"
      ],
      "bookingRequired": true,
      "bookingUrl": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
      "links": [
        {
          "kind": "booking",
          "label": "Book a room",
          "url": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/"
        },
        {
          "kind": "official",
          "label": "Old Faithful area (NPS)",
          "url": "https://www.nps.gov/yell/planyourvisit/exploreoldfaithful.htm"
        }
      ],
      "schedule": {
        "hours": [
          {
            "closed": true,
            "note": "Closed in winter"
          },
          {
            "from": "05-08",
            "to": "10-04",
            "note": "Open to overnight guests. Check-in from 16:00."
          }
        ],
        "validFrom": "2026-05-08",
        "validUntil": "2026-10-04",
        "sourceUrl": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
        "checkedOn": "2026-09-20"
      },
      "sources": [
        {
          "url": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
          "kind": "page",
          "capturedOn": "2026-09-20",
          "supports": [
            "costRaw",
            "openRaw",
            "schedule"
          ]
        }
      ],
      "factsCheckedOn": "2026-09-20",
      "reviewBy": "2027-03-01"
    }
  }
}
```

Response 201:

```json
{
  "facilityId": "km73j9h5g1f7d3s9a5p1p7j3v9y5t1r7",
  "kind": "hut",
  "type": "hotel",
  "spotKeys": [
    "01M2Z1G0Y0QG7M2V6N9R3T5W8Y"
  ],
  "name": "Old Faithful Inn",
  "operator": "Yellowstone National Park Lodges",
  "description": "The 1904 log lodge next to Old Faithful, 15 minutes by car from the Fairy Falls trailhead. Old House rooms sell out first.",
  "costRaw": "From 190 USD a night, Old House room with a shared bath (summer 2026)",
  "openRaw": "Early May to early October",
  "website": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
  "mapsUrl": "https://maps.apple.com/?ll=44.4598,-110.8311&q=Old%20Faithful%20Inn",
  "extraProps": [],
  "lat": 44.4598,
  "lon": -110.8311,
  "osmId": null,
  "googlePlaceId": null,
  "country": "US",
  "timeZone": "America/Denver",
  "links": [
    {
      "kind": "booking",
      "label": "Book a room",
      "url": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/"
    },
    {
      "kind": "official",
      "label": "Old Faithful area (NPS)",
      "url": "https://www.nps.gov/yell/planyourvisit/exploreoldfaithful.htm"
    }
  ],
  "bookingRequired": true,
  "bookingUrl": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
  "extraKinds": [],
  "insideId": null,
  "needsParentTicket": false,
  "conditions": null,
  "costUnit": "per_night",
  "parking": null,
  "transport": null,
  "activity": null,
  "gatewayTown": null,
  "status": null,
  "fees": [],
  "schedule": {
    "hours": [
      {
        "closed": true,
        "note": "Closed in winter"
      },
      {
        "from": "05-08",
        "to": "10-04",
        "note": "Open to overnight guests. Check-in from 16:00."
      }
    ],
    "validFrom": "2026-05-08",
    "validUntil": "2026-10-04",
    "sourceUrl": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
    "checkedOn": "2026-09-20"
  },
  "sources": [
    {
      "url": "https://www.yellowstonenationalparklodges.com/lodging/summer-lodges/old-faithful-inn/",
      "kind": "page",
      "capturedOn": "2026-09-20",
      "supports": [
        "costRaw",
        "openRaw",
        "schedule"
      ]
    }
  ],
  "reviewNotes": null,
  "factsCheckedOn": "2026-09-20",
  "reviewBy": "2027-03-01",
  "createdAt": 1789895640000,
  "updatedAt": 1789895640000
}
```

### An expedition ship that leaves from a gateway town far from the spot

```bash
curl -X POST "https://sceniq.earth/api/v1/guides/j57dq4n8r2v6x0b4f8k2p6t0w4y8c2g6/facilities" \
  -H "Authorization: Bearer $SCENIQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "kind": "activity",
  "type": "boat_tour",
  "extraKinds": [
    "hut"
  ],
  "name": "Expedition cruise from Ushuaia",
  "description": "Ten nights on a small expedition ship: two days across the Drake Passage, then landings on the Peninsula. Most itineraries sail the Lemaire Channel when the ice allows.",
  "costRaw": "From 9,800 USD per person in a twin cabin (2026-27 season)",
  "costUnit": "per_person",
  "openRaw": "Departures from early November to mid March",
  "mapsUrl": "https://www.google.com/maps/search/?api=1&query=-54.8069,-68.302",
  "lat": -54.8069,
  "lon": -68.302,
  "country": "AR",
  "gatewayTown": "Ushuaia",
  "spotKeys": [
    "01KXFYF4Y0A3C6E9G2J5K8N1Q4"
  ],
  "bookingRequired": true,
  "conditions": {
    "soldAsPackage": true,
    "minAge": 8
  },
  "activity": {
    "meetingPoint": "Port of Ushuaia, main pier",
    "meetingLat": -54.8069,
    "meetingLon": -68.302,
    "durationMin": 14400,
    "departures": "About every ten days from early November to mid March",
    "requiredToSee": true,
    "authorizedBy": "IAATO member operators",
    "authorizedByUrl": "https://iaato.org/"
  },
  "fees": [
    {
      "label": "Twin cabin, 10 nights",
      "amount": 9800,
      "currency": "USD",
      "per": "person",
      "paidWhere": "online",
      "note": "The lowest fare of the season; suites and single cabins cost more.",
      "validFrom": "2026-11-01",
      "validUntil": "2027-03-20",
      "checkedOn": "2026-09-20"
    }
  ],
  "links": [
    {
      "kind": "authority",
      "label": "IAATO member operators",
      "url": "https://iaato.org/"
    }
  ],
  "sources": [
    {
      "title": "Operator brochure, 2026-27 season (PDF from the creator)",
      "kind": "document",
      "capturedOn": "2026-09-18",
      "supports": [
        "costRaw",
        "fees",
        "activity"
      ]
    }
  ],
  "reviewNotes": "Fares are from one operator'\''s brochure; ask the creator which operator the guide should name.",
  "factsCheckedOn": "2026-09-20",
  "reviewBy": "2027-03-20"
}'
```

MCP `tools/call`:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "create_facility",
    "arguments": {
      "productId": "j57dq4n8r2v6x0b4f8k2p6t0w4y8c2g6",
      "kind": "activity",
      "type": "boat_tour",
      "extraKinds": [
        "hut"
      ],
      "name": "Expedition cruise from Ushuaia",
      "description": "Ten nights on a small expedition ship: two days across the Drake Passage, then landings on the Peninsula. Most itineraries sail the Lemaire Channel when the ice allows.",
      "costRaw": "From 9,800 USD per person in a twin cabin (2026-27 season)",
      "costUnit": "per_person",
      "openRaw": "Departures from early November to mid March",
      "mapsUrl": "https://www.google.com/maps/search/?api=1&query=-54.8069,-68.302",
      "lat": -54.8069,
      "lon": -68.302,
      "country": "AR",
      "gatewayTown": "Ushuaia",
      "spotKeys": [
        "01KXFYF4Y0A3C6E9G2J5K8N1Q4"
      ],
      "bookingRequired": true,
      "conditions": {
        "soldAsPackage": true,
        "minAge": 8
      },
      "activity": {
        "meetingPoint": "Port of Ushuaia, main pier",
        "meetingLat": -54.8069,
        "meetingLon": -68.302,
        "durationMin": 14400,
        "departures": "About every ten days from early November to mid March",
        "requiredToSee": true,
        "authorizedBy": "IAATO member operators",
        "authorizedByUrl": "https://iaato.org/"
      },
      "fees": [
        {
          "label": "Twin cabin, 10 nights",
          "amount": 9800,
          "currency": "USD",
          "per": "person",
          "paidWhere": "online",
          "note": "The lowest fare of the season; suites and single cabins cost more.",
          "validFrom": "2026-11-01",
          "validUntil": "2027-03-20",
          "checkedOn": "2026-09-20"
        }
      ],
      "links": [
        {
          "kind": "authority",
          "label": "IAATO member operators",
          "url": "https://iaato.org/"
        }
      ],
      "sources": [
        {
          "title": "Operator brochure, 2026-27 season (PDF from the creator)",
          "kind": "document",
          "capturedOn": "2026-09-18",
          "supports": [
            "costRaw",
            "fees",
            "activity"
          ]
        }
      ],
      "reviewNotes": "Fares are from one operator's brochure; ask the creator which operator the guide should name.",
      "factsCheckedOn": "2026-09-20",
      "reviewBy": "2027-03-20"
    }
  }
}
```

Response 201:

```json
{
  "facilityId": "km7s8v2w4y6a8c0e2g4j6k8m0p2q4s6v",
  "kind": "activity",
  "type": "boat_tour",
  "spotKeys": [
    "01KXFYF4Y0A3C6E9G2J5K8N1Q4"
  ],
  "name": "Expedition cruise from Ushuaia",
  "operator": null,
  "description": "Ten nights on a small expedition ship: two days across the Drake Passage, then landings on the Peninsula. Most itineraries sail the Lemaire Channel when the ice allows.",
  "costRaw": "From 9,800 USD per person in a twin cabin (2026-27 season)",
  "openRaw": "Departures from early November to mid March",
  "website": null,
  "mapsUrl": "https://www.google.com/maps/search/?api=1&query=-54.8069,-68.302",
  "extraProps": [],
  "lat": -54.8069,
  "lon": -68.302,
  "osmId": null,
  "googlePlaceId": null,
  "country": "AR",
  "timeZone": "America/Argentina/Ushuaia",
  "links": [
    {
      "kind": "authority",
      "label": "IAATO member operators",
      "url": "https://iaato.org/"
    }
  ],
  "bookingRequired": true,
  "bookingUrl": null,
  "extraKinds": [
    "hut"
  ],
  "insideId": null,
  "needsParentTicket": false,
  "conditions": {
    "soldAsPackage": true,
    "minAge": 8
  },
  "costUnit": "per_person",
  "parking": null,
  "transport": null,
  "activity": {
    "meetingPoint": "Port of Ushuaia, main pier",
    "meetingLat": -54.8069,
    "meetingLon": -68.302,
    "durationMin": 14400,
    "departures": "About every ten days from early November to mid March",
    "requiredToSee": true,
    "authorizedBy": "IAATO member operators",
    "authorizedByUrl": "https://iaato.org/"
  },
  "gatewayTown": "Ushuaia",
  "status": null,
  "fees": [
    {
      "label": "Twin cabin, 10 nights",
      "amount": 9800,
      "currency": "USD",
      "per": "person",
      "paidWhere": "online",
      "note": "The lowest fare of the season; suites and single cabins cost more.",
      "validFrom": "2026-11-01",
      "validUntil": "2027-03-20",
      "checkedOn": "2026-09-20"
    }
  ],
  "schedule": null,
  "sources": [
    {
      "title": "Operator brochure, 2026-27 season (PDF from the creator)",
      "kind": "document",
      "capturedOn": "2026-09-18",
      "supports": [
        "costRaw",
        "fees",
        "activity"
      ]
    }
  ],
  "reviewNotes": "Fares are from one operator's brochure; ask the creator which operator the guide should name.",
  "factsCheckedOn": "2026-09-20",
  "reviewBy": "2027-03-20",
  "createdAt": 1790673240000,
  "updatedAt": 1790673240000
}
```

## Errors

- `invalid_argument` (400): A 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).
- `invalid_request` (400): A 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.
- `unauthenticated` (401): The request carries no key. Send it as Authorization: Bearer sk_sceniq_... (or X-Api-Key).
- `invalid_api_key` (401): The key is unknown, revoked or expired.
- `api_scope_required` (403): A read-only key called a write operation, or a key without the publish option called publish_changes.
- `forbidden` (403): The key belongs to a creator account that is no longer active.
- `not_found` (404): The id does not exist or belongs to another creator. The two answers are identical on purpose, so ids never reveal what exists.
- `payload_too_large` (413): A JSON body over 2 MB, an image over 6 MB, a batch upload over 19 MB, or an MCP message over 2 MB.
- `rate_limited` (429): Over a limit: requests per key per minute, per creator per hour, uploads per key per minute, or check_links per guide per hour.
- `internal_error` (500): An unexpected failure. The message is hidden on purpose.

Reference: https://developers.sceniq.earth/reference/create_facility
