Capacity & Counting APIs
Introduction
Scheidt & Bachmann exposes parking occupancy data through two complementary APIs. Both APIs provide real-time or near-real-time counter and occupancy information, but they serve different integration needs:
| eConnect Counting API | APDS Places & Occupancy API | |
|---|---|---|
| Standard | Proprietary S&B protocol | Alliance for Parking Data Standards (APDS) |
| Primary use | Poll counter values, manipulate occupancy state | Browse place hierarchy, sync occupancy, GIS queries |
| Authentication | Platform standard via bearer token (grant_type=client_credentials / see Authentication Guide) | Platform standard via bearer token (grant_type=client_credentials / see Authentication Guide) |
| Best for | Dashboards, barrier control, real-time displays | Third-party apps, data aggregators, standard integrations |
| Base path | /capacity-manager/v2/YOURPROJECT/... | /capacity-manager/v2/YOURPROJECT/... |
Both APIs require the YOURPROJECT path parameter to be replaced with your pre-shared Tenant Name.
eConnect Counting API
Overview
The entervo.connect Counting API provides real-time access to parking counter data in the Scheidt & Bachmann entervo system. It allows third-party applications to:
- Request and receive regularly updated counting data for all counter types (standard, level, sum)
- Retrieve counter data for all facilities with valid contracts, or for a specific facility by
locationId - Request opening hours for one or multiple parking facilities
- Perform counter manipulation: set occupied/free state, adjust maximum available places, increase or decrease free places
The interface is considered stable and backward-compatible. Expect new objects and additional properties in responses as the API evolves.
Counter Data Model
Counter Types
Counters are assigned per parking facility and identified by a locationId. Each facility may
have multiple counters differentiated by their counterType:
| Counter ID | counterType | Description |
|---|---|---|
0 | PREBOOKED | Pre-booked parking spaces |
1 | NON_RESERVED | Non-reserved (short-term) parking spaces |
2 | RESERVED | Reserved (contract/permit) parking spaces |
3 | PHYSICAL | Physical total capacity — aggregated, read-only |
Status Values
The status-value field on each counter indicates its current state:
| Value | Meaning |
|---|---|
0 | Free |
1 | Occupied by values |
2 | Occupied manually |
3 | Blocked |
Business Terms
| Term | Definition | Comment |
|---|---|---|
YOURPROJECT | Path parameter replaced by the actual tenant name | Pre-shared |
| Technical Tenant | A project is a technical tenant with separate data; no multi-tenancy across tenants | |
locationId | Proprietary ID of a parking facility (e.g. SB4011.4711.055555) | Pre-shared |
counterId | Numeric ID of a counter within a facility (0–3) | Used in manipulation requests |
present | Number of spaces currently in use | |
max | Maximum available places configured for the counter | |
free | Currently available (unoccupied) places | |
check-interval | Time between data update requests to the facility, in seconds | |
| Facility | A physical parking facility with counters and opening hours, identified by locationId |
Use Cases
| # | Use Case | Endpoint | Notes |
|---|---|---|---|
| 1 | Retrieve info for all facilities | GET v2/YOURPROJECT/occupancy/facilities | Discover and verify locationId values |
| 2 | Retrieve standard counters for all facilities | GET v2/YOURPROJECT/occupancy/standardcounters | Poll regularly for occupancy dashboards |
| 3 | Retrieve standard counters for a specific facility | GET v2/YOURPROJECT/occupancy/standardcounters/{locationid} | Targeted query for a single facility |
| 4 | Retrieve opening hours for all facilities | GET v2/YOURPROJECT/occupancy/openinghours | Returns 7-day schedule |
| 5 | Retrieve opening hours for a specific facility | GET v2/YOURPROJECT/occupancy/openinghours/{locationid} | |
| 6 | Manipulate a counter | PUT v2/YOURPROJECT/occupancy/counter/{locationid}/{counterid} | Exactly one query parameter must be provided |
Facilities API
GET all facilities
GET https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/v2/YOURPROJECT/occupancy/facilities
Returns last successful and failed update timestamps for all parking facilities with valid contracts.
Response Example
{
"facility": [
{
"facility-name": "Main Car Park",
"business-partner-name": "Businesspartner Ltd.",
"location-id": "SB4011.4711.055555",
"last-success": "2024-06-10T08:15:00.000Z",
"last-failure": null,
"check-interval": 600,
"last-request-duration": 0.214
}
]
}
Standard Counters API
GET all standard counters
GET https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/v2/YOURPROJECT/occupancy/standardcounters
Returns standard counter data (present, max, free) for all facilities with valid contracts.
Response Example
{
"facility": [
{
"facility-name": "Main Car Park",
"business-partner-name": "Businesspartner Ltd.",
"location-id": "SB4011.4711.055555",
"last-success": "2024-06-10T08:15:00.000Z",
"counters": {
"facility-no": 15,
"standard-counter": [
{ "id": 0, "type": 0, "present": 5, "max": 20, "free": 15, "counterType": "PREBOOKED", "status-value": 0 },
{ "id": 1, "type": 0, "present": 42, "max": 200, "free": 158, "counterType": "NON_RESERVED", "status-value": 0 },
{ "id": 2, "type": 0, "present": 18, "max": 50, "free": 32, "counterType": "RESERVED", "status-value": 0 }
]
}
}
]
}
GET standard counters by location ID
GET https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/v2/YOURPROJECT/occupancy/standardcounters/{locationid}
Returns all standard counters for the facility with the given locationid.
Response Example
{
"facility-name": "Main Car Park",
"business-partner-name": "Businesspartner Ltd.",
"location-id": "SB4011.4711.055555",
"last-success": "2024-06-10T08:15:00.000Z",
"counters": {
"facility-no": 15,
"standard-counter": [
{ "id": 1, "type": 0, "present": 42, "max": 200, "free": 158, "counterType": "NON_RESERVED", "status-value": 0 }
]
}
}
Opening Hours API
GET opening hours for all facilities
GET https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/v2/YOURPROJECT/occupancy/openinghours
Returns the 7-day opening hours schedule for all facilities with valid contracts.
Response Example
{
"facility": [
{
"facility-name": "Main Car Park",
"location-id": "SB4011.4711.055555",
"opening-hours": {
"facility-no": 15,
"open-hour": [
{
"weekday": "Monday",
"time-format": "24h",
"hour-open": 6, "minutes-open": 0,
"hour-closing": 22, "minutes-closing": 0,
"main-sing-status": 1,
"short-park-status": 1,
"reset-present-at-open-time": 1
},
{
"weekday": "Saturday",
"time-format": "24h",
"hour-open": 7, "minutes-open": 0,
"hour-closing": 20, "minutes-closing": 0,
"main-sing-status": 1,
"short-park-status": 0,
"reset-present-at-open-time": 0
},
{
"weekday": "Sunday",
"time-format": "24h",
"hour-open": 0, "minutes-open": 0,
"hour-closing": 0, "minutes-closing": 0,
"main-sing-status": 0,
"short-park-status": 0,
"reset-present-at-open-time": 0
}
]
}
}
]
}
GET opening hours by location ID
GET https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/v2/YOURPROJECT/occupancy/openinghours/{locationid}
Returns the opening hours for a single facility identified by locationid.
Counter Manipulation API
PUT counter
PUT https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/v2/YOURPROJECT/occupancy/counter/{locationid}/{counterid}
Manipulates the values of the selected counter. Exactly one query parameter must be provided per request:
| Query Parameter | Type | Description |
|---|---|---|
occupiedstate | integer | Set occupancy state: 0 = free, 1 = manually occupied |
maxplaces | integer | Set maximum available places (absolute value, minimum 0) |
increasefreeplaces | integer | Increase the number of free places by this value |
decreasefreeplaces | integer | Decrease the number of free places by this value |
The PHYSICAL counter (id = 3) cannot be manipulated. Attempting to do so returns
ECONNECT_PHYSICAL_COUNTER_UPDATE_NOT_ALLOWED.
Examples
# Set counter to occupied (manual)
PUT .../counter/SB4011.4711.055555/1?occupiedstate=1
# Set maximum places to 100
PUT .../counter/SB4011.4711.055555/2?maxplaces=100
# Increase free places by 10
PUT .../counter/SB4011.4711.055555/1?increasefreeplaces=10
Response Example
{ "status": 0 }
A status of 0 indicates success. Any other value indicates failure.
Error Codes
All error responses are returned as text/plain:
| Error Code | Description |
|---|---|
COUNTER_NOT_FOUND | The requested counter could not be found |
ILLEGAL_ARGUMENT | An illegal or invalid argument was provided |
INTERNAL_SERVER_ERROR | An unexpected error occurred on the server |
COUNTER_CAPACITY_EXCEEDED | Counter capacity exceeded |
ECONNECT_INVALID_OCCUPIED_STATE | Cannot set counter to free while it is still full |
ECONNECT_PHYSICAL_COUNTER_UPDATE_NOT_ALLOWED | Update of the PHYSICAL counter (id=3) is not supported |
ECONNECT_NO_GIVEN_COUNTERS_FOR_UPDATE | No query parameter was provided; exactly one is required |
ECONNECT_MORE_THEN_ONE_COUNTERS_WAS_GIVEN_FOR_UPDATE | More than one query parameter was provided; exactly one is required |
Swagger: https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/swagger-ui/index.html
APDS Places & Occupancy API
Overview
The APDS API implements the Alliance for Parking Data Standards (APDS) — an international
standard for exchanging parking data. It provides standard CRUD operations plus listing and
searching of Places (parking hierarchy elements) and their Occupancy.
Key capabilities:
- Browse and search the parking place hierarchy (campus → facility → area → individual space)
- Filter places by geographic coordinates, modification time, type, structure, and rights
- Retrieve detailed occupancy data (live counts, percentages, per-space status)
- Update place metadata and push occupancy readings into the system
Required Permissions
| Operation | Required Permission |
|---|---|
| Read places / occupancy | apds_read |
| Update places / occupancy | apds_update |
Place Hierarchy
Places are organised in a tree-like hierarchy. Each element is a HierarchyElementData
with an id, a version, a type, and links to its parent and children:
| Type | Description |
|---|---|
campus | Large area containing many parking structures |
identifiedArea | A coherent set of spaces sharing the same characteristics |
parkingPlace | A single identifiable parking facility |
space | A single parking space marked by road-surface markers |
subplaceElement | A reusable collection of identifiable areas |
A typical hierarchy:
campus (layer 0)
└── parkingPlace (layer 1)
└── identifiedArea (layer 2)
└── space (layer 3)
Each element carries:
id+version— unique versioned identityname— multilingual string (ISO 639-1 language codes)layer— depth in the hierarchy (0 = top)parentId/childIds— links to adjacent nodeshierarchyElementReference— links tosupply(capacity) anddemandTable(occupancy)
Business Terms
| Term | Definition | Comment |
|---|---|---|
YOURPROJECT | Path parameter replaced by the actual tenant name | Pre-shared |
| Technical Tenant | A project is a technical tenant with separate data; no multi-tenancy across tenants | |
| Place | Any element in the parking hierarchy, identified by id + version | |
| Supply | Total number of spaces available for a place element (supplyQuantity) | Can be spaceView (marked) or vehicleView (estimated) |
| DemandTable | Table of actual occupancy readings (count, percentage, recordDateTime) | Attached to a place via hierarchyElementReference |
| OccupancyLevel | High-level occupancy indicator via a code list entry | Visible on HierarchyElementGeneral |
| RightSpecification | Describes a parking right (access permission, permit, etc.) associated with a place | Filtered via right_type query parameter |
| VersionedReference | A reference to another object using its id and version |
Premises
| Term | Definition |
|---|---|
| Mandatory pre-shared references | Pre-configured Tenant Name and Place id (for single-resource operations) |
| Authentication | Follows the platform standard — see the Authentication Guide |
Use Cases
| # | Use Case | Endpoint | Notes |
|---|---|---|---|
| 1 | Browse all places | GET /v2/YOURPROJECT/places | Use pageSize and offset for pagination |
| 2 | Filter places by location | GET /v2/YOURPROJECT/places?latitude=…&longitude=…&radius=… | All three parameters are required together |
| 3 | Read a specific place with occupancy | GET /v2/YOURPROJECT/places/{id}?expand=occupancy | Use expand=all to include all optional attributes |
| 4 | Browse changes since a point in time | GET /v2/YOURPROJECT/places?modified_since=1718000000 | Use for incremental sync / delta updates |
| 5 | Update occupancy for a place | PUT /v2/YOURPROJECT/places/{id} | Requires apds_update permission |
Places API
GET list of places
GET https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/v2/YOURPROJECT/places
Lists and searches the place hierarchy. All query parameters are optional.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
offset | integer | Items to skip for pagination (default 0) |
pageSize | integer | Items per page, 1–100 (default 20) |
referenceInstant | integer | Unix epoch timestamp for consistent multi-page queries |
latitude | float | Latitude filter — requires longitude and radius |
longitude | float | Longitude filter — requires latitude and radius |
radius | float | Search radius in metres |
modified_since | integer | Unix epoch seconds; returns only places modified after this timestamp |
layer | integer | Most detailed hierarchy layer to return (0 = top) |
type | string | Comma-separated HierarchyElementTypeEnum values |
right_type | string | Comma-separated right types (accessPermission, permitParking, oneTimeUseParking, …) |
structure_type | string | Comma-separated structure types (offStreetStructure, offStreetSurface, onStreet) |
structure_grade | string | Comma-separated structure grades (aboveGround, groundLevel, underground) |
name | string | Filter by place name |
expand | string | Comma-separated optional attributes (see Expand Options below) |
Expand Options
| Value | Description |
|---|---|
all | Include all optional attributes |
none | Exclude all optional attributes |
occupancy | Include demandTable (occupancy readings) |
rightSpecifications | Include associated right specifications |
areaLocation | Include geographic area (GeoJSON multi-polygon) |
pointLocation | Include representative point coordinates |
contacts | Include contact points |
operatingRestrictions | Include operating restrictions |
characteristics | Include facility characteristics |
paymentMethods | Include accepted payment methods |
openingTimes | Include operating time schedules |
streetAddress | Include postal address |
Response Example
{
"meta": {
"referenceInstant": 1718000000,
"offset": 0,
"pageSize": 20,
"total": 3
},
"deletedReferences": [],
"data": [
{
"id": "place-001",
"version": 1,
"name": [{ "language": "en", "string": "Main Car Park" }],
"description": [{ "language": "en", "string": "Multi-storey car park in city centre" }],
"layer": 0,
"type": "parkingPlace",
"hierarchyElementRecord": {
"creationTime": "2024-01-15T09:00:00Z",
"creatorEmail": "admin@example.com"
},
"hierarchyElementReference": {
"elementId": { "id": "place-001", "version": 1 },
"supply": [{ "supplyViewType": "spaceView", "supplyQuantity": 250 }]
}
},
{
"id": "place-002",
"version": 2,
"name": [{ "language": "en", "string": "Level 1 – Reserved" }],
"layer": 1,
"type": "identifiedArea",
"parentId": { "id": "place-001", "version": 1 },
"hierarchyElementRecord": { "creationTime": "2024-01-15T09:05:00Z" },
"hierarchyElementReference": {
"elementId": { "id": "place-002", "version": 2 },
"supply": [{ "supplyViewType": "spaceView", "supplyQuantity": 80 }]
}
}
]
}
GET place by ID
GET https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/v2/YOURPROJECT/places/{id}
Returns the latest version of a place hierarchy element. Use version to retrieve a previous
version and expand to include additional attributes.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
version | integer | Retrieve a specific previous version (minimum 1) |
expand | string | Optional attributes to include (see Expand Options above) |
Response Example — with expand=occupancy
{
"id": "place-001",
"version": 1,
"name": [{ "language": "en", "string": "Main Car Park" }],
"description": [{ "language": "en", "string": "Multi-storey car park in city centre" }],
"layer": 0,
"type": "parkingPlace",
"hierarchyElementRecord": {
"creationTime": "2024-01-15T09:00:00Z",
"creatorEmail": "admin@example.com"
},
"hierarchyElementReference": {
"elementId": { "id": "place-001", "version": 1 },
"supply": [{ "supplyViewType": "spaceView", "supplyQuantity": 250 }],
"demandTable": [
{
"timestamp": "2024-06-10T08:00:00Z",
"frequency": "PT5M",
"demandType": [
{
"count": 175,
"percentage": 70.0,
"occupancyCalculation": "counted",
"recordDateTime": "2024-06-10T08:00:00Z"
}
]
}
]
}
}
Update place / occupancy
PUT https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/v2/YOURPROJECT/places/{id}
Updates a place hierarchy element or one of its associated attributes (e.g. Occupancy). Only
changed attributes need to be included.
For occupancy-only updates the place version does not need to be incremented.
Request Body — update occupancy
{
"id": "place-001",
"version": 1,
"hierarchyElementReference": {
"elementId": { "id": "place-001", "version": 1 },
"demandTable": [
{
"timestamp": "2024-06-10T08:15:00Z",
"frequency": "PT5M",
"demandType": [
{
"count": 180,
"percentage": 72.0,
"occupancyCalculation": "counted",
"recordDateTime": "2024-06-10T08:15:00Z"
}
]
}
]
}
}
Request Body — update place metadata
{
"id": "place-001",
"version": 2,
"name": [{ "language": "en", "string": "Main Car Park (Renovated)" }],
"description": [{ "language": "en", "string": "Newly renovated multi-storey car park" }],
"hierarchyElementRecord": { "creationTime": "2024-01-15T09:00:00Z" }
}
Response Example
{
"status": "ok",
"code": 200,
"message": "Place updated successfully"
}
Error Responses
All error responses return a ResponseStatus object:
| HTTP Status | status | Example message | Description |
|---|---|---|---|
400 | error | getPlacesId.version: must be greater than or equal to 1 | Invalid query parameter or request body |
403 | error | ACCESS_DENIED | Missing or insufficient API permission |
404 | error | PLACE_NOT_FOUND | No place found for the given id |
409 | error | VERSION_CONFLICT | Optimistic locking conflict on update |
501 | error | FILTERING_NOT_YET_IMPLEMENTED | Requested filter combination not yet supported |
Error Response Shape
{
"status": "error",
"code": 404,
"message": "PLACE_NOT_FOUND"
}
Swagger: https://pm.preprod.parking.scheidt-bachmann.net/capacity-manager/swagger-ui/index.html