Skip to main content

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 APIAPDS Places & Occupancy API
StandardProprietary S&B protocolAlliance for Parking Data Standards (APDS)
Primary usePoll counter values, manipulate occupancy stateBrowse place hierarchy, sync occupancy, GIS queries
AuthenticationPlatform standard via bearer token
(grant_type=client_credentials / see Authentication Guide)
Platform standard via bearer token
(grant_type=client_credentials / see Authentication Guide)
Best forDashboards, barrier control, real-time displaysThird-party apps, data aggregators, standard integrations
Base path/capacity-manager/v2/YOURPROJECT/.../capacity-manager/v2/YOURPROJECT/...
Authentication

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 IDcounterTypeDescription
0PREBOOKEDPre-booked parking spaces
1NON_RESERVEDNon-reserved (short-term) parking spaces
2RESERVEDReserved (contract/permit) parking spaces
3PHYSICALPhysical total capacity — aggregated, read-only

Status Values

The status-value field on each counter indicates its current state:

ValueMeaning
0Free
1Occupied by values
2Occupied manually
3Blocked

Business Terms

TermDefinitionComment
YOURPROJECTPath parameter replaced by the actual tenant namePre-shared
Technical TenantA project is a technical tenant with separate data; no multi-tenancy across tenants
locationIdProprietary ID of a parking facility (e.g. SB4011.4711.055555)Pre-shared
counterIdNumeric ID of a counter within a facility (0–3)Used in manipulation requests
presentNumber of spaces currently in use
maxMaximum available places configured for the counter
freeCurrently available (unoccupied) places
check-intervalTime between data update requests to the facility, in seconds
FacilityA physical parking facility with counters and opening hours, identified by locationId

Use Cases

#Use CaseEndpointNotes
1Retrieve info for all facilitiesGET v2/YOURPROJECT/occupancy/facilitiesDiscover and verify locationId values
2Retrieve standard counters for all facilitiesGET v2/YOURPROJECT/occupancy/standardcountersPoll regularly for occupancy dashboards
3Retrieve standard counters for a specific facilityGET v2/YOURPROJECT/occupancy/standardcounters/{locationid}Targeted query for a single facility
4Retrieve opening hours for all facilitiesGET v2/YOURPROJECT/occupancy/openinghoursReturns 7-day schedule
5Retrieve opening hours for a specific facilityGET v2/YOURPROJECT/occupancy/openinghours/{locationid}
6Manipulate a counterPUT 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 ParameterTypeDescription
occupiedstateintegerSet occupancy state: 0 = free, 1 = manually occupied
maxplacesintegerSet maximum available places (absolute value, minimum 0)
increasefreeplacesintegerIncrease the number of free places by this value
decreasefreeplacesintegerDecrease the number of free places by this value
Note

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 CodeDescription
COUNTER_NOT_FOUNDThe requested counter could not be found
ILLEGAL_ARGUMENTAn illegal or invalid argument was provided
INTERNAL_SERVER_ERRORAn unexpected error occurred on the server
COUNTER_CAPACITY_EXCEEDEDCounter capacity exceeded
ECONNECT_INVALID_OCCUPIED_STATECannot set counter to free while it is still full
ECONNECT_PHYSICAL_COUNTER_UPDATE_NOT_ALLOWEDUpdate of the PHYSICAL counter (id=3) is not supported
ECONNECT_NO_GIVEN_COUNTERS_FOR_UPDATENo query parameter was provided; exactly one is required
ECONNECT_MORE_THEN_ONE_COUNTERS_WAS_GIVEN_FOR_UPDATEMore 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

OperationRequired Permission
Read places / occupancyapds_read
Update places / occupancyapds_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:

TypeDescription
campusLarge area containing many parking structures
identifiedAreaA coherent set of spaces sharing the same characteristics
parkingPlaceA single identifiable parking facility
spaceA single parking space marked by road-surface markers
subplaceElementA 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 identity
  • name — multilingual string (ISO 639-1 language codes)
  • layer — depth in the hierarchy (0 = top)
  • parentId / childIds — links to adjacent nodes
  • hierarchyElementReference — links to supply (capacity) and demandTable (occupancy)

Business Terms

TermDefinitionComment
YOURPROJECTPath parameter replaced by the actual tenant namePre-shared
Technical TenantA project is a technical tenant with separate data; no multi-tenancy across tenants
PlaceAny element in the parking hierarchy, identified by id + version
SupplyTotal number of spaces available for a place element (supplyQuantity)Can be spaceView (marked) or vehicleView (estimated)
DemandTableTable of actual occupancy readings (count, percentage, recordDateTime)Attached to a place via hierarchyElementReference
OccupancyLevelHigh-level occupancy indicator via a code list entryVisible on HierarchyElementGeneral
RightSpecificationDescribes a parking right (access permission, permit, etc.) associated with a placeFiltered via right_type query parameter
VersionedReferenceA reference to another object using its id and version

Premises

TermDefinition
Mandatory pre-shared referencesPre-configured Tenant Name and Place id (for single-resource operations)
AuthenticationFollows the platform standard — see the Authentication Guide

Use Cases

#Use CaseEndpointNotes
1Browse all placesGET /v2/YOURPROJECT/placesUse pageSize and offset for pagination
2Filter places by locationGET /v2/YOURPROJECT/places?latitude=…&longitude=…&radius=…All three parameters are required together
3Read a specific place with occupancyGET /v2/YOURPROJECT/places/{id}?expand=occupancyUse expand=all to include all optional attributes
4Browse changes since a point in timeGET /v2/YOURPROJECT/places?modified_since=1718000000Use for incremental sync / delta updates
5Update occupancy for a placePUT /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
ParameterTypeDescription
offsetintegerItems to skip for pagination (default 0)
pageSizeintegerItems per page, 1–100 (default 20)
referenceInstantintegerUnix epoch timestamp for consistent multi-page queries
latitudefloatLatitude filter — requires longitude and radius
longitudefloatLongitude filter — requires latitude and radius
radiusfloatSearch radius in metres
modified_sinceintegerUnix epoch seconds; returns only places modified after this timestamp
layerintegerMost detailed hierarchy layer to return (0 = top)
typestringComma-separated HierarchyElementTypeEnum values
right_typestringComma-separated right types (accessPermission, permitParking, oneTimeUseParking, …)
structure_typestringComma-separated structure types (offStreetStructure, offStreetSurface, onStreet)
structure_gradestringComma-separated structure grades (aboveGround, groundLevel, underground)
namestringFilter by place name
expandstringComma-separated optional attributes (see Expand Options below)
Expand Options
ValueDescription
allInclude all optional attributes
noneExclude all optional attributes
occupancyInclude demandTable (occupancy readings)
rightSpecificationsInclude associated right specifications
areaLocationInclude geographic area (GeoJSON multi-polygon)
pointLocationInclude representative point coordinates
contactsInclude contact points
operatingRestrictionsInclude operating restrictions
characteristicsInclude facility characteristics
paymentMethodsInclude accepted payment methods
openingTimesInclude operating time schedules
streetAddressInclude 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
ParameterTypeDescription
versionintegerRetrieve a specific previous version (minimum 1)
expandstringOptional 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.

Note

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 StatusstatusExample messageDescription
400errorgetPlacesId.version: must be greater than or equal to 1Invalid query parameter or request body
403errorACCESS_DENIEDMissing or insufficient API permission
404errorPLACE_NOT_FOUNDNo place found for the given id
409errorVERSION_CONFLICTOptimistic locking conflict on update
501errorFILTERING_NOT_YET_IMPLEMENTEDRequested 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