{
  "openapi": "3.1.0",
  "info": {
    "title": "timezone.io API",
    "version": "1.0.0",
    "summary": "IANA time zones, named abbreviations, countries and cities, with live offsets, DST state and conversions.",
    "description": "Every request needs a free personal access token from a verified timezone.io account, sent as a bearer token. The Free plan allows 100,000 requests a month at 5 a second; paid plans raise both (https://www.timezone.io/docs/rate-limits). Guides and worked examples: https://www.timezone.io/docs.\n\nGET /lookup answers from time zone boundary data. Contains information from timezone-boundary-builder (https://github.com/evansiroky/timezone-boundary-builder), made available under the Open Database License (ODbL) 1.0 (https://opendatacommons.org/licenses/odbl/1-0/). Boundary data © OpenStreetMap contributors (https://www.openstreetmap.org/copyright).",
    "termsOfService": "https://www.timezone.io/legal/terms",
    "contact": {
      "name": "timezone.io",
      "url": "https://www.timezone.io/contact"
    }
  },
  "externalDocs": {
    "description": "API documentation",
    "url": "https://www.timezone.io/docs"
  },
  "servers": [
    {
      "url": "https://api.timezone.io/v1"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "tags": [
    { "name": "Timezones", "description": "IANA time zones with live offsets, DST state and transitions." },
    { "name": "Abbreviations", "description": "The named time-zone layer (EST, CET, JST)." },
    { "name": "Countries", "description": "Countries and territories with their time-zone summary." },
    { "name": "Cities", "description": "Cities with live local time and live sun data." },
    { "name": "Convert", "description": "Convert a moment between time zones." },
    { "name": "Lookup", "description": "The time zone at a latitude and longitude." }
  ],
  "paths": {
    "/timezones": {
      "get": {
        "operationId": "listTimezones",
        "tags": ["Timezones"],
        "summary": "List time zones",
        "description": "A paginated, filterable list of IANA time zones. Rows are concise unless `detail=full`.",
        "externalDocs": { "url": "https://www.timezone.io/docs/timezones#list-time-zones" },
        "parameters": [
          { "name": "country", "in": "query", "description": "ISO 3166-1 alpha-2 country code, case-insensitive.", "schema": { "type": "string", "minLength": 2, "maxLength": 2 }, "example": "us" },
          { "$ref": "#/components/parameters/observesDst" },
          { "name": "q", "in": "query", "description": "Literal search across the IANA identifier and display name.", "schema": { "type": "string", "maxLength": 100 } },
          { "name": "sort", "in": "query", "description": "Sort key. Prefix with `-` for descending.", "schema": { "type": "string", "enum": ["iana", "-iana", "display_name", "-display_name", "offset", "-offset"], "default": "iana" } },
          { "name": "offset", "in": "query", "description": "Filter by standard UTC offset, within ±14:00: `-04:00` or bare minutes like `-240`.", "schema": { "type": "string" }, "example": "-05:00" },
          { "name": "abbreviation", "in": "query", "description": "Filter by abbreviation code such as `EST`, case-insensitive.", "schema": { "type": "string", "maxLength": 10 } },
          { "name": "is_mainland", "in": "query", "description": "Keep only mainland (`true`) or outlying (`false`) zones.", "schema": { "$ref": "#/components/schemas/BooleanFlag" } },
          { "$ref": "#/components/parameters/detail" },
          { "$ref": "#/components/parameters/perPage50" },
          { "$ref": "#/components/parameters/page" }
        ],
        "responses": {
          "200": {
            "description": "A page of time zones.",
            "headers": {
              "X-RateLimit-Limit": { "$ref": "#/components/headers/X-RateLimit-Limit" },
              "X-RateLimit-Remaining": { "$ref": "#/components/headers/X-RateLimit-Remaining" },
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["data", "links", "meta"],
                  "properties": {
                    "data": { "type": "array", "items": { "anyOf": [{ "$ref": "#/components/schemas/TimezoneRow" }, { "$ref": "#/components/schemas/TimezoneDetail" }] } },
                    "links": { "$ref": "#/components/schemas/PaginationLinks" },
                    "meta": { "$ref": "#/components/schemas/PaginationMeta" }
                  }
                }
              }
            }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "422": { "$ref": "#/components/responses/ValidationFailed" },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/timezones/{iana}": {
      "get": {
        "operationId": "getTimezone",
        "tags": ["Timezones"],
        "summary": "Retrieve a time zone",
        "description": "One IANA zone in full detail: live time, standard offset and the next DST transition. The slash in the identifier is part of the path; encode `+` as `%2B`.",
        "externalDocs": { "url": "https://www.timezone.io/docs/timezones#retrieve-a-time-zone" },
        "parameters": [
          { "name": "iana", "in": "path", "required": true, "description": "IANA identifier, for example `America/New_York`.", "schema": { "type": "string" }, "example": "America/New_York" },
          { "$ref": "#/components/parameters/at" }
        ],
        "responses": {
          "200": {
            "description": "The time zone.",
            "headers": {
              "X-RateLimit-Limit": { "$ref": "#/components/headers/X-RateLimit-Limit" },
              "X-RateLimit-Remaining": { "$ref": "#/components/headers/X-RateLimit-Remaining" },
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["data", "meta"],
                  "properties": {
                    "data": { "$ref": "#/components/schemas/TimezoneDetail" },
                    "meta": { "$ref": "#/components/schemas/Meta" }
                  }
                }
              }
            }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "422": { "$ref": "#/components/responses/ValidationFailed" },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/abbreviations": {
      "get": {
        "operationId": "listAbbreviations",
        "tags": ["Abbreviations"],
        "summary": "List abbreviations",
        "description": "A paginated list of named time standards (EST, CET, JST). Rows are concise unless `detail=full`.",
        "externalDocs": { "url": "https://www.timezone.io/docs/abbreviations#list-abbreviations" },
        "parameters": [
          { "name": "q", "in": "query", "description": "Literal search across code, name and slug.", "schema": { "type": "string", "maxLength": 100 } },
          { "name": "offset", "in": "query", "description": "Filter by the standard's UTC offset: `+01:00` or bare minutes like `60`.", "schema": { "type": "string" } },
          { "$ref": "#/components/parameters/observesDst" },
          { "$ref": "#/components/parameters/continent" },
          { "name": "sort", "in": "query", "description": "Sort key. Prefix with `-` for descending.", "schema": { "type": "string", "enum": ["code", "-code", "name", "-name", "offset", "-offset"], "default": "name" } },
          { "$ref": "#/components/parameters/detail" },
          { "$ref": "#/components/parameters/perPage25" },
          { "$ref": "#/components/parameters/page" }
        ],
        "responses": {
          "200": {
            "description": "A page of abbreviations.",
            "headers": {
              "X-RateLimit-Limit": { "$ref": "#/components/headers/X-RateLimit-Limit" },
              "X-RateLimit-Remaining": { "$ref": "#/components/headers/X-RateLimit-Remaining" },
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["data", "links", "meta"],
                  "properties": {
                    "data": { "type": "array", "items": { "anyOf": [{ "$ref": "#/components/schemas/AbbreviationRow" }, { "$ref": "#/components/schemas/AbbreviationDetail" }] } },
                    "links": { "$ref": "#/components/schemas/PaginationLinks" },
                    "meta": { "$ref": "#/components/schemas/PaginationMeta" }
                  }
                }
              }
            }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "422": { "$ref": "#/components/responses/ValidationFailed" },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/abbreviations/{abbreviation}": {
      "get": {
        "operationId": "getAbbreviation",
        "tags": ["Abbreviations"],
        "summary": "Retrieve an abbreviation",
        "description": "One named time standard, by slug (always unique) or code. A code shared by several standards (AST, CST) returns `300` with candidates; narrow it with `offset` or `continent`, or re-request by slug.",
        "externalDocs": { "url": "https://www.timezone.io/docs/abbreviations#retrieve-an-abbreviation" },
        "parameters": [
          { "name": "abbreviation", "in": "path", "required": true, "description": "Slug (`eastern-standard-time`) or code (`EST`).", "schema": { "type": "string" }, "example": "EST" },
          { "name": "include", "in": "query", "description": "Comma-separated related data to embed: `timezones`, `countries`.", "schema": { "type": "string" }, "example": "timezones,countries" },
          { "name": "offset", "in": "query", "description": "Disambiguate a shared code by offset: `+03:00` or `180`.", "schema": { "type": "string" } },
          { "$ref": "#/components/parameters/continent" }
        ],
        "responses": {
          "200": {
            "description": "The abbreviation.",
            "headers": {
              "X-RateLimit-Limit": { "$ref": "#/components/headers/X-RateLimit-Limit" },
              "X-RateLimit-Remaining": { "$ref": "#/components/headers/X-RateLimit-Remaining" },
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["data", "meta"],
                  "properties": {
                    "data": { "$ref": "#/components/schemas/AbbreviationDetail" },
                    "meta": { "$ref": "#/components/schemas/Meta" }
                  }
                }
              }
            }
          },
          "300": { "$ref": "#/components/responses/MultipleChoices" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "422": { "$ref": "#/components/responses/ValidationFailed" },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/countries": {
      "get": {
        "operationId": "listCountries",
        "tags": ["Countries"],
        "summary": "List countries",
        "description": "A paginated list of countries and territories. Rows are concise unless `detail=full`.",
        "externalDocs": { "url": "https://www.timezone.io/docs/countries#list-countries" },
        "parameters": [
          { "name": "q", "in": "query", "description": "Literal search across name, `iso2`, `iso3` and slug.", "schema": { "type": "string", "maxLength": 100 } },
          { "name": "region", "in": "query", "description": "One ISO region (`Americas`, `Europe`, `Asia`, `Africa`, `Oceania`), case-insensitive.", "schema": { "type": "string", "maxLength": 128 } },
          { "name": "sub_region", "in": "query", "description": "One ISO sub-region, such as `Western Europe`, case-insensitive.", "schema": { "type": "string", "maxLength": 128 } },
          { "$ref": "#/components/parameters/observesDst" },
          { "name": "sort", "in": "query", "description": "Sort key. Prefix with `-` for descending.", "schema": { "type": "string", "enum": ["name", "-name", "iso2", "-iso2"], "default": "name" } },
          { "$ref": "#/components/parameters/detail" },
          { "$ref": "#/components/parameters/perPage25" },
          { "$ref": "#/components/parameters/page" }
        ],
        "responses": {
          "200": {
            "description": "A page of countries.",
            "headers": {
              "X-RateLimit-Limit": { "$ref": "#/components/headers/X-RateLimit-Limit" },
              "X-RateLimit-Remaining": { "$ref": "#/components/headers/X-RateLimit-Remaining" },
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["data", "links", "meta"],
                  "properties": {
                    "data": { "type": "array", "items": { "anyOf": [{ "$ref": "#/components/schemas/CountryRow" }, { "$ref": "#/components/schemas/CountryDetail" }] } },
                    "links": { "$ref": "#/components/schemas/PaginationLinks" },
                    "meta": { "$ref": "#/components/schemas/PaginationMeta" }
                  }
                }
              }
            }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "422": { "$ref": "#/components/responses/ValidationFailed" },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/countries/{country}": {
      "get": {
        "operationId": "getCountry",
        "tags": ["Countries"],
        "summary": "Retrieve a country",
        "description": "One country by slug (`australia`) or ISO 3166-1 alpha-2 code (`AU`).",
        "externalDocs": { "url": "https://www.timezone.io/docs/countries#retrieve-a-country" },
        "parameters": [
          { "name": "country", "in": "path", "required": true, "description": "Slug or ISO 3166-1 alpha-2 code.", "schema": { "type": "string" }, "example": "australia" },
          { "name": "include", "in": "query", "description": "Comma-separated related data to embed: `timezones`, `abbreviations`, `cities`.", "schema": { "type": "string" }, "example": "timezones,cities" }
        ],
        "responses": {
          "200": {
            "description": "The country.",
            "headers": {
              "X-RateLimit-Limit": { "$ref": "#/components/headers/X-RateLimit-Limit" },
              "X-RateLimit-Remaining": { "$ref": "#/components/headers/X-RateLimit-Remaining" },
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["data", "meta"],
                  "properties": {
                    "data": { "$ref": "#/components/schemas/CountryDetail" },
                    "meta": { "$ref": "#/components/schemas/Meta" }
                  }
                }
              }
            }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "422": { "$ref": "#/components/responses/ValidationFailed" },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/cities": {
      "get": {
        "operationId": "listCities",
        "tags": ["Cities"],
        "summary": "List cities",
        "description": "A paginated list of cities with their live UTC offset. Rows are concise unless `detail=full`.",
        "externalDocs": { "url": "https://www.timezone.io/docs/cities#list-cities" },
        "parameters": [
          { "name": "q", "in": "query", "description": "Literal search across name and slug.", "schema": { "type": "string", "maxLength": 100 } },
          { "name": "country", "in": "query", "description": "ISO 3166-1 alpha-2 country code, case-insensitive.", "schema": { "type": "string", "minLength": 2, "maxLength": 2 } },
          { "name": "timezone", "in": "query", "description": "IANA identifier, for example `America/New_York`.", "schema": { "type": "string", "maxLength": 64 } },
          { "name": "is_capital", "in": "query", "description": "Keep only capitals (`true`) or non-capitals (`false`).", "schema": { "$ref": "#/components/schemas/BooleanFlag" } },
          { "name": "sort", "in": "query", "description": "`name`, or `offset` (the zone's standard UTC offset). Prefix with `-` for descending.", "schema": { "type": "string", "enum": ["name", "-name", "offset", "-offset"], "default": "name" } },
          { "$ref": "#/components/parameters/detail" },
          { "$ref": "#/components/parameters/perPage25" },
          { "$ref": "#/components/parameters/page" }
        ],
        "responses": {
          "200": {
            "description": "A page of cities.",
            "headers": {
              "X-RateLimit-Limit": { "$ref": "#/components/headers/X-RateLimit-Limit" },
              "X-RateLimit-Remaining": { "$ref": "#/components/headers/X-RateLimit-Remaining" },
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["data", "links", "meta"],
                  "properties": {
                    "data": { "type": "array", "items": { "anyOf": [{ "$ref": "#/components/schemas/CityRow" }, { "$ref": "#/components/schemas/CityDetail" }] } },
                    "links": { "$ref": "#/components/schemas/PaginationLinks" },
                    "meta": { "$ref": "#/components/schemas/PaginationMeta" }
                  }
                }
              }
            }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "422": { "$ref": "#/components/responses/ValidationFailed" },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/cities/{slug}": {
      "get": {
        "operationId": "getCity",
        "tags": ["Cities"],
        "summary": "Retrieve a city",
        "description": "One city with its live local time and live sunrise, sunset and daylight length. Cities that share a name are addressed as `<slug>-<iso2>` (`barcelona-ve`).",
        "externalDocs": { "url": "https://www.timezone.io/docs/cities#retrieve-a-city" },
        "parameters": [
          { "name": "slug", "in": "path", "required": true, "description": "City slug.", "schema": { "type": "string" }, "example": "tokyo" },
          { "$ref": "#/components/parameters/at" }
        ],
        "responses": {
          "200": {
            "description": "The city.",
            "headers": {
              "X-RateLimit-Limit": { "$ref": "#/components/headers/X-RateLimit-Limit" },
              "X-RateLimit-Remaining": { "$ref": "#/components/headers/X-RateLimit-Remaining" },
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["data", "meta"],
                  "properties": {
                    "data": { "$ref": "#/components/schemas/CityDetail" },
                    "meta": { "$ref": "#/components/schemas/Meta" }
                  }
                }
              }
            }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "422": { "$ref": "#/components/responses/ValidationFailed" },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/convert": {
      "get": {
        "operationId": "convert",
        "tags": ["Convert"],
        "summary": "Convert a moment between time zones",
        "description": "Convert one moment from a source to up to ten targets. Every datetime carries its UTC offset and is pinned to the single `utc` instant; daylight-saving folds and gaps are disclosed in `ambiguity`.",
        "externalDocs": { "url": "https://www.timezone.io/docs/convert" },
        "parameters": [
          { "name": "from", "in": "query", "required": true, "description": "One location token: IANA identifier, shorthand (`pt`), UTC offset (`UTC+2`), abbreviation slug or code, city, or country.", "schema": { "type": "string" }, "example": "America/New_York" },
          { "name": "to", "in": "query", "required": true, "description": "1–10 comma-separated location tokens, in the same formats as `from`.", "schema": { "type": "string" }, "example": "Europe/London,Asia/Tokyo" },
          { "name": "at", "in": "query", "description": "The moment to convert. A naked datetime (`2026-11-01T01:30:00`) is wall-clock time in `from`; an anchored datetime or Unix timestamp is an absolute instant. Defaults to now.", "schema": { "type": "string" }, "example": "2026-06-19T15:00:00" },
          { "name": "resolution", "in": "query", "description": "How an ambiguous or skipped wall time is handled.", "schema": { "type": "string", "enum": ["earliest", "latest", "reject"], "default": "earliest" } }
        ],
        "responses": {
          "200": {
            "description": "The conversion.",
            "headers": {
              "X-RateLimit-Limit": { "$ref": "#/components/headers/X-RateLimit-Limit" },
              "X-RateLimit-Remaining": { "$ref": "#/components/headers/X-RateLimit-Remaining" },
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["data", "meta"],
                  "properties": {
                    "data": { "$ref": "#/components/schemas/Conversion" },
                    "meta": { "$ref": "#/components/schemas/Meta" }
                  }
                }
              }
            }
          },
          "300": { "$ref": "#/components/responses/MultipleChoices" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "422": { "$ref": "#/components/responses/ValidationFailed" },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/lookup": {
      "get": {
        "operationId": "lookupTimezone",
        "tags": ["Lookup"],
        "summary": "Find the time zone at a point",
        "description": "The time zone at a latitude and longitude, on land or at sea, with the same `timezone` block as `/timezones/{iana}`, computed at `at`. Where two zones' boundaries overlap (disputed areas, and a few narrow slivers along borders and coasts in the source data), the one with the smallest area comes first and the others are listed in `alternatives`, except in Xinjiang, Abkhazia and Kalapani, where the administering authority's zone comes first. A point exactly on a border belongs to the zone east of it, or north of it on an east-west border. At sea the zone is `Etc/GMT±N`, whose sign is inverted: `Etc/GMT+3` is UTC-03:00.",
        "externalDocs": { "url": "https://www.timezone.io/docs/lookup" },
        "parameters": [
          { "name": "lat", "in": "query", "required": true, "description": "Latitude in decimal degrees, -90 to 90. Rounded to 6 decimals. Exponents like `5e-7` are read; commas, and spaces inside the number, are rejected.", "schema": { "type": "number", "minimum": -90, "maximum": 90 }, "example": 48.8566 },
          { "name": "lon", "in": "query", "description": "Longitude in decimal degrees, -180 to 180. Required unless `lng` is given.", "schema": { "type": "number", "minimum": -180, "maximum": 180 }, "example": 2.3522 },
          { "name": "lng", "in": "query", "description": "Alias of `lon`. Send one or the other.", "schema": { "type": "number", "minimum": -180, "maximum": 180 } },
          { "name": "ip", "in": "query", "description": "Reserved for a later version. Any non-empty value is rejected with 422.", "schema": { "type": "string" } },
          { "$ref": "#/components/parameters/at" }
        ],
        "responses": {
          "200": {
            "description": "The zone at the point.",
            "headers": {
              "X-RateLimit-Limit": { "$ref": "#/components/headers/X-RateLimit-Limit" },
              "X-RateLimit-Remaining": { "$ref": "#/components/headers/X-RateLimit-Remaining" },
              "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
              "RateLimit": { "$ref": "#/components/headers/RateLimit" }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["data", "meta"],
                  "properties": {
                    "data": { "$ref": "#/components/schemas/LookupResult" },
                    "meta": { "$ref": "#/components/schemas/LookupMeta" }
                  }
                }
              }
            }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "422": { "$ref": "#/components/responses/ValidationFailed" },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "503": { "$ref": "#/components/responses/ServiceUnavailable" }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "A personal access token from https://www.timezone.io/api-keys (the account's email must be verified)."
      }
    },
    "parameters": {
      "at": {
        "name": "at",
        "in": "query",
        "description": "Compute the time-dependent fields at this moment instead of now: an ISO 8601 datetime (a naked one is read as UTC) or a Unix timestamp in seconds within years 2000–2100.",
        "schema": { "type": "string" },
        "example": "2026-01-15T12:00:00Z"
      },
      "continent": {
        "name": "continent",
        "in": "query",
        "description": "An ISO region: `Europe`, `Americas`, `Asia`, `Africa` or `Oceania`. Case-insensitive.",
        "schema": { "type": "string", "maxLength": 32 }
      },
      "detail": {
        "name": "detail",
        "in": "query",
        "description": "`concise` rows, or `full` to return the detail shape per row.",
        "schema": { "type": "string", "enum": ["concise", "full"], "default": "concise" }
      },
      "observesDst": {
        "name": "observes_dst",
        "in": "query",
        "description": "Keep only results that do (`true`) or don't (`false`) observe daylight saving time.",
        "schema": { "$ref": "#/components/schemas/BooleanFlag" }
      },
      "page": {
        "name": "page",
        "in": "query",
        "description": "Page number.",
        "schema": { "type": "integer", "minimum": 1, "default": 1 }
      },
      "perPage25": {
        "name": "per_page",
        "in": "query",
        "description": "Results per page.",
        "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 25 }
      },
      "perPage50": {
        "name": "per_page",
        "in": "query",
        "description": "Results per page.",
        "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 50 }
      }
    },
    "headers": {
      "X-RateLimit-Limit": {
        "description": "The maximum number of requests allowed in the window.",
        "schema": { "type": "integer" }
      },
      "X-RateLimit-Remaining": {
        "description": "Requests remaining in the current window.",
        "schema": { "type": "integer" }
      },
      "RateLimit-Policy": {
        "description": "The limits that apply to this account, as IETF draft-ietf-httpapi-ratelimit-headers quota policies: \"burst\" (requests per second, w=1) and, when monthly quotas are enforced, \"monthly\" (requests per calendar month in UTC).",
        "schema": { "type": "string" },
        "example": "\"burst\";q=25;w=1, \"monthly\";q=1000000"
      },
      "RateLimit": {
        "description": "What remains of each policy (r) and the seconds until it resets (t). The monthly r counts down to the quota; requests within a paid plan's 10% buffer are served with r=0.",
        "schema": { "type": "string" },
        "example": "\"burst\";r=24;t=1, \"monthly\";r=998766;t=345600"
      },
      "Retry-After": {
        "description": "Seconds to wait before retrying. On a 429 it is about a second for the per-second limit; for the monthly quota it is at most 3600: check back hourly, or read RateLimit's monthly t for the reset (00:00 UTC on the 1st).",
        "schema": { "type": "integer" }
      },
      "X-RateLimit-Reset": {
        "description": "Unix timestamp when the window resets.",
        "schema": { "type": "integer" }
      }
    },
    "responses": {
      "MultipleChoices": {
        "description": "The identifier matches more than one time zone. Re-request with one of the candidates.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/MultipleChoices" }
          }
        }
      },
      "Unauthorized": {
        "description": "The token is missing, malformed or revoked.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/Error" },
            "example": { "message": "Unauthenticated." }
          }
        }
      },
      "Forbidden": {
        "description": "The account's email address isn't verified.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/Error" },
            "example": { "message": "Verify your email to use the API. Resend it at https://www.timezone.io/verify-email" }
          }
        }
      },
      "NotFound": {
        "description": "No resource matches the identifier in the URL.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/Error" },
            "example": { "message": "No timezone matches \"America/NewYork\"." }
          }
        }
      },
      "ValidationFailed": {
        "description": "A query parameter failed validation.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/ValidationError" }
          }
        }
      },
      "TooManyRequests": {
        "description": "The per-second rate limit or the monthly quota was exceeded. Over the quota, the message names the plan, says how to get more, and gives the reset date: \"Your Free plan's 100,000 requests for September 2026 are used up. Upgrade at https://www.timezone.io/billing for more, or wait until the quota resets on October 1, 2026 at 00:00 UTC.\"",
        "headers": {
          "Retry-After": { "$ref": "#/components/headers/Retry-After" },
          "X-RateLimit-Reset": { "$ref": "#/components/headers/X-RateLimit-Reset" },
          "RateLimit-Policy": { "$ref": "#/components/headers/RateLimit-Policy" },
          "RateLimit": { "$ref": "#/components/headers/RateLimit" }
        },
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/Error" },
            "example": { "message": "Too Many Attempts." }
          }
        }
      },
      "ServiceUnavailable": {
        "description": "No boundary data is installed. Retry after `Retry-After` seconds.",
        "headers": {
          "Retry-After": { "$ref": "#/components/headers/Retry-After" }
        },
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/Error" },
            "example": { "message": "Coordinate lookup is temporarily unavailable." }
          }
        }
      }
    },
    "schemas": {
      "BooleanFlag": {
        "type": "string",
        "enum": ["true", "false", "1", "0"]
      },
      "UtcOffset": {
        "type": "string",
        "description": "ISO 8601 UTC offset.",
        "pattern": "^[+-]\\d{2}:\\d{2}$",
        "example": "-05:00"
      },
      "CountryRef": {
        "type": "object",
        "required": ["code", "name"],
        "properties": {
          "code": { "type": ["string", "null"], "description": "ISO 3166-1 alpha-2 code.", "example": "US" },
          "name": { "type": "string", "example": "United States" }
        }
      },
      "SelfLink": {
        "type": "object",
        "required": ["self"],
        "properties": {
          "self": { "type": "string", "format": "uri" }
        }
      },
      "TimezoneSelfLink": {
        "type": "object",
        "required": ["self"],
        "properties": {
          "self": { "type": ["string", "null"], "format": "uri", "description": "Null for a zone at sea such as `Etc/GMT+3`, which has no `/timezones` entry." }
        }
      },
      "CurrentCompact": {
        "type": "object",
        "description": "The zone's state right now.",
        "required": ["utc_offset", "abbreviation", "is_dst"],
        "properties": {
          "utc_offset": { "anyOf": [{ "$ref": "#/components/schemas/UtcOffset" }, { "type": "null" }] },
          "abbreviation": { "type": ["string", "null"], "example": "EDT" },
          "is_dst": { "type": "boolean" }
        }
      },
      "Current": {
        "type": "object",
        "description": "The zone's state at the requested moment (now by default).",
        "required": ["datetime", "utc_datetime", "utc_offset", "utc_offset_seconds", "abbreviation", "name", "is_dst"],
        "properties": {
          "datetime": { "type": "string", "format": "date-time", "description": "Local time with its offset.", "example": "2026-09-26T00:05:04-04:00" },
          "utc_datetime": { "type": "string", "format": "date-time", "example": "2026-09-26T04:05:04Z" },
          "utc_offset": { "anyOf": [{ "$ref": "#/components/schemas/UtcOffset" }, { "type": "null" }] },
          "utc_offset_seconds": { "type": "integer", "example": -14400 },
          "abbreviation": { "type": ["string", "null"], "example": "EDT" },
          "name": { "type": ["string", "null"], "description": "Friendly name of the standard in effect.", "example": "Eastern Daylight Time" },
          "is_dst": { "type": "boolean" }
        }
      },
      "Standard": {
        "type": "object",
        "description": "The zone's standard (winter) time.",
        "required": ["utc_offset", "utc_offset_seconds", "abbreviation", "name"],
        "properties": {
          "utc_offset": { "anyOf": [{ "$ref": "#/components/schemas/UtcOffset" }, { "type": "null" }] },
          "utc_offset_seconds": { "type": "integer" },
          "abbreviation": { "type": ["string", "null"], "example": "EST" },
          "name": { "type": ["string", "null"], "example": "Eastern Standard Time" }
        }
      },
      "Dst": {
        "type": "object",
        "required": ["savings_seconds", "next_transition"],
        "properties": {
          "savings_seconds": { "type": "integer", "description": "How far clocks move for DST; 0 when the zone doesn't observe it.", "example": 3600 },
          "next_transition": {
            "description": "The next clock change, or null when none is scheduled.",
            "anyOf": [
              {
                "type": "object",
                "required": ["type", "at", "utc_offset_after", "abbreviation_after", "clock_change_seconds"],
                "properties": {
                  "type": { "type": "string", "enum": ["spring_forward", "fall_back"] },
                  "at": { "type": "string", "format": "date-time", "example": "2026-11-01T06:00:00Z" },
                  "utc_offset_after": { "anyOf": [{ "$ref": "#/components/schemas/UtcOffset" }, { "type": "null" }] },
                  "abbreviation_after": { "type": ["string", "null"] },
                  "clock_change_seconds": { "type": "integer", "example": -3600 }
                }
              },
              { "type": "null" }
            ]
          }
        }
      },
      "Coordinates": {
        "type": "object",
        "required": ["latitude", "longitude"],
        "properties": {
          "latitude": { "type": ["number", "null"] },
          "longitude": { "type": ["number", "null"] }
        }
      },
      "TimezoneRow": {
        "type": "object",
        "description": "A concise time-zone row.",
        "required": ["iana", "display_name", "country", "current", "observes_dst", "links"],
        "properties": {
          "iana": { "type": "string", "example": "America/New_York" },
          "display_name": { "type": ["string", "null"], "example": "New York" },
          "country": { "anyOf": [{ "$ref": "#/components/schemas/CountryRef" }, { "type": "null" }] },
          "current": { "$ref": "#/components/schemas/CurrentCompact" },
          "observes_dst": { "type": "boolean" },
          "links": { "$ref": "#/components/schemas/TimezoneSelfLink" }
        }
      },
      "TimezoneDetail": {
        "type": "object",
        "required": ["iana", "display_name", "observes_dst", "is_mainland", "coordinates", "country", "current", "standard", "dst", "links"],
        "properties": {
          "iana": { "type": "string", "example": "America/New_York" },
          "display_name": { "type": ["string", "null"] },
          "observes_dst": { "type": "boolean" },
          "is_mainland": { "type": "boolean" },
          "coordinates": { "$ref": "#/components/schemas/Coordinates" },
          "country": { "anyOf": [{ "$ref": "#/components/schemas/CountryRef" }, { "type": "null" }] },
          "current": { "$ref": "#/components/schemas/Current" },
          "standard": { "$ref": "#/components/schemas/Standard" },
          "dst": { "$ref": "#/components/schemas/Dst" },
          "links": {
            "type": "object",
            "required": ["self", "country", "abbreviation", "web"],
            "properties": {
              "self": { "type": ["string", "null"], "format": "uri" },
              "country": { "type": ["string", "null"], "format": "uri" },
              "abbreviation": { "type": ["string", "null"], "format": "uri" },
              "web": { "type": ["string", "null"], "format": "uri" }
            }
          }
        }
      },
      "AbbreviationCurrent": {
        "type": "object",
        "description": "The standard's defining offset; `is_dst` is true for a daylight-saving standard.",
        "required": ["utc_offset", "is_dst"],
        "properties": {
          "utc_offset": { "anyOf": [{ "$ref": "#/components/schemas/UtcOffset" }, { "type": "null" }] },
          "is_dst": { "type": "boolean" }
        }
      },
      "AbbreviationRow": {
        "type": "object",
        "required": ["code", "name", "slug", "current", "observes_dst", "links"],
        "properties": {
          "code": { "type": ["string", "null"], "example": "EST" },
          "name": { "type": "string", "example": "Eastern Standard Time" },
          "slug": { "type": "string", "example": "eastern-standard-time" },
          "current": { "$ref": "#/components/schemas/AbbreviationCurrent" },
          "observes_dst": { "type": "boolean" },
          "links": { "$ref": "#/components/schemas/SelfLink" }
        }
      },
      "AbbreviationDetail": {
        "type": "object",
        "required": ["code", "name", "slug", "current", "observes_dst", "continent", "counts", "counterpart", "links"],
        "properties": {
          "code": { "type": ["string", "null"], "example": "EST" },
          "name": { "type": "string" },
          "slug": { "type": "string" },
          "current": { "$ref": "#/components/schemas/AbbreviationCurrent" },
          "observes_dst": { "type": "boolean" },
          "continent": { "type": ["string", "null"], "example": "Americas" },
          "counts": {
            "type": "object",
            "required": ["timezones", "countries"],
            "properties": {
              "timezones": { "type": "integer" },
              "countries": { "type": "integer" }
            }
          },
          "counterpart": {
            "description": "The standard/daylight twin (EST ↔ EDT), or null.",
            "anyOf": [
              {
                "type": "object",
                "required": ["code", "name", "utc_offset"],
                "properties": {
                  "code": { "type": ["string", "null"] },
                  "name": { "type": "string" },
                  "utc_offset": { "anyOf": [{ "$ref": "#/components/schemas/UtcOffset" }, { "type": "null" }] }
                }
              },
              { "type": "null" }
            ]
          },
          "links": {
            "type": "object",
            "required": ["self", "timezones", "web"],
            "properties": {
              "self": { "type": "string", "format": "uri" },
              "timezones": { "type": "string", "format": "uri" },
              "web": { "type": "string", "format": "uri" }
            }
          },
          "timezones": {
            "type": "array",
            "description": "Present with `include=timezones`.",
            "items": { "anyOf": [{ "$ref": "#/components/schemas/TimezoneRow" }, { "$ref": "#/components/schemas/TimezoneDetail" }] }
          },
          "countries": {
            "type": "array",
            "description": "Present with `include=countries`.",
            "items": { "$ref": "#/components/schemas/CountryRef" }
          }
        }
      },
      "CountryRow": {
        "type": "object",
        "required": ["iso2", "name", "slug", "emoji", "region", "links"],
        "properties": {
          "iso2": { "type": "string", "example": "AU" },
          "name": { "type": "string", "example": "Australia" },
          "slug": { "type": "string", "example": "australia" },
          "emoji": { "type": ["string", "null"], "example": "🇦🇺" },
          "region": { "type": ["string", "null"], "example": "Oceania" },
          "links": { "$ref": "#/components/schemas/SelfLink" }
        }
      },
      "CountryDetail": {
        "type": "object",
        "required": ["iso2", "iso3", "numeric_code", "name", "slug", "emoji", "region", "sub_region", "population", "default_timezone", "counts", "dst", "dependencies", "links"],
        "properties": {
          "iso2": { "type": "string", "example": "AU" },
          "iso3": { "type": ["string", "null"], "example": "AUS" },
          "numeric_code": { "type": ["string", "null"], "example": "036" },
          "name": { "type": "string" },
          "slug": { "type": "string" },
          "emoji": { "type": ["string", "null"] },
          "region": { "type": ["string", "null"] },
          "sub_region": { "type": ["string", "null"], "example": "Australia and New Zealand" },
          "population": { "type": ["integer", "null"] },
          "default_timezone": {
            "description": "The zone a country resolves to when one zone is needed, or null.",
            "anyOf": [
              {
                "type": "object",
                "required": ["iana", "display_name"],
                "properties": {
                  "iana": { "type": "string", "example": "Australia/Sydney" },
                  "display_name": { "type": ["string", "null"] }
                }
              },
              { "type": "null" }
            ]
          },
          "counts": {
            "type": "object",
            "required": ["timezones", "abbreviations", "cities", "dependencies"],
            "properties": {
              "timezones": { "type": "integer" },
              "abbreviations": { "type": "integer" },
              "cities": { "type": "integer" },
              "dependencies": { "type": "integer" }
            }
          },
          "dst": {
            "type": "object",
            "required": ["observes", "timezones_in_dst", "timezones_without_dst"],
            "properties": {
              "observes": { "type": "boolean" },
              "timezones_in_dst": { "type": "integer", "description": "Zones that observe DST." },
              "timezones_without_dst": { "type": "integer", "description": "Zones that never observe DST." }
            }
          },
          "dependencies": {
            "type": "array",
            "items": {
              "type": "object",
              "required": ["code", "name", "slug"],
              "properties": {
                "code": { "type": ["string", "null"] },
                "name": { "type": "string" },
                "slug": { "type": "string" }
              }
            }
          },
          "links": {
            "type": "object",
            "required": ["self", "timezones", "cities", "web"],
            "properties": {
              "self": { "type": "string", "format": "uri" },
              "timezones": { "type": "string", "format": "uri" },
              "cities": { "type": "string", "format": "uri" },
              "web": { "type": "string", "format": "uri" }
            }
          },
          "timezones": {
            "type": "array",
            "description": "Present with `include=timezones`.",
            "items": { "anyOf": [{ "$ref": "#/components/schemas/TimezoneRow" }, { "$ref": "#/components/schemas/TimezoneDetail" }] }
          },
          "abbreviations": {
            "type": "array",
            "description": "Present with `include=abbreviations`.",
            "items": { "anyOf": [{ "$ref": "#/components/schemas/AbbreviationRow" }, { "$ref": "#/components/schemas/AbbreviationDetail" }] }
          },
          "cities": {
            "type": "array",
            "description": "Present with `include=cities`.",
            "items": { "anyOf": [{ "$ref": "#/components/schemas/CityRow" }, { "$ref": "#/components/schemas/CityDetail" }] }
          }
        }
      },
      "CityRow": {
        "type": "object",
        "required": ["slug", "name", "is_capital", "country", "timezone", "current", "links"],
        "properties": {
          "slug": { "type": "string", "example": "tokyo" },
          "name": { "type": "string", "example": "Tokyo" },
          "is_capital": { "type": "boolean" },
          "country": { "$ref": "#/components/schemas/CountryRef" },
          "timezone": {
            "type": "object",
            "required": ["iana", "abbreviation"],
            "properties": {
              "iana": { "type": "string", "example": "Asia/Tokyo" },
              "abbreviation": { "type": ["string", "null"], "example": "JST" }
            }
          },
          "current": {
            "type": "object",
            "required": ["utc_offset", "is_dst"],
            "properties": {
              "utc_offset": { "anyOf": [{ "$ref": "#/components/schemas/UtcOffset" }, { "type": "null" }] },
              "is_dst": { "type": "boolean" }
            }
          },
          "links": { "$ref": "#/components/schemas/SelfLink" }
        }
      },
      "CityDetail": {
        "type": "object",
        "required": ["slug", "name", "is_capital", "population", "coordinates", "country", "timezone", "current", "sun", "links"],
        "properties": {
          "slug": { "type": "string", "example": "tokyo" },
          "name": { "type": "string" },
          "is_capital": { "type": "boolean" },
          "population": { "type": ["integer", "null"] },
          "coordinates": { "$ref": "#/components/schemas/Coordinates" },
          "country": { "$ref": "#/components/schemas/CountryRef" },
          "timezone": {
            "type": "object",
            "required": ["iana", "abbreviation", "display_name"],
            "properties": {
              "iana": { "type": "string" },
              "abbreviation": { "type": ["string", "null"] },
              "display_name": { "type": ["string", "null"] }
            }
          },
          "current": { "$ref": "#/components/schemas/Current" },
          "sun": {
            "type": "object",
            "description": "Computed for the local date of `at`. Sunrise and sunset are null inside the polar circles (daylight 1440 for polar day, 0 for polar night) or without coordinates.",
            "required": ["sunrise", "sunset", "daylight_minutes"],
            "properties": {
              "sunrise": { "type": ["string", "null"], "format": "date-time" },
              "sunset": { "type": ["string", "null"], "format": "date-time" },
              "daylight_minutes": { "type": ["integer", "null"] }
            }
          },
          "links": {
            "type": "object",
            "required": ["self", "timezone", "country", "web"],
            "properties": {
              "self": { "type": "string", "format": "uri" },
              "timezone": { "type": "string", "format": "uri" },
              "country": { "type": "string", "format": "uri" },
              "web": { "type": "string", "format": "uri" }
            }
          }
        }
      },
      "ConversionSide": {
        "type": "object",
        "required": ["iana", "datetime", "utc_offset", "utc_offset_seconds", "abbreviation", "name", "is_dst", "links"],
        "properties": {
          "iana": { "type": "string", "example": "Europe/London" },
          "datetime": { "type": "string", "format": "date-time", "example": "2026-06-19T20:00:00+01:00" },
          "utc_offset": { "anyOf": [{ "$ref": "#/components/schemas/UtcOffset" }, { "type": "null" }] },
          "utc_offset_seconds": { "type": "integer" },
          "abbreviation": { "type": ["string", "null"] },
          "name": { "type": ["string", "null"] },
          "is_dst": { "type": "boolean" },
          "links": {
            "type": "object",
            "required": ["self"],
            "properties": {
              "self": { "type": ["string", "null"], "format": "uri", "description": "Null for a fixed-offset zone such as `Etc/GMT-2`." }
            }
          }
        }
      },
      "Conversion": {
        "type": "object",
        "required": ["from", "to", "utc", "ambiguity"],
        "properties": {
          "from": { "$ref": "#/components/schemas/ConversionSide" },
          "to": { "type": "array", "items": { "$ref": "#/components/schemas/ConversionSide" } },
          "utc": { "type": "string", "format": "date-time", "example": "2026-06-19T19:00:00Z" },
          "ambiguity": {
            "type": "object",
            "description": "`resolution` and `note` are present only when the wall time was ambiguous or skipped.",
            "required": ["is_ambiguous", "is_skipped"],
            "properties": {
              "is_ambiguous": { "type": "boolean", "description": "The wall time occurred twice (a DST fold)." },
              "is_skipped": { "type": "boolean", "description": "The wall time never occurred (a DST gap)." },
              "resolution": { "type": "string", "enum": ["earliest", "latest"] },
              "note": { "type": "string" }
            }
          }
        }
      },
      "Meta": {
        "type": "object",
        "required": ["tzdb_version", "generated_at"],
        "properties": {
          "tzdb_version": { "type": "string", "description": "IANA tz database release the answer was computed with.", "example": "2026c" },
          "generated_at": { "type": "string", "format": "date-time" }
        }
      },
      "LookupResult": {
        "type": "object",
        "required": ["query", "kind", "timezone", "alternatives"],
        "properties": {
          "query": {
            "type": "object",
            "description": "The point that was looked up, rounded to 6 decimals.",
            "required": ["latitude", "longitude"],
            "properties": {
              "latitude": { "type": "number", "example": 48.8566 },
              "longitude": { "type": "number", "example": 2.3522 }
            }
          },
          "kind": { "type": "string", "enum": ["land", "ocean"], "description": "`ocean` where no country's zone applies (`Etc/GMT±N`): international waters, and the unclaimed part of Antarctica. `land` includes territorial waters." },
          "timezone": { "$ref": "#/components/schemas/TimezoneDetail" },
          "alternatives": { "type": "array", "items": { "$ref": "#/components/schemas/LookupAlternative" } }
        }
      },
      "LookupAlternative": {
        "type": "object",
        "required": ["reason", "timezone"],
        "properties": {
          "reason": { "type": "string", "enum": ["overlap", "antimeridian"], "description": "`overlap`: another zone's boundary also contains the point. `antimeridian`: the zone across the 180° line, for `lon=180` or `lon=-180`." },
          "timezone": { "$ref": "#/components/schemas/TimezoneRow" }
        }
      },
      "LookupMeta": {
        "type": "object",
        "required": ["tzdb_version", "generated_at", "boundaries"],
        "properties": {
          "tzdb_version": { "type": "string", "example": "2026c" },
          "generated_at": { "type": "string", "format": "date-time" },
          "boundaries": {
            "type": "object",
            "required": ["version", "attribution"],
            "properties": {
              "version": { "type": "string", "example": "2026d", "description": "The boundary release that answered. A point's zone only changes when this does." },
              "attribution": { "type": "string", "description": "The credit the boundary data's licence (ODbL 1.0) asks for, with its URIs as plain text." }
            }
          }
        }
      },
      "PaginationLinks": {
        "type": "object",
        "required": ["first", "last", "prev", "next"],
        "properties": {
          "first": { "type": ["string", "null"], "format": "uri" },
          "last": { "type": ["string", "null"], "format": "uri" },
          "prev": { "type": ["string", "null"], "format": "uri" },
          "next": { "type": ["string", "null"], "format": "uri" }
        }
      },
      "PaginationMeta": {
        "type": "object",
        "required": ["current_page", "from", "last_page", "links", "path", "per_page", "to", "total", "tzdb_version", "generated_at"],
        "properties": {
          "current_page": { "type": "integer" },
          "from": { "type": ["integer", "null"] },
          "last_page": { "type": "integer" },
          "links": {
            "type": "array",
            "description": "Page links for rendering a paginator.",
            "items": {
              "type": "object",
              "required": ["url", "label", "active"],
              "properties": {
                "url": { "type": ["string", "null"] },
                "label": { "type": "string" },
                "page": { "type": ["integer", "null"] },
                "active": { "type": "boolean" }
              }
            }
          },
          "path": { "type": "string", "format": "uri" },
          "per_page": { "type": "integer" },
          "to": { "type": ["integer", "null"] },
          "total": { "type": "integer" },
          "tzdb_version": { "type": "string" },
          "generated_at": { "type": "string", "format": "date-time" }
        }
      },
      "Error": {
        "type": "object",
        "required": ["message"],
        "properties": {
          "message": { "type": "string" }
        }
      },
      "ValidationError": {
        "type": "object",
        "required": ["message", "errors"],
        "properties": {
          "message": { "type": "string" },
          "errors": {
            "type": "object",
            "description": "Messages keyed by parameter.",
            "additionalProperties": { "type": "array", "items": { "type": "string" } }
          }
        }
      },
      "MultipleChoices": {
        "type": "object",
        "required": ["message", "candidates"],
        "properties": {
          "message": { "type": "string" },
          "candidates": {
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "description": "A named standard sharing the requested code.",
                  "required": ["code", "name", "slug", "continent", "current", "links"],
                  "properties": {
                    "code": { "type": ["string", "null"] },
                    "name": { "type": "string" },
                    "slug": { "type": "string" },
                    "continent": { "type": ["string", "null"] },
                    "current": { "$ref": "#/components/schemas/AbbreviationCurrent" },
                    "links": { "$ref": "#/components/schemas/SelfLink" }
                  }
                },
                {
                  "type": "object",
                  "description": "A time zone matching the requested token.",
                  "required": ["iana", "display_name", "current", "links"],
                  "properties": {
                    "iana": { "type": "string" },
                    "display_name": { "type": ["string", "null"] },
                    "current": { "$ref": "#/components/schemas/CurrentCompact" },
                    "links": { "$ref": "#/components/schemas/SelfLink" }
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
}
