APX Interface Specification · APX Specification · APX 0.16.0 · OpenAPI 0.16.0 · built on APDS 4.1 (2026-01-14) · DraftAPX
APX

Interface Specification

APX Specification: technical documentation

Version 0.16.0 (draft)

Updated 2026-11-02

APX Specification · APX 0.16.0 · OpenAPI 0.16.0 · built on APDS 4.1 (2026-01-14) · Draft

Introduction

The APDS 4.1 set gives its interface as an OpenAPI document, apds-api-4.1.yaml, alongside the Overview, Information Model, Data Dictionary and Use Case Document. APX does the same: the normative interface is spec/dist/apx-v1.yaml (OpenAPI 3.1). This document is a readable listing of that file, generated from it each time the documents are built. Where the two differ, the OpenAPI document wins.

The data elements the operations carry are defined in 03 Data Dictionary. The rules for using them are in the APX standard text, Parts 0 to 24 (docs/standard/).

Two surfaces on one host

One host serves both surfaces:

The "Origin" row in each operation says which surface it belongs to.

Conventions that apply to every operation

Topic Rule APX reference
Authentication OAuth 2.0 client credentials. APDS native routes use the APDS oAuth scheme and scopes (po, sp, ep, ad). APX routes use apxOAuth scopes. Part 9 §9.1, §9.2
Grants A token carries place grants. A request outside its grant is refused with insufficient-grant. Part 9 §9.3, §9.3a
Identity and versions Every APX record has an id and a version. Writes use optimistic concurrency; replays with the same idempotency key return the first result. Part 4 §4.1, §4.2a
Extensions Implementer data goes in the extensions container under a namespaced key. Part 4 §4.3, Part 10
Errors Errors are RFC 9457 problem details with an APX problem type. Part 12
Lists and change feeds Lists are paginated. mode=change with a cursor returns only what changed. Part 5 §5.2
Events Subscribers receive signed webhook deliveries in a common event envelope. Part 8, Part 9 §9.4
Commands Device commands are requested, may need approval, and report a result. Part 6

How to read an operation

Each operation has a summary table (operation id, origin, scopes and request body), a parameter table and a response table. Body types name the class in 03 Data Dictionary. Responses that every operation shares, such as 401, 403 and 429, are listed each time so that each operation can be read on its own.

Operations at a glance

The APX OpenAPI document declares 207 operations and 6 webhooks. 40 operations are APDS 4.1 native routes that APX carries; the rest are defined by APX.

Group Tag Operations
Start here Discovery 3
Platform Data 2
Platform Subscription 7
Platform Control 8
Platform Alerts 5
Platform Site configuration 12
Platform UI launch 5
Commerce Accounts 14
Commerce Reservations 3
Commerce Permits 2
Commerce Validations 17
Commerce Tolling 8
Vehicles and access LPR 7
Vehicles and access Credentials 11
Vehicles and access Valet 12
Vehicles and access Charging 9
Enforcement and service Violations 24
Enforcement and service Plate lists 8
Enforcement and service Resolution 8
Enforcement and service Support 4
Webhooks (event deliveries) Webhooks 6
APDS 4.1 native routes Places 5
APDS 4.1 native routes Observation 5
APDS 4.1 native routes Organisations 5
APDS 4.1 native routes Right Specifications 5
APDS 4.1 native routes Rate Tables 5
APDS 4.1 native routes Sessions 5
APDS 4.1 native routes Assigned Rights 5
APDS 4.1 native routes Quote 3

1 Start here

1.1 Discovery

Where every integration starts. A partner needs exactly one thing to begin: a hostname.

Method Path Summary Scopes
GET /v1/digest-keys The keys behind apds-ext:apx:credential-digest@1.0 apx.digest:use
GET /v1/discovery Credential-scoped capability document
GET /.well-known/apx-configuration Bootstrap configuration document

1.1.1 GET /v1/digest-keys

The keys behind apds-ext:apx:credential-digest@1.0. The digest keys the implementation currently signs credential digests with, so an authorised consumer can compute the digest of a plate it holds and match it to decorated records without ever receiving plates (Part 9 §9.6 rule 6). Rotation is by keyId; both keys are served during an overlap. The normalization the implementation applies before hashing is stated per key.

Item Value
Operation id get-apx-v1-digest-keys
Origin APX
Scopes apx.digest:use
Request body —
Response Body Meaning
200 object The keys.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

1.1.2 GET /v1/discovery

Credential-scoped capability document. Reflects the presented token's scopes and grants exactly: the endpoints, command types, topics, and place subtrees THIS client can use. Soundness rule: everything listed is callable; APX endpoints not listed fail with 403.

Item Value
Operation id get-apx-v1-discovery
Origin APX
Scopes none
Request body —
Response Body Meaning
200 DiscoveryDocument The capability document for this credential.
401 Problem Missing/invalid token.
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

1.1.3 GET /.well-known/apx-configuration

Bootstrap configuration document. Unauthenticated bootstrap document. Advertises the token endpoint, the APDS version this implementation extends, supported APX conformance classes, and code-list registry locations.

Item Value
Operation id get-well-known-apx-configuration
Origin APX
Scopes none
Request body —
Response Body Meaning
200 ApxConfiguration Bootstrap configuration
429 Problem Rate limited (problem type rate-limited, Part 12).

2 Platform

2.1 Data

Reading and writing parking data, and staying in sync.

Method Path Summary Scopes
GET /v1/places/{id}/occupancy Current occupancy snapshot for a place element apx.data:read
GET /v1/places/{id}/occupancy/history Occupancy per clock interval for one element apx.data:read

2.1.1 GET /v1/places/{id}/occupancy

Current occupancy snapshot for a place element. "How full is it right now" for one HierarchyElement, without pulling the Place hierarchy. A pure convenience READ over the APDS occupancy model (Supply + DemandTable) — the Place payload remains the source of truth. Fields the implementation does not know are simply absent. Threshold crossings publish apx.data.occupancy.v1 and SHOULD raise an occupancyThresholdExceeded alert (Part 7). Scope apx.data:read; the place grant must cover the element.

Item Value
Operation id get-apx-v1-places-id-occupancy
Origin APX
Scopes apx.data:read
Request body —
Parameter In Required Type Description
id path yes string uuid HierarchyElement UUID (Place, Level, Area, …).
Response Body Meaning
200 OccupancySnapshot The occupancy snapshot.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such place element.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.1.2 GET /v1/places/{id}/occupancy/history

Occupancy per clock interval for one element. The history behind the §5.5 snapshot (Part 5 §5.5a), derived from the APDS DemandTable records the implementation holds for the element. Buckets align to interval boundaries in the place's time zone; an element the implementation holds no occupancy for is 404 target-not-found; the apx_places grant must cover the element.

Item Value
Operation id get-apx-v1-places-id-occupancy-history
Origin APX
Scopes apx.data:read
Request body —
Parameter In Required Type Description
id path yes string uuid
from query yes string date-time
to query yes string date-time
interval query no string Bucket length (ISO 8601 duration); default PT1H. Servers MAY refuse an interval shorter than their sampling with 400.
Response Body Meaning
200 OccupancyHistoryPage The buckets.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.2 Subscription

Push instead of poll. A superset-compatible profile of the APDS 4.1 /webhooks endpoint: stock APDS subscription bodies work here unmodified.

Method Path Summary Scopes
GET /webhooks List subscriptions (APX additive operation) apx.subscriptions:manage po sp ad
POST /webhooks Subscribe to event topics (APDS-compatible superset) apx.subscriptions:manage po sp ad
GET /webhooks/{id} Read one subscription (APX additive operation) apx.subscriptions:manage po sp ad
PATCH /webhooks/{id} Update a subscription (APX additive operation) apx.subscriptions:manage po sp ad
DELETE /webhooks/{id} Revoke (delete) existing subscription apx.subscriptions:manage po sp ad
GET /webhooks/{id}/deliveries Delivery ledger for a subscription apx.subscriptions:manage po sp ad
GET /v1/events/stream Server-Sent Events stream (conformance class apx-events-sse) apx.subscriptions:manage

2.2.1 GET /webhooks

List subscriptions (APX additive operation). Lists subscriptions visible to the caller. Secrets are never returned.

Item Value
Operation id get-webhooks
Origin APX
Scopes apx.subscriptions:manage, po, sp, ad
Request body —
Parameter In Required Type Description
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated subscription list (APDS PaginatedList shape).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.2.2 POST /webhooks

Subscribe to event topics (APDS-compatible superset). Creates a subscription. A stock APDS 4.1 EventSubscription ({endpoint, topics[]} with EventTypeEnum values) is a valid body; APX fields (transport, filters, secret) are additive.

Item Value
Operation id post-webhooks
Origin APDS 4.1 native route
Scopes apx.subscriptions:manage, po, sp, ad
Request body ApxEventSubscription
Parameter In Required Type Description
Prefer header no string (return=representation) RFC 7240. return=representation selects the APX-rich 201 response (subscription + one-time secret). Absent, the server answers with the stock APDS 200/202 ResponseStatus contract.
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 ResponseStatus Stock APDS contract — subscription approved and activated (request did not ask for the APX representation). ids[] carries the new subscription's id as its single entry, so a stock client can later revoke it (Part 8 §8.1).
201 ApxEventSubscription APX contract (Prefer: return=representation) — subscription created; includes the signing secret, exactly once.
202 ResponseStatus Stock APDS contract — subscription request received; will be processed and then approved/declined. ids[] carries the new subscription's id as its single entry (Part 8 §8.1).
400 Problem An unregistered topic (unknown-topic), or a body that fails the schema or a field rule (invalid-request, with errors[]): a webhook-transport subscription without endpoint, an empty topics[], a secret under 32 bytes of entropy, or an extensions key outside the Part 4 §4.3 pattern.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem The Idempotency-Key was already used with a different body (idempotency-conflict). A replay with the same body returns the subscription as it now stands (Part 4 §4.2a) — never the secret a second time.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.2.3 GET /webhooks/{id}

Read one subscription (APX additive operation). Returns one subscription the caller may see — its status, activeKeyIds, and filters — without paging through GET /webhooks. Secrets are never returned. Readable in every state, including failed (Part 8 §8.1).

Item Value
Operation id get-webhooks-id
Origin APX
Scopes apx.subscriptions:manage, po, sp, ad
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the existing subscription
Response Body Meaning
200 ApxEventSubscription The subscription (secret never returned).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.2.4 PATCH /webhooks/{id}

Update a subscription (APX additive operation). Update topics, endpoint, filters, or status (pause, resume a paused or failed subscription), or rotate the secret. The body is a JSON Merge Patch over the subscription: send only what changes (Part 8 §8.1). The precondition is If-Match or the body version; a stale one is 409 version-conflict (Part 4 §4.2a). While the subscription is failed, the only PATCH accepted is one that sets status: active; any other is 410 subscription-failed.

Item Value
Operation id patch-webhooks-id
Origin APX
Scopes apx.subscriptions:manage, po, sp, ad
Request body ApxEventSubscriptionPatch
Parameter In Required Type Description
id path yes string Unique identifier for the existing subscription
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 ApxEventSubscription Updated subscription (secret never returned).
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such subscription.
409 Problem Stale If-Match or body version (version-conflict, Part 4 §4.2a).
410 Problem The subscription is failed and the body does not set status: active (subscription-failed, Part 8 §8.1).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.2.5 DELETE /webhooks/{id}

Revoke (delete) existing subscription. Native APDS 4.1 operation, unchanged (APDS ResponseStatus shape).

Item Value
Operation id delete-webhooks-id
Origin APDS 4.1 native route
Scopes apx.subscriptions:manage, po, sp, ad
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the existing subscription
Response Body Meaning
200 ResponseStatus Subscription deleted.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Subscription not found.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.2.6 GET /webhooks/{id}/deliveries

Delivery ledger for a subscription. Returns the delivery records for auditing: one per (event, subscription), with the attempt count, status, last HTTP code, and the per-attempt history (attemptHistory: each attempt's APX-Delivery-Id, time, and code — Part 8 §8.3). Newest first. Readable in every subscription state. An event held while the subscription is paused has no record until its first attempt.

Item Value
Operation id get-webhooks-id-deliveries
Origin APX
Scopes apx.subscriptions:manage, po, sp, ad
Request body —
Parameter In Required Type Description
id path yes string
page query no integer The page number for paginated responses.
status query no string (delivered, retrying, failed) Only records in this delivery status.
eventId query no string uuid Only the record of this EventEnvelope.id.
since query no string date-time Only records whose latest attempt is at or after this instant (RFC 3339).
Response Body Meaning
200 object Delivery records.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such subscription.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.2.7 GET /v1/events/stream

Server-Sent Events stream (conformance class apx-events-sse). Streams EventEnvelopes for a subscription with transport: sse. Frame grammar (normative, Part 8 §8.4): one event per frame, an id: line carrying the per-subscription sequence (a decimal integer), a single data: line carrying the envelope JSON, and a blank line; retry: and comment lines MAY appear. Reconnect with Last-Event-ID to resume strictly after that sequence.

Item Value
Operation id get-apx-v1-events-stream
Origin APX
Scopes apx.subscriptions:manage
Request body —
Parameter In Required Type Description
subscription query yes string uuid
Last-Event-ID header no string
Response Body Meaning
200 string text/event-stream of EventEnvelope objects, one per frame (id: <sequence>, data: <EventEnvelope JSON>, blank line).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such subscription, or its transport is not sse — both target-not-found (transport is checked before status).
410 Problem The subscription exhausted its retry schedule and is failed (subscription-failed), or Last-Event-ID is older than the server's buffer (stream-position-expired) — Part 8 §8.4.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.3 Control

Doing things in the real world. APDS inventories devices and marks access-controlled places but defines no actuation. This is it.

Method Path Summary Scopes
GET /v1/commands List and filter commands (the audit query) apx.control:read
POST /v1/commands Execute a command (idempotent, perishable, audited) apx.control:execute
GET /v1/commands/{id} Read a command (lifecycle + audit trail) apx.control:read
POST /v1/commands/{id}/cancel Cancel a command before dispatch apx.control:execute
GET /v1/devices List device status overlays apx.control:read
GET /v1/devices/{id} Read one device's status overlay apx.control:read
GET /v1/lanes/{id}/current Lane inquiry — current transaction context (screen-pop) apx.control:read
GET /v1/validations/providers List validation providers for a place apx.control:read

2.3.1 GET /v1/commands

List and filter commands (the audit query). The commands the caller may see, newest first by the time the command was received, each with its full statusHistory (Part 6 §6.1b). Only commands whose target lies inside the token's apx_places grant are returned; naming a place outside the grant is 403 insufficient-grant. All filters combine with AND.

Item Value
Operation id get-apx-v1-commands
Origin APX
Scopes apx.control:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
target query no string uuid Commands whose target.id is this device, lane, or place.
place query no array of string Comma-separated HierarchyElement ids; subtree-inclusive (a command at a lane matches its parent Place).
commandType query no string An apx-command-types value (or an implementer's own).
status query no string (received, accepted, rejected, dispatched, executing, succeeded, failed, expired, cancelled)
agent query no string Commands whose agent equals this principal.
since query no string date-time Received at or after this instant (the first statusHistory entry).
until query no string date-time Received before this instant.
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated commands (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.3.2 POST /v1/commands

Execute a command (idempotent, perishable, audited). Requests an operational action (vendGate, lostTicket, pushRate, applyValidation, …). Idempotency-Key REQUIRED. Returns 202 with the Command; poll GET /v1/commands/{id} or subscribe to apx.control.command.status.v1. Requires scope apx.control:execute AND a place grant covering the target.

Item Value
Operation id post-apx-v1-commands
Origin APX
Scopes apx.control:execute
Request body Command
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 Command Idempotent replay — same key + same body returns the command as it currently stands, not a snapshot of the first response (Part 4 §4.2a, Part 6 §6.1).
202 Command Command accepted for asynchronous execution.
400 Problem Missing Idempotency-Key (idempotency-key-required); an unknown commandType, a missing target, or a parameter that fails its §6.1 definition (invalid-request, with errors[]); or a command that requires agent without one (agent-required) — Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope or place grant (Part 9), the current resolution context evaluated the action as not allowed (action-not-allowed), or approval evidence is missing (approval-required) — Part 17 §17.3.
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict), or pushNegotiatedRate / matchTicket at a lane with no transaction in progress (lane-no-current-transaction) — Part 12.
422 Problem Refused synchronously, nothing dispatched: command expired before dispatch (command-expired); unknown validation provider (validation-provider-unknown); lostTicket at a place whose applicable rate deck has no lostTicketFee line (lost-ticket-fee-undefined, Part 6 §6.1); a RateTable not flagged negotiable (rate-not-negotiable); a session that is not open (session-not-open); or a parameter Reference that names nothing (reference-unknown) — Part 12.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.3.3 GET /v1/commands/{id}

Read a command (lifecycle + audit trail). Returns the Command including its immutable statusHistory.

Item Value
Operation id get-apx-v1-commands-id
Origin APX
Scopes apx.control:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Command The command.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such command.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.3.4 POST /v1/commands/{id}/cancel

Cancel a command before dispatch. Allowed in received/accepted states; afterwards 409 command-not-cancellable.

Item Value
Operation id post-apx-v1-commands-id-cancel
Origin APX
Scopes apx.control:execute
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Command Cancelled command.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Not cancellable from the current state (command-not-cancellable).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.3.5 GET /v1/devices

List device status overlays. Live DeviceStatus for every SupplementalEquipment the caller may see, optionally narrowed by place and state (Part 6 §6.4). Naming a place outside the token's apx_places grant is 403 insufficient-grant.

Item Value
Operation id get-apx-v1-devices
Origin APX
Scopes apx.control:read
Request body —
Parameter In Required Type Description
place query no array of string Comma-separated HierarchyElement ids; subtree-inclusive (a device on a lane matches its parent Place).
deviceState query no string An apx-device-states value, e.g. fault for everything in fault.
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Device status list.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.3.6 GET /v1/devices/{id}

Read one device's status overlay. DeviceStatus keyed by the SupplementalEquipment id.

Item Value
Operation id get-apx-v1-devices-id
Origin APX
Scopes apx.control:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 DeviceStatus Device status.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such device.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.3.7 GET /v1/lanes/{id}/current

Lane inquiry — current transaction context (screen-pop). The ticket/credential currently in the machine at this lane, amount due, applied validations, latest LPR read, and monthly-credential context including the last 10 activity events. When no ticket is in the machine — or when a lookup parameter is given — also matchCandidates[]: the open sessions at the place that plausibly belong to the vehicle in the lane (Part 6 §6.7), for a driver who has lost the ticket.

Item Value
Operation id get-apx-v1-lanes-id-current
Origin APX
Scopes apx.control:read
Request body —
Parameter In Required Type Description
id path yes string uuid VehicularAccess (lane) UUID.
plate query no string Ticket-matching override — the plate as the driver reads it, when the camera missed or misread (Part 6 §6.7).
phone query no string Ticket-matching override — a permit holder's phone number, resolved through the account registry (Part 13 §13.1); never a call-routing identifier (Part 17 §17.1).
credential query no string Ticket-matching override — a credential identification (card number, tag) the driver names.
Response Body Meaning
200 LaneStatus Current lane status.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such lane or no live state.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.3.8 GET /v1/validations/providers

List validation providers for a place. The venues allowed to validate tickets at the place.

Item Value
Operation id get-apx-v1-validations-providers
Origin APX
Scopes apx.control:read
Request body —
Parameter In Required Type Description
place query yes string uuid
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Validation providers.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.4 Alerts

Knowing something is wrong. A net-new domain: APDS has no alert, event, or notification class.

Method Path Summary Scopes
GET /v1/alerts List/filter alerts apx.alerts:read
POST /v1/alerts Raise an alert (idempotent) apx.alerts:write
GET /v1/alerts/{id} Read an alert apx.alerts:read
POST /v1/alerts/{id}/acknowledge Acknowledge an alert apx.alerts:write
POST /v1/alerts/{id}/resolve Resolve an alert apx.alerts:write

2.4.1 GET /v1/alerts

List/filter alerts. Filter by status, severityFloor, type, place (subtree-inclusive), device, relatedEntity, since. Alerts with no place binding (e.g. webhookDeliveryFailed) are visible to tokens of the owning organisation and are excluded whenever place is given (Part 7 §7.1).

Item Value
Operation id get-apx-v1-alerts
Origin APX
Scopes apx.alerts:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
status query no string (raised, acknowledged, resolved, expired)
severityFloor query no string (info, warning, minor, major, critical)
type query no string
place query no string uuid
device query no string uuid Alerts whose source.device.id is this SupplementalEquipment.
relatedEntity query no string uuid Alerts whose relatedEntity.id is this entity (a Session, a Subscription, a Command…).
since query no string date-time
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated alerts (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.4.2 POST /v1/alerts

Raise an alert (idempotent). Raises an alert. The Idempotency-Key header is REQUIRED: replaying the same key with the same body returns the alert as it currently stands (200, Part 4 §4.2a); the same key with a different body is 409 idempotency-conflict. A client MAY supply id (Part 7 §7.1).

Item Value
Operation id post-apx-v1-alerts
Origin APX
Scopes apx.alerts:write
Request body Alert
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 Alert Idempotent replay — same key + same body returns the alert as it currently stands (e.g. already acknowledged), not a snapshot of the first response (Part 4 §4.2a).
201 Alert Alert raised.
400 Problem Missing Idempotency-Key (idempotency-key-required) or a body that fails the Alert schema, e.g. an unknown severity or no detectionTime (invalid-request, with errors[]) — Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict), or a client-supplied id that already exists (id-collision) — Part 12.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.4.3 GET /v1/alerts/{id}

Read an alert. Returns the alert including its immutable statusHistory.

Item Value
Operation id get-apx-v1-alerts-id
Origin APX
Scopes apx.alerts:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Alert The alert.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such alert.
429 Problem Rate limited (problem type rate-limited, Part 12).

2.4.4 POST /v1/alerts/{id}/acknowledge

Acknowledge an alert. Transition raised → acknowledged. Illegal transitions are 409 alert-transition-illegal. The optional body annotates the history entry this transition appends (Part 7 §7.2); a request with no body is unchanged.

Item Value
Operation id post-apx-v1-alerts-id-acknowledge
Origin APX
Scopes apx.alerts:write
Request body AlertTransition
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Alert Acknowledged alert.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Illegal transition from the current state (alert-transition-illegal, Part 7 §7.3).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.4.5 POST /v1/alerts/{id}/resolve

Resolve an alert. Transition raised|acknowledged → resolved. Illegal transitions are 409 alert-transition-illegal. The optional body annotates the history entry this transition appends (Part 7 §7.2); a request with no body is unchanged.

Item Value
Operation id post-apx-v1-alerts-id-resolve
Origin APX
Scopes apx.alerts:write
Request body AlertTransition
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Alert Resolved alert.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Illegal transition from the current state (alert-transition-illegal, Part 7 §7.3).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5 Site configuration

A location, described by APX alone. Before a call, an agent or a system should be able to learn what a site has without data from any other system: which hardware is on each lane and what each piece does, what it is, what runs on it, where the cameras are and what they see, how a parker reaches help from each lane or door, and who to escalate to.

Method Path Summary Scopes
GET /v1/equipment List a place's equipment with its roles, makes, versions and areas apx.siteconfig:read
GET /v1/equipment/{id} Read one piece of equipment apx.siteconfig:read
GET /v1/comms-points List or look up comms points apx.siteconfig:read
POST /v1/comms-points Add a comms point apx.siteconfig:manage
GET /v1/comms-points/{id} Read a comms point apx.siteconfig:read
PUT /v1/comms-points/{id} Replace a comms point apx.siteconfig:manage
DELETE /v1/comms-points/{id} Remove a comms point apx.siteconfig:manage
POST /v1/identifiers:resolve Find the APX record behind another system's id apx.siteconfig:read
POST /v1/cameras/{id}/views Get a short-lived link to see a camera apx.cameras:view
GET /v1/display-records List the messages signs showed apx.siteconfig:read
POST /v1/display-records Record that a sign showed a message apx.displays:record
GET /v1/display-records/{id} Read a display record apx.siteconfig:read

2.5.1 GET /v1/equipment

List a place's equipment with its roles, makes, versions and areas. Every SupplementalEquipment at the place, each with its apds-ext:apx:equipment-detail@1.0 decoration, so a reader learns what the site has from APX alone (Part 26 §26.1). Distinct from GET /v1/devices, which serves live state; this serves the description. mode=change&cursor= serves the Part 5 §5.2 feed, so an edge or call-centre system keeps a local copy current. Naming a place outside the grant is 403 insufficient-grant.

Item Value
Operation id get-apx-v1-equipment
Origin APX
Scopes apx.siteconfig:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
place query yes string uuid The HierarchyElement subtree root.
role query no string An apx-equipment-roles value.
area query no string An apx-area-types value.
lane query no string uuid Equipment serving this VehicularAccess.
level query no string
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated equipment; with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.2 GET /v1/equipment/{id}

Read one piece of equipment. The SupplementalEquipment with its APX decorations (Part 26 §26.1).

Item Value
Operation id get-apx-v1-equipment-id
Origin APX
Scopes apx.siteconfig:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 EquipmentRecord The equipment record.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.3 GET /v1/comms-points

List or look up comms points. The ways a parker reaches help at the caller's places (Part 26 §26.4). A call platform finds the comms point of an inbound contact with callerId, dialedNumber or commsDeviceId; the answer carries the lane, or the place only. mode=change&cursor= serves the Part 5 §5.2 feed.

Item Value
Operation id get-apx-v1-comms-points
Origin APX
Scopes apx.siteconfig:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
place query no string uuid
lane query no string uuid
type query no string An apx-comms-point-types value.
callerId query no string E.164; matches callerId.
dialedNumber query no string E.164; matches phoneNumber.
commsDeviceId query no string
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated comms points; with mode=change, the changes after cursor in the same envelope.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.4 POST /v1/comms-points

Add a comms point. Whoever runs the calls adds the comms point, the call centre or the call platform (Part 26 §26.4). place must lie inside the grant (403 insufficient-grant); lane, equipment and serves must exist (422 reference-unknown). Idempotency-Key optional. Publishes apx.commspoints.changed.v1.

Item Value
Operation id post-apx-v1-comms-points
Origin APX
Scopes apx.siteconfig:manage
Request body CommsPoint
Parameter In Required Type Description
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 CommsPoint Idempotent replay.
201 CommsPoint Created.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem A type outside the registry, or a place, lane, equipment or serves that does not exist (reference-unknown).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.5 GET /v1/comms-points/{id}

Read a comms point. The comms point with the lane or place it serves and the barrier an agent opens for it (Part 26 §26.4).

Item Value
Operation id get-apx-v1-comms-points-id
Origin APX
Scopes apx.siteconfig:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 CommsPoint The comms point.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.6 PUT /v1/comms-points/{id}

Replace a comms point. Full replacement with the version last read as If-Match or body version (409 version-conflict, Part 4 §4.2a). Publishes apx.commspoints.changed.v1.

Item Value
Operation id put-apx-v1-comms-points-id
Origin APX
Scopes apx.siteconfig:manage
Request body CommsPoint
Parameter In Required Type Description
id path yes string uuid
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 CommsPoint Replaced.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Stale version (version-conflict).
422 Problem A type outside the registry, or a reference that does not exist (reference-unknown).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.7 DELETE /v1/comms-points/{id}

Remove a comms point. The feed emits a tombstone (Part 5 §5.2); publishes apx.commspoints.changed.v1.

Item Value
Operation id delete-apx-v1-comms-points-id
Origin APX
Scopes apx.siteconfig:manage
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
204 — Removed.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.8 POST /v1/identifiers:resolve

Find the APX record behind another system's id. Looks up a {system, id} pair from any apds-ext:apx:external-ids@1.0 decoration the caller may see (Part 26 §26.6), so a PARCS, a call platform or an aggregator goes from its own id to the place, lane, equipment or comms point without a table of its own. A read, as a POST so the id never sits in a URL. No match is 404 target-not-found.

Item Value
Operation id post-apx-v1-identifiers-resolve
Origin APX
Scopes apx.siteconfig:read
Request body IdentifierResolveRequest
Response Body Meaning
200 IdentifierResolution The record the id names.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No visible record carries this id (target-not-found).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.9 POST /v1/cameras/{id}/views

Get a short-lived link to see a camera. A live stream, a still, or a recording of the camera (the SupplementalEquipment with role camera), as a single-use link bound to the agent and valid for at most 5 minutes (Part 26 §26.3). Whoever holds the camera answers; its password never leaves the site. Every view is logged against the agent and correlationId. Offered under the cameraViews feature; playback also needs cameraPlayback.

Item Value
Operation id post-apx-v1-cameras-id-views
Origin APX
Scopes apx.cameras:view
Request body CameraViewRequest
Parameter In Required Type Description
id path yes string uuid The camera's SupplementalEquipment id.
Response Body Meaning
201 CameraView The link.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem The camera is offline, has no recorder for playback, or the implementation cannot issue a view now (camera-view-unavailable).
422 Problem playback with a from/to outside the camera's retention or missing (playback-range-unavailable), or a kind the camera's streams cannot serve (request-unprocessable).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.10 GET /v1/display-records

List the messages signs showed. The records that a sign showed a message, newest first (Part 26 §26.9): which sign, which kind of message, when, and for which read or stay. An operator measures the signs with them; an appeal finds the proof of display. mode=change&cursor= serves the Part 5 §5.2 feed. A place outside the grant is 403 insufficient-grant.

Item Value
Operation id get-apx-v1-display-records
Origin APX
Scopes apx.siteconfig:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
place query no string uuid The HierarchyElement subtree root.
display query no string uuid The sign's SupplementalEquipment id.
messageKind query no string An apx-display-message-kinds value or implementer code.
session query no string uuid Records for this stay.
observation query no string uuid Records triggered by this read.
since query no string date-time Inclusive lower bound on shownTime.
until query no string date-time Exclusive upper bound on shownTime.
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated display records; with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.11 POST /v1/display-records

Record that a sign showed a message. Written by whichever system drove the display, the edge controller, the PARCS or the sign's player, usually with no APX command involved (Part 26 §26.9). display must be a SupplementalEquipment (422 reference-unknown); the server derives place from it. No message text and no plate are stored. With command, shownTime and contentHash must agree with that command's CommandResult.display. Immutable once written. Idempotency-Key optional. Publishes apx.displays.shown.v1.

Item Value
Operation id post-apx-v1-display-records
Origin APX
Scopes apx.displays:record
Request body DisplayRecord
Parameter In Required Type Description
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 DisplayRecord Idempotent replay.
201 DisplayRecord Recorded.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem A display, observation, session or command that names nothing visible (reference-unknown); a body place that disagrees with the display's, or a record that disagrees with its command's result (request-unprocessable).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.5.12 GET /v1/display-records/{id}

Read a display record. What a sign showed, when, and for which read or stay (Part 26 §26.9).

Item Value
Operation id get-apx-v1-display-records-id
Origin APX
Scopes apx.siteconfig:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 DisplayRecord The display record.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.6 UI launch

The vendor's own screen, without breaking the record. Most actions in a call centre still happen in a vendor's portal in another window, and the two systems never agree afterwards. A vendor will take years to implement every APX module, but it already has good screens.

Method Path Summary Scopes
GET /v1/ui/launches List launches apx.ui:read
POST /v1/ui/launches Open a vendor screen for an agent (handshake launch) apx.ui:launch
GET /v1/ui/launches/{id} Read a launch and what was done in it apx.ui:read
POST /v1/ui/launches/{id}/actions Record an action done in the screen (loopback fallback) apx.ui:record
POST /v1/ui/launches/{id}/close Close a launch apx.ui:record

2.6.1 GET /v1/ui/launches

List launches. The launch records visible to the caller, newest first (Part 25 §25.3). url is never included on a list read.

Item Value
Operation id get-apx-v1-ui-launches
Origin APX
Scopes apx.ui:read
Request body —
Parameter In Required Type Description
place query no string uuid Launches at this place or its subtree.
agent query no string
status query no string (issued, opened, closed, expired)
correlationId query no string uuid
interactionId query no string
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated launches.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.6.2 POST /v1/ui/launches

Open a vendor screen for an agent (handshake launch). The host sends its normal APX token and gets back a single-use url that logs the named agent into the surface, valid for at most 60 seconds (Part 25 §25.2). This is the launch mode for vendors who want header-based authentication, since a browser cannot add headers when it opens a page. place must lie inside the grant (403 insufficient-grant). Idempotency-Key optional (Part 4 §4.2a). Publishes apx.ui.launch.changed.v1.

Item Value
Operation id post-apx-v1-ui-launches
Origin APX
Scopes apx.ui:launch
Request body UiLaunchRequest
Parameter In Required Type Description
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 UiLaunch Idempotent replay.
201 UiLaunch Issued. url and expiresAt are set; status is issued.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem A surface this implementation does not offer, or not at this place (ui-surface-unknown); a displayMode the surface does not support (ui-display-mode-unsupported); or a subject, place or lane that does not exist (reference-unknown).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.6.3 GET /v1/ui/launches/{id}

Read a launch and what was done in it. The launch with its actions[] (Part 25 §25.3). url is present only while the launch is issued and before expiresAt.

Item Value
Operation id get-apx-v1-ui-launches-id
Origin APX
Scopes apx.ui:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 UiLaunch The launch.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.6.4 POST /v1/ui/launches/{id}/actions

Record an action done in the screen (loopback fallback). The surface, or the service behind it, records what the agent did when the implementation could not express it as the module's own resource or Command (Part 25 §25.4). The record carries the launch's correlationId and is published as apx.ui.action.recorded.v1. A launch that was never opened and has expired refuses with ui-launch-expired; a closed one with ui-launch-closed.

Item Value
Operation id post-apx-v1-ui-launches-id-actions
Origin APX
Scopes apx.ui:record
Request body UiActionRecord
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
201 UiActionRecord Recorded.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem The launch is expired (ui-launch-expired) or closed (ui-launch-closed).
429 Problem Rate limited (problem type rate-limited, Part 12).

2.6.5 POST /v1/ui/launches/{id}/close

Close a launch. The screen reports it is done: opened (or issued) → closed (Part 25 §25.3). No body. Publishes apx.ui.launch.changed.v1. Already closed is 409 ui-launch-closed.

Item Value
Operation id post-apx-v1-ui-launches-id-close
Origin APX
Scopes apx.ui:record
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 UiLaunch The closed launch.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Already closed (ui-launch-closed).
429 Problem Rate limited (problem type rate-limited, Part 12).

3 Commerce

3.1 Accounts

Money. Account and balance lookup, taking a payment, refunds, voids and captures, accounting write-back, and payment history.

Method Path Summary Scopes
POST /v1/accounts:search The account lookup with personal data in a body, never a URL apx.accounts:read
POST /v1/payments:search The payment-history lookup with the keys in a body apx.accounts:read
GET /v1/accounts Look up accounts by name/phone/email/card/plate apx.accounts:read
GET /v1/accounts/{id} Full account info apx.accounts:read
GET /v1/payments Payment history by ticket, card digits, or account apx.accounts:read
POST /v1/payments Take a payment (idempotent) apx.payments:write
POST /v1/payments/{id}/postings Accounting write-back (PARIS-style) apx.payments:write
POST /v1/payments/{id}/refund Refund a payment (financial domain action) apx.payments:write
POST /v1/payments/{id}/void Void a hold (an authorized, uncaptured payment) apx.payments:write
POST /v1/payments/{id}/capture Capture a hold (a previously authorized payment) apx.payments:write
POST /v1/payment-links Send a hosted payment link apx.payments:write
GET /v1/payment-links/{id} Read a payment link apx.accounts:read apx.payments:write
POST /v1/payment-links/{id}/cancel Cancel a payment link apx.payments:write
POST /v1/payments/{id}/receipt Send the receipt again apx.payments:write

3.1.1 POST /v1/accounts:search

The account lookup with personal data in a body, never a URL. The same lookup as GET /v1/accounts (Part 13 §13.1) with the keys in the body (Part 9 §9.6). Same rules, grant behaviour, and response; a card number pasted into card is 422 personal-data-not-permitted.

Item Value
Operation id post-apx-v1-accounts-search
Origin APX
Scopes apx.accounts:read
Request body AccountSearch
Response Body Meaning
200 object Matching accounts.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
422 Problem More than truncated card digits in card (personal-data-not-permitted).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.2 POST /v1/payments:search

The payment-history lookup with the keys in a body. The same lookup as GET /v1/payments (Part 13 §13.2) with the keys in the body (Part 9 §9.6). Same keys rule (at least one), 8-hour window on truncated keys, hold rules, grant behaviour, and response.

Item Value
Operation id post-apx-v1-payments-search
Origin APX
Scopes apx.accounts:read
Request body PaymentSearch
Response Body Meaning
200 object Matching payments.
400 Problem No key given (invalid-request).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
422 Problem More than four card digits in cardLast4 (personal-data-not-permitted).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.3 GET /v1/accounts

Look up accounts by name/phone/email/card/plate. Any combination of filters; returns accounts with balances and status. Results are constrained to the caller's apx_places grant (Part 13 §13.5); under an absent or empty grant the answer is an empty 200 (Part 9 §9.3a).

Item Value
Operation id get-apx-v1-accounts
Origin APX
Scopes apx.accounts:read
Request body —
Parameter In Required Type Description
name query no string
phone query no string
email query no string Exact contact e-mail (case-insensitive). Personal data (Part 9 §9.6).
card query no string
plate query no string
place query no array of string Narrow results below the grant (Part 13 §13.5(3)): comma-separated HierarchyElement ids, subtree-inclusive. A place outside the caller's grant is 403 insufficient-grant. Servers that do not implement narrowing ignore it.
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Matching accounts; with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.4 GET /v1/accounts/{id}

Full account info. Returns the account including balance and status.

Item Value
Operation id get-apx-v1-accounts-id
Origin APX
Scopes apx.accounts:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Account The account.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such account.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.5 GET /v1/payments

Payment history by ticket, card digits, or account. Payments made on a ticket or an account (Part 13 §13.2). At least one key — ticketLast4, cardLast4, ticketNumber, or account — is REQUIRED; date and place only narrow, and a query with no key is 400 invalid-request. Privacy rule: a truncated-key lookup without a date is constrained to the last 8 hours; ticketNumber and account are exempt. Results are constrained to the caller's grant (§13.5). Holds (captureStatus: authorized) are omitted unless captureStatus=authorized is asked for.

Item Value
Operation id get-apx-v1-payments
Origin APX
Scopes apx.accounts:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
ticketLast4 query no string
cardLast4 query no string Truncated payment-card digits — the transient-parker lookup of last resort (no LPR, no readable ticket). Same recent-window privacy rule as ticketLast4. At most four digits: a value carrying more is refused with 422 personal-data-not-permitted before the request is logged (Part 13 §13.2).
ticketNumber query no string Full ticket number, exact match. Exempt from the 8-hour window.
account query no string uuid Account id — every payment on the account (a statement view). Exempt from the 8-hour window.
date query no string date
place query no array of string Narrow results below the grant (Part 13 §13.5(3)): comma-separated HierarchyElement ids, subtree-inclusive. A place outside the caller's grant is 403 insufficient-grant. Never a key on its own.
captureStatus query no string (authorized, captured) authorized lists only holds (authorization-only payments not yet captured), which are otherwise never returned; captured lists only collected payments (the default behaviour made explicit). Absent = holds excluded (Part 13 §13.2). Never a key on its own.
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Matching payments; with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
422 Problem A query parameter carries more card digits than the truncated last four (personal-data-not-permitted, Part 13 §13.2). The server refuses before logging the request.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.6 POST /v1/payments

Take a payment (idempotent). Takes a payment against an account or ticket. Idempotency-Key REQUIRED. channel: autoAttendant = a PCI-compliant IVR captures the card out of band; APX never carries PANs. Declines are 422. With captureLater: true the payment is authorized only: a hold, created paymentStatus: approved with captureStatus: authorized, returned to this caller but not published or listed by default until captured (Part 13 §13.1a).

Item Value
Operation id post-apx-v1-payments
Origin APX
Scopes apx.payments:write
Request body PaymentRecord
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 PaymentRecord Idempotent replay — same key + same body returns the payment the key created, in its current representation (Part 4 §4.2a).
201 PaymentRecord Approved payment with transactionID (a hold with captureStatus authorized when captureLater was asked).
400 Problem Missing Idempotency-Key (idempotency-key-required), or a body that fails the schema or names neither account nor ticketNumber to settle (invalid-request, Part 12).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem Payment declined (payment-declined; the problem SHOULD carry a payment member referencing the recorded declined PaymentRecord, Part 13 §13.1); a body carrying card data beyond the truncated last four (personal-data-not-permitted, refused before it is persisted or logged); captureLater on a server without an authorization lifecycle, or apds-ext:apx:payment-detail@1.0 lines whose paymentType: payment values do not sum to amount or whose paymentType contradicts the validation code (request-unprocessable, nothing charged, Part 13 §13.6a).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.7 POST /v1/payments/{id}/postings

Accounting write-back (PARIS-style). Posts the payment to the monthly-parking/AR system; returns confirmation and new balance. Only an approved payment can be posted; any other state is 409 payment-state-illegal (Part 13 §13.1a).

Item Value
Operation id post-apx-v1-payments-id-postings
Origin APX
Scopes apx.payments:write
Request body PostingRequest
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
201 Posting Posting result.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such payment.
409 Problem The payment is not approved (payment-state-illegal, Part 13 §13.1a).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.8 POST /v1/payments/{id}/refund

Refund a payment (financial domain action). Refunds the payment fully, or partially per amount. A financial action per Part 17 §17.4 — never a control command. Idempotency-Key REQUIRED; approval evidence required when the resolution context's AllowedAction said so. Scope apx.payments:write.

Item Value
Operation id post-apx-v1-payments-id-refund
Origin APX
Scopes apx.payments:write
Request body object
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header yes string
Response Body Meaning
200 PaymentRecord The payment with refundedAmount increased; reversed once the cumulative refund reaches amount, otherwise still approved (Part 13 §13.1a).
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such payment.
409 Problem Not refundable in its current state — only approved is (payment-state-illegal, Part 13 §13.1a) — or Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem The requested amount exceeds what remains refundable (amount minus refundedAmount) — request-unprocessable.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.9 POST /v1/payments/{id}/void

Void a hold (an authorized, uncaptured payment). Financial domain action (Part 17 §17.4). Releases a hold (captureStatus: authorized): paymentStatus becomes reversed, nothing was collected, and no event is published (Part 13 §13.1a). Idempotency-Key REQUIRED. Scope apx.payments:write.

Item Value
Operation id post-apx-v1-payments-id-void
Origin APX
Scopes apx.payments:write
Request body —
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header yes string
Response Body Meaning
200 PaymentRecord The voided payment, now reversed.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such payment.
409 Problem Not a hold — already captured, declined, or reversed (payment-state-illegal) — or Idempotency-Key replayed with a different body (idempotency-conflict).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.10 POST /v1/payments/{id}/capture

Capture a hold (a previously authorized payment). Financial domain action (Part 17 §17.4). Settles a hold: captureStatus authorized → captured (paymentStatus stays approved), optionally for a lower amount than was authorized. The capture is when the payment is published and materialized (Part 13 §13.1a). Idempotency-Key REQUIRED. Scope apx.payments:write.

Item Value
Operation id post-apx-v1-payments-id-capture
Origin APX
Scopes apx.payments:write
Request body object
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header yes string
Response Body Meaning
200 PaymentRecord The captured payment, now captureStatus captured with amount = the captured amount.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such payment.
409 Problem Not a hold — already captured, declined, or reversed (payment-state-illegal, Part 13 §13.1a) — or Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem Capture amount exceeds the authorized amount (request-unprocessable).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.11 POST /v1/payment-links

Send a hosted payment link. The customer-service payment action of first resort (Part 13 §13.1a): sends a hosted payment link via the given channel for an account, ticket, or session. APX never carries PANs. Idempotency-Key REQUIRED. Scope apx.payments:write. Payment completion arrives as apx.accounts.payment.recorded.v1.

Item Value
Operation id post-apx-v1-payment-links
Origin APX
Scopes apx.payments:write
Request body PaymentLink
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 PaymentLink Idempotent replay — same key + same body returns the link the key created, in its current representation (status may have advanced; Part 4 §4.2a).
201 PaymentLink The link, sent.
400 Problem Missing Idempotency-Key (idempotency-key-required), or a body that fails the schema or names no account, ticket, or session to settle (invalid-request, Part 12).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body.
422 Problem A channel this server does not deliver on (request-unprocessable), or a body carrying card data (personal-data-not-permitted, refused before it is persisted or logged; Part 13 §13.1).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.12 GET /v1/payment-links/{id}

Read a payment link. The link's current lifecycle state (sent → opened → paid | expired | cancelled, Part 13 §13.1a) and, once paid, the resulting PaymentRecord. Grant-checked on the link's place.

Item Value
Operation id get-apx-v1-payment-links-id
Origin APX
Scopes apx.accounts:read, apx.payments:write
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 PaymentLink The payment link.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.13 POST /v1/payment-links/{id}/cancel

Cancel a payment link. Kills a link before the customer pays (sent to the wrong number, paid another way): sent | opened → cancelled. The hosted page MUST stop accepting payment from that instant. A link that is paid, expired, or already cancelled is 409 payment-state-illegal (Part 13 §13.1a). Idempotency-Key optional (Part 4 §4.2a).

Item Value
Operation id post-apx-v1-payment-links-id-cancel
Origin APX
Scopes apx.payments:write
Request body PaymentLinkCancel
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 PaymentLink The link, now cancelled (or its current representation on an idempotent replay).
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem The link is paid, expired, or already cancelled (payment-state-illegal), or Idempotency-Key replayed with a different body (idempotency-conflict).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.1.14 POST /v1/payments/{id}/receipt

Send the receipt again. Re-sends the receipt of a settled payment by e-mail, SMS, a re-print at the device, or a short-lived link (Part 13 §13.1a). The destination travels in the body, never in a URL. Accepted for delivery (202); the outcome is in the returned ReceiptDelivery.

Item Value
Operation id post-apx-v1-payments-id-receipt
Origin APX
Scopes apx.payments:write
Request body ReceiptRequest
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
202 ReceiptDelivery Queued or sent.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem The payment is not settled (payment-state-illegal, Part 13 §13.1a).
422 Problem A channel this implementation or device cannot serve (receipt-channel-unsupported), or a destination missing for email/sms (request-unprocessable).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.2 Reservations

Booking ahead, expressed as conventions over native APDS routes rather than a parallel booking system.

Method Path Summary Scopes
GET /v1/reservations/recent A customer's last 10 reservations apx.reservations:manage
PUT /v1/sessions/{id}/assigned-right Link a session to its AssignedRight (reservation/permit) apx.reservations:manage
POST /v1/sessions/{id}/assigned-right/unlink Undo a session's link to its AssignedRight apx.reservations:manage

3.2.1 GET /v1/reservations/recent

A customer's last 10 reservations. Customer history for screen-pops and dispute handling: the same holder's most recent reservations (newest planned start first), resolved from a plate or an explicit RightHolder id. At least one of plate or holder is REQUIRED (400 invalid-request otherwise); when both are given the result is their intersection (reservations of that holder carrying that plate). from/to, state, country, and stateProvince narrow further (Part 14 §14.1a).

Item Value
Operation id get-apx-v1-reservations-recent
Origin APX
Scopes apx.reservations:manage
Request body —
Parameter In Required Type Description
plate query no string
holder query no string uuid
country query no string Plate issuing country (APDS VehicleAncillaryIdentification.country vocabulary). Qualifies plate; absent, the plate string alone is matched.
stateProvince query no string Plate issuing state/province (APDS VehicleAncillaryIdentification.stateProvince vocabulary). Qualifies plate.
from query no string date-time Only reservations whose plannedStart is at or after this instant. from later than to is 400 invalid-request.
to query no string date-time Only reservations whose plannedStart is before this instant.
state query no string (confirmed, amended, cancelled, checkedIn, noShow) Only reservations currently in this reservationState.
place query no string uuid Scope results to one location (for implementations fronting multiple places). Holder ids are LOCAL to each implementation — there is no central user catalog; cross-system correlation is by plate (Part 14 §14.1a).
Response Body Meaning
200 object Up to 10 reservation summaries.
400 Problem Neither plate nor holder given, or an inverted from/to window (problem type invalid-request).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The named place does not exist (problem type target-not-found). A place that exists outside the caller's grant is 403 insufficient-grant (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.2.2 PUT /v1/sessions/{id}/assigned-right

Link a session to its AssignedRight (reservation/permit). The explicit reservation↔session link for facilities where the plate cannot be the link (barcode-only reservations, unreadable plates). Mirrors plate correction (Part 17 §17.5): a transactional domain action, naturally idempotent (PUT).

Item Value
Operation id put-apx-v1-sessions-id-assigned-right
Origin APX
Scopes apx.reservations:manage
Request body object
Parameter In Required Type Description
id path yes string uuid APDS Session UUID.
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 object The link, applied.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such session or AssignedRight.
409 Problem The AssignedRight is not linkable (right-not-linkable: already consumed elsewhere, outside its validity, wrong place, in reservationState cancelled or noShow, or the session is already linked to a different right), or If-Match names a stale Session version (version-conflict, Part 4 §4.2a).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.2.3 POST /v1/sessions/{id}/assigned-right/unlink

Undo a session's link to its AssignedRight. The audited undo of PUT /v1/sessions/{id}/assigned-right (Part 14 §14.1b): removes the linked AssignedRight from the session's current segment, reverts the segment to the implementation's drive-up right, and returns the reservation to its pre-check-in reservationState (confirmed or amended, clearing checkInSession). MUST materialize in the underlying APDS Session and MUST publish SessionUpdated, like the link. reason is REQUIRED. Unlinking a session that carries no linked right is a no-op 200 without unlinkedRight. A closed Session is 422 session-not-open.

Item Value
Operation id post-apx-v1-sessions-id-assigned-right-unlink
Origin APX
Scopes apx.reservations:manage
Request body object
Parameter In Required Type Description
id path yes string uuid APDS Session UUID.
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 object The session, unlinked.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem If-Match names a stale Session version (version-conflict, Part 4 §4.2a).
422 Problem The Session is closed (session-not-open); pricing has settled.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.3 Permits

Pooled permits: issuing from a finite allocation, over the APDS right-specification and right-pool model.

Method Path Summary Scopes
GET /v1/permits/pools/{rightSpecId}/availability Pool availability for a pooled RightSpecification apx.permits:manage
POST /v1/permits/issue Issue a permit from a pool (multi-vehicle credentials) apx.permits:manage

3.3.1 GET /v1/permits/pools/{rightSpecId}/availability

Pool availability for a pooled RightSpecification. Profile over APDS RightPool — capacity, issued, available — for one pool of the RightSpecification. With neither pool nor at, the pool whose validity contains now, else the earliest future pool (Part 14 §14.2).

Item Value
Operation id get-apx-v1-permits-pools-rightspecid-availability
Origin APX
Scopes apx.permits:manage
Request body —
Parameter In Required Type Description
rightSpecId path yes string uuid
pool query no string uuid A RightPool id of this RightSpecification; takes precedence over at.
at query no string date-time Select the pool whose validity contains this instant (e.g. a date in November for a November pool), RFC 3339.
Response Body Meaning
200 PoolAvailability Availability.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No pool for this RightSpecification.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.3.2 POST /v1/permits/issue

Issue a permit from a pool (multi-vehicle credentials). Creates a native AssignedRight (APDS annual-permit pattern — one right, many vehicles), materialized per Part 14 §14.2. Pool exhaustion is 409 pool-exhausted. A client that may retry SHOULD send Idempotency-Key: a retried issue without one consumes a second pool slot.

Item Value
Operation id post-apx-v1-permits-issue
Origin APX
Scopes apx.permits:manage
Request body PermitIssueRequest
Parameter In Required Type Description
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 AssignedRight Idempotent replay — same key + same body returns the AssignedRight the key issued, in its current representation; no second slot is consumed (Part 4 §4.2a).
201 AssignedRight The issued AssignedRight (native APDS entity).
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Pool exhausted (pool-exhausted); Idempotency-Key replayed with a different body (idempotency-conflict); a stale rightSpecification.version (version-conflict); or a credential identification already active on another permit at the place (credential-identification-in-use, Part 14 §14.2).
422 Problem The rightSpecification or holder names nothing that exists or is visible (reference-unknown); or the RightSpecification has no rightPools, or a credentialType is not in its credentials allow-list (request-unprocessable, detail names the rule; Part 14 §14.2).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4 Validations

The merchant side, from enrolment to invoice.

Method Path Summary Scopes
GET /v1/validations/programs List/filter validation programs apx.validations:read apx.validations:redeem
POST /v1/validations/programs Enrol a validation program (idempotent) apx.validations:manage
GET /v1/validations/programs/{id} Read a validation program apx.validations:read apx.validations:redeem
PUT /v1/validations/programs/{id} Update a validation program (full update, versioned) apx.validations:manage
GET /v1/validations/programs/{id}/issuances List issuances for a program apx.validations:read apx.validations:redeem
POST /v1/validations/programs/{id}/issuances Issue a batch of validation instruments (idempotent) apx.validations:manage apx.validations:redeem
GET /v1/validations/instruments/{code} Check a validation code apx.validations:read apx.validations:redeem
POST /v1/validations/programs/{id}/issuances/{issuanceId}/void Void an issuance batch apx.validations:manage apx.validations:redeem
POST /v1/validations/instruments/{code}/void Void a single validation code apx.validations:manage apx.validations:redeem
GET /v1/validations/redemptions List/filter redemptions apx.validations:read apx.validations:redeem
POST /v1/validations/redemptions Record a redemption (idempotent) apx.validations:manage apx.validations:redeem
GET /v1/validations/redemptions/{id} Read a redemption apx.validations:read apx.validations:redeem
POST /v1/validations/redemptions/{id}/reverse Reverse a redemption apx.validations:manage
GET /v1/validations/programs/{id}/statement Preview a billing statement for a period apx.validations:read apx.validations:redeem
GET /v1/validations/programs/{id}/statements List closed statements for a program apx.validations:read apx.validations:redeem
POST /v1/validations/programs/{id}/statements Close a billing period (idempotent) apx.validations:manage
GET /v1/validations/statements/{id} Read a closed statement apx.validations:read apx.validations:redeem

3.4.1 GET /v1/validations/programs

List/filter validation programs. Filter by place (subtree-inclusive), provider, and status. A apx.validations:redeem token sees only programs whose provider is its own apx_org (Part 20 §20.5).

Item Value
Operation id get-apx-v1-validations-programs
Origin APX
Scopes apx.validations:read, apx.validations:redeem
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
place query no string uuid
provider query no string uuid
status query no string (active, suspended, ended)
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated programs (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.2 POST /v1/validations/programs

Enrol a validation program (idempotent). Enrols a merchant to validate parking at a place. Idempotency-Key REQUIRED. The program becomes a row in the Part 6 provider lookup for that place while active. Publishes apx.validations.program.status.v1.

Item Value
Operation id post-apx-v1-validations-programs
Origin APX
Scopes apx.validations:manage
Request body ValidationProgram
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 ValidationProgram Idempotent replay — same key + same body returns the program's current representation (Part 4 §4.2a).
201 ValidationProgram Program enrolled.
400 Problem Missing Idempotency-Key (idempotency-key-required) or a body that fails the schema (invalid-request, with errors[]).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body.
422 Problem reference-unknown — place, provider, or an applicableRateTables entry names nothing visible to the caller; or request-unprocessable — a benefit carrying none or more than one of amount/duration/percentage (§20.1).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.3 GET /v1/validations/programs/{id}

Read a validation program. Returns the program including rules, billing, and the immutable statusHistory. A redeem token reading another provider's program receives 404, exactly as for a program that does not exist (Part 9 §9.3a rule 2; Part 20 §20.5).

Item Value
Operation id get-apx-v1-validations-programs-id
Origin APX
Scopes apx.validations:read, apx.validations:redeem
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValidationProgram The program.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such program, or another provider's program under a redeem token (target-not-found).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.4 PUT /v1/validations/programs/{id}

Update a validation program (full update, versioned). Full-update semantics (Part 5 §5.1): the body carries the complete program. The precondition is the version last read, sent as If-Match: "<version>" or as the body's version (Part 4 §4.2a); a stale one is 409 version-conflict. Status transitions: active ⇄ suspended, either → ended (terminal; 422 program-not-active for any transition out of ended). Benefit and rule changes apply to redemptions from the update onward; existing instruments keep the benefit they were issued with.

Item Value
Operation id put-apx-v1-validations-programs-id
Origin APX
Scopes apx.validations:manage
Request body ValidationProgram
Parameter In Required Type Description
id path yes string uuid
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 ValidationProgram Updated program.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such program.
409 Problem Stale version (version-conflict, current version in detail).
422 Problem program-not-active — a transition out of ended; request-unprocessable — a benefit carrying none or more than one of amount/duration/percentage; reference-unknown — a body Reference names nothing visible to the caller.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.5 GET /v1/validations/programs/{id}/issuances

List issuances for a program. Batches issued to the program, newest first. Codes are never returned here.

Item Value
Operation id get-apx-v1-validations-programs-id-issuances
Origin APX
Scopes apx.validations:read, apx.validations:redeem
Request body —
Parameter In Required Type Description
id path yes string uuid
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated issuances (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such program, or (mode=change) a refused cursor (target-not-found; Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.6 POST /v1/validations/programs/{id}/issuances

Issue a batch of validation instruments (idempotent). Issues quantity instruments of method to the program the path names; the body need not repeat program (a value that differs from the path is 422 request-unprocessable). Idempotency-Key REQUIRED — a retried print job must not double the stock. For code/qrCode/digital, the generated codes[] are returned in THIS response only. Program must be active (422 program-not-active).

Item Value
Operation id post-apx-v1-validations-programs-id-issuances
Origin APX
Scopes apx.validations:manage, apx.validations:redeem
Request body ValidationIssuanceRequest
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header yes string
Response Body Meaning
200 ValidationIssuance Idempotent replay — returns the issuance's current representation, without codes (Part 4 §4.2a).
201 ValidationIssuance Batch issued; includes codes[] exactly once.
400 Problem Missing Idempotency-Key (idempotency-key-required) or a body that fails the schema (invalid-request, with errors[]).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such program.
409 Problem Idempotency-Key replayed with a different body.
422 Problem program-not-active — the program is not active; request-unprocessable — method is not in the program's issuanceMethods, or a body program differs from the path.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.7 GET /v1/validations/instruments/{code}

Check a validation code. "Is this code good?" — the pay-station / merchant-app read before applying. Returns status, program, validity window, and the benefit. A code the caller's grant cannot see is 404, never 403 (no oracle for guessing codes).

Item Value
Operation id get-apx-v1-validations-instruments-code
Origin APX
Scopes apx.validations:read, apx.validations:redeem
Request body —
Parameter In Required Type Description
code path yes string
Response Body Meaning
200 ValidationInstrument The instrument.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem Unknown code (or outside the caller's grant).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.8 POST /v1/validations/programs/{id}/issuances/{issuanceId}/void

Void an issuance batch. Transition issued → void for the batch, and every instrument in it that is valid or expired → void (Part 20 §20.2 rule 5) — the stolen sheet of QR codes. Instruments already redeemed are unaffected; their redemptions stand until reversed. The result's voidDetail.voidedCount says how many codes were voided. A redeem token may void only its own provider's batches (another provider's is 404, §20.5). Voiding a batch already void returns it unchanged (200). No event is published; the instrument read is the source of truth.

Item Value
Operation id post-apx-v1-validations-programs-id-issuances-issuanceid-void
Origin APX
Scopes apx.validations:manage, apx.validations:redeem
Request body ValidationVoid
Parameter In Required Type Description
id path yes string uuid
issuanceId path yes string uuid
Response Body Meaning
200 ValidationIssuance The voided issuance.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such program or issuance, or another provider's under a redeem token (target-not-found).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.9 POST /v1/validations/instruments/{code}/void

Void a single validation code. Transition one instrument valid or expired → void (Part 20 §20.2 rule 5) — a single leaked code. A redeemed code cannot be voided (422 instrument-invalid; reverse the redemption first). Voiding a code already void returns it unchanged (200). As on the read, a code outside the caller's grant or provider is 404, never 403.

Item Value
Operation id post-apx-v1-validations-instruments-code-void
Origin APX
Scopes apx.validations:manage, apx.validations:redeem
Request body ValidationVoid
Parameter In Required Type Description
code path yes string
Response Body Meaning
200 ValidationInstrument The voided instrument.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem Unknown code (or outside the caller's grant or provider).
422 Problem The code is already redeemed (instrument-invalid).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.10 GET /v1/validations/redemptions

List/filter redemptions. Filter by program, place, ticket, session, the Part 6 command that applied it, channel, status, and since (appliedTime). A redeem token sees only its own provider's redemptions (§20.5).

Item Value
Operation id get-apx-v1-validations-redemptions
Origin APX
Scopes apx.validations:read, apx.validations:redeem
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
program query no string uuid
command query no string uuid The applyValidation Command (Part 6 §6.3) whose redemption to find — matches ValidationRedemption.command.
place query no string uuid
ticket query no string
session query no string uuid
channel query no string (lane, payStation, merchantApp, callCenter, api)
status query no string (applied, reversed)
since query no string date-time
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated redemptions (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.11 POST /v1/validations/redemptions

Record a redemption (idempotent). Applies a validation to a ticket/session from a pay station, merchant app, or lane device — the data-plane counterpart of the Part 6 applyValidation command (which agents use to act on a lane; it materializes the same resource). Idempotency-Key REQUIRED. The server evaluates the program rules (Part 20 §20.3): 422 program-not-active, request-unprocessable (the body's place is not the program's place or within its subtree), instrument-invalid, redemption-limit-exceeded. On success the session gains the APDS Segment.validationId and amountReduced reflects the ACTUAL reduction. Publishes apx.validations.redeemed.v1.

Item Value
Operation id post-apx-v1-validations-redemptions
Origin APX
Scopes apx.validations:manage, apx.validations:redeem
Request body ValidationRedemption
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 ValidationRedemption Idempotent replay — same key + same body returns the redemption's current representation (Part 4 §4.2a).
201 ValidationRedemption Redemption applied.
400 Problem Missing Idempotency-Key (idempotency-key-required) or a body that fails the schema (invalid-request, with errors[]).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body.
422 Problem In §20.3 order: program-not-active (program not active); request-unprocessable (place mismatch — detail names the program's place); instrument-invalid (unknown, void, expired, or used code, or a required instrument absent); redemption-limit-exceeded (a program rule refuses it); reference-unknown (a body Reference names nothing visible).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.12 GET /v1/validations/redemptions/{id}

Read a redemption. Returns the redemption including any reversal and the immutable statusHistory. Another provider's redemption under a redeem token is 404 (Part 9 §9.3a rule 2).

Item Value
Operation id get-apx-v1-validations-redemptions-id
Origin APX
Scopes apx.validations:read, apx.validations:redeem
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValidationRedemption The redemption.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such redemption, or another provider's under a redeem token (target-not-found).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.13 POST /v1/validations/redemptions/{id}/reverse

Reverse a redemption. Transition applied → reversed; the amount due on the session is restored while the session is still open (Part 20 §20.4), and the instrument (if any) returns to valid while still within its window. Already reversed is 409 redemption-reversed. A redemption already billed on a CLOSED statement is reversed too: the closed statement is never edited; reversal.closedStatement names it, and the next statement closed for the program carries a negative credit line (reversal.creditedOn is set when it closes, §20.6).

Item Value
Operation id post-apx-v1-validations-redemptions-id-reverse
Origin APX
Scopes apx.validations:manage
Request body ValidationRedemptionReversal
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValidationRedemption Reversed redemption.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such redemption.
409 Problem Already reversed (redemption-reversed).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.14 GET /v1/validations/programs/{id}/statement

Preview a billing statement for a period. Computes the program's redemptions and billable total for from..to under its billing model — a preview (statementStatus: preview, no id), including the credit lines the period would carry. Closing the period is POST …/statements. from not before to is 400 invalid-request.

Item Value
Operation id get-apx-v1-validations-programs-id-statement
Origin APX
Scopes apx.validations:read, apx.validations:redeem
Request body —
Parameter In Required Type Description
id path yes string uuid
from query yes string date-time
to query yes string date-time
Response Body Meaning
200 ValidationStatement The computed statement.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such program.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.15 GET /v1/validations/programs/{id}/statements

List closed statements for a program. Closed statements, newest period first; lines[] omitted.

Item Value
Operation id get-apx-v1-validations-programs-id-statements
Origin APX
Scopes apx.validations:read, apx.validations:redeem
Request body —
Parameter In Required Type Description
id path yes string uuid
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated statements (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such program, or (mode=change) a refused cursor (target-not-found; Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.16 POST /v1/validations/programs/{id}/statements

Close a billing period (idempotent). Freezes the period into an immutable statement the operator's accounting invoices from. Idempotency-Key REQUIRED. Periods MUST NOT overlap an existing closed statement (409 statement-overlap). The statement carries a negative credit line for every redemption reversed since an earlier statement billed it, and sets reversal.creditedOn on each (Part 20 §20.6). Publishes apx.validations.statement.closed.v1.

Item Value
Operation id post-apx-v1-validations-programs-id-statements
Origin APX
Scopes apx.validations:manage
Request body ValidationStatementClose
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header yes string
Response Body Meaning
200 ValidationStatement Idempotent replay — same key + same body returns the statement (Part 4 §4.2a; a closed statement never changes).
201 ValidationStatement Period closed.
400 Problem Missing Idempotency-Key (idempotency-key-required), or a period whose periodStart is not before periodEnd or a body that fails the schema (invalid-request).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such program.
409 Problem Overlaps a closed statement, or Idempotency-Key replayed with a different body.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.4.17 GET /v1/validations/statements/{id}

Read a closed statement. The immutable statement with lines[]. Another provider's statement under a redeem token is 404 (Part 9 §9.3a rule 2).

Item Value
Operation id get-apx-v1-validations-statements-id
Origin APX
Scopes apx.validations:read, apx.validations:redeem
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValidationStatement The statement.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such statement, or another provider's under a redeem token (target-not-found).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.5 Tolling

Toll transactions, a net-new domain: APDS has no toll entity.

Method Path Summary Scopes
GET /v1/tolling/transactions List/filter toll transactions apx.tolling:manage
POST /v1/tolling/transactions Create a toll transaction (idempotent) apx.tolling:manage
GET /v1/tolling/transactions/{id} Read a toll transaction apx.tolling:manage
POST /v1/tolling/transactions/{id}/payment Attach the settling Payment reference apx.tolling:manage
POST /v1/tolling/transactions/{id}/price Price a created toll transaction apx.tolling:manage
POST /v1/tolling/transactions/{id}/void Void a toll transaction apx.tolling:manage
POST /v1/tolling/transactions/{id}/disputes Open a dispute apx.tolling:manage
POST /v1/tolling/transactions/{id}/disputes/resolve Resolve a dispute apx.tolling:manage

3.5.1 GET /v1/tolling/transactions

List/filter toll transactions. Filter by plate or credential, status, toll point, place, and time window; all filters combine with AND (Part 15 §15.2). Results are constrained to the caller's grant.

Item Value
Operation id get-apx-v1-tolling-transactions
Origin APX
Scopes apx.tolling:manage
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
plate query no string Convenience alias for credentialType=licensePlate&credentialIdentification=<plate>.
status query no string A transactionStatus value. A value outside that enum is 400 invalid-request, never an empty list.
tollPoint query no string uuid The toll point (SupplementalEquipment id) that produced the transaction.
place query no array of string Comma-separated HierarchyElement ids, subtree-inclusive. A place outside the caller's grant is 403 insufficient-grant.
credentialType query no string Matches credential.credentialType (an APDS CredentialTypeEnum value, e.g. rfid).
credentialIdentification query no string Matches credential.credentialIdentification exactly (a plate string or tag id).
since query no string date-time Only transactions created at or after this instant (statusHistory[0].time), RFC 3339.
until query no string date-time Only transactions created before this instant (statusHistory[0].time), RFC 3339.
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Matching transactions; with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.5.2 POST /v1/tolling/transactions

Create a toll transaction (idempotent). Binds Observation refs + credential + pricing. Idempotency-Key REQUIRED. Created priced when pricing is given, otherwise created (priced later via POST …/{id}/price; Part 15 §15.1).

Item Value
Operation id post-apx-v1-tolling-transactions
Origin APX
Scopes apx.tolling:manage
Request body TollTransaction
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 TollTransaction Idempotent replay — same key + same body returns the transaction the key created, in its current representation (version and transactionStatus may have advanced; Part 4 §4.2a).
201 TollTransaction Created toll transaction.
400 Problem Missing Idempotency-Key (idempotency-key-required) or a body that fails the schema, e.g. no tollPoint (invalid-request, Part 12).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.5.3 GET /v1/tolling/transactions/{id}

Read a toll transaction. Includes dispute state and the immutable statusHistory.

Item Value
Operation id get-apx-v1-tolling-transactions-id
Origin APX
Scopes apx.tolling:manage
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 TollTransaction The transaction.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such transaction.
429 Problem Rate limited (problem type rate-limited, Part 12).

3.5.4 POST /v1/tolling/transactions/{id}/payment

Attach the settling Payment reference. Transitions the transaction to paid. Allowed from priced, and from resolved with resolution upheld or adjusted on an unpaid transaction; anything else is 409 toll-transition-illegal (Part 15 §15.1). Re-attaching the payment already attached returns 200 unchanged, so a replayed billing batch is harmless. Idempotency-Key optional (Part 4 §4.2a).

Item Value
Operation id post-apx-v1-tolling-transactions-id-payment
Origin APX
Scopes apx.tolling:manage
Request body TollPaymentAttachment
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 TollTransaction Paid transaction.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such transaction.
409 Problem The transaction's state does not accept a payment (created, disputed, voided, resolved as refunded or already paid, or paid with a different payment — toll-transition-illegal), or Idempotency-Key replayed with a different body (idempotency-conflict).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.5.5 POST /v1/tolling/transactions/{id}/price

Price a created toll transaction. For pricing engines outside the APX server: sets pricing on a created transaction and moves it to priced (Part 15 §15.1). From any other state 409 toll-transition-illegal; a later price change goes through a dispute. Idempotency-Key optional.

Item Value
Operation id post-apx-v1-tolling-transactions-id-price
Origin APX
Scopes apx.tolling:manage
Request body TollPricing
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 TollTransaction The transaction, now priced.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Not created (toll-transition-illegal), or Idempotency-Key replayed with a different body (idempotency-conflict).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.5.6 POST /v1/tolling/transactions/{id}/void

Void a toll transaction. Terminal: the charge should never have been raised (a duplicate, an exempt service vehicle, a misread). Allowed from created and priced only; a paid charge is corrected by a dispute resolved refunded, so paid, disputed, resolved, and voided are 409 toll-transition-illegal (Part 15 §15.1). Idempotency-Key optional.

Item Value
Operation id post-apx-v1-tolling-transactions-id-void
Origin APX
Scopes apx.tolling:manage
Request body TollVoid
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 TollTransaction The transaction, now voided.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Not created or priced (toll-transition-illegal), or Idempotency-Key replayed with a different body (idempotency-conflict).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.5.7 POST /v1/tolling/transactions/{id}/disputes

Open a dispute. Opened by the operator, on the holder's behalf or on its own initiative (Part 15 §15.1). Allowed from priced and paid. Re-disputing a resolved transaction is 409 dispute-closed; a created, voided, or already disputed transaction is 409 toll-transition-illegal.

Item Value
Operation id post-apx-v1-tolling-transactions-id-disputes
Origin APX
Scopes apx.tolling:manage
Request body TollDisputeOpen
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 TollTransaction Disputed transaction.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem The dispute is already resolved (dispute-closed), or the transaction's state does not allow a dispute (toll-transition-illegal).
429 Problem Rate limited (problem type rate-limited, Part 12).

3.5.8 POST /v1/tolling/transactions/{id}/disputes/resolve

Resolve a dispute. Allowed from disputed only. Base resolution values upheld | refunded | adjusted | withdrawn (Part 15 §15.1); adjusted carries adjustedPricing, which replaces pricing (the old amount moves to dispute.originalPricing).

Item Value
Operation id post-apx-v1-tolling-transactions-id-disputes-resolve
Origin APX
Scopes apx.tolling:manage
Request body TollDisputeResolution
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 TollTransaction Resolved transaction.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem No open dispute: the dispute is already resolved (dispute-closed), or the transaction was never disputed (toll-transition-illegal).
429 Problem Rate limited (problem type rate-limited, Part 12).

4 Vehicles and access

4.1 LPR

Plates. A camera read is an APDS Observation, so ingest is the standard data route every integration already uses. No bespoke ingestion API.

Method Path Summary Scopes
GET /v1/lpr/reads/{observation} Read back one ingested LPR read by its Observation id apx.lpr:read
PUT /v1/lpr/reads/{observation}/plate A reviewer confirms, corrects, or rejects a read's plate apx.data:write
POST /v1/lpr/reads:search The reads lookup with the plate in a body, never a URL apx.lpr:read
PUT /v1/sessions/{id}/plate Associate or correct the plate on a session apx.data:write
GET /v1/lpr/reads Bidirectional plate/ticket cross-lookup apx.lpr:read
PUT /v1/lpr/reads/{observation}/access-event Revise a read's access event apx.data:write
GET /v1/lpr/candidates Plate candidates for correction workflows apx.lpr:read

4.1.1 GET /v1/lpr/reads/{observation}

Read back one ingested LPR read by its Observation id. One LprRead for the Observation (Part 13 §13.3). The same projection as GET /v1/lpr/reads?observation=, addressed by path like the revision routes. A read at a place outside the caller's apx_places grant is 403 insufficient-grant; an unknown or purged read is 404 target-not-found (§13.3b).

Item Value
Operation id get-apx-v1-lpr-reads-observation
Origin APX
Scopes apx.lpr:read
Request body —
Parameter In Required Type Description
observation path yes string uuid
Response Body Meaning
200 LprRead The read.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.1.2 PUT /v1/lpr/reads/{observation}/plate

A reviewer confirms, corrects, or rejects a read's plate. Read-level plate review (Part 13 §13.3a(4a)), the counterpart of the access-event revision: a reviewer's decision on one read, before any Session exists and however many Sessions the read feeds. corrected writes the winning values into the Observation's observedCredentialId and vehicleAncillaryIdentification and into detail.plate, .country, .stateProvince, keeping the engine's values, with their confidences, in detail.review.original — set on the first correction and never changed afterwards. Every decision that changes the read sets detail.review, increments the Observation version, and publishes apx.data.observation.updated.v1. Resending the decision and values the read already has is a no-op: 200 with the current version, no new version, no event. If-Match carries the Observation version last read (409 version-conflict when stale; nothing is written). corrected without plate, or plate, country, or stateProvince with any other decision, is 422 request-unprocessable. A pending or rejected read is not issuable evidence (Part 19 §19.4 rule 6). The write changes no Session.

Item Value
Operation id put-apx-v1-lpr-reads-observation-plate
Origin APX
Scopes apx.data:write
Request body PlateCorrection
Parameter In Required Type Description
observation path yes string uuid
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 LprRead / object The read after the decision.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem If-Match names a stale Observation version (version-conflict); nothing is written.
422 Problem corrected without a plate, or plate, country, or stateProvince sent with another decision (request-unprocessable); nothing is written.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.1.3 POST /v1/lpr/reads:search

The reads lookup with the plate in a body, never a URL. The same lookup as GET /v1/lpr/reads, with the keys in the body so a plate never enters a URL that proxies, gateways, and access logs keep (Part 9 §9.6; Part 13 §13.3). Same rules, grant behaviour, and response. The GET keeps working; a deployment that crosses a network boundary SHOULD use this form.

Item Value
Operation id post-apx-v1-lpr-reads-search
Origin APX
Scopes apx.lpr:read
Request body LprReadSearch
Response Body Meaning
200 object Matching reads.
400 Problem None of plate, ticket, observation, or session given (invalid-request).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.1.4 PUT /v1/sessions/{id}/plate

Associate or correct the plate on a session. The write side of plate correction (Part 17 §17.5): sets the session's plate, optionally citing the chosen Observation candidate (GET /v1/lpr/candidates). A transactional domain action — not a control command. Naturally idempotent (PUT). Scope apx.data:write.

Item Value
Operation id put-apx-v1-sessions-id-plate
Origin APX
Scopes apx.data:write
Request body object
Parameter In Required Type Description
id path yes string uuid APDS Session UUID.
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 object The corrected association.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such session.
409 Problem If-Match names a stale Session version (version-conflict, Part 4 §4.2a); nothing is written.
422 Problem The Session is closed and outside the operator's dispute window, or closed and the correction carries no reason (session-not-open, Part 17 §17.5).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.1.5 GET /v1/lpr/reads

Bidirectional plate/ticket cross-lookup. plate → ticket/session with accuracy + screenshot; ticket → plate; Session → the reads behind it. A pure profile over APDS Observations (ingest = native POST /observations). Where the ingested Observation carried the apds-ext:apx:lpr-read@1.0 decoration, each read returns detail (per-attribute confidences for plate, state, make, model, color, class; alternate reads; passage geometry; and accessEvent — entry or exit — as the LPR system reported it; Part 13 §13.3a).

Item Value
Operation id get-apx-v1-lpr-reads
Origin APX
Scopes apx.lpr:read
Request body —
Parameter In Required Type Description
plate query no string
ticket query no string
observation query no string uuid Lookup by the underlying APDS Observation id. Returns the LprRead projection of one ingested read; the stored ObservationElement itself is native GET /observations/{id}.
session query no string uuid The reads behind one APDS Session — its entry and exit reads and every read of their passages (Part 13 §13.3a(6)). A Session at a place outside the caller's apx_places grant is 403 insufficient-grant (Part 13 §13.5(4)).
place query no string uuid Narrow results below the grant to one HierarchyElement and its subtree (Part 13 §13.5(3)). A place outside the caller's apx_places grant is 403 insufficient-grant. Servers that do not narrow MAY ignore it.
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Matching reads.
400 Problem None of plate, ticket, observation, or session given (problem type invalid-request).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.1.6 PUT /v1/lpr/reads/{observation}/access-event

Revise a read's access event. The LPR system's revision of accessEvent on a read it ingested (Part 13 §13.3a(4)) — for example after pairing the reads of one captureGroup, or an entry read with an exit read. APDS 4.1 has no route that replaces one Observation, so this is the revision route.

Item Value
Operation id put-apx-v1-lpr-reads-observation-access-event
Origin APX
Scopes apx.data:write
Request body object
Parameter In Required Type Description
observation path yes string uuid The APDS Observation id of the read.
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 object The read's access event as it now stands.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such LPR read (target-not-found).
409 Problem If-Match names a stale Observation version (version-conflict, Part 4 §4.2a); nothing is written.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.1.7 GET /v1/lpr/candidates

Plate candidates for correction workflows. Candidate plate reads (with confidence and imagery links) for a session or lane — the read side of plate correction (Part 17 §17.5); the write is PUT /v1/sessions/{id}/plate. Scope apx.lpr:read.

Item Value
Operation id get-apx-v1-lpr-candidates
Origin APX
Scopes apx.lpr:read
Request body —
Parameter In Required Type Description
session query no string uuid Session UUID.
lane query no string uuid VehicularAccess UUID.
since query no string date-time
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Candidates, best confidence first.
400 Problem Neither session nor lane given (problem type invalid-request).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2 Credentials

The card, the fob, the tag, the phone. The lifecycle of anything presented at a lane: issue, activate, suspend, resume, report lost, revoke, replace, plus access-event history.

Method Path Summary Scopes
GET /v1/credentials List/filter credentials apx.credentials:read
POST /v1/credentials Issue a credential (idempotent) apx.credentials:manage
GET /v1/credentials/{id} Read a credential apx.credentials:read
POST /v1/credentials/{id}/activate Activate a credential apx.credentials:manage
POST /v1/credentials/{id}/suspend Suspend a credential apx.credentials:manage
POST /v1/credentials/{id}/resume Resume a suspended credential apx.credentials:manage
POST /v1/credentials/{id}/report-lost Report a credential lost or stolen apx.credentials:manage
POST /v1/credentials/{id}/revoke Revoke a credential (terminal) apx.credentials:manage
POST /v1/credentials/{id}/replace Replace a credential with a successor (idempotent) apx.credentials:manage
GET /v1/credentials/{id}/access-events Access-event history for a credential apx.credentials:read
GET /v1/access-events Access events by place, lane, or reader apx.credentials:read

4.2.1 GET /v1/credentials

List/filter credentials. Filter by holder, account, type, identification, status, and place (subtree-inclusive). Results are constrained to the caller's place grant; identification values are personal data under Part 9 §9.6. A lookup by identification that matches only records outside the grant returns an empty 200 (Part 9 §9.3a).

Item Value
Operation id get-apx-v1-credentials
Origin APX
Scopes apx.credentials:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
holder query no string uuid
account query no string uuid
type query no CredentialTypeEnum
identification query no string
status query no string (issued, active, suspended, lost, revoked, expired, replaced)
place query no string uuid
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated credentials (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2.2 POST /v1/credentials

Issue a credential (idempotent). Creates a CredentialRecord in issued. It becomes active either by a later activate call or, when the body sets activateOnStart: true, by the server itself at validity.start (at once when that is absent or past), with actor system (Part 21 §21.1 rule 6). Idempotency-Key REQUIRED. credentialIdentification MUST be unique per credentialType among non-terminal records (409 credential-identification-in-use, whose detail MUST NOT identify the holding record, holder, or place — §21.5). Server-assigned members in the body (id, version, credentialStatus, suspension, replacedBy, statusHistory, recordInfo) are ignored. Publishes apx.credentials.status.v1.

Item Value
Operation id post-apx-v1-credentials
Origin APX
Scopes apx.credentials:manage
Request body CredentialRecord
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 CredentialRecord Idempotent replay — same key + same body returns the record as it stands now (Part 4 §4.2a).
201 CredentialRecord Credential issued.
400 Problem Missing Idempotency-Key (idempotency-key-required) or a record that fails the schema (invalid-request, with errors[]).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Identification already in use for this type (credential-identification-in-use), or Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem Unknown holder, account, assigned right, or place (reference-unknown); or a validity window that is already over or inverted — validity.end not in the future, or before validity.start (request-unprocessable, Part 21 §21.1 rule 7).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2.3 GET /v1/credentials/{id}

Read a credential. Returns the record including media, replacement links, and the immutable statusHistory.

Item Value
Operation id get-apx-v1-credentials-id
Origin APX
Scopes apx.credentials:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 CredentialRecord The credential.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such credential.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2.4 POST /v1/credentials/{id}/activate

Activate a credential. Transition issued → active; materializes the APDS CredentialAssigned (§21.2). Any other state is 409 credential-transition-illegal.

Item Value
Operation id post-apx-v1-credentials-id-activate
Origin APX
Scopes apx.credentials:manage
Request body CredentialTransition
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 CredentialRecord Active credential.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such credential.
409 Problem Illegal transition.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2.5 POST /v1/credentials/{id}/suspend

Suspend a credential. Transition active → suspended (optionally until, which MUST be in the future — else 422 request-unprocessable); the lane MUST deny it meanwhile. Any other state is 409 credential-transition-illegal.

Item Value
Operation id post-apx-v1-credentials-id-suspend
Origin APX
Scopes apx.credentials:manage
Request body CredentialTransition
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 CredentialRecord Suspended credential.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such credential.
409 Problem Illegal transition.
422 Problem until is not in the future (request-unprocessable, Part 21 §21.1 rule 7); nothing is written.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2.6 POST /v1/credentials/{id}/resume

Resume a suspended credential. Transition suspended → active. Any other state is 409 credential-transition-illegal.

Item Value
Operation id post-apx-v1-credentials-id-resume
Origin APX
Scopes apx.credentials:manage
Request body CredentialTransition
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 CredentialRecord Active credential.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such credential.
409 Problem Illegal transition.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2.7 POST /v1/credentials/{id}/report-lost

Report a credential lost or stolen. Transition active | suspended → lost; the lane MUST deny it from this instant. Follow with replace or revoke. Any other state is 409 credential-transition-illegal.

Item Value
Operation id post-apx-v1-credentials-id-report-lost
Origin APX
Scopes apx.credentials:manage
Request body CredentialTransition
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 CredentialRecord Credential marked lost.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such credential.
409 Problem Illegal transition.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2.8 POST /v1/credentials/{id}/revoke

Revoke a credential (terminal). Transition issued | active | suspended | lost → revoked; removes the APDS CredentialAssigned. Terminal states are 409 credential-transition-illegal.

Item Value
Operation id post-apx-v1-credentials-id-revoke
Origin APX
Scopes apx.credentials:manage
Request body CredentialTransition
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 CredentialRecord Revoked credential.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such credential.
409 Problem Illegal transition.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2.9 POST /v1/credentials/{id}/replace

Replace a credential with a successor (idempotent). Issues a successor active record inheriting holder, account, assigned rights, places, and validity; links replaces/replacedBy; moves THIS record to replaced and swaps the APDS CredentialAssigned atomically. The predecessor keeps every other field it had (§21.3). Allowed from active, suspended, or lost. From issued it is 409 credential-transition-illegal (revoke it and issue anew); credential-not-replaceable is reserved for the terminal states revoked, expired, replaced. Idempotency-Key REQUIRED. Returns the successor.

Item Value
Operation id post-apx-v1-credentials-id-replace
Origin APX
Scopes apx.credentials:manage
Request body CredentialReplaceRequest
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header yes string
Response Body Meaning
200 CredentialRecord Idempotent replay — returns the successor as it stands now (Part 4 §4.2a).
201 CredentialRecord The successor credential.
400 Problem Missing Idempotency-Key (idempotency-key-required) or a body that fails the schema (invalid-request).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such credential.
409 Problem Terminal record (credential-not-replaceable), a record still issued (credential-transition-illegal), successor identification in use (credential-identification-in-use), or key replayed with a different body (idempotency-conflict).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2.10 GET /v1/credentials/{id}/access-events

Access-event history for a credential. Entry/exit attempts with this credential, newest first — granted or denied, where, and why. The same events are published as apx.credentials.access.v1. Retention per Part 9 §9.6.

Item Value
Operation id get-apx-v1-credentials-id-access-events
Origin APX
Scopes apx.credentials:read
Request body —
Parameter In Required Type Description
id path yes string uuid
since query no string date-time
until query no string date-time Exclusive upper bound on occurredAt.
outcome query no string (granted, denied)
direction query no string (entry, exit)
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated access events (APDS PaginatedList shape).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such credential.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.2.11 GET /v1/access-events

Access events by place, lane, or reader. Every access attempt at the caller's granted places, newest first — including presentations that matched no CredentialRecord (denialReason: unknownCredential, carrying presented). "Every denial at lane 1 tonight" is ?lane=…&outcome=denied&since=…. Results are constrained to the caller's place grant; naming a place, lane, or device outside it is 403 insufficient-grant (Part 9 §9.3a). Retention per Part 9 §9.6. The same events are published as apx.credentials.access.v1 (Part 21 §21.4).

Item Value
Operation id get-apx-v1-access-events
Origin APX
Scopes apx.credentials:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
place query no array of string HierarchyElement ids, comma-separated; subtree-inclusive.
lane query no string uuid The VehicularAccess.
device query no string uuid The reader (SupplementalEquipment).
credential query no string uuid A CredentialRecord id.
outcome query no string (granted, denied)
denialReason query no string definedValue from apx-access-denial-reasons (or an implementer code list).
direction query no string (entry, exit)
since query no string date-time Inclusive lower bound on occurredAt.
until query no string date-time Exclusive upper bound on occurredAt.
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated access events (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3 Valet

Custody. A net-new domain: APDS has no valet entity, only a restriction flag.

Method Path Summary Scopes
GET /v1/valet/tickets List/filter valet tickets apx.valet:read
POST /v1/valet/tickets Take custody of a vehicle (drop-off, idempotent) apx.valet:manage
GET /v1/valet/queue The retrieval queue for a place (attendant board) apx.valet:read
GET /v1/valet/tickets/{id} Read a valet ticket apx.valet:read apx.valet:request
POST /v1/valet/tickets/{id}/park Record the parked position and key location apx.valet:manage
POST /v1/valet/tickets/{id}/retrieve Request the vehicle (now or scheduled) apx.valet:manage apx.valet:request
POST /v1/valet/tickets/{id}/cancel-retrieval Cancel an open retrieval request apx.valet:manage apx.valet:request
POST /v1/valet/tickets/{id}/stage Vehicle at the staging lane apx.valet:manage
POST /v1/valet/tickets/{id}/handback Hand the vehicle to a verified customer apx.valet:manage
POST /v1/valet/tickets/{id}/pickup A runner has gone for the car apx.valet:manage
POST /v1/valet/tickets/{id}/cancel Abandon a drop-off before custody (terminal) apx.valet:manage
POST /v1/valet/tickets/{id}/condition Append a condition-report correction apx.valet:manage

4.3.1 GET /v1/valet/tickets

List/filter valet tickets. Filter by place (subtree-inclusive), status, plate, ticket number, customer account, and since (dropOff.time).

Item Value
Operation id get-apx-v1-valet-tickets
Origin APX
Scopes apx.valet:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
place query no string uuid
status query no string (dropped, parked, requested, retrieving, staged, handedBack, closed, cancelled)
plate query no string
ticketNumber query no string
account query no string uuid
since query no string date-time
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated tickets (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.2 POST /v1/valet/tickets

Take custody of a vehicle (drop-off, idempotent). Creates the ValetTicket in dropped with the drop-off condition report. Idempotency-Key REQUIRED (handhelds and scanning devices retry). The server SHOULD open the APDS Session for the stay and reference it, unless the body already references one. storage, retrieval, handback, statusHistory, and recordInfo in the body are ignored — the server writes them (Part 22 §22.1 rule 5). A customer.contactChannel.handle that carries a raw phone number or e-mail address SHOULD be refused with 422 personal-data-not-permitted rather than stored or silently masked (§22.6). Publishes apx.valet.ticket.status.v1.

Item Value
Operation id post-apx-v1-valet-tickets
Origin APX
Scopes apx.valet:manage
Request body ValetTicket
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 ValetTicket Idempotent replay — same key + same body returns the ticket as it stands now (Part 4 §4.2a).
201 ValetTicket Custody taken.
400 Problem Missing Idempotency-Key (idempotency-key-required) or a ticket that fails the schema (invalid-request, with errors[]).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem Unknown place, lane, session, or customer reference (reference-unknown), or a raw phone number or e-mail address where an opaque handle is required (personal-data-not-permitted, §22.6).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.3 GET /v1/valet/queue

The retrieval queue for a place (attendant board). Tickets in requested, retrieving, or staged at the place, ordered by retrieval.promisedTime ascending — what the runners and the stand see. Scheduled pickups (requestedFor) appear when they fall inside horizonMinutes (default 60).

Item Value
Operation id get-apx-v1-valet-queue
Origin APX
Scopes apx.valet:read
Request body —
Parameter In Required Type Description
place query yes string uuid
horizonMinutes query no integer
page query no integer The page number for paginated responses.
Response Body Meaning
200 object The queue (APDS PaginatedList shape).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such place.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.4 GET /v1/valet/tickets/{id}

Read a valet ticket. Full record for operator scopes. A apx.valet:request token sees only its own ticket, as the minimized projection of Part 22 §22.5 — id, version, place, ticketNumber, vehicle, customer.displayName, dropOff.time, retrieval.{requestedTime, requestedFor, channel, etaMinutes, promisedTime, stagingLane, stagedTime, cancelledTime}, handback.time, valetStatus, and extensions; everything else, including statusHistory, is omitted. The same projection applies to the ticket a apx.valet:request token gets back from retrieve and cancel-retrieval. An operator token gets 403 insufficient-grant for a ticket at a place outside its grant (Part 9 §9.3a).

Item Value
Operation id get-apx-v1-valet-tickets-id
Origin APX
Scopes apx.valet:read, apx.valet:request
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValetTicket The ticket.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such ticket, or — for an apx.valet:request token — a ticket it is not bound to (target-not-found; existence is never disclosed, Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.5 POST /v1/valet/tickets/{id}/park

Record the parked position and key location. Transition dropped → parked; update storage while parked; or re-park a staged car the customer is not collecting yet (staged → parked: records the new storage, clears retrieval.stagingLane/stagedTime, and sets retrieval.cancelledTime and cancelReason: re-parked). Any other state is 409 valet-transition-illegal. Send If-Match with the version last read so two runners cannot overwrite each other's storage: a stale value is 409 version-conflict (Part 4 §4.2a); without it the write is last-writer-wins.

Item Value
Operation id post-apx-v1-valet-tickets-id-park
Origin APX
Scopes apx.valet:manage
Request body ValetParkRequest
Parameter In Required Type Description
id path yes string uuid
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 ValetTicket Parked ticket.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such ticket.
409 Problem Illegal transition (valet-transition-illegal), or a stale If-Match (version-conflict).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.6 POST /v1/valet/tickets/{id}/retrieve

Request the vehicle (now or scheduled). Transition parked → requested. The customer's text, app, web page, or voice bot calls this on apx.valet:request for its own ticket; attendants and the call center on apx.valet:manage. The server sets retrieval.etaMinutes and promisedTime and publishes apx.valet.retrieval.requested.v1. A repeat while requested or retrieving ("CAR" texted twice) is not an error: 200 with the current ticket and ETA, nothing appended or republished, and the body's requestedFor ignored (to reschedule, cancel-retrieval then retrieve). From dropped (not yet parked) it is 409 valet-vehicle-not-located; from staged, handedBack, closed, or cancelled it is 409 valet-transition-illegal.

Item Value
Operation id post-apx-v1-valet-tickets-id-retrieve
Origin APX
Scopes apx.valet:manage, apx.valet:request
Request body ValetRetrievalRequest
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValetTicket Requested ticket with ETA (or the unchanged ticket, for a repeat while requested/retrieving).
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such ticket, or — for an apx.valet:request token — a ticket it is not bound to (target-not-found, Part 9 §9.3a). An operator token gets 403 insufficient-grant for a ticket outside its grant.
409 Problem Vehicle not yet located, or illegal transition.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.7 POST /v1/valet/tickets/{id}/cancel-retrieval

Cancel an open retrieval request. Transition requested | retrieving → parked. A staged car is re-parked by the operator with park, not cancelled here. Any other state is 409 valet-transition-illegal.

Item Value
Operation id post-apx-v1-valet-tickets-id-cancel-retrieval
Origin APX
Scopes apx.valet:manage, apx.valet:request
Request body ValetCancelRetrievalRequest
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValetTicket Ticket back in parked.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such ticket, or — for an apx.valet:request token — a ticket it is not bound to (target-not-found, Part 9 §9.3a). An operator token gets 403 insufficient-grant for a ticket outside its grant.
409 Problem Illegal transition.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.8 POST /v1/valet/tickets/{id}/stage

Vehicle at the staging lane. Transition requested | retrieving → staged; sets retrieval.stagingLane/stagedTime and notifies the customer's contact channel. Any other state is 409 valet-transition-illegal.

Item Value
Operation id post-apx-v1-valet-tickets-id-stage
Origin APX
Scopes apx.valet:manage
Request body ValetStageRequest
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValetTicket Staged ticket.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such ticket.
409 Problem Illegal transition.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.9 POST /v1/valet/tickets/{id}/handback

Hand the vehicle to a verified customer. Transition staged → handedBack (or dropped → handedBack before the car moved). The attendant verifies the claimant (verificationMethod) — a mismatch is 403 valet-verification-failed and MUST be recorded in statusHistory. Records the handback condition report. The APDS Session closes per the operator's flow; closed follows server-side when it settles.

Item Value
Operation id post-apx-v1-valet-tickets-id-handback
Origin APX
Scopes apx.valet:manage
Request body ValetHandbackRequest
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValetTicket Handed back.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope/grant, or claimant verification failed.
404 Problem No such ticket.
409 Problem Illegal transition.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.10 POST /v1/valet/tickets/{id}/pickup

A runner has gone for the car. Transition requested → retrieving; sets retrieval.retrievingBy (the body's value, else the calling principal) — what the runner board shows as "on its way". Optional: stage from requested remains valid, and a server MAY infer retrieving from its own runner assignment instead (Part 22 §22.1 rule 2). Any other state is 409 valet-transition-illegal.

Item Value
Operation id post-apx-v1-valet-tickets-id-pickup
Origin APX
Scopes apx.valet:manage
Request body ValetPickupRequest
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValetTicket Ticket in retrieving.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Illegal transition (valet-transition-illegal).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.11 POST /v1/valet/tickets/{id}/cancel

Abandon a drop-off before custody (terminal). Transition dropped → cancelled — the driver left before the car moved, or the ticket was opened in error. Appends statusHistory[] and publishes apx.valet.ticket.status.v1; the server SHOULD close the APDS Session it opened at drop-off at no charge. A customer who changes their mind after the walk-around but takes the car back is handback from dropped instead. Any other state is 409 valet-transition-illegal.

Item Value
Operation id post-apx-v1-valet-tickets-id-cancel
Origin APX
Scopes apx.valet:manage
Request body ValetCancelRequest
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ValetTicket Ticket cancelled.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Illegal transition (valet-transition-illegal).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.3.12 POST /v1/valet/tickets/{id}/condition

Append a condition-report correction. Records a finding made after drop-off — the door ding a runner sees at P3 — without editing the drop-off report (Part 22 §22.2 rule 3). Each damage[] entry is appended to dropOff.conditionReport.damage[] stamped with a server-set recordedTime and recordedBy (the body's recordedBy, else the calling principal); imageLinks[] are appended to the report's imageLinks[]; notes becomes the detail of a new statusHistory[] entry whose state is the unchanged valetStatus. The report's original notes, recordedTime, recordedBy, and customerAcknowledged never change, and customerAcknowledged in the body is ignored. Legal in any state except closed and cancelled (409 valet-transition-illegal). Send Idempotency-Key when retrying: an append retried without one is appended twice.

Item Value
Operation id post-apx-v1-valet-tickets-id-condition
Origin APX
Scopes apx.valet:manage
Request body ConditionReport
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 ValetTicket The ticket with the correction appended (or, on an idempotent replay, the current ticket).
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Ticket closed or cancelled (valet-transition-illegal), or Idempotency-Key replayed with a different body (idempotency-conflict).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.4 Charging

Method Path Summary Scopes
GET /v1/charging/points List live charging-point status for a place apx.charging:read apx.charging:status
GET /v1/charging/points/{id} Read one charging point's live status apx.charging:read apx.charging:status
PUT /v1/charging/points/{id}/status Bridge pushes the point's availability apx.charging:manage
POST /v1/charging/points/{id}/bay Camera or sensor reports what is in the bay apx.charging:manage
GET /v1/charging/sessions List/filter charging sessions apx.charging:read
POST /v1/charging/sessions Open a charging session (authorization, idempotent) apx.charging:manage
GET /v1/charging/sessions/{id} Read a charging session apx.charging:read apx.charging:status
POST /v1/charging/sessions/{id}/events Bridge reports a physical-timeline event apx.charging:manage
POST /v1/charging/sessions/{id}/payment Attach the settling payment or the network's CDR apx.charging:manage

4.4.1 GET /v1/charging/points

List live charging-point status for a place. ChargingPointStatus for every ElectricChargingEquipment under the place (subtree-inclusive), optionally filtered by availability — "is there a free charger". A apx.charging:status token receives the minimized form (no bay.vehicle, no bay.imageLink, no currentSession; Part 23 §23.6).

Item Value
Operation id get-apx-v1-charging-points
Origin APX
Scopes apx.charging:read, apx.charging:status
Request body —
Parameter In Required Type Description
place query yes string uuid
availability query no string (available, occupied, charging, reserved, blocked, inoperative, outOfOrder, unknown)
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Charging-point status list (APDS PaginatedList shape).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such place.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.4.2 GET /v1/charging/points/{id}

Read one charging point's live status. ChargingPointStatus keyed by the ElectricChargingEquipment id. Minimized for apx.charging:status (Part 23 §23.6).

Item Value
Operation id get-apx-v1-charging-points-id
Origin APX
Scopes apx.charging:read, apx.charging:status
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ChargingPointStatus The status overlay.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such charging point (or outside the caller's grant).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.4.3 PUT /v1/charging/points/{id}/status

Bridge pushes the point's availability. The charging-network bridge (the operator's OCPP/OCPI integration) replaces the point-level and per-connector availability, currentSession, reservedFor, and lastCommunication. The bay block is NOT written here — it comes from …/bay and is fused by the server (Part 23 §23.3); a bay in this body is ignored. Publishes apx.charging.point.status.v1 when availability changes.

Item Value
Operation id put-apx-v1-charging-points-id-status
Origin APX
Scopes apx.charging:manage
Request body ChargingPointStatus
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ChargingPointStatus The fused status after the update.
400 Problem Body chargingPoint does not match the path id.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such charging point.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.4.4 POST /v1/charging/points/{id}/bay

Camera or sensor reports what is in the bay. An overhead-camera analytics system, ground sensor, or attendant reports the bay's physical presence: empty, vehicle plugged in, vehicle NOT plugged in, blocked. The server fuses it with the charger's connector state (Part 23 §23.3 table) into ChargingPointStatus.bay and derives availability: blocked when no cable is connected (a connected cable wins). A vehicle not plugged in past the place's grace SHOULD raise the proposed evBayNotCharging alert — or the seeded iceInEvSpace when vehicle.evCapable is false; an obstructed bay SHOULD raise the proposed evBayBlocked alert (Part 7; Part 23 §23.3). Idempotency-Key REQUIRED (cameras re-send).

Item Value
Operation id post-apx-v1-charging-points-id-bay
Origin APX
Scopes apx.charging:manage
Request body ChargingBayPresence
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header yes string
Response Body Meaning
200 ChargingPointStatus The fused status after the observation.
400 Problem Missing Idempotency-Key or invalid observation.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such charging point.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.4.5 GET /v1/charging/sessions

List/filter charging sessions. Filter by place (subtree-inclusive), charging point, status, plate, parking session, account, and since (timeline.authorizedTime).

Item Value
Operation id get-apx-v1-charging-sessions
Origin APX
Scopes apx.charging:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
place query no string uuid
chargingPoint query no string uuid
status query no string (authorized, pluggedIn, charging, suspended, complete, idle, unplugged, closed, cancelled, faulted)
plate query no string
parkingSession query no string uuid
account query no string uuid
since query no string date-time
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated sessions (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.4.6 POST /v1/charging/sessions

Open a charging session (authorization, idempotent). Creates the ChargingSession in authorized with the authorization, the point and connector, the parking Session it belongs to, the settlement mode, and the idle policy snapshot; the plug-in itself arrives as a pluggedIn event (Part 23 §23.2). Idempotency-Key REQUIRED. 409 charging-point-unavailable when the point or connector is inoperative, out of order, reserved for someone else, or already serving an active session. Publishes apx.charging.session.status.v1.

Item Value
Operation id post-apx-v1-charging-sessions
Origin APX
Scopes apx.charging:manage
Request body ChargingSession
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 ChargingSession Idempotent replay — same key + same body returns the ORIGINAL session.
201 ChargingSession Session opened.
400 Problem Missing Idempotency-Key or invalid session.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Point/connector unavailable, or Idempotency-Key replayed with a different body.
422 Problem Unknown place, charging point, parking session, or credential reference; or settlement.mode parkingSession without parkingSession.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.4.7 GET /v1/charging/sessions/{id}

Read a charging session. Full record for operator scopes. A apx.charging:status token sees only its own session(s), minimized (Part 23 §23.6): status, energy and state of charge, timeline, idle policy and idle clock, cost totals, the point and connector — no plate, no credential or contract id, no network identifiers. Enough for "your car is at 62%, charging ends in about 40 minutes; 10 minutes grace, then $0.40 per minute".

Item Value
Operation id get-apx-v1-charging-sessions-id
Origin APX
Scopes apx.charging:read, apx.charging:status
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ChargingSession The session.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such session (or outside the caller's grant).
429 Problem Rate limited (problem type rate-limited, Part 12).

4.4.8 POST /v1/charging/sessions/{id}/events

Bridge reports a physical-timeline event. The APX counterpart of an OCPP 2.0.1 TransactionEvent. Applies the transition for eventType per Part 23 §23.2 — pluggedIn, chargingStarted, suspended/resumed, chargingEnded, unplugged, fault, cancelled — or, for meterValue, updates energy in place. Events MUST be applied in time order; one that is illegal from the current state is 409 charging-transition-illegal (a meterValue after unplugged, a pluggedIn after charging). Idempotency-Key REQUIRED. Every state change appends statusHistory and publishes apx.charging.session.status.v1; complete → idle is server-side after idlePolicy.graceMinutes and additionally publishes apx.charging.idle.started.v1.

Item Value
Operation id post-apx-v1-charging-sessions-id-events
Origin APX
Scopes apx.charging:manage
Request body ChargingEvent
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header yes string
Response Body Meaning
200 ChargingSession The session after the event.
400 Problem Missing Idempotency-Key or invalid event.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such session.
409 Problem Illegal transition from the current state, or Idempotency-Key replayed with a different body.
429 Problem Rate limited (problem type rate-limited, Part 12).

4.4.9 POST /v1/charging/sessions/{id}/payment

Attach the settling payment or the network's CDR. For settlement.mode: directPayment, attaches the settling Payment reference and moves an unplugged session to closed; before unplugged the final cost is unknown and it is 409 charging-settlement-conflict. For chargingNetwork, records the charge detail record id. For parkingSession it is 409 charging-settlement-conflict — that session closes when the APDS Session settles. Also 409 when the session is already closed.

Item Value
Operation id post-apx-v1-charging-sessions-id-payment
Origin APX
Scopes apx.charging:manage
Request body ChargingPaymentAttachment
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ChargingSession The settled session.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such session.
409 Problem Settlement mode does not take a payment here, session not yet unplugged, or already closed.
429 Problem Rate limited (problem type rate-limited, Part 12).

5 Enforcement and service

5.1 Violations

Enforcement, from camera to citation to appeal. A net-new domain, and the one with the most legal exposure.

Method Path Summary Scopes
GET /v1/violations List/filter violations apx.violations:read
POST /v1/violations Create a violation from a detection (idempotent) apx.violations:manage
GET /v1/violations/{id} Read a violation apx.violations:read
POST /v1/violations/{id}/review Review a detected candidate (guided enforcement) apx.violations:manage
POST /v1/violations/{id}/issue Issue the notice or citation apx.violations:manage
POST /v1/violations/{id}/payment Attach the settling Payment reference apx.violations:manage
POST /v1/violations/{id}/appeals Open an appeal apx.violations:manage
POST /v1/violations/{id}/appeals/resolve Resolve an appeal apx.violations:manage
POST /v1/violations/{id}/void Void a violation apx.violations:manage
GET /v1/enforcement/eligibility Is this vehicle entitled to be here right now? apx.violations:read
GET /v1/enforcement/policies List enforcement policies apx.violations:read
POST /v1/enforcement/policies Create an enforcement policy (idempotent) apx.violations:manage
GET /v1/enforcement/policies/effective The policy in force at a place apx.violations:read
GET /v1/enforcement/policies/{id} Read an enforcement policy apx.violations:read
PUT /v1/enforcement/policies/{id} Update an enforcement policy (full update, versioned) apx.violations:manage
GET /v1/enforcement/signage List signage records apx.violations:read
POST /v1/enforcement/signage Record posted signage (idempotent) apx.violations:manage
GET /v1/enforcement/signage/effective The signage in force at a place apx.violations:read
GET /v1/enforcement/signage/{id} Read a signage record apx.violations:read
PUT /v1/enforcement/signage/{id} Update a signage record (full update, versioned) apx.violations:manage
POST /v1/violations:search The violations lookup with the plate in a body apx.violations:read
POST /v1/enforcement/eligibility:check The eligibility check with the credential in a body apx.violations:read
POST /v1/enforcement/violation-imports Import a violation an external enforcement system issued (idempotent) apx.violations:manage
POST /v1/violations/{id}/session Set, correct, or clear the Session a violation relates to apx.violations:manage

5.1.1 GET /v1/violations

List/filter violations. Filter by plate (credentialIdentification), notice number, status, type, place (subtree-inclusive), detection mode, the since..until window on detectedTime, and — for violations imported from another enforcement system (Part 19 §19.13) — the source system and the source's record id. Results are constrained to the caller's place grant; a lookup that names no place (by plate or notice number) returns only violations at granted places (Part 9 §9.3a). Plate values appear only under apx.violations:* scopes (Part 9 §9.6).

Item Value
Operation id get-apx-v1-violations
Origin APX
Scopes apx.violations:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
plate query no string
noticeNumber query no string Exact match on notice.noticeNumber — the number the driver holds, and the payment reference (§19.6).
status query no string (detected, confirmed, dismissed, issued, paid, appealed, closed, voided)
type query no string
place query no string uuid
detectionMode query no string (automated, guided, manual)
since query no string date-time
until query no string date-time Upper bound (exclusive) on detection.detectedTime.
sourceSystem query no string Imported violations from this source system only (system of apds-ext:apx:violation-source@1.0, Part 19 §19.13).
sourceRecordId query no string Exact match on the source's record id (recordId); like noticeNumber, it names no place (Part 9 §9.3a rule 3).
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated violations (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.2 POST /v1/violations

Create a violation from a detection (idempotent). Records a detected violation — from an automated camera/sensor pipeline, a guided-enforcement handheld, or an officer directly (detection.mode). The Idempotency-Key header is REQUIRED: cameras and handhelds retry, and a retry must not create a second violation. Same key + same body returns the violation's current representation (200, Part 4 §4.2a); same key + different body is 409 idempotency-conflict. The server performs the eligibility check at creation and records it in eligibilityCheck; a vehicle found entitled is still recorded (as dismissed, with the basis) so the audit trail is complete. Publishes apx.violations.detected.v1.

Item Value
Operation id post-apx-v1-violations
Origin APX
Scopes apx.violations:manage
Request body Violation
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 Violation Idempotent replay — same key + same body returns the violation's current representation (Part 4 §4.2a).
201 Violation Violation recorded (status detected, or dismissed when the vehicle was entitled).
400 Problem Missing Idempotency-Key (idempotency-key-required), or a body that fails the schema or a §19.9 field rule — e.g. no detection, or a position whose first element is outside −180..180 (invalid-request, with errors[]).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body.
422 Problem reference-unknown — place, space, or another body Reference names nothing visible to the caller, or violationType is outside the served registries and code lists.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.3 GET /v1/violations/{id}

Read a violation. Returns the violation including evidence links, the eligibility check, notice, appeal, and the immutable statusHistory.

Item Value
Operation id get-apx-v1-violations-id
Origin APX
Scopes apx.violations:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Violation The violation.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such violation.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.4 POST /v1/violations/{id}/review

Review a detected candidate (guided enforcement). Transition detected → confirmed or detected → dismissed. The officer's decision is recorded with reason and reviewer; a violationType in the body corrects the detector's classification. dismiss without reason is 400 invalid-request. Any other starting state is 409 violation-transition-illegal.

Item Value
Operation id post-apx-v1-violations-id-review
Origin APX
Scopes apx.violations:manage
Request body ViolationReview
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Violation Reviewed violation.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such violation.
409 Problem Illegal transition (not in detected).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.5 POST /v1/violations/{id}/issue

Issue the notice or citation. Transition confirmed → issued — or detected → issued for automated detections where the policy in force permits unreviewed issuance (EnforcementPolicy.unreviewedIssuance, or the operator's published documentation where the policy is silent); a guided or manual detection still in detected, or an automated one the policy does not permit, is 409 violation-not-issuable. Whatever the detection mode, issue is also 409 violation-not-issuable while any LPR read in observations[] has plate review pending or rejected (Part 13 §13.3a(4a), Part 19 §19.4 rule 6), and when the relatedSession link rests on match evidence with plate.method: lenient or applied: false (Part 5 §5.8, Part 19 §19.4 rule 5). Sets notice, amount, and dueTime.

Item Value
Operation id post-apx-v1-violations-id-issue
Origin APX
Scopes apx.violations:manage
Request body ViolationIssue
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Violation Issued violation.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such violation.
409 Problem Not issuable from the current state or detection mode, while an evidence read's plate review is pending or rejected, or on lenient or unapplied match evidence (violation-not-issuable, Part 19 §19.4); or an illegal transition (violation-transition-illegal).
422 Problem Refused by the enforcement policy in force (delivery method, notice deadline, penalty cap, or signage).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.6 POST /v1/violations/{id}/payment

Attach the settling Payment reference. Transition issued → paid. The payment itself is taken through the Part 13 surface (POST /v1/payments, a payment link, or an APDS Payment ingested from a pay station); this attaches its reference. Not in issued is 409 violation-transition-illegal. A body amount below what is outstanding is a partial payment (Part 19 §19.6a): it is appended to payments[], amountPaid grows, and the violation stays issued; it moves to paid when amountPaid reaches amount.

Item Value
Operation id post-apx-v1-violations-id-payment
Origin APX
Scopes apx.violations:manage
Request body ViolationPaymentAttachment
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Violation Paid violation.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such violation.
409 Problem Illegal transition (not in issued).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.7 POST /v1/violations/{id}/appeals

Open an appeal. Transition issued → appealed, or paid → appealed within the policy's appealWindowDays (pay-then-appeal, Part 19 §19.6); the state it came from is recorded as appeal.openedFrom. One appeal per violation: a second appeal, an appeal on a closed or voided violation, or one outside the appeal window is 409 appeal-closed. From a state that was never issued (detected, confirmed, dismissed) it is 409 violation-transition-illegal.

Item Value
Operation id post-apx-v1-violations-id-appeals
Origin APX
Scopes apx.violations:manage
Request body ViolationAppealOpen
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Violation Appealed violation.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such violation.
409 Problem Appeal already opened once, violation closed/voided, or window passed (appeal-closed); or a state that was never issued (violation-transition-illegal).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.8 POST /v1/violations/{id}/appeals/resolve

Resolve an appeal. upheld → back to appeal.openedFrom (issued, or paid for a pay-then-appeal); reduced → the same, with amount replaced by adjustedAmount (400 invalid-request when it is absent); dismissed → closed. A pay-then-appeal resolved reduced or dismissed carries the Part 13 refund reference. No open appeal, in whatever state, is 409 appeal-closed.

Item Value
Operation id post-apx-v1-violations-id-appeals-resolve
Origin APX
Scopes apx.violations:manage
Request body ViolationAppealResolution
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Violation Resolved violation.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such violation.
409 Problem No open appeal.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.9 POST /v1/violations/{id}/void

Void a violation. Valid from every non-terminal state (detected, confirmed, issued, appealed, paid); the record and its statusHistory remain readable. Voiding a paid violation SHOULD carry the Part 13 refund reference. From a terminal state (dismissed, closed, voided) it is 409 violation-transition-illegal.

Item Value
Operation id post-apx-v1-violations-id-void
Origin APX
Scopes apx.violations:manage
Request body ViolationVoid
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Violation Voided violation.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such violation.
409 Problem Already terminal (dismissed, closed, or voided).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.10 GET /v1/enforcement/eligibility

Is this vehicle entitled to be here right now?. The guided-enforcement screen-pop (Part 19 §19.3): one call answers whether a credential is covered at a place at an instant, and by what — composing the APDS AssignedRights (APDS's own enforcement source of truth), Sessions, and the reservation/permit profiles the server holds. A convenience READ in the spirit of lane inquiry and the occupancy snapshot: the AssignedRight remains authoritative and a client MAY derive the same answer from the native routes. Lives under /v1/enforcement (not /v1/violations/…) because no violation exists yet when the question is asked.

Item Value
Operation id get-apx-v1-enforcement-eligibility
Origin APX
Scopes apx.violations:read
Request body —
Parameter In Required Type Description
credential query yes string The credential value — plate string, permit number, transponder id.
credentialType query no CredentialTypeEnum APDS CredentialTypeEnum; defaults to licensePlate.
place query yes string uuid HierarchyElement UUID the vehicle is observed at (subtree semantics for rights bound to an ancestor).
at query no string date-time The instant to evaluate; defaults to now.
Response Body Meaning
200 EligibilityResult The entitlement answer with its basis.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such place element.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.11 GET /v1/enforcement/policies

List enforcement policies. Policies bound at or below place, optionally filtered by status.

Item Value
Operation id get-apx-v1-enforcement-policies
Origin APX
Scopes apx.violations:read
Request body —
Parameter In Required Type Description
place query no string uuid
status query no string (active, superseded, retired)
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated policies (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.12 POST /v1/enforcement/policies

Create an enforcement policy (idempotent). Binds jurisdictional rules to a HierarchyElement. Idempotency-Key REQUIRED. The policy applies to the element and its subtree from effectiveFrom unless a descendant carries its own.

Item Value
Operation id post-apx-v1-enforcement-policies
Origin APX
Scopes apx.violations:manage
Request body EnforcementPolicy
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 EnforcementPolicy Idempotent replay — same key + same body returns the policy's current representation (Part 4 §4.2a).
201 EnforcementPolicy Policy created.
400 Problem Missing Idempotency-Key (idempotency-key-required) or a body that fails the schema (invalid-request, with errors[]).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body.
422 Problem reference-unknown — place names nothing visible to the caller; or request-unprocessable — an inconsistent policy, e.g. effectiveTo before effectiveFrom, or an escalation step whose fixed addAmount alone exceeds overallCeiling.maximumAmount. (Steps that only might reach the ceiling are lawful: the ceiling clamps, §19.10 rule 3.)
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.13 GET /v1/enforcement/policies/effective

The policy in force at a place. Resolves inheritance: the nearest ancestor-or-self active policy whose effective window covers at (default now). This is exactly what the server applies at issue and for escalation, so handhelds, pipelines, and appeals portals see the same rules.

Item Value
Operation id get-apx-v1-enforcement-policies-effective
Origin APX
Scopes apx.violations:read
Request body —
Parameter In Required Type Description
place query yes string uuid
at query no string date-time
Response Body Meaning
200 EnforcementPolicy The effective policy.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such place, or no policy in force for it.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.14 GET /v1/enforcement/policies/{id}

Read an enforcement policy. Returns the policy including its immutable statusHistory.

Item Value
Operation id get-apx-v1-enforcement-policies-id
Origin APX
Scopes apx.violations:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 EnforcementPolicy The policy.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such policy.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.15 PUT /v1/enforcement/policies/{id}

Update an enforcement policy (full update, versioned). Full-update semantics. The precondition is the version last read, sent as If-Match: "<version>" or as the body's version (Part 4 §4.2a); a stale one is 409 version-conflict and nothing is written. Changes apply to issuance and escalation from the update onward; violations already issued keep the policy version they were issued under.

Item Value
Operation id put-apx-v1-enforcement-policies-id
Origin APX
Scopes apx.violations:manage
Request body EnforcementPolicy
Parameter In Required Type Description
id path yes string uuid
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 EnforcementPolicy Updated policy.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such policy.
409 Problem Stale version (version-conflict, current version in detail).
422 Problem reference-unknown (unknown place) or request-unprocessable (an inconsistent policy, as on create).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.16 GET /v1/enforcement/signage

List signage records. Signage bound at or below place, optionally filtered by status.

Item Value
Operation id get-apx-v1-enforcement-signage
Origin APX
Scopes apx.violations:read
Request body —
Parameter In Required Type Description
place query no string uuid
status query no string (active, superseded, removed)
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated signage (APDS PaginatedList shape); with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.17 POST /v1/enforcement/signage

Record posted signage (idempotent). Records the text, photo, and position of a sign at a place. Idempotency-Key REQUIRED. To change the wording later, create a new record (or new version) with the new effectiveFrom and set the old one's effectiveTo — historical text is never rewritten.

Item Value
Operation id post-apx-v1-enforcement-signage
Origin APX
Scopes apx.violations:manage
Request body Signage
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 Signage Idempotent replay — same key + same body returns the record's current representation (Part 4 §4.2a).
201 Signage Signage recorded.
400 Problem Missing Idempotency-Key (idempotency-key-required) or a body that fails the schema (invalid-request, with errors[]).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body.
422 Problem reference-unknown — place or policy names nothing visible to the caller.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.18 GET /v1/enforcement/signage/effective

The signage in force at a place. Every active Signage record bound to place or an ancestor whose effective window covers at (default now) — what the server freezes onto a violation at issue.

Item Value
Operation id get-apx-v1-enforcement-signage-effective
Origin APX
Scopes apx.violations:read
Request body —
Parameter In Required Type Description
place query yes string uuid
at query no string date-time
Response Body Meaning
200 object Signage in force (may be empty).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such place.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.19 GET /v1/enforcement/signage/{id}

Read a signage record. Returns the record including its immutable statusHistory.

Item Value
Operation id get-apx-v1-enforcement-signage-id
Origin APX
Scopes apx.violations:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 Signage The signage record.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such record.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.20 PUT /v1/enforcement/signage/{id}

Update a signage record (full update, versioned). Full-update semantics. The precondition is the version last read, sent as If-Match: "<version>" or as the body's version (Part 4 §4.2a); a stale one is 409 version-conflict. Changing text on a record that any issued violation references is refused (422 signage-referenced) — supersede it instead.

Item Value
Operation id put-apx-v1-enforcement-signage-id
Origin APX
Scopes apx.violations:manage
Request body Signage
Parameter In Required Type Description
id path yes string uuid
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 Signage Updated record.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such record.
409 Problem Stale version (version-conflict, current version in detail).
422 Problem Text change on a referenced record (signage-referenced).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.21 POST /v1/violations:search

The violations lookup with the plate in a body. The same lookup as GET /v1/violations (Part 19 §19.2) with the keys in the body (Part 9 §9.6). Same rules and response.

Item Value
Operation id post-apx-v1-violations-search
Origin APX
Scopes apx.violations:read
Request body object
Response Body Meaning
200 object Matching violations.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.22 POST /v1/enforcement/eligibility:check

The eligibility check with the credential in a body. The same question as GET /v1/enforcement/eligibility (Part 19 §19.3) with the credential in the body (Part 9 §9.6). Same answer.

Item Value
Operation id post-apx-v1-enforcement-eligibility-check
Origin APX
Scopes apx.violations:read
Request body object
Response Body Meaning
200 EligibilityResult The eligibility result.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.23 POST /v1/enforcement/violation-imports

Import a violation an external enforcement system issued (idempotent). Records a citation, warning, or notice that another system detected and issued, in whatever state the source reports it, with the statusHistory[] times the source recorded (Part 19 §19.13). The path is under /v1/enforcement, like the eligibility check, so it cannot be mistaken for /v1/violations/{id} (§19.2).

Item Value
Operation id post-apx-v1-enforcement-violation-imports
Origin APX
Scopes apx.violations:manage
Request body ViolationImport
Parameter In Required Type Description
Idempotency-Key header yes string
Response Body Meaning
200 Violation An existing import updated, the same revision again (no change), or an idempotent replay.
201 Violation Imported.
400 Problem Missing Idempotency-Key (idempotency-key-required), or a body that fails the schema — no apds-ext:apx:violation-source@1.0, or a state at or past issuance without notice or amount (invalid-request, with errors[]).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict), or a source revision older than the one held (version-conflict).
422 Problem Unknown place or a violationType outside the served registries (reference-unknown); violationStatus: paid with amountPaid below amount, or a payment in another currency than amount (request-unprocessable).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.1.24 POST /v1/violations/{id}/session

Set, correct, or clear the Session a violation relates to. Sets, corrects, or clears (session: null) relatedSession after creation, with the match evidence (Part 19 §19.13; apds-ext:apx:match-evidence@1.0 is written onto the violation). The link is not a lifecycle transition: it is valid in every state, terminal ones included, and appends nothing to statusHistory[]. If-Match carries the Violation version last read (409 version-conflict when stale; nothing is written). On a change version increments and apx.violations.status.v1 is published; resending what the violation already holds is a no-op (200, no new version, no event). A Session that does not exist or is not visible to the caller is 422 reference-unknown; one at a place outside the hierarchy of the violation's place (neither the same element, an ancestor, nor a descendant) is 422 request-unprocessable.

Item Value
Operation id post-apx-v1-violations-id-session
Origin APX
Scopes apx.violations:manage
Request body ViolationSessionLink
Parameter In Required Type Description
id path yes string uuid
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 Violation The violation with its Session link as it now stands.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Stale If-Match (version-conflict); nothing is written.
422 Problem reference-unknown — the Session names nothing visible to the caller; request-unprocessable — the Session is at a place outside the hierarchy of the violation's place.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.2 Plate lists

Method Path Summary Scopes
GET /v1/plate-lists List plate lists apx.platelists:read
POST /v1/plate-lists Create a plate list apx.platelists:manage
GET /v1/plate-lists/{id} Read a plate list apx.platelists:read
PUT /v1/plate-lists/{id} Replace a plate list's policy (name, category, places, status) apx.platelists:manage
GET /v1/plate-lists/{id}/entries List a plate list's entries apx.platelists:read
POST /v1/plate-lists/{id}/entries Add an entry to a plate list apx.platelists:manage
GET /v1/plate-lists/{id}/entries/{entryId} Read one entry apx.platelists:read
DELETE /v1/plate-lists/{id}/entries/{entryId} Remove an entry apx.platelists:manage

5.2.1 GET /v1/plate-lists

List plate lists. The lists visible to the caller: those with a places[] entry inside the grant, and those owned by the caller's apx_org. mode=change&cursor= serves the Part 5 §5.2 feed of lists (entries have their own feed).

Item Value
Operation id get-apx-v1-plate-lists
Origin APX
Scopes apx.platelists:read
Request body —
Parameter In Required Type Description
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
place query no string uuid Lists that apply at this element or its subtree.
category query no string
status query no string (active, suspended, retired)
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated lists; with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only (Part 5 §5.2): the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set). Problem type target-not-found; re-sync with mode=full. The cursor is an APX parameter, so this refusal is always a Problem (Part 5 §5.2 rules 2 and 5).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.2.2 POST /v1/plate-lists

Create a plate list. Creates a list owned by the caller's apx_org (Part 24 §24.1). Every places[].place must lie inside the grant (403 insufficient-grant). Idempotency-Key optional (Part 4 §4.2a). Publishes apx.platelists.changed.v1.

Item Value
Operation id post-apx-v1-plate-lists
Origin APX
Scopes apx.platelists:manage
Request body PlateList
Parameter In Required Type Description
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 PlateList Idempotent replay.
201 PlateList Created.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem A category outside the served registries, or a places[].place that does not exist (reference-unknown).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.2.3 GET /v1/plate-lists/{id}

Read a plate list.

Item Value
Operation id get-apx-v1-plate-lists-id
Origin APX
Scopes apx.platelists:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 PlateList The list.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.2.4 PUT /v1/plate-lists/{id}

Replace a plate list's policy (name, category, places, status). Full replacement with the version last read as If-Match or body version (409 version-conflict, Part 4 §4.2a). Entries are not part of this body. Publishes apx.platelists.changed.v1.

Item Value
Operation id put-apx-v1-plate-lists-id
Origin APX
Scopes apx.platelists:manage
Request body PlateList
Parameter In Required Type Description
id path yes string uuid
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 PlateList The list as it now stands.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Stale version (version-conflict).
422 Problem A category outside the served registries, or an unknown place (reference-unknown).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.2.5 GET /v1/plate-lists/{id}/entries

List a plate list's entries. Entries of one list, optionally by exact credential value; mode=change&cursor= serves the Part 5 §5.2 feed of entries so a screening module keeps a local copy current. Plate values appear only under apx.platelists:* (Part 9 §9.6); a consumer holding only apx.data:read may subscribe to digests instead (§9.6 rule 6).

Item Value
Operation id get-apx-v1-plate-lists-id-entries
Origin APX
Scopes apx.platelists:read
Request body —
Parameter In Required Type Description
id path yes string uuid
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
credential query no string Exact credential.credentialIdentification match.
activeAt query no string date-time Only entries whose validity contains this instant.
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated entries; with mode=change, the changes after cursor in the same envelope (Part 5 §5.2 rule 8).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.2.6 POST /v1/plate-lists/{id}/entries

Add an entry to a plate list. Adds a credential to the list (Part 24 §24.2). An entry whose credential is already on the list with an overlapping validity is updated in place (200) rather than duplicated. Idempotency-Key optional. Publishes apx.platelists.changed.v1 with the list.

Item Value
Operation id post-apx-v1-plate-lists-id-entries
Origin APX
Scopes apx.platelists:manage
Request body PlateListEntry
Parameter In Required Type Description
id path yes string uuid
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 PlateListEntry An existing entry for the credential updated, or an idempotent replay.
201 PlateListEntry Added.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem An inverted validity window (request-unprocessable), or a full card number where a plate is expected (personal-data-not-permitted).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.2.7 GET /v1/plate-lists/{id}/entries/{entryId}

Read one entry.

Item Value
Operation id get-apx-v1-plate-lists-id-entries-entryid
Origin APX
Scopes apx.platelists:read
Request body —
Parameter In Required Type Description
id path yes string uuid
entryId path yes string uuid
Response Body Meaning
200 PlateListEntry The entry.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.2.8 DELETE /v1/plate-lists/{id}/entries/{entryId}

Remove an entry. Removes the credential from the list; the entry feed emits a tombstone. Publishes apx.platelists.changed.v1.

Item Value
Operation id delete-apx-v1-plate-lists-id-entries-entryid
Origin APX
Scopes apx.platelists:manage
Request body —
Parameter In Required Type Description
id path yes string uuid
entryId path yes string uuid
Response Body Meaning
204 — Removed.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.3 Resolution

When a customer presses the intercom. The agent, human or AI, should not have to log into another system, find the facility, find the lane, find the transaction, and reconstruct what happened.

Method Path Summary Scopes
POST /v1/resolution/contexts Resolve a customer-service context from any known identifiers apx.resolution:read
GET /v1/resolution/contexts/{id} Re-read (recompute) a resolution context apx.resolution:read
GET /v1/resolution/contexts/{id}/allowed-actions Re-evaluate the allowed actions for a context apx.resolution:read
GET /v1/credentials/{id}/passback Anti-passback status for a credential apx.control:read
GET /v1/approvals List approval requests apx.resolution:read
POST /v1/approvals Ask for approval of an action apx.support:manage
GET /v1/approvals/{id} Read an approval request apx.resolution:read
POST /v1/approvals/{id}/decide Approve or deny apx.support:manage

5.3.1 POST /v1/resolution/contexts

Resolve a customer-service context from any known identifiers. THE aggregation call (Part 17 §17.2): accepts whatever parking-domain identifiers are known (lane, device, plate, ticket, credential, reservation code…) — telephony mapping stays on the call platform's side (§17.1) — and returns everything the server can resolve — issue classification, lane status, vehicle, session, account, passback, device status, recent overrides, support history — plus the policy-decided allowedActions. Sections the caller's scopes and apx_places grant could not read directly are omitted. May return status: partial with pendingSources rather than waiting on a slow source; re-read to refresh. Scope apx.resolution:read.

Item Value
Operation id post-apx-v1-resolution-contexts
Origin APX
Scopes apx.resolution:read
Request body ResolutionResolveRequest
Response Body Meaning
201 ResolutionContext The resolved context (possibly partial).
400 Problem No usable identifier supplied: the body carries none of the identifying members (device, place, lane, session, holder, credential, plate, ticketNumber, reservationCode) — problem type invalid-request (Part 17 §17.1).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No identifier resolved to anything this implementation knows.
422 Problem A commsPoint, callerId, dialedNumber or commsDeviceId this implementation does not hold (comms-point-unknown, Part 17 §17.1 and Part 26 §26.4), or a registered code value outside the served registries (reference-unknown).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.3.2 GET /v1/resolution/contexts/{id}

Re-read (recompute) a resolution context. Returns the context recomputed against current state — version increments when anything material changed. Use after events arrive or when the initial response was partial. Scope apx.resolution:read.

Item Value
Operation id get-apx-v1-resolution-contexts-id
Origin APX
Scopes apx.resolution:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ResolutionContext The current context.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such context (contexts MAY expire; re-resolve).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.3.3 GET /v1/resolution/contexts/{id}/allowed-actions

Re-evaluate the allowed actions for a context. The policy layer's current decisions (Part 17 §17.3) — cheaper than a full context recompute; call before executing when time has passed. The consuming agent (human or AI) MUST NOT decide permissibility itself. Scope apx.resolution:read.

Item Value
Operation id get-apx-v1-resolution-contexts-id-allowed-actions
Origin APX
Scopes apx.resolution:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 object Current decisions.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such context.
429 Problem Rate limited (problem type rate-limited, Part 12).

5.3.4 GET /v1/credentials/{id}/passback

Anti-passback status for a credential. The credential's passback overlay: state, expected vs recorded presence, last access. The write side is the resetPassback / forceIn / forceOut commands (Part 17 §17.4). Scope apx.control:read; the place grant must cover the credential's last-access place.

Item Value
Operation id get-apx-v1-credentials-id-passback
Origin APX
Scopes apx.control:read
Request body —
Parameter In Required Type Description
id path yes string uuid APDS Credential UUID.
Response Body Meaning
200 PassbackStatus Passback status (state is unknown for a known credential whose passback is not tracked).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem No such credential (problem type target-not-found).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.3.5 GET /v1/approvals

List approval requests. Approval requests at the caller's places, newest first (Part 17 §17.3a); an approver's queue is status=pending&role=….

Item Value
Operation id get-apx-v1-approvals
Origin APX
Scopes apx.resolution:read
Request body —
Parameter In Required Type Description
place query no string uuid
status query no string (pending, approved, denied, expired)
role query no string
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated approval requests.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.3.6 POST /v1/approvals

Ask for approval of an action. An agent whose AllowedAction said requiresApproval asks the named role to decide (Part 17 §17.3a). place must lie inside the grant. Idempotency-Key optional. Publishes apx.approvals.changed.v1; the approver's system subscribes to it or reads the queue.

Item Value
Operation id post-apx-v1-approvals
Origin APX
Scopes apx.support:manage
Request body ApprovalRequest
Parameter In Required Type Description
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 ApprovalRequest Idempotent replay.
201 ApprovalRequest Created, status = pending.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Idempotency-Key replayed with a different body (idempotency-conflict).
422 Problem A place or target that does not exist (reference-unknown).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.3.7 GET /v1/approvals/{id}

Read an approval request. The request with its decision once made, or its expired status once expiresAt has passed (Part 17 §17.3a).

Item Value
Operation id get-apx-v1-approvals-id
Origin APX
Scopes apx.resolution:read
Request body —
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ApprovalRequest The request with its decision, if made.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.3.8 POST /v1/approvals/{id}/decide

Approve or deny. The approver decides: pending → approved or denied (Part 17 §17.3a). The agent then executes the action with Approval evidence citing the request. A request already decided or expired is 409 approval-closed. Publishes apx.approvals.changed.v1.

Item Value
Operation id post-apx-v1-approvals-id-decide
Origin APX
Scopes apx.support:manage
Request body ApprovalDecision
Parameter In Required Type Description
id path yes string uuid
Response Body Meaning
200 ApprovalRequest The decided request.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Already decided or expired (approval-closed).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.4 Support

What happened on the last call. Support-interaction history for a resolution context: who spoke to the customer, through which channel, about what, and what was done.

Method Path Summary Scopes
GET /v1/support/interactions Support history for a subject apx.support:manage
POST /v1/support/interactions Record a support interaction apx.support:manage
GET /v1/support/interactions/{id} Read one support interaction apx.support:manage apx.resolution:read
PUT /v1/support/interactions/{id} Update (complete) a support interaction apx.support:manage

5.4.1 GET /v1/support/interactions

Support history for a subject. Recent interactions filtered by any subject key. At least one filter is required; none is 400 invalid-request. correlationId, interactionId, and credential each suffice on their own, so one correlation id reconstructs the episode (Part 17 §17.7). Scope apx.support:manage (or apx.resolution:read for read-only consumers).

Item Value
Operation id get-apx-v1-support-interactions
Origin APX
Scopes apx.support:manage
Request body —
Parameter In Required Type Description
plate query no string
holder query no string uuid
account query no string uuid
session query no string uuid
place query no string uuid
since query no string date-time
correlationId query no string uuid Correlation chain id (Part 17 §17.7). Exact match.
interactionId query no string The calling application's opaque interaction identifier. Exact match.
credential query no string uuid APDS Credential UUID (matches subjects.credential).
page query no integer The page number for paginated responses.
Response Body Meaning
200 object Paginated interactions (APDS PaginatedList shape).
400 Problem No filter given (problem type invalid-request).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.4.2 POST /v1/support/interactions

Record a support interaction. Records one customer-service interaction (human or AI) so future resolution contexts can surface it. Summaries, not transcripts (Part 9 §9.6). Scope apx.support:manage.

Item Value
Operation id post-apx-v1-support-interactions
Origin APX
Scopes apx.support:manage
Request body SupportInteraction
Parameter In Required Type Description
Idempotency-Key header no string When given, the operation is idempotent per Part 4 §4.2a: a replay with the same body returns the current representation (200), a different body is 409 idempotency-conflict. Clients that retry SHOULD send it.
Response Body Meaning
200 SupportInteraction Idempotent replay — the interaction's current representation (Part 4 §4.2a).
201 SupportInteraction Recorded interaction.
400 Problem Invalid interaction (problem type invalid-request).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 Problem Same Idempotency-Key replayed with a different body (idempotency-conflict).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.4.3 GET /v1/support/interactions/{id}

Read one support interaction. One recorded interaction by id (Part 17 §17.6). Scope apx.support:manage, or apx.resolution:read for read-only consumers; the interaction's place must be inside the caller's grant.

Item Value
Operation id get-apx-v1-support-interactions-id
Origin APX
Scopes apx.support:manage, apx.resolution:read
Request body —
Parameter In Required Type Description
id path yes string uuid SupportInteraction id.
Response Body Meaning
200 SupportInteraction The interaction.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
429 Problem Rate limited (problem type rate-limited, Part 12).

5.4.4 PUT /v1/support/interactions/{id}

Update (complete) a support interaction. Replaces the interaction — typically to complete a record opened when the call was answered with endedAt, resolution, summary, and actions (Part 17 §17.6). Optimistic concurrency per Part 4 §4.2a: send the version last read as If-Match (or in the body); a stale one is 409 version-conflict. The server increments version and publishes apx.support.interaction.recorded.v1 again; consumers tell a create from an update by version. id in the body, when present, MUST equal the path id. Scope apx.support:manage.

Item Value
Operation id put-apx-v1-support-interactions-id
Origin APX
Scopes apx.support:manage
Request body SupportInteraction
Parameter In Required Type Description
id path yes string uuid SupportInteraction id.
If-Match header no string The version the client last read, as an entity tag ("7"). A stale value is 409 version-conflict; nothing is written (Part 4 §4.2a). Equivalent to sending version in the body.
Response Body Meaning
200 SupportInteraction The updated interaction.
400 Problem The request is malformed: the body or a parameter fails the operation's schema or a normative field rule (problem type invalid-request, with an errors[] member naming each offending JSON Pointer), or a REQUIRED Idempotency-Key is absent (idempotency-key-required). Part 12.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem The addressed resource does not exist (problem type target-not-found). A resource at a place outside the caller's apx_places grant is 403 insufficient-grant instead (Part 9 §9.3). A resource that exists but lies outside a narrower ownership scope (a merchant's own programs, a valet customer's own ticket) is reported as 404, so the answer never confirms another party's record exists (Part 9 §9.3a).
409 Problem Stale version (version-conflict, Part 4 §4.2a); nothing is written.
429 Problem Rate limited (problem type rate-limited, Part 12).

6 Webhooks (event deliveries)

6.1 Webhooks

Method Path Summary Scopes
POST apx-event Signed APX event delivery
POST apx-native-event APDS EventTypeEnum topic delivery
POST apx.subscription.failed.v1 A subscription exhausted its retry schedule
POST apx.data.observation.created.v1 An Observation was ingested
POST apx.data.observation.updated.v1 An ingested Observation was replaced
POST apx.reservation.noshow.v1 A reservation reached its no-show condition

6.1.1 POST apx-event

Signed APX event delivery. Every webhook delivery POSTs one EventEnvelope with headers APX-Signature (v1=HMAC-SHA256(secret, timestamp + "." + body)), APX-Timestamp (RFC 3339, ±5 min replay window), APX-Delivery-Id (unique per attempt; envelope id is stable across retries), and APX-Key-Id (REQUIRED during secret-rotation overlap windows — Part 9 §9.4). Respond 2xx to acknowledge; anything else triggers the normative retry schedule (Part 8).

Item Value
Operation id receive-apx-event
Origin APX webhook
Scopes none
Request body EventEnvelope
Response Body Meaning
200 — Acknowledged.

6.1.2 POST apx-native-event

APDS EventTypeEnum topic delivery. A delivery on an APDS 4.1 topic (SessionCreated, PlaceUpdated, …): type is an APDS EventTypeEnum value, data the APDS EventData shape (the created/updated entity; for a *Deleted topic the last state), and subject references the entity (Part 5 §5.4, Part 8 §8.2). Signed and retried like every delivery.

Item Value
Operation id receive-apx-native-event
Origin APX webhook
Scopes none
Request body EventEnvelope / object
Parameter In Required Type Description
APX-Signature header yes string v1= + hex HMAC-SHA256(secret, APX-Timestamp + "." + raw body), computed per attempt.
APX-Timestamp header yes string date-time RFC 3339 time of THIS attempt (not of the event or of the first attempt).
APX-Delivery-Id header yes string uuid UUID unique per attempt; the envelope id is the dedup key.
APX-Key-Id header no string The signing key's id — REQUIRED during a rotation overlap (Part 9 §9.4).
Response Body Meaning
200 — Acknowledged.

6.1.3 POST apx.subscription.failed.v1

A subscription exhausted its retry schedule. Published when a subscription enters failed (Part 8 §8.3). subject references the subscription (className ApxEventSubscription); data is a SubscriptionFailure. Delivered to other subscriptions of the same apx_org that list the topic, never to the failed one.

Item Value
Operation id receive-apx-subscription-failed
Origin APX webhook
Scopes none
Request body EventEnvelope / object
Parameter In Required Type Description
APX-Signature header yes string v1= + hex HMAC-SHA256(secret, APX-Timestamp + "." + raw body), computed per attempt.
APX-Timestamp header yes string date-time RFC 3339 time of THIS attempt (not of the event or of the first attempt).
APX-Delivery-Id header yes string uuid UUID unique per attempt; the envelope id is the dedup key.
APX-Key-Id header no string The signing key's id — REQUIRED during a rotation overlap (Part 9 §9.4).
Response Body Meaning
200 — Acknowledged.

6.1.4 POST apx.data.observation.created.v1

An Observation was ingested. One event per ingested read. data is the APDS ObservationElement (an ingested ObservationSet yields one event per element); subject references it with className ObservationElement; publishers MUST populate elementIds with the observing lane or place, which is the event's place binding (Part 8 §8.5). Plate values are subject to Part 9 §9.6.

Item Value
Operation id receive-apx-data-observation-created
Origin APX webhook
Scopes none
Request body EventEnvelope / object
Parameter In Required Type Description
APX-Signature header yes string v1= + hex HMAC-SHA256(secret, APX-Timestamp + "." + raw body), computed per attempt.
APX-Timestamp header yes string date-time RFC 3339 time of THIS attempt (not of the event or of the first attempt).
APX-Delivery-Id header yes string uuid UUID unique per attempt; the envelope id is the dedup key.
APX-Key-Id header no string The signing key's id — REQUIRED during a rotation overlap (Part 9 §9.4).
Response Body Meaning
200 — Acknowledged.

6.1.5 POST apx.data.observation.updated.v1

An ingested Observation was replaced. Published whenever an ingested Observation changes — for example the LPR system revising accessEvent through PUT /v1/lpr/reads/{observation}/access-event (Part 13 §13.3a(4), §13.4), or a reviewer's plate decision through PUT /v1/lpr/reads/{observation}/plate (§13.3a(4a)). data is the APDS ObservationElement as it now stands; subject and the place binding (elementIds) are as for apx.data.observation.created.v1. Consumers key on the Observation id and keep the highest version. Plate values are subject to Part 9 §9.6.

Item Value
Operation id receive-apx-data-observation-updated
Origin APX webhook
Scopes none
Request body EventEnvelope / object
Parameter In Required Type Description
APX-Signature header yes string v1= + hex HMAC-SHA256(secret, APX-Timestamp + "." + raw body), computed per attempt.
APX-Timestamp header yes string date-time RFC 3339 time of THIS attempt (not of the event or of the first attempt).
APX-Delivery-Id header yes string uuid UUID unique per attempt; the envelope id is the dedup key.
APX-Key-Id header no string The signing key's id — REQUIRED during a rotation overlap (Part 9 §9.4).
Response Body Meaning
200 — Acknowledged.

6.1.6 POST apx.reservation.noshow.v1

A reservation reached its no-show condition. data is a ReservationSummary (reservation, reservationState noShow, plannedStart); subject references the AssignedRight (Part 14 §14.1, Part 8 §8.7).

Item Value
Operation id receive-apx-reservation-noshow
Origin APX webhook
Scopes none
Request body EventEnvelope / object
Parameter In Required Type Description
APX-Signature header yes string v1= + hex HMAC-SHA256(secret, APX-Timestamp + "." + raw body), computed per attempt.
APX-Timestamp header yes string date-time RFC 3339 time of THIS attempt (not of the event or of the first attempt).
APX-Delivery-Id header yes string uuid UUID unique per attempt; the envelope id is the dedup key.
APX-Key-Id header no string The signing key's id — REQUIRED during a rotation overlap (Part 9 §9.4).
Response Body Meaning
200 — Acknowledged.

7 APDS 4.1 native routes

7.1 Places

Method Path Summary Scopes
GET /places List Places po sp ep ad
POST /places Create Place po
GET /places/{id} Get Place po sp ep ad
PUT /places/{id} Update Place po
DELETE /places/{id} Delete Place po

7.1.1 GET /places

List Places. Returns a list of places potentially filtered by a combination of : * latitude, longitude and radius : retrieve all places within a geographic area, * types : retrieve all places of the given type, * right_type : retrieve all places associated with the right specification type, * structure_type : retrieve all places associated with the specified structure type, * structure_grade : retrieve all places associated with the specified structure grade, * name : retrieve all places which match the name of the facilities, * layer : specify the maximum hierarchy element layer desired, * operator : the id of the operator of this location * modified_since : retrieve all places that have changed from that given instant onwards, * expand : a comma-separated list of optional object attributes associated to a place that should be included in the result set.

Item Value
Operation id get-places
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
latitude query no number float Location latitude to use as filter (mandatory if longitude and radius are defined)
longitude query no number float Location longitude to use as filter (mandatory if latitude and radius are defined)
radius query no integer Number of metres to use as search filter from given position (mandatory if latitude and longitude are defined)
type query no array of HierarchyElementTypeEnum Comma-separated list of place types to consider. All will be assumed if parameter is not used or left blank.
right_type query no array of RightSpecificationTypeEnum Comma-separated list of right specification types to consider. All will be assumed if parameter is not used or left blank.
structure_type query no array of StructureTypeEnum Comma-separated list of types of structure in the hierarchy to consider (all will be assumed if parameter is not used or left blank)
structure_grade query no array of StructureGradeEnum Comma-separated list of Structure grades in the hierarchy to consider (all will be assumed if parameter is not used or left blank)
name query no string Name of place hierarchy element (in any of its supported languages)
layer query no integer Most detailed (lower-level) layer of data desired. 0 (zero) being the first level (and higher numbers correspond to lower-levels of information). If left empty, the entire place hierarchy that matches the remaining parameters will be returned.
operator query no string id of the parking operator in charge of the location(s)
modified_since query no integer Unix epoch instant to filter results that have changed or have been deleted after the given instant. If expand attributes are requested, then this parameter will also apply to those objects. When this attribute is used, the result set will also include a list of deleted references to avoid storing stale data.
expand query no array of string Comma-separated list of optional object attributes associated to a place hierarchy element that should be included in the result set.
page query no integer The page number for paginated responses.
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
place query no array of string Comma-separated list of unique place ids according to the requested types.
Response Body Meaning
200 HierarchyElementList / ChangeFeedPage Ok
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only: the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set) — problem type target-not-found; re-sync with mode=full (Part 5 §5.2 rules 2 and 5). The cursor is an APX parameter, so this refusal is always a Problem.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.1.2 POST /places

Create Place. Create a new place.

Item Value
Operation id create-place
Origin APDS 4.1 native route
Scopes po
Request body HierarchyElement
Response Body Meaning
201 ResponseStatus Created
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type id-collision (client-supplied id already exists) instead of ResponseStatus.
422 Problem A lane's apds-ext:apx:lane-cameras@1.0 names a cameraId already configured on another lane of the same Place (problem type request-unprocessable, Part 13 §13.3a(5)); nothing is written.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.1.3 GET /places/{id}

Get Place. Returns the latest version of a given place by its identifier (or a specific version provided as a query parameter).

Item Value
Operation id get-place
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the place.
version query no integer Previous version number. Useful when a reference to a resource version is found in another dataset, and that version is no longer the latest one. Latest version is assumed when this parameter is not used.
expand query no array of string Comma-separated list of optional object attributes associated to a place hierarchy element that should be included in the result set.
Response Body Meaning
200 HierarchyElement OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.1.4 PUT /places/{id}

Update Place. Update an existing place using its identifier.

Item Value
Operation id update-place
Origin APDS 4.1 native route
Scopes po
Request body HierarchyElement / HierarchyElementChangePayload
Parameter In Required Type Description
id path yes string Unique identifier for the place.
APX-Update-Mode header no string (full, change) APX data profile (Part 5 §5.1). full (default, stock APDS behavior): the body is the complete current state. change: the body is a ChangePayload — identity plus only the changed members; absent = unchanged, explicit null = clear. A stale version in change mode is 409 version-conflict.
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type version-conflict (stale version) instead of ResponseStatus.
422 Problem A lane's apds-ext:apx:lane-cameras@1.0 names a cameraId already configured on another lane of the same Place (problem type request-unprocessable, Part 13 §13.3a(5)); nothing is written.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.1.5 DELETE /places/{id}

Delete Place. Delete an existing place using its identifier.

Item Value
Operation id delete-place
Origin APDS 4.1 native route
Scopes po
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the place.
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives the most specific registered problem type (Part 12 §12.4) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.2 Observation

Method Path Summary Scopes
GET /observations get list of recorded observations
POST /observations create an Observation or Observation Set
GET /observations/{id} get a specific observation element
PUT /observations/{id} update a specific observation element
DELETE /observations/{id} delete a specific observation element

7.2.1 GET /observations

get list of recorded observations. Lists Observations and allows searching/filtering by:

Item Value
Operation id get-observations
Origin APDS 4.1 native route
Scopes none
Request body —
Parameter In Required Type Description
place query no array of string Comma-separated list of unique place ids according to the requested types.
latitude query no number float Location latitude to use as filter (mandatory if longitude and radius are defined)
longitude query no number float Location longitude to use as filter (mandatory if latitude and radius are defined)
radius query no integer Number of metres to use as search filter from given position (mandatory if latitude and longitude are defined)
modified_since query no integer Unix epoch instant to filter results that have changed or have been deleted after the given instant. If expand attributes are requested, then this parameter will also apply to those objects. When this attribute is used, the result set will also include a list of deleted references to avoid storing stale data.
start_before query no integer Unix epoch instant to filter results starting before the given instant.
end_before query no integer Unix epoch instant to filter results ending before the given instant.
start_after query no integer Unix epoch instant to filter results starting after the given instant.
end_after query no integer Unix epoch instant to filter results ending after the given instant.
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
Response Body Meaning
200 object / ChangeFeedPage OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only: the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set) — problem type target-not-found; re-sync with mode=full (Part 5 §5.2 rules 2 and 5). The cursor is an APX parameter, so this refusal is always a Problem.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.2.2 POST /observations

create an Observation or Observation Set. create a singular Observation or an Observation Set

Item Value
Operation id post-observations
Origin APDS 4.1 native route
Scopes none
Request body ObservationElement / ObservationSet
Response Body Meaning
201 ResponseStatus Observation (or ObservationSet) created (APDS ResponseStatus, as on the other native creates).
400 ResponseStatus Observation can not be created due to invalid or missing data. APX (Part 5 §5.1a, Part 12 §12.1): with Accept: application/problem+json, problem type invalid-request (with errors[]).
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 ResponseStatus Observation can not be created due to conflict (id already exists). APX: with Accept: application/problem+json, problem type id-collision.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.2.3 GET /observations/{id}

get a specific observation element. get the latest version of a given Observation by its identifier (or a particular previous version when provided as a query parameter)

Item Value
Operation id get-observation-id
Origin APDS 4.1 native route
Scopes none
Request body —
Parameter In Required Type Description
id path yes string unique observation identifier
version query no integer Previous version number. Useful when a reference to a resource version is found in another dataset, and that version is no longer the latest one. Latest version is assumed when this parameter is not used.
Response Body Meaning
200 ObservationElement OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.2.4 PUT /observations/{id}

update a specific observation element. update the given Observation

Item Value
Operation id update-observation-id
Origin APDS 4.1 native route
Scopes none
Request body ObservationElement / ObservationElementChangePayload
Parameter In Required Type Description
id path yes string unique observation identifier
APX-Update-Mode header no string (full, change) APX data profile (Part 5 §5.1). full (default, stock APDS behavior): the body is the complete current state. change: the body is a ChangePayload — identity plus only the changed members; absent = unchanged, explicit null = clear. A stale version in change mode is 409 version-conflict.
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus Observation can not be updated due to invalid or missing data. APX: with Accept: application/problem+json, problem type invalid-request.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type version-conflict (stale version) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.2.5 DELETE /observations/{id}

delete a specific observation element. delete the given Observation

Item Value
Operation id delete-observation-id
Origin APDS 4.1 native route
Scopes none
Request body —
Parameter In Required Type Description
id path yes string unique observation identifier
Response Body Meaning
200 ResponseStatus OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.3 Organisations

Method Path Summary Scopes
GET /contacts Get List of Organisations (Contacts) po sp ep ad
POST /contacts create a new contact
GET /contacts/{contactId} get details of particular contact / organisation po sp ep ad
PUT /contacts/{contactId} update existing contact
DELETE /contacts/{contactId} delete existing contact

7.3.1 GET /contacts

Get List of Organisations (Contacts). Returns the latest list of all organisations and their public ids

Item Value
Operation id get-contacts
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
type query no ContactPointTypeEnum filter by this type of organisation/contact
Response Body Meaning
200 object OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).
500 ResponseStatus Internal Server Error

7.3.2 POST /contacts

create a new contact. create a new contact point record which can then be referenced by other data elements

Item Value
Operation id post-contact
Origin APDS 4.1 native route
Scopes none
Request body ContactPoint
Response Body Meaning
201 ResponseStatus CREATED
400 ResponseStatus BAD REQUEST. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 ResponseStatus CONFLICT. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type id-collision (client-supplied id already exists) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.3.3 GET /contacts/{contactId}

get details of particular contact / organisation. returns the details of the contact identified by {contactId}

Item Value
Operation id get-single-contact
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
contactId path yes string Unique identifier for the contact/organisation.
Response Body Meaning
200 ContactPoint OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus contact not found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).
500 ResponseStatus Internal Server Error

7.3.4 PUT /contacts/{contactId}

update existing contact. update an existing contact point record which can then be referenced by other data elements

Item Value
Operation id put-contact
Origin APDS 4.1 native route
Scopes none
Request body ContactPoint / ContactPointChangePayload
Parameter In Required Type Description
contactId path yes string Unique identifier for the contact/organisation.
APX-Update-Mode header no string (full, change) APX data profile (Part 5 §5.1). full (default, stock APDS behavior): the body is the complete current state. change: the body is a ChangePayload — identity plus only the changed members; absent = unchanged, explicit null = clear. A stale version in change mode is 409 version-conflict.
Response Body Meaning
200 ResponseStatus OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus NOT FOUND. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.3.5 DELETE /contacts/{contactId}

delete existing contact. delete an existing contact point record

Item Value
Operation id delete-contact
Origin APDS 4.1 native route
Scopes none
Request body —
Parameter In Required Type Description
contactId path yes string Unique identifier for the contact/organisation.
Response Body Meaning
200 ResponseStatus OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus NOT FOUND. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus CONFLICT. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives the most specific registered problem type (Part 12 §12.4) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.4 Right Specifications

Method Path Summary Scopes
GET /rights/specs List RightSpecifications po sp ep ad
POST /rights/specs Create RightSpecification po
GET /rights/specs/{id} Get RightSpecification po sp ep ad
PUT /rights/specs/{id} Update RightSpecification po
DELETE /rights/specs/{id} Delete RightSpecification po

7.4.1 GET /rights/specs

List RightSpecifications. Returns a list of right specifications potentially filtered by a combination of : * latitude, longitude and radius : retrieve all right specifications used in a geographic area (via their associated place), * a list of Places : retrieve all right specifications connected to any of the given places, * issuer : the id of the entity that issued the right specification * modified_since : retrieve all right specifications that have changed from that given instant onwards, * expand : a comma-separated list of optional object attributes associated to a right specification that should be included in the result set.

Item Value
Operation id get-right_specs
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
latitude query no number float Location latitude to use as filter (mandatory if longitude and radius are defined)
longitude query no number float Location longitude to use as filter (mandatory if latitude and radius are defined)
radius query no integer Number of metres to use as search filter from given position (mandatory if latitude and longitude are defined)
place query no array of string Comma-separated list of unique place ids according to the requested types.
type query no array of HierarchyElementTypeEnum Comma-separated list of place types to consider. All will be assumed if parameter is not used or left blank.
modified_since query no integer Unix epoch instant to filter results that have changed or have been deleted after the given instant. If expand attributes are requested, then this parameter will also apply to those objects. When this attribute is used, the result set will also include a list of deleted references to avoid storing stale data.
issuer query no string id of the entity that issued the returned records
expand query no array of string Comma-separated list of optional object attributes associated to a right specification that should be included in the result set.
page query no integer The page number for paginated responses.
Response Body Meaning
200 RightSpecificationList OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

7.4.2 POST /rights/specs

Create RightSpecification. Create a new right specification.

Item Value
Operation id create-right_specs
Origin APDS 4.1 native route
Scopes po
Request body RightSpecification
Response Body Meaning
201 ResponseStatus Created
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type id-collision (client-supplied id already exists) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.4.3 GET /rights/specs/{id}

Get RightSpecification. Returns the latest version of a given right specification by its identifier (or the specific version provided as a query parameter).

Item Value
Operation id get-right_spec
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the right specification.
version query no integer Previous version number. Useful when a reference to a resource version is found in another dataset, and that version is no longer the latest one. Latest version is assumed when this parameter is not used.
expand query no array of string Comma-separated list of optional object attributes associated to a right specification that should be included in the result set.
Response Body Meaning
200 RightSpecification OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.4.4 PUT /rights/specs/{id}

Update RightSpecification. Update an existing right specification

Item Value
Operation id update-right_spec
Origin APDS 4.1 native route
Scopes po
Request body RightSpecification / RightSpecificationChangePayload
Parameter In Required Type Description
id path yes string Unique identifier for the right specification.
APX-Update-Mode header no string (full, change) APX data profile (Part 5 §5.1). full (default, stock APDS behavior): the body is the complete current state. change: the body is a ChangePayload — identity plus only the changed members; absent = unchanged, explicit null = clear. A stale version in change mode is 409 version-conflict.
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type version-conflict (stale version) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.4.5 DELETE /rights/specs/{id}

Delete RightSpecification. Delete an existing right specification using its identifier.

Item Value
Operation id delete-right_spec
Origin APDS 4.1 native route
Scopes po
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the right specification.
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives the most specific registered problem type (Part 12 §12.4) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.5 Rate Tables

Method Path Summary Scopes
GET /rates List RateTables po sp ep ad
POST /rates Create RateTable po
GET /rates/{id} Get RateTable po sp ep ad
PUT /rates/{id} Update RateTable po
DELETE /rates/{id} Delete RateTable po

7.5.1 GET /rates

List RateTables. Returns a list of rate potentially filtered by a combination of : * latitude, longitude and radius : retrieve all rates used in a geographic area (via their associated assigned rights and place), * a list of places : retrieve all rates connected to assigned rights that belong to any of the given places, * a list of right specifications : retrieve all rates connected to any of the given right specifications, * issuer : the id of the rate responsible party (i.e. the issuer of the rate table) * modified_since : retrieve all rates that have changed from that given instant onwards, * expand : a comma-separated list of optional object attributes associated to a rate that should be included in the result set.

Item Value
Operation id get-rates
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
latitude query no number float Location latitude to use as filter (mandatory if longitude and radius are defined)
longitude query no number float Location longitude to use as filter (mandatory if latitude and radius are defined)
radius query no integer Number of metres to use as search filter from given position (mandatory if latitude and longitude are defined)
place query no array of string Comma-separated list of unique place ids according to the requested types.
right_spec query no array of string Comma-separated list of unique right specification ids according to the requested types.
modified_since query no integer Unix epoch instant to filter results that have changed or have been deleted after the given instant. If expand attributes are requested, then this parameter will also apply to those objects. When this attribute is used, the result set will also include a list of deleted references to avoid storing stale data.
expand query no array of string Comma-separated list of optional attributes associated to a rate that should be included in the result set.
issuer query no string id of the entity that issued the returned records
page query no integer The page number for paginated responses.
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
Response Body Meaning
200 RateTableList / ChangeFeedPage OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only: the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set) — problem type target-not-found; re-sync with mode=full (Part 5 §5.2 rules 2 and 5). The cursor is an APX parameter, so this refusal is always a Problem.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.5.2 POST /rates

Create RateTable. Create a new rate table.

Item Value
Operation id create-rate
Origin APDS 4.1 native route
Scopes po
Request body RateTable
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus RateTable can not be created due to invalid or missing data. APX: with Accept: application/problem+json, problem type invalid-request.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 ResponseStatus RateTable can not be created due to conflict (id already exists). APX: with Accept: application/problem+json, problem type id-collision.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.5.3 GET /rates/{id}

Get RateTable. Returns the latest version of a given rate table by its identifier (or the specific version provided as a query parameter).

Item Value
Operation id get-rate
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the rate table.
version query no integer Previous version number. Useful when a reference to a resource version is found in another dataset, and that version is no longer the latest one. Latest version is assumed when this parameter is not used.
expand query no array of string Comma-separated list of optional attributes associated to a rate that should be included in the result set.
Response Body Meaning
200 RateTable OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.5.4 PUT /rates/{id}

Update RateTable. Update an existing rate table using its identifier, by providing new attributes.

Item Value
Operation id update-rate
Origin APDS 4.1 native route
Scopes po
Request body RateTable / RateTableChangePayload
Parameter In Required Type Description
id path yes string Unique identifier for the rate table.
APX-Update-Mode header no string (full, change) APX data profile (Part 5 §5.1). full (default, stock APDS behavior): the body is the complete current state. change: the body is a ChangePayload — identity plus only the changed members; absent = unchanged, explicit null = clear. A stale version in change mode is 409 version-conflict.
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type version-conflict (stale version) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.5.5 DELETE /rates/{id}

Delete RateTable. Delete an existing rate table using its identifier.

Item Value
Operation id delete-rate
Origin APDS 4.1 native route
Scopes po
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the rate table.
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives the most specific registered problem type (Part 12 §12.4) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.6 Sessions

Method Path Summary Scopes
GET /sessions List Sessions po sp ep ad
POST /sessions Create Session sp
GET /sessions/{id} Get Session po sp ep ad
PUT /sessions/{id} Update Session sp
DELETE /sessions/{id} Delete Session sp

7.6.1 GET /sessions

List Sessions. Returns a list of sessions potentially filtered by a combination of : * latitude, longitude and radius : retrieve all sessions occurring in a geographic area (via their associated place), * a list of Places : retrieve all sessions connected to any of the given places, * a list of RightSpecifications : retrieve all sessions with segments using any of the given right specifications, * a list of Credentials : retrieve all sessions linked to the given credentials, * start_before : retrieve all sessions starting before that given instant, * end_before : retrieve all sessions ending before that given instant, * start_after : retrieve all sessions starting after that given instant, * end_after : retrieve all sessions ending after that given instant, * modified_since : retrieve all sessions that have changed from that given instant onwards, * expand : a comma-separated list of optional object attributes associated to a session or its segment.s that should be included in the result set.

Item Value
Operation id get-sessions
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
latitude query no number float Location latitude to use as filter (mandatory if longitude and radius are defined)
longitude query no number float Location longitude to use as filter (mandatory if latitude and radius are defined)
radius query no integer Number of metres to use as search filter from given position (mandatory if latitude and longitude are defined)
place query no array of string Comma-separated list of unique place ids according to the requested types.
type query no array of HierarchyElementTypeEnum Comma-separated list of place types to consider. All will be assumed if parameter is not used or left blank.
credential_id query no array of string Comma-separated list of unique credential ids according to the requested types.
credential_type query no array of CredentialTypeEnum Comma-separated list of credential types to consider. All will be assumed if parameter is not used or left blank.
right_spec query no array of string Comma-separated list of unique right specification ids according to the requested types.
right_type query no array of RightSpecificationTypeEnum Comma-separated list of right specification types to consider. All will be assumed if parameter is not used or left blank.
start_before query no integer Unix epoch instant to filter results starting before the given instant.
end_before query no integer Unix epoch instant to filter results ending before the given instant.
start_after query no integer Unix epoch instant to filter results starting after the given instant.
end_after query no integer Unix epoch instant to filter results ending after the given instant.
modified_since query no integer Unix epoch instant to filter results that have changed or have been deleted after the given instant. If expand attributes are requested, then this parameter will also apply to those objects. When this attribute is used, the result set will also include a list of deleted references to avoid storing stale data.
expand query no array of string Comma-separated list of optional attributes associated to a session or its segment.s that should be included in the result set.
page query no integer The page number for paginated responses.
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
Response Body Meaning
200 SessionList / ChangeFeedPage OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only: the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set) — problem type target-not-found; re-sync with mode=full (Part 5 §5.2 rules 2 and 5). The cursor is an APX parameter, so this refusal is always a Problem.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.6.2 POST /sessions

Create Session. Creates a new session, along with one or more segment.s. It also allows the creation of assigned rights, for scenarios in which they must be created simultaneously (e.g. off-street and on-street short stays).

Item Value
Operation id create-session
Origin APDS 4.1 native route
Scopes sp
Request body Session
Response Body Meaning
201 ResponseStatus Created
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type id-collision (client-supplied id already exists), or read-already-bound (a read in apds-ext:apx:session-detail@1.0 is bound as entry or exit to another Session of the same place that the write does not name in supersedes, Part 5 §5.8 rule 2), instead of ResponseStatus; nothing is written.
422 Problem The Session's apds-ext:apx:session-detail@1.0 breaks a consistency rule of Part 5 §5.8 — more than one representative read, lifecycle open with an actualEnd or any other lifecycle without one, or a parent whose hierarchyElement is not an ancestor of this Session's (problem type request-unprocessable); or a read naming no Observation visible to the caller (reference-unknown). Nothing is written.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.6.3 GET /sessions/{id}

Get Session. Returns the latest version of a given session by its identifier (or the specific version provided as a query parameter).

Item Value
Operation id get-session
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the session.
version query no integer Previous version number. Useful when a reference to a resource version is found in another dataset, and that version is no longer the latest one. Latest version is assumed when this parameter is not used.
expand query no array of string Comma-separated list of optional attributes associated to a session or its segment.s that should be included in the result set.
Response Body Meaning
200 Session OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.6.4 PUT /sessions/{id}

Update Session. Updates an existing session using its identifier, by providing new attributes. Segments may also be deleted by removing them from the list of segments in the session.

Item Value
Operation id update-session
Origin APDS 4.1 native route
Scopes sp
Request body Session / SessionChangePayload
Parameter In Required Type Description
id path yes string Unique identifier for the session.
APX-Update-Mode header no string (full, change) APX data profile (Part 5 §5.1). full (default, stock APDS behavior): the body is the complete current state. change: the body is a ChangePayload — identity plus only the changed members; absent = unchanged, explicit null = clear. A stale version in change mode is 409 version-conflict.
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type version-conflict (stale version), or read-already-bound (a read in apds-ext:apx:session-detail@1.0 is bound as entry or exit to another Session of the same place that the write does not name in supersedes, Part 5 §5.8 rule 2), instead of ResponseStatus; nothing is written.
422 Problem The Session's apds-ext:apx:session-detail@1.0 breaks a consistency rule of Part 5 §5.8 — more than one representative read, lifecycle open with an actualEnd or any other lifecycle without one, or a parent whose hierarchyElement is not an ancestor of this Session's (problem type request-unprocessable); or a read naming no Observation visible to the caller (reference-unknown). Nothing is written.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.6.5 DELETE /sessions/{id}

Delete Session. Deletes an existing session using its identifier. segments should be deleted by updating the session instead.

Item Value
Operation id delete-session
Origin APDS 4.1 native route
Scopes sp
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the session.
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives the most specific registered problem type (Part 12 §12.4) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.7 Assigned Rights

Method Path Summary Scopes
GET /rights/assigned List AssignedRights po sp ep ad
POST /rights/assigned Create AssignedRight sp
GET /rights/assigned/{id} Get AssignedRight po sp ep ad
PUT /rights/assigned/{id} Update AssignedRight sp
DELETE /rights/assigned/{id} Delete AssignedRight sp

7.7.1 GET /rights/assigned

List AssignedRights. Returns a list of assigned rights potentially filtered by a combination of : * latitude, longitude and radius : retrieve all assigned rights occurring in a geographic area (via their associated place) * a list of places : retrieve all assigned rights connected to any of the given places, * a list of right specifications : retrieve all assigned rights with segments using any of the given right specifications, * a list of credentials : retrieve all assigned rights linked to the given credentials, * start_before : retrieve all assigned rights starting before that given instant, * end_before : retrieve all assigned rights ending before that given instant, * start_after : retrieve all assigned rights starting after that given instant, * end_after : retrieve all assigned rights ending after that given instant, * modified_since : retrieve all assigned rights that have changed from that given instant onwards, * expand : a comma-separated list of optional object attributes associated to an assigned right that should be included in the result set.

Item Value
Operation id get-assigned_rights
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
latitude query no number float Location latitude to use as filter (mandatory if longitude and radius are defined)
longitude query no number float Location longitude to use as filter (mandatory if latitude and radius are defined)
radius query no integer Number of metres to use as search filter from given position (mandatory if latitude and longitude are defined)
place query no array of string Comma-separated list of unique place ids according to the requested types.
type query no array of HierarchyElementTypeEnum Comma-separated list of place types to consider. All will be assumed if parameter is not used or left blank.
credential_id query no array of string Comma-separated list of unique credential ids according to the requested types.
credential_type query no array of CredentialTypeEnum Comma-separated list of credential types to consider. All will be assumed if parameter is not used or left blank.
right_spec query no array of string Comma-separated list of unique right specification ids according to the requested types.
right_type query no array of RightSpecificationTypeEnum Comma-separated list of right specification types to consider. All will be assumed if parameter is not used or left blank.
start_before query no integer Unix epoch instant to filter results starting before the given instant.
end_before query no integer Unix epoch instant to filter results ending before the given instant.
start_after query no integer Unix epoch instant to filter results starting after the given instant.
end_after query no integer Unix epoch instant to filter results ending after the given instant.
modified_since query no integer Unix epoch instant to filter results that have changed or have been deleted after the given instant. If expand attributes are requested, then this parameter will also apply to those objects. When this attribute is used, the result set will also include a list of deleted references to avoid storing stale data.
expand query no array of string Comma-separated list of optional object attributes associated to an assigned right that should be included in the result set.
page query no integer The page number for paginated responses.
mode query no string (full, change) APX change feed (Part 5 §5.2): full (default — the route's ordinary list; on a native APDS route, exactly stock APDS 4.1) or change (the changes after cursor: a ChangeFeedPage on a native route, the route's own list envelope with the change-page members on an APX list route, rule 8; on an APX list route without a cursor, an empty page holding the current head cursor).
cursor query no string Opaque change-feed cursor from a previous change page. Only meaningful with mode=change; a refused cursor is 404 target-not-found (Part 5 §5.2 rules 2 and 5).
Response Body Meaning
200 AssignedRightList / ChangeFeedPage OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 Problem mode=change only: the cursor is unknown, older than the retention window, or was issued for another (class, credential, filter set) — problem type target-not-found; re-sync with mode=full (Part 5 §5.2 rules 2 and 5). The cursor is an APX parameter, so this refusal is always a Problem.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.7.2 POST /rights/assigned

Create AssignedRight. Create a new assigned right based on a given object.

Item Value
Operation id create-assigned_right
Origin APDS 4.1 native route
Scopes sp
Request body AssignedRight / ReferenceToQuote
Response Body Meaning
201 ResponseStatus Created
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type id-collision (client-supplied id already exists) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.7.3 GET /rights/assigned/{id}

Get AssignedRight. Returns the latest version of a given assigned right by its identifier (or a specific version provided as a query parameter).

Item Value
Operation id get-assigned_right
Origin APDS 4.1 native route
Scopes po, sp, ep, ad
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the assigned right.
version query no integer Previous version number. Useful when a reference to a resource version is found in another dataset, and that version is no longer the latest one. Latest version is assumed when this parameter is not used.
expand query no array of string Comma-separated list of optional object attributes associated to an assigned right that should be included in the result set.
Response Body Meaning
200 AssignedRight OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.7.4 PUT /rights/assigned/{id}

Update AssignedRight. Update an existing assigned right using its identifier, by providing new attributes. If the provided quote refers to a session extension, this request shall also update the referenced session.

Item Value
Operation id update-assigned_right
Origin APDS 4.1 native route
Scopes sp
Request body AssignedRight / AssignedRightChangePayload
Parameter In Required Type Description
id path yes string Unique identifier for the assigned right.
APX-Update-Mode header no string (full, change) APX data profile (Part 5 §5.1). full (default, stock APDS behavior): the body is the complete current state. change: the body is a ChangePayload — identity plus only the changed members; absent = unchanged, explicit null = clear. A stale version in change mode is 409 version-conflict.
Response Body Meaning
200 ResponseStatus OK
201 ResponseStatus Created
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus AssignedRight can not be updated as it has not been found (servers that upsert answer 201 instead). APX: with Accept: application/problem+json, problem type target-not-found.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type version-conflict (stale version) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.7.5 DELETE /rights/assigned/{id}

Delete AssignedRight. Delete an existing assigned right using its identifier.

Item Value
Operation id delete-assigned_right
Origin APDS 4.1 native route
Scopes sp
Request body —
Parameter In Required Type Description
id path yes string Unique identifier for the assigned right.
Response Body Meaning
200 ResponseStatus OK
400 ResponseStatus Bad Request. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type invalid-request (with errors[]) instead of ResponseStatus.
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
409 ResponseStatus Conflict. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives the most specific registered problem type (Part 12 §12.4) instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

7.8 Quote

Method Path Summary Scopes
GET /quotes get quotes
POST /quotes create quote request
GET /quotes/{id} get details of a specific quote

7.8.1 GET /quotes

get quotes. get quotes matching specified criteria

Item Value
Operation id get-quote
Origin APDS 4.1 native route
Scopes none
Request body —
Parameter In Required Type Description
latitude query no number float Location latitude to use as filter (mandatory if longitude and radius are defined)
longitude query no number float Location longitude to use as filter (mandatory if latitude and radius are defined)
radius query no integer Number of metres to use as search filter from given position (mandatory if latitude and longitude are defined)
modified_since query no integer Unix epoch instant to filter results that have changed or have been deleted after the given instant. If expand attributes are requested, then this parameter will also apply to those objects. When this attribute is used, the result set will also include a list of deleted references to avoid storing stale data.
place query no array of string Comma-separated list of unique place ids according to the requested types.
right_spec query no array of string Comma-separated list of unique right specification ids according to the requested types.
quote_type query no string (QuoteRightRequest, QuoteRightResponse, QuoteSessionExtensionRequest, QuoteSessionExtensionResponse)
Response Body Meaning
200 QuoteRightRequest / QuoteRightResponse / QuoteSessionExtensionRequest / QuoteSessionExtensionResponse OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

7.8.2 POST /quotes

create quote request. submit a request for a quote

Item Value
Operation id post-quote
Origin APDS 4.1 native route
Scopes none
Request body QuoteRightRequest / QuoteSessionExtensionRequest
Response Body Meaning
200 PaginatedListMeta / object OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
429 Problem Rate limited (problem type rate-limited, Part 12).

7.8.3 GET /quotes/{id}

get details of a specific quote. get details of quote identified by id

Item Value
Operation id get-quote-id
Origin APDS 4.1 native route
Scopes none
Request body —
Parameter In Required Type Description
id path yes string unique id of the quote
Response Body Meaning
200 QuoteRightRequest / QuoteRightResponse / QuoteSessionExtensionRequest / QuoteSessionExtensionResponse OK
401 Problem Missing, malformed, expired, or revoked access token (problem type unauthenticated, Part 12).
403 Problem Insufficient scope (problem type insufficient-scope) or place grant (insufficient-grant) for this operation (Part 9).
404 ResponseStatus Not Found. APX (Part 5 §5.1a, Part 12 §12.1): a client sending Accept: application/problem+json receives problem type target-not-found instead of ResponseStatus.
429 Problem Rate limited (problem type rate-limited, Part 12).

Annex S (informative) Security schemes and scopes

Scopes are defined in the OpenAPI security schemes below and explained in APX Part 9. As elsewhere in this document, the OpenAPI document wins where the two differ.

Scheme Scope Meaning
oAuth po Parking Operator
oAuth sp Service Provider
oAuth ep Enforcement Provider
oAuth ad Administrator
apxOAuth apx.data:read Read parking data via APDS-native routes
apxOAuth apx.data:write Create/update parking data via APDS-native routes
apxOAuth apx.control:read Read commands, lanes, and device status
apxOAuth apx.control:execute Execute commands (vend gate, lost ticket, push rate, apply validation…)
apxOAuth apx.alerts:read Read alerts
apxOAuth apx.alerts:write Raise, acknowledge, and resolve alerts
apxOAuth apx.subscriptions:manage Create and manage event subscriptions
apxOAuth apx.accounts:read Look up accounts and balances
apxOAuth apx.payments:write Take payments and post accounting write-backs
apxOAuth apx.lpr:read LPR plate/ticket cross-lookup
apxOAuth apx.reservations:manage Quote, book, amend, cancel reservations
apxOAuth apx.permits:manage Issue and manage permits
apxOAuth apx.tolling:manage Create and manage toll transactions
apxOAuth apx.resolution:read Resolve and read customer-service resolution contexts and allowed actions
apxOAuth apx.support:manage Record and read support-interaction history
apxOAuth apx.violations:read Read violations and run the enforcement eligibility check
apxOAuth apx.violations:manage Create, review, issue, settle, appeal, and void violations
apxOAuth apx.validations:read Read validation programs, issuances, redemptions, and statements
apxOAuth apx.validations:manage Enrol and update programs, issue stock, reverse redemptions, close statements
apxOAuth apx.validations:redeem Merchant scope — check codes, issue own stock, record redemptions, read own programs and statements (limited to the token's apx_org)
apxOAuth apx.credentials:read Read credentials and their access-event history
apxOAuth apx.credentials:manage Issue, activate, suspend, resume, report lost, revoke, and replace credentials
apxOAuth apx.valet:read Read valet tickets and the retrieval queue
apxOAuth apx.valet:manage Take custody, park, stage, hand back, and manage retrievals
apxOAuth apx.valet:request Customer scope — request or cancel retrieval and read status/ETA for the caller's own ticket (text, app, web, voice bot)
apxOAuth apx.platelists:read Read plate lists and their entries, plate values included (Part 24)
apxOAuth apx.platelists:manage Create and maintain plate lists and entries (Part 24)
apxOAuth apx.ui:launch Open a vendor screen for an agent and read the launches it issued (Part 25)
apxOAuth apx.ui:read Read UI launches and the actions recorded in them (Part 25)
apxOAuth apx.ui:record The surface's own scope; record actions done in a launched screen and close it (Part 25)
apxOAuth apx.siteconfig:read Read a place's equipment, cameras, comms points, display records and external ids; resolve another system's id (Part 26)
apxOAuth apx.siteconfig:manage Add, replace and remove comms points (Part 26)
apxOAuth apx.cameras:view Obtain short-lived camera view links, logged against the agent (Part 26)
apxOAuth apx.displays:record The scope of the system that drives a sign; record that a message was shown (Part 26 §26.9)
apxOAuth apx.compliance:read Read the stay-compliance status on Sessions; without it the decoration is left out (Part 5 §5.9)
apxOAuth apx.compliance:write Write the stay-compliance status on Sessions, beside the Session write scope (Part 5 §5.9)
apxOAuth apx.digest:use Receive the credential digest keys (Part 9 §9.6 rule 6)
apxOAuth apx.replication:write Replay another implementation's records with their original provenance and lifecycle times (Part 18 §18.6)
apxOAuth apx.charging:read read charging-point status (with bay presence) and charging sessions
apxOAuth apx.charging:manage bridge scope; push point availability, bay observations, open sessions, report timeline events, attach settlement
apxOAuth apx.charging:status customer scope; minimized read of the caller's own charging session and the place's charger availability (app, text, voice bot)