{
 "openapi": "3.1.0",
 "info": {
  "title": "EveryRink agent API",
  "version": "1.0.0",
  "summary": "Read-only public skating, freestyle, stick & puck and drop-in hockey sessions, prices and visitor facts for ice rinks.",
  "description": "EveryRink lists public skating, freestyle, stick & puck and drop-in hockey sessions at ice rinks, with each rink’s address, booking links, structured admission and rental prices, and visitor facts (booking, families, parking, accessibility). Every fact and price carries the official source URL and the date it was checked. A fact checked within 30 days is \"verified\"; an older one is \"due-for-recheck\", and structured prices older than 30 days are not returned at all, exactly as on the rink pages. Sessions come from each rink’s own booking system or published timetable; booking systems are re-read as often as every 15 minutes around upcoming sessions, and published calendars and timetables at least once a day. Each session says when EveryRink last saw it there (verifiedAt). A rink whose schedule shows nothing is described plainly: out of season, dates not posted yet, paused, not listed, or none posted. Never report those as \"zero sessions\". If the schedule could not be read, say so instead of saying there are no sessions. Cite the rink’s EveryRink page (pageUrl). EveryRink does not sell admission: always send people to the rink’s own booking link (bookingUrl) to book, pay, or confirm last-minute changes.\n\nGET only, no key, CORS open, cached at the edge for about five minutes. Times are ISO 8601 with the rink's UTC offset plus its IANA time zone. Session windows are local dates, at most 14 days. The same data as Markdown: https://everyrink.com/rinks.md and every page's .md twin; as an MCP server: https://everyrink.com/mcp.",
  "contact": {
   "name": "EveryRink support",
   "url": "https://everyrink.com/support/"
  }
 },
 "externalDocs": {
  "description": "llms.txt: what EveryRink covers, freshness, citation and limits",
  "url": "https://everyrink.com/llms.txt"
 },
 "servers": [
  {
   "url": "https://everyrink.com"
  }
 ],
 "paths": {
  "/v1/agent/rinks": {
   "get": {
    "operationId": "findRinks",
    "summary": "Find rinks by name, place, distance, region or country",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Words that must all appear in the rink name, town, postal code, region or country (accents ignored).",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "near",
      "in": "query",
      "required": false,
      "description": "A point as \"lat,lng\"; results are sorted by distance.",
      "schema": {
       "type": "string",
       "pattern": "^-?\\d{1,2}(\\.\\d+)?,-?\\d{1,3}(\\.\\d+)?$"
      }
     },
     {
      "name": "radiusKm",
      "in": "query",
      "required": false,
      "description": "Search radius around `near`, in km (default 50, at most 300).",
      "schema": {
       "type": "number",
       "minimum": 0,
       "maximum": 300
      }
     },
     {
      "name": "region",
      "in": "query",
      "required": false,
      "description": "A region key, as in everyrink.com/<region>.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "country",
      "in": "query",
      "required": false,
      "description": "ISO 3166-1 alpha-2 code of a covered country, e.g. US, CA, GB (the live list: /v1/agent/regions or llms.txt).",
      "schema": {
       "type": "string",
       "pattern": "^[A-Za-z]{2}$"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "At most this many results (default 20, at most 100).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 100
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Matching rinks.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/RinkResult"
           }
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         },
         "required": [
          "data",
          "meta"
         ]
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/BadRequest"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/v1/agent/rinks/{key}": {
   "get": {
    "operationId": "getRink",
    "summary": "One rink: address, links, the next 14 days of sessions, prices, visitor facts and notices, each with its source and check date",
    "parameters": [
     {
      "name": "key",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "The rink key (from findRinks or the rink page URL)."
     }
    ],
    "responses": {
     "200": {
      "description": "The rink.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/RinkDetail"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         },
         "required": [
          "data",
          "meta"
         ]
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/BadRequest"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/v1/agent/sessions": {
   "get": {
    "operationId": "getSessions",
    "summary": "Sessions at one rink or every rink in a region over a window of local dates",
    "parameters": [
     {
      "name": "rink",
      "in": "query",
      "required": false,
      "description": "A rink key. Give rink or region.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "region",
      "in": "query",
      "required": false,
      "description": "A region key. Give rink or region.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "from",
      "in": "query",
      "required": false,
      "description": "First local date (default today at the rink or region).",
      "schema": {
       "type": "string",
       "format": "date"
      }
     },
     {
      "name": "to",
      "in": "query",
      "required": false,
      "description": "Last local date (default from + 6 days; at most 14 days in all, and no more than 30 days ahead).",
      "schema": {
       "type": "string",
       "format": "date"
      }
     },
     {
      "name": "type",
      "in": "query",
      "required": false,
      "description": "Session types, comma-separated (default all).",
      "schema": {
       "type": "string",
       "pattern": "^(public|freestyle|stick|hockey)(,(public|freestyle|stick|hockey))*$"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Sessions, and what each rink’s schedule says for the window.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/SessionList"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         },
         "required": [
          "data",
          "meta"
         ]
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/BadRequest"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/v1/agent/next": {
   "get": {
    "operationId": "nextSkate",
    "summary": "The next sessions that have not started yet near a point",
    "parameters": [
     {
      "name": "near",
      "in": "query",
      "required": true,
      "description": "A point as \"lat,lng\".",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "radiusKm",
      "in": "query",
      "required": false,
      "description": "Search radius in km (default 40, at most 150).",
      "schema": {
       "type": "number",
       "minimum": 0,
       "maximum": 150
      }
     },
     {
      "name": "type",
      "in": "query",
      "required": false,
      "description": "Session types, comma-separated (default public).",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "At most this many sessions (default 5, at most 20).",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 20
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Upcoming sessions, soonest first.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "$ref": "#/components/schemas/NextList"
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         },
         "required": [
          "data",
          "meta"
         ]
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/BadRequest"
     },
     "404": {
      "$ref": "#/components/responses/NotFound"
     }
    }
   }
  },
  "/v1/agent/regions": {
   "get": {
    "operationId": "listRegions",
    "summary": "Every region EveryRink lists, with its rink count",
    "parameters": [
     {
      "name": "country",
      "in": "query",
      "required": false,
      "description": "ISO 3166-1 alpha-2 code.",
      "schema": {
       "type": "string",
       "pattern": "^[A-Za-z]{2}$"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Regions.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "data": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Region"
           }
          },
          "meta": {
           "$ref": "#/components/schemas/Meta"
          }
         },
         "required": [
          "data",
          "meta"
         ]
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/BadRequest"
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "Address": {
    "type": "object",
    "properties": {
     "street": {
      "type": [
       "string",
       "null"
      ]
     },
     "city": {
      "type": [
       "string",
       "null"
      ]
     },
     "region": {
      "type": [
       "string",
       "null"
      ],
      "description": "State, province or subdivision code as the rink writes it."
     },
     "postalCode": {
      "type": [
       "string",
       "null"
      ]
     },
     "country": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2."
     },
     "formatted": {
      "type": "string"
     }
    },
    "required": [
     "street",
     "city",
     "region",
     "postalCode",
     "country",
     "formatted"
    ]
   },
   "Coordinates": {
    "type": "object",
    "properties": {
     "lat": {
      "type": "number"
     },
     "lng": {
      "type": "number"
     }
    },
    "required": [
     "lat",
     "lng"
    ]
   },
   "LanguageVersion": {
    "type": "object",
    "properties": {
     "locale": {
      "type": "string"
     },
     "language": {
      "type": "string"
     },
     "url": {
      "type": "string",
      "format": "uri"
     },
     "default": {
      "type": "boolean"
     }
    },
    "required": [
     "locale",
     "language",
     "url",
     "default"
    ]
   },
   "Rink": {
    "type": "object",
    "properties": {
     "key": {
      "type": "string",
      "description": "Stable rink id, used in every URL."
     },
     "name": {
      "type": "string"
     },
     "region": {
      "type": "string"
     },
     "regionName": {
      "type": "string"
     },
     "country": {
      "type": "string",
      "description": "ISO 3166-1 alpha-2."
     },
     "subdivision": {
      "type": [
       "string",
       "null"
      ]
     },
     "address": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Address"
       },
       {
        "type": "null"
       }
      ]
     },
     "coordinates": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Coordinates"
       },
       {
        "type": "null"
       }
      ]
     },
     "timeZone": {
      "type": "string",
      "description": "IANA time zone; every local time for this rink is in it."
     },
     "currency": {
      "type": "string",
      "description": "ISO 4217."
     },
     "setting": {
      "type": [
       "string",
       "null"
      ],
      "description": "indoor, outdoor, covered-outdoor or mixed, when researched."
     },
     "pageUrl": {
      "type": "string",
      "format": "uri",
      "description": "The human page on EveryRink. Cite this."
     },
     "markdownUrl": {
      "type": "string",
      "format": "uri"
     },
     "apiUrl": {
      "type": "string",
      "format": "uri"
     },
     "websiteUrl": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri"
     },
     "scheduleUrl": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri"
     },
     "bookingUrl": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri",
      "description": "Where the rink itself lists or sells its sessions. Send people here to buy admission."
     },
     "phone": {
      "type": [
       "string",
       "null"
      ]
     },
     "sessionsListed": {
      "type": "boolean",
      "description": "False when the rink publishes its dates only on its own site and EveryRink does not list its sessions."
     },
     "liveBarn": {
      "type": "boolean",
      "description": "Present only where the country allows LiveBarn links: whether the rink has LiveBarn cameras."
     },
     "languageVersions": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/LanguageVersion"
      }
     }
    },
    "required": [
     "key",
     "name",
     "region",
     "regionName",
     "country",
     "subdivision",
     "address",
     "coordinates",
     "timeZone",
     "currency",
     "setting",
     "pageUrl",
     "markdownUrl",
     "apiUrl",
     "websiteUrl",
     "scheduleUrl",
     "bookingUrl",
     "phone",
     "sessionsListed",
     "languageVersions"
    ]
   },
   "RinkResult": {
    "allOf": [
     {
      "$ref": "#/components/schemas/Rink"
     },
     {
      "type": "object",
      "properties": {
       "distanceKm": {
        "type": "number"
       },
       "distanceMiles": {
        "type": "number"
       }
      }
     }
    ]
   },
   "Fact": {
    "type": "object",
    "properties": {
     "topic": {
      "type": "string",
      "enum": [
       "admission",
       "rentals",
       "booking",
       "family",
       "parking",
       "accessibility"
      ]
     },
     "label": {
      "type": "string"
     },
     "text": {
      "type": "string",
      "description": "EveryRink’s wording of what the source page says."
     },
     "source": {
      "type": "string",
      "format": "uri"
     },
     "verifiedAt": {
      "type": "string",
      "format": "date"
     },
     "status": {
      "type": "string",
      "enum": [
       "verified",
       "due-for-recheck"
      ],
      "description": "verified: checked within 30 days. due-for-recheck: older; the rink page shows it with the same warning."
     },
     "method": {
      "type": "string"
     }
    },
    "required": [
     "topic",
     "label",
     "text",
     "source",
     "verifiedAt",
     "status",
     "method"
    ]
   },
   "Rate": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "label": {
      "type": "string"
     },
     "amount": {
      "type": "number",
      "minimum": 0
     },
     "currency": {
      "type": "string"
     },
     "unit": {
      "type": "string",
      "enum": [
       "session",
       "hour",
       "pair",
       "family",
       "person"
      ]
     },
     "tax": {
      "type": "string",
      "enum": [
       "unspecified",
       "included",
       "extra"
      ]
     },
     "taxNote": {
      "type": "string"
     },
     "tags": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "ageMin": {
      "type": "integer"
     },
     "ageMax": {
      "type": "integer"
     },
     "description": {
      "type": "string"
     }
    },
    "required": [
     "id",
     "label",
     "amount",
     "currency",
     "unit",
     "tax",
     "taxNote",
     "tags"
    ]
   },
   "PriceList": {
    "type": "object",
    "properties": {
     "status": {
      "type": "string",
      "enum": [
       "verified"
      ]
     },
     "currency": {
      "type": "string"
     },
     "text": {
      "type": "string"
     },
     "source": {
      "type": "string",
      "format": "uri"
     },
     "verifiedAt": {
      "type": "string",
      "format": "date"
     },
     "method": {
      "type": "string"
     },
     "rates": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Rate"
      }
     }
    },
    "required": [
     "status",
     "currency",
     "text",
     "source",
     "verifiedAt",
     "method",
     "rates"
    ]
   },
   "Prices": {
    "type": "object",
    "properties": {
     "admission": {
      "$ref": "#/components/schemas/PriceList"
     },
     "rentals": {
      "$ref": "#/components/schemas/PriceList"
     }
    },
    "required": []
   },
   "ScheduleStatus": {
    "type": "object",
    "properties": {
     "state": {
      "type": "string",
      "enum": [
       "scheduled",
       "none-posted",
       "dates-not-posted",
       "out-of-season",
       "paused",
       "not-listed",
       "unavailable"
      ],
      "description": "What the schedule says for the window. dates-not-posted, out-of-season and paused are never \"zero sessions\": the rink has not published dates or is closed for the season."
     },
     "message": {
      "type": "string"
     },
     "sourceUrl": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri"
     },
     "resumesOn": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     },
     "verifiedAt": {
      "type": "string",
      "format": "date"
     }
    },
    "required": [
     "state",
     "message",
     "sourceUrl"
    ]
   },
   "Session": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "rinkKey": {
      "type": "string"
     },
     "rinkName": {
      "type": "string"
     },
     "type": {
      "type": "string",
      "enum": [
       "public",
       "freestyle",
       "stick",
       "hockey"
      ]
     },
     "typeLabel": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "start": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 with the rink’s UTC offset."
     },
     "end": {
      "type": "string",
      "format": "date-time"
     },
     "timeZone": {
      "type": "string"
     },
     "localDate": {
      "type": "string",
      "format": "date"
     },
     "localStartTime": {
      "type": "string"
     },
     "localEndTime": {
      "type": "string"
     },
     "durationMinutes": {
      "type": [
       "integer",
       "null"
      ]
     },
     "price": {
      "oneOf": [
       {
        "type": "object",
        "properties": {
         "amount": {
          "type": "number",
          "minimum": 0
         },
         "currency": {
          "type": "string"
         },
         "basis": {
          "type": "string",
          "enum": [
           "booking-system",
           "posted-price-list"
          ]
         }
        },
        "required": [
         "amount",
         "currency",
         "basis"
        ]
       },
       {
        "type": "null"
       }
      ]
     },
     "registered": {
      "type": [
       "integer",
       "null"
      ]
     },
     "capacity": {
      "type": [
       "integer",
       "null"
      ]
     },
     "spotsLeft": {
      "type": [
       "integer",
       "null"
      ]
     },
     "ages": {
      "oneOf": [
       {
        "type": "object",
        "properties": {
         "min": {
          "type": [
           "integer",
           "null"
          ]
         },
         "max": {
          "type": [
           "integer",
           "null"
          ]
         },
         "label": {
          "type": [
           "string",
           "null"
          ]
         }
        },
        "required": [
         "min",
         "max",
         "label"
        ]
       },
       {
        "type": "null"
       }
      ]
     },
     "audience": {
      "type": [
       "string",
       "null"
      ]
     },
     "bookingUrl": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri",
      "description": "Book this session here (the rink’s own system), or the rink’s schedule or website when no direct link exists."
     },
     "bookingKind": {
      "type": [
       "string",
       "null"
      ],
      "enum": [
       "signup",
       "schedule",
       "website",
       null
      ]
     },
     "pageUrl": {
      "type": "string",
      "format": "uri"
     },
     "source": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri"
     },
     "verifiedAt": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time",
      "description": "When EveryRink last saw this session in the rink’s schedule."
     },
     "method": {
      "type": "string"
     }
    },
    "required": [
     "id",
     "rinkKey",
     "rinkName",
     "type",
     "typeLabel",
     "name",
     "start",
     "end",
     "timeZone",
     "localDate",
     "localStartTime",
     "localEndTime",
     "durationMinutes",
     "price",
     "registered",
     "capacity",
     "spotsLeft",
     "ages",
     "audience",
     "bookingUrl",
     "bookingKind",
     "pageUrl",
     "source",
     "verifiedAt",
     "method"
    ]
   },
   "NearbySession": {
    "allOf": [
     {
      "$ref": "#/components/schemas/Session"
     },
     {
      "type": "object",
      "properties": {
       "distanceKm": {
        "type": [
         "number",
         "null"
        ]
       },
       "distanceMiles": {
        "type": [
         "number",
         "null"
        ]
       }
      },
      "required": [
       "distanceKm",
       "distanceMiles"
      ]
     }
    ]
   },
   "Notice": {
    "type": "object",
    "properties": {
     "kind": {
      "type": "string"
     },
     "text": {
      "type": "string"
     },
     "from": {
      "type": "string",
      "format": "date"
     },
     "to": {
      "type": "string",
      "format": "date"
     },
     "resumesOn": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     },
     "source": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri"
     },
     "verifiedAt": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     }
    },
    "required": [
     "kind",
     "text",
     "source"
    ]
   },
   "Citation": {
    "type": "object",
    "properties": {
     "text": {
      "type": "string"
     },
     "pageUrl": {
      "type": "string",
      "format": "uri"
     },
     "bookingUrl": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri"
     },
     "guidance": {
      "type": "string"
     }
    },
    "required": [
     "text",
     "pageUrl",
     "bookingUrl",
     "guidance"
    ]
   },
   "RinkDetail": {
    "allOf": [
     {
      "$ref": "#/components/schemas/Rink"
     },
     {
      "type": "object",
      "properties": {
       "schedule": {
        "allOf": [
         {
          "$ref": "#/components/schemas/ScheduleStatus"
         },
         {
          "type": "object",
          "properties": {
           "from": {
            "type": "string",
            "format": "date"
           },
           "to": {
            "type": "string",
            "format": "date"
           }
          },
          "required": [
           "from",
           "to"
          ]
         }
        ]
       },
       "sessions": {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Session"
        }
       },
       "prices": {
        "oneOf": [
         {
          "$ref": "#/components/schemas/Prices"
         },
         {
          "type": "null"
         }
        ]
       },
       "pricesNote": {
        "type": "string"
       },
       "facts": {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Fact"
        }
       },
       "notices": {
        "type": "array",
        "items": {
         "$ref": "#/components/schemas/Notice"
        }
       },
       "lastVerified": {
        "type": "object",
        "properties": {
         "factsAndPrices": {
          "oneOf": [
           {
            "type": "object",
            "properties": {
             "oldest": {
              "type": "string",
              "format": "date"
             },
             "newest": {
              "type": "string",
              "format": "date"
             }
            },
            "required": [
             "oldest",
             "newest"
            ]
           },
           {
            "type": "null"
           }
          ]
         },
         "schedule": {
          "type": [
           "string",
           "null"
          ],
          "format": "date-time"
         }
        },
        "required": [
         "factsAndPrices",
         "schedule"
        ]
       },
       "citation": {
        "$ref": "#/components/schemas/Citation"
       }
      },
      "required": [
       "schedule",
       "sessions",
       "prices",
       "facts",
       "notices",
       "lastVerified",
       "citation"
      ]
     }
    ]
   },
   "RinkScheduleStatus": {
    "allOf": [
     {
      "type": "object",
      "properties": {
       "key": {
        "type": "string"
       },
       "name": {
        "type": "string"
       },
       "pageUrl": {
        "type": "string",
        "format": "uri"
       }
      },
      "required": [
       "key",
       "name",
       "pageUrl"
      ]
     },
     {
      "$ref": "#/components/schemas/ScheduleStatus"
     }
    ]
   },
   "SessionList": {
    "type": "object",
    "properties": {
     "from": {
      "type": "string",
      "format": "date"
     },
     "to": {
      "type": "string",
      "format": "date"
     },
     "scheduleAvailable": {
      "type": "boolean",
      "description": "False when the schedule could not be read; then sessions is empty and means nothing."
     },
     "sessions": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Session"
      }
     },
     "rinks": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/RinkScheduleStatus"
      }
     }
    },
    "required": [
     "from",
     "to",
     "scheduleAvailable",
     "sessions",
     "rinks"
    ]
   },
   "NextList": {
    "type": "object",
    "properties": {
     "from": {
      "type": "string",
      "format": "date"
     },
     "to": {
      "type": "string",
      "format": "date"
     },
     "scheduleAvailable": {
      "type": "boolean"
     },
     "rinksSearched": {
      "type": "integer"
     },
     "sessions": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/NearbySession"
      }
     }
    },
    "required": [
     "scheduleAvailable",
     "rinksSearched",
     "sessions"
    ]
   },
   "Region": {
    "type": "object",
    "properties": {
     "key": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "place": {
      "type": "string"
     },
     "country": {
      "type": "string"
     },
     "timeZone": {
      "type": "string"
     },
     "rinks": {
      "type": "integer"
     },
     "pageUrl": {
      "type": "string",
      "format": "uri"
     },
     "markdownUrl": {
      "type": "string",
      "format": "uri"
     },
     "languageVersions": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/LanguageVersion"
      }
     }
    },
    "required": [
     "key",
     "name",
     "place",
     "country",
     "timeZone",
     "rinks",
     "pageUrl",
     "markdownUrl",
     "languageVersions"
    ]
   },
   "Meta": {
    "type": "object",
    "properties": {
     "generatedAt": {
      "type": "string",
      "format": "date-time"
     },
     "docs": {
      "type": "string",
      "format": "uri"
     },
     "citation": {
      "type": "string"
     },
     "total": {
      "type": "integer"
     },
     "returned": {
      "type": "integer"
     }
    },
    "required": [
     "generatedAt",
     "docs",
     "citation"
    ]
   },
   "Error": {
    "type": "object",
    "properties": {
     "error": {
      "type": "object",
      "properties": {
       "code": {
        "type": "string"
       },
       "message": {
        "type": "string"
       }
      },
      "required": [
       "code",
       "message"
      ]
     }
    },
    "required": [
     "error"
    ]
   }
  },
  "responses": {
   "BadRequest": {
    "description": "A parameter is missing or invalid.",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   },
   "NotFound": {
    "description": "No such rink or region on EveryRink.",
    "content": {
     "application/json": {
      "schema": {
       "$ref": "#/components/schemas/Error"
      }
     }
    }
   }
  }
 }
}