APX Interface Specification · APX Specification · APX 0.16.0 · OpenAPI 0.16.0 · built on APDS 4.1 (2026-01-14) · Draft
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:
- APDS 4.1 native routes at their published paths (
/places,
/sessions, /webhooks and so on). APX carries them unchanged, apart
from the corrections listed in 06, Part A, and adds only optional
parameters such as the change-feed mode and cursor (Part 5 §5.2).
- APX routes under the
/v1 prefix.
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.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 |
|
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). |
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 |
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). |
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). |
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) |