{
  "openapi": "3.1.1",
  "info": {
    "title": "Geocoder v3",
    "description": "Geocoding and reverse geocoding for Norwegian addresses and points of interest.\n",
    "contact": {
      "name": "Team Ruter og reiseplanlegging",
      "url": "https://developer.entur.org"
    },
    "license": {
      "name": "EUPL-1.2",
      "url": "https://opensource.org/licenses/EUPL-1.2"
    },
    "version": "2026.06.3"
  },
  "externalDocs": {
    "description": "Geocoder v3 documentation and migration guide",
    "url": "https://beta.developer.entur.no/docs/open-services/geocoder"
  },
  "servers": [
    {
      "url": "https://api.entur.io/geocoder"
    }
  ],
  "security": [
    {}
  ],
  "tags": [
    {
      "name": "Autocomplete"
    },
    {
      "name": "Reverse"
    },
    {
      "name": "Place"
    }
  ],
  "paths": {
    "/v3/place": {
      "get": {
        "tags": [
          "Place"
        ],
        "summary": "Place lookup",
        "description": "Look up one or more places by ID",
        "operationId": "placeV3",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "description": "Place IDs to look up (at most 100)",
            "required": true,
            "style": "form",
            "explode": false,
            "schema": {
              "maxItems": 100,
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "NSR:StopPlace:337",
                  "NSR:StopPlace:59872"
                ]
              }
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language code for result names",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "default": "no"
            },
            "examples": {
              "default": {
                "value": "no"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching places",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "FeatureCollection",
                      "features": [
                        {
                          "type": "Feature",
                          "geometry": {
                            "type": "Point",
                            "coordinates": [
                              10.7522,
                              59.911
                            ]
                          },
                          "properties": {
                            "id": "NSR:StopPlace:59872",
                            "layer": "stopPlace",
                            "names": {
                              "default": "Oslo S",
                              "display": "Oslo S, Oslo"
                            },
                            "source": "nsr",
                            "stopPlaceRole": "parent"
                          }
                        }
                      ],
                      "metadata": {
                        "query": {
                          "lang": "no",
                          "limit": 10
                        },
                        "timestamp": "2025-03-04T11:00:00Z",
                        "resultCount": 1
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "default": {
                    "value": {
                      "title": "Bad Request",
                      "detail": "Parameter 'ids' is required",
                      "status": 400
                    }
                  }
                }
              }
            }
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/ET-Client-Name"
        },
        {
          "$ref": "#/components/parameters/X-Correlation-Id"
        }
      ]
    },
    "/v3/reverse": {
      "get": {
        "tags": [
          "Reverse"
        ],
        "summary": "Reverse geocode",
        "description": "Convert coordinates to places",
        "operationId": "reverseV3",
        "parameters": [
          {
            "name": "lat",
            "in": "query",
            "description": "Latitude",
            "required": true,
            "style": "form",
            "explode": true,
            "schema": {
              "maximum": 90,
              "minimum": -90,
              "type": "number",
              "format": "double"
            },
            "examples": {
              "default": {
                "value": 59.911
              }
            }
          },
          {
            "name": "lon",
            "in": "query",
            "description": "Longitude",
            "required": true,
            "style": "form",
            "explode": true,
            "schema": {
              "maximum": 180,
              "minimum": -180,
              "type": "number",
              "format": "double"
            },
            "examples": {
              "default": {
                "value": 10.7522
              }
            }
          },
          {
            "name": "radius",
            "in": "query",
            "description": "Search radius in kilometres (decimals accepted). If omitted, no radius limit is applied.",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "minimum": 0,
              "type": "number",
              "format": "double"
            },
            "examples": {
              "default": {
                "value": 0.5
              }
            }
          },
          {
            "name": "distanceSort",
            "in": "query",
            "description": "Sort reverse results by distance from the query point (default) or by relevance when false.",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "boolean",
              "default": true
            },
            "examples": {
              "default": {
                "value": true
              }
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Maximum number of results",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer",
              "default": 10
            },
            "examples": {
              "default": {
                "value": 10
              }
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language code for result names",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "default": "no"
            },
            "examples": {
              "default": {
                "value": "no"
              }
            }
          },
          {
            "name": "layers",
            "in": "query",
            "description": "Layer filter. See `stopPlaceTypes` for how the two compose.",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "address",
                  "street",
                  "stopPlace",
                  "groupOfStopPlaces",
                  "poi",
                  "place"
                ]
              }
            },
            "examples": {
              "default": {
                "value": [
                  "stopPlace",
                  "address"
                ]
              }
            }
          },
          {
            "name": "stopPlaceTypes",
            "in": "query",
            "description": "Select stop places of these NeTEx types. Without `layers`, returns only these stop places and excludes other layers. With `layers`, constrains the `stopPlace` layer while other requested layers are returned additively (e.g. `layers=stopPlace,groupOfStopPlaces&stopPlaceTypes=railStation` returns rail stations plus groups). Ignored when `layers` is set but omits `stopPlace`.",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "onstreetBus",
                  "onstreetTram",
                  "airport",
                  "railStation",
                  "metroStation",
                  "busStation",
                  "coachStation",
                  "tramStation",
                  "harbourPort",
                  "ferryPort",
                  "ferryStop",
                  "liftStation",
                  "vehicleRailInterchange",
                  "other"
                ]
              }
            },
            "examples": {
              "default": {
                "value": [
                  "railStation",
                  "metroStation"
                ]
              }
            }
          },
          {
            "name": "sources",
            "in": "query",
            "description": "Data source filter",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "openstreetmap",
                  "kartverket-matrikkelenadresse",
                  "kartverket-stedsnavn",
                  "nsr",
                  "custom-poi"
                ]
              }
            },
            "examples": {
              "default": {
                "value": [
                  "openstreetmap"
                ]
              }
            }
          },
          {
            "name": "countries",
            "in": "query",
            "description": "ISO 3166-1 alpha-2 country code filter",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "no"
                ]
              }
            }
          },
          {
            "name": "counties",
            "in": "query",
            "description": "County IDs filter",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "KVE:TopographicPlace:03"
                ]
              }
            }
          },
          {
            "name": "localities",
            "in": "query",
            "description": "Locality IDs filter",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "KVE:TopographicPlace:0301"
                ]
              }
            }
          },
          {
            "name": "fareZones",
            "in": "query",
            "description": "Fare zone IDs filter. Refs must be FareZone-shaped (e.g. `RUT:FareZone:1`); legacy `TariffZone` refs are not supported.",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "RUT:FareZone:1"
                ]
              }
            }
          },
          {
            "name": "fareZoneAuthorities",
            "in": "query",
            "description": "Fare zone authorities filter",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "RUT:Authority:RUT"
                ]
              }
            }
          },
          {
            "name": "multimodal",
            "in": "query",
            "description": "Multimodal stop place filter. Standalone (monomodal) stop places always appear; this only decides whether multimodal parents, children, or both appear alongside them: `parent` (default) hides multimodal children, `child` hides multimodal parents, `all` shows both",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "default": "parent",
              "enum": [
                "parent",
                "child",
                "all"
              ]
            },
            "examples": {
              "default": {
                "value": "parent"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Nearby places",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "FeatureCollection",
                      "features": [
                        {
                          "type": "Feature",
                          "geometry": {
                            "type": "Point",
                            "coordinates": [
                              10.7522,
                              59.911
                            ]
                          },
                          "properties": {
                            "id": "NSR:StopPlace:59872",
                            "layer": "stopPlace",
                            "names": {
                              "default": "Oslo S",
                              "display": "Oslo S, Oslo"
                            },
                            "source": "nsr",
                            "distance": 0.142,
                            "stopPlaceRole": "parent"
                          }
                        }
                      ],
                      "metadata": {
                        "query": {
                          "lat": 59.911,
                          "lon": 10.7522,
                          "lang": "no",
                          "limit": 10
                        },
                        "timestamp": "2025-03-04T11:00:00Z",
                        "resultCount": 1
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "default": {
                    "value": {
                      "title": "Bad Request",
                      "detail": "Parameter 'lat' is required",
                      "status": 400
                    }
                  }
                }
              }
            }
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/ET-Client-Name"
        },
        {
          "$ref": "#/components/parameters/X-Correlation-Id"
        }
      ]
    },
    "/v3/autocomplete": {
      "get": {
        "tags": [
          "Autocomplete"
        ],
        "summary": "Autocomplete search",
        "description": "Search for places by text query",
        "operationId": "autocompleteV3",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "Search query. Optional when at least one filter (e.g. `layers`, `stopPlaceTypes`, `fareZones`) is given; the response then lists every place matching the filters (e.g. every airport, or every stop place in a fare zone).",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string"
            },
            "examples": {
              "default": {
                "value": "Oslo S"
              }
            }
          },
          {
            "name": "lat",
            "in": "query",
            "description": "Focus point latitude. When provided with lon, results near this point are boosted.",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "maximum": 90,
              "minimum": -90,
              "type": "number",
              "format": "double"
            },
            "examples": {
              "default": {
                "value": 59.911
              }
            }
          },
          {
            "name": "lon",
            "in": "query",
            "description": "Focus point longitude. Must be provided together with lat.",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "maximum": 180,
              "minimum": -180,
              "type": "number",
              "format": "double"
            },
            "examples": {
              "default": {
                "value": 10.7522
              }
            }
          },
          {
            "name": "radius",
            "in": "query",
            "description": "Focus radius in kilometres (decimals accepted). Results within this distance from the focus point receive the strongest boost.",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "minimum": 0,
              "type": "number",
              "format": "double",
              "default": 50
            },
            "examples": {
              "default": {
                "value": 50
              }
            }
          },
          {
            "name": "weight",
            "in": "query",
            "description": "Focus weight: how strongly to prefer results near the focus point. 0 = no preference, 1 = maximum preference.",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "maximum": 1,
              "minimum": 0,
              "type": "number",
              "format": "double",
              "default": 0.5
            },
            "examples": {
              "default": {
                "value": 0.5
              }
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "description": "Restrict results to a bounding box: `minLon,minLat,maxLon,maxLat`. Unlike the focus point (a soft bias), this is a hard filter.",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "pattern": "^\\s*-?\\d+(\\.\\d+)?(\\s*,\\s*-?\\d+(\\.\\d+)?){3}\\s*$",
              "type": "string"
            },
            "examples": {
              "default": {
                "value": "10.5,59.8,10.9,60.0"
              }
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Maximum number of results",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer",
              "default": 10
            },
            "examples": {
              "default": {
                "value": 10
              }
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Language code for result names",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "default": "no"
            },
            "examples": {
              "default": {
                "value": "no"
              }
            }
          },
          {
            "name": "layers",
            "in": "query",
            "description": "Layer filter. See `stopPlaceTypes` for how the two compose.",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "address",
                  "street",
                  "stopPlace",
                  "groupOfStopPlaces",
                  "poi",
                  "place"
                ]
              }
            },
            "examples": {
              "default": {
                "value": [
                  "stopPlace",
                  "address"
                ]
              }
            }
          },
          {
            "name": "stopPlaceTypes",
            "in": "query",
            "description": "Select stop places of these NeTEx types. Without `layers`, returns only these stop places and excludes other layers. With `layers`, constrains the `stopPlace` layer while other requested layers are returned additively (e.g. `layers=stopPlace,groupOfStopPlaces&stopPlaceTypes=railStation` returns rail stations plus groups). Ignored when `layers` is set but omits `stopPlace`.",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "onstreetBus",
                  "onstreetTram",
                  "airport",
                  "railStation",
                  "metroStation",
                  "busStation",
                  "coachStation",
                  "tramStation",
                  "harbourPort",
                  "ferryPort",
                  "ferryStop",
                  "liftStation",
                  "vehicleRailInterchange",
                  "other"
                ]
              }
            },
            "examples": {
              "default": {
                "value": [
                  "railStation",
                  "metroStation"
                ]
              }
            }
          },
          {
            "name": "sources",
            "in": "query",
            "description": "Data source filter",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "openstreetmap",
                  "kartverket-matrikkelenadresse",
                  "kartverket-stedsnavn",
                  "nsr",
                  "custom-poi"
                ]
              }
            },
            "examples": {
              "default": {
                "value": [
                  "openstreetmap"
                ]
              }
            }
          },
          {
            "name": "countries",
            "in": "query",
            "description": "ISO 3166-1 alpha-2 country code filter",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "no"
                ]
              }
            }
          },
          {
            "name": "counties",
            "in": "query",
            "description": "County IDs filter",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "KVE:TopographicPlace:03"
                ]
              }
            }
          },
          {
            "name": "localities",
            "in": "query",
            "description": "Locality IDs filter",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "KVE:TopographicPlace:0301"
                ]
              }
            }
          },
          {
            "name": "fareZones",
            "in": "query",
            "description": "Fare zone IDs filter. Refs must be FareZone-shaped (e.g. `RUT:FareZone:1`); legacy `TariffZone` refs are not supported.",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "RUT:FareZone:1"
                ]
              }
            }
          },
          {
            "name": "fareZoneAuthorities",
            "in": "query",
            "description": "Fare zone authorities filter",
            "required": false,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "examples": {
              "default": {
                "value": [
                  "RUT:Authority:RUT"
                ]
              }
            }
          },
          {
            "name": "multimodal",
            "in": "query",
            "description": "Multimodal stop place filter. Standalone (monomodal) stop places always appear; this only decides whether multimodal parents, children, or both appear alongside them: `parent` (default) hides multimodal children, `child` hides multimodal parents, `all` shows both",
            "required": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "default": "parent",
              "enum": [
                "parent",
                "child",
                "all"
              ]
            },
            "examples": {
              "default": {
                "value": "parent"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching places",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Result"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "FeatureCollection",
                      "features": [
                        {
                          "type": "Feature",
                          "geometry": {
                            "type": "Point",
                            "coordinates": [
                              10.7522,
                              59.911
                            ]
                          },
                          "properties": {
                            "id": "NSR:StopPlace:59872",
                            "layer": "stopPlace",
                            "names": {
                              "default": "Oslo S",
                              "display": "Oslo S, Oslo"
                            },
                            "source": "nsr",
                            "fareZones": [
                              "RUT:FareZone:1"
                            ],
                            "stopPlaceRole": "parent",
                            "stopPlaceTypes": [
                              "railStation"
                            ],
                            "transportModes": [
                              {
                                "mode": "rail"
                              }
                            ]
                          }
                        }
                      ],
                      "metadata": {
                        "query": {
                          "lang": "no",
                          "text": "oslo s",
                          "limit": 10
                        },
                        "timestamp": "2025-03-04T11:00:00Z",
                        "resultCount": 1
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "default": {
                    "value": {
                      "title": "Bad Request",
                      "detail": "Unknown parameter(s): foo",
                      "status": 400
                    }
                  }
                }
              }
            }
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/ET-Client-Name"
        },
        {
          "$ref": "#/components/parameters/X-Correlation-Id"
        }
      ]
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "required": [
          "status",
          "title"
        ],
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "examples": [
              "Bad Request"
            ]
          },
          "detail": {
            "type": "string",
            "examples": [
              "Parameter 'lat' is required"
            ]
          },
          "status": {
            "type": "integer",
            "examples": [
              400
            ]
          }
        }
      },
      "Layer": {
        "type": "string",
        "enum": [
          "address",
          "street",
          "stopPlace",
          "groupOfStopPlaces",
          "poi",
          "place"
        ],
        "examples": [
          "stopPlace"
        ]
      },
      "Names": {
        "required": [
          "default",
          "display"
        ],
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "description": "Common or colloquial name",
            "examples": [
              "Oslo Sentralstasjon"
            ]
          },
          "default": {
            "type": "string",
            "description": "Official name",
            "examples": [
              "Oslo S"
            ]
          },
          "display": {
            "type": "string",
            "description": "Formatted name with locality context, suitable for display",
            "examples": [
              "Oslo S, Oslo"
            ]
          }
        }
      },
      "Place": {
        "required": [
          "id",
          "layer",
          "names",
          "source"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "examples": [
              "NSR:StopPlace:59872"
            ]
          },
          "layer": {
            "$ref": "#/components/schemas/Layer"
          },
          "names": {
            "$ref": "#/components/schemas/Names"
          },
          "source": {
            "type": "string",
            "description": "Data source identifier (same values as the sources filter)",
            "enum": [
              "openstreetmap",
              "kartverket-matrikkelenadresse",
              "kartverket-stedsnavn",
              "nsr",
              "custom-poi"
            ],
            "examples": [
              "nsr"
            ]
          },
          "address": {
            "$ref": "#/components/schemas/Address"
          },
          "distance": {
            "type": "number",
            "description": "Distance from the reverse query point in kilometres (3-decimal precision). Present on `/v3/reverse` responses only; the field is omitted (not `null`) on autocomplete and place lookup.",
            "format": "double",
            "examples": [
              0.142
            ]
          },
          "fareZones": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "examples": [
              [
                "RUT:FareZone:4"
              ]
            ]
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "examples": [
              [
                "restaurant"
              ]
            ]
          },
          "description": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Per-language description. Keys are ISO 639-2 alpha-3 language codes (`nor`, `eng`, etc.). The field is omitted (not `null`) when the underlying record has no description.",
            "examples": [
              {
                "eng": "Norway's national theatre",
                "nor": "Norges nasjonalteater"
              }
            ]
          },
          "stopPlaceRole": {
            "type": "string",
            "description": "A stop place's role in the parent-child hierarchy: `parent` (aggregates child stops), `child`, or `standalone`. Present on `stopPlace` features; absent on other layers and on stop places not yet reindexed. Treat an absent or unrecognised value as unknown, not `standalone`. (`parent`/`child` both mean multimodal.)",
            "enum": [
              "parent",
              "child",
              "standalone"
            ],
            "examples": [
              "parent"
            ]
          },
          "stopPlaceTypes": {
            "type": "array",
            "description": "NeTEx StopPlaceType values (same value set as the `stopPlaceTypes` filter parameter)",
            "items": {
              "type": "string"
            },
            "examples": [
              [
                "onstreetBus"
              ]
            ]
          },
          "transportModes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransportMode"
            }
          }
        }
      },
      "Result": {
        "required": [
          "features",
          "metadata",
          "type"
        ],
        "type": "object",
        "properties": {
          "bbox": {
            "maxItems": 4,
            "minItems": 4,
            "type": "array",
            "description": "[minLon, minLat, maxLon, maxLat]",
            "items": {
              "type": "number"
            },
            "examples": [
              [
                10.7335,
                59.911,
                10.7522,
                59.9144
              ]
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "FeatureCollection"
            ]
          },
          "features": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Feature"
            }
          },
          "metadata": {
            "$ref": "#/components/schemas/Metadata"
          }
        }
      },
      "Address": {
        "type": "object",
        "properties": {
          "county": {
            "type": "string",
            "examples": [
              "Oslo"
            ]
          },
          "borough": {
            "type": "string",
            "examples": [
              "Sentrum"
            ]
          },
          "countyId": {
            "type": "string",
            "examples": [
              "KVE:TopographicPlace:03"
            ]
          },
          "locality": {
            "type": "string",
            "examples": [
              "Oslo"
            ]
          },
          "boroughId": {
            "type": "string",
            "examples": [
              "KVE:Borough:34200502"
            ]
          },
          "localityId": {
            "type": "string",
            "examples": [
              "KVE:TopographicPlace:0301"
            ]
          },
          "postalCode": {
            "type": "string",
            "examples": [
              "0154"
            ]
          },
          "streetName": {
            "type": "string",
            "examples": [
              "Jernbanetorget"
            ]
          },
          "countryCode": {
            "type": "string",
            "examples": [
              "no"
            ]
          },
          "houseNumber": {
            "type": "string",
            "examples": [
              "1"
            ]
          }
        }
      },
      "Feature": {
        "required": [
          "geometry",
          "properties",
          "type"
        ],
        "type": "object",
        "properties": {
          "bbox": {
            "maxItems": 4,
            "minItems": 4,
            "type": "array",
            "description": "GeoJSON bounding box `[minLon, minLat, maxLon, maxLat]`. Present for features with a real extent (streets, groups of stop places); omitted for point features.",
            "items": {
              "type": "number"
            },
            "examples": [
              [
                10.73,
                59.91,
                10.76,
                59.92
              ]
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "Feature"
            ]
          },
          "geometry": {
            "$ref": "#/components/schemas/Geometry"
          },
          "properties": {
            "$ref": "#/components/schemas/Place"
          }
        }
      },
      "Filters": {
        "type": "object",
        "properties": {
          "layers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Layer"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "counties": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "fareZones": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "localities": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "multimodal": {
            "type": "string",
            "enum": [
              "parent",
              "child",
              "all"
            ]
          },
          "stopPlaceTypes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "fareZoneAuthorities": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "description": "Echoes the request filters as sent, not the effective filter set."
      },
      "Geometry": {
        "required": [
          "coordinates",
          "type"
        ],
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "Point"
            ]
          },
          "coordinates": {
            "maxItems": 2,
            "minItems": 2,
            "type": "array",
            "description": "[longitude, latitude]",
            "items": {
              "type": "number"
            },
            "examples": [
              [
                10.7522,
                59.911
              ]
            ]
          }
        }
      },
      "Metadata": {
        "required": [
          "query",
          "resultCount",
          "timestamp"
        ],
        "type": "object",
        "properties": {
          "query": {
            "$ref": "#/components/schemas/QueryInfo"
          },
          "timestamp": {
            "type": "string",
            "description": "Response generation time as an ISO 8601 instant (UTC).",
            "format": "date-time",
            "examples": [
              "2025-03-04T11:00:00Z"
            ]
          },
          "resultCount": {
            "type": "integer",
            "examples": [
              5
            ]
          }
        }
      },
      "QueryInfo": {
        "required": [
          "lang",
          "limit"
        ],
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "format": "double",
            "examples": [
              59.911
            ]
          },
          "lon": {
            "type": "number",
            "format": "double",
            "examples": [
              10.7522
            ]
          },
          "lang": {
            "type": "string",
            "examples": [
              "no"
            ]
          },
          "text": {
            "type": "string",
            "examples": [
              "Oslo S"
            ]
          },
          "limit": {
            "type": "integer",
            "examples": [
              10
            ]
          },
          "filters": {
            "$ref": "#/components/schemas/Filters"
          }
        }
      },
      "TransportMode": {
        "required": [
          "mode"
        ],
        "type": "object",
        "properties": {
          "mode": {
            "type": "string",
            "examples": [
              "bus"
            ]
          },
          "subMode": {
            "type": "string",
            "examples": [
              "localBus"
            ]
          }
        }
      }
    },
    "parameters": {
      "Ids": {
        "name": "ids",
        "in": "query",
        "description": "Place IDs to look up (at most 100)",
        "required": true,
        "style": "form",
        "explode": false,
        "schema": {
          "maxItems": 100,
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "examples": {
          "default": {
            "value": [
              "NSR:StopPlace:337",
              "NSR:StopPlace:59872"
            ]
          }
        }
      },
      "Bbox": {
        "name": "bbox",
        "in": "query",
        "description": "Restrict results to a bounding box: `minLon,minLat,maxLon,maxLat`. Unlike the focus point (a soft bias), this is a hard filter.",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "pattern": "^\\s*-?\\d+(\\.\\d+)?(\\s*,\\s*-?\\d+(\\.\\d+)?){3}\\s*$",
          "type": "string"
        },
        "examples": {
          "default": {
            "value": "10.5,59.8,10.9,60.0"
          }
        }
      },
      "Limit": {
        "name": "limit",
        "in": "query",
        "description": "Maximum number of results",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "maximum": 100,
          "minimum": 1,
          "type": "integer",
          "default": 10
        },
        "examples": {
          "default": {
            "value": 10
          }
        }
      },
      "Query": {
        "name": "q",
        "in": "query",
        "description": "Search query. Optional when at least one filter (e.g. `layers`, `stopPlaceTypes`, `fareZones`) is given; the response then lists every place matching the filters (e.g. every airport, or every stop place in a fare zone).",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "type": "string"
        },
        "examples": {
          "default": {
            "value": "Oslo S"
          }
        }
      },
      "Layers": {
        "name": "layers",
        "in": "query",
        "description": "Layer filter. See `stopPlaceTypes` for how the two compose.",
        "required": false,
        "style": "form",
        "explode": false,
        "schema": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "address",
              "street",
              "stopPlace",
              "groupOfStopPlaces",
              "poi",
              "place"
            ]
          }
        },
        "examples": {
          "default": {
            "value": [
              "stopPlace",
              "address"
            ]
          }
        }
      },
      "Radius": {
        "name": "radius",
        "in": "query",
        "description": "Search radius in kilometres (decimals accepted). If omitted, no radius limit is applied.",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "minimum": 0,
          "type": "number",
          "format": "double"
        },
        "examples": {
          "default": {
            "value": 0.5
          }
        }
      },
      "Sources": {
        "name": "sources",
        "in": "query",
        "description": "Data source filter",
        "required": false,
        "style": "form",
        "explode": false,
        "schema": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "openstreetmap",
              "kartverket-matrikkelenadresse",
              "kartverket-stedsnavn",
              "nsr",
              "custom-poi"
            ]
          }
        },
        "examples": {
          "default": {
            "value": [
              "openstreetmap"
            ]
          }
        }
      },
      "Counties": {
        "name": "counties",
        "in": "query",
        "description": "County IDs filter",
        "required": false,
        "style": "form",
        "explode": false,
        "schema": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "examples": {
          "default": {
            "value": [
              "KVE:TopographicPlace:03"
            ]
          }
        }
      },
      "Language": {
        "name": "lang",
        "in": "query",
        "description": "Language code for result names",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "type": "string",
          "default": "no"
        },
        "examples": {
          "default": {
            "value": "no"
          }
        }
      },
      "Latitude": {
        "name": "lat",
        "in": "query",
        "description": "Latitude",
        "required": true,
        "style": "form",
        "explode": true,
        "schema": {
          "maximum": 90,
          "minimum": -90,
          "type": "number",
          "format": "double"
        },
        "examples": {
          "default": {
            "value": 59.911
          }
        }
      },
      "Countries": {
        "name": "countries",
        "in": "query",
        "description": "ISO 3166-1 alpha-2 country code filter",
        "required": false,
        "style": "form",
        "explode": false,
        "schema": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "examples": {
          "default": {
            "value": [
              "no"
            ]
          }
        }
      },
      "FareZones": {
        "name": "fareZones",
        "in": "query",
        "description": "Fare zone IDs filter. Refs must be FareZone-shaped (e.g. `RUT:FareZone:1`); legacy `TariffZone` refs are not supported.",
        "required": false,
        "style": "form",
        "explode": false,
        "schema": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "examples": {
          "default": {
            "value": [
              "RUT:FareZone:1"
            ]
          }
        }
      },
      "Longitude": {
        "name": "lon",
        "in": "query",
        "description": "Longitude",
        "required": true,
        "style": "form",
        "explode": true,
        "schema": {
          "maximum": 180,
          "minimum": -180,
          "type": "number",
          "format": "double"
        },
        "examples": {
          "default": {
            "value": 10.7522
          }
        }
      },
      "Localities": {
        "name": "localities",
        "in": "query",
        "description": "Locality IDs filter",
        "required": false,
        "style": "form",
        "explode": false,
        "schema": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "examples": {
          "default": {
            "value": [
              "KVE:TopographicPlace:0301"
            ]
          }
        }
      },
      "Multimodal": {
        "name": "multimodal",
        "in": "query",
        "description": "Multimodal stop place filter. Standalone (monomodal) stop places always appear; this only decides whether multimodal parents, children, or both appear alongside them: `parent` (default) hides multimodal children, `child` hides multimodal parents, `all` shows both",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "type": "string",
          "default": "parent",
          "enum": [
            "parent",
            "child",
            "all"
          ]
        },
        "examples": {
          "default": {
            "value": "parent"
          }
        }
      },
      "DistanceSort": {
        "name": "distanceSort",
        "in": "query",
        "description": "Sort reverse results by distance from the query point (default) or by relevance when false.",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "type": "boolean",
          "default": true
        },
        "examples": {
          "default": {
            "value": true
          }
        }
      },
      "StopPlaceTypes": {
        "name": "stopPlaceTypes",
        "in": "query",
        "description": "Select stop places of these NeTEx types. Without `layers`, returns only these stop places and excludes other layers. With `layers`, constrains the `stopPlace` layer while other requested layers are returned additively (e.g. `layers=stopPlace,groupOfStopPlaces&stopPlaceTypes=railStation` returns rail stations plus groups). Ignored when `layers` is set but omits `stopPlace`.",
        "required": false,
        "style": "form",
        "explode": false,
        "schema": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "onstreetBus",
              "onstreetTram",
              "airport",
              "railStation",
              "metroStation",
              "busStation",
              "coachStation",
              "tramStation",
              "harbourPort",
              "ferryPort",
              "ferryStop",
              "liftStation",
              "vehicleRailInterchange",
              "other"
            ]
          }
        },
        "examples": {
          "default": {
            "value": [
              "railStation",
              "metroStation"
            ]
          }
        }
      },
      "AutocompleteRadius": {
        "name": "radius",
        "in": "query",
        "description": "Focus radius in kilometres (decimals accepted). Results within this distance from the focus point receive the strongest boost.",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "minimum": 0,
          "type": "number",
          "format": "double",
          "default": 50
        },
        "examples": {
          "default": {
            "value": 50
          }
        }
      },
      "AutocompleteWeight": {
        "name": "weight",
        "in": "query",
        "description": "Focus weight: how strongly to prefer results near the focus point. 0 = no preference, 1 = maximum preference.",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "maximum": 1,
          "minimum": 0,
          "type": "number",
          "format": "double",
          "default": 0.5
        },
        "examples": {
          "default": {
            "value": 0.5
          }
        }
      },
      "FareZoneAuthorities": {
        "name": "fareZoneAuthorities",
        "in": "query",
        "description": "Fare zone authorities filter",
        "required": false,
        "style": "form",
        "explode": false,
        "schema": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "examples": {
          "default": {
            "value": [
              "RUT:Authority:RUT"
            ]
          }
        }
      },
      "AutocompleteLatitude": {
        "name": "lat",
        "in": "query",
        "description": "Focus point latitude. When provided with lon, results near this point are boosted.",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "maximum": 90,
          "minimum": -90,
          "type": "number",
          "format": "double"
        },
        "examples": {
          "default": {
            "value": 59.911
          }
        }
      },
      "AutocompleteLongitude": {
        "name": "lon",
        "in": "query",
        "description": "Focus point longitude. Must be provided together with lat.",
        "required": false,
        "style": "form",
        "explode": true,
        "schema": {
          "maximum": 180,
          "minimum": -180,
          "type": "number",
          "format": "double"
        },
        "examples": {
          "default": {
            "value": 10.7522
          }
        }
      },
      "ET-Client-Name": {
        "in": "header",
        "name": "ET-Client-Name",
        "description": "\nEntur Client Header.\nIt is required that all consumers identify themselves by using this header.\nEntur will deploy strict rate-limiting policies on API-consumers who do not identify with a header and reserves the right to block unidentified consumers.\nThe structure of ET-Client-Name should be: `<company>-<application>` for companies, and `<personal name>-<application>` for individuals.",
        "schema": {
          "type": "string"
        }
      },
      "X-Correlation-Id": {
        "in": "header",
        "name": "X-Correlation-Id",
        "description": "Correlation id",
        "schema": {
          "type": "string"
        }
      }
    }
  }
}