BYTETOOLS

OpenPLZ API

Free postal code API with no key: streets and localities for Germany, Austria, Switzerland and Liechtenstein with full administrative hierarchy. Tested.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-20

What is the OpenPLZ API?

OpenPLZ is a free, key-free API providing postal code and street directory data for Germany, Austria, Switzerland and Liechtenstein, including the full administrative hierarchy of municipality, district and federal state.

German-speaking countries share the PLZ postal code system, and OpenPLZ covers all four in one API with a consistent schema — which is unusual, since most postal APIs are single-country.

The administrative depth is what distinguishes it: alongside the locality name you get the municipality, district and federal state with their official statistical keys, which matters for anything involving German regional administration.

Quick facts

Base URL
https://openplzapi.org
Authentication
No API key required.
Rate limit
No published hard limit; fair use expected.
Pricing
Free and open source, using official open data.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the OpenPLZ API

Every request below was executed against the live API on 2026-08-20, and the response shown is the real body it returned — not an illustration.

1. Look up a German postal code

GET https://openplzapi.org/de/Localities?postalCode=10117

curl
curl 'https://openplzapi.org/de/Localities?postalCode=10117'
JavaScript (fetch)
const res = await fetch("https://openplzapi.org/de/Localities?postalCode=10117");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://openplzapi.org/de/Localities?postalCode=10117", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
[
  {
    "postalCode": "10117",
    "name": "Berlin",
    "municipality": {
      "key": "11000000",
      "name": "Berlin, Stadt",
      "type": "Kreisfreie Stadt"
    },
    "federalState": {
      "key": "11",
      "name": "Berlin"
    }
  }
]

2. Look up an Austrian postal code

GET https://openplzapi.org/at/Localities?postalCode=1010

curl
curl 'https://openplzapi.org/at/Localities?postalCode=1010'
JavaScript (fetch)
const res = await fetch("https://openplzapi.org/at/Localities?postalCode=1010");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://openplzapi.org/at/Localities?postalCode=1010", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
[
  {
    "key": "17223",
    "postalCode": "1010",
    "name": "Wien, Innere Stadt",
    "municipality": {
      "key": "90001",
      "code": "90101",
      "name": "Wien",
      "status": "Statutarstadt"
    },
    "district": {
      "key": "900",
      "code": "901",
      "name": "Wien  1., Innere Stadt"
    },
    "federalProvince": {
      "key": "9",
      "name": "Wien"
    }
  },
  {
    "key": "17223",
    "postalCode": "1010",
    "name": "Wien, Innere Stadt",
    "municipality": {
      "key": "90001",
      "code": "90401",
      "name": "Wien",
      "status": "Statutarstadt"
    },
    "district": {
      "key": "900",
      "code": "904",
      "name": "Wien  4., Wieden"
    },
    "federalProvince": {
      "key": "9",
      "name": "Wien"
    }
  },
  {
    "key": "17223",
    "postalCode": "1010",
    "name": "Wien, Innere Stadt",
    "municipality": {
      "key": "90001",
      "code": "90701",
      "name": "Wien",
      "status": "Statutarstadt"
    },
    "district": {
      "key": "900",
      "code": "907",
      "name": "Wien  7., Neubau"
    },
    "federalProvince": {
      "key": "9",
      "name": "Wien"
    }
  },
  {
    "key": "17223",
    "postalCode": "1010",
    "name": "Wien, Innere Stadt",
    "municipality": {
      "key": "90001",
      "code": "90901",
      "name": "Wien",
      "status": "Statutarstadt"
    },
    "district": {
      "key": "900",
      "code": "909",
      "name": "Wien  9., Alsergrund"
    },
    "federalProvince": {
      "key": "9",
      "name": "Wien"
    }
  }
]

Parameters

ParameterTypeRequiredDescription
<country>/LocalitiespathRequiredCountry code path: de, at, ch or li. de/Localities
postalCodestringOptionalPostal code to look up. 10117
namestringOptionalLocality name search. Berlin
<country>/StreetspathOptionalStreet directory search. de/Streets
page / pageSizeintegerOptionalPagination controls. 1

Response fields

postalCodestring
The postal code.
namestring
Locality name.
municipalityobject
Municipality with official key, name and type.
districtobject
District (Kreis) with key and name.
federalStateobject
Federal state (Bundesland) with key and name.
(AT) municipality.codestring
Austrian municipality code, where applicable.

What you can build with the OpenPLZ API

  • Autofill German, Austrian or Swiss address forms from a postal code
  • Validate postal codes across the DACH region with one API
  • Map addresses to official administrative regions
  • Build street-level address validation

Common errors and how to fix them

Empty array

The postal code does not exist in that country.

Fix: The country is a path segment — querying a German code under /at/ returns nothing.

Multiple localities per code

One postal code can cover several localities.

Fix: Expect an array; take the municipality and state from the first entry, which are consistent.

Wrong country path

de, at, ch and li are separate.

Fix: Choose the path segment matching the code's country.

OpenPLZ API — frequently asked questions

Is OpenPLZ free?

Yes, completely free and open source with no API key, built on official open data.

Which countries does it cover?

Germany, Austria, Switzerland and Liechtenstein — the whole German-speaking PLZ area — in one consistent schema.

Does it include street-level data?

Yes, the /Streets endpoints provide a street directory alongside locality lookup, which supports full address validation.

Why does one postal code return several results?

A postal code can span multiple localities. The municipality, district and federal state are consistent across them, so take those from the first entry.

Tools that pair with this API

OpenPLZ is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-20; always check the official documentation before relying on this API in production, as terms and limits can change.