NVBW API (1.4.0)

Download OpenAPI specification:

Retrieve eligible car park data across all 16 German federal states. Austria is excluded. Coverage depends on available records in the source systems.

Active car parks

Only currently operational car parks are returned: status In Betrieb (open) or Sonderbetrieb (limited), with the current UTC instant within the inclusive source operational start/end timestamps. Closed, planned/construction and maintenance parks are excluded, as are deleted records and missing or invalid operational dates. Special operation is included only while its operational interval is valid.

This rule applies to discovery, individual lookup and pagination. Ineligible identifiers return 404 on individual lookup; pagination totals count only eligible records. Eligibility is evaluated on each request, so the dataset can change between pages. This describes operational validity, not whether the parking is open at the current hour according to its opening-hours schedule.

Authentication

Every request requires HTTPS mutual TLS (mTLS). Configure the supplied password-protected PFX/PKCS#12 client certificate for nvbw.contipark-api.de and use the passphrase supplied separately. Keep server certificate validation enabled. The certificate and passphrase are not embedded in this document. This HTML file is an API reference; execute requests with an mTLS-capable client.

Quick start

Base URL: https://nvbw.contipark-api.de/v1

  1. Retrieve public identifiers with GET /carpark-publicids.
  2. Retrieve one car park with GET /carpark-data?publicID=f09aa708-c5f8-4c47-829c-963746e58cda. Identifiers shown in this documentation are fictional; obtain actual IDs from the authenticated discovery endpoint.
  3. Retrieve full records in pages with GET /carparks?offset=0&limit=150.

Pagination

Explicitly request limit=150 for more execution-time headroom. The server default when omitted and the maximum remain 250. A page may contain fewer records than requested: always use pagination.nextOffset for the next request and stop when it is null. Do not advance by the requested limit. For example, if returned=146 and nextOffset=146, continue with GET /carparks?offset=146&limit=150. Data is live, not a snapshot; additions and deletions can shift offsets between requests.

Last update

static_data_updated_at is the last parking save in Core, returned as an ISO 8601 UTC timestamp (for example, 2026-08-31T10:57:00.000Z). It is included in individual details and every paginated item. Saving the parking and its components in Core updates this timestamp. It is null if the source has no timestamp. It is not the retrieval time, and independent changes outside that save may not update it. The editor identity is not exposed.

The parking capacity label is Gesamtstellplätze. No reliable Park + Ride classification is available; do not infer it from the BahnPark flag or a station name.

Publication rules

Global IDs are internal and must not be published. Response fields indicate whether they may be published using their public flag; id.public remains false. Use publicID.value (UUIDv4, public: true) for publication and new external integrations. This centrally assigned identifier remains stable across edits and status changes. Both detail lookups and every paginated object include id and publicID.

Existing integrations and validation

GET /carpark-ids keeps its JSON array of Global IDs. Existing consumers can call GET /carpark-data?globalId=de-example-001 with their stored Global IDs and read publicID.value to build a mapping. Global ID discovery and lookup remain supported permanently and are not deprecated.

Detail lookup requires exactly one of globalId or publicID. Missing or both identifiers, malformed values, and unknown parameter names return 400. Unknown or ineligible identifiers return 404. Both lookup methods return the same parking data, within the same eligibility scope and mTLS controls.

Get permanent public car park IDs

Returns one public UUIDv4 for each currently operational German car park. Every returned UUID resolves through carpark-data?publicID while the park remains eligible. The same eligibility rules as Global ID discovery apply.

Authorizations:
clientCertificate

Responses

Response samples

Content type
application/json
Example
[
  • "123e4567-e89b-42d3-a456-426614174000",
  • "6ba7b810-9dad-41d1-80b4-00c04fd430c8"
]

Get car park IDs

Returns currently operational German car park Global IDs (open or limited within the valid operational interval). Austria and inactive parks are excluded.

Authorizations:
clientCertificate

Responses

Response samples

Content type
application/json
Example
[
  • "de-example-001",
  • "de-example-002",
  • "de-example-003"
]

Get car park data

Returns comprehensive data for a specific car park, including basic information, gates, dimensions, operations, opening hours, parking spots, charging stations, tags, and consumer management details. Supply exactly one of globalId or publicID. Missing, both, malformed or unknown parameters return 400. An unknown or ineligible identifier returns 404. Both lookup methods return identical data containing id (internal Global ID, public: false) and publicID (persistent UUIDv4, public: true). Existing consumers can use globalId lookup to map their stored IDs to publicID.value. Global ID remains supported permanently.

Authorizations:
clientCertificate
query Parameters
globalId
string [ 1 .. 128 ] characters
Example: globalId=de-example-001

Internal Global ID. Supply exactly one of globalId or publicID. Global ID lookup remains supported permanently; do not publish this identifier.

publicID
string <uuid> ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3...
Example: publicID=f09aa708-c5f8-4c47-829c-963746e58cda

Persistent public UUIDv4 from carpark-publicids, recommended for new integrations and publication. Supply exactly one of publicID or globalId.

Responses

Response samples

Content type
application/json
{
  • "id": {
    },
  • "publicID": {
    },
  • "type": {
    },
  • "namePublicDE": {
    },
  • "namePublicEN": {
    },
  • "gates": [
    ],
  • "dimensions": {
    },
  • "operations": {
    },
  • "generalInformation": {
    },
  • "station": {
    },
  • "bahnPark": {
    },
  • "openingHours": {
    },
  • "parkingSpots": {
    },
  • "chargingStations": {
    },
  • "tags": {
    },
  • "consumerManagement": {
    },
  • "static_data_updated_at": "2026-08-31T10:57:00.000Z"
}

Get paginated car park data

Returns complete details for eligible car parks, sorted by Global ID. Clients should explicitly request limit=150 to leave more execution-time headroom. Omitting limit still defaults to up to 250 items. Time and payload budgets can shorten a page: always continue using nextOffset, never offset + limit. The dataset is live, not a snapshot; insertions or deletions between requests can shift offsets. Every record includes id (internal Global ID, public: false) and publicID (persistent public UUIDv4, public: true). Recommend publicID.value for publication and external integrations. Global IDs remain supported permanently, are internal and must not be published.

Authorizations:
clientCertificate
query Parameters
offset
integer [ 0 .. 9007199254740991 ]
Default: 0
limit
integer [ 1 .. 250 ]
Default: 250
Example: limit=150

Recommended client page size: 150. The server default and maximum remain 250. Pages may still be shortened by time or payload budgets.

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}