{
  "openapi": "3.1.0",
  "info": {
    "title": "APX — PARCS Starter Profile",
    "version": "0.16.0",
    "summary": "An open companion standard to APDS 4.1",
    "license": {
      "name": "MIT",
      "url": "https://opensource.org/licenses/MIT"
    },
    "contact": {
      "name": "APX Standard Working Group (stewarded by Umojo)",
      "email": "rneubauer@umojo.com"
    },
    "x-apds-extension": {
      "extensionName": "apx",
      "extensionVersion": "1.0",
      "apdsVersion": "4.1"
    },
    "description": "The MINIMUM APX surface for a PARCS vendor: apx-data + apx-events + apx-control, plus the read side of apx-site-config (equipment and comms points). A subset of the full APX specification (apx-v1) — every path and schema here is identical to the full spec. See docs/parcs-starter-profile.md for the build order."
  },
  "servers": [
    {
      "url": "https://api.apx-implementation.example",
      "description": "One host serves both surfaces: APDS-native routes at their verbatim\npaths (/places, /sessions, /webhooks, …) and APX routes under the\nexplicit /v1 prefix."
    }
  ],
  "security": [
    {
      "apxOAuth": []
    }
  ],
  "tags": [
    {
      "name": "Discovery",
      "description": "**Where every integration starts.** A partner needs exactly one thing\nto begin: a hostname.\n\n`GET /.well-known/apx-configuration` is unauthenticated and served at\nthe host root. It answers where to get a token, which optional\nconformance classes this server implements, and where its code-list\nregistries are published. `GET /v1/discovery` then answers the\nnarrower and more useful question: what can *this credential* do? The\ndocument it returns is the intersection of the server's classes with\nthe caller's scopes and place grants.\n\nDiscovery is **contractual, not advertising**: everything the document\nlists will work for the caller, and anything it omits will refuse with\na clean 403. That is what makes onboarding a new vendor a matter of\nissuing a credential rather than exchanging PDFs.\n\nWritten standard:\n[Part 16](https://github.com/rneubauer/apx/blob/main/docs/standard/16-discovery.md)."
    },
    {
      "name": "Data",
      "description": "**Reading and writing parking data, and staying in sync.**\n\nThe data routes themselves are APDS 4.1's own, mounted verbatim:\n`/places`, `/sessions`, `/rates`, `/rights/specs`, `/rights/assigned`,\n`/observations`, `/contacts`, `/quotes`. APX invents nothing here on\npurpose, because data exchange is the part the industry already\nagreed on.\n\nWhat APX adds is a **profile** over those routes, all of it additive\nand invisible to a client that ignores it: full versus change update\nsemantics, tombstones for deletions, and a cursor-based change feed\nthat is ordered, gapless, and exactly-once, so a partner that goes\noffline for an hour replays precisely what it missed. Partial writes\nmake `null` mean *clear this field* and omission mean *leave it\nalone*, which retires the oldest bug in data integration.\n\nThe one net-new read here is the occupancy snapshot: how full a\ngarage, level, or zone is right now, without walking the whole Place\nhierarchy.\n\nTwo decorations on the APDS Session carry what other systems\ndecided about a stay: the pairing of reads behind it\n(`session-detail`), and the compliance outcome an engine scored for\nit (`stay-compliance`), which is served only under its own scope.\n\nWritten standard:\n[Part 5](https://github.com/rneubauer/apx/blob/main/docs/standard/05-data.md)."
    },
    {
      "name": "Subscription",
      "description": "**Push instead of poll.** A superset-compatible profile of the APDS\n4.1 `/webhooks` endpoint: stock APDS subscription bodies work here\nunmodified.\n\nWebhooks without rules are where integrations go to die, so the\ndelivery contract is normative rather than best-effort. Every delivery\nis one uniform envelope, HMAC-signed so the receiver can prove it is\ngenuine, carrying a stable event id so duplicates are detectable.\nFailed deliveries follow a published retry schedule before the\nsubscription is marked failed, which itself raises an alert. The\ndelivery ledger records every attempt and its result.\n\nSubscriptions filter by place and by severity, so a partner receives\nonly its own world, and an event whose place cannot be resolved is\ndropped rather than leaked. Server-sent events carry the same\nenvelopes for consumers that cannot host a public endpoint.\n\nWritten standard:\n[Part 8](https://github.com/rneubauer/apx/blob/main/docs/standard/08-events.md)."
    },
    {
      "name": "Alerts",
      "description": "**Knowing something is wrong.** A net-new domain: APDS has no alert,\nevent, or notification class.\n\nOne `Alert` resource covers the operational conditions an attendant or\na monitoring system acts on: a device fault, a blocked lane, a vehicle\nin a space it should not be, an occupancy threshold crossed, a payment\nexception. Alert *types* are an open vocabulary, seeded from the APDS\nuse-case exception list and extensible by any implementer through\ntheir own code list. Severity, by contrast, is a closed five-level\nscale, because filtering on it has to mean the same thing everywhere.\n\nThe lifecycle is raised, acknowledged, resolved, with an immutable\naudit of every transition.\n\nWritten standard:\n[Part 7](https://github.com/rneubauer/apx/blob/main/docs/standard/07-alerts.md)."
    },
    {
      "name": "Control",
      "description": "**Doing things in the real world.** APDS inventories devices and marks\naccess-controlled places but defines no actuation. This is it.\n\nEverything physical goes through one audited command plane rather than\nscattered verbs: vend a gate, hold it open, close a lane, issue a lost\nticket, push a rate table, apply a validation, set a device state,\ndisplay a message, restart a device. Commands are **idempotent** (a\nretry must not vend the gate twice), **perishable** (a vend requested\nten minutes ago must not fire now), and audited end to end.\n\nTwo optional features close open tickets at the exit lane without\ntouching the deck. **Negotiated rates:** a RateTable flagged\n`negotiable` (the `apds-ext:apx:ratepolicy@1.0` decoration, which\nrides with the table on every `/rates` sync) may be pushed to the\none car in the lane, and the command names the agent who chose it.\n**Ticket matching:** when no ticket is in the machine the lane\ninquiry offers the open sessions that plausibly belong to the\nvehicle — by plate read, credential, account phone, or reservation\n— and `matchTicket` binds the exit to the real entry, priced from\nthe real entry time, with the agent on the record. The lost-ticket\nfee becomes the fallback, not the default.\n\nThe response is deliberately not a success boolean. It is a command\nresource whose `confirmationLevel` distinguishes *accepted* from *the\ndevice acknowledged it* from *the outcome was physically verified*. A\nconsumer, an AI agent especially, must not claim a stronger outcome\nthan that level supports.\n\nAlso here: the lane inquiry that populates a call-center screen-pop,\nthe validation-provider list for a place, and live device status.\n\nWritten standard:\n[Part 6](https://github.com/rneubauer/apx/blob/main/docs/standard/06-control.md)."
    },
    {
      "name": "Accounts",
      "description": "**Money.** Account and balance lookup, taking a payment, refunds,\nvoids and captures, accounting write-back, and payment history.\n\nAPDS models a `Payment` but not the *act* of taking one. The APX\n`PaymentRecord` is that action record: addressable, idempotent, and\nreconcilable, and every approved one is materialized as an APDS\nPayment so downstream APDS consumers see it without speaking APX.\n\nTwo rules shape this domain. Full card numbers never appear anywhere.\nAnd because one endpoint often fronts many facilities, every payment\nnames the place it belongs to, so revenue stays attributable and a\ngrant cannot leak across sites.\n\nAPDS publishes no payment events, which leaves financial analytics\nblind; APX closes that with a payment-recorded topic.\n\nWritten standard:\n[Part 13](https://github.com/rneubauer/apx/blob/main/docs/standard/13-accounts-payments-lpr.md)."
    },
    {
      "name": "LPR",
      "description": "**Plates.** A camera read *is* an APDS `Observation`, so ingest is the\nstandard data route every integration already uses. No bespoke\ningestion API.\n\nThe genuinely new need is the **join**: which ticket goes with this\nplate, and which plate with this ticket. That is the one endpoint this\ndomain adds, answering with the session, the confidence score, and an\naccess-controlled image link.\n\nModern engines know more than a plate string, so a read may also carry\nper-attribute confidence for plate, state, make, model, colour and\nclass, the runner-up plate strings the engine rejected, how many\nframes and plates it read, which face of the vehicle it saw, and\nwhether the vehicle was moving toward the camera, away from it, or\nstopped. The LPR system then says what the read *was*: an **entry**\nor an **exit**. APX derives nothing — each lane's cameras, and which\nway each faces, are described on the lane, and a Session is simply\nthe entry and exit reads of one visit.\n\nWritten standard:\n[Part 13](https://github.com/rneubauer/apx/blob/main/docs/standard/13-accounts-payments-lpr.md)."
    },
    {
      "name": "Reservations",
      "description": "**Booking ahead**, expressed as conventions over native APDS routes\nrather than a parallel booking system.\n\nQuote through the APDS quote route, book by creating an\n`AssignedRight` carrying the APX reservation extension, amend and\ncancel through the same surface, and check in by linking the arrival\nto the right. The reservation is therefore a first-class APDS object\nany APDS consumer can read, not an APX-only record that has to be\nsynchronized.\n\nThe hard parts this domain pins down are the ones integrations usually\nget wrong: how a prepaid booking binds to the session the vehicle\nactually starts, what happens when the plate is misread, and when a\nno-show is declared.\n\nWritten standard:\n[Part 14](https://github.com/rneubauer/apx/blob/main/docs/standard/14-reservations-permits.md)."
    },
    {
      "name": "Permits",
      "description": "**Pooled permits**: issuing from a finite allocation, over the APDS\nright-specification and right-pool model.\n\nThe cases that matter are the ones a naive implementation breaks on: a\npool that runs out, a household or company credential valid for\nseveral vehicles, and issuance that must stay attributable when\nallocations are audited later.\n\nWritten standard:\n[Part 14](https://github.com/rneubauer/apx/blob/main/docs/standard/14-reservations-permits.md)."
    },
    {
      "name": "Tolling",
      "description": "**Toll transactions**, a net-new domain: APDS has no toll entity.\n\nEverything is still built to APDS conventions. A toll point is\nequipment in the place hierarchy, the reads are native `Observation`s,\nmoney is the APDS amount shape, and settlement links a Payment\nreference. A transaction runs created, priced, paid, and a dispute can\nmove any non-voided transaction aside for resolution.\n\nCreation is idempotent, because gantries retry in storms.\n\nWritten standard:\n[Part 15](https://github.com/rneubauer/apx/blob/main/docs/standard/15-tolling.md)."
    },
    {
      "name": "Resolution",
      "description": "**When a customer presses the intercom.** The agent, human or AI,\nshould not have to log into another system, find the facility, find\nthe lane, find the transaction, and reconstruct what happened.\n\nOne call assembles the context from whatever identifiers the caller\nhas: a phone number, a lane, a plate, a ticket, a credential, a\nreservation code. The server resolves every relationship it can and\ndoes not fail because some identifiers are missing.\n\nThe important design decision is that **the server, not the agent,\ndecides what may be done**. The context returns the allowed actions,\nalready evaluated against policy, including which ones require\nsupervisor approval. Writes then go through the existing command plane\nrather than a second one. A refund an agent should not offer is simply\nnot in the list.\n\nWritten standard:\n[Part 17](https://github.com/rneubauer/apx/blob/main/docs/standard/17-resolution.md)."
    },
    {
      "name": "Support",
      "description": "**What happened on the last call.** Support-interaction history for a\nresolution context: who spoke to the customer, through which channel,\nabout what, and what was done.\n\nIt exists so the second call is not the first call again, and so an\naction taken during an interaction can be traced back to the\nconversation that prompted it.\n\nWritten standard:\n[Part 17](https://github.com/rneubauer/apx/blob/main/docs/standard/17-resolution.md)."
    },
    {
      "name": "Violations",
      "description": "**Enforcement, from camera to citation to appeal.** A net-new domain,\nand the one with the most legal exposure.\n\nOne `Violation` resource covers tickets, notices, and citations alike,\nthrough detection (automated, guided, or manual), review, issuance,\nsettlement by Payment reference, appeal, and void. Guided enforcement\nis supported by an eligibility check a handheld calls before an\nofficer writes anything, composed from the rights and sessions that\nremain authoritative.\n\nWhat makes this domain unusual is that **the law at the location is\ndata**. A per-place enforcement policy records which notice methods\nare lawful, the penalty cap, and the escalation schedule, and the\nserver enforces it: an issuance by a method the jurisdiction does not\npermit, past the notice deadline, above the cap, or at a place whose\nrequired signage was not posted, is refused. The posted signage itself\nis on file, with its text and photograph, as it stood at the moment of\nthe finding.\n\nWritten standard:\n[Part 19](https://github.com/rneubauer/apx/blob/main/docs/standard/19-violations.md)."
    },
    {
      "name": "Validations",
      "description": "**The merchant side**, from enrolment to invoice.\n\nThe lane-side act of applying a validation is a command in the control\nplane. This domain is everything around it: enrolling a merchant at a\nplace with a benefit and its rules, issuing instrument stock (codes,\nQR, stamps), the redemption ledger every channel writes to, and\nclosable billing statements.\n\nThe ledger is the point. A validation applied at a pay station, by an\nagent console, or through a merchant's own app lands in one place, so\nthe month-end statement is a query rather than a reconciliation.\nClosed statements are immutable, and a reversal after closing appears\nas a credit on the next one.\n\nA merchant-confined scope lets a venue check codes, issue its own\nstock, and read its own statements without seeing anyone else's.\n\nWritten standard:\n[Part 20](https://github.com/rneubauer/apx/blob/main/docs/standard/20-validations.md)."
    },
    {
      "name": "Credentials",
      "description": "**The card, the fob, the tag, the phone.** The lifecycle of anything\npresented at a lane: issue, activate, suspend, resume, report lost,\nrevoke, replace, plus access-event history.\n\nThe rule that makes this domain worth having is **materialization**:\nan active credential record MUST appear on the holder's APDS assigned\nright, and MUST be removed when it is suspended, lost, revoked, or\nexpired. A lane that speaks only APDS therefore refuses the lost card\nat six o'clock because the office replaced it at noon. There is no\nsecond list to keep in sync.\n\nAPDS has no access events, so granted and denied presentations with\ntheir reasons are recorded here and published as a topic.\n\nWritten standard:\n[Part 21](https://github.com/rneubauer/apx/blob/main/docs/standard/21-credentials.md)."
    },
    {
      "name": "Valet",
      "description": "**Custody.** A net-new domain: APDS has no valet entity, only a\nrestriction flag.\n\nThe stay and the money remain the APDS session. What APDS has no words\nfor is who has the keys, where the car is, when it was asked for, who\nit was handed to, and what condition it was in. A ticket records\ndrop-off with a condition report (notes, per-panel damage entries,\nwalk-around photographs, and the customer's acknowledgement), the\nparked position and key location, the retrieval request and its ETA,\nstaging, and a verified handback.\n\nRetrieval works from a text, an app, a web page, a voice bot, a kiosk,\nor the stand, through one customer-facing scope confined to the\ncaller's own ticket and minimized so it exposes status and ETA but\nnever where the car or the keys are.\n\nThe acknowledged drop-off report is what answers \"that scratch wasn't\nthere\" a week later.\n\nWritten standard:\n[Part 22](https://github.com/rneubauer/apx/blob/main/docs/standard/22-valet.md)."
    },
    {
      "name": "UI launch",
      "description": "**The vendor's own screen, without breaking the record.** Most\nactions in a call centre still happen in a vendor's portal in\nanother window, and the two systems never agree afterwards. A\nvendor will take years to implement every APX module, but it\nalready has good screens.\n\nA host opens one of those screens for an agent in two ways. In the\n**handshake**, it posts a launch with its normal APX token and gets\nback a single-use URL that logs the agent in, valid for sixty\nseconds, which also serves vendors who want header-based\nauthentication, since a browser cannot add headers to a page it\nopens. In the **signed-token** mode, the host signs a short-lived\ntoken and sends it to the vendor's launch address by form post or\nURL fragment.\n\nThe rule that makes this worth having is the **loopback**: whatever\nthe agent does in the screen MUST come back as the module's own\nresource or Command, carrying the launch's correlation id. Only when\nthe implementation has no APX operation for the action does it\nrecord a `UiActionRecord` instead, with the fields the host asked\nfor. Defined once; every module adds screens through the\n`apx-ui-surfaces` registry.\n\nWritten standard:\n[Part 25](https://github.com/rneubauer/apx/blob/main/docs/standard/25-ui-launch.md)."
    },
    {
      "name": "Site configuration",
      "description": "**A location, described by APX alone.** Before a call, an agent or\na system should be able to learn what a site has without data from\nany other system: which hardware is on each lane and what each\npiece does, what it is, what runs on it, where the cameras are and\nwhat they see, how a parker reaches help from each lane or door,\nand who to escalate to.\n\nAPDS already models the place, its lanes and its equipment. This\ndomain adds what APDS leaves open: a fixed list of **equipment\nroles** (gate, exit verifier, access door, camera, intercom…), the\nmake, model, firmware, serial and MAC of every unit, where it is by\n**area** and level, what it is built into and what it controls; a\n**camera** description for any camera on the site, with views\nissued as short-lived links so a password never leaves the site; a\n**comms point** for every way help is reached, whether an intercom,\nan analog dialer, a posted number or a QR code; typed **external\nids** so other systems' identifiers resolve to APX records;\n**display records**, the proof that a sign showed a message for a\nread or a stay, written by whichever system drove the sign; and\nchange topics so a copy of the setup stays current. IP addresses\nand SIP details are deliberately left out.\n\nWritten standard:\n[Part 26](https://github.com/rneubauer/apx/blob/main/docs/standard/26-site-configuration.md)."
    }
  ],
  "paths": {
    "/.well-known/apx-configuration": {
      "get": {
        "operationId": "get-well-known-apx-configuration",
        "tags": [
          "Discovery"
        ],
        "summary": "Bootstrap configuration document",
        "security": [],
        "description": "Unauthenticated bootstrap document. Advertises the token endpoint,\nthe APDS version this implementation extends, supported APX\nconformance classes, and code-list registry locations.\n\nServed at the server root (NOT under `/v1`), per RFC 8615.",
        "responses": {
          "200": {
            "description": "Bootstrap configuration",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApxConfiguration"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/places": {
      "get": {
        "summary": "List Places",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns a list of places potentially filtered by a combination of :\n* __latitude__, __longitude__ and __radius__ : retrieve all places within a geographic area,\n* __types__ : retrieve all places of the given type,\n* __right_type__ : retrieve all places associated with the right specification type,\n* __structure_type__ : retrieve all places associated with the specified structure type,\n* __structure_grade__ : retrieve all places associated with the specified structure grade,\n* __name__ : retrieve all places which match the name of the facilities,\n* __layer__ : specify the maximum hierarchy element layer desired,\n* __operator__ : the id of the operator of this location\n* __modified_since__ : retrieve all places that have changed from that given instant onwards,\n* __expand__ : a comma-separated list of optional object attributes associated to a place that should be included in the result set.",
        "operationId": "get-places",
        "tags": [
          "Places"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          },
          {
            "$ref": "#/components/parameters/radius"
          },
          {
            "$ref": "#/components/parameters/place_types"
          },
          {
            "$ref": "#/components/parameters/right_spec_types"
          },
          {
            "$ref": "#/components/parameters/structure_type"
          },
          {
            "$ref": "#/components/parameters/structure_grade"
          },
          {
            "$ref": "#/components/parameters/place_name"
          },
          {
            "$ref": "#/components/parameters/place_layer"
          },
          {
            "$ref": "#/components/parameters/operator"
          },
          {
            "$ref": "#/components/parameters/modified_since"
          },
          {
            "$ref": "#/components/parameters/places_expand"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/ModeParam"
          },
          {
            "$ref": "#/components/parameters/CursorParam"
          },
          {
            "$ref": "#/components/parameters/place_ids"
          }
        ],
        "responses": {
          "200": {
            "description": "Ok",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/HierarchyElementList"
                    },
                    {
                      "$ref": "#/components/schemas/ChangeFeedPage"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "summary": "Create Place",
        "security": [
          {
            "oAuth": [
              "po"
            ]
          }
        ],
        "description": "Create a new place.",
        "operationId": "create-place",
        "tags": [
          "Places"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HierarchyElement"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 201,
                      "message": "Place created successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Place can not be created due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Place can not be created due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "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.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/places/{id}": {
      "parameters": [
        {
          "schema": {
            "type": "string"
          },
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Unique identifier for the place."
        }
      ],
      "get": {
        "summary": "Get Place",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns the latest version of a given place by its identifier (or a specific version provided as a query parameter).",
        "operationId": "get-place",
        "parameters": [
          {
            "$ref": "#/components/parameters/version"
          },
          {
            "$ref": "#/components/parameters/places_expand"
          }
        ],
        "tags": [
          "Places"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HierarchyElement"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not_found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Place not found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "summary": "Update Place",
        "security": [
          {
            "oAuth": [
              "po"
            ]
          }
        ],
        "description": "Update an existing place using its identifier.",
        "operationId": "update-place",
        "tags": [
          "Places"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/HierarchyElement"
                  },
                  {
                    "$ref": "#/components/schemas/HierarchyElementChangePayload"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "Place updated successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Place can not be updated due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Place can not be updated as it has not been found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Place can not be updated due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "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.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        },
        "parameters": [
          {
            "name": "APX-Update-Mode",
            "in": "header",
            "required": false,
            "description": "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`.",
            "schema": {
              "type": "string",
              "enum": [
                "full",
                "change"
              ],
              "default": "full"
            }
          }
        ]
      },
      "delete": {
        "summary": "Delete Place",
        "security": [
          {
            "oAuth": [
              "po"
            ]
          }
        ],
        "description": "Delete an existing place using its identifier.",
        "operationId": "delete-place",
        "tags": [
          "Places"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "Place deleted successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Place can not be deleted due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Place can not be deleted as it has not been found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Place can not be deleted due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/observations": {
      "get": {
        "summary": "get list of recorded observations",
        "tags": [
          "Observation"
        ],
        "operationId": "get-observations",
        "description": "Lists `Observations` and allows searching/filtering by:\n\n* latitude, longitude, radius: to check for `Observations` within a geographic area\n* a list of `Places`, to retrieve all Observations within a set of parking locations\n* start_before: to get observations starting before a given instant\n* end_before: to get observations ending before a given instant\n* start_after: to get observations starting after a given instant\n* end_after: to get observations ending after a given instant\n* a modification instant: to only display changed resources from that point onwards\n\nAdditionally, supports providing a comma-separated list of optional object attributes associated to an `Observation` that should be included in the result set. If unused or left blank, `none` will be assumed.",
        "parameters": [
          {
            "$ref": "#/components/parameters/place_ids"
          },
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          },
          {
            "$ref": "#/components/parameters/radius"
          },
          {
            "$ref": "#/components/parameters/modified_since"
          },
          {
            "$ref": "#/components/parameters/start_before"
          },
          {
            "$ref": "#/components/parameters/end_before"
          },
          {
            "$ref": "#/components/parameters/start_after"
          },
          {
            "$ref": "#/components/parameters/end_after"
          },
          {
            "$ref": "#/components/parameters/ModeParam"
          },
          {
            "$ref": "#/components/parameters/CursorParam"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/PaginatedListMeta"
                        },
                        {
                          "type": "object",
                          "properties": {
                            "data": {
                              "type": "array",
                              "items": {
                                "$ref": "#/components/schemas/ObservationElement"
                              }
                            }
                          }
                        }
                      ]
                    },
                    {
                      "$ref": "#/components/schemas/ChangeFeedPage"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "summary": "create an Observation or Observation Set",
        "tags": [
          "Observation"
        ],
        "operationId": "post-observations",
        "description": "create a singular `Observation` or an `Observation Set`",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "examples": {
                "single-element": {
                  "value": {
                    "type": "ObservationElement",
                    "method": "visual",
                    "observer": "Officer Peterson",
                    "observationStartTime": "2026-01-01T10:02:00Z",
                    "creationDateTime": "2026-01-01T10:04:00Z",
                    "observedCredentialId": "BD51 SMR",
                    "location": {
                      "observerLocation": {
                        "type": "Point",
                        "coordinates": [
                          -2.3058626,
                          53.4723193
                        ]
                      }
                    },
                    "observerOrganisation": {
                      "id": "SAMPLECITY",
                      "version": 1
                    }
                  }
                }
              },
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/ObservationElement"
                  },
                  {
                    "$ref": "#/components/schemas/ObservationSet"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Observation (or ObservationSet) created (APDS ResponseStatus, as on the other native creates).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              }
            }
          },
          "400": {
            "description": "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[]`).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "Observation can not be created due to conflict (id already exists). APX: with `Accept: application/problem+json`, problem type `id-collision`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/observations/{id}": {
      "get": {
        "summary": "get a specific observation element",
        "tags": [
          "Observation"
        ],
        "operationId": "get-observation-id",
        "description": "get the latest version of a given `Observation` by its identifier (or a particular previous version when provided as a query parameter)",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "name": "id",
            "in": "path",
            "required": true,
            "description": "unique observation identifier"
          },
          {
            "$ref": "#/components/parameters/version"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ObservationElement"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "summary": "update a specific observation element",
        "tags": [
          "Observation"
        ],
        "operationId": "update-observation-id",
        "description": "update the given  `Observation`",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "name": "id",
            "in": "path",
            "required": true,
            "description": "unique observation identifier"
          },
          {
            "name": "APX-Update-Mode",
            "in": "header",
            "required": false,
            "description": "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`.",
            "schema": {
              "type": "string",
              "enum": [
                "full",
                "change"
              ],
              "default": "full"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              }
            }
          },
          "400": {
            "description": "Observation can not be updated due to invalid or missing data. APX: with `Accept: application/problem+json`, problem type `invalid-request`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "observation with given id does not exist"
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "outdated version number provided"
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        },
        "requestBody": {
          "required": false,
          "description": "The Observation as it now stands (full mode) or its identity plus the changed members (change mode). Undeclared in APDS 4.1 (candidate C-026, not yet filed).",
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/ObservationElement"
                  },
                  {
                    "$ref": "#/components/schemas/ObservationElementChangePayload"
                  }
                ]
              }
            }
          }
        }
      },
      "delete": {
        "summary": "delete a specific observation element",
        "tags": [
          "Observation"
        ],
        "operationId": "delete-observation-id",
        "description": "delete the given  `Observation`",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "name": "id",
            "in": "path",
            "required": true,
            "description": "unique observation identifier"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "observation with given id does not exist"
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/contacts": {
      "get": {
        "summary": "Get List of Organisations (Contacts)",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns the latest list of all organisations and their public ids",
        "operationId": "get-contacts",
        "parameters": [
          {
            "in": "query",
            "name": "type",
            "required": false,
            "description": "filter by this type of organisation/contact",
            "schema": {
              "$ref": "#/components/schemas/ContactPointTypeEnum"
            }
          }
        ],
        "tags": [
          "Organisations"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/PaginatedListMeta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ContactPoint"
                      }
                    }
                  }
                },
                "examples": {
                  "found": {
                    "value": {
                      "meta": {
                        "referenceInstant": 1746684020,
                        "pageSize": 100,
                        "offset": 0,
                        "total": 2
                      },
                      "data": [
                        {
                          "id": "TESTCOUNCIL",
                          "version": 1,
                          "organisationName": [
                            {
                              "language": "en",
                              "string": "Test Council"
                            }
                          ],
                          "type": "operator",
                          "contactType": "contactPoint"
                        },
                        {
                          "id": "PROVIDER1",
                          "version": 1,
                          "organisationName": [
                            {
                              "language": "en",
                              "string": "Service Provider 1"
                            }
                          ],
                          "type": "serviceProvider",
                          "contactType": "contactPoint"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "internal-error": {
                    "value": {
                      "status": "error",
                      "code": 500,
                      "message": "internal server error"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "summary": "create a new contact",
        "description": "create a new contact point record which can then be referenced by other data elements",
        "operationId": "post-contact",
        "tags": [
          "Organisations"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactPoint"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "CREATED",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-fields": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "missing require fields"
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "duplicate-id": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "a contact point with this id already exists"
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/contacts/{contactId}": {
      "parameters": [
        {
          "schema": {
            "type": "string"
          },
          "name": "contactId",
          "in": "path",
          "required": true,
          "description": "Unique identifier for the contact/organisation."
        }
      ],
      "get": {
        "summary": "get details of particular contact / organisation",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "returns the details of the contact identified by {contactId}",
        "operationId": "get-single-contact",
        "tags": [
          "Organisations"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactPoint"
                },
                "examples": {
                  "found": {
                    "value": {
                      "contactType": "contactPoint",
                      "id": "TESTCOUNCIL",
                      "version": 1,
                      "organisationName": [
                        {
                          "language": "en",
                          "string": "Test Council"
                        }
                      ],
                      "type": "operator"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "contact not found"
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "internal-error": {
                    "value": {
                      "status": "error",
                      "code": 500,
                      "message": "internal server error"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "put": {
        "summary": "update existing contact",
        "description": "update an existing contact point record which can then be referenced by other data elements",
        "operationId": "put-contact",
        "tags": [
          "Organisations"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/ContactPoint"
                  },
                  {
                    "$ref": "#/components/schemas/ContactPointChangePayload"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "contact-updated": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "contact 359e20ec-a836-4365-aa62-07de0993cb20 successfully updated"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "duplicate-id": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "a contact point with this id does not exist"
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        },
        "parameters": [
          {
            "name": "APX-Update-Mode",
            "in": "header",
            "required": false,
            "description": "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`.",
            "schema": {
              "type": "string",
              "enum": [
                "full",
                "change"
              ],
              "default": "full"
            }
          }
        ]
      },
      "delete": {
        "summary": "delete existing contact",
        "description": "delete an existing contact point record",
        "operationId": "delete-contact",
        "tags": [
          "Organisations"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "contact-updated": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "contact 359e20ec-a836-4365-aa62-07de0993cb20 successfully deleted"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "duplicate-id": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "a contact point with this id does not exist"
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "duplicate-id": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "contact point cannot be deleted as it is referenced by existing record(s)"
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/rights/specs": {
      "get": {
        "summary": "List RightSpecifications",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns a list of right specifications potentially filtered by a combination of :\n* __latitude__, __longitude__ and __radius__ : retrieve all right specifications used in a geographic area (via their associated place),\n* a list of __Places__ : retrieve all right specifications connected to any of the given places,\n* __issuer__ : the id of the entity that issued the right specification\n* __modified_since__ : retrieve all right specifications that have changed from that given instant onwards, \n* __expand__ : a comma-separated list of optional object attributes associated to a right specification that should be included in the result set.",
        "operationId": "get-right_specs",
        "tags": [
          "Right Specifications"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          },
          {
            "$ref": "#/components/parameters/radius"
          },
          {
            "$ref": "#/components/parameters/place_ids"
          },
          {
            "$ref": "#/components/parameters/place_types"
          },
          {
            "$ref": "#/components/parameters/modified_since"
          },
          {
            "$ref": "#/components/parameters/issuer"
          },
          {
            "$ref": "#/components/parameters/right_specs_expand"
          },
          {
            "$ref": "#/components/parameters/page"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RightSpecificationList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "summary": "Create RightSpecification",
        "security": [
          {
            "oAuth": [
              "po"
            ]
          }
        ],
        "description": "Create a new right specification.",
        "operationId": "create-right_specs",
        "tags": [
          "Right Specifications"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RightSpecification"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 201,
                      "message": "RightSpecification created successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "RightSpecification can not be created due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "RightSpecification can not be created due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/rights/specs/{id}": {
      "parameters": [
        {
          "schema": {
            "type": "string"
          },
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Unique identifier for the right specification."
        }
      ],
      "get": {
        "summary": "Get RightSpecification",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns the latest version of a given right specification by its identifier (or the specific version provided as a query parameter).",
        "operationId": "get-right_spec",
        "tags": [
          "Right Specifications"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/version"
          },
          {
            "$ref": "#/components/parameters/right_specs_expand"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RightSpecification"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not_found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "RightSpecification not found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "summary": "Update RightSpecification",
        "security": [
          {
            "oAuth": [
              "po"
            ]
          }
        ],
        "description": "Update an existing right specification",
        "operationId": "update-right_spec",
        "tags": [
          "Right Specifications"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/RightSpecification"
                  },
                  {
                    "$ref": "#/components/schemas/RightSpecificationChangePayload"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "RightSpecification updated successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "RightSpecification can not be updated due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "RightSpecification can not be updated as it has not been found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "RightSpecification can not be updated due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        },
        "parameters": [
          {
            "name": "APX-Update-Mode",
            "in": "header",
            "required": false,
            "description": "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`.",
            "schema": {
              "type": "string",
              "enum": [
                "full",
                "change"
              ],
              "default": "full"
            }
          }
        ]
      },
      "delete": {
        "summary": "Delete RightSpecification",
        "security": [
          {
            "oAuth": [
              "po"
            ]
          }
        ],
        "description": "Delete an existing right specification using its identifier.",
        "operationId": "delete-right_spec",
        "tags": [
          "Right Specifications"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "RightSpecification deleted successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "RightSpecification can not be deleted due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "RightSpecification can not be deleted as it has not been found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "RightSpecification can not be deleted due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/rates": {
      "get": {
        "summary": "List RateTables",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns a list of rate potentially filtered by a combination of : \n* __latitude__, __longitude__ and __radius__ : retrieve all rates used in a geographic area (via their associated assigned rights and place), \n* a list of __places__ : retrieve all rates connected to assigned rights that belong to any of the given places, \n* a list of __right specifications__ : retrieve all rates connected to any of the given right specifications, \n* __issuer__ : the id of the rate responsible party (i.e. the issuer of the rate table)\n* __modified_since__ : retrieve all rates that have changed from that given instant onwards, \n* __expand__ : a comma-separated list of optional object attributes associated to a rate that should be included in the result set.",
        "operationId": "get-rates",
        "tags": [
          "Rate Tables"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          },
          {
            "$ref": "#/components/parameters/radius"
          },
          {
            "$ref": "#/components/parameters/place_ids"
          },
          {
            "$ref": "#/components/parameters/right_spec_ids"
          },
          {
            "$ref": "#/components/parameters/modified_since"
          },
          {
            "$ref": "#/components/parameters/rates_expand"
          },
          {
            "$ref": "#/components/parameters/issuer"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/ModeParam"
          },
          {
            "$ref": "#/components/parameters/CursorParam"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/RateTableList"
                    },
                    {
                      "$ref": "#/components/schemas/ChangeFeedPage"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "summary": "Create RateTable",
        "security": [
          {
            "oAuth": [
              "po"
            ]
          }
        ],
        "description": "Create a new rate table.",
        "operationId": "create-rate",
        "tags": [
          "Rate Tables"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RateTable"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              }
            }
          },
          "400": {
            "description": "RateTable can not be created due to invalid or missing data. APX: with `Accept: application/problem+json`, problem type `invalid-request`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "RateTable can not be created due to conflict (id already exists). APX: with `Accept: application/problem+json`, problem type `id-collision`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/rates/{id}": {
      "parameters": [
        {
          "schema": {
            "type": "string"
          },
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Unique identifier for the rate table."
        }
      ],
      "get": {
        "summary": "Get RateTable",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns the latest version of a given rate table by its identifier (or the specific version provided as a query parameter).",
        "operationId": "get-rate",
        "tags": [
          "Rate Tables"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/version"
          },
          {
            "$ref": "#/components/parameters/rates_expand"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateTable"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Rate table not found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "summary": "Update RateTable",
        "security": [
          {
            "oAuth": [
              "po"
            ]
          }
        ],
        "description": "Update an existing rate table using its identifier, by providing new attributes.",
        "operationId": "update-rate",
        "tags": [
          "Rate Tables"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/RateTable"
                  },
                  {
                    "$ref": "#/components/schemas/RateTableChangePayload"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Rate table can not be updated due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Rate table can not be updated as it has not been found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Rate table can not be updated due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        },
        "parameters": [
          {
            "name": "APX-Update-Mode",
            "in": "header",
            "required": false,
            "description": "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`.",
            "schema": {
              "type": "string",
              "enum": [
                "full",
                "change"
              ],
              "default": "full"
            }
          }
        ]
      },
      "delete": {
        "summary": "Delete RateTable",
        "security": [
          {
            "oAuth": [
              "po"
            ]
          }
        ],
        "description": "Delete an existing rate table using its identifier.",
        "operationId": "delete-rate",
        "tags": [
          "Rate Tables"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "Rate table deleted successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Rate table can not be deleted due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Rate table can not be deleted as it has not been found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Rate table can not be deleted due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/sessions": {
      "get": {
        "summary": "List Sessions",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns a list of sessions potentially filtered by a combination of : \n* __latitude__, __longitude__ and __radius__ : retrieve all sessions occurring in a geographic area (via their associated place), \n* a list of __Places__ : retrieve all sessions connected to any of the given places, \n* a list of __RightSpecifications__ : retrieve all sessions with segments using any of the given right specifications, \n* a list of __Credentials__ : retrieve all sessions linked to the given credentials, \n* __start_before__ : retrieve all sessions starting before that given instant, \n* __end_before__ : retrieve all sessions ending before that given instant, \n* __start_after__ : retrieve all sessions starting after that given instant, \n* __end_after__ : retrieve all sessions ending after that given instant, \n* __modified_since__ : retrieve all sessions that have changed from that given instant onwards, \n* __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.",
        "operationId": "get-sessions",
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          },
          {
            "$ref": "#/components/parameters/radius"
          },
          {
            "$ref": "#/components/parameters/place_ids"
          },
          {
            "$ref": "#/components/parameters/place_types"
          },
          {
            "$ref": "#/components/parameters/credential_ids"
          },
          {
            "$ref": "#/components/parameters/credential_types"
          },
          {
            "$ref": "#/components/parameters/right_spec_ids"
          },
          {
            "$ref": "#/components/parameters/right_spec_types"
          },
          {
            "$ref": "#/components/parameters/start_before"
          },
          {
            "$ref": "#/components/parameters/end_before"
          },
          {
            "$ref": "#/components/parameters/start_after"
          },
          {
            "$ref": "#/components/parameters/end_after"
          },
          {
            "$ref": "#/components/parameters/modified_since"
          },
          {
            "$ref": "#/components/parameters/sessions_expand"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/ModeParam"
          },
          {
            "$ref": "#/components/parameters/CursorParam"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/SessionList"
                    },
                    {
                      "$ref": "#/components/schemas/ChangeFeedPage"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "summary": "Create Session",
        "security": [
          {
            "oAuth": [
              "sp"
            ]
          }
        ],
        "description": "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).",
        "operationId": "create-session",
        "tags": [
          "Sessions"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Session"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 201,
                      "message": "Session created successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Session can not be created due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Session can not be created due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "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.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/sessions/{id}": {
      "parameters": [
        {
          "schema": {
            "type": "string"
          },
          "name": "id",
          "in": "path",
          "required": true,
          "description": "Unique identifier for the session."
        }
      ],
      "get": {
        "summary": "Get Session",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns the latest version of a given session by its identifier (or the specific version provided as a query parameter).",
        "operationId": "get-session",
        "tags": [
          "Sessions"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/version"
          },
          {
            "$ref": "#/components/parameters/sessions_expand"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Session"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not_found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Session not found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "summary": "Update Session",
        "security": [
          {
            "oAuth": [
              "sp"
            ]
          }
        ],
        "description": "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.",
        "operationId": "update-session",
        "tags": [
          "Sessions"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Session"
                  },
                  {
                    "$ref": "#/components/schemas/SessionChangePayload"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "Session updated successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Session can not be updated due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Session can not be updated as it has not been found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Session can not be updated due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "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.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        },
        "parameters": [
          {
            "name": "APX-Update-Mode",
            "in": "header",
            "required": false,
            "description": "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`.",
            "schema": {
              "type": "string",
              "enum": [
                "full",
                "change"
              ],
              "default": "full"
            }
          }
        ]
      },
      "delete": {
        "summary": "Delete Session",
        "security": [
          {
            "oAuth": [
              "sp"
            ]
          }
        ],
        "description": "Deletes an existing session using its identifier. segments should be deleted by updating the session instead.",
        "operationId": "delete-session",
        "tags": [
          "Sessions"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "Session deleted successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Session can not be deleted due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Session can not be deleted as it has not been found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Session can not be deleted due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/rights/assigned": {
      "get": {
        "summary": "List AssignedRights",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns a list of assigned rights potentially filtered by a combination of :\n* __latitude__, __longitude__ and __radius__ : retrieve all assigned rights occurring in a geographic area (via their associated place)\n* a list of __places__ : retrieve all assigned rights connected to any of the given places,\n* a list of __right specifications__ : retrieve all assigned rights with segments using any of the given right specifications, \n* a list of __credentials__ : retrieve all assigned rights linked to the given credentials,\n* __start_before__ : retrieve all assigned rights starting before that given instant, \n* __end_before__ : retrieve all assigned rights ending before that given instant, \n* __start_after__ : retrieve all assigned rights starting after that given instant, \n* __end_after__ : retrieve all assigned rights ending after that given instant, \n* __modified_since__ : retrieve all assigned rights that have changed from that given instant onwards, \n* __expand__ : a comma-separated list of optional object attributes associated to an assigned right that should be included in the result set.",
        "operationId": "get-assigned_rights",
        "tags": [
          "Assigned Rights"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          },
          {
            "$ref": "#/components/parameters/radius"
          },
          {
            "$ref": "#/components/parameters/place_ids"
          },
          {
            "$ref": "#/components/parameters/place_types"
          },
          {
            "$ref": "#/components/parameters/credential_ids"
          },
          {
            "$ref": "#/components/parameters/credential_types"
          },
          {
            "$ref": "#/components/parameters/right_spec_ids"
          },
          {
            "$ref": "#/components/parameters/right_spec_types"
          },
          {
            "$ref": "#/components/parameters/start_before"
          },
          {
            "$ref": "#/components/parameters/end_before"
          },
          {
            "$ref": "#/components/parameters/start_after"
          },
          {
            "$ref": "#/components/parameters/end_after"
          },
          {
            "$ref": "#/components/parameters/modified_since"
          },
          {
            "$ref": "#/components/parameters/assigned_expand"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/ModeParam"
          },
          {
            "$ref": "#/components/parameters/CursorParam"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/AssignedRightList"
                    },
                    {
                      "$ref": "#/components/schemas/ChangeFeedPage"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "summary": "Create AssignedRight",
        "security": [
          {
            "oAuth": [
              "sp"
            ]
          }
        ],
        "description": "Create a new assigned right based on a given object.",
        "operationId": "create-assigned_right",
        "tags": [
          "Assigned Rights"
        ],
        "requestBody": {
          "required": true,
          "description": "This method allows an issuer to assign a parking right specification to a holder",
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/AssignedRight"
                  },
                  {
                    "$ref": "#/components/schemas/ReferenceToQuote"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 201,
                      "message": "Assigned right created successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Assigned right can not be created due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Assigned right can not be created due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/rights/assigned/{id}": {
      "parameters": [
        {
          "schema": {
            "type": "string"
          },
          "name": "id",
          "in": "path",
          "description": "Unique identifier for the assigned right.",
          "required": true
        }
      ],
      "get": {
        "summary": "Get AssignedRight",
        "security": [
          {
            "oAuth": [
              "po",
              "sp",
              "ep",
              "ad"
            ]
          }
        ],
        "description": "Returns the latest version of a given assigned right by its identifier (or a specific version provided as a query parameter).",
        "operationId": "get-assigned_right",
        "tags": [
          "Assigned Rights"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/version"
          },
          {
            "$ref": "#/components/parameters/assigned_expand"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignedRight"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not_found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Assigned right not found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "summary": "Update AssignedRight",
        "security": [
          {
            "oAuth": [
              "sp"
            ]
          }
        ],
        "description": "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.",
        "operationId": "update-assigned_right",
        "tags": [
          "Assigned Rights"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/AssignedRight"
                  },
                  {
                    "$ref": "#/components/schemas/AssignedRightChangePayload"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "Assigned right updated successfully."
                    }
                  }
                }
              }
            }
          },
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "Assigned right created successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Assigned right can not be created due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Assigned right can not be created due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        },
        "parameters": [
          {
            "name": "APX-Update-Mode",
            "in": "header",
            "required": false,
            "description": "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`.",
            "schema": {
              "type": "string",
              "enum": [
                "full",
                "change"
              ],
              "default": "full"
            }
          }
        ]
      },
      "delete": {
        "summary": "Delete AssignedRight",
        "security": [
          {
            "oAuth": [
              "sp"
            ]
          }
        ],
        "description": "Delete an existing assigned right using its identifier.",
        "operationId": "delete-assigned_right",
        "tags": [
          "Assigned Rights"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "ok": {
                    "value": {
                      "status": "ok",
                      "code": 200,
                      "message": "Assigned right deleted successfully."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "missing-data": {
                    "value": {
                      "status": "error",
                      "code": 400,
                      "message": "Assigned right can not be deleted due to missing required attributes."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "Assigned right can not be deleted as it has not been found."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "conflict": {
                    "value": {
                      "status": "error",
                      "code": 409,
                      "message": "Assigned right can not be deleted due to conflicting data."
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/quotes": {
      "get": {
        "summary": "get quotes",
        "description": "get quotes matching specified criteria",
        "operationId": "get-quote",
        "tags": [
          "Quote"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          },
          {
            "$ref": "#/components/parameters/radius"
          },
          {
            "$ref": "#/components/parameters/modified_since"
          },
          {
            "$ref": "#/components/parameters/place_ids"
          },
          {
            "$ref": "#/components/parameters/right_spec_ids"
          },
          {
            "$ref": "#/components/parameters/quote_type"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/QuoteRightRequest"
                    },
                    {
                      "$ref": "#/components/schemas/QuoteRightResponse"
                    },
                    {
                      "$ref": "#/components/schemas/QuoteSessionExtensionRequest"
                    },
                    {
                      "$ref": "#/components/schemas/QuoteSessionExtensionResponse"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "summary": "create quote request",
        "description": "submit a request for a quote",
        "operationId": "post-quote",
        "tags": [
          "Quote"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/PaginatedListMeta"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "oneOf": [
                              {
                                "$ref": "#/components/schemas/QuoteRightResponse"
                              },
                              {
                                "$ref": "#/components/schemas/QuoteSessionExtensionResponse"
                              }
                            ]
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        },
        "requestBody": {
          "required": false,
          "description": "The quote request: a QuoteRightRequest (new right) or a QuoteSessionExtensionRequest (extend a session). Undeclared in APDS 4.1 (APX erratum 007).",
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/QuoteRightRequest"
                  },
                  {
                    "$ref": "#/components/schemas/QuoteSessionExtensionRequest"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/quotes/{id}": {
      "parameters": [
        {
          "schema": {
            "type": "string"
          },
          "name": "id",
          "in": "path",
          "required": true,
          "description": "unique id of the quote"
        }
      ],
      "get": {
        "summary": "get details of a specific quote",
        "description": "get details of quote identified by `id`",
        "operationId": "get-quote-id",
        "tags": [
          "Quote"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/QuoteRightRequest"
                    },
                    {
                      "$ref": "#/components/schemas/QuoteRightResponse"
                    },
                    {
                      "$ref": "#/components/schemas/QuoteSessionExtensionRequest"
                    },
                    {
                      "$ref": "#/components/schemas/QuoteSessionExtensionResponse"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "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.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                },
                "examples": {
                  "not-found": {
                    "value": {
                      "status": "error",
                      "code": 404,
                      "message": "requested item does not exist"
                    }
                  }
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/places/{id}/occupancy": {
      "get": {
        "operationId": "get-apx-v1-places-id-occupancy",
        "security": [
          {
            "apxOAuth": [
              "apx.data:read"
            ]
          }
        ],
        "tags": [
          "Data"
        ],
        "summary": "Current occupancy snapshot for a place element",
        "description": "\"How full is it right now\" for one HierarchyElement, without pulling\nthe Place hierarchy. A pure convenience READ over the APDS occupancy\nmodel (Supply + DemandTable) — the Place payload remains the source\nof truth. Fields the implementation does not know are simply absent.\nThreshold crossings publish apx.data.occupancy.v1 and SHOULD raise\nan occupancyThresholdExceeded alert (Part 7). Scope apx.data:read;\nthe place grant must cover the element.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "HierarchyElement UUID (Place, Level, Area, …)."
          }
        ],
        "responses": {
          "200": {
            "description": "The occupancy snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OccupancySnapshot"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "No such place element.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/webhooks": {
      "post": {
        "operationId": "post-webhooks",
        "security": [
          {
            "apxOAuth": [
              "apx.subscriptions:manage"
            ]
          },
          {
            "oAuth": [
              "po",
              "sp",
              "ad"
            ]
          }
        ],
        "tags": [
          "Subscription"
        ],
        "summary": "Subscribe to event topics (APDS-compatible superset)",
        "description": "Creates a subscription. A stock APDS 4.1 `EventSubscription`\n(`{endpoint, topics[]}` with EventTypeEnum values) is a valid body;\nAPX fields (transport, filters, secret) are additive.\n\n**Response negotiation (normative, Part 8 §8.1):** the stock APDS\n4.1 response contract is preserved — a request WITHOUT\n`Prefer: return=representation` receives the native APDS `200`/`202`\nwith `ResponseStatus`, exactly as APDS documents. An APX client\nsends `Prefer: return=representation` and receives `201` with the\nfull subscription INCLUDING the signing secret (returned exactly\nonce, in that response only; webhook transport only).\n\nRefusals at creation (Part 8 §8.1): a topic the credential could\nnot read synchronously is 403 `insufficient-scope` (Part 9 §9.6(4));\na `filters.places` entry outside the token's `apx_places` grant is\n403 `insufficient-grant`. Send `Idempotency-Key` to make a retried\ncreate safe.",
        "parameters": [
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "RFC 7240. `return=representation` selects the APX-rich 201\nresponse (subscription + one-time secret). Absent, the server\nanswers with the stock APDS 200/202 ResponseStatus contract.",
            "schema": {
              "type": "string",
              "enum": [
                "return=representation"
              ]
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKeyOptional"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApxEventSubscription"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Stock APDS contract — subscription approved and activated\n(request did not ask for the APX representation). `ids[]`\ncarries the new subscription's id as its single entry, so a\nstock client can later revoke it (Part 8 §8.1).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              }
            }
          },
          "201": {
            "description": "APX contract (Prefer: return=representation) — subscription\ncreated; includes the signing secret, exactly once.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApxEventSubscription"
                }
              }
            }
          },
          "202": {
            "description": "Stock APDS contract — subscription request received; will be\nprocessed and then approved/declined. `ids[]` carries the new\nsubscription's id as its single entry (Part 8 §8.1).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              }
            }
          },
          "400": {
            "description": "An unregistered topic (`unknown-topic`), or a body that fails the\nschema or a field rule (`invalid-request`, with `errors[]`): a\nwebhook-transport subscription without `endpoint`, an empty\n`topics[]`, a secret under 32 bytes of entropy, or an\n`extensions` key outside the Part 4 §4.3 pattern.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "The `Idempotency-Key` was already used with a different body\n(`idempotency-conflict`). A replay with the same body returns\nthe subscription as it now stands (Part 4 §4.2a) — never the\nsecret a second time.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "get": {
        "operationId": "get-webhooks",
        "security": [
          {
            "apxOAuth": [
              "apx.subscriptions:manage"
            ]
          },
          {
            "oAuth": [
              "po",
              "sp",
              "ad"
            ]
          }
        ],
        "tags": [
          "Subscription"
        ],
        "summary": "List subscriptions (APX additive operation)",
        "description": "Lists subscriptions visible to the caller. Secrets are never returned.",
        "parameters": [
          {
            "$ref": "#/components/parameters/page"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated subscription list (APDS PaginatedList shape).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/PaginatedListMeta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ApxEventSubscription"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/webhooks/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string"
          },
          "description": "Unique identifier for the existing subscription"
        }
      ],
      "get": {
        "operationId": "get-webhooks-id",
        "security": [
          {
            "apxOAuth": [
              "apx.subscriptions:manage"
            ]
          },
          {
            "oAuth": [
              "po",
              "sp",
              "ad"
            ]
          }
        ],
        "tags": [
          "Subscription"
        ],
        "summary": "Read one subscription (APX additive operation)",
        "description": "Returns one subscription the caller may see — its status,\n`activeKeyIds`, and filters — without paging through `GET\n/webhooks`. Secrets are never returned. Readable in every state,\nincluding `failed` (Part 8 §8.1).",
        "responses": {
          "200": {
            "description": "The subscription (secret never returned).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApxEventSubscription"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "patch-webhooks-id",
        "security": [
          {
            "apxOAuth": [
              "apx.subscriptions:manage"
            ]
          },
          {
            "oAuth": [
              "po",
              "sp",
              "ad"
            ]
          }
        ],
        "tags": [
          "Subscription"
        ],
        "summary": "Update a subscription (APX additive operation)",
        "description": "Update topics, endpoint, filters, or status (pause, resume a paused\nor failed subscription), or rotate the secret. The body is a JSON\nMerge Patch over the subscription: send only what changes\n(Part 8 §8.1). The precondition is `If-Match` or the body\n`version`; a stale one is 409 `version-conflict` (Part 4 §4.2a).\nWhile the subscription is `failed`, the only PATCH accepted is one\nthat sets `status: active`; any other is 410\n`subscription-failed`.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApxEventSubscriptionPatch"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated subscription (secret never returned).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApxEventSubscription"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "No such subscription.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Stale `If-Match` or body `version` (`version-conflict`, Part 4 §4.2a).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "410": {
            "description": "The subscription is `failed` and the body does not set\n`status: active` (`subscription-failed`, Part 8 §8.1).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "delete-webhooks-id",
        "security": [
          {
            "apxOAuth": [
              "apx.subscriptions:manage"
            ]
          },
          {
            "oAuth": [
              "po",
              "sp",
              "ad"
            ]
          }
        ],
        "tags": [
          "Subscription"
        ],
        "summary": "Revoke (delete) existing subscription",
        "description": "Native APDS 4.1 operation, unchanged (APDS ResponseStatus shape).",
        "responses": {
          "200": {
            "description": "Subscription deleted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "Subscription not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseStatus"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/webhooks/{id}/deliveries": {
      "get": {
        "operationId": "get-webhooks-id-deliveries",
        "security": [
          {
            "apxOAuth": [
              "apx.subscriptions:manage"
            ]
          },
          {
            "oAuth": [
              "po",
              "sp",
              "ad"
            ]
          }
        ],
        "tags": [
          "Subscription"
        ],
        "summary": "Delivery ledger for a subscription",
        "description": "Returns the delivery records for auditing: one per (event,\nsubscription), with the attempt count, status, last HTTP code, and\nthe per-attempt history (`attemptHistory`: each attempt's\n`APX-Delivery-Id`, time, and code — Part 8 §8.3). Newest first.\nReadable in every subscription state. An event held while the\nsubscription is `paused` has no record until its first attempt.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Only records in this delivery status.",
            "schema": {
              "type": "string",
              "enum": [
                "delivered",
                "retrying",
                "failed"
              ]
            }
          },
          {
            "name": "eventId",
            "in": "query",
            "required": false,
            "description": "Only the record of this EventEnvelope.id.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only records whose latest attempt is at or after this instant (RFC 3339).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivery records.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/PaginatedListMeta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DeliveryRecord"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "No such subscription.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/commands": {
      "post": {
        "operationId": "post-apx-v1-commands",
        "security": [
          {
            "apxOAuth": [
              "apx.control:execute"
            ]
          }
        ],
        "tags": [
          "Control"
        ],
        "summary": "Execute a command (idempotent, perishable, audited)",
        "description": "Requests an operational action (vendGate, lostTicket, pushRate,\napplyValidation, …). Idempotency-Key REQUIRED. Returns 202 with the\nCommand; poll GET /v1/commands/{id} or subscribe to\napx.control.command.status.v1. Requires scope apx.control:execute\nAND a place grant covering the target.",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Command"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Idempotent replay — same key + same body returns the command as\nit currently stands, not a snapshot of the first response (Part 4\n§4.2a, Part 6 §6.1).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Command"
                }
              }
            }
          },
          "202": {
            "description": "Command accepted for asynchronous execution.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Command"
                }
              }
            }
          },
          "400": {
            "description": "Missing Idempotency-Key (`idempotency-key-required`); an unknown\n`commandType`, a missing `target`, or a parameter that fails its\n§6.1 definition (`invalid-request`, with `errors[]`); or a command\nthat requires `agent` without one (`agent-required`) — Part 12.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "description": "Insufficient scope or place grant (Part 9), the current\nresolution context evaluated the action as not allowed\n(`action-not-allowed`), or approval evidence is missing\n(`approval-required`) — Part 17 §17.3.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Idempotency-Key replayed with a different body\n(`idempotency-conflict`), or `pushNegotiatedRate` / `matchTicket`\nat a lane with no transaction in progress\n(`lane-no-current-transaction`) — Part 12.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Refused synchronously, nothing dispatched: command expired before\ndispatch (`command-expired`); unknown validation provider\n(`validation-provider-unknown`); `lostTicket` at a place whose\napplicable rate deck has no `lostTicketFee` line\n(`lost-ticket-fee-undefined`, Part 6 §6.1); a RateTable not\nflagged negotiable (`rate-not-negotiable`); a session that is not\nopen (`session-not-open`); or a parameter Reference that names\nnothing (`reference-unknown`) — Part 12.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "get": {
        "operationId": "get-apx-v1-commands",
        "security": [
          {
            "apxOAuth": [
              "apx.control:read"
            ]
          }
        ],
        "tags": [
          "Control"
        ],
        "summary": "List and filter commands (the audit query)",
        "description": "The commands the caller may see, newest first by the time the\ncommand was received, each with its full `statusHistory` (Part 6\n§6.1b). Only commands whose target lies inside the token's\n`apx_places` grant are returned; naming a `place` outside the grant\nis 403 `insufficient-grant`. All filters combine with AND.",
        "parameters": [
          {
            "$ref": "#/components/parameters/ModeParam"
          },
          {
            "$ref": "#/components/parameters/CursorParam"
          },
          {
            "name": "target",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Commands whose `target.id` is this device, lane, or place."
          },
          {
            "name": "place",
            "in": "query",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid"
              }
            },
            "description": "Comma-separated HierarchyElement ids; subtree-inclusive (a command at a lane matches its parent Place)."
          },
          {
            "name": "commandType",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "An apx-command-types value (or an implementer's own)."
          },
          {
            "name": "status",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "received",
                "accepted",
                "rejected",
                "dispatched",
                "executing",
                "succeeded",
                "failed",
                "expired",
                "cancelled"
              ]
            }
          },
          {
            "name": "agent",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Commands whose `agent` equals this principal."
          },
          {
            "name": "since",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Received at or after this instant (the first `statusHistory` entry)."
          },
          {
            "name": "until",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Received before this instant."
          },
          {
            "$ref": "#/components/parameters/page"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated commands (APDS PaginatedList shape); with `mode=change`, the changes after `cursor` in the same envelope (Part 5 §5.2 rule 8).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/PaginatedListMeta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Command"
                      }
                    },
                    "updateMode": {
                      "$ref": "#/components/schemas/ChangeFeedUpdateMode"
                    },
                    "cursor": {
                      "$ref": "#/components/schemas/ChangeFeedCursor"
                    },
                    "deleted": {
                      "$ref": "#/components/schemas/ChangeFeedTombstones"
                    },
                    "grantAdditions": {
                      "$ref": "#/components/schemas/ChangeFeedGrantAdditions"
                    },
                    "next": {
                      "$ref": "#/components/schemas/ChangeFeedNext"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/CursorRefused"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/commands/{id}": {
      "get": {
        "operationId": "get-apx-v1-commands-id",
        "security": [
          {
            "apxOAuth": [
              "apx.control:read"
            ]
          }
        ],
        "tags": [
          "Control"
        ],
        "summary": "Read a command (lifecycle + audit trail)",
        "description": "Returns the Command including its immutable statusHistory.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The command.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Command"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "No such command.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/commands/{id}/cancel": {
      "post": {
        "operationId": "post-apx-v1-commands-id-cancel",
        "security": [
          {
            "apxOAuth": [
              "apx.control:execute"
            ]
          }
        ],
        "tags": [
          "Control"
        ],
        "summary": "Cancel a command before dispatch",
        "description": "Allowed in received/accepted states; afterwards 409 command-not-cancellable.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Cancelled command.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Command"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "description": "Not cancellable from the current state (`command-not-cancellable`).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/lanes/{id}/current": {
      "get": {
        "operationId": "get-apx-v1-lanes-id-current",
        "security": [
          {
            "apxOAuth": [
              "apx.control:read"
            ]
          }
        ],
        "tags": [
          "Control"
        ],
        "summary": "Lane inquiry — current transaction context (screen-pop)",
        "description": "The ticket/credential currently in the machine at this lane, amount\ndue, applied validations, latest LPR read, and monthly-credential\ncontext including the last 10 activity events. When no ticket is in\nthe machine — or when a lookup parameter is given — also\n`matchCandidates[]`: the open sessions at the place that plausibly\nbelong to the vehicle in the lane (Part 6 §6.7), for a driver who\nhas lost the ticket.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "VehicularAccess (lane) UUID."
          },
          {
            "name": "plate",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Ticket-matching override — the plate as the driver reads it, when the camera missed or misread (Part 6 §6.7)."
          },
          {
            "name": "phone",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "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)."
          },
          {
            "name": "credential",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Ticket-matching override — a credential identification (card number, tag) the driver names."
          }
        ],
        "responses": {
          "200": {
            "description": "Current lane status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LaneStatus"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "No such lane or no live state.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/validations/providers": {
      "get": {
        "operationId": "get-apx-v1-validations-providers",
        "security": [
          {
            "apxOAuth": [
              "apx.control:read"
            ]
          }
        ],
        "tags": [
          "Control"
        ],
        "summary": "List validation providers for a place",
        "description": "The venues allowed to validate tickets at the place.",
        "parameters": [
          {
            "name": "place",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/page"
          }
        ],
        "responses": {
          "200": {
            "description": "Validation providers.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/PaginatedListMeta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ValidationProvider"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/devices": {
      "get": {
        "operationId": "get-apx-v1-devices",
        "security": [
          {
            "apxOAuth": [
              "apx.control:read"
            ]
          }
        ],
        "tags": [
          "Control"
        ],
        "summary": "List device status overlays",
        "description": "Live DeviceStatus for every SupplementalEquipment the caller may\nsee, optionally narrowed by place and state (Part 6 §6.4). Naming a\n`place` outside the token's `apx_places` grant is 403\n`insufficient-grant`.",
        "parameters": [
          {
            "name": "place",
            "in": "query",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid"
              }
            },
            "description": "Comma-separated HierarchyElement ids; subtree-inclusive (a device on a lane matches its parent Place)."
          },
          {
            "name": "deviceState",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "An apx-device-states value, e.g. `fault` for everything in fault."
          },
          {
            "$ref": "#/components/parameters/page"
          }
        ],
        "responses": {
          "200": {
            "description": "Device status list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/PaginatedListMeta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DeviceStatus"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/devices/{id}": {
      "get": {
        "operationId": "get-apx-v1-devices-id",
        "security": [
          {
            "apxOAuth": [
              "apx.control:read"
            ]
          }
        ],
        "tags": [
          "Control"
        ],
        "summary": "Read one device's status overlay",
        "description": "DeviceStatus keyed by the SupplementalEquipment id.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Device status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DeviceStatus"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "No such device.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/equipment": {
      "get": {
        "operationId": "get-apx-v1-equipment",
        "security": [
          {
            "apxOAuth": [
              "apx.siteconfig:read"
            ]
          }
        ],
        "tags": [
          "Site configuration"
        ],
        "summary": "List a place's equipment with its roles, makes, versions and areas",
        "description": "Every SupplementalEquipment at the place, each with its\n`apds-ext:apx:equipment-detail@1.0` decoration, so a reader learns\nwhat the site has from APX alone (Part 26 §26.1). Distinct from\n`GET /v1/devices`, which serves live state; this serves the\ndescription. `mode=change&cursor=` serves the Part 5 §5.2 feed,\nso an edge or call-centre system keeps a local copy current.\nNaming a `place` outside the grant is 403 `insufficient-grant`.",
        "parameters": [
          {
            "$ref": "#/components/parameters/ModeParam"
          },
          {
            "$ref": "#/components/parameters/CursorParam"
          },
          {
            "name": "place",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "The HierarchyElement subtree root."
          },
          {
            "name": "role",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "An apx-equipment-roles value."
          },
          {
            "name": "area",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "An apx-area-types value."
          },
          {
            "name": "lane",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Equipment serving this VehicularAccess."
          },
          {
            "name": "level",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "$ref": "#/components/parameters/page"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated equipment; with `mode=change`, the changes after `cursor` in the same envelope (Part 5 §5.2 rule 8).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/PaginatedListMeta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/EquipmentRecord"
                      }
                    },
                    "updateMode": {
                      "$ref": "#/components/schemas/ChangeFeedUpdateMode"
                    },
                    "cursor": {
                      "$ref": "#/components/schemas/ChangeFeedCursor"
                    },
                    "deleted": {
                      "$ref": "#/components/schemas/ChangeFeedTombstones"
                    },
                    "grantAdditions": {
                      "$ref": "#/components/schemas/ChangeFeedGrantAdditions"
                    },
                    "next": {
                      "$ref": "#/components/schemas/ChangeFeedNext"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/CursorRefused"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/equipment/{id}": {
      "get": {
        "operationId": "get-apx-v1-equipment-id",
        "security": [
          {
            "apxOAuth": [
              "apx.siteconfig:read"
            ]
          }
        ],
        "tags": [
          "Site configuration"
        ],
        "summary": "Read one piece of equipment",
        "description": "The SupplementalEquipment with its APX decorations (Part 26 §26.1).",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The equipment record.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EquipmentRecord"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/comms-points": {
      "get": {
        "operationId": "get-apx-v1-comms-points",
        "security": [
          {
            "apxOAuth": [
              "apx.siteconfig:read"
            ]
          }
        ],
        "tags": [
          "Site configuration"
        ],
        "summary": "List or look up comms points",
        "description": "The ways a parker reaches help at the caller's places (Part 26\n§26.4). A call platform finds the comms point of an inbound\ncontact with `callerId`, `dialedNumber` or `commsDeviceId`; the\nanswer carries the lane, or the place only. `mode=change&cursor=`\nserves the Part 5 §5.2 feed.",
        "parameters": [
          {
            "$ref": "#/components/parameters/ModeParam"
          },
          {
            "$ref": "#/components/parameters/CursorParam"
          },
          {
            "name": "place",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "lane",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "type",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "An apx-comms-point-types value."
          },
          {
            "name": "callerId",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "E.164; matches `callerId`."
          },
          {
            "name": "dialedNumber",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "E.164; matches `phoneNumber`."
          },
          {
            "name": "commsDeviceId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "$ref": "#/components/parameters/page"
          }
        ],
        "responses": {
          "200": {
            "description": "Paginated comms points; with `mode=change`, the changes after `cursor` in the same envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/PaginatedListMeta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CommsPoint"
                      }
                    },
                    "updateMode": {
                      "$ref": "#/components/schemas/ChangeFeedUpdateMode"
                    },
                    "cursor": {
                      "$ref": "#/components/schemas/ChangeFeedCursor"
                    },
                    "deleted": {
                      "$ref": "#/components/schemas/ChangeFeedTombstones"
                    },
                    "grantAdditions": {
                      "$ref": "#/components/schemas/ChangeFeedGrantAdditions"
                    },
                    "next": {
                      "$ref": "#/components/schemas/ChangeFeedNext"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/CursorRefused"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/v1/comms-points/{id}": {
      "get": {
        "operationId": "get-apx-v1-comms-points-id",
        "security": [
          {
            "apxOAuth": [
              "apx.siteconfig:read"
            ]
          }
        ],
        "tags": [
          "Site configuration"
        ],
        "summary": "Read a comms point",
        "description": "The comms point with the lane or place it serves and the barrier an agent opens for it (Part 26 §26.4).",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The comms point.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CommsPoint"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    }
  },
  "webhooks": {
    "apx-event": {
      "post": {
        "operationId": "receive-apx-event",
        "summary": "Signed APX event delivery",
        "description": "Every webhook delivery POSTs one EventEnvelope with headers\n`APX-Signature` (v1=HMAC-SHA256(secret, timestamp + \".\" + body)),\n`APX-Timestamp` (RFC 3339, ±5 min replay window),\n`APX-Delivery-Id` (unique per attempt; envelope `id` is stable\nacross retries), and `APX-Key-Id` (REQUIRED during secret-rotation\noverlap windows — Part 9 §9.4). Respond 2xx to acknowledge;\nanything else triggers the normative retry schedule (Part 8).\n\n**Every attempt is signed afresh (normative, Part 8 §8.3):**\n`APX-Timestamp` is the time of that attempt and `APX-Signature` is\ncomputed over it and the unchanged body, so a retry an hour later\nstill falls inside the receiver's ±5-minute window. The body — and\nwith it the envelope `id` and `time` — is byte-identical across\nattempts.\n\nThe typed entries below (`apx-native-event` and one per APX topic\nwhose data schema lives outside its own domain) name the `data`\nschema each topic carries (Part 8 §8.7); they are the same POST.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventEnvelope"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Acknowledged."
          }
        }
      }
    },
    "apx-native-event": {
      "post": {
        "operationId": "receive-apx-native-event",
        "summary": "APDS EventTypeEnum topic delivery",
        "description": "A delivery on an APDS 4.1 topic (`SessionCreated`, `PlaceUpdated`,\n…): `type` is an APDS `EventTypeEnum` value, `data` the APDS\n`EventData` shape (the created/updated entity; for a `*Deleted`\ntopic the last state), and `subject` references the entity\n(Part 5 §5.4, Part 8 §8.2). Signed and retried like every delivery.",
        "parameters": [
          {
            "name": "APX-Signature",
            "in": "header",
            "required": true,
            "description": "`v1=` + hex HMAC-SHA256(secret, APX-Timestamp + \".\" + raw body), computed per attempt.",
            "schema": {
              "type": "string",
              "pattern": "^v1=[0-9a-f]{64}$"
            }
          },
          {
            "name": "APX-Timestamp",
            "in": "header",
            "required": true,
            "description": "RFC 3339 time of THIS attempt (not of the event or of the first attempt).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "APX-Delivery-Id",
            "in": "header",
            "required": true,
            "description": "UUID unique per attempt; the envelope `id` is the dedup key.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "APX-Key-Id",
            "in": "header",
            "required": false,
            "description": "The signing key's id — REQUIRED during a rotation overlap (Part 9 §9.4).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EventEnvelope"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "$ref": "#/components/schemas/EventTypeEnum"
                      },
                      "data": {
                        "$ref": "#/components/schemas/EventData"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Acknowledged."
          }
        }
      }
    },
    "apx.subscription.failed.v1": {
      "post": {
        "operationId": "receive-apx-subscription-failed",
        "summary": "A subscription exhausted its retry schedule",
        "description": "Published when a subscription enters `failed` (Part 8 §8.3).\n`subject` references the subscription (`className`\n`ApxEventSubscription`); `data` is a SubscriptionFailure. Delivered\nto other subscriptions of the same `apx_org` that list the topic,\nnever to the failed one.",
        "parameters": [
          {
            "name": "APX-Signature",
            "in": "header",
            "required": true,
            "description": "`v1=` + hex HMAC-SHA256(secret, APX-Timestamp + \".\" + raw body), computed per attempt.",
            "schema": {
              "type": "string",
              "pattern": "^v1=[0-9a-f]{64}$"
            }
          },
          {
            "name": "APX-Timestamp",
            "in": "header",
            "required": true,
            "description": "RFC 3339 time of THIS attempt (not of the event or of the first attempt).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "APX-Delivery-Id",
            "in": "header",
            "required": true,
            "description": "UUID unique per attempt; the envelope `id` is the dedup key.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "APX-Key-Id",
            "in": "header",
            "required": false,
            "description": "The signing key's id — REQUIRED during a rotation overlap (Part 9 §9.4).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EventEnvelope"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "apx.subscription.failed.v1"
                      },
                      "data": {
                        "$ref": "#/components/schemas/SubscriptionFailure"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Acknowledged."
          }
        }
      }
    },
    "apx.data.observation.created.v1": {
      "post": {
        "operationId": "receive-apx-data-observation-created",
        "summary": "An Observation was ingested",
        "description": "One event per ingested read. `data` is the APDS\n`ObservationElement` (an ingested ObservationSet yields one event\nper element); `subject` references it with `className`\n`ObservationElement`; publishers MUST populate `elementIds` with\nthe observing lane or place, which is the event's place binding\n(Part 8 §8.5). Plate values are subject to Part 9 §9.6.",
        "parameters": [
          {
            "name": "APX-Signature",
            "in": "header",
            "required": true,
            "description": "`v1=` + hex HMAC-SHA256(secret, APX-Timestamp + \".\" + raw body), computed per attempt.",
            "schema": {
              "type": "string",
              "pattern": "^v1=[0-9a-f]{64}$"
            }
          },
          {
            "name": "APX-Timestamp",
            "in": "header",
            "required": true,
            "description": "RFC 3339 time of THIS attempt (not of the event or of the first attempt).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "APX-Delivery-Id",
            "in": "header",
            "required": true,
            "description": "UUID unique per attempt; the envelope `id` is the dedup key.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "APX-Key-Id",
            "in": "header",
            "required": false,
            "description": "The signing key's id — REQUIRED during a rotation overlap (Part 9 §9.4).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EventEnvelope"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "apx.data.observation.created.v1"
                      },
                      "data": {
                        "$ref": "#/components/schemas/ObservationElement"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Acknowledged."
          }
        }
      }
    },
    "apx.data.observation.updated.v1": {
      "post": {
        "operationId": "receive-apx-data-observation-updated",
        "summary": "An ingested Observation was replaced",
        "description": "Published whenever an ingested Observation changes — for example\nthe LPR system revising `accessEvent` through\n`PUT /v1/lpr/reads/{observation}/access-event` (Part 13 §13.3a(4),\n§13.4), or a reviewer's plate decision through\n`PUT /v1/lpr/reads/{observation}/plate` (§13.3a(4a)). `data` is the\nAPDS `ObservationElement` as it now stands; `subject` and the place\nbinding (`elementIds`) are as for `apx.data.observation.created.v1`.\nConsumers key on the Observation id and keep the highest `version`.\nPlate values are subject to Part 9 §9.6.",
        "parameters": [
          {
            "name": "APX-Signature",
            "in": "header",
            "required": true,
            "description": "`v1=` + hex HMAC-SHA256(secret, APX-Timestamp + \".\" + raw body), computed per attempt.",
            "schema": {
              "type": "string",
              "pattern": "^v1=[0-9a-f]{64}$"
            }
          },
          {
            "name": "APX-Timestamp",
            "in": "header",
            "required": true,
            "description": "RFC 3339 time of THIS attempt (not of the event or of the first attempt).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "APX-Delivery-Id",
            "in": "header",
            "required": true,
            "description": "UUID unique per attempt; the envelope `id` is the dedup key.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "APX-Key-Id",
            "in": "header",
            "required": false,
            "description": "The signing key's id — REQUIRED during a rotation overlap (Part 9 §9.4).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EventEnvelope"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "apx.data.observation.updated.v1"
                      },
                      "data": {
                        "$ref": "#/components/schemas/ObservationElement"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Acknowledged."
          }
        }
      }
    },
    "apx.reservation.noshow.v1": {
      "post": {
        "operationId": "receive-apx-reservation-noshow",
        "summary": "A reservation reached its no-show condition",
        "description": "`data` is a ReservationSummary (`reservation`, `reservationState`\n`noShow`, `plannedStart`); `subject` references the AssignedRight\n(Part 14 §14.1, Part 8 §8.7).",
        "parameters": [
          {
            "name": "APX-Signature",
            "in": "header",
            "required": true,
            "description": "`v1=` + hex HMAC-SHA256(secret, APX-Timestamp + \".\" + raw body), computed per attempt.",
            "schema": {
              "type": "string",
              "pattern": "^v1=[0-9a-f]{64}$"
            }
          },
          {
            "name": "APX-Timestamp",
            "in": "header",
            "required": true,
            "description": "RFC 3339 time of THIS attempt (not of the event or of the first attempt).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "APX-Delivery-Id",
            "in": "header",
            "required": true,
            "description": "UUID unique per attempt; the envelope `id` is the dedup key.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "APX-Key-Id",
            "in": "header",
            "required": false,
            "description": "The signing key's id — REQUIRED during a rotation overlap (Part 9 §9.4).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/EventEnvelope"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "type": {
                        "const": "apx.reservation.noshow.v1"
                      },
                      "data": {
                        "$ref": "#/components/schemas/ReservationSummary"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Acknowledged."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "oAuth": {
        "type": "oauth2",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://api.parking-data-standards.org",
            "scopes": {
              "po": "Parking Operator",
              "sp": "Service Provider",
              "ep": "Enforcement Provider",
              "ad": "Administrator"
            }
          }
        }
      },
      "apxOAuth": {
        "type": "oauth2",
        "description": "OAuth 2.0 client-credentials (aligned with APDS 4.1's `oAuth` scheme).\nAPX scopes follow `apx.<domain>:<verb>`. Grants are carried in the\nnormative token claims `apx_org` (Organisation reference) and\n`apx_places` (HierarchyElement subtree grants — FAIL-CLOSED: absent\nor empty = no places; the explicit wildcard \"*\" = all places,\nPart 9 §9.3).",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://auth.example.com/oauth2/token",
            "scopes": {
              "apx.data:read": "Read parking data via APDS-native routes",
              "apx.data:write": "Create/update parking data via APDS-native routes",
              "apx.control:read": "Read commands, lanes, and device status",
              "apx.control:execute": "Execute commands (vend gate, lost ticket, push rate, apply validation…)",
              "apx.alerts:read": "Read alerts",
              "apx.alerts:write": "Raise, acknowledge, and resolve alerts",
              "apx.subscriptions:manage": "Create and manage event subscriptions",
              "apx.accounts:read": "Look up accounts and balances",
              "apx.payments:write": "Take payments and post accounting write-backs",
              "apx.lpr:read": "LPR plate/ticket cross-lookup",
              "apx.reservations:manage": "Quote, book, amend, cancel reservations",
              "apx.permits:manage": "Issue and manage permits",
              "apx.tolling:manage": "Create and manage toll transactions",
              "apx.resolution:read": "Resolve and read customer-service resolution contexts and allowed actions",
              "apx.support:manage": "Record and read support-interaction history",
              "apx.violations:read": "Read violations and run the enforcement eligibility check",
              "apx.violations:manage": "Create, review, issue, settle, appeal, and void violations",
              "apx.validations:read": "Read validation programs, issuances, redemptions, and statements",
              "apx.validations:manage": "Enrol and update programs, issue stock, reverse redemptions, close statements",
              "apx.validations:redeem": "Merchant scope — check codes, issue own stock, record redemptions, read own programs and statements (limited to the token's apx_org)",
              "apx.credentials:read": "Read credentials and their access-event history",
              "apx.credentials:manage": "Issue, activate, suspend, resume, report lost, revoke, and replace credentials",
              "apx.valet:read": "Read valet tickets and the retrieval queue",
              "apx.valet:manage": "Take custody, park, stage, hand back, and manage retrievals",
              "apx.valet:request": "Customer scope — request or cancel retrieval and read status/ETA for the caller's own ticket (text, app, web, voice bot)",
              "apx.platelists:read": "Read plate lists and their entries, plate values included (Part 24)",
              "apx.platelists:manage": "Create and maintain plate lists and entries (Part 24)",
              "apx.ui:launch": "Open a vendor screen for an agent and read the launches it issued (Part 25)",
              "apx.ui:read": "Read UI launches and the actions recorded in them (Part 25)",
              "apx.ui:record": "The surface's own scope; record actions done in a launched screen and close it (Part 25)",
              "apx.siteconfig:read": "Read a place's equipment, cameras, comms points, display records and external ids; resolve another system's id (Part 26)",
              "apx.siteconfig:manage": "Add, replace and remove comms points (Part 26)",
              "apx.cameras:view": "Obtain short-lived camera view links, logged against the agent (Part 26)",
              "apx.displays:record": "The scope of the system that drives a sign; record that a message was shown (Part 26 §26.9)",
              "apx.compliance:read": "Read the stay-compliance status on Sessions; without it the decoration is left out (Part 5 §5.9)",
              "apx.compliance:write": "Write the stay-compliance status on Sessions, beside the Session write scope (Part 5 §5.9)",
              "apx.digest:use": "Receive the credential digest keys (Part 9 §9.6 rule 6)",
              "apx.replication:write": "Replay another implementation's records with their original provenance and lifecycle times (Part 18 §18.6)",
              "apx.charging:read": "read charging-point status (with bay presence) and charging sessions",
              "apx.charging:manage": "bridge scope; push point availability, bay observations, open sessions, report timeline events, attach settlement",
              "apx.charging:status": "customer scope; minimized read of the caller's own charging session and the place's charger availability (app, text, voice bot)"
            }
          }
        }
      }
    },
    "schemas": {
      "ApxConfiguration": {
        "type": "object",
        "description": "Unauthenticated bootstrap configuration document.",
        "required": [
          "apxVersion",
          "apdsVersion",
          "tokenEndpoint",
          "conformanceClasses"
        ],
        "properties": {
          "apxVersion": {
            "type": "string",
            "description": "APX standard version implemented (semver). This is the edition\n(Part 3 §3.4) whose Parts and registries the implementation\nfollows; when `edition` is also present the two are equal.",
            "examples": [
              "0.1.0"
            ]
          },
          "edition": {
            "type": "string",
            "description": "The APX edition implemented (Part 3 §3.4), as named in its `spec/edition.json`.",
            "examples": [
              "0.16.0"
            ]
          },
          "apdsVersion": {
            "type": "string",
            "description": "APDS version this implementation extends.",
            "examples": [
              "4.1"
            ]
          },
          "tokenEndpoint": {
            "type": "string",
            "format": "uri",
            "description": "OAuth2 token endpoint (client-credentials grant)."
          },
          "apiBase": {
            "type": "string",
            "format": "uri",
            "description": "The URL every path in the bundle is relative to (APX `/v1/…` and\nAPDS-native routes alike). Absent means the origin root that serves\nthis document. REQUIRED when the API is mounted elsewhere (Part 16\n§16.1).",
            "examples": [
              "https://api.citypark.example/parking"
            ]
          },
          "conformanceClasses": {
            "type": "array",
            "description": "APX conformance classes this implementation supports, closed under\nthe Part 3 §3.1 dependency table, plus any vendor classes\n(`<vendor-ns>-<class>`). Clients ignore classes they do not\nrecognise.",
            "items": {
              "type": "string"
            },
            "examples": [
              [
                "apx-data",
                "apx-events",
                "apx-control",
                "apx-alerts",
                "apx-discovery"
              ]
            ]
          },
          "features": {
            "type": "array",
            "description": "Optional features the implementation offers — definedValues from `apx-features` or vendor features (Part 6 §6.5, Part 11, Part 16 §16.1).",
            "items": {
              "type": "string"
            },
            "examples": [
              [
                "negotiatedRates",
                "ticketMatching"
              ]
            ]
          },
          "registries": {
            "type": "object",
            "description": "Locations of the published UserDefinedCodeList registries, keyed by\nthe registry `name` from Part 11 (vendor lists by their own name).",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "registryVersions": {
            "type": "object",
            "description": "The version of each registry the implementation validates against, keyed as `registries`.",
            "additionalProperties": {
              "type": "integer",
              "minimum": 1
            },
            "examples": [
              {
                "apx-command-types": 3
              }
            ]
          },
          "extensions": {
            "$ref": "#/components/schemas/Extensions"
          }
        }
      },
      "HierarchyElementList": {
        "title": "HierarchyElementList",
        "description": "Paginated list of HierarchyElements",
        "type": "object",
        "x-package": "place",
        "allOf": [
          {
            "$ref": "#/components/schemas/PaginatedList"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "description": "List of HierarchyElements",
                "items": {
                  "$ref": "#/components/schemas/HierarchyElement"
                }
              }
            }
          }
        ]
      },
      "ChangeFeedPage": {
        "title": "ChangeFeedPage",
        "description": "Response of a native APDS list route when called with `mode=change`.\nItems are VERBATIM APDS entities carrying only changed fields plus\nidentity (change semantics per Part 5: explicit null = clear the field,\nabsent = unchanged — generalizing APDS Use Case C.1.1.6). Deletions are\nAPDS DeletedReferences (tombstones).",
        "type": "object",
        "required": [
          "publicationTime",
          "updateMode",
          "items",
          "cursor"
        ],
        "properties": {
          "publicationTime": {
            "$ref": "#/components/schemas/DateTime"
          },
          "publisher": {
            "description": "The publishing Organisation.",
            "$ref": "#/components/schemas/Reference"
          },
          "updateMode": {
            "type": "string",
            "const": "change"
          },
          "items": {
            "type": "array",
            "description": "Changed APDS entities of the route's class, each a change payload\n(identity plus only the changed members; Part 5 §5.1).",
            "items": {
              "$ref": "#/components/schemas/ChangePayload"
            }
          },
          "deleted": {
            "type": "array",
            "description": "Tombstones for deleted entities.",
            "items": {
              "$ref": "#/components/schemas/DeletedReference"
            }
          },
          "cursor": {
            "type": "string",
            "description": "Opaque cursor to resume AFTER the last change in this page."
          },
          "grantAdditions": {
            "type": "array",
            "description": "Present on the first page served after the credential's apx_places\ngrant gained subtrees (Part 5 §5.2 rule 7): the new subtree roots.\nThe client MUST full-sync these subtrees before relying on the\nfeed for them — the cursor does not retroactively cover their\nhistory.",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference",
            "description": "Link to the next page when more changes are immediately available; null otherwise."
          }
        },
        "examples": [
          {
            "publicationTime": "2026-08-06T18:20:00Z",
            "publisher": {
              "id": "a1000000-0000-4000-8000-000000000001",
              "className": "Organisation"
            },
            "updateMode": "change",
            "items": [
              {
                "id": "f1000000-0000-4000-8000-000000000001",
                "version": 4,
                "className": "Session",
                "segments": [
                  {
                    "actualEnd": "2026-08-06T18:14:34Z"
                  }
                ]
              }
            ],
            "deleted": [
              {
                "id": "f1000000-0000-4000-8000-000000000099",
                "className": "Session",
                "deleteTimestamp": "2026-08-06T17:58:12Z"
              }
            ],
            "cursor": "c:00042"
          }
        ]
      },
      "Problem": {
        "title": "Problem",
        "description": "RFC 9457 problem details. APX problem `type` URIs are registered in the\nAPX problem-type registry. Used for all APX error responses; APDS-native\nroutes may alternatively use the APDS ResponseStatus shape.",
        "type": "object",
        "required": [
          "type",
          "title",
          "status"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "Problem type URI from the APX problem registry.",
            "examples": [
              "https://apx-standard.org/problems/insufficient-grant"
            ]
          },
          "title": {
            "type": "string",
            "description": "Short human-readable summary of the problem type."
          },
          "status": {
            "type": "integer",
            "minimum": 100,
            "maximum": 599,
            "description": "HTTP status code."
          },
          "detail": {
            "type": "string",
            "description": "Human-readable explanation specific to this occurrence."
          },
          "instance": {
            "type": "string",
            "format": "uri-reference",
            "description": "URI reference identifying this specific occurrence."
          }
        },
        "additionalProperties": true,
        "examples": [
          {
            "type": "https://apx-standard.org/problems/target-not-found",
            "title": "Target not found",
            "status": 404,
            "detail": "No lane b2000000-0000-4000-8000-00000000dead at this place.",
            "instance": "/v1/lanes/b2000000-0000-4000-8000-00000000dead/current"
          }
        ]
      },
      "HierarchyElement": {
        "title": "HierarchyElement",
        "description": "A generalised component of a place hierarchy, that forms one element in the tree-like hierarchy. This forms a reusable block of the hierarchy, with relations to its parent element (if one exists) and any child elements. Each Place element in the hierarchy shall have a name, and may support a free-text description and an operator/property owner defined reference (e.g. location number/identifier)'",
        "type": "object",
        "x-package": "place",
        "discriminator": {
          "propertyName": "type",
          "mapping": {
            "campus": "#/components/schemas/Campus",
            "place": "#/components/schemas/Place",
            "space": "#/components/schemas/Space"
          }
        },
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "$ref": "#/components/schemas/HierarchyElementTypeEnum"
              },
              "name": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "description": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "aliases": {
                "type": "array",
                "description": "Alternative names for the hierarchy element.",
                "items": {
                  "$ref": "#/components/schemas/MultilingualString"
                }
              },
              "operatorDefinedReference": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "parentId": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "childIds": {
                "type": "array",
                "readOnly": true,
                "description": "The identity of one or several child nodes directly related to this hierarchy element.",
                "items": {
                  "$ref": "#/components/schemas/VersionedReference"
                }
              },
              "layer": {
                "type": "integer",
                "minimum": 0,
                "description": "Indicator of the position of this hierarchy element in the specific hierarchy, with the top of the hierarchy numbered layer 0."
              },
              "rightSpecifications": {
                "type": "array",
                "readOnly": true,
                "description": "RightSpecifications associated to the element",
                "items": {
                  "$ref": "#/components/schemas/VersionedReference"
                }
              },
              "hierarchyElementRecord": {
                "readOnly": true,
                "$ref": "#/components/schemas/HierarchyElementRecord"
              },
              "hierarchyElementReference": {
                "$ref": "#/components/schemas/HierarchyElementReference"
              },
              "occupancyLevel": {
                "$ref": "#/components/schemas/OccupancyLevel"
              },
              "responsibilityRoleAssignments": {
                "description": "roles and responsibilities",
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ResponsibilityRoleAssignment"
                }
              },
              "extensions": {
                "description": "The APDS extension container (Use Case Document §C.2.5; Part 4 §4.3). Undeclared on APDS 4.1 entities (APX erratum 010).",
                "$ref": "#/components/schemas/Extensions"
              }
            }
          }
        ],
        "required": [
          "type",
          "name",
          "layer",
          "hierarchyElementRecord"
        ]
      },
      "ResponseStatus": {
        "title": "ResponseStatus",
        "description": "Codifies responses following some creation, update or delete operation.",
        "type": "object",
        "x-package": "api",
        "properties": {
          "status": {
            "description": "The status code of the response.",
            "$ref": "#/components/schemas/ResponseStatusEnum"
          },
          "code": {
            "type": "integer",
            "description": "Same numbering and semantics as HTTP status codes."
          },
          "message": {
            "type": "string",
            "description": "Descriptive message for error statuses."
          },
          "ids": {
            "description": "list of conflicting/missing ids (if applicable)",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "status"
        ]
      },
      "HierarchyElementChangePayload": {
        "title": "HierarchyElementChangePayload",
        "description": "A change-mode body for native `PUT /places/{id}` (Part 5 §5.1a): `id` plus only the HierarchyElement members that changed; an absent member is unchanged and an explicit `null` clears it. Every member present is checked against the class, and a member the class does not define is refused. Generated at build time (tools/change-payloads.mjs); the generic ChangePayload remains the shape of change-feed items.",
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "The entity identifier (APDS VersionedIdentity.id)."
          },
          "version": {
            "anyOf": [
              {
                "type": "integer",
                "description": "Positive integer representing the object version.",
                "minimum": 1,
                "examples": [
                  1
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HierarchyElementTypeEnum"
              },
              {
                "type": "null"
              }
            ]
          },
          "name": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "aliases": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/MultilingualString"
            }
          },
          "operatorDefinedReference": {
            "type": [
              "object",
              "null"
            ]
          },
          "parentId": {
            "type": [
              "object",
              "null"
            ]
          },
          "childIds": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "layer": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "description": "Indicator of the position of this hierarchy element in the specific hierarchy, with the top of the hierarchy numbered layer 0."
              },
              {
                "type": "null"
              }
            ]
          },
          "rightSpecifications": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "hierarchyElementRecord": {
            "type": [
              "object",
              "null"
            ]
          },
          "hierarchyElementReference": {
            "type": [
              "object",
              "null"
            ]
          },
          "occupancyLevel": {
            "type": [
              "object",
              "null"
            ]
          },
          "responsibilityRoleAssignments": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "extensions": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Extensions"
              },
              {
                "type": "null"
              }
            ]
          },
          "characteristics": {
            "type": [
              "object",
              "null"
            ]
          },
          "contacts": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "marketing": {
            "type": [
              "object",
              "null"
            ]
          },
          "operatingRestrictions": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "rgbColours": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "times": {
            "type": [
              "object",
              "null"
            ]
          },
          "paymentMethods": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "safetyStandardClassifications": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "timeZone": {
            "anyOf": [
              {
                "type": "string",
                "description": "IANA time-zone (see https://www.iana.org/time-zones)"
              },
              {
                "type": "null"
              }
            ]
          },
          "placeStreetAddress": {
            "type": [
              "object",
              "null"
            ]
          },
          "placeBoundedZone": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "indicativePointLocation": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "spaceId": {
            "type": [
              "object",
              "null"
            ]
          },
          "detection": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ParkingSpaceOccupancyDetectionEnum"
              },
              {
                "type": "null"
              }
            ]
          },
          "spaceBoundedZone": {
            "type": [
              "object",
              "null"
            ]
          },
          "spaceDimension": {
            "type": [
              "object",
              "null"
            ]
          },
          "spaceMaximumDims": {
            "type": [
              "object",
              "null"
            ]
          }
        },
        "additionalProperties": false
      },
      "PaginatedListMeta": {
        "title": "PaginatedListMeta",
        "description": "Metadata for paginated list of results for listing API endpoints.",
        "type": "object",
        "x-package": "api",
        "properties": {
          "referenceInstant": {
            "type": "integer",
            "description": "Unix epoch time to be used as reference which should be the same for all pages. Allows a consistent view of data across multiple paged requests.",
            "minimum": 0,
            "examples": [
              1709840615
            ]
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "description": "Index of the first item returned in the page.",
            "examples": [
              0
            ]
          },
          "pageSize": {
            "type": "integer",
            "description": "Maximum number of items that can be returned per page.",
            "minimum": 0,
            "examples": [
              100
            ]
          },
          "total": {
            "type": "integer",
            "description": "Total number of items contained in all pages.",
            "minimum": 0,
            "examples": [
              1
            ]
          }
        },
        "required": [
          "referenceInstant",
          "offset",
          "pageSize",
          "total"
        ]
      },
      "ObservationElement": {
        "title": "ObservationElement",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "method": {
                "$ref": "#/components/schemas/ObservationTypeEnum"
              },
              "observer": {
                "type": "string",
                "description": "The individual person making the observation recorded in this observation element."
              },
              "type": {
                "$ref": "#/components/schemas/CredentialTypeEnum"
              },
              "observedCredentialId": {
                "type": "string",
                "description": "Specific identifier to the referenced observed credential."
              },
              "observationStartTime": {
                "type": "string",
                "format": "date-time",
                "description": "The initial date and time of the observation."
              },
              "observationEndTime": {
                "type": "string",
                "format": "date-time",
                "description": "The ending date and time of the observation, when it was continous since `observationStartTime`."
              },
              "description": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "creationDateTime": {
                "type": "string",
                "format": "date-time",
                "description": "The date and time stamp for the creation of the observation element."
              },
              "location": {
                "$ref": "#/components/schemas/Location"
              },
              "images": {
                "type": "array",
                "description": "still or moving images observation evidence or a reference to such observation evidence",
                "items": {
                  "$ref": "#/components/schemas/Image"
                }
              },
              "elementIds": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "vehicleAncillaryIdentification": {
                "$ref": "#/components/schemas/VehicleAncillaryIdentification"
              },
              "observerOrganisation": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "confidence": {
                "$ref": "#/components/schemas/Confidence"
              },
              "characterConfidence": {
                "$ref": "#/components/schemas/CharacterConfidence"
              },
              "extensions": {
                "description": "The APDS extension container (Use Case Document §C.2.5; Part 4 §4.3). Undeclared on APDS 4.1 entities (APX erratum 010).",
                "$ref": "#/components/schemas/Extensions"
              }
            },
            "required": [
              "method",
              "observationStartTime",
              "creationDateTime",
              "location",
              "observerOrganisation"
            ]
          }
        ],
        "description": "A specific collection of observation details intended to be used for one specific observation instance.",
        "x-tags": [
          "observation"
        ]
      },
      "ObservationSet": {
        "title": "ObservationSet",
        "description": "Details of the collection of a set of related recorded observations.",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "creationDateTime": {
                "type": "string",
                "description": "The date and time of the creation of the\nobservation set.",
                "format": "date-time"
              },
              "creator": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "observationElements": {
                "type": "array",
                "description": "Individual observations in the set",
                "items": {
                  "$ref": "#/components/schemas/ObservationElement"
                }
              },
              "extensions": {
                "description": "The APDS extension container (Use Case Document §C.2.5; Part 4 §4.3). Undeclared on APDS 4.1 entities (APX erratum 010).",
                "$ref": "#/components/schemas/Extensions"
              }
            },
            "required": [
              "creationDateTime",
              "creator"
            ]
          }
        ],
        "x-tags": [
          "observation"
        ]
      },
      "ObservationElementChangePayload": {
        "title": "ObservationElementChangePayload",
        "description": "A change-mode body for native `PUT /observations/{id}` (Part 5 §5.1a): `id` plus only the ObservationElement members that changed; an absent member is unchanged and an explicit `null` clears it. Every member present is checked against the class, and a member the class does not define is refused. Generated at build time (tools/change-payloads.mjs); the generic ChangePayload remains the shape of change-feed items.",
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "The entity identifier (APDS VersionedIdentity.id)."
          },
          "version": {
            "anyOf": [
              {
                "type": "integer",
                "description": "Positive integer representing the object version.",
                "minimum": 1,
                "examples": [
                  1
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "method": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ObservationTypeEnum"
              },
              {
                "type": "null"
              }
            ]
          },
          "observer": {
            "anyOf": [
              {
                "type": "string",
                "description": "The individual person making the observation recorded in this observation element."
              },
              {
                "type": "null"
              }
            ]
          },
          "type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CredentialTypeEnum"
              },
              {
                "type": "null"
              }
            ]
          },
          "observedCredentialId": {
            "anyOf": [
              {
                "type": "string",
                "description": "Specific identifier to the referenced observed credential."
              },
              {
                "type": "null"
              }
            ]
          },
          "observationStartTime": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "The initial date and time of the observation."
              },
              {
                "type": "null"
              }
            ]
          },
          "observationEndTime": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "The ending date and time of the observation, when it was continous since `observationStartTime`."
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "creationDateTime": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "The date and time stamp for the creation of the observation element."
              },
              {
                "type": "null"
              }
            ]
          },
          "location": {
            "type": [
              "object",
              "null"
            ]
          },
          "images": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "elementIds": {
            "type": [
              "object",
              "null"
            ]
          },
          "vehicleAncillaryIdentification": {
            "type": [
              "object",
              "null"
            ]
          },
          "observerOrganisation": {
            "type": [
              "object",
              "null"
            ]
          },
          "confidence": {
            "type": [
              "object",
              "null"
            ]
          },
          "characterConfidence": {
            "type": [
              "object",
              "null"
            ]
          },
          "extensions": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Extensions"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "ContactPointTypeEnum": {
        "title": "ContactPointTypeEnum",
        "description": "Defines the supported lists of types of contact.\n* customerService : Contact details for parking customer support for a facility or specific entity\n* emergencyContact : Contact details for emergency assistance or support for a facility or specific entity specifically related to parking operations\n* enforcementSystemProvider : Contact details for the provider of the enforcement system\n* operator : Contact details for the parking operator for a facility or specific entity\n* owner : Contact details for the owner of a facility or specific entity.\n* propertyManager : Contact details for the property manager of a facility or related facility.\n* securityService : Contact details for security services for a facility or specific entity\n* serviceProvider : Contact details for a parking service provider (e.g. pay-by-mobile provider)",
        "type": "string",
        "x-package": "contact.enums",
        "enum": [
          "customerService",
          "emergencyContact",
          "enforcementSystemProvider",
          "operator",
          "owner",
          "propertyManager",
          "securityService",
          "serviceProvider"
        ]
      },
      "ContactPoint": {
        "title": "ContactPoint",
        "description": "Defines contact details for specified role. Organisation name attribute should not be used in combination with role parkingSiteAddress.",
        "type": "object",
        "x-package": "contact",
        "allOf": [
          {
            "$ref": "#/components/schemas/Contact"
          },
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "organisationName": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "type": {
                "$ref": "#/components/schemas/ContactPointTypeEnum"
              },
              "address": {
                "type": "array",
                "description": "Addresses.",
                "items": {
                  "$ref": "#/components/schemas/Address"
                }
              },
              "contactDetails": {
                "type": "array",
                "description": "Contact details.",
                "items": {
                  "$ref": "#/components/schemas/ContactDetails"
                }
              },
              "eMailCommonData": {
                "type": "array",
                "description": "Email common data.",
                "items": {
                  "$ref": "#/components/schemas/EMailCommonData"
                }
              },
              "telephoneContacts": {
                "type": "array",
                "description": "Telephone contact.",
                "items": {
                  "$ref": "#/components/schemas/TelephoneContact"
                }
              },
              "pointLocations": {
                "type": "array",
                "description": "Contact point location.",
                "items": {
                  "$ref": "#/components/schemas/GeoJsonObject"
                }
              },
              "extensions": {
                "description": "The APDS extension container (Use Case Document §C.2.5; Part 4 §4.3). Undeclared on APDS 4.1 entities (APX erratum 010).",
                "$ref": "#/components/schemas/Extensions"
              }
            },
            "required": [
              "type"
            ]
          }
        ]
      },
      "ContactPointChangePayload": {
        "title": "ContactPointChangePayload",
        "description": "A change-mode body for native `PUT /contacts/{contactId}` (Part 5 §5.1a): `id` plus only the ContactPoint members that changed; an absent member is unchanged and an explicit `null` clears it. Every member present is checked against the class, and a member the class does not define is refused. Generated at build time (tools/change-payloads.mjs); the generic ChangePayload remains the shape of change-feed items.",
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "contactType": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContactTypeEnum"
              },
              {
                "type": "null"
              }
            ]
          },
          "contactNotDefined": {
            "anyOf": [
              {
                "type": "boolean",
                "description": "When true, there is currently no contact defined for the selected role and/or timeframe. Don't use the specialisations in this case."
              },
              {
                "type": "null"
              }
            ]
          },
          "contactUnknown": {
            "anyOf": [
              {
                "type": "boolean",
                "description": "When true, the contact for the selected role and/or timeframe is unknown. Don't use the specialisations in this case."
              },
              {
                "type": "null"
              }
            ]
          },
          "shareWithPublic": {
            "anyOf": [
              {
                "type": "boolean",
                "description": "When true, the details of this contact may be shared with the public. If false these contacts details are for internal purposes only."
              },
              {
                "type": "null"
              }
            ]
          },
          "validityOfContact": {
            "type": [
              "object",
              "null"
            ]
          },
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "The entity identifier (APDS VersionedIdentity.id)."
          },
          "version": {
            "anyOf": [
              {
                "type": "integer",
                "description": "Positive integer representing the object version.",
                "minimum": 1,
                "examples": [
                  1
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "organisationName": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ContactPointTypeEnum"
              },
              {
                "type": "null"
              }
            ]
          },
          "address": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "contactDetails": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "eMailCommonData": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "telephoneContacts": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "pointLocations": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "extensions": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Extensions"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "RightSpecificationList": {
        "title": "RightSpecificationList",
        "description": "Paginated list of RightSpecifications",
        "type": "object",
        "x-package": "right_specification",
        "allOf": [
          {
            "$ref": "#/components/schemas/PaginatedList"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "description": "List of RightSpecifications",
                "items": {
                  "$ref": "#/components/schemas/RightSpecification"
                }
              }
            }
          }
        ]
      },
      "RightSpecification": {
        "title": "RightSpecification",
        "description": "Defines what the owner/manager of a place is granting the ability to do (e.g. park, delivery, pick up) to specific users or vehicles.",
        "type": "object",
        "x-package": "right_specification",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "description": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "type": {
                "$ref": "#/components/schemas/RightSpecificationTypeEnum"
              },
              "financialReference": {
                "type": "string",
                "description": "Creator defined free-text reference to financial transactions associated to the specific Right Specification."
              },
              "transferable": {
                "type": "boolean"
              },
              "transferableConditions": {
                "type": "boolean"
              },
              "credentials": {
                "type": "array",
                "description": "The allowed credential types for this RightSpecification",
                "items": {
                  "$ref": "#/components/schemas/CredentialTypeEnum"
                }
              },
              "validity": {
                "$ref": "#/components/schemas/Validity"
              },
              "expiry": {
                "type": "string",
                "description": "Date/time showing the timestamp for when a RightSpecification ceases to be valid.",
                "format": "date-time"
              },
              "rightPools": {
                "type": "array",
                "description": "Shares the number of AssignedRights that are available for use, are currently in use, or intended for use within a specific RightSpecification in specific date/time periods by a specific AssignedRightIssuer'",
                "items": {
                  "$ref": "#/components/schemas/RightPool"
                }
              },
              "issuer": {
                "readOnly": true,
                "$ref": "#/components/schemas/VersionedReference"
              },
              "hierarchyElements": {
                "type": "array",
                "description": "Reference to Places where this RightSpecification is available.",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/VersionedReference"
                }
              },
              "rateEligibility": {
                "type": "array",
                "description": "Defines the combination of Eligibility requirements with RateTables and associates this combination to a RightSpecification. \nRateEligibility enables a RightSpecification to have association to multiple RateTable(s) for a\nspecific Eligibility ( or set of Qualifications). \nRateEligibility also defines if RateTables are Combinable. \nThis is a Yes / No (Boolean) definition. \nEither all RateTables associated to a RightSpecification with a common Eligibility can be combined or they cannot.",
                "items": {
                  "$ref": "#/components/schemas/RateEligibility"
                }
              },
              "rateTransition": {
                "$ref": "#/components/schemas/RateTransition"
              },
              "extensions": {
                "description": "The APDS extension container (Use Case Document §C.2.5; Part 4 §4.3). Undeclared on APDS 4.1 entities (APX erratum 010).",
                "$ref": "#/components/schemas/Extensions"
              }
            },
            "required": [
              "issuer",
              "transferable",
              "hierarchyElements",
              "validity"
            ]
          }
        ]
      },
      "RightSpecificationChangePayload": {
        "title": "RightSpecificationChangePayload",
        "description": "A change-mode body for native `PUT /rights/specs/{id}` (Part 5 §5.1a): `id` plus only the RightSpecification members that changed; an absent member is unchanged and an explicit `null` clears it. Every member present is checked against the class, and a member the class does not define is refused. Generated at build time (tools/change-payloads.mjs); the generic ChangePayload remains the shape of change-feed items.",
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "The entity identifier (APDS VersionedIdentity.id)."
          },
          "version": {
            "anyOf": [
              {
                "type": "integer",
                "description": "Positive integer representing the object version.",
                "minimum": 1,
                "examples": [
                  1
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RightSpecificationTypeEnum"
              },
              {
                "type": "null"
              }
            ]
          },
          "financialReference": {
            "anyOf": [
              {
                "type": "string",
                "description": "Creator defined free-text reference to financial transactions associated to the specific Right Specification."
              },
              {
                "type": "null"
              }
            ]
          },
          "transferable": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "transferableConditions": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "credentials": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/CredentialTypeEnum"
            }
          },
          "validity": {
            "type": [
              "object",
              "null"
            ]
          },
          "expiry": {
            "anyOf": [
              {
                "type": "string",
                "description": "Date/time showing the timestamp for when a RightSpecification ceases to be valid.",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "rightPools": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "issuer": {
            "type": [
              "object",
              "null"
            ]
          },
          "hierarchyElements": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "rateEligibility": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "rateTransition": {
            "type": [
              "object",
              "null"
            ]
          },
          "extensions": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Extensions"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "RateTableList": {
        "title": "RateList",
        "description": "Paginated list of Rates",
        "type": "object",
        "x-package": "rate",
        "allOf": [
          {
            "$ref": "#/components/schemas/PaginatedList"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "description": "List of Rates",
                "items": {
                  "$ref": "#/components/schemas/RateTable"
                }
              }
            }
          }
        ]
      },
      "RateTable": {
        "title": "RateTable",
        "description": "Contains a specific set of rate line collection relating to one or more locations and optionally one set of eligibility criteria. rate table id refers to the internal identifier provided by the data supplier, and not the rate table unique identifier.",
        "type": "object",
        "x-package": "rate",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "rateTableName": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "rateTableID": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "availability": {
                "$ref": "#/components/schemas/RateAvailabilityTypeEnum"
              },
              "rateResponsibleParty": {
                "readOnly": true,
                "$ref": "#/components/schemas/VersionedReference"
              },
              "rateSupersedeLink": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "validation": {
                "type": "boolean",
                "description": "Indicates if validations are accepted when using this RateTable."
              },
              "rateType": {
                "$ref": "#/components/schemas/RateTypeEnum"
              },
              "additionalInformation": {
                "$ref": "#/components/schemas/Url"
              },
              "validity": {
                "$ref": "#/components/schemas/Validity"
              },
              "rateLineCollections": {
                "type": "array",
                "description": "List of RateLineCollection that defines this RateTable.",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/RateLineCollection"
                }
              },
              "extensions": {
                "description": "The APDS extension container (Use Case Document §C.2.5; Part 4 §4.3). Undeclared on APDS 4.1 entities (APX erratum 010).",
                "$ref": "#/components/schemas/Extensions"
              }
            },
            "required": [
              "rateTableName",
              "availability",
              "rateLineCollections"
            ]
          }
        ]
      },
      "RateTableChangePayload": {
        "title": "RateTableChangePayload",
        "description": "A change-mode body for native `PUT /rates/{id}` (Part 5 §5.1a): `id` plus only the RateTable members that changed; an absent member is unchanged and an explicit `null` clears it. Every member present is checked against the class, and a member the class does not define is refused. Generated at build time (tools/change-payloads.mjs); the generic ChangePayload remains the shape of change-feed items.",
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "The entity identifier (APDS VersionedIdentity.id)."
          },
          "version": {
            "anyOf": [
              {
                "type": "integer",
                "description": "Positive integer representing the object version.",
                "minimum": 1,
                "examples": [
                  1
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "rateTableName": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "rateTableID": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "availability": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RateAvailabilityTypeEnum"
              },
              {
                "type": "null"
              }
            ]
          },
          "rateResponsibleParty": {
            "type": [
              "object",
              "null"
            ]
          },
          "rateSupersedeLink": {
            "type": [
              "object",
              "null"
            ]
          },
          "validation": {
            "anyOf": [
              {
                "type": "boolean",
                "description": "Indicates if validations are accepted when using this RateTable."
              },
              {
                "type": "null"
              }
            ]
          },
          "rateType": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RateTypeEnum"
              },
              {
                "type": "null"
              }
            ]
          },
          "additionalInformation": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Url"
              },
              {
                "type": "null"
              }
            ]
          },
          "validity": {
            "type": [
              "object",
              "null"
            ]
          },
          "rateLineCollections": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "extensions": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Extensions"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "SessionList": {
        "title": "SessionList",
        "description": "Paginated list of Sessions",
        "type": "object",
        "x-package": "session",
        "allOf": [
          {
            "$ref": "#/components/schemas/PaginatedList"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "description": "List of Sessions",
                "items": {
                  "$ref": "#/components/schemas/Session"
                }
              }
            }
          }
        ]
      },
      "Session": {
        "title": "Session",
        "description": "A session captures the actual use of an assigned right and includes start time, end time, credential, and other relevant data related to an operational transaction. A __session__ is not used for future activities, and is broken into one or multiple __segments__.",
        "type": "object",
        "x-package": "session",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "actualStart": {
                "type": "string",
                "format": "date-time",
                "description": "The date/time of the start of the session."
              },
              "actualEnd": {
                "type": "string",
                "format": "date-time",
                "description": "The date/time of the end of the session."
              },
              "initiator": {
                "readOnly": true,
                "$ref": "#/components/schemas/VersionedReference"
              },
              "hierarchyElement": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "identifiedCredentials": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/CredentialAssigned"
                }
              },
              "segments": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/Segment"
                }
              },
              "identifiedVehicle": {
                "$ref": "#/components/schemas/VehicleAncillaryIdentification"
              },
              "extensions": {
                "description": "The APDS extension container (Use Case Document §C.2.5; Part 4 §4.3). Undeclared on APDS 4.1 entities (APX erratum 010).",
                "$ref": "#/components/schemas/Extensions"
              }
            },
            "required": [
              "actualStart",
              "initiator",
              "identifiedCredentials",
              "segments"
            ]
          }
        ]
      },
      "SessionChangePayload": {
        "title": "SessionChangePayload",
        "description": "A change-mode body for native `PUT /sessions/{id}` (Part 5 §5.1a): `id` plus only the Session members that changed; an absent member is unchanged and an explicit `null` clears it. Every member present is checked against the class, and a member the class does not define is refused. Generated at build time (tools/change-payloads.mjs); the generic ChangePayload remains the shape of change-feed items.",
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "The entity identifier (APDS VersionedIdentity.id)."
          },
          "version": {
            "anyOf": [
              {
                "type": "integer",
                "description": "Positive integer representing the object version.",
                "minimum": 1,
                "examples": [
                  1
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "actualStart": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "The date/time of the start of the session."
              },
              {
                "type": "null"
              }
            ]
          },
          "actualEnd": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "The date/time of the end of the session."
              },
              {
                "type": "null"
              }
            ]
          },
          "initiator": {
            "type": [
              "object",
              "null"
            ]
          },
          "hierarchyElement": {
            "type": [
              "object",
              "null"
            ]
          },
          "identifiedCredentials": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "segments": {
            "type": [
              "array",
              "null"
            ],
            "minItems": 1,
            "items": {
              "type": "object"
            }
          },
          "identifiedVehicle": {
            "type": [
              "object",
              "null"
            ]
          },
          "extensions": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Extensions"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "AssignedRightList": {
        "title": "AssignedRightList",
        "description": "Paginated list of AssignedRights",
        "type": "object",
        "x-package": "assigned_right",
        "allOf": [
          {
            "$ref": "#/components/schemas/PaginatedList"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "description": "List of AssignedRights",
                "items": {
                  "$ref": "#/components/schemas/AssignedRight"
                }
              }
            }
          }
        ]
      },
      "AssignedRight": {
        "title": "AssignedRight",
        "description": "AssignedRight indicates the granting of a specific right specification to a specific right holder, and indicates one instance of a planned use of the right.",
        "type": "object",
        "x-package": "assigned_right",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "rightSpecification": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "rightHolder": {
                "$ref": "#/components/schemas/AssignedRightHolder"
              },
              "assignedRightIssuer": {
                "readOnly": true,
                "$ref": "#/components/schemas/VersionedReference"
              },
              "issueMethod": {
                "$ref": "#/components/schemas/IssueMethodTypeEnum"
              },
              "issuanceTime": {
                "type": "string",
                "description": "The datetime this AssignedRight was issued.",
                "format": "date-time"
              },
              "minutesAvailable": {
                "type": "number",
                "description": "Number of decimal minutes that are remaining for use under a specified AssignedRight.",
                "format": "float"
              },
              "minutesUsed": {
                "type": "number",
                "description": "Number of decimal minutes that have been used under a specified AssignedRight.",
                "format": "float"
              },
              "totalMinutes": {
                "type": "number",
                "description": "Number of decimal minutes that have been issued under a specified AssignedRight.",
                "format": "float"
              },
              "remainingValue": {
                "$ref": "#/components/schemas/AmountInCurrency"
              },
              "totalRightValue": {
                "$ref": "#/components/schemas/AmountInCurrency"
              },
              "instancesUsed": {
                "type": "integer",
                "description": "The total number of instances that have been used under a specified RightSpecification."
              },
              "instancesAvailable": {
                "type": "integer",
                "description": "The total number of instances that are available for use under a specified RightSpecification."
              },
              "totalInstances": {
                "type": "integer",
                "description": "The total number of instances that have been issued under a specified AssignedRight."
              },
              "expiry": {
                "type": "string",
                "description": "The datetime when the specific AssignedRight expires, and is not longer available for use.",
                "format": "date-time"
              },
              "plannedUses": {
                "type": "array",
                "description": "Planned future uses of this AssignedRight.",
                "items": {
                  "$ref": "#/components/schemas/PlannedUse"
                }
              },
              "payments": {
                "type": "array",
                "description": "Payments made for this AssignedRight.",
                "items": {
                  "$ref": "#/components/schemas/Payment"
                }
              },
              "monetaryValue": {
                "$ref": "#/components/schemas/MonetaryValue"
              },
              "extensions": {
                "description": "The APDS extension container (Use Case Document §C.2.5; Part 4 §4.3). Undeclared on APDS 4.1 entities (APX erratum 010).",
                "$ref": "#/components/schemas/Extensions"
              }
            },
            "required": [
              "rightSpecification",
              "rightHolder"
            ]
          }
        ]
      },
      "ReferenceToQuote": {
        "title": "ReferenceToQuote",
        "description": "Class defining a reference to a specific Quote",
        "oneOf": [
          {
            "$ref": "#/components/schemas/ReferenceQuoteExtension"
          },
          {
            "$ref": "#/components/schemas/ReferenceQuoteNew"
          }
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "AssignedRightChangePayload": {
        "title": "AssignedRightChangePayload",
        "description": "A change-mode body for native `PUT /rights/assigned/{id}` (Part 5 §5.1a): `id` plus only the AssignedRight members that changed; an absent member is unchanged and an explicit `null` clears it. Every member present is checked against the class, and a member the class does not define is refused. Generated at build time (tools/change-payloads.mjs); the generic ChangePayload remains the shape of change-feed items.",
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "The entity identifier (APDS VersionedIdentity.id)."
          },
          "version": {
            "anyOf": [
              {
                "type": "integer",
                "description": "Positive integer representing the object version.",
                "minimum": 1,
                "examples": [
                  1
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "rightSpecification": {
            "type": [
              "object",
              "null"
            ]
          },
          "rightHolder": {
            "type": [
              "object",
              "null"
            ]
          },
          "assignedRightIssuer": {
            "type": [
              "object",
              "null"
            ]
          },
          "issueMethod": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/IssueMethodTypeEnum"
              },
              {
                "type": "null"
              }
            ]
          },
          "issuanceTime": {
            "anyOf": [
              {
                "type": "string",
                "description": "The datetime this AssignedRight was issued.",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "minutesAvailable": {
            "anyOf": [
              {
                "type": "number",
                "description": "Number of decimal minutes that are remaining for use under a specified AssignedRight.",
                "format": "float"
              },
              {
                "type": "null"
              }
            ]
          },
          "minutesUsed": {
            "anyOf": [
              {
                "type": "number",
                "description": "Number of decimal minutes that have been used under a specified AssignedRight.",
                "format": "float"
              },
              {
                "type": "null"
              }
            ]
          },
          "totalMinutes": {
            "anyOf": [
              {
                "type": "number",
                "description": "Number of decimal minutes that have been issued under a specified AssignedRight.",
                "format": "float"
              },
              {
                "type": "null"
              }
            ]
          },
          "remainingValue": {
            "type": [
              "object",
              "null"
            ]
          },
          "totalRightValue": {
            "type": [
              "object",
              "null"
            ]
          },
          "instancesUsed": {
            "anyOf": [
              {
                "type": "integer",
                "description": "The total number of instances that have been used under a specified RightSpecification."
              },
              {
                "type": "null"
              }
            ]
          },
          "instancesAvailable": {
            "anyOf": [
              {
                "type": "integer",
                "description": "The total number of instances that are available for use under a specified RightSpecification."
              },
              {
                "type": "null"
              }
            ]
          },
          "totalInstances": {
            "anyOf": [
              {
                "type": "integer",
                "description": "The total number of instances that have been issued under a specified AssignedRight."
              },
              {
                "type": "null"
              }
            ]
          },
          "expiry": {
            "anyOf": [
              {
                "type": "string",
                "description": "The datetime when the specific AssignedRight expires, and is not longer available for use.",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "plannedUses": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "payments": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "object"
            }
          },
          "monetaryValue": {
            "type": [
              "object",
              "null"
            ]
          },
          "extensions": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Extensions"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "QuoteRightRequest": {
        "title": "QuoteRightRequest",
        "description": "class containing data elements required to request a quote for a new transaction",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "eligibility": {
                "$ref": "#/components/schemas/Eligibility"
              },
              "referencedRightSpecifications": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ReferencedRightSpecification"
                }
              },
              "periodStart": {
                "type": "string",
                "format": "date-time",
                "description": "request date/time for the start of a proposed new transactions"
              },
              "periodEnd": {
                "type": "string",
                "format": "date-time",
                "description": "request date/time for the end of a proposed new transactions"
              },
              "requestTime": {
                "type": "string",
                "format": "date-time",
                "description": "date/time at which the request was made"
              },
              "timePeriods": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Duration"
                },
                "description": "requested duration for the proposed new transaction"
              }
            },
            "required": [
              "periodStart",
              "requestTime"
            ]
          }
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "QuoteRightResponse": {
        "title": "QuoteRightResponse",
        "description": "class containing data to support response to request for quote for a new transaction",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "start": {
                "type": "string",
                "description": "date/time for the start of the proposed new transaction",
                "format": "date-time"
              },
              "end": {
                "type": "string",
                "description": "date/time for the end of the proposed new transaction",
                "format": "date-time"
              },
              "requestTime": {
                "type": "string",
                "description": "date/time at which the request for a quote was recorded/registered by the supplier",
                "format": "date-time"
              },
              "reason": {
                "$ref": "#/components/schemas/ResponseReasonEnum"
              },
              "quoteRequestId": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "responseTime": {
                "description": "date/time at which the response is made by the supplier",
                "format": "date-time",
                "type": "string"
              },
              "options": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Option"
                }
              }
            },
            "required": [
              "start",
              "end",
              "requestTime",
              "quoteRequestId",
              "responseTime"
            ]
          }
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "QuoteSessionExtensionRequest": {
        "title": "QuoteSessionExtensionRequest",
        "description": "class containing detail required to initiate a request for a quote to extend an existing session",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "requestedEndTime": {
                "type": "string",
                "description": "proposed date/time at which the proposed extended Session would end",
                "format": "date-time"
              },
              "requestTime": {
                "type": "string",
                "description": "reference date/time at which the request for a quote for a session extension is made",
                "format": "date-time"
              },
              "sessionId": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "suppliedCredential": {
                "$ref": "#/components/schemas/VersionedReference"
              }
            },
            "required": [
              "requestedEndTime",
              "requestTime",
              "sessionId",
              "suppliedCredential"
            ]
          }
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "QuoteSessionExtensionResponse": {
        "title": "QuoteSessionExtensionResponse",
        "description": "class containing data to support response to request for quote to extend an existing Session",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "requestSessionExtensionId": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "sessionId": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "requestTime": {
                "type": "string",
                "format": "date-time",
                "description": "date/time at which the request for a quote was recorded/registered by the supplier"
              },
              "responseTime": {
                "type": "string",
                "format": "date-time",
                "description": "date/time at which the response is made by the supplier"
              },
              "revisedEndTime": {
                "type": "string",
                "format": "date-time",
                "description": "Date/time of the revised session end time"
              },
              "reason": {
                "$ref": "#/components/schemas/QuoteRightResponseExtensionReasonEnum"
              }
            },
            "required": [
              "requestSessionExtensionId",
              "sessionId",
              "requestTime",
              "responseTime",
              "revisedEndTime"
            ]
          }
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "OccupancySnapshot": {
        "title": "OccupancySnapshot",
        "description": "Current occupancy for one HierarchyElement, computed from the APDS\noccupancy model (Supply + DemandTable) that natively lives in the Place\nhierarchy. A convenience READ (Part 5 §5.5): the Place payload remains\nthe source of truth; this answers \"how full is it right now\" without\npulling the hierarchy. Composed entirely of verbatim APDS occupancy\nclasses — APX adds no parallel occupancy datatypes.",
        "type": "object",
        "required": [
          "place",
          "computedAt"
        ],
        "properties": {
          "place": {
            "description": "The HierarchyElement (Place, Level, Area, …) this snapshot describes.",
            "$ref": "#/components/schemas/Reference"
          },
          "computedAt": {
            "description": "When this snapshot was computed.",
            "$ref": "#/components/schemas/DateTime"
          },
          "supply": {
            "description": "The element's supply (verbatim APDS Supply).",
            "$ref": "#/components/schemas/Supply"
          },
          "demand": {
            "description": "The latest area demand record (verbatim APDS DemandType — count,\npercentage, occupancyCalculation, recordDateTime).",
            "$ref": "#/components/schemas/DemandType"
          },
          "available": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "description": "Convenience derivation: supply.supplyQuantity − demand.count when\nboth are known; null when either side is unknown. Never negative —\noverfull facilities clamp to 0 (the demand record still shows the\ntrue count).",
            "examples": [
              59
            ]
          },
          "evCharging": {
            "type": "object",
            "description": "Part 23 §23.7 — charging availability under this\nelement, derived from ChargingPointStatus. Optional; present only\nwhen the implementation claims `apx-charging`.\nCounts are of charging points (APDS ElectricChargingEquipment),\nnot connectors. Absent counts are unknown, never guessed.",
            "properties": {
              "pointsTotal": {
                "type": "integer",
                "minimum": 0
              },
              "available": {
                "type": "integer",
                "minimum": 0,
                "description": "Points with `availability: available`."
              },
              "charging": {
                "type": "integer",
                "minimum": 0
              },
              "occupiedNotCharging": {
                "type": "integer",
                "minimum": 0,
                "description": "Points `occupied` (cable connected, no energy) — includes complete and idle sessions."
              },
              "blocked": {
                "type": "integer",
                "minimum": 0,
                "description": "Points whose bay holds a vehicle that is not plugged in, or is obstructed."
              },
              "inoperative": {
                "type": "integer",
                "minimum": 0,
                "description": "Points `inoperative` or `outOfOrder`."
              }
            }
          },
          "extensions": {
            "$ref": "#/components/schemas/Extensions"
          }
        },
        "examples": [
          {
            "place": {
              "id": "b1000000-0000-4000-8000-000000000001",
              "className": "Place"
            },
            "computedAt": "2026-08-25T17:45:00Z",
            "supply": {
              "supplyViewType": "spaceView",
              "supplyQuantity": 420
            },
            "demand": {
              "count": 361,
              "percentage": 85.9,
              "occupancyCalculation": "counted",
              "recordDateTime": "2026-08-25T17:44:30Z"
            },
            "available": 59
          }
        ]
      },
      "ApxEventSubscription": {
        "title": "ApxEventSubscription",
        "description": "Superset of the APDS 4.1 EventSubscription. A stock APDS client sending\nonly `{endpoint, topics}` (EventTypeEnum values) gets stock behavior;\nthe APX fields are additive and optional.",
        "type": "object",
        "required": [
          "topics"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Assigned at creation; used with DELETE/PATCH /webhooks/{id}."
          },
          "version": {
            "type": "integer",
            "minimum": 1
          },
          "endpoint": {
            "description": "Client endpoint URL for webhook deliveries (required for transport=webhook).",
            "$ref": "#/components/schemas/Url"
          },
          "topics": {
            "type": "array",
            "minItems": 1,
            "description": "APDS EventTypeEnum values (e.g. SessionCreated) and/or APX topics\n(apx.<domain>.<event>.vN) — freely mixed.",
            "items": {
              "type": "string"
            }
          },
          "transport": {
            "type": "string",
            "enum": [
              "webhook",
              "sse"
            ],
            "default": "webhook"
          },
          "filters": {
            "$ref": "#/components/schemas/SubscriptionFilters"
          },
          "secret": {
            "type": "string",
            "description": "HMAC signing secret (≥32 bytes of entropy, used as raw UTF-8 key\nmaterial; shorter is 400 `invalid-request`). For `transport:\nwebhook` only: server-generated when absent and returned EXACTLY\nONCE — in the Prefer=representation creation response. Never\npresent in GET/PATCH responses. An SSE subscription has nothing to\nsign and gets no secret (Part 8 §8.1)."
          },
          "secretRef": {
            "type": "string",
            "writeOnly": true,
            "description": "Identifier of an out-of-band-exchanged secret (Part 9 §9.4) —\nsupply INSTEAD of `secret` when key material must never transit\nthe API. Never a secret value itself."
          },
          "keyId": {
            "type": "string",
            "writeOnly": true,
            "description": "Identifier the client chooses for the key it supplies with `secret`\nor `secretRef`; deliveries signed with that key carry it in\n`APX-Key-Id`. Server-assigned when absent (Part 8 §8.1)."
          },
          "retireKeyIds": {
            "type": "array",
            "writeOnly": true,
            "description": "PATCH only: key ids to retire now, ending a rotation overlap early.\nRetiring the last active key is 400 `invalid-request`. Without it,\nthe server retires the superseded key 24 hours after the rotation\n(Part 8 §8.1).",
            "items": {
              "type": "string"
            }
          },
          "activeKeyIds": {
            "type": "array",
            "readOnly": true,
            "description": "Identifiers of the currently valid signing keys — two entries\nduring a rotation overlap window, matching deliveries' APX-Key-Id\nheader (Part 9 §9.4).",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "paused",
              "failed"
            ],
            "description": "`active` delivers; `paused` holds matching events for up to 24 hours\nand delivers them in order on resume (Part 8 §8.1); `failed` is\nserver-assigned when the retry schedule is exhausted (a client\nsetting it is 400 `invalid-request`). PATCH `status: active` to\nresume a paused or failed subscription."
          },
          "recordInfo": {
            "$ref": "#/components/schemas/RecordInfo"
          },
          "extensions": {
            "$ref": "#/components/schemas/Extensions"
          }
        }
      },
      "ApxEventSubscriptionPatch": {
        "title": "ApxEventSubscriptionPatch",
        "description": "Body of `PATCH /webhooks/{id}`: a JSON Merge Patch (RFC 7396) over\nApxEventSubscription. Members present replace the stored value, an\nexplicit `null` clears an optional member, and absent members are\nunchanged — so `{\"status\": \"active\"}` alone resumes a subscription.\n`version`, when given, is the precondition (Part 4 §4.2a); a stale one\nis 409 `version-conflict`. `id`, `activeKeyIds`, and `recordInfo` are\nserver-managed and cannot be patched.",
        "type": "object",
        "properties": {
          "version": {
            "type": "integer",
            "minimum": 1,
            "description": "The version the client last read."
          },
          "endpoint": {
            "$ref": "#/components/schemas/Url"
          },
          "topics": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string"
            }
          },
          "transport": {
            "type": "string",
            "enum": [
              "webhook",
              "sse"
            ]
          },
          "filters": {
            "description": "Replaces the stored filters; `{}` removes every filter.",
            "$ref": "#/components/schemas/SubscriptionFilters"
          },
          "secret": {
            "type": "string",
            "description": "A new signing secret; starts a rotation overlap (Part 8 §8.1)."
          },
          "secretRef": {
            "type": "string",
            "writeOnly": true
          },
          "keyId": {
            "type": "string",
            "writeOnly": true
          },
          "retireKeyIds": {
            "type": "array",
            "writeOnly": true,
            "items": {
              "type": "string"
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "paused",
              "failed"
            ],
            "description": "`active` or `paused` — the client-settable states. `failed` is\nserver-assigned; a PATCH setting it is 400 `invalid-request`."
          },
          "extensions": {
            "$ref": "#/components/schemas/Extensions"
          }
        }
      },
      "DeliveryRecord": {
        "title": "DeliveryRecord",
        "description": "One entry in a subscription's delivery ledger.",
        "type": "object",
        "required": [
          "deliveryId",
          "eventId",
          "attempts",
          "status",
          "time"
        ],
        "properties": {
          "deliveryId": {
            "type": "string",
            "format": "uuid"
          },
          "eventId": {
            "type": "string",
            "format": "uuid",
            "description": "EventEnvelope.id delivered (stable across retries)."
          },
          "attempts": {
            "type": "integer",
            "minimum": 1
          },
          "status": {
            "type": "string",
            "enum": [
              "delivered",
              "retrying",
              "failed"
            ]
          },
          "lastCode": {
            "type": "integer",
            "description": "Last HTTP status code received from the endpoint (0 = network error)."
          },
          "time": {
            "$ref": "#/components/schemas/DateTime"
          },
          "attemptHistory": {
            "type": "array",
            "description": "Every attempt so far, oldest first (Part 8 §8.3). `deliveryId` and\n`lastCode` above are those of the latest entry. The normative\nschedule makes at most 27 attempts per event.",
            "items": {
              "$ref": "#/components/schemas/DeliveryAttempt"
            }
          }
        },
        "examples": [
          {
            "deliveryId": "4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f7a",
            "eventId": "2a3b4c5d-6e7f-4890-9a0b-1c2d3e4f5a6b",
            "attempts": 1,
            "status": "delivered",
            "lastCode": 200,
            "time": "2026-08-06T18:17:42Z"
          }
        ]
      },
      "Command": {
        "title": "Command",
        "description": "A request for an operational action against a lane/device/place.\nPerishable (expiryTime), idempotent (Idempotency-Key), fully audited\n(immutable statusHistory).",
        "type": "object",
        "required": [
          "id",
          "version",
          "commandType",
          "target",
          "status"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "version": {
            "type": "integer",
            "minimum": 1,
            "readOnly": true
          },
          "commandType": {
            "type": "string",
            "description": "definedValue from apx-command-types (vendGate, lostTicket, pushRate, applyValidation, pushNegotiatedRate, matchTicket, …).",
            "examples": [
              "vendGate"
            ]
          },
          "target": {
            "description": "Reference to the target — SupplementalEquipment (device) or a\nVehicularAccess/Place HierarchyElement (lane/place scope).",
            "$ref": "#/components/schemas/Reference"
          },
          "parameters": {
            "type": "object",
            "description": "Command-type-specific parameters. Normative parameter schemas per\ncommandType are given in Part 6 (e.g. lostTicket.method,\npushRate.rateTable VersionedReference, applyValidation.ticket +\nprovider, displayMessage.message, setDeviceState.state,\npushNegotiatedRate.rateTable VersionedReference to a RateTable\nflagged negotiable, or pushNegotiatedRate.amount AmountInCurrency\n(any amount the agent states, where the host offers the\nnegotiatedAmounts feature), matchTicket.session + evidence,\nresetPassback/forceIn/forceOut.credential, courtesyExit.holder)."
          },
          "requestedBy": {
            "description": "The organisation requesting the action (defaults to the token's apx_org).",
            "$ref": "#/components/schemas/Reference"
          },
          "agent": {
            "type": "string",
            "description": "Opaque principal of the human or AI agent who initiated the command\n(mirrors SupportInteraction.agent, Part 17 §17.6). Distinct from\nrequestedBy (the organisation) and from approval.approvedBy (the\napprover). REQUIRED for pushNegotiatedRate and matchTicket (Part 6\n§6.6–6.7): who selected the rate, who made the match.",
            "examples": [
              "agent:j.okafor"
            ]
          },
          "agentType": {
            "type": "string",
            "enum": [
              "human",
              "ai"
            ],
            "description": "Whether `agent` is a person or an AI agent (mirrors SupportInteraction.agentType)."
          },
          "reason": {
            "type": "string",
            "description": "Free-text or code-list reason for the action (audit)."
          },
          "resolutionContext": {
            "description": "The ResolutionContext this command resolves (Part 17) — links the action into the interaction's audit chain.",
            "$ref": "#/components/schemas/Reference"
          },
          "resolutionContextVersion": {
            "type": "integer",
            "minimum": 1,
            "readOnly": true,
            "description": "The `version` of the ResolutionContext whose allowed actions this\nwrite was checked against, recorded by the server so the decision stays\nreconstructible after the context is recomputed or expires (Part 17 §17.2)."
          },
          "correlationId": {
            "type": "string",
            "format": "uuid",
            "description": "Correlation chain id (Part 17 §17.7) — one id connects call → context → command → events → support interaction."
          },
          "approval": {
            "$ref": "#/components/schemas/Approval"
          },
          "expiryTime": {
            "description": "Commands are perishable — MUST NOT be dispatched after this instant.",
            "$ref": "#/components/schemas/DateTime"
          },
          "priority": {
            "type": "string",
            "enum": [
              "normal",
              "high"
            ],
            "default": "normal"
          },
          "status": {
            "type": "string",
            "enum": [
              "received",
              "accepted",
              "rejected",
              "dispatched",
              "executing",
              "succeeded",
              "failed",
              "expired",
              "cancelled"
            ],
            "readOnly": true
          },
          "confirmationLevel": {
            "type": "string",
            "enum": [
              "accepted",
              "deviceAcknowledged",
              "physicallyConfirmed"
            ],
            "readOnly": true,
            "description": "How far success is actually confirmed (Part 6 §6.1): the command was\naccepted; the device acknowledged it; or the physical outcome was\nverified (e.g. gate-state sensor). Consumers — AI agents especially —\nMUST NOT claim a physical outcome (\"the gate is open\") beyond this\nlevel (\"the open command was accepted\")."
          },
          "statusHistory": {
            "type": "array",
            "description": "Immutable, append-only lifecycle audit — THE audit trail (Part 4 §4.2).",
            "items": {
              "type": "object",
              "required": [
                "state",
                "time",
                "actor"
              ],
              "properties": {
                "state": {
                  "type": "string"
                },
                "time": {
                  "$ref": "#/components/schemas/DateTime"
                },
                "actor": {
                  "type": "string"
                },
                "detail": {
                  "type": "string"
                }
              }
            }
          },
          "result": {
            "$ref": "#/components/schemas/CommandResult"
          },
          "recordInfo": {
            "$ref": "#/components/schemas/RecordInfo"
          },
          "extensions": {
            "$ref": "#/components/schemas/Extensions"
          }
        },
        "examples": [
          {
            "id": "5e8d7c6b-4a39-4281-b0f1-2e3d4c5b6a70",
            "version": 5,
            "commandType": "vendGate",
            "target": {
              "id": "b2000000-0000-4000-8000-000000000002",
              "className": "VehicularAccess"
            },
            "requestedBy": {
              "id": "a1000000-0000-4000-8000-000000000001",
              "className": "Organisation"
            },
            "reason": "customer assistance — cinema validation applied, remainder waived per policy",
            "expiryTime": "2026-08-06T18:16:00Z",
            "status": "succeeded",
            "statusHistory": [
              {
                "state": "received",
                "time": "2026-08-06T18:14:31Z",
                "actor": "apx-operator"
              },
              {
                "state": "accepted",
                "time": "2026-08-06T18:14:31Z",
                "actor": "lakeside-parcs"
              },
              {
                "state": "dispatched",
                "time": "2026-08-06T18:14:32Z",
                "actor": "lakeside-parcs"
              },
              {
                "state": "executing",
                "time": "2026-08-06T18:14:32Z",
                "actor": "gate-c1000000-0002"
              },
              {
                "state": "succeeded",
                "time": "2026-08-06T18:14:34Z",
                "actor": "gate-c1000000-0002",
                "detail": "barrier raised"
              }
            ]
          }
        ]
      },
      "ChangeFeedUpdateMode": {
        "title": "ChangeFeedUpdateMode",
        "type": "string",
        "const": "change",
        "description": "Present, with the value `change`, exactly when the page answers\n`mode=change` (Part 5 §5.2 rule 8); absent on an ordinary list page."
      },
      "ChangeFeedCursor": {
        "title": "ChangeFeedCursor",
        "type": "string",
        "description": "`mode=change` only. Opaque cursor resuming strictly after the last\nchange in this page (Part 5 §5.2 rules 1, 2, 5)."
      },
      "ChangeFeedTombstones": {
        "title": "ChangeFeedTombstones",
        "type": "array",
        "description": "`mode=change` only. Resources removed since the cursor (retention\npurge, Part 9 §9.6; release of a moved place, Part 18 §18.4), as APDS\nDeletedReferences carrying the APX resource's schema name as\n`className`. Retained for the cursor window (Part 5 §5.2 rule 4).",
        "items": {
          "$ref": "#/components/schemas/DeletedReference"
        }
      },
      "ChangeFeedGrantAdditions": {
        "title": "ChangeFeedGrantAdditions",
        "type": "array",
        "description": "`mode=change` only. Present on the first page served after the\ncredential's `apx_places` grant gained subtrees: the new subtree roots,\nwhich the client full-syncs with the route's `place` filter before\nrelying on the feed for them (Part 5 §5.2 rule 7).",
        "items": {
          "type": "string",
          "format": "uuid"
        }
      },
      "ChangeFeedNext": {
        "title": "ChangeFeedNext",
        "type": [
          "string",
          "null"
        ],
        "format": "uri-reference",
        "description": "`mode=change` only. Link to the next page when more changes are\nimmediately available (the same request with this page's `cursor`);\nnull otherwise."
      },
      "LaneStatus": {
        "title": "LaneStatus",
        "description": "The transaction context at a lane right now (the call-center\nscreen-pop). Composes APDS references and data; adds no\nparallel entities.",
        "type": "object",
        "required": [
          "lane"
        ],
        "properties": {
          "lane": {
            "$ref": "#/components/schemas/Reference"
          },
          "currentTicket": {
            "type": "object",
            "description": "The ticket/credential currently in the machine, if any.",
            "properties": {
              "ticketNumber": {
                "type": "string"
              },
              "session": {
                "$ref": "#/components/schemas/Reference"
              },
              "issuedTime": {
                "$ref": "#/components/schemas/DateTime"
              },
              "amountDue": {
                "$ref": "#/components/schemas/AmountInCurrency"
              },
              "paidInFull": {
                "type": "boolean"
              },
              "validations": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "provider": {
                      "$ref": "#/components/schemas/Reference"
                    },
                    "providerName": {
                      "type": "string",
                      "description": "Human-readable vendor name (from the place's ValidationProvider list)."
                    },
                    "validationType": {
                      "type": "string",
                      "description": "The provider's validation type at time of application."
                    },
                    "validationId": {
                      "type": "string",
                      "description": "Unique id of this applied validation — maps to APDS Segment.validationId."
                    },
                    "amountReduced": {
                      "description": "The ACTUAL value this validation removed from the amount due (dispute evidence).",
                      "$ref": "#/components/schemas/AmountInCurrency"
                    },
                    "appliedTime": {
                      "$ref": "#/components/schemas/DateTime"
                    }
                  }
                }
              },
              "lpr": {
                "type": "object",
                "description": "Latest plate read at this lane (APDS Observation-derived).",
                "properties": {
                  "plate": {
                    "type": "string"
                  },
                  "confidence": {
                    "type": "number"
                  },
                  "observation": {
                    "$ref": "#/components/schemas/Reference"
                  },
                  "imageLink": {
                    "$ref": "#/components/schemas/Url"
                  }
                }
              },
              "negotiatedRate": {
                "type": "object",
                "description": "The negotiated rate in effect on this ticket, if a\npushNegotiatedRate command that selected a RateTable succeeded\nfor it (Part 6 §6.6). Absent when the ticket prices from the\nlane's normal rate deck, and absent when the agent stated an\namount instead (see `negotiatedAmount`). At most one of\n`negotiatedRate` and `negotiatedAmount` is present: the latest\nsucceeded pushNegotiatedRate for the ticket decides which.",
                "required": [
                  "rateTable",
                  "command"
                ],
                "properties": {
                  "rateTable": {
                    "description": "The RateTable selected (VersionedReference — the exact version applied).",
                    "$ref": "#/components/schemas/VersionedReference"
                  },
                  "command": {
                    "description": "The pushNegotiatedRate Command that applied it — carries `agent`, `reason`, and the audit trail.",
                    "$ref": "#/components/schemas/Reference"
                  },
                  "agent": {
                    "type": "string",
                    "description": "The principal who selected the rate (copied from the command for the screen-pop)."
                  },
                  "policy": {
                    "description": "The table's `apds-ext:apx:ratepolicy@1.0` decoration as it stood when applied (its displayName is what the agent saw).",
                    "$ref": "#/components/schemas/RatePolicy"
                  }
                }
              },
              "negotiatedAmount": {
                "type": "object",
                "description": "The amount an agent stated for this ticket, if a\npushNegotiatedRate command carrying `parameters.amount` succeeded\nfor it (the negotiatedAmounts feature, Part 6 §6.3, §6.6). Absent\notherwise. It is what the ticket owes, not a discount. At most one\nof `negotiatedRate` and `negotiatedAmount` is present: the latest\nsucceeded pushNegotiatedRate for the ticket decides which.",
                "required": [
                  "amount",
                  "reason",
                  "agent",
                  "command"
                ],
                "properties": {
                  "amount": {
                    "description": "The amount stated, as the command's `parameters.amount`.",
                    "$ref": "#/components/schemas/AmountInCurrency"
                  },
                  "reason": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The command's `reason`, copied for the screen-pop."
                  },
                  "agent": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The principal who stated the amount (the command's `agent`), copied for the screen-pop."
                  },
                  "command": {
                    "description": "The pushNegotiatedRate Command that applied it — the audit trail.",
                    "$ref": "#/components/schemas/Reference"
                  }
                }
              },
              "matchedCommand": {
                "description": "When this ticket was bound to an open session by a matchTicket\ncommand (Part 6 §6.7), the Command that made the match — carries\n`agent`, `parameters.evidence`, and the audit trail. Absent for a\nticket physically inserted at the lane.",
                "$ref": "#/components/schemas/Reference"
              }
            }
          },
          "matchCandidates": {
            "type": "array",
            "description": "Open sessions at this lane's place that plausibly belong to the\nvehicle in the lane, best first (Part 6 §6.7). Computed when the lane\nhas no ticket in the machine, or whenever the caller passes a\n`plate`, `phone`, or `credential` lookup parameter. ADVISORY: the\nagent confirms with the driver; the server never binds a candidate\nwithout a matchTicket command.",
            "items": {
              "$ref": "#/components/schemas/MatchCandidate"
            }
          },
          "monthlyCredential": {
            "type": "object",
            "description": "Monthly-parker credential context at the lane, if presented.",
            "properties": {
              "credential": {
                "$ref": "#/components/schemas/Reference"
              },
              "cardNumber": {
                "type": "string"
              },
              "accessGranted": {
                "type": "boolean"
              },
              "denialReason": {
                "type": "string",
                "description": "When access is denied — definedValue from `apx-access-denial-reasons` or an implementer code list (Part 11), the same vocabulary as Part 21 access events.",
                "examples": [
                  "accountBalance"
                ]
              },
              "lastActivity": {
                "$ref": "#/components/schemas/DateTime"
              },
              "recentEvents": {
                "type": "array",
                "maxItems": 10,
                "description": "The last 10 activity events on this credential (trend view).",
                "items": {
                  "type": "object",
                  "properties": {
                    "time": {
                      "$ref": "#/components/schemas/DateTime"
                    },
                    "event": {
                      "type": "string"
                    },
                    "lane": {
                      "$ref": "#/components/schemas/Reference"
                    }
                  }
                }
              }
            }
          }
        },
        "examples": [
          {
            "lane": {
              "id": "b2000000-0000-4000-8000-000000000002",
              "className": "VehicularAccess"
            },
            "currentTicket": {
              "ticketNumber": "T-1001",
              "session": {
                "id": "f1000000-0000-4000-8000-000000000001",
                "className": "Session"
              },
              "issuedTime": "2026-08-06T08:02:11Z",
              "amountDue": {
                "currencyType": "USD",
                "currencyValue": 9
              },
              "paidInFull": false,
              "validations": [],
              "lpr": {
                "plate": "SYN-1234",
                "confidence": 0.97,
                "observation": {
                  "id": "f2000000-0000-4000-8000-000000000001",
                  "className": "Observation"
                },
                "imageLink": "https://api.lakeside-garage.example/lpr/f2000000.jpg"
              }
            },
            "monthlyCredential": {
              "credential": {
                "id": "e3000000-0000-4000-8000-000000000001",
                "className": "Credential"
              },
              "cardNumber": "MC-0777",
              "accessGranted": false,
              "denialReason": "account past due",
              "lastActivity": "2026-08-05T18:22:00Z",
              "recentEvents": [
                {
                  "time": "2026-08-05T18:22:00Z",
                  "event": "exit",
                  "lane": {
                    "id": "b2000000-0000-4000-8000-000000000002",
                    "className": "VehicularAccess"
                  }
                },
                {
                  "time": "2026-08-05T08:04:31Z",
                  "event": "entry",
                  "lane": {
                    "id": "b2000000-0000-4000-8000-000000000001",
                    "className": "VehicularAccess"
                  }
                }
              ]
            }
          }
        ]
      },
      "ValidationProvider": {
        "title": "ValidationProvider",
        "description": "A venue/organisation allowed to validate tickets at a place.",
        "type": "object",
        "required": [
          "provider"
        ],
        "properties": {
          "provider": {
            "$ref": "#/components/schemas/Reference"
          },
          "name": {
            "type": "string"
          },
          "program": {
            "description": "The ValidationProgram this row is derived from, when the server\nclaims `apx-validations` (Part 20) — additive; absent otherwise.",
            "$ref": "#/components/schemas/Reference"
          },
          "validationType": {
            "type": "string",
            "description": "e.g. flat discount, hours comped — implementer code list."
          },
          "benefit": {
            "type": "object",
            "description": "What the validation is WORTH — disclosed in the lookup so agents can\nanswer disputes. Exactly one of amount (money off), duration\n(comped time, priced at the applicable rate), or percentage\n(proportionate discount) applies.",
            "required": [
              "description"
            ],
            "properties": {
              "description": {
                "type": "string",
                "description": "Human-readable statement of the benefit.",
                "examples": [
                  "$3.00 off",
                  "First two hours comped"
                ]
              },
              "amount": {
                "description": "Fixed money off.",
                "$ref": "#/components/schemas/AmountInCurrency"
              },
              "duration": {
                "description": "Comped parking time (ISO 8601), valued at the applicable rate.",
                "$ref": "#/components/schemas/Duration"
              },
              "percentage": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "description": "Proportionate discount on the amount due, mirrored from a percentage ValidationProgram (Part 20 §20.1)."
              }
            }
          }
        },
        "examples": [
          {
            "provider": {
              "id": "a2000000-0000-4000-8000-000000000011",
              "className": "Organisation"
            },
            "name": "Lakeside Cinema",
            "validationType": "twoHoursComped",
            "benefit": {
              "description": "First two hours comped",
              "duration": "PT2H"
            }
          }
        ]
      },
      "DeviceStatus": {
        "title": "DeviceStatus",
        "description": "Live state overlay keyed by Reference to an APDS SupplementalEquipment —\nnever duplicates its descriptive fields. APDS 4.1 has no general\nequipment status list: its RefillPointStatusEnum (Data Dictionary\nA.3.53) covers refill points only and is absent from apds-api-4.1.yaml.\ndeviceState values come from the APX registry apx-device-states, which\nfollows that enumeration's style and shares its available, occupied,\ninoperative and unknown values. Attachable to\nAPDS payloads as apds-ext:apx:devicestatus@1.0.",
        "type": "object",
        "required": [
          "device",
          "deviceState"
        ],
        "properties": {
          "device": {
            "$ref": "#/components/schemas/Reference"
          },
          "deviceState": {
            "type": "string",
            "description": "definedValue from apx-device-states.",
            "examples": [
              "available"
            ]
          },
          "lastCommunication": {
            "description": "When the device last reported; an agent reads \"offline since\" from it (Part 6 §6.4).",
            "$ref": "#/components/schemas/DateTime"
          },
          "stateChangedTime": {
            "$ref": "#/components/schemas/DateTime"
          },
          "fault": {
            "type": "object",
            "description": "The current fault, when `deviceState` is `fault` or `inoperative` and the device reports one (Part 6 §6.4).",
            "required": [
              "code"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "The implementation's fault code, as the device reports it.",
                "examples": [
                  "E42"
                ]
              },
              "displayText": {
                "type": "string",
                "description": "What the device shows or what the technician reads for the code.",
                "examples": [
                  "Ticket transport jammed"
                ]
              },
              "since": {
                "$ref": "#/components/schemas/DateTime"
              }
            }
          },
          "consumables": {
            "type": "array",
            "description": "Supply levels the device reports (Part 6 §6.4). `low` or `empty` raises the Part 7 `consumableLow` alert.",
            "items": {
              "type": "object",
              "required": [
                "kind",
                "level"
              ],
              "properties": {
                "kind": {
                  "type": "string",
                  "enum": [
                    "tickets",
                    "receiptPaper",
                    "cash",
                    "coins"
                  ]
                },
                "level": {
                  "type": "string",
                  "enum": [
                    "ok",
                    "low",
                    "empty",
                    "unknown"
                  ]
                }
              }
            }
          },
          "maintenanceMode": {
            "type": "boolean",
            "description": "The device is under test or maintenance; calls and events from it are excluded from service figures (Part 6 §6.4)."
          },
          "extensions": {
            "$ref": "#/components/schemas/Extensions"
          }
        },
        "examples": [
          {
            "device": {
              "id": "c1000000-0000-4000-8000-000000000003",
              "className": "SupplementalEquipment"
            },
            "deviceState": "fault",
            "lastCommunication": "2026-08-06T18:16:55Z",
            "stateChangedTime": "2026-08-06T18:17:40Z"
          }
        ]
      },
      "EquipmentRecord": {
        "title": "EquipmentRecord",
        "description": "An APDS SupplementalEquipment as APX serves it (Part 26 §26.1): the\nstock APDS record plus its `extensions` container, which carries the\n`apds-ext:apx:equipment-detail@1.0` decoration (REQUIRED on every\nrecord this class serves), `apds-ext:apx:camera@1.0` on a camera, and\n`apds-ext:apx:external-ids@1.0` where other systems have ids for it.\nThe APDS record itself is never reshaped.",
        "allOf": [
          {
            "$ref": "#/components/schemas/SupplementalEquipment"
          },
          {
            "type": "object",
            "properties": {
              "extensions": {
                "$ref": "#/components/schemas/Extensions"
              }
            }
          }
        ]
      },
      "CommsPoint": {
        "title": "CommsPoint",
        "description": "Any way a parker reaches help from a lane or a location (Part 26\n§26.4): an intercom, an analog dialler, a posted phone number, a\nkiosk, a QR code, an app. A call platform matches an inbound contact\nto a comms point by the number it calls out as (`callerId`), the\nnumber it called (`phoneNumber`), or its own device id\n(`commsDeviceId`), and APX then answers with the lane, or with the\nlocation only when the comms point serves no single lane (a posted\nnumber shared by many lanes can never name the lane by itself).\n\nThese are the only members of APX that carry telephony values, and\nthe call platform supplies them; a PARCS implementation never has to\nhold, return or understand them (Part 17 §17.1). SIP usernames,\nrealms and passwords are deliberately left out: a username with its\nrealm is half of a line's login, they exist only for SIP devices, and\nthe call platform already maps its own SIP data to these ids. A SIP\npassword or any other credential MUST never appear in any member.",
        "allOf": [
          {
            "$ref": "#/components/schemas/ApxResourceCore"
          },
          {
            "type": "object",
            "required": [
              "type",
              "place"
            ],
            "anyOf": [
              {
                "required": [
                  "phoneNumber"
                ]
              },
              {
                "required": [
                  "callerId"
                ]
              },
              {
                "required": [
                  "commsDeviceId"
                ]
              }
            ],
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "readOnly": true
              },
              "version": {
                "type": "integer",
                "minimum": 1,
                "readOnly": true,
                "description": "Server-managed; bodies carry it only for a versioned replace (Part 4 §4.2a)."
              },
              "type": {
                "type": "string",
                "description": "definedValue from apx-comms-point-types.",
                "examples": [
                  "intercom"
                ]
              },
              "place": {
                "description": "The location it serves.",
                "$ref": "#/components/schemas/Reference"
              },
              "lane": {
                "description": "The VehicularAccess it serves, when it serves exactly one.",
                "$ref": "#/components/schemas/Reference"
              },
              "equipment": {
                "description": "The SupplementalEquipment it is, when it is inventoried hardware (role `intercom`, `analogDialer`, `emergencyPhone`).",
                "$ref": "#/components/schemas/Reference"
              },
              "serves": {
                "description": "The barrier an agent opens for this comms point, a gate or an access door, when there is one.",
                "$ref": "#/components/schemas/Reference"
              },
              "phoneNumber": {
                "type": "string",
                "pattern": "^\\+[1-9][0-9]{1,14}$",
                "description": "E.164. The number that is called when help is requested, dialled by the parker for a posted number, or by the intercom or dialler when its button is pushed.",
                "examples": [
                  "+15555550142"
                ]
              },
              "callerId": {
                "type": "string",
                "pattern": "^\\+[1-9][0-9]{1,14}$",
                "description": "E.164. The number the device calls out as.",
                "examples": [
                  "+15555550199"
                ]
              },
              "commsDeviceId": {
                "type": "string",
                "description": "The id the call platform uses for this comms point when it identifies it by neither caller id nor dialled number.",
                "examples": [
                  "dev-51cc-ae16"
                ]
              },
              "coverage": {
                "type": "array",
                "description": "When the comms point is answered and in which languages. The answering call centre itself is not named.",
                "items": {
                  "type": "object",
                  "properties": {
                    "period": {
                      "$ref": "#/components/schemas/Period"
                    },
                    "languages": {
                      "type": "array",
                      "description": "BCP 47 language tags.",
                      "items": {
                        "type": "string"
                      },
                      "examples": [
                        [
                          "en",
                          "es"
                        ]
                      ]
                    }
                  }
                }
              }
            }
          }
        ],
        "examples": [
          {
            "id": "c3000000-0000-4000-8000-000000000001",
            "version": 1,
            "type": "intercom",
            "place": {
              "id": "b1000000-0000-4000-8000-000000000001",
              "className": "Place"
            },
            "lane": {
              "id": "b2000000-0000-4000-8000-000000000002",
              "className": "VehicularAccess"
            },
            "equipment": {
              "id": "c2000000-0000-4000-8000-000000000023",
              "className": "SupplementalEquipment"
            },
            "serves": {
              "id": "c2000000-0000-4000-8000-000000000021",
              "className": "SupplementalEquipment"
            },
            "callerId": "+15555550199",
            "commsDeviceId": "dev-51cc-ae16",
            "coverage": [
              {
                "languages": [
                  "en",
                  "es"
                ]
              }
            ]
          }
        ]
      },
      "EventEnvelope": {
        "title": "EventEnvelope",
        "description": "The single envelope for all APX asynchronous delivery (webhooks and SSE).\nAttribute names are aligned with CloudEvents 1.0 (informative mapping in\nthe standard's annex); `subject` carries an APDS Reference so events bind\nto APDS/APX entities natively.",
        "type": "object",
        "required": [
          "id",
          "type",
          "source",
          "time",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Unique event id (delivery-stable; retries reuse it)."
          },
          "type": {
            "type": "string",
            "description": "Event topic. Either an APX topic (`apx.<domain>.<event>.vN`) or an\nAPDS EventTypeEnum value (e.g. `SessionCreated`).",
            "examples": [
              "apx.alert.raised.v1",
              "SessionCreated"
            ]
          },
          "source": {
            "type": "string",
            "format": "uri-reference",
            "description": "Identifies the publishing implementation/site."
          },
          "time": {
            "$ref": "#/components/schemas/DateTime"
          },
          "subject": {
            "description": "The entity this event is about.",
            "$ref": "#/components/schemas/Reference"
          },
          "dataschema": {
            "type": "string",
            "format": "uri",
            "description": "Optional URI of the schema that `data` validates against."
          },
          "data": {
            "description": "Event payload. For APDS EventTypeEnum topics this is the APDS EventData shape.",
            "type": "object"
          },
          "extensions": {
            "$ref": "#/components/schemas/Extensions"
          }
        },
        "examples": [
          {
            "id": "3b4c5d6e-7f8a-4b9c-8d0e-1f2a3b4c5d6e",
            "type": "apx.reservation.noshow.v1",
            "source": "https://api.lakeside-garage.example/v1",
            "subject": {
              "id": "e2000000-0000-4000-8000-000000000003",
              "className": "AssignedRight"
            },
            "time": "2026-08-14T19:30:00Z",
            "data": {
              "reservation": {
                "id": "e2000000-0000-4000-8000-000000000003",
                "className": "AssignedRight"
              },
              "reservationState": "noShow",
              "plannedStart": "2026-08-14T18:00:00Z"
            }
          }
        ]
      },
      "EventTypeEnum": {
        "title": "EventTypeEnum",
        "type": "string",
        "enum": [
          "AssignedRightCreated",
          "AssignedRightUpdated",
          "AssignedRightDeleted",
          "SessionCreated",
          "SessionUpdated",
          "SessionDeleted",
          "PlaceCreated",
          "PlaceUpdated",
          "PlaceDeleted",
          "RightSpecificationCreated",
          "RightSpecificationUpdated",
          "RightSpecificationDeleted",
          "RateCreated",
          "RateUpdated",
          "RateDeleted",
          "OrganisationCreated",
          "OrganisationUpdated",
          "OrganisationDeleted"
        ]
      },
      "EventData": {
        "title": "EventData",
        "description": "data of created / updated / deleted record",
        "type": "object",
        "oneOf": [
          {
            "$ref": "#/components/schemas/HierarchyElement"
          },
          {
            "$ref": "#/components/schemas/RightSpecification"
          },
          {
            "$ref": "#/components/schemas/RateTable"
          },
          {
            "$ref": "#/components/schemas/AssignedRight"
          },
          {
            "$ref": "#/components/schemas/Session"
          },
          {
            "$ref": "#/components/schemas/Contact"
          }
        ]
      },
      "SubscriptionFailure": {
        "title": "SubscriptionFailure",
        "description": "Data of `apx.subscription.failed.v1` (Part 8 §8.3): which subscription\nstopped, where it was delivering, and the attempt that exhausted the\nschedule. The envelope `subject` references the same subscription.",
        "type": "object",
        "required": [
          "subscription",
          "failedTime"
        ],
        "properties": {
          "subscription": {
            "description": "The subscription (`className` `ApxEventSubscription`).",
            "$ref": "#/components/schemas/Reference"
          },
          "endpoint": {
            "description": "The endpoint that stopped answering (webhook transport).",
            "$ref": "#/components/schemas/Url"
          },
          "failedTime": {
            "description": "When the subscription entered `failed`.",
            "$ref": "#/components/schemas/DateTime"
          },
          "firstFailedEventId": {
            "type": "string",
            "format": "uuid",
            "description": "EventEnvelope.id of the first event that could not be delivered."
          },
          "attempts": {
            "type": "integer",
            "minimum": 1,
            "description": "Attempts made for that event before the schedule was exhausted."
          },
          "lastCode": {
            "type": "integer",
            "description": "The last HTTP status code received (0 = network error)."
          }
        }
      },
      "ReservationSummary": {
        "title": "ReservationSummary",
        "description": "Compact view of one past/current reservation, for customer-history\nlookups. Also the `data` of `apx.reservation.noshow.v1` (Part 14\n§14.1 step 6).",
        "type": "object",
        "required": [
          "reservation"
        ],
        "properties": {
          "reservation": {
            "$ref": "#/components/schemas/Reference"
          },
          "reservationState": {
            "type": "string",
            "enum": [
              "confirmed",
              "amended",
              "cancelled",
              "checkedIn",
              "noShow"
            ]
          },
          "plannedStart": {
            "$ref": "#/components/schemas/DateTime"
          },
          "plannedEnd": {
            "$ref": "#/components/schemas/DateTime"
          },
          "noShowAfter": {
            "description": "When a reservation not yet checked in lapses to `noShow` (see ReservationExtension.noShowAfter).",
            "$ref": "#/components/schemas/DateTime"
          },
          "issuer": {
            "type": "string",
            "description": "Who sold the reservation, so a code that several sellers could have issued is read against the right one (Part 14 §14.1, Part 17 §17.2). An operator code or the seller's domain.",
            "examples": [
              "spothero.example"
            ]
          },
          "amountPaid": {
            "description": "What the customer prepaid, so an agent at the lane sees it without a payment lookup.",
            "$ref": "#/components/schemas/AmountInCurrency"
          }
        },
        "examples": [
          {
            "reservation": {
              "id": "e2000000-0000-4000-8000-000000000002",
              "className": "AssignedRight"
            },
            "reservationState": "checkedIn",
            "plannedStart": "2026-08-14T18:00:00Z",
            "plannedEnd": "2026-08-15T01:00:00Z"
          }
        ]
      },
      "Extensions": {
        "title": "Extensions",
        "description": "The official APDS extension container (Use Case Document §C.2.5).\nKeys MUST follow `apds-ext:<namespace>:<class>@<major>.<minor>`.\nImplementations MUST preserve unknown extension keys on round-trip\n(tolerant reader, faithful writer). An APX decoration key, wherever\nthe container appears, MUST carry a value valid against that\ndecoration's schema (Part 4 §4.3); other keys are any object.",
        "type": "object",
        "propertyNames": {
          "pattern": "^apds-ext:[a-z0-9-]+:[a-z0-9-]+@[0-9]+\\.[0-9]+$"
        },
        "properties": {
          "apds-ext:apx:devicestatus@1.0": {
            "$ref": "#/components/schemas/DeviceStatus"
          },
          "apds-ext:apx:ratepolicy@1.0": {
            "$ref": "#/components/schemas/RatePolicy"
          },
          "apds-ext:apx:lpr-read@1.0": {
            "$ref": "#/components/schemas/LprReadDetail"
          },
          "apds-ext:apx:lane-cameras@1.0": {
            "$ref": "#/components/schemas/LaneCameras"
          },
          "apds-ext:apx:reservation@1.0": {
            "$ref": "#/components/schemas/ReservationExtension"
          },
          "apds-ext:apx:permit@1.0": {
            "$ref": "#/components/schemas/PermitExtension"
          },
          "apds-ext:apx:permit@1.1": {
            "$ref": "#/components/schemas/PermitExtension"
          },
          "apds-ext:apx:session-detail@1.0": {
            "$ref": "#/components/schemas/SessionDetail"
          },
          "apds-ext:apx:match-evidence@1.0": {
            "$ref": "#/components/schemas/MatchEvidence"
          },
          "apds-ext:apx:stay-compliance@1.0": {
            "$ref": "#/components/schemas/StayCompliance"
          },
          "apds-ext:apx:violation-source@1.0": {
            "$ref": "#/components/schemas/ViolationSource"
          },
          "apds-ext:apx:payment-detail@1.0": {
            "$ref": "#/components/schemas/PaymentDetail"
          },
          "apds-ext:apx:credential-digest@1.0": {
            "$ref": "#/components/schemas/CredentialDigest"
          },
          "apds-ext:apx:equipment-detail@1.0": {
            "$ref": "#/components/schemas/EquipmentDetail"
          },
          "apds-ext:apx:camera@1.0": {
            "$ref": "#/components/schemas/CameraDetail"
          },
          "apds-ext:apx:external-ids@1.0": {
            "$ref": "#/components/schemas/ExternalIdentifiers"
          },
          "apds-ext:apx:place-operations@1.0": {
            "$ref": "#/components/schemas/PlaceOperations"
          }
        },
        "additionalProperties": {
          "type": "object"
        }
      },
      "PaginatedList": {
        "title": "PaginatedList",
        "description": "Paginated list of results for listing API endpoints.",
        "type": "object",
        "x-package": "api",
        "properties": {
          "meta": {
            "$ref": "#/components/schemas/PaginatedListMeta"
          },
          "deletedReferences": {
            "type": "array",
            "description": "This attribute will returned when the `modified_since` query parameter is used. It will contain references to deleted resources since the provided instant, that would have otherwise been included in the dataset (either at the top-level or as associated objects).",
            "items": {
              "$ref": "#/components/schemas/DeletedReference"
            }
          }
        },
        "required": [
          "meta"
        ]
      },
      "DateTime": {
        "title": "DateTime",
        "description": "ISO-8601 format definition of a date and time - format YYYY-MM-DDTHH:MM:SSZ.",
        "type": "string",
        "x-package": "common",
        "format": "date-time",
        "examples": [
          "2024-03-09T15:35:08Z"
        ]
      },
      "Reference": {
        "title": "Reference",
        "description": "Represents a reference to an identifiable object where the identifier is unique. It is composed of an unique identifier and a string identifying the class of the referenced object. If multiple versions exists for the object, the latest version is considered.",
        "type": "object",
        "x-package": "common",
        "minProperties": 1,
        "maxProperties": 1,
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique identifier within the given class.",
            "examples": [
              "98bccb9c-2ffe-4ca4-8e7f-eb1ae4439c29"
            ]
          },
          "className": {
            "type": "string",
            "description": "The class name of the referenced object in PascalCase.",
            "minLength": 1,
            "examples": [
              "UKNumberPlate"
            ]
          }
        },
        "required": [
          "id",
          "className"
        ]
      },
      "ChangePayload": {
        "title": "ChangePayload",
        "description": "A change-mode payload for any native APDS entity class (Part 5 §5.1):\nthe entity's identity plus only the members that changed. An absent\nmember is unchanged; an explicit `null` clears it. Nested objects that\ncarry their own `id` (a Session segment, say) follow the same rule.\n\nThis schema checks the envelope only (identity present, any member may\nbe null). Each member present is still validated by the server against\nthe class's native property schema, and a member the class does not\ndefine is refused with 400 (Part 5 §5.1a). It is the request schema of\na native `PUT` sent with `APX-Update-Mode: change`, and the shape of\nevery `ChangeFeedPage` item.",
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "The entity's identifier (APDS VersionedIdentity.id)."
          },
          "version": {
            "type": "integer",
            "minimum": 1,
            "description": "On a write, the version the client last read (the precondition,\nPart 4 §4.2a); on a feed item, the version after the change."
          }
        },
        "additionalProperties": true
      },
      "DeletedReference": {
        "title": "DeletedReference",
        "description": "A reference to a deleted identifiable managed object where the identifier is unique. It is described by a string identifying the class of the referenced object (key name) with a unique string identifier as its value, and the deletion instant.",
        "type": "object",
        "x-package": "api",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique id of the deleted object."
          },
          "className": {
            "type": "string",
            "description": "The class name of the deleted object.",
            "pattern": "^([A-Z][a-z0-9]+)+"
          },
          "deleteTimestamp": {
            "description": "The instant when the reference was deleted.",
            "$ref": "#/components/schemas/DateTime"
          }
        },
        "required": [
          "id",
          "className",
          "deleteTimestamp"
        ]
      },
      "Campus": {
        "title": "Campus",
        "description": "The highest level in the hierarchy, it typically defines a large facility (such as a university campus, or an airport), or a large geographic zone (such as a city or a town), which may contain numerous Places. A Campus combines and encompasses a number of Places that can be logically reported together.",
        "type": "object",
        "x-package": "place",
        "allOf": [
          {
            "$ref": "#/components/schemas/HierarchyElement"
          }
        ]
      },
      "Place": {
        "title": "Place",
        "description": "A place or location used for parking, loading, unloading, standing, or some other mobility or transport related activity. Place typically identifies a parking structure, surface lot or on street parking zone",
        "type": "object",
        "x-package": "place",
        "allOf": [
          {
            "$ref": "#/components/schemas/HierarchyElement"
          },
          {
            "$ref": "#/components/schemas/PlaceInformation"
          },
          {
            "type": "object",
            "properties": {
              "timeZone": {
                "type": "string",
                "description": "IANA time-zone (see https://www.iana.org/time-zones)"
              },
              "placeStreetAddress": {
                "$ref": "#/components/schemas/Address"
              },
              "placeBoundedZone": {
                "type": "array",
                "description": "Place bounded zone",
                "items": {
                  "$ref": "#/components/schemas/GeoJsonObject"
                }
              },
              "indicativePointLocation": {
                "type": "array",
                "description": "Indicative place point location",
                "items": {
                  "$ref": "#/components/schemas/GeoJsonObject"
                }
              }
            },
            "required": [
              "timeZone"
            ]
          }
        ]
      },
      "Space": {
        "title": "Space",
        "description": "A single space for parking, usually designed for one vehicle, which may, but not necessarily, be denoted by painted or other road surface marker.",
        "type": "object",
        "x-package": "place",
        "allOf": [
          {
            "$ref": "#/components/schemas/HierarchyElement"
          },
          {
            "type": "object",
            "properties": {
              "spaceId": {
                "$ref": "#/components/schemas/Reference"
              },
              "detection": {
                "$ref": "#/components/schemas/ParkingSpaceOccupancyDetectionEnum"
              },
              "indicativePointLocation": {
                "$ref": "#/components/schemas/GeoJsonObject"
              },
              "spaceBoundedZone": {
                "$ref": "#/components/schemas/GeoJsonObject"
              },
              "spaceDimension": {
                "$ref": "#/components/schemas/SpaceDimension"
              },
              "spaceMaximumDims": {
                "$ref": "#/components/schemas/MaximumDimensions"
              },
              "operatingRestrictions": {
                "type": "array",
                "description": "Operating restrictions for space",
                "items": {
                  "$ref": "#/components/schemas/OperatingRestrictions"
                }
              }
            },
            "required": [
              "spaceId"
            ]
          }
        ]
      },
      "VersionedIdentity": {
        "title": "VersionedIdentity",
        "description": "Represents an object unique identifier associated with a version that can evolve over time.",
        "type": "object",
        "x-package": "common",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the object.",
            "minLength": 1,
            "examples": [
              "98bccb9c-2ffe-4ca4-8e7f-eb1ae4439c29"
            ]
          },
          "version": {
            "type": "integer",
            "description": "Positive integer representing the object version.",
            "minimum": 1,
            "examples": [
              1
            ]
          }
        },
        "required": [
          "id",
          "version"
        ]
      },
      "HierarchyElementTypeEnum": {
        "title": "HierarchyElementTypeEnum",
        "description": "Defines the supported lists of types of parking hierarchy elements permissible\n* campus : a data structure holding information about a large, often ill-defined area, which may contain many parking structures.\n* identifiedArea : a data structure holding information about a coherent feature, such as a set of parking spaces that all share the same characteristics.\n* place : a data structure holding information about a single identifiable parking place.\n* space : a data structure holding information about a single space for parking, usually designed for one vehicle, which may be denoted by painted or other road surface markers.\n* subplaceElement : a sub-division of a place for the convenience of the operator that may be used for parking related or other purposes.\n* specificArea : a specialisation of an identified area that denotes a specific geographic area in a place that has a common physical infrastructure purpose and common characteristics.\n* vehicularAccess : a specialisation of an identified area defining vehicular access areas.\n* electricChargingEquipment : a specialisation of a supplemental facility for electric charging areas.\n* supplementalEquipment : a specialisation of a supplemental facility which is available on some site, for example on a rest area.\n* supplementalServiceFacility : a specialisation of a supplemental facility to specify the type and number of available sub-facilities, for example 20 restaurants.",
        "type": "string",
        "x-package": "place.enums",
        "enum": [
          "campus",
          "identifiedArea",
          "place",
          "space",
          "subplaceElement",
          "specificArea",
          "vehicularAccess",
          "electricChargingEquipment",
          "supplementalEquipment",
          "supplementalServiceFacility"
        ]
      },
      "MultilingualString": {
        "title": "MultilingualString",
        "description": "Array of SpecificLanguageString objects representing multi language text.",
        "type": "array",
        "minItems": 1,
        "x-package": "common",
        "items": {
          "$ref": "#/components/schemas/SpecificLanguageString"
        }
      },
      "VersionedReference": {
        "title": "VersionedReference",
        "description": "Represents a reference to an identifiable object where the combination of the identifier and version is unique. It is composed of an unique identifier, a version and potentially a string identifying the class of the referenced object.",
        "type": "object",
        "x-package": "common",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the object.",
            "minLength": 1,
            "examples": [
              "98bccb9c-2ffe-4ca4-8e7f-eb1ae4439c29"
            ]
          },
          "version": {
            "type": "integer",
            "description": "Positive integer representing the object version.",
            "minimum": 1,
            "examples": [
              1
            ]
          },
          "className": {
            "type": "string",
            "description": "Class name of the referenced object.",
            "pattern": "^[A-Z]+[A-Za-z0-9]+",
            "examples": [
              "UKNumberPlate"
            ]
          }
        },
        "required": [
          "id",
          "version"
        ]
      },
      "HierarchyElementRecord": {
        "title": "HierarchyElementRecord",
        "description": "A collection of information concerning the creation of a hierarchy element",
        "type": "object",
        "x-package": "place",
        "properties": {
          "creationTime": {
            "description": "Date/time that this version of the place facility record was created.",
            "$ref": "#/components/schemas/DateTime"
          },
          "creator": {
            "$ref": "#/components/schemas/VersionedReference"
          },
          "creatorEmail": {
            "$ref": "#/components/schemas/EMail"
          }
        },
        "required": [
          "creationTime"
        ]
      },
      "HierarchyElementReference": {
        "title": "HierarchyElementReference",
        "description": "A class providing a unique reference identifier for a discrete part of the parking place hierarchy. This can indicate a campus, parking place, hierarchy element, identifiable area or space.",
        "type": "object",
        "x-package": "place",
        "properties": {
          "elementId": {
            "$ref": "#/components/schemas/VersionedReference"
          },
          "demandTable": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DemandTable"
            }
          },
          "supply": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Supply"
            }
          }
        },
        "required": [
          "elementId"
        ]
      },
      "OccupancyLevel": {
        "title": "OccupancyLevel",
        "description": "Defines an occupancy level as specified by the data supplier.",
        "type": "object",
        "x-package": "place.occupancy",
        "properties": {
          "occupancyIndicator": {
            "$ref": "#/components/schemas/ReferencedCodeListEntry"
          }
        },
        "required": [
          "occupancyIndicator"
        ]
      },
      "ResponsibilityRoleAssignment": {
        "title": "ResponsibilityRoleAssignment",
        "description": "describes roles and responsibilites for a particular location (e.g. operator)",
        "type": "object",
        "x-package": "contact",
        "properties": {
          "type": {
            "description": "the type of contact/organisation (e.g. operator)",
            "$ref": "#/components/schemas/ContactPointTypeEnum"
          },
          "contactPoints": {
            "description": "list with contact details",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ContactPoint"
            }
          }
        }
      },
      "ResponseStatusEnum": {
        "title": "ResponseStatusEnum",
        "description": "Type of status for a Response.\n* ok : OK\n* error : An error occurred",
        "type": "string",
        "x-package": "api.enums",
        "enum": [
          "ok",
          "error"
        ]
      },
      "ParkingSpaceOccupancyDetectionEnum": {
        "title": "ParkingSpaceOccupancyDetectionEnum",
        "description": "A list of supported methods for detection of occupancy by a vehicle in a parking space.\n* anpr : Automated License Plate Recognition information is tracked for inbound and outbound traffic. The difference between in and out counts enables an occupancy count.\n* imageAnalytics : Image analytics are used to evaluate a picture with known parking space geography and computer vision is used to determine occupancy at a point in time.\n* spaceSensor : A sensor in each space detects the presence of a vehicle.\n* userDeclaration : User self-declared, where the user enters a space identifier and/or vehicle registration number, typically at the start of a parking session.\n* videoAnalytics : Video analytics are used to evaluate a video stream to identify objects (vehicles) and direction of travel. The difference between the inbound objects and outbound objects determines occupancy.\n* videoSpace : Video analytics or ANPR technologies are used to evaluate a video stream with known space geometry to identify objects (vehicles or license plates) occupying specific spaces.\n* visual : Operator/owner makes periodic visual counts of the facility.",
        "type": "string",
        "x-package": "place.occupancy.enums",
        "enum": [
          "anpr",
          "imageAnalytics",
          "spaceSensor",
          "userDeclaration",
          "videoAnalytics",
          "videoSpace",
          "visual"
        ]
      },
      "ObservationTypeEnum": {
        "type": "string",
        "title": "ObservationTypeEnum",
        "description": "A list of the supported observation types.\n\n* `anpr`: Automatic vehicle license plate recognition\n* `chalk`: Chalk-mark observation or similar\n* `rfTransponder`: Rf transponder radio frequency transponder device, for toll tag or similar radio based devices\n* `scanner`: Handheld or fixed scanning device (optical)\n* `visual`: Visual (human) observation",
        "enum": [
          "anpr",
          "chalk",
          "rfTransponder",
          "scanner",
          "visual"
        ],
        "x-tags": [
          "enumeration"
        ]
      },
      "CredentialTypeEnum": {
        "title": "CredentialTypeEnum",
        "description": "* barcode : barcode or QR digital print pattern, held on any physical media.\n* bluetooth : specific bluetooth or BLE identification chip used to associate a BLE receiver to a specific user.  Used for both one time and permit uses.\n* eticket : digital equivalent of a paper ticket, often presentable via smartphone or similar device for control.\n* hangtag : visible, often removable, credential indicator, with visible markings\n* licensePlate : fixed plate, in a defined format, used to identify a specific vehicle- Normally a permanent fixture.\n* permit : issued credential, often in the form of an adhesive label, often placed on the windscreen, credential indicator, with visible markings\n* qrCode : quick Reference (QR) code\n* rfid : specific RF identification associated to an RFID-related account.  Used for permit uses.\n* ticket : typically issued paper with printed details, often with magnetic strips; typically single use disposable.\n* electronicID : an identifier transmitted by electronic means\n* ticketcoupon : a visible printed or written paper-based ticket or coupon carrying an identifiable credential.\n* vehicleplate : a fixed identifier (registration plate) visible and fixed to a vehicle.",
        "type": "string",
        "x-package": "right_specification.enums",
        "enum": [
          "barcode",
          "bluetooth",
          "eticket",
          "hangtag",
          "licensePlate",
          "permit",
          "qrCode",
          "rfid",
          "ticket",
          "electronicID",
          "ticketcoupon",
          "vehicleplate"
        ]
      },
      "Location": {
        "title": "Location",
        "type": "object",
        "description": "Positional information relating to an observation for both the observation target ('observed') and the source ('observer').",
        "properties": {
          "observedLocation": {
            "$ref": "#/components/schemas/GeoJsonObject"
          },
          "observedLocationTextual": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "observerLocation": {
            "$ref": "#/components/schemas/GeoJsonObject"
          }
        },
        "required": [
          "observerLocation"
        ],
        "x-tags": [
          "observation"
        ]
      },
      "Image": {
        "title": "Image",
        "description": "Class containing information relating to still or moving image observation evidence or a reference (link) to such observation evidence.",
        "properties": {
          "id": {
            "type": "string",
            "description": "Reference identifier to a specific image."
          },
          "image": {
            "type": "string",
            "description": "Base64 File or binary object containing a still or moving image."
          },
          "imageLink": {
            "$ref": "#/components/schemas/Url"
          },
          "imageType": {
            "$ref": "#/components/schemas/ImageTypeEnum"
          },
          "cameraID": {
            "type": "string",
            "description": "identification code for the camera device"
          },
          "cameraDistance": {
            "type": "number",
            "format": "float",
            "description": "recorded distance in metres between the camera and observation"
          }
        },
        "required": [
          "id"
        ],
        "x-tags": [
          "observation"
        ]
      },
      "VehicleAncillaryIdentification": {
        "title": "VehicleAncillaryIdentification",
        "description": "Information relating to a specific vehicle.",
        "type": "object",
        "x-package": "common",
        "properties": {
          "country": {
            "$ref": "#/components/schemas/CountryCode"
          },
          "color": {
            "type": "string",
            "description": "The predominant colour of the vehicle."
          },
          "description": {
            "type": "string",
            "description": "Free-text description of other distinguishing features of the vehicle."
          },
          "make": {
            "type": "string",
            "description": "The branded manufacturer's name for the vehicle (e.g. Ford, Audi, BMW, Mazda)."
          },
          "model": {
            "type": "string",
            "description": "The model name for the vehicle type (e.g. Ford Mondeo, Citroen C-Zero)."
          },
          "stateProvince": {
            "type": "string",
            "description": "State, province or other administrative subdivision where a nation state permits registration of vehicles on a lower administrative level basis."
          }
        },
        "required": [
          "country"
        ]
      },
      "Confidence": {
        "title": "Confidence",
        "description": "overall confidence of the observation measurement",
        "type": "object",
        "properties": {
          "overallConfidence": {
            "description": "overall confidence of the observation measurement - can be vendor-specific but rescaled to a value between 0 and 1, with 1 being greatest confidence",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 1
          }
        }
      },
      "CharacterConfidence": {
        "title": "CharacterConfidence",
        "description": "confidence of observation measurement",
        "type": "object",
        "properties": {
          "confidence": {
            "description": "confidence of the observation measurement for a specific indexed character - can be vendor-specific but rescaled to a value between 0 and 1, with 1 being greatest confidence",
            "type": "number",
            "format": "float",
            "minimum": 0,
            "maximum": 1
          },
          "index": {
            "description": "index reference to a specific character within an observed sequence",
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "confidence",
          "index"
        ]
      },
      "Contact": {
        "title": "Contact",
        "description": "Address and contact information about some person, service or the parking site, provided in detail or via reference.",
        "type": "object",
        "x-package": "contact",
        "discriminator": {
          "propertyName": "contactType",
          "mapping": {
            "contactPoint": "#/components/schemas/ContactPoint",
            "contactByReference": "#/components/schemas/ContactByReference"
          }
        },
        "properties": {
          "contactType": {
            "$ref": "#/components/schemas/ContactTypeEnum"
          },
          "contactNotDefined": {
            "type": "boolean",
            "description": "When true, there is currently no contact defined for the selected role and/or timeframe. Don't use the specialisations in this case."
          },
          "contactUnknown": {
            "type": "boolean",
            "description": "When true, the contact for the selected role and/or timeframe is unknown. Don't use the specialisations in this case."
          },
          "shareWithPublic": {
            "type": "boolean",
            "description": "When true, the details of this contact may be shared with the public. If false these contacts details are for internal purposes only."
          },
          "validityOfContact": {
            "$ref": "#/components/schemas/OverallPeriod"
          }
        },
        "required": [
          "contactType"
        ]
      },
      "Address": {
        "title": "Address",
        "description": "A street oriented addressing structure supporting delivery",
        "type": "object",
        "x-package": "place.characteristics",
        "properties": {
          "countryCode": {
            "$ref": "#/components/schemas/CountryCode"
          },
          "city": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "postCode": {
            "type": "string",
            "description": "Postcode or postal code for the address."
          },
          "addressLines": {
            "type": "array",
            "description": "Address lines",
            "items": {
              "$ref": "#/components/schemas/AddressLine"
            }
          }
        }
      },
      "ContactDetails": {
        "title": "ContactDetails",
        "description": "Details for some person, service or the parking site itself, especially address information.",
        "type": "object",
        "x-package": "contact",
        "properties": {
          "available24hours": {
            "type": "boolean",
            "description": "Specifies if the availability is 24 hours a day. If true available 24 hours. If omitted, this information is unknown or heterogeneous."
          },
          "contactDetailsFax": {
            "type": "string",
            "description": "Fax of the contact."
          },
          "contactDetailsLanguage": {
            "type": "array",
            "description": "Language(s) this contact is able to speak resp. understand.",
            "items": {
              "$ref": "#/components/schemas/LanguageCode"
            }
          },
          "contactDetailsLogoUrl": {
            "$ref": "#/components/schemas/Url"
          },
          "contactDetailsMoreInfo": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "contactDetailsResponsibility": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "contactPersonFirstName": {
            "type": "string",
            "description": "First name of the contact person."
          },
          "contactPersonName": {
            "type": "string",
            "description": "Name of the contact person."
          },
          "contactPersonPosition": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "publishingAgreement": {
            "type": "boolean",
            "description": "Indication, whether the contact accepted publishing its contact information [TRUE] = accepted."
          },
          "urlLinkAddress": {
            "$ref": "#/components/schemas/Url"
          }
        }
      },
      "EMailCommonData": {
        "title": "EMailCommonData",
        "description": "Defines information concerning an email point of contact.",
        "type": "object",
        "x-package": "contact",
        "properties": {
          "primaryFlag": {
            "description": "If true, this indicates that this is the primary point of contact",
            "type": "boolean"
          },
          "typeCode": {
            "description": "The type of contact that can be reached with this email",
            "$ref": "#/components/schemas/EmailTypeEnum"
          },
          "emailAddress": {
            "description": "The email address",
            "$ref": "#/components/schemas/EMail"
          }
        }
      },
      "TelephoneContact": {
        "title": "TelephoneContact",
        "description": "A class defining information relating to a specific telephone point of contact.",
        "type": "object",
        "x-package": "contact",
        "properties": {
          "areaCode": {
            "type": "string",
            "description": "The area code element of a telephone number."
          },
          "extensionNumbers": {
            "type": "array",
            "description": "Any extension number typically within a larger organisation's telephone exchange system.",
            "items": {
              "type": "string"
            }
          },
          "ituCountryCode": {
            "type": "string",
            "description": "Country calling codes or country dial in codes are telephone dialing prefixes for the member countries or regions of the International Telecommunication Union (ITU). They are defined by the ITU-T in standards E.123 and E.164."
          },
          "localNumbers": {
            "type": "array",
            "description": "The local code element of a telephone number.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "GeoJsonObject": {
        "title": "GeoJsonObject",
        "description": "GeoJSon object\n\nThe coordinate reference system for all GeoJSON coordinates is a\ngeographic coordinate reference system, using the World Geodetic System\n1984 (WGS 84) datum, with longitude and latitude units of decimal\ndegrees.\nThis is equivalent to the coordinate reference system identified by the\nOpen Geospatial Consortium (OGC) URN\nAn OPTIONAL third-position element SHALL be the height in meters above\nor below the WGS 84 reference ellipsoid.\nIn the absence of elevation values, applications sensitive to height or\ndepth SHOULD interpret positions as being at local ground or sea level.",
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "Feature",
              "FeatureCollection",
              "Point",
              "MultiPoint",
              "LineString",
              "MultiLineString",
              "Polygon",
              "MultiPolygon",
              "GeometryCollection"
            ]
          },
          "bbox": {
            "description": "A GeoJSON object MAY have a member named \"bbox\" to include\ninformation on the coordinate range for its Geometries, Features, or\nFeatureCollections. The value of the bbox member MUST be an array of\nlength 2*n where n is the number of dimensions represented in the\ncontained geometries, with all axes of the most southwesterly point\nfollowed by all axes of the more northeasterly point. The axes order\nof a bbox follows the axes order of geometries.",
            "type": "array",
            "items": {
              "type": "number"
            }
          },
          "coordinates": {
            "type": "array",
            "items": {
              "description": "A position member (number) or a nested position array, by geometry type."
            },
            "description": "RFC 7946 §3.1 coordinates of a geometry object — for a Point, [longitude, latitude] or [longitude, latitude, elevation] in WGS 84 decimal degrees. Undeclared in APDS 4.1 (APX erratum 011)."
          }
        },
        "required": [
          "type"
        ],
        "discriminator": {
          "propertyName": "type"
        }
      },
      "ContactTypeEnum": {
        "title": "ContactTypeEnum",
        "description": "Defined the type of contact object.\n* ContactPoint: Contact detailed information.\n* ContactByReference: Reference to an exiting contact.",
        "type": "string",
        "x-package": "contact.enums",
        "enum": [
          "contactPoint",
          "contactByReference"
        ]
      },
      "RightSpecificationTypeEnum": {
        "title": "RightTypeEnum",
        "description": "Defines the type of RightSpecification\n* accessPermission : intended grant access permission\n* loadingUnloading : intended granting permissions to load and unload vehicles.\n* oneTimeUseParking : intended for one time or limited parking usage\n* permitParking : intended for multi-use parking usage\n* setDownPickup : intended for passenger set down and pick up\n* waiting : intended to grant permission for an accompanied vehicle to wait",
        "type": "string",
        "x-package": "right_specification.enums",
        "enum": [
          "accessPermission",
          "loadingUnloading",
          "oneTimeUseParking",
          "permitParking",
          "setdownPickup",
          "waiting"
        ]
      },
      "Validity": {
        "title": "Validity",
        "description": "Specification of validity, either explicitly or by a validity time period specification which may be discontinuous.",
        "type": "object",
        "x-package": "time",
        "properties": {
          "validityStatus": {
            "$ref": "#/components/schemas/ValidityStatusEnum"
          },
          "validityTimeSpecification": {
            "$ref": "#/components/schemas/OverallPeriod"
          }
        },
        "required": [
          "validityTimeSpecification"
        ]
      },
      "RightPool": {
        "title": "RightPool",
        "type": "object",
        "x-package": "right_specification",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "assignedRightsIssuer": {
                "readOnly": true,
                "$ref": "#/components/schemas/VersionedReference"
              },
              "distributedAssignedRights": {
                "type": "integer",
                "description": "Defines the number of AssignedRights that have been issued by the issuer."
              },
              "availableAssignedRights": {
                "type": "integer",
                "description": "Defines the number of AssignedRights that have been issued by the issuer that are still available to be assigned."
              },
              "qtyRelation": {
                "type": "integer",
                "description": "Defines the number of actions or parking included in a RightSpecification."
              },
              "relativeValidity": {
                "$ref": "#/components/schemas/RightPoolRelativeValidity"
              },
              "validity": {
                "$ref": "#/components/schemas/Validity"
              }
            },
            "required": [
              "assignedRightsIssuer",
              "availableAssignedRights",
              "distributedAssignedRights"
            ]
          }
        ]
      },
      "RateEligibility": {
        "title": "RateEligibility",
        "description": "Defines the combination of Eligibility requirements and RateTables to associate this combination to a RightSpecification.",
        "type": "object",
        "x-package": "rate.eligibility",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "priority": {
                "type": "integer",
                "description": "An integer value, starting at 1, indicating the order in which multiple relevant RateTables shall be considered, with 1 being the highest priority.",
                "minimum": 1
              },
              "combinable": {
                "type": "boolean",
                "description": "Indicates if all RateTables associated to a RightSpecification with a common Eligibility can be combined to establish a lowest cost tariff (TRUE) or they cannot be combined (FALSE)."
              },
              "eligibility": {
                "$ref": "#/components/schemas/Eligibility"
              },
              "rateTable": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "rateDiscount": {
                "$ref": "#/components/schemas/RateDiscount"
              }
            }
          }
        ]
      },
      "RateTransition": {
        "title": "RateTransition",
        "description": "describes rate transition rules",
        "type": "object",
        "x-package": "right_specification",
        "properties": {
          "overpaymentPolicy": {
            "$ref": "#/components/schemas/OverpaymentPolicyTypeEnum"
          },
          "followThroughAllowed": {
            "type": "boolean"
          },
          "prepaymentAllowed": {
            "type": "boolean"
          },
          "reservationAvailable": {
            "type": "boolean"
          }
        }
      },
      "RateAvailabilityTypeEnum": {
        "title": "RateAvailabilityTypeEnum",
        "description": "* private : Parking access is limited to known and authorized individuals.\n* public : Open to the public. \n* restricted : Open to the public but requires a direct purpose or permission to use from owner (e.g. Doctor's surgery, storefront...)\"",
        "type": "string",
        "x-package": "rate.enums",
        "enum": [
          "private",
          "public",
          "restricted"
        ]
      },
      "RateTypeEnum": {
        "title": "RateTypeEnum",
        "description": "Describes the type of rates for a RateTable.\n* contract : Rate provided to contract holders only.\n* daily : Rate provided on a daily rate, per calendar day.\n* event : Rate provided in combination with a specific event.\n* hourly : Rate provided on an hourly basis.",
        "type": "string",
        "x-package": "rate.enums",
        "enum": [
          "contract",
          "daily",
          "event",
          "hourly"
        ]
      },
      "Url": {
        "title": "Url",
        "description": "Represents a Url for an internet accessible resource.",
        "type": "string",
        "x-package": "common",
        "examples": [
          "https://api.parking-data-standards.org"
        ]
      },
      "RateLineCollection": {
        "title": "RateLineCollection",
        "description": "Describes a group of __RateLine__ elements that logically group together within one __RateTable__.",
        "type": "object",
        "x-package": "rate",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "collectionSequence": {
                "type": "integer",
                "description": "An indicator giving the place in sequence of this RateLineCollection.",
                "minimum": 1
              },
              "applicableCurrency": {
                "$ref": "#/components/schemas/CurrencyCode"
              },
              "minTime": {
                "$ref": "#/components/schemas/Duration"
              },
              "maxTime": {
                "$ref": "#/components/schemas/Duration"
              },
              "resetTime": {
                "$ref": "#/components/schemas/Time"
              },
              "minValueCollection": {
                "$ref": "#/components/schemas/AmountInCurrency"
              },
              "maxValueCollection": {
                "$ref": "#/components/schemas/AmountInCurrency"
              },
              "validStart": {
                "type": "string",
                "description": "The start time for the validity of this RateLineCollection.",
                "format": "date-time"
              },
              "validEnd": {
                "type": "string",
                "description": "The end time for the validity of this RateLineCollection.",
                "format": "date-time"
              },
              "relativeTimes": {
                "type": "boolean",
                "description": "Indicates whether or not times that are relative to the start of an event are used as the basis for rate calculation (TRUE), or if parking rate calculation definitions are done with respect to the parking sessions and defined as local or UTC times (FALSE)."
              },
              "referenceTimeStart": {
                "type": "string",
                "format": "date-time",
                "description": "Event-related reference start time"
              },
              "referenceTimeEnd": {
                "type": "string",
                "format": "date-time",
                "description": "Event-related reference end time"
              },
              "taxIncluded": {
                "type": "boolean",
                "description": "Indication that tax to be applied is included within the total rate associated with this rate line collection (true) or indicates that the tax is added additionally to the total."
              },
              "taxRate": {
                "type": "number",
                "description": "The percentage rate of tax to be applied.",
                "format": "float",
                "minimum": 0,
                "maximum": 100
              },
              "taxValue": {
                "type": "number",
                "description": "The monetary amount of tax to be applied.",
                "format": "float"
              },
              "rateLines": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/RateLine"
                }
              }
            },
            "required": [
              "collectionSequence",
              "applicableCurrency",
              "resetTime",
              "validStart",
              "relativeTimes",
              "taxIncluded",
              "rateLines"
            ]
          }
        ]
      },
      "CredentialAssigned": {
        "title": "CredentialAssigned",
        "description": "Defines a credential that is used for verification for one AssignedRight.",
        "type": "object",
        "x-package": "assigned_right.credential",
        "discriminator": {
          "propertyName": "credentialAssignedType",
          "x-discriminator-default": "VehicleCredential",
          "mapping": {
            "customer": "#/components/schemas/CustomerCredential",
            "vehicle": "#/components/schemas/VehicleCredential",
            "other": "#/components/schemas/OtherCredential"
          }
        },
        "allOf": [
          {
            "$ref": "#/components/schemas/Credential"
          },
          {
            "type": "object",
            "properties": {
              "credentialAssignedType": {
                "$ref": "#/components/schemas/CredentialAssignedTypeEnum"
              },
              "identifier": {
                "$ref": "#/components/schemas/Reference"
              },
              "issuer": {
                "$ref": "#/components/schemas/MultilingualString"
              }
            },
            "required": [
              "identifier",
              "type"
            ]
          }
        ]
      },
      "Segment": {
        "title": "Segment",
        "description": "Segments enables a single __session__ to capture and report changes in __rates__ and __assigned rights__ during a its validity. A segment can only have one __assigned right__ and __rate__ associated to it and must always :\n* be associated to a __session__.\n* be associated to an __assigned right__ and to a specific __rate__ and __credential__ via the __assigned right__.\n* keep track of the version of the __assigned right__ (i.e. when a segment starts with one __assigned right__ and then is updated to a new __assigned right__ replacing the original at the end of the __segment__).\n* be associated with a __place__.\n* be associated to a __financial transaction__ data.\n* have a start and end time.",
        "type": "object",
        "x-package": "session",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "actualStart": {
                "type": "string",
                "format": "date-time"
              },
              "actualEnd": {
                "type": "string",
                "format": "date-time"
              },
              "assignedRight": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "spaceId": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "validationType": {
                "type": "array",
                "description": "The form of validation (the nature of credential) that is used in conjunction with the specific segment.",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/CredentialTypeEnum"
                }
              },
              "validationId": {
                "type": "string",
                "description": "Specific validation identification associated to the segment."
              },
              "credentialId": {
                "$ref": "#/components/schemas/Reference"
              },
              "notes": {
                "$ref": "#/components/schemas/MultilingualString"
              }
            },
            "required": [
              "actualStart",
              "assignedRight",
              "validationType"
            ]
          }
        ]
      },
      "AssignedRightHolder": {
        "title": "AssignedRightHolder",
        "description": "Information concerning a specific holder of a granted right, corresponding to a defined __RightSpecification__.",
        "type": "object",
        "x-package": "assigned_right",
        "properties": {
          "credentials": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CredentialAssigned"
            }
          }
        }
      },
      "IssueMethodTypeEnum": {
        "title": "IssueMethodTypeEnum",
        "description": "A list of the supported methods for issuing credentials.\n* electronic : electronically issued, traceable\n* permit : physical identifier, typically visibly mounted within vehicle\n* ticket : typically single use, paper based",
        "type": "string",
        "x-package": "assigned_right.enums",
        "enum": [
          "electronic",
          "ticket",
          "permit"
        ]
      },
      "AmountInCurrency": {
        "title": "AmountInCurrency",
        "description": "A class supporting the definition of a unit of currency in a defined currency.",
        "type": "object",
        "x-package": "rate.payment",
        "properties": {
          "currencyType": {
            "description": "The currency code.",
            "$ref": "#/components/schemas/CurrencyCode"
          },
          "currencyValue": {
            "type": "number",
            "description": "The amount of currency specified in the given currency code type.",
            "format": "float"
          }
        },
        "required": [
          "currencyType",
          "currencyValue"
        ]
      },
      "PlannedUse": {
        "title": "PlannedUse",
        "description": "Represents a specific future instance of an AssignedRight.",
        "type": "object",
        "x-package": "assigned_right",
        "properties": {
          "startTime": {
            "type": "string",
            "description": "Datetime instance when a PlannedUse is considered to start, and be available for use.",
            "format": "date-time"
          },
          "endTime": {
            "type": "string",
            "description": "Datetime instance when a PlannedUse is considered to end, and no longer be available for use.",
            "format": "date-time"
          },
          "cancelTime": {
            "type": "string",
            "description": "Datetime instance when a specific PlannedUse has been cancelled by the RightHolder.",
            "format": "date-time"
          },
          "expiryTime": {
            "type": "string",
            "description": "Datetime instance when a PlannedUse expires, and is no longer available for use.",
            "format": "date-time"
          },
          "issuer": {
            "readOnly": true,
            "$ref": "#/components/schemas/VersionedReference"
          },
          "issuanceTime": {
            "type": "string",
            "description": "Date/time at which a specific PlannedUse instance was issued.",
            "format": "date-time"
          },
          "issueMethod": {
            "$ref": "#/components/schemas/IssueMethodTypeEnum"
          },
          "credentialsAssigned": {
            "type": "array",
            "description": "Credentials that might be used for the future AssignedRight.",
            "minItems": 1,
            "items": {
              "$ref": "#/components/schemas/CredentialAssigned"
            }
          }
        },
        "required": [
          "startTime"
        ]
      },
      "Payment": {
        "title": "Payment",
        "description": "Represents the record of payments for associated AssignedRight.",
        "type": "object",
        "x-package": "rate.payment",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "dateCollected": {
                "description": "Datetime that the payment related to this financial transaction is recorded as being paid and collected.",
                "$ref": "#/components/schemas/DateTime"
              },
              "dateAuthorised": {
                "description": "Datetime that the payment related to this financial transaction is authorised.",
                "$ref": "#/components/schemas/DateTime"
              },
              "serviceProvider": {
                "readOnly": true,
                "$ref": "#/components/schemas/VersionedReference"
              },
              "transactionID": {
                "type": "string",
                "description": "Identifier for the transaction (e.g. reservation number, credit card transaction reference) as agreed upon by the two entities sharing data."
              },
              "idCode": {
                "type": "string",
                "description": "User defined field to identity additional details such as customer account number or G/L account number."
              },
              "startPeriodCovered": {
                "type": "string",
                "description": "Note field to describe the start of the period a payment covers.",
                "format": "date-time"
              },
              "endPeriodCovered": {
                "type": "string",
                "description": "Note field to describe the end of the period a payment covers.",
                "format": "date-time"
              },
              "paymentLines": {
                "type": "array",
                "description": "A data class that enables transaction details to be accumulated.",
                "items": {
                  "$ref": "#/components/schemas/PaymentLine"
                }
              },
              "extensions": {
                "description": "The APDS extension container (Use Case Document §C.2.5; Part 4 §4.3). Undeclared on APDS 4.1 entities (APX erratum 010). Carries apds-ext:apx:payment-detail@1.0 with rateSold only; the Payment's own paymentLines are the itemization (Part 13 §13.6a).",
                "$ref": "#/components/schemas/Extensions"
              }
            },
            "required": [
              "serviceProvider",
              "paymentLines"
            ]
          }
        ]
      },
      "MonetaryValue": {
        "title": "MonetaryValue",
        "type": "object",
        "description": "Lightweight record of the monetary financial value of the associated AssignedRight (temporary). Service provider is entity responsible for selling/collecting fees associated to the AR.",
        "x-package": "rate.payment",
        "properties": {
          "taxIncluded": {
            "type": "boolean",
            "description": "Whether tax included in monetary value, if yes (TRUE), if not (FALSE)."
          },
          "serviceProvider": {
            "$ref": "#/components/schemas/VersionedReference",
            "readOnly": true
          },
          "value": {
            "$ref": "#/components/schemas/AmountInCurrency"
          }
        },
        "required": [
          "taxIncluded",
          "serviceProvider",
          "value"
        ]
      },
      "ReferenceQuoteExtension": {
        "title": "ReferenceQuoteExtension",
        "type": "object",
        "description": "Class providing a versioned reference to a quote for a session extension",
        "properties": {
          "quoteResponseId": {
            "$ref": "#/components/schemas/VersionedReference"
          },
          "optionId": {
            "$ref": "#/components/schemas/VersionedReference"
          }
        },
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "ReferenceQuoteNew": {
        "title": "ReferenceQuoteNew",
        "type": "object",
        "description": "Class providing a versioned reference to a new quote",
        "properties": {
          "quoteResponseId": {
            "$ref": "#/components/schemas/VersionedReference"
          },
          "optionId": {
            "$ref": "#/components/schemas/VersionedReference"
          }
        },
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "Eligibility": {
        "title": "Eligibility",
        "description": "Defines one or several qualifications to be eligible to a specific RateTable.",
        "type": "object",
        "x-package": "rate.eligibility",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "description": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "eligibilityName": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "qualifications": {
                "type": "array",
                "description": "Describes the criteria to be eligible.",
                "items": {
                  "$ref": "#/components/schemas/Qualification"
                }
              },
              "rightHolders": {
                "type": "array",
                "description": "Represents a list of RightHolders that are automatically eligible for the specific RateTable.",
                "items": {
                  "$ref": "#/components/schemas/AssignedRightHolder"
                }
              }
            }
          }
        ]
      },
      "ReferencedRightSpecification": {
        "title": "ReferencedRightSpecification",
        "type": "object",
        "description": "class to support referencing a RightSpecification",
        "properties": {
          "elementId": {
            "$ref": "#/components/schemas/VersionedReference"
          },
          "rightSpecificationId": {
            "$ref": "#/components/schemas/VersionedReference"
          }
        },
        "required": [
          "rightSpecificationId"
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "Duration": {
        "title": "Duration",
        "description": "ISO8601 format definition of an interval of time in format [PnnYnnMnnDTnnHnnMnnS].",
        "type": "string",
        "x-package": "common",
        "pattern": "^P(?!$)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+S)?)?$",
        "examples": [
          "P1Y2M3DT4H5M6S"
        ]
      },
      "ResponseReasonEnum": {
        "title": "ResponseReasonEnum",
        "description": "A list of supported reasons if a requested quote response is not provided\n\n* `eligibilityRequirementNotMet`: a stated eligibility requirement is not considered to be met\n* `noAvailability`: No availability for request\n* `noMatchingSpecification`: No matching rights specification found\n* `other`: other reason (reason not given)\n* `rightSpecificationNotAvailableAtRequestedTimes`: the requested specification is not available at the requested time\n",
        "type": "string",
        "enum": [
          "eligibilityRequirementNotMet",
          "noAvailability",
          "noMatchingSpecification",
          "other",
          "rightSpecificationNotAvailableAtRequestedTimes"
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "Option": {
        "title": "Option",
        "description": "Class providing one option to a quote request",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "elementId": {
                "$ref": "#/components/schemas/VersionedReference"
              },
              "exact": {
                "type": "boolean",
                "description": "indicates the supplied Option fully covers the time period requested"
              },
              "quoteExpiration": {
                "$ref": "#/components/schemas/QuoteExpiration"
              },
              "identifiers": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/Identifiers"
                }
              },
              "financialQuote": {
                "$ref": "#/components/schemas/FinancialQuote"
              }
            },
            "required": [
              "quoteExpiration",
              "financialQuote"
            ]
          }
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "QuoteRightResponseExtensionReasonEnum": {
        "title": "QuoteRightResponseExtensionReasonEnum",
        "description": "A list of supported reasons if a requested session extension request is not provided\n\n* `existingSessionNotFound`: Error – the existing session referenced is not found\n* `incorrectCredentialsSupplied`: Error – credential details supplied are incorrect\n* `noExtensionPossible`: Error – the requested extension is not possible\n",
        "type": "string",
        "enum": [
          "existingSessionNotFound",
          "incorrectCredentialsSupplied",
          "noExtensionPossible"
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "Supply": {
        "title": "Supply",
        "description": "A class defining concepts relating the parameters of the supply of parking. \nThis is the total number of spaces usable for parking or other mobility operations. \nIt can be defined as demarcated spaces or non-demarcated.",
        "type": "object",
        "x-package": "place.occupancy",
        "properties": {
          "supplyViewType": {
            "$ref": "#/components/schemas/SupplyViewTypeEnum"
          },
          "supplyQuantity": {
            "type": "integer",
            "description": "Indicates the numeric value of available parking or other space uses."
          },
          "supplyValidityStart": {
            "description": "Valid start date/time for the supply",
            "$ref": "#/components/schemas/DateTime"
          },
          "supplyValidityEnd": {
            "description": "Valid end date/time for the supply",
            "$ref": "#/components/schemas/DateTime"
          }
        },
        "required": [
          "supplyQuantity",
          "supplyViewType"
        ]
      },
      "DemandType": {
        "title": "DemandType",
        "description": "This table is dedicated to reporting on actual occupancy in an area.",
        "type": "object",
        "x-package": "place.occupancy",
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of occupied spaces.",
            "minimum": 0
          },
          "occupancyCalculation": {
            "$ref": "#/components/schemas/CalculationTypeEnum"
          },
          "percentage": {
            "type": "number",
            "description": "Percent of spaces occupied.",
            "format": "float",
            "minimum": 0,
            "maximum": 100
          },
          "recordDateTime": {
            "description": "When data in the record was compiled.",
            "$ref": "#/components/schemas/DateTime"
          }
        },
        "required": [
          "recordDateTime"
        ]
      },
      "SubscriptionFilters": {
        "title": "SubscriptionFilters",
        "type": "object",
        "description": "Server-side delivery filtering.",
        "properties": {
          "places": {
            "type": "array",
            "description": "Only events bound to these HierarchyElement subtrees are delivered\n(Part 8 §8.5). Every entry must lie inside the token's `apx_places`\ngrant, else 403 `insufficient-grant`.",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "severityFloor": {
            "type": "string",
            "description": "For alert topics — minimum severity delivered.",
            "enum": [
              "info",
              "warning",
              "minor",
              "major",
              "critical"
            ]
          },
          "alertTypes": {
            "type": "array",
            "description": "For alert topics — only alerts whose `alertType` is listed are\ndelivered (Part 8 §8.5a). Values are `apx-alert-types` entries or\nimplementer types; combines with `severityFloor` (both must hold).",
            "items": {
              "type": "string"
            },
            "examples": [
              [
                "scofflawArrival",
                "refusedServiceArrival"
              ]
            ]
          }
        }
      },
      "RecordInfo": {
        "title": "RecordInfo",
        "description": "Provenance metadata for an APX resource, aligned to the APDS Information\nModel's RecordType (creationTime/creator/lastUpdate). All timestamps are\nRFC 3339 (APDS DateTime).",
        "type": "object",
        "properties": {
          "creationTime": {
            "$ref": "#/components/schemas/DateTime"
          },
          "creator": {
            "description": "Reference to the creating Organisation or Contact.",
            "$ref": "#/components/schemas/Reference"
          },
          "creationUser": {
            "type": "string",
            "description": "Human or system principal that created the record."
          },
          "lastUpdate": {
            "$ref": "#/components/schemas/DateTime"
          },
          "lastUpdateUser": {
            "type": "string",
            "description": "Human or system principal that last updated the record."
          },
          "origin": {
            "type": "string",
            "description": "The implementation that first created the record, when it differs\nfrom the one serving it (Part 18 §18.6 replication): the origin's\n`EventEnvelope.source` value. Absent on records the serving\nimplementation created itself.",
            "examples": [
              "https://edge.lakeside-garage.example/v1"
            ]
          }
        }
      },
      "DeliveryAttempt": {
        "title": "DeliveryAttempt",
        "description": "One delivery attempt of one event to one subscription.",
        "type": "object",
        "required": [
          "deliveryId",
          "time",
          "code"
        ],
        "properties": {
          "deliveryId": {
            "type": "string",
            "format": "uuid",
            "description": "The attempt's `APX-Delivery-Id` (unique per attempt)."
          },
          "time": {
            "description": "When the attempt was sent — also its `APX-Timestamp` (each attempt is signed afresh, Part 8 §8.3).",
            "$ref": "#/components/schemas/DateTime"
          },
          "code": {
            "type": "integer",
            "description": "HTTP status code received (0 = network error or timeout)."
          }
        }
      },
      "Approval": {
        "title": "Approval",
        "description": "Approval evidence, REQUIRED on a write whose AllowedAction said\nrequiresApproval (Part 17 §17.3). Servers MUST reject a\nrequires-approval action without it (403 approval-required). One shared\nshape for control commands and domain actions (e.g. refunds).",
        "type": "object",
        "required": [
          "approvedBy"
        ],
        "properties": {
          "approvedBy": {
            "type": "string",
            "description": "The approving principal (role per AllowedAction.approvalRole)."
          },
          "approvedAt": {
            "$ref": "#/components/schemas/DateTime"
          },
          "note": {
            "type": "string"
          },
          "approvalRequest": {
            "description": "The Part 17 §17.3a ApprovalRequest whose decision this evidence cites, when the approval was asked for through APX.",
            "$ref": "#/components/schemas/Reference"
          }
        }
      },
      "CommandResult": {
        "title": "CommandResult",
        "description": "The structured outcome of a command, populated by the server when the\ncommand reaches `succeeded` (Part 6 §6.1a) and absent before then. Members\nare normative per command type: `lostTicket` → `ticketNumber`, `session`,\n`amountDue`; `matchTicket` → `session`, `amountDue`;\n`pushNegotiatedRate` → `amountDue`, and `rateTable` when a table was\nselected (absent for a stated amount, which the lane inquiry reports\nas `currentTicket.negotiatedAmount`). Other command types\nleave it absent unless a registry entry says otherwise. It restates what\nthe lane inquiry shows, so a console can continue (print, take payment)\nwithout parsing `statusHistory[].detail` or making a second call.",
        "type": "object",
        "readOnly": true,
        "properties": {
          "ticketNumber": {
            "type": "string",
            "description": "The ticket the command issued or bound (lostTicket)."
          },
          "session": {
            "description": "The APDS Session the ticket belongs to (lostTicket, matchTicket).",
            "$ref": "#/components/schemas/Reference"
          },
          "amountDue": {
            "description": "The amount due on the ticket immediately after the command.",
            "$ref": "#/components/schemas/AmountInCurrency"
          },
          "rateTable": {
            "description": "The RateTable at the exact version applied (pushNegotiatedRate with a table; absent for a stated amount).",
            "$ref": "#/components/schemas/VersionedReference"
          },
          "display": {
            "description": "Proof of display for `displayMessage` (Part 6 §6.1a): what the\ndevice confirmed it showed, when, and whether the player or an\noperator acknowledged it. A Part 26 §26.9 DisplayRecord that names\nthis command MUST agree with it.",
            "$ref": "#/components/schemas/DisplayProof"
          },
          "extensions": {
            "$ref": "#/components/schemas/Extensions"
          }
        }
      },
      "RatePolicy": {
        "title": "RatePolicy",
        "description": "Level B decoration on an APDS RateTable, carried in its `extensions`\ncontainer as `apds-ext:apx:ratepolicy@1.0` (Part 6 §6.6). APDS models\nthe rate deck completely; it has no way to say which tables an agent\nmay offer as a negotiated rate. This is that flag — and because it\nrides inside the RateTable, every consumer mirroring the deck through\nthe native `/rates` route (Part 5 §5.2) receives it with the table, no\nsecond query. APX deliberately defines NO selection rules here (length\nof stay, time of day, caller type): the system presenting the deck to\nan agent or a third party applies its own guardrails. The server's only\nrule is enforcement — a pushNegotiatedRate naming a table that is not\nflagged negotiable is refused (422 rate-not-negotiable).",
        "type": "object",
        "required": [
          "negotiable"
        ],
        "properties": {
          "negotiable": {
            "type": "boolean",
            "description": "Whether this RateTable MAY be selected by a pushNegotiatedRate command."
          },
          "displayName": {
            "type": "string",
            "description": "Short agent-facing label for the table when offered as a negotiated rate (e.g. \"Customer-service flat $20\")."
          },
          "note": {
            "type": "string",
            "description": "Free-text guidance for the presenting system or agent. Informative — never evaluated by the server."
          }
        },
        "examples": [
          {
            "negotiable": true,
            "displayName": "Customer-service flat $20",
            "note": "Offer for rate complaints referred by on-site tenants. Log the tenant in reason."
          }
        ]
      },
      "MatchCandidate": {
        "title": "MatchCandidate",
        "description": "An open session at the place that plausibly belongs to the vehicle in\nthe lane (Part 6 §6.7). Produced by the lane inquiry from the lane's\nown LPR read, a presented credential, the account registry (by plate\nor phone), or a checked-in reservation. Composes APDS references; adds\nno parallel session store. Advisory until a matchTicket command binds\none.",
        "type": "object",
        "required": [
          "session",
          "matchedBy",
          "confidence"
        ],
        "properties": {
          "session": {
            "description": "The open APDS Session this candidate proposes.",
            "$ref": "#/components/schemas/Reference"
          },
          "ticketNumber": {
            "type": "string",
            "description": "The entry ticket number, if a ticket was issued at entry."
          },
          "entryTime": {
            "$ref": "#/components/schemas/DateTime"
          },
          "entryLane": {
            "description": "The VehicularAccess the session entered through.",
            "$ref": "#/components/schemas/Reference"
          },
          "plate": {
            "type": "string",
            "description": "The plate recorded on the session at entry, if any."
          },
          "matchedBy": {
            "type": "string",
            "enum": [
              "plateRead",
              "credential",
              "account",
              "reservation"
            ],
            "description": "How this candidate was found: the lane's LPR read against the entry\nread (plateRead); a credential presented at the lane (credential);\nthe account registry by plate or phone (account); a checked-in\nreservation carrying the plate (reservation)."
          },
          "evidence": {
            "description": "The record that produced the match — the entry Observation, the\nCredential, the RightHolder account, or the AssignedRight — so the\nagent can show it and the matchTicket command can cite it.",
            "$ref": "#/components/schemas/Reference"
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Server's confidence that this is the vehicle in the lane (a plate-read match projects APDS Confidence.overallConfidence)."
          },
          "amountDueIfMatched": {
            "description": "What the exit would price at from this session's true entry time — so the agent can tell the driver before matching.",
            "$ref": "#/components/schemas/AmountInCurrency"
          },
          "imageLink": {
            "description": "The entry image, for visual confirmation (access-controlled per Part 9 §9.6).",
            "$ref": "#/components/schemas/Url"
          }
        },
        "examples": [
          {
            "session": {
              "id": "c4000000-0000-4000-8000-000000000051",
              "className": "Session"
            },
            "ticketNumber": "T-4502",
            "entryTime": "2026-09-24T08:02:17Z",
            "entryLane": {
              "id": "b2000000-0000-4000-8000-000000000001",
              "className": "VehicularAccess"
            },
            "plate": "KLM4410",
            "matchedBy": "plateRead",
            "evidence": {
              "id": "f2000000-0000-4000-8000-000000000911",
              "className": "Observation"
            },
            "confidence": 0.94,
            "amountDueIfMatched": {
              "currencyType": "USD",
              "currencyValue": 14
            },
            "imageLink": "https://api.lakeside-garage.example/lpr/f2000000-0911.jpg"
          }
        ]
      },
      "SupplementalEquipment": {
        "title": "SupplementalEquipment",
        "description": "One type of supplemental equipment, which is available on some site, for example on a rest area.",
        "type": "object",
        "x-package": "place",
        "allOf": [
          {
            "$ref": "#/components/schemas/SupplementalFacility"
          },
          {
            "type": "object",
            "properties": {
              "equipmentType": {
                "$ref": "#/components/schemas/EquipmentTypeEnum"
              },
              "refillPoints": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/RefillPoint"
                }
              }
            },
            "required": [
              "equipmentType"
            ]
          }
        ]
      },
      "ApxResourceCore": {
        "title": "ApxResourceCore",
        "description": "Identity core shared by every APX-defined resource. Shaped so any APX\nresource can itself be the target of an APDS Reference or\nVersionedReference (RFC 4122 UUID identifier + integer version).",
        "type": "object",
        "required": [
          "id",
          "version"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "RFC 4122 UUID, unique within the resource class."
          },
          "version": {
            "type": "integer",
            "minimum": 1,
            "description": "Monotonically increasing object version."
          },
          "recordInfo": {
            "$ref": "#/components/schemas/RecordInfo"
          },
          "extensions": {
            "$ref": "#/components/schemas/Extensions"
          }
        }
      },
      "Period": {
        "title": "Period",
        "description": "Defines a continuous time period or a set of discontinuous time periods defined by the intersection of a set of criteria all within an overall delimiting interval.",
        "type": "object",
        "x-package": "time",
        "properties": {
          "periodName": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "startOfPeriod": {
            "description": "Start of the period.",
            "$ref": "#/components/schemas/DateTime"
          },
          "endOfPeriod": {
            "description": "End of the period.",
            "$ref": "#/components/schemas/DateTime"
          },
          "recurringDayWeekMonthPeriod": {
            "type": "array",
            "description": "The list of days each month for the period. If empty, all year (7d/7).",
            "items": {
              "$ref": "#/components/schemas/DayWeekMonth"
            }
          },
          "recurringSpecialDay": {
            "type": "array",
            "description": "The list of special days for the period.",
            "items": {
              "$ref": "#/components/schemas/SpecialDay"
            }
          },
          "recurringTimePeriodOfDay": {
            "type": "array",
            "description": "The list of start and end time for each day. If empty, all day (24h/24).",
            "items": {
              "$ref": "#/components/schemas/TimePeriodOfDay"
            }
          }
        }
      },
      "StructureTypeEnum": {
        "title": "StructureTypeEnum",
        "description": "A list of types of parking structure.\n* offStreetStructure : Off-street multi-tier parking structure.\n* offStreetSurface : Off-street ground-level at grade parking.\n* onStreet : On-street parking.",
        "type": "string",
        "x-package": "place.enums",
        "enum": [
          "offStreetStructure",
          "offStreetSurface",
          "onStreet"
        ]
      },
      "StructureGradeEnum": {
        "title": "StructureGradeEnum",
        "description": "Types of layout of the parking site.\n* aboveGround : Parking is above ground level (this may include ground level parking)\n* groundLevel : Parking is at ground level\n* underground : Parking is on one or more floors below ground level",
        "type": "string",
        "x-package": "place.enums",
        "enum": [
          "aboveGround",
          "groundLevel",
          "underground"
        ]
      },
      "LprReadDetail": {
        "title": "LprReadDetail",
        "description": "What a modern LPR camera knows beyond the plate string and one overall\nscore (Part 13 §13.3a). Carried on the ingested APDS Observation as the\nLevel B decoration `apds-ext:apx:lpr-read@1.0` in its `extensions`\ncontainer (Part 4 §4.3 — plain APDS consumers ignore it), and projected\non `LprRead.detail` and `PlateCandidate.detail`. Every field optional;\neach recognized attribute carries its own confidence. APDS's\n`vehicleAncillaryIdentification` (country, stateProvince, make, model,\ncolor) remains the APDS-visible copy of the winning values; this block\nadds the per-attribute confidence, the candidates that lost, and the\npassage geometry APDS has no fields for.",
        "type": "object",
        "properties": {
          "plate": {
            "$ref": "#/components/schemas/AttributeRead"
          },
          "country": {
            "description": "Plate issuing country (APDS VehicleAncillaryIdentification.country vocabulary).",
            "$ref": "#/components/schemas/AttributeRead"
          },
          "stateProvince": {
            "description": "Plate issuing state/province (APDS VehicleAncillaryIdentification.stateProvince vocabulary).",
            "$ref": "#/components/schemas/AttributeRead"
          },
          "plateCategory": {
            "description": "The plate's category where the issuing country uses one (e.g. the prefix on some Gulf-state plates). Absent where the country has none.",
            "$ref": "#/components/schemas/AttributeRead"
          },
          "make": {
            "$ref": "#/components/schemas/AttributeRead"
          },
          "model": {
            "$ref": "#/components/schemas/AttributeRead"
          },
          "color": {
            "$ref": "#/components/schemas/AttributeRead"
          },
          "bodyType": {
            "description": "The engine's own vehicle class label (SUV, sedan, pickup, bus, truck…), carried as the engine reports it and not mapped to a standard list.",
            "$ref": "#/components/schemas/AttributeRead"
          },
          "alternateReads": {
            "type": "array",
            "description": "The other candidate plate strings the engine considered for this capture, best first — kept so a correction (Part 17 §17.5) can pick a loser.",
            "items": {
              "type": "object",
              "required": [
                "plate"
              ],
              "properties": {
                "plate": {
                  "type": "string"
                },
                "stateProvince": {
                  "type": "string"
                },
                "confidence": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                }
              }
            }
          },
          "frameReads": {
            "type": "integer",
            "minimum": 0,
            "description": "How many frames read this plate as the vehicle passed. Engines need\nat least two to call `movement`, so a camera that sees only one of\nthe vehicle's plates still reports it (Part 13 §13.3a(3))."
          },
          "platesRead": {
            "type": "integer",
            "minimum": 0,
            "description": "How many distinct plates of the vehicle were read in the passage\n(1 = one plate; 2 = front and rear)."
          },
          "plateFace": {
            "type": "string",
            "enum": [
              "front",
              "rear",
              "unknown"
            ],
            "description": "Which plate of the vehicle was read, for engines that can tell."
          },
          "plateBox": {
            "type": "object",
            "description": "The plate's position in the camera frame, as fractions 0–1 of the\nframe's height (`top`, `bottom`) and width (`left`, `right`), so it\nsurvives image resizing.",
            "required": [
              "top",
              "left",
              "bottom",
              "right"
            ],
            "properties": {
              "top": {
                "type": "number",
                "minimum": 0,
                "maximum": 1
              },
              "left": {
                "type": "number",
                "minimum": 0,
                "maximum": 1
              },
              "bottom": {
                "type": "number",
                "minimum": 0,
                "maximum": 1
              },
              "right": {
                "type": "number",
                "minimum": 0,
                "maximum": 1
              }
            }
          },
          "movement": {
            "type": "string",
            "enum": [
              "toward",
              "away",
              "stopped",
              "unknown",
              "approaching",
              "receding"
            ],
            "description": "The vehicle's motion relative to the camera: toward it, away from\nit, or stopped. A camera fact, not a statement about the facility.\n`approaching` and `receding` are deprecated synonyms of `toward`\nand `away` — accepted until 1.0; writers SHOULD send the new values\n(Part 13 §13.3a(3))."
          },
          "speed": {
            "type": "number",
            "minimum": 0,
            "description": "Vehicle speed in km/h when the engine measures it; absent otherwise, never a sentinel such as -1."
          },
          "accessEvent": {
            "type": "string",
            "enum": [
              "entry",
              "exit",
              "unknown"
            ],
            "description": "Whether this read was a vehicle entering or leaving the facility, as\nreported by the LPR system — not the lane's configured purpose (the\nlane's APDS `accessType`), and never inferred by the APX server.\nAbsent means `unknown`. The LPR system MAY revise it through\n`PUT /v1/lpr/reads/{observation}/access-event` (Part 13 §13.3a(4))."
          },
          "captureGroup": {
            "type": "string",
            "description": "Opaque id linking the reads of one vehicle's passage — several\nframes, and one camera or several (e.g. front plate and rear\nplate) — so consumers can treat them as one event. Reads of one\ngroup SHOULD carry the same `accessEvent` (Part 13 §13.3a(6))."
          },
          "engine": {
            "type": "string",
            "description": "Recognition engine/vendor identifier, opaque (for confidence calibration downstream)."
          },
          "review": {
            "type": "object",
            "description": "The human-review state of the read (Part 13 §13.3a(4a)): a\nlow-confidence read, or any read in a jurisdiction that requires\nreview, is `pending` until a reviewer confirms, corrects, or\nrejects it through `PUT /v1/lpr/reads/{observation}/plate`.\n`notRequired` is a read no rule sent to review. Absent means the\nimplementation does not review reads.",
            "properties": {
              "state": {
                "type": "string",
                "enum": [
                  "pending",
                  "confirmed",
                  "corrected",
                  "rejected",
                  "notRequired"
                ]
              },
              "reasons": {
                "type": "array",
                "description": "Why the read was sent to review — definedValues from `apx-read-review-reasons` (Part 11) or implementer values.",
                "items": {
                  "type": "string"
                }
              },
              "decidedTime": {
                "$ref": "#/components/schemas/DateTime"
              },
              "decidedBy": {
                "type": "string",
                "description": "Opaque reviewer principal."
              },
              "original": {
                "type": "object",
                "description": "The engine's values before the first correction, with their\nconfidences, kept so the correction is auditable. Set by the\nserver on the first `corrected` decision and never changed\nafterwards (Part 13 §13.3a(4a)).",
                "properties": {
                  "plate": {
                    "$ref": "#/components/schemas/AttributeRead"
                  },
                  "country": {
                    "$ref": "#/components/schemas/AttributeRead"
                  },
                  "stateProvince": {
                    "$ref": "#/components/schemas/AttributeRead"
                  }
                }
              }
            }
          }
        },
        "examples": [
          {
            "plate": {
              "value": "RVR-8821",
              "confidence": 0.91
            },
            "stateProvince": {
              "value": "IL",
              "confidence": 0.88
            },
            "make": {
              "value": "Ford",
              "confidence": 0.94
            },
            "model": {
              "value": "F-150",
              "confidence": 0.71
            },
            "color": {
              "value": "grey",
              "confidence": 0.83
            },
            "bodyType": {
              "value": "pickup",
              "confidence": 0.96
            },
            "frameReads": 4,
            "platesRead": 2,
            "plateFace": "front",
            "plateBox": {
              "top": 0.52,
              "left": 0.29,
              "bottom": 0.59,
              "right": 0.36
            },
            "movement": "toward",
            "accessEvent": "entry",
            "captureGroup": "riverside/20261214T074108/0417",
            "engine": "vendor-x/7.2"
          }
        ]
      },
      "LaneCameras": {
        "title": "LaneCameras",
        "description": "The LPR cameras on a lane and which way each one faces (Part 13\n§13.3a(5)). Carried on an APDS VehicularAccess as the Level B\ndecoration `apds-ext:apx:lane-cameras@1.0` in its `extensions`\ncontainer (Part 4 §4.3). Facing is relative to the facility, not to\nthe lane's mode, so it holds on `reversible` lanes. Describes the\nsetup only; APX derives nothing from it.",
        "type": "object",
        "required": [
          "cameras"
        ],
        "properties": {
          "cameras": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": [
                "cameraId",
                "faces"
              ],
              "properties": {
                "cameraId": {
                  "type": "string",
                  "description": "The camera, as `Image.cameraID` names it on its reads. MUST\nbe unique within the Place."
                },
                "faces": {
                  "type": "string",
                  "enum": [
                    "inward",
                    "outward"
                  ],
                  "description": "`inward` — looking into the facility, the way entering\ntraffic travels (reads the rear plates of entering\nvehicles); `outward` — looking out of it, the way exiting\ntraffic travels (reads the rear plates of exiting vehicles)."
                }
              }
            }
          }
        },
        "examples": [
          {
            "cameras": [
              {
                "cameraId": "harbor/cam-centre-in",
                "faces": "inward"
              },
              {
                "cameraId": "harbor/cam-centre-out",
                "faces": "outward"
              }
            ]
          }
        ]
      },
      "ReservationExtension": {
        "title": "ReservationExtension",
        "description": "The apds-ext:apx:reservation@1.0 extension object attached to a native\nAssignedRight. Presence of this extension marks the AssignedRight as a\nreservation; state transitions follow Part 14 §14.1 (transition\ntable). `plannedStart`/`plannedEnd` MUST mirror the AssignedRight's\n`plannedUses[0].startTime`/`endTime`, which is authoritative.",
        "type": "object",
        "required": [
          "reservationState"
        ],
        "properties": {
          "reservationState": {
            "type": "string",
            "enum": [
              "confirmed",
              "amended",
              "cancelled",
              "checkedIn",
              "noShow"
            ]
          },
          "plannedStart": {
            "description": "Mirror of `plannedUses[0].startTime` (Part 14 §14.1).",
            "$ref": "#/components/schemas/DateTime"
          },
          "plannedEnd": {
            "description": "Mirror of `plannedUses[0].endTime` (Part 14 §14.1).",
            "$ref": "#/components/schemas/DateTime"
          },
          "checkInSession": {
            "description": "Set when a Session referencing this AssignedRight is created.",
            "$ref": "#/components/schemas/Reference"
          },
          "noShowAfter": {
            "description": "SERVER-SET: the instant after which a reservation still without a\ncheck-in transitions to `noShow` (`plannedStart` plus the\noperator's grace period, Part 14 §14.1 step 6), so a platform can\ntell a customer when the booking lapses. Clients do not send it.",
            "readOnly": true,
            "$ref": "#/components/schemas/DateTime"
          }
        },
        "examples": [
          {
            "reservationState": "checkedIn",
            "plannedStart": "2026-08-14T18:00:00Z",
            "plannedEnd": "2026-08-15T01:00:00Z",
            "checkInSession": {
              "id": "f1000000-0000-4000-8000-000000000014",
              "className": "Session"
            }
          }
        ]
      },
      "PermitExtension": {
        "title": "PermitExtension",
        "description": "The `apds-ext:apx:permit@1.1` extension object (Part 14 §14.2; `@1.0`\nremains valid and carries the first two members only): links a renewal\npermit to the one it renews, so a portal can follow the chain, and\ncaps how many of a multi-vehicle permit's vehicles may be parked at\nonce (§14.2d).",
        "type": "object",
        "properties": {
          "renews": {
            "description": "The AssignedRight this permit renews.",
            "$ref": "#/components/schemas/Reference"
          },
          "renewedBy": {
            "description": "Set by the server on the renewed permit when a renewal is issued.",
            "readOnly": true,
            "$ref": "#/components/schemas/Reference"
          },
          "maxConcurrentVehicles": {
            "type": "integer",
            "minimum": 1,
            "description": "How many of the permit's registered vehicles may be parked at the\nplace at once (Part 14 §14.2d). Absent means every registered\nvehicle may. A vehicle beyond the limit is an overage."
          },
          "overageBilling": {
            "type": "object",
            "description": "What an overage costs (Part 14 §14.2d).",
            "required": [
              "mode"
            ],
            "properties": {
              "mode": {
                "type": "string",
                "enum": [
                  "rack",
                  "dayRate",
                  "none"
                ],
                "description": "`rack` — the place's transient rate deck; `dayRate` — the flat `dayRate`; `none` — recorded, not billed."
              },
              "dayRate": {
                "$ref": "#/components/schemas/AmountInCurrency"
              }
            }
          }
        }
      },
      "SessionDetail": {
        "title": "SessionDetail",
        "description": "The `apds-ext:apx:session-detail@1.0` decoration on an APDS Session\n(Part 5 §5.8): what the pairing of reads decided and APDS has no\nmembers for — the reads behind the visit, why and how it ended, the\nmatches it rests on, and the parent visit of an area Session. Written\nwith the native Session POST/PUT by an external pairing engine; a\nserver that pairs reads itself SHOULD write the same block on its own\nSessions. A plain APDS client ignores it. It adds no event topic and\ncarries no plate characters. A write that breaks a consistency rule\nof §5.8 is 422 and nothing is written.",
        "type": "object",
        "properties": {
          "reads": {
            "type": "array",
            "description": "The reads attached to this Session. A read already bound as\n`entry` or `exit` to another Session of the same place is refused\nwith 409 `read-already-bound` unless `supersedes` names that Session.\nA read naming no Observation visible to the caller is 422\n`reference-unknown`.",
            "items": {
              "$ref": "#/components/schemas/SessionReadBinding"
            }
          },
          "supersedes": {
            "description": "The Session whose reads this write takes over (a re-pairing).",
            "$ref": "#/components/schemas/Reference"
          },
          "lifecycle": {
            "type": "string",
            "enum": [
              "open",
              "ended",
              "final",
              "disputed"
            ],
            "description": "`open` — a vehicle is in the facility, no `actualEnd` yet; `ended` —\nclosed, may still be revised; `final` — no further revision\nexpected; `disputed` — under review. Every state but `open` requires\n`actualEnd`, and `open` forbids it (422 `request-unprocessable`\notherwise). `final` is the writer's statement, never a lock: a\nserver MUST NOT refuse a later revision on that ground."
          },
          "closure": {
            "$ref": "#/components/schemas/SessionClosure"
          },
          "flags": {
            "type": "array",
            "description": "Open flags — `entryUnknown`, `orphanExit`, `reentry`, `passThrough`, or implementer values.",
            "items": {
              "type": "string"
            }
          },
          "matches": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MatchEvidence"
            }
          },
          "parent": {
            "description": "The visit this area Session is part of (className `Session`). The\nparent's `hierarchyElement` MUST be an ancestor of this Session's\n(422 `request-unprocessable` otherwise). Consumers count visits by\nSessions without `parent`; children still open when the parent\nends SHOULD be closed no later than its `actualEnd` with `endReason`\n`parentExit`.",
            "$ref": "#/components/schemas/Reference"
          },
          "passThrough": {
            "type": "boolean",
            "description": "An area stay shorter than the area's minimum dwell — never scored or billed."
          }
        }
      },
      "MatchEvidence": {
        "title": "MatchEvidence",
        "description": "How a link to a Session was established and how sure it is (Part 5\n§5.8; shared by the `matches[]` member of\n`apds-ext:apx:session-detail@1.0` and the decoration\n`apds-ext:apx:match-evidence@1.0` on a Violation or ValetTicket).\nCarries no plate characters and no vehicle attribute values\n(Part 9 §9.6). Where both ends of one link carry evidence (the\nSession's `matches[]` entry and the decoration on the Violation or\nValetTicket), the two MUST agree. Evidence with `plate.method:\nlenient` or `applied: false` may excuse a stay but never accuse one:\n`issue` on a Violation resting on it is 409 `violation-not-issuable`\n(Part 19 §19.4 rule 5).",
        "type": "object",
        "required": [
          "target",
          "matchType",
          "applied"
        ],
        "properties": {
          "target": {
            "description": "The record at the other end of the link. In `matches[]`: an\nAssignedRight, a ValetTicket, a Violation, a PlateListEntry, or an\nObservation. In the decoration on a Violation or ValetTicket: the\nSession.",
            "$ref": "#/components/schemas/Reference"
          },
          "matchType": {
            "type": "string",
            "enum": [
              "right",
              "valet",
              "violation",
              "list",
              "exitPairing",
              "sweep",
              "other"
            ],
            "description": "The kind of link: `right` — an AssignedRight covers the stay;\n`valet` — a ValetTicket's stay; `violation` — a Violation's stay;\n`list` — a plate-list entry matched the vehicle (Part 24);\n`exitPairing` — an exit read paired to the Session's entry;\n`sweep` — the vehicle seen during an inventory or patrol sweep tied\nto the Session; `other` — anything else.",
            "examples": [
              "right"
            ]
          },
          "plate": {
            "type": "object",
            "description": "How the plate strings agreed, when the link rests on a plate.",
            "required": [
              "method"
            ],
            "properties": {
              "method": {
                "type": "string",
                "enum": [
                  "exact",
                  "alias",
                  "fold",
                  "fuzzy",
                  "lenient",
                  "reviewer"
                ],
                "description": "`exact` — the same characters; `alias` — a plate the right or\naccount lists for the same vehicle; `fold` — equal after\nfolding look-alike characters (O/0, I/1, B/8); `fuzzy` — within\nthe implementation's edit-cost threshold; `lenient` — accepted\nunder a relaxed rule that may excuse a stay but never accuse\none; `reviewer` — a person judged the plates to match where no\nautomatic method did."
              },
              "editCost": {
                "type": [
                  "number",
                  "null"
                ],
                "minimum": 0,
                "description": "The weighted edit cost of a `fuzzy` or `lenient` match; null otherwise."
              },
              "jurisdiction": {
                "type": "string",
                "enum": [
                  "agrees",
                  "differs",
                  "unknown"
                ]
              }
            }
          },
          "vehicle": {
            "type": "object",
            "description": "The vehicle-attribute evidence (make, model, colour) behind the match, as a level and a score — never the values.",
            "required": [
              "level"
            ],
            "properties": {
              "level": {
                "type": "string",
                "enum": [
                  "unknown",
                  "mismatch",
                  "inconclusive",
                  "weak",
                  "good",
                  "strong"
                ],
                "description": "`unknown` — not compared; `mismatch` — the attributes contradict\nthe match; `inconclusive` — compared, no signal; `weak`, `good`,\n`strong` — increasing support."
              },
              "llr": {
                "type": "number",
                "description": "Log-likelihood ratio of the vehicle evidence."
              },
              "model": {
                "type": "string",
                "description": "The evidence model and version that scored it, opaque."
              }
            }
          },
          "applied": {
            "type": "boolean",
            "description": "False is a shadow match — recorded for evaluation, not acted on. A\nlink the record actually carries has `applied: true`."
          },
          "decidedBy": {
            "type": "string",
            "enum": [
              "system",
              "person"
            ],
            "description": "Whether software or a person made the link. A `matchTicket` that\nbinds a lane-inquiry candidate SHOULD be recorded as `person`\n(Part 5 §5.8 rule 5)."
          },
          "decidedTime": {
            "description": "When the link was made.",
            "$ref": "#/components/schemas/DateTime"
          }
        }
      },
      "StayCompliance": {
        "title": "StayCompliance",
        "description": "The `apds-ext:apx:stay-compliance@1.0` decoration on an APDS Session\n(Part 5 §5.9): the outcome a compliance engine scored for the stay,\nand the policy it measured against. Written with the native Session\nPOST/PUT by the engine; a server that scores stays itself SHOULD write\nthe same block. The rules that produce the outcome stay in the engine.\n\nA status is not a Violation: a `violation`-family status issues\nnothing (Part 19 issues violations). Served only to tokens with\n`apx.compliance:read`, and written only with `apx.compliance:write`\n(403 `insufficient-scope`); a write that omits it keeps the stored\nblock. It carries no plate characters.",
        "type": "object",
        "required": [
          "status",
          "family",
          "evaluatedTime",
          "sequence"
        ],
        "properties": {
          "status": {
            "type": "string",
            "description": "definedValue of apx-stay-compliance-statuses, or an implementer code.",
            "examples": [
              "overstay"
            ]
          },
          "family": {
            "type": "string",
            "enum": [
              "compliant",
              "violation",
              "withheld",
              "other"
            ],
            "description": "The family of the status. For a registry status it MUST be the\nfamily the registry gives (422 `request-unprocessable`).\n`compliant` — rights or an exemption covered the stay\n`violation` — the stay was not covered as the policy requires\n`withheld` — not scored, or held back for review\n`other` — an outcome none of the other families fits, for example paid after exit"
          },
          "pendingStatus": {
            "type": "string",
            "description": "The status the stay would have once a person confirms it; present only with `status` `reviewRequired` (422 `request-unprocessable` otherwise).",
            "examples": [
              "overstay"
            ]
          },
          "flags": {
            "type": "array",
            "description": "Facts behind the status — definedValues of apx-stay-compliance-flags, or implementer codes.",
            "items": {
              "type": "string"
            },
            "examples": [
              [
                "paidAfterExit"
              ]
            ]
          },
          "evaluatedTime": {
            "description": "When the evaluation ran.",
            "$ref": "#/components/schemas/DateTime"
          },
          "sequence": {
            "type": "integer",
            "minimum": 1,
            "description": "Orders the evaluations of one Session. A write with a lower `sequence` than the one held is 409 `evaluation-out-of-order`; an equal one replaces it."
          },
          "final": {
            "type": "boolean",
            "description": "The writer's statement that no further evaluation is expected; never a lock."
          },
          "policy": {
            "description": "The EnforcementPolicy, at its version, the evaluation used (Part 19 §19.10), whose `stayGrace` explains the result. Naming no policy visible to the caller is 422 `reference-unknown`.",
            "$ref": "#/components/schemas/VersionedReference"
          }
        },
        "examples": [
          {
            "status": "overstay",
            "family": "violation",
            "flags": [
              "paidAfterExit"
            ],
            "evaluatedTime": "2026-10-21T14:05:00Z",
            "sequence": 3,
            "final": false,
            "policy": {
              "id": "d1900000-0000-4000-8000-000000000010",
              "className": "EnforcementPolicy",
              "version": 4
            }
          }
        ]
      },
      "ViolationSource": {
        "title": "ViolationSource",
        "description": "The `apds-ext:apx:violation-source@1.0` decoration (Part 19 §19.13): a\nviolation issued by an external enforcement system and imported\nthrough `POST /v1/enforcement/violation-imports`, keyed on `system` +\n`recordId`. `sourceRevision`, or without one `sourceUpdatedTime`,\norders the source's revisions.",
        "type": "object",
        "required": [
          "system",
          "recordId"
        ],
        "properties": {
          "system": {
            "type": "string",
            "description": "The issuing system, opaque (`passport`, `aims`…)."
          },
          "recordId": {
            "type": "string",
            "description": "The source's own citation or record id."
          },
          "sourceStatus": {
            "type": "string",
            "description": "The source's own status vocabulary, carried as reported (`issued`, `warned`, `voided`, `dismissed`, `partiallyPaid`…)."
          },
          "sourceRevision": {
            "type": "integer",
            "minimum": 0,
            "description": "The source's revision counter; a re-import with a higher value updates the record."
          },
          "sourceUpdatedTime": {
            "description": "When the source last changed the record. Orders revisions when the source keeps no `sourceRevision`.",
            "$ref": "#/components/schemas/DateTime"
          },
          "receivedTime": {
            "description": "When this server applied the revision it now holds. Server-set.",
            "readOnly": true,
            "$ref": "#/components/schemas/DateTime"
          },
          "officer": {
            "type": "string",
            "description": "The source's officer identifier, opaque."
          },
          "violationCode": {
            "type": "string",
            "description": "The source's own violation code, when it has no `apx-violation-types` equivalent."
          }
        }
      },
      "PaymentDetail": {
        "title": "PaymentDetail",
        "description": "The `apds-ext:apx:payment-detail@1.0` decoration (Part 13 §13.6a) on a\n`PaymentRecord` or an APDS `Payment`: the rate sold and the lines that\nsum to the total, so revenue reports and the deck price check have\nthe base amount, the fee, and the product without a bilateral code.\nOn a `PaymentRecord` it carries `rateSold` and `lines`; on a native\nAPDS `Payment` it carries `rateSold` only, because the Payment's own\n`paymentLines` are the itemization there.",
        "type": "object",
        "minProperties": 1,
        "properties": {
          "rateSold": {
            "type": "object",
            "description": "The rate the vendor sold, as the vendor names it.",
            "properties": {
              "id": {
                "type": "string",
                "description": "The vendor's rate id, or the APDS RateTable id when the deck is the source."
              },
              "name": {
                "type": "string"
              },
              "rateTable": {
                "description": "The APDS RateTable at the version applied, when known.",
                "$ref": "#/components/schemas/VersionedReference"
              },
              "product": {
                "type": "string",
                "enum": [
                  "standard",
                  "pass",
                  "other"
                ]
              },
              "class": {
                "type": "string",
                "enum": [
                  "standard",
                  "validation",
                  "discount",
                  "zeroed",
                  "other"
                ]
              }
            }
          },
          "lines": {
            "type": "array",
            "minItems": 1,
            "description": "The itemization, as APDS `PaymentLine`s (by `$ref`, never\nre-shaped). Each line's code is its `idCode`: a definedValue of\n`apx-payment-line-codes` (Part 11) or an implementer code. A line\ncoded `validation` has `paymentType: validation` and its `value` is\nthe value the validation offset (not money collected); every other\nline has `paymentType: payment`, and a reduction (`discount`) is a\nnegative `value`. The `currencyValue`s of the `paymentType:\npayment` lines MUST sum to the record's `amount`, in its\n`currencyType`; otherwise 422 `request-unprocessable` and nothing\nis charged. Only on a `PaymentRecord`: on a native APDS `Payment`\nthe itemization is that Payment's own `paymentLines` and this\nmember is absent (one store, Part 13 §13.6a).",
            "items": {
              "$ref": "#/components/schemas/PaymentLine"
            }
          }
        }
      },
      "CredentialDigest": {
        "title": "CredentialDigest",
        "description": "The `apds-ext:apx:credential-digest@1.0` decoration (Part 9 §9.6 rule\n6): a keyed digest of a normalized credential identification (a plate),\nso a consumer that only needs \"same plate?\" can match without the\nplate itself. `value` is base64url(HMAC-SHA-256(key, normalized\nidentification)); the key is named by `keyId` and distributed through\n`GET /v1/digest-keys`. Visible under `apx.data:read`.",
        "type": "object",
        "required": [
          "alg",
          "keyId",
          "value"
        ],
        "properties": {
          "alg": {
            "type": "string",
            "enum": [
              "HS256"
            ]
          },
          "keyId": {
            "type": "string",
            "description": "The digest key the value was computed under (rotation by keyId)."
          },
          "value": {
            "type": "string",
            "description": "base64url, no padding."
          },
          "credentialType": {
            "$ref": "#/components/schemas/CredentialTypeEnum"
          }
        }
      },
      "EquipmentDetail": {
        "title": "EquipmentDetail",
        "description": "What a piece of hardware is, where it is, and what it does (Part 26\n§26.1). Carried on an APDS SupplementalEquipment as the Level B\ndecoration `apds-ext:apx:equipment-detail@1.0` in its `extensions`\ncontainer (Part 4 §4.3). The equipment TYPE stays the APDS\n`EquipmentTypeEnum` (often `paymentMachine` or `other`); `role` says\nwhat the item does on the site, from the fixed code list\n`apx-equipment-roles`.\n\n`firmwareVersion` and `softwareVersion` are optional but RECOMMENDED,\nand readable by every client of the place, because knowing what runs\non each device is what makes integration at scale possible. IP\naddresses are deliberately left out in the interest of security:\ntogether with model and firmware they map a site's network for an\nattacker, and no APX flow connects to a device directly. They could\nbe added later, as an optional member behind a restricted scope, if a\nreal need arises. MAC addresses stay, as the hardware identity when\nthe serial label is gone or when the MAC is the serial.",
        "type": "object",
        "required": [
          "role"
        ],
        "properties": {
          "role": {
            "type": "string",
            "description": "definedValue from apx-equipment-roles (a fixed list; `other` is a code, not free text).",
            "examples": [
              "exitVerifier"
            ]
          },
          "manufacturer": {
            "type": "string",
            "examples": [
              "Amano McGann"
            ]
          },
          "model": {
            "type": "string",
            "examples": [
              "AGP-1500"
            ]
          },
          "firmwareVersion": {
            "type": "string",
            "examples": [
              "4.2.1"
            ]
          },
          "softwareVersion": {
            "type": "string",
            "description": "The application software on the device, when distinct from its firmware.",
            "examples": [
              "2026.3"
            ]
          },
          "serialNumber": {
            "type": "string",
            "examples": [
              "AMG-55-20318"
            ]
          },
          "macAddresses": {
            "type": "array",
            "description": "One per network interface, lower-case hex without separators.",
            "items": {
              "type": "string",
              "pattern": "^[0-9a-f]{12}$"
            },
            "examples": [
              [
                "001a2b3c4d5e"
              ]
            ]
          },
          "installedAt": {
            "type": "string",
            "format": "date",
            "examples": [
              "2024-03-18"
            ]
          },
          "area": {
            "type": "string",
            "description": "Where on the site the item is, a definedValue from apx-area-types (Part 26 §26.2).",
            "examples": [
              "lane"
            ]
          },
          "level": {
            "type": "string",
            "description": "The floor label as signed on site.",
            "examples": [
              "P1"
            ]
          },
          "lane": {
            "description": "The VehicularAccess the item serves. Absent for place-level equipment (an access door, a pay-on-foot station, a server).",
            "$ref": "#/components/schemas/Reference"
          },
          "builtInto": {
            "description": "The host equipment this item is part of (an intercom in a door's call box, a camera in a pay station).",
            "$ref": "#/components/schemas/Reference"
          },
          "controls": {
            "type": "array",
            "description": "The barriers this device opens (an exit verifier that controls gate 2, a card reader that controls an access door).",
            "items": {
              "$ref": "#/components/schemas/Reference"
            }
          },
          "serviceProvider": {
            "type": "object",
            "description": "Who services the item. An organisation and a support reference, never a person.",
            "properties": {
              "organisation": {
                "$ref": "#/components/schemas/Reference"
              },
              "supportReference": {
                "type": "string",
                "description": "The provider's own reference for this unit or contract (an asset tag, a contract number).",
                "examples": [
                  "SVC-2024-0918"
                ]
              }
            }
          }
        },
        "examples": [
          {
            "role": "exitVerifier",
            "manufacturer": "Amano McGann",
            "model": "AGP-1500",
            "firmwareVersion": "4.2.1",
            "softwareVersion": "2026.3",
            "serialNumber": "AMG-55-20318",
            "macAddresses": [
              "001a2b3c4d5e"
            ],
            "installedAt": "2024-03-18",
            "area": "lane",
            "level": "P1",
            "lane": {
              "id": "b2000000-0000-4000-8000-000000000002",
              "className": "VehicularAccess"
            },
            "controls": [
              {
                "id": "c2000000-0000-4000-8000-000000000021",
                "className": "SupplementalEquipment"
              }
            ],
            "serviceProvider": {
              "organisation": {
                "id": "a1000000-0000-4000-8000-000000000009",
                "className": "Organisation"
              },
              "supportReference": "SVC-2024-0918"
            }
          }
        ]
      },
      "CameraDetail": {
        "title": "CameraDetail",
        "description": "A camera anywhere on the site, not only on a lane (Part 26 §26.3).\nCarried on a SupplementalEquipment whose EquipmentDetail `role` is\n`camera`, as the Level B decoration `apds-ext:apx:camera@1.0`. Where\nthe camera is (`area`, `level`, `lane`) and what it is built into\n(`builtInto`) are EquipmentDetail members, shared with every other\npiece of hardware; this decoration adds how it is mounted, what it\nlooks at, and how it can be viewed. It holds no addresses, usernames\nor passwords: a view is obtained through `POST /v1/cameras/{id}/views`\nand the password never leaves the site (Part 26 §26.3). Camera models\nand stream profiles follow ONVIF (Profile S, Profile T) and are not\nredefined. `apds-ext:apx:lane-cameras@1.0` (Part 13) is unchanged.",
        "type": "object",
        "required": [
          "view"
        ],
        "properties": {
          "mounting": {
            "type": "string",
            "enum": [
              "builtIn",
              "overhead",
              "pole",
              "wall",
              "ceiling",
              "other"
            ],
            "description": "When `builtIn`, EquipmentDetail `builtInto` names the host, for example a pay station's driver camera."
          },
          "view": {
            "type": "array",
            "minItems": 1,
            "description": "What the camera looks at; one camera may cover several.",
            "items": {
              "type": "string",
              "enum": [
                "plate",
                "vehicle",
                "driver",
                "equipmentInteraction",
                "pedestrians",
                "areaOverview",
                "other"
              ]
            }
          },
          "faces": {
            "type": "string",
            "enum": [
              "inward",
              "outward"
            ],
            "description": "For lanes, plazas and ramps, relative to the facility (Part 13 §13.3a)."
          },
          "primary": {
            "type": "boolean",
            "description": "Show this camera first for its lane or area."
          },
          "ptz": {
            "type": "boolean",
            "description": "Can pan, tilt and zoom."
          },
          "recorder": {
            "type": "object",
            "description": "The DVR or NVR that records it (an equipment item with role `videoRecorder`) and the channel.",
            "properties": {
              "equipment": {
                "$ref": "#/components/schemas/Reference"
              },
              "channel": {
                "type": "string",
                "examples": [
                  "7"
                ]
              }
            }
          },
          "streams": {
            "type": "array",
            "description": "What the camera can deliver, so a host knows what kind of view to ask for.",
            "items": {
              "type": "object",
              "required": [
                "protocol"
              ],
              "properties": {
                "protocol": {
                  "type": "string",
                  "enum": [
                    "webrtc",
                    "hls",
                    "rtsp",
                    "mjpeg",
                    "snapshot"
                  ]
                },
                "transport": {
                  "type": "string",
                  "examples": [
                    "tcp"
                  ]
                },
                "resolution": {
                  "type": "string",
                  "examples": [
                    "1920x1080"
                  ]
                }
              }
            }
          },
          "retentionDays": {
            "type": "integer",
            "minimum": 0,
            "description": "How long recordings are kept; stated per camera because `driver` and `pedestrians` views capture faces (Part 26 §26.3).",
            "examples": [
              30
            ]
          },
          "credentialRef": {
            "type": "string",
            "description": "For a camera that cannot sit behind a gateway, the label of the\ncredential the receiving system looks up in its own vault. NEVER\nthe secret itself; the secret is exchanged once, outside APX, at\nonboarding (Part 9 §9.7).",
            "examples": [
              "site-0042/cam-door-1"
            ]
          }
        },
        "examples": [
          {
            "mounting": "wall",
            "view": [
              "pedestrians"
            ],
            "primary": true,
            "ptz": false,
            "recorder": {
              "equipment": {
                "id": "c2000000-0000-4000-8000-000000000090",
                "className": "SupplementalEquipment"
              },
              "channel": "7"
            },
            "streams": [
              {
                "protocol": "webrtc"
              },
              {
                "protocol": "snapshot"
              }
            ],
            "retentionDays": 30
          }
        ]
      },
      "ExternalIdentifiers": {
        "title": "ExternalIdentifiers",
        "description": "The ids other systems use for the same place, lane or equipment\n(Part 26 §26.6). Carried on any HierarchyElement as the Level B\ndecoration `apds-ext:apx:external-ids@1.0`. APDS\n`SupplementalFacility.externalIdentifiers` holds untyped strings; here\neach id says which system issued it. `system` is a URI the issuer\nowns, usually its own domain, so APX names no products or platforms.\n`POST /v1/identifiers:resolve` finds the APX record from such an id.",
        "type": "object",
        "required": [
          "identifiers"
        ],
        "properties": {
          "identifiers": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": [
                "system",
                "id"
              ],
              "properties": {
                "system": {
                  "type": "string",
                  "format": "uri",
                  "description": "A URI owned by the system that issued the id.",
                  "examples": [
                    "https://parcs.example"
                  ]
                },
                "id": {
                  "type": "string",
                  "examples": [
                    "LOT-0042"
                  ]
                }
              }
            }
          }
        },
        "examples": [
          {
            "identifiers": [
              {
                "system": "https://parcs.example",
                "id": "LOT-0042"
              },
              {
                "system": "https://calls.example",
                "id": "acct-7f31"
              }
            ]
          }
        ]
      },
      "PlaceOperations": {
        "title": "PlaceOperations",
        "description": "Operational facts about a place that a call centre needs before a\ncall (Part 26 §26.5). Carried on a place HierarchyElement as the\nLevel B decoration `apds-ext:apx:place-operations@1.0`.\n`escalationContacts` lists roles in calling order, never names or\nphone numbers: the call platform holds those, so APX carries no\npersonal contact data. A Part 17 approval request is addressed to a\nrole from this list.",
        "type": "object",
        "properties": {
          "commsAccountId": {
            "type": "string",
            "description": "The id the call platform uses for the whole site (its account), the site-level pair of `CommsPoint.commsDeviceId`.",
            "examples": [
              "acct-7f31"
            ]
          },
          "escalationContacts": {
            "type": "array",
            "description": "Who to escalate to, by role, in order.",
            "items": {
              "type": "object",
              "required": [
                "role",
                "order"
              ],
              "properties": {
                "role": {
                  "type": "string",
                  "description": "definedValue from apx-escalation-roles.",
                  "examples": [
                    "siteManager"
                  ]
                },
                "order": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Calling order; 1 is tried first."
                },
                "hours": {
                  "description": "When this role is reachable. Absent means always.",
                  "$ref": "#/components/schemas/Period"
                }
              }
            }
          }
        },
        "examples": [
          {
            "commsAccountId": "acct-7f31",
            "escalationContacts": [
              {
                "role": "attendant",
                "order": 1
              },
              {
                "role": "siteManager",
                "order": 2
              },
              {
                "role": "operatorOnCall",
                "order": 3
              }
            ]
          }
        ]
      },
      "PlaceInformation": {
        "title": "PlaceInformation",
        "description": "Defines information concerning multiple features relating to parking hierarchy elements.",
        "type": "object",
        "x-package": "place.characteristics",
        "properties": {
          "characteristics": {
            "$ref": "#/components/schemas/PlaceCharacteristics"
          },
          "contacts": {
            "type": "array",
            "description": "Contact info for hierarchy element.",
            "items": {
              "$ref": "#/components/schemas/Contact"
            }
          },
          "marketing": {
            "$ref": "#/components/schemas/Marketing"
          },
          "operatingRestrictions": {
            "type": "array",
            "description": "Operating restrictions for hierarchy element.",
            "items": {
              "$ref": "#/components/schemas/OperatingRestrictions"
            }
          },
          "rgbColours": {
            "type": "array",
            "description": "Colours associated with hierarchy element.",
            "items": {
              "$ref": "#/components/schemas/RGBColour"
            }
          },
          "times": {
            "$ref": "#/components/schemas/Times"
          },
          "paymentMethods": {
            "type": "array",
            "description": "Accepted payment methods at hierarchy element.",
            "items": {
              "$ref": "#/components/schemas/PaymentMethod"
            }
          },
          "safetyStandardClassifications": {
            "type": "array",
            "description": "Safety standard classifications.",
            "items": {
              "$ref": "#/components/schemas/SafetyStandardClassification"
            }
          }
        }
      },
      "SpaceDimension": {
        "title": "SpaceDimension",
        "description": "A component that provides dimension information. \nThe product of width and height must not be necessarily be the square footage (e.g. in multi-storey buildings or when some zones are not part of the square footage).",
        "type": "object",
        "x-package": "place.characteristics",
        "properties": {
          "dimensionHeight": {
            "$ref": "#/components/schemas/LinearDimension"
          },
          "dimensionLength": {
            "$ref": "#/components/schemas/LinearDimension"
          },
          "dimensionWidth": {
            "$ref": "#/components/schemas/LinearDimension"
          },
          "dimensionUsableArea": {
            "$ref": "#/components/schemas/AreaDimension"
          },
          "weightLimit": {
            "$ref": "#/components/schemas/WeightDimension"
          }
        }
      },
      "MaximumDimensions": {
        "title": "MaximumDimensions",
        "description": "A class defining information relating to the maximum physical dimensions for the defined purpose",
        "type": "object",
        "x-package": "place.characteristics",
        "properties": {
          "maximumHeight": {
            "$ref": "#/components/schemas/LinearDimension"
          },
          "maximumLength": {
            "$ref": "#/components/schemas/LinearDimension"
          },
          "maximumWidth": {
            "$ref": "#/components/schemas/LinearDimension"
          }
        }
      },
      "OperatingRestrictions": {
        "title": "OperatingRestrictions",
        "description": "A class defining operating restrictions.",
        "type": "object",
        "x-package": "place.characteristics",
        "properties": {
          "operatingRestriction": {
            "$ref": "#/components/schemas/OperatingRestrictionTypeEnum"
          },
          "operatingRestrictionContext": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "times": {
            "$ref": "#/components/schemas/OverallPeriod"
          }
        },
        "required": [
          "operatingRestriction"
        ]
      },
      "SpecificLanguageString": {
        "title": "SpecificLanguageString",
        "description": "Object containing a language code (using ISO 639-1:2002) and the translated string.",
        "type": "object",
        "x-package": "common",
        "properties": {
          "language": {
            "$ref": "#/components/schemas/LanguageCode"
          },
          "string": {
            "type": "string",
            "description": "Translated string",
            "examples": [
              "This is a translated string"
            ]
          }
        },
        "required": [
          "language",
          "string"
        ]
      },
      "EMail": {
        "title": "EMail",
        "description": "Represents an eMail address.",
        "type": "string",
        "x-package": "common",
        "format": "email",
        "examples": [
          "john.doe@npp.com"
        ]
      },
      "DemandTable": {
        "title": "DemandTable",
        "description": "Defines the parameters of reporting actual usage of parking in a Hierarchy Element",
        "type": "object",
        "x-package": "place.occupancy",
        "properties": {
          "frequency": {
            "$ref": "#/components/schemas/Duration"
          },
          "timestamp": {
            "description": "Timestamp when the demand table data was compiled.",
            "$ref": "#/components/schemas/DateTime"
          },
          "demandType": {
            "type": "array",
            "description": "Occupancy for area",
            "items": {
              "$ref": "#/components/schemas/DemandType"
            }
          },
          "demandSpaceType": {
            "type": "array",
            "description": "Occupancy for single spaces",
            "items": {
              "$ref": "#/components/schemas/DemandSpaceType"
            }
          }
        }
      },
      "ReferencedCodeListEntry": {
        "title": "ReferencedCodeListEntry",
        "description": "Provides a structure to support reference to an entry in a previously defined user-defined code list.",
        "type": "object",
        "x-package": "common",
        "properties": {
          "codeListEntryId": {
            "$ref": "#/components/schemas/Reference"
          },
          "codeListId": {
            "$ref": "#/components/schemas/VersionedReference"
          },
          "entryDefinedValue": {
            "type": "string",
            "description": "Free-text defined text (name) for the code list entry being referenced."
          }
        },
        "required": [
          "entryDefinedValue"
        ]
      },
      "ImageTypeEnum": {
        "title": "ImageTypeEnum",
        "description": "the nature of the captured image",
        "type": "string",
        "enum": [
          "overview",
          "plate"
        ],
        "x-tags": [
          "enumeration"
        ]
      },
      "CountryCode": {
        "title": "CountryCode",
        "description": "EN ISO 3166-1 two-character country code.",
        "type": "string",
        "x-package": "common",
        "pattern": "^[A-Z]{2}$",
        "examples": [
          "GB"
        ]
      },
      "ContactByReference": {
        "title": "ContactByReference",
        "description": "Contact information that is addressed via a reference.",
        "type": "object",
        "x-package": "contact",
        "allOf": [
          {
            "$ref": "#/components/schemas/Contact"
          },
          {
            "type": "object",
            "properties": {
              "contactReference": {
                "$ref": "#/components/schemas/VersionedReference"
              }
            },
            "required": [
              "contactReference"
            ]
          }
        ]
      },
      "OverallPeriod": {
        "title": "OverallPeriod",
        "description": "A continuous or discontinuous period of validity defined by overall bounding start and end times and the possible intersection of valid periods (potentially recurring) with the complement of exception periods (also potentially recurring).",
        "type": "object",
        "x-package": "time",
        "properties": {
          "overallStartTime": {
            "description": "Start of bounding period of validity defined by date and time.",
            "$ref": "#/components/schemas/DateTime"
          },
          "overallEndTime": {
            "description": "End of bounding period of validity defined by date and time.",
            "$ref": "#/components/schemas/DateTime"
          },
          "validPeriods": {
            "type": "array",
            "description": "A single time period, a recurring time `Period` period or a set of different recurring time periods during which validity is true.",
            "items": {
              "$ref": "#/components/schemas/Period"
            }
          },
          "exceptionPeriods": {
            "type": "array",
            "description": "A single time period, a recurring time Period period or a set of different recurring time periods during which validity is false.",
            "items": {
              "$ref": "#/components/schemas/Period"
            }
          }
        },
        "required": [
          "overallStartTime"
        ]
      },
      "AddressLine": {
        "title": "AddressLine",
        "description": "A class defining information concerning one line of a postal address.",
        "type": "object",
        "x-package": "place.characteristics",
        "properties": {
          "order": {
            "type": "integer",
            "minimum": 0,
            "description": "The sequence order that the address line element should be displayed in"
          },
          "text": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "type": {
            "$ref": "#/components/schemas/AddressLineTypeEnum"
          }
        },
        "required": [
          "order",
          "text",
          "type"
        ]
      },
      "LanguageCode": {
        "title": "LanguageCode",
        "description": "ISO 639-1:2002 language code.",
        "type": "string",
        "x-package": "common",
        "pattern": "^[a-z]{2}$",
        "examples": [
          "en"
        ]
      },
      "EmailTypeEnum": {
        "title": "EmailTypeEnum",
        "description": "Defines the supported lists of different email contact types\n* customerService: The email contact is for customer service.\n* general: The email contact is general in nature.\n* helpdesk: The email contact is a helpdesk.\n* individual: The email contact is for a specified individual.",
        "type": "string",
        "x-package": "contact.enums",
        "enum": [
          "customerService",
          "general",
          "helpdesk",
          "individual"
        ]
      },
      "ValidityStatusEnum": {
        "title": "ValidityStatusEnum",
        "description": "Values of validity status that can be assigned to a described event, action or item.\n* active : The described event, action or item is currently active regardless of the definition of the validity time specification.\n* definedByValidityTimeSpec : The validity status of the described event, action or item is in accordance with the definition of the validity time specification.\n* planned : The described event, action or item is currently planned regardless of the definition of the validity time specification.\n* suspended : The described event, action or item is currently suspended, that is inactive, regardless of the definition of the validity time specification.",
        "type": "string",
        "x-package": "time.enums",
        "enum": [
          "active",
          "definedByValidityTimeSpec",
          "planned",
          "suspended"
        ]
      },
      "RightPoolRelativeValidity": {
        "title": "RightPoolRelativeValidity",
        "type": "object",
        "x-package": "right_specification",
        "description": "A specific calendar can be defined to represent the number of AssignedRights available for distribution in a specific recurring time period via RelativeValidity.",
        "properties": {
          "period": {
            "$ref": "#/components/schemas/Period"
          }
        }
      },
      "RateDiscount": {
        "title": "RateDiscount",
        "description": "Defines discount rates to be applied to a RateTable",
        "type": "object",
        "x-package": "rate",
        "properties": {
          "fixedValue": {
            "$ref": "#/components/schemas/AmountInCurrency"
          },
          "discountRate": {
            "type": "number",
            "description": "Proportionate discount (-) or surcharge (+) to be applied to all values in the referenced RateTable.",
            "minimum": 0,
            "maximum": 100,
            "format": "float"
          }
        }
      },
      "OverpaymentPolicyTypeEnum": {
        "title": "OverpaymentPolicyTypeEnum",
        "description": "list of overpayment policy types",
        "x-package": "right_specification",
        "type": "string",
        "enum": [
          "rateEndCutOff",
          "fullTimePurchased",
          "creditCarryOver"
        ]
      },
      "CurrencyCode": {
        "title": "CurrencyCode",
        "description": "Code for the specified currency as defined in ISO 4217.",
        "type": "string",
        "x-package": "common",
        "pattern": "^[A-Z]{3}$",
        "examples": [
          "GBP",
          "EUR"
        ]
      },
      "Time": {
        "title": "Time",
        "description": "ISO-8601 format definition of a time - format HH:MM.",
        "type": "string",
        "x-package": "common",
        "pattern": "^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$",
        "examples": [
          "12:15"
        ]
      },
      "RateLine": {
        "title": "RateLine",
        "description": "Describes a specific line in a __RateTable__. __incrementPeriod__ represents the time period for incrementing the __RateLine__ charge. \nIf set to the same as the duration of the period between the __durationStart__ and __durationEnd__, the increment will occur once per period, i.e. a flat rate time-based tier charge rate.",
        "type": "object",
        "x-package": "rate",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "sequence": {
                "type": "integer",
                "description": "The position of this rate line within a __RateLineCollection__",
                "minimum": 1
              },
              "rateLineType": {
                "$ref": "#/components/schemas/RateLineTypeEnum"
              },
              "description": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "durationStart": {
                "type": "string",
                "description": "If used, indicates the start time for the applicability of the specific RateLine, generally with respect to the start of the parking Session, e.g. the start of a time-based tier charge rate. The format can be either of _hh:mm_ (hours and minutes) or _dd:hh:mm_ (days, hours and minutes)."
              },
              "durationEnd": {
                "type": "string",
                "description": "If used, indicates the end time for the applicability of the specific RateLine, generally with respect to the end of the parking or other mobility Session, e.g. the end of a time-based tier charge rate.The format can be either of _hh:mm_ (hours and minutes) or _dd:hh:mm_ (days, hours and minutes)."
              },
              "incrementPeriod": {
                "$ref": "#/components/schemas/Duration"
              },
              "value": {
                "type": "number",
                "format": "float"
              },
              "minValue": {
                "type": "number",
                "format": "float"
              },
              "maxValue": {
                "type": "number",
                "format": "float"
              },
              "usageCondition": {
                "$ref": "#/components/schemas/RateUsageConditionsTypeEnum"
              },
              "rateLineTax": {
                "$ref": "#/components/schemas/RateLineTax"
              }
            },
            "required": [
              "sequence",
              "rateLineType",
              "value"
            ]
          }
        ]
      },
      "CustomerCredential": {
        "title": "CustomerCredential",
        "description": "Details of a credential identifying a customer, like an individual or an organisation.",
        "type": "object",
        "x-package": "assigned_right.credential",
        "allOf": [
          {
            "$ref": "#/components/schemas/CredentialAssigned"
          }
        ]
      },
      "VehicleCredential": {
        "title": "VehicleCredential",
        "description": "Details of a credential identifying a specific vehicle.",
        "type": "object",
        "x-package": "assigned_right.credential",
        "allOf": [
          {
            "$ref": "#/components/schemas/CredentialAssigned"
          }
        ]
      },
      "OtherCredential": {
        "title": "OtherCredential",
        "description": "Details of a credential for identifying an entity other than a specific vehicle or customer.",
        "type": "object",
        "x-package": "assigned_right.credential",
        "allOf": [
          {
            "$ref": "#/components/schemas/CredentialAssigned"
          }
        ]
      },
      "Credential": {
        "title": "Credential",
        "description": "Defines a form of credential that is applicable for a specific RightSpecification.",
        "type": "object",
        "x-package": "assigned_right.credential",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/CredentialTypeEnum"
          }
        },
        "required": [
          "type"
        ]
      },
      "CredentialAssignedTypeEnum": {
        "title": "CredentialAssignedTypeEnum",
        "description": "Defines the type of Credential for one AssignedRight.",
        "type": "string",
        "x-package": "assigned_right.credential",
        "enum": [
          "customer",
          "vehicle",
          "other"
        ]
      },
      "PaymentLine": {
        "title": "PaymentLine",
        "description": "Enables transaction details to be accumulated based on the type of payment (ie, base fee, taxes, surcharges, etc)",
        "type": "object",
        "x-package": "rate.payment",
        "allOf": [
          {
            "$ref": "#/components/schemas/VersionedIdentity"
          },
          {
            "type": "object",
            "properties": {
              "identifierId": {
                "type": "string",
                "description": "Identifier for the transaction (e.g. reservation number, credit card transaction reference)."
              },
              "idCode": {
                "type": "string",
                "description": "Unique cost code identifier, potentially agreed bi-laterally between data supplier and data receiver."
              },
              "paymentType": {
                "$ref": "#/components/schemas/PaymentTypeEnum"
              },
              "value": {
                "$ref": "#/components/schemas/AmountInCurrency"
              }
            },
            "required": [
              "paymentType",
              "value"
            ]
          }
        ]
      },
      "Qualification": {
        "title": "Qualification",
        "description": "Defines a set of criteria used to test eligibility for using a specific RateTable.",
        "type": "object",
        "x-package": "rate.eligibility",
        "properties": {
          "freeToPark": {
            "type": "boolean",
            "description": "Indicates that a parking is free (TRUE) or not (FALSE)."
          },
          "withReservation": {
            "type": "boolean",
            "description": "Indicates whether a reservation is required (TRUE) or not (FALSE)."
          },
          "withMembership": {
            "type": "boolean",
            "description": "Indicates that a membership is required (TRUE) or not (FALSE)."
          },
          "membershipNames": {
            "type": "array",
            "description": "Free-text description of the membership names.",
            "items": {
              "$ref": "#/components/schemas/MultilingualString"
            }
          },
          "propulsionEnergyType": {
            "type": "array",
            "description": "Indicates fuel/energy types of eligible vehicles.",
            "items": {
              "$ref": "#/components/schemas/FuelTypeEnum"
            }
          },
          "emissions": {
            "$ref": "#/components/schemas/Emissions"
          },
          "grossWeightCharacteristics": {
            "type": "array",
            "description": "Qualify based on the vehicle's min/max gross weight characteristics",
            "uniqueItems": true,
            "maxItems": 2,
            "items": {
              "$ref": "#/components/schemas/GrossWeightCharacteristic"
            }
          },
          "heightCharacteristics": {
            "type": "array",
            "description": "Qualify based on the vehicle's min/max height characteristics",
            "uniqueItems": true,
            "maxItems": 2,
            "items": {
              "$ref": "#/components/schemas/HeightCharacteristic"
            }
          },
          "lengthCharacteristics": {
            "type": "array",
            "description": "Qualify based on the vehicle's min/max gross length characteristics",
            "uniqueItems": true,
            "maxItems": 2,
            "items": {
              "$ref": "#/components/schemas/LengthCharacteristic"
            }
          },
          "widthCharacteristics": {
            "type": "array",
            "description": "Qualify based on the vehicle's min/max gross width characteristics",
            "uniqueItems": true,
            "maxItems": 2,
            "items": {
              "$ref": "#/components/schemas/WidthCharacteristic"
            }
          },
          "vehicleTypes": {
            "type": "array",
            "description": "Qualify based on the type of vehicle.",
            "items": {
              "$ref": "#/components/schemas/VehicleTypeEnum"
            }
          },
          "vehicleLoads": {
            "type": "array",
            "description": "Qualify based on the type of load carried by the vehicle.",
            "items": {
              "$ref": "#/components/schemas/VehicleLoadTypeEnum"
            }
          },
          "userQualifications": {
            "type": "array",
            "description": "User-defined user groups qualification",
            "items": {
              "$ref": "#/components/schemas/UserQualification"
            }
          },
          "activeAssignedRight": {
            "$ref": "#/components/schemas/VersionedReference"
          },
          "linkedRightSpecification": {
            "$ref": "#/components/schemas/LinkedRightSpecification"
          },
          "paymentMethod": {
            "type": "array",
            "description": "Qualifying payment methods",
            "items": {
              "$ref": "#/components/schemas/PaymentMethod"
            }
          },
          "memberOfOtherRateTable": {
            "type": "boolean",
            "description": "Indicates if this qualification can be used in with another RateTable (TRUE) or not (FALSE)."
          },
          "rateTableMember": {
            "type": "array",
            "description": "Free-text description of other rate table membership",
            "items": {
              "type": "string"
            }
          },
          "assignRightTimes": {
            "type": "array",
            "description": "Qualify based on min/max time duration from a right being assigned",
            "uniqueItems": true,
            "maxItems": 2,
            "items": {
              "$ref": "#/components/schemas/AssignRightTime"
            }
          }
        }
      },
      "QuoteExpiration": {
        "title": "QuoteExpiration",
        "description": "class defining conditions indicating the end of the validity of a quote",
        "properties": {
          "expiresDateTime": {
            "type": "string",
            "format": "date-time"
          },
          "firstComeFirstServe": {
            "type": "boolean",
            "description": "a Boolean value shows that the availability of an Option and thus FinancialQuote are available to the requester on a first come first served basis, with no assurance that the advertised RightSpecification will be available based on actual demand"
          }
        },
        "required": [
          "firstComeFirstServe"
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "Identifiers": {
        "title": "Identifiers",
        "description": "compound reference for rate table and right specification",
        "properties": {
          "rateTableID": {
            "$ref": "#/components/schemas/VersionedReference"
          },
          "rightSpecificationId": {
            "$ref": "#/components/schemas/VersionedReference"
          },
          "rateTableId": {
            "description": "The quoted RateTable (the spelling Identifiers.required names). Publishers send this member; rateTableID is the APDS 4.1 declared spelling of the same reference and MAY accompany it (APX erratum 009).",
            "$ref": "#/components/schemas/VersionedReference"
          }
        },
        "required": [
          "rateTableId",
          "rightSpecificationId"
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "FinancialQuote": {
        "title": "FinancialQuote",
        "type": "object",
        "description": "class containing information on financila value of a quote",
        "properties": {
          "serviceProvider": {
            "$ref": "#/components/schemas/VersionedReference"
          },
          "taxIncluded": {
            "type": "boolean",
            "description": "whether tax is included in the specified monetary value or not"
          },
          "transactionId": {
            "type": "string",
            "description": "identifier for the transaction (e.g. reservation number) as agreed upon by the two entities sharing data"
          },
          "value": {
            "$ref": "#/components/schemas/AmountInCurrency"
          }
        },
        "required": [
          "taxIncluded",
          "value"
        ],
        "x-package": "Quotes",
        "x-tags": "Quotes"
      },
      "SupplyViewTypeEnum": {
        "title": "SupplyViewTypeEnum",
        "description": "Define if space quantity is demarcated or estimated.\n* spaceView : Each space is physically marked and identifiable.\n* vehicleView :  The vehicle capacity in an area is estimated based on calculating a capacity (i.e. curb length divided by a length of vehicle). The\ndistributing party decides on the appropriate length of vehicle to use.",
        "type": "string",
        "x-package": "place.occupancy.enums",
        "enum": [
          "spaceView",
          "vehicleView"
        ]
      },
      "CalculationTypeEnum": {
        "title": "CalculationTypeEnum",
        "description": "A list of the supported calculation types for demand.\n* counted : Physical determination if a space is occupied\n* derived : Space occupancy is estimated by using related data such as active payments or sold permits.\n* expected : Future prediction of occupancy levels.\n* verified : Defines an occupancy report that is considered a verified report.",
        "type": "string",
        "x-package": "place.occupancy.enums",
        "enum": [
          "counted",
          "derived",
          "expected",
          "verified"
        ]
      },
      "DisplayProof": {
        "title": "DisplayProof",
        "description": "What a sign or display confirmed it showed, and when (Part 6 §6.1a):\n`CommandResult.display` for a commanded message, and the proof members\nof a Part 26 §26.9 DisplayRecord for any message. Carries a hash and\nthe wording version, never the message text.",
        "type": "object",
        "properties": {
          "shownTime": {
            "$ref": "#/components/schemas/DateTime"
          },
          "contentHash": {
            "type": "string",
            "description": "Hash of the rendered content, so a dispute can prove what was shown."
          },
          "wordingVersion": {
            "type": "string",
            "description": "The wording version the template was rendered under."
          },
          "screenshot": {
            "description": "Access-controlled link to a capture of the display (Part 9 §9.6).",
            "$ref": "#/components/schemas/Url"
          },
          "acknowledgedBy": {
            "type": "string",
            "enum": [
              "player",
              "operator",
              "none"
            ]
          }
        }
      },
      "SupplementalFacility": {
        "title": "SupplementalFacility",
        "description": "One type of supplemental facility which can be supplemental equipment or a supplemental service facility.",
        "type": "object",
        "x-package": "place",
        "allOf": [
          {
            "$ref": "#/components/schemas/IdentifiedArea"
          },
          {
            "type": "object",
            "properties": {
              "accessibilities": {
                "type": "array",
                "description": "Information on accessibility, easements and marking for handicapped people.",
                "items": {
                  "$ref": "#/components/schemas/AccessibilityTypeEnum"
                }
              },
              "additionalDescription": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "applicableForUsers": {
                "type": "array",
                "description": "Limitation to a set of special users.",
                "items": {
                  "$ref": "#/components/schemas/UserTypeEnum"
                }
              },
              "comment": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "externalIdentifiers": {
                "type": "array",
                "description": "An external identifier for the supplemental facility, e.g. an inventory number. This attribute has an unbounded multiplicity to support identifiers for multiple occurrences of this element.'",
                "items": {
                  "type": "string"
                }
              },
              "nameOrBrand": {
                "$ref": "#/components/schemas/MultilingualString"
              },
              "otherSupplementalFacility": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/MultilingualString"
                }
              },
              "photoUrl": {
                "$ref": "#/components/schemas/Url"
              },
              "quantity": {
                "type": "integer",
                "minimum": 0,
                "description": "Number of the supplemental facility (e.g. number of toilets, restaurants, park & ride places, etc.) with respect to given restrictions. Dynamic overridable."
              },
              "regularlyCleaned": {
                "type": "boolean",
                "description": "Indication, if the supplemental facility is cleaned on a regular basis."
              },
              "rightSpecificationIds": {
                "type": "array",
                "description": "List of applicable right specifications",
                "items": {
                  "$ref": "#/components/schemas/VersionedReference"
                }
              },
              "supplementalFacilityIndex": {
                "type": "integer",
                "description": "An index to link this supplemental facility between the static and dynamic publications."
              }
            },
            "required": [
              "supplementalFacilityIndex"
            ]
          }
        ]
      },
      "EquipmentTypeEnum": {
        "title": "EquipmentTypeEnum",
        "description": "Types of equipment.\n* bikeParking: Bike parking.\n* cashMachine: Cash machine.\n* copyMachineOrService: A possibility to create copies of documents.\n* defibrillator: Medical equipment to provide first aid after heart attacks.\n* dsrcReceiver: A system to manage digital short range communication (radio beacon transceivers), e.g. for tolling roadside equipment.\n* dumpingStation: Possibility to get rid of sewerage (especially for motorhomes).\n* electricChargingStation: For charging vehicles, motorhome supply etc. The 'numberOf...' attribute specifies the number of charging stations.\n* elevator: Indication of the availability of elevators.\n* faxMachineOrService: A possibility to send and/or receive faxes.\n* fireExtinguisher: Fire extinguisher\n* fireHose: A hose for water transport in case of fire.\n* fireHydrant: Fire hydrant\n* firstAidEquipment: Equipment to support first aid on injured people. Note that 'defibrillator' is a separate literal.\n* iceFreeScaffold: A technical equipment to remove ice and snow from the roof of lorries.\n* informationPoint: An information point with employees.\n* informationStele: An unmanned information point.\n* internetTerminal: Public internet terminal. Charges may be specified using the TariffsAndPayment section.\n* internetWireless: Public wireless internet. Specifying an amount would be the number of hotspots/access points. Charges may be specified using the TariffsAndPayment section.\n* luggageLocker: Possibility to deposit luggage in a safe way.\n* none: None.\n* other: Some other equipment. Use 'otherSupplementalFacility' to specify it.\n* paymentMachine: A payment machine, for example a parking ticket machine.\n* picnicFacilities: Indication of whether any picnicking facilities, such as tables, chairs and shaded areas, are available.\n* playground: A playground for children.\n* publicCardPhone: Indicates, whether there's a public telephone available that can be used with a card.\n* publicCoinPhone: Indicates, whether there's a public telephone available that can be used with coins.\n* publicPhone: Indicates, whether there's a public telephone available.\n* refuseBin: Refuse bins for small amounts of garbage (see also 'wasteDisposal').\n* safeDeposit: A possibility to store valuable possession in a safe way. \n* shelter: A shelter (against wind, sun, ....).\n* shower: Indicates, whether there are shower facilities available.\n* snowAndIceRemovalEquipment: Equipment to remove snow and ice.nt\n* toilet: Indicates, whether there are toilets available.\n* tollTerminal: A terminal, where toll charges can be paid manually (this does not mean a toll gate on the road)\n* tyreAirPressureEquipment: Equipment to measure and refill tyre air pressure.\n* unknown: Unknown.\n* vendingMachine: A vending machine for snacks, coffee etc. (without manpower).\n* wasteDisposal: Possibility to get rid of waste in a legal way (e.g. for truckers or motorhomes). Normal refuse bins are not intended here.\n* waterBasin: A water basin to wash hands, clothes or dishes.\n* waterSupply: Supply of fresh water, e.g. for motorhomes.\n* waterTap: Fresh water out of a tap.",
        "type": "string",
        "x-package": "place.service.enums",
        "enum": [
          "bikeParking",
          "cashMachine",
          "copyMachineOrService",
          "defibrillator",
          "dsrcReceiver",
          "dumpingStation",
          "electricChargingStation",
          "elevator",
          "faxMachineOrService",
          "fireExtinguisher",
          "fireHose",
          "fireHydrant",
          "firstAidEquipment",
          "iceFreeScaffold",
          "informationPoint",
          "informationStele",
          "internetTerminal",
          "internetWireless",
          "luggageLocker",
          "none",
          "other",
          "paymentMachine",
          "picnicFacilities",
          "playground",
          "publicCardPhone",
          "publicCoinPhone",
          "publicPhone",
          "refuseBin",
          "safeDeposit",
          "shelter",
          "shower",
          "snowAndIceRemovalEquipment",
          "toilet",
          "tollTerminal",
          "tyreAirPressureEquipment",
          "unknown",
          "vendingMachine",
          "wasteDisposal",
          "waterBasin",
          "waterSupply",
          "waterTap"
        ]
      },
      "RefillPoint": {
        "title": "RefillPoint",
        "description": "Technical infrastructure at a specific location that facilitates an energy refilling process being connected to maximum one vehicle at a time.",
        "type": "object",
        "x-package": "place.service",
        "properties": {
          "authenticationAndIdentificationMethods": {
            "type": "array",
            "description": "Information on what methods of identification and/or authentication are accepted",
            "items": {
              "$ref": "#/components/schemas/AuthenticationAndIdentificationEnum"
            }
          },
          "currencyOverride": {
            "type": "array",
            "description": "Information on which currency/currencies can be used to pay",
            "items": {
              "$ref": "#/components/schemas/CurrencyCode"
            }
          },
          "deliveryUnit": {
            "$ref": "#/components/schemas/DeliveryUnitEnum"
          },
          "minimumDeliveryAmount": {
            "$ref": "#/components/schemas/Units"
          },
          "maximumDeliveryAmount": {
            "$ref": "#/components/schemas/Units"
          },
          "modelType": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "refillPointIndex": {
            "type": "integer",
            "description": "An index to link this element between the static and dynamic publications."
          },
          "reservability": {
            "$ref": "#/components/schemas/ReservationTypeEnum"
          },
          "serviceType": {
            "type": "array",
            "description": "Information on different service types for the fuelling/charging and payment process.",
            "items": {
              "$ref": "#/components/schemas/ServiceTypeEnum"
            }
          },
          "userInterfaceLanguage": {
            "type": "array",
            "description": "Languages, in which a user interface is available, if any",
            "items": {
              "$ref": "#/components/schemas/LanguageCode"
            }
          }
        },
        "required": [
          "refillPointIndex"
        ]
      },
      "DayWeekMonth": {
        "title": "DayWeekMonth",
        "description": "Specification of periods defined by the intersection of days, weeks and months.",
        "type": "object",
        "x-package": "time",
        "properties": {
          "applicableDay": {
            "type": "array",
            "uniqueItems": true,
            "maxItems": 7,
            "description": "Applicable day of the week (1 to 7). All days of the week is expressed by non-inclusion of this attribute.",
            "items": {
              "$ref": "#/components/schemas/DayEnum"
            }
          },
          "applicableMonth": {
            "type": "array",
            "description": "Applicable month of the year (1 to 12). All months of the year is expressed by non-inclusion of this attribute.",
            "uniqueItems": true,
            "maxItems": 12,
            "items": {
              "$ref": "#/components/schemas/MonthEnum"
            }
          },
          "applicableWeek": {
            "type": "array",
            "description": "Applicable week of the month (1 to 5). All weeks of the month is expressed by non-inclusion of this attribute.",
            "uniqueItems": true,
            "maxItems": 5,
            "items": {
              "$ref": "#/components/schemas/WeekOfMonthEnum"
            }
          }
        }
      },
      "SpecialDay": {
        "title": "SpecialDay",
        "description": "Specification of a special type of day, possibly also a public holiday. Can be country or region specific.",
        "type": "object",
        "x-package": "time",
        "discriminator": {
          "propertyName": "specialDayType",
          "mapping": {
            "dayBeforePublicHoliday": "#/components/schemas/OtherSpecialDay",
            "dayFollowingPublicHoliday": "#/components/schemas/OtherSpecialDay",
            "inLieuOfPublicHoliday": "#/components/schemas/OtherSpecialDay",
            "longWeekendDay": "#/components/schemas/OtherSpecialDay",
            "other": "#/components/schemas/OtherSpecialDay",
            "publicEventDay": "#/components/schemas/OtherSpecialDay",
            "publicHoliday": "#/components/schemas/PublicHoliday",
            "schoolDay": "#/components/schemas/OtherSpecialDay",
            "schoolHolidays": "#/components/schemas/OtherSpecialDay"
          }
        },
        "properties": {
          "specialDayType": {
            "$ref": "#/components/schemas/SpecialDayTypeEnum"
          },
          "intersectWithApplicableDays": {
            "type": "boolean",
            "description": "Indicates if the period is the intersection of applicable days and this special day (TRUE) or if it is the union of applicable days and this special day."
          }
        },
        "required": [
          "specialDayType",
          "intersectWithApplicableDays"
        ]
      },
      "TimePeriodOfDay": {
        "title": "TimePeriodOfDay",
        "description": "Specification of a continuous period of time within the same day.",
        "type": "object",
        "x-package": "time",
        "properties": {
          "startTimeOfPeriod": {
            "description": "Start of time period.",
            "$ref": "#/components/schemas/Time"
          },
          "endTimeOfPeriod": {
            "description": "End time of period.",
            "$ref": "#/components/schemas/Time"
          }
        },
        "required": [
          "startTimeOfPeriod",
          "endTimeOfPeriod"
        ]
      },
      "AttributeRead": {
        "title": "AttributeRead",
        "description": "One recognized attribute with its own confidence (0–1, APDS Confidence scale).",
        "type": "object",
        "required": [
          "value"
        ],
        "properties": {
          "value": {
            "type": "string"
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        }
      },
      "SessionReadBinding": {
        "title": "SessionReadBinding",
        "description": "One LPR read attached to a Session by the pairing engine (Part 5\n§5.8, member `reads[]` of `apds-ext:apx:session-detail@1.0`).",
        "type": "object",
        "required": [
          "observation",
          "role"
        ],
        "properties": {
          "observation": {
            "description": "The APDS ObservationElement (className `ObservationElement`).",
            "$ref": "#/components/schemas/Reference"
          },
          "role": {
            "type": "string",
            "enum": [
              "entry",
              "exit",
              "duplicate",
              "activity"
            ],
            "description": "`entry` and `exit` are the passages that opened and closed the\nvisit; `duplicate` is the same passage seen by another camera or\nframe; `activity` is the vehicle seen inside (a sweep, a bay camera)."
          },
          "representative": {
            "type": "boolean",
            "description": "The read that stands for the visit in lists and screen-pops. At\nmost one per Session; two are 422 `request-unprocessable` (Part 5\n§5.8 rule 1)."
          }
        }
      },
      "SessionClosure": {
        "title": "SessionClosure",
        "description": "Why and how a Session ended (Part 5 §5.8).",
        "type": "object",
        "properties": {
          "endReason": {
            "type": "string",
            "description": "definedValue from `apx-session-end-reasons` (Part 11) or an implementer code list.",
            "examples": [
              "exitRead"
            ]
          },
          "endInferred": {
            "type": "boolean",
            "description": "True when `actualEnd` was set by a rule rather than observed."
          },
          "startObserved": {
            "type": "boolean",
            "description": "False declares `actualStart` synthetic — an exit-only Session whose\nentry was never observed; the writer SHOULD then set `actualStart`\nequal to `actualEnd`. Consumers MUST exclude such Sessions from\ndwell statistics and from occupancy (Part 5 §5.8 rule 4). Absent\nmeans true."
          },
          "rule": {
            "type": [
              "string",
              "null"
            ],
            "description": "The implementer rule that closed a `stale` Session (e.g. `transient-48h`); null when none applied."
          }
        }
      },
      "PlaceCharacteristics": {
        "title": "PlaceCharacteristics",
        "description": "Defines information concerning characteristics related to a parking facility.",
        "type": "object",
        "x-package": "place.characteristics",
        "properties": {
          "openToPublic": {
            "description": "Identifies if this facility is accessible to public use (TRUE) or private use only (FALSE).",
            "type": "boolean"
          },
          "accessControlled": {
            "type": "boolean",
            "description": "Indicates facility has physical access control (e.g. barriers, gates) (TRUE) or no access control (FALSE)."
          },
          "robotic": {
            "type": "boolean",
            "description": "Indicates existence of a robotic parking system (a parking structure where customer leaves vehicle at drop off area and robots move the vehicle to parking location within the structure). Default is (FALSE)."
          },
          "coveredType": {
            "$ref": "#/components/schemas/CoveredTypeEnum"
          },
          "disabledAccess": {
            "type": "boolean",
            "description": "Specifies if there is provision of facilities for disable access (TRUE) or not (FALSE)."
          },
          "disabledAccessTypes": {
            "type": "array",
            "description": "Defines the type of provision of facilities for disable access available.",
            "items": {
              "$ref": "#/components/schemas/AccessibilityTypeEnum"
            }
          },
          "operatingModes": {
            "type": "array",
            "description": "Defines the mode of parking operation in use.",
            "items": {
              "$ref": "#/components/schemas/OperatingModeTypeEnum"
            }
          },
          "spacesNonDedicated": {
            "type": "integer",
            "description": "Number of parking spaces that are not assigned for a particular purpose.",
            "minimum": 0
          },
          "spacesTotal": {
            "type": "integer",
            "description": "Total number of parking spaces",
            "minimum": 0
          },
          "staffed": {
            "$ref": "#/components/schemas/StaffEnum"
          },
          "structureGrade": {
            "$ref": "#/components/schemas/StructureGradeEnum"
          },
          "structureType": {
            "$ref": "#/components/schemas/StructureTypeEnum"
          },
          "evChargingPoints": {
            "type": "integer",
            "description": "Total number of electric vehicle charging points.",
            "minimum": 0
          }
        }
      },
      "Marketing": {
        "title": "Marketing",
        "description": "Universal resource locator (URI) that points towards a web site carrying marketing material supplied.",
        "type": "object",
        "x-package": "contact",
        "properties": {
          "imageAlbums": {
            "type": "array",
            "description": "Image albums associated",
            "items": {
              "$ref": "#/components/schemas/ImageAlbum"
            }
          },
          "webURLs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Url"
            }
          }
        }
      },
      "RGBColour": {
        "title": "RGBColour",
        "description": "A RGB colour described by values for red, green and blue (0..255) as well as an optional name.",
        "type": "object",
        "x-package": "common",
        "properties": {
          "colourName": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "rgbBlueValue": {
            "type": "integer",
            "description": "The blue value of the RGB colour (0..255).",
            "minimum": 0,
            "maximum": 255
          },
          "rgbGreenValue": {
            "type": "integer",
            "description": "The green value of the RGB colour (0..255).",
            "minimum": 0,
            "maximum": 255
          },
          "rgbRedValue": {
            "type": "integer",
            "description": "The red value of the RGB colour (0..255).",
            "minimum": 0,
            "maximum": 255
          }
        },
        "required": [
          "rgbBlueValue",
          "rgbGreenValue",
          "rgbRedValue"
        ]
      },
      "Times": {
        "title": "Times",
        "description": "Defines forms of time period for specific purposes. \nThere are four distinct time domain concepts: \n* Hours of operation (times at which the facility may be used)\n* Access and egress (times it is possible to enter and leave the facility)\n* Entrance open time\n* Exit open time",
        "type": "object",
        "x-package": "time",
        "properties": {
          "available24hours": {
            "type": "boolean",
            "description": "If [TRUE], the identified parking hierarchy entities is available 24 hours per day."
          },
          "openAllYear": {
            "type": "boolean",
            "description": "If [TRUE], the identified parking hierarchy entities is available every day each year."
          },
          "openingTimesNotSpecified": {
            "type": "boolean",
            "description": "If [TRUE], the time periods are not specified."
          },
          "openingTimesUnknown": {
            "type": "boolean",
            "description": "If [TRUE], the time periods are not known."
          },
          "accessAndEgress": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AccessAndEgress"
            }
          },
          "operatingTime": {
            "$ref": "#/components/schemas/OperatingTime"
          }
        },
        "required": [
          "available24hours",
          "openAllYear",
          "openingTimesNotSpecified",
          "openingTimesUnknown"
        ]
      },
      "PaymentMethod": {
        "title": "PaymentMethod",
        "description": "Provides information on the means of payment available",
        "type": "object",
        "x-package": "rate.payment",
        "properties": {
          "paymentMeans": {
            "type": "array",
            "description": "The means of payment available",
            "items": {
              "$ref": "#/components/schemas/MeansOfPaymentEnum"
            }
          },
          "paymentMode": {
            "type": "array",
            "description": "Defines the timing of the parking or other mobility related payment",
            "items": {
              "$ref": "#/components/schemas/PaymentTimingEnum"
            }
          },
          "brandsAcceptedCodeList": {
            "type": "array",
            "description": "List of accepted brands for payment cards (by code)",
            "items": {
              "$ref": "#/components/schemas/BrandsAcceptedCodeList"
            }
          },
          "brandsAcceptedText": {
            "type": "array",
            "description": "List of accepted brands for payment cards (by name)",
            "items": {
              "$ref": "#/components/schemas/BrandsAcceptedText"
            }
          }
        }
      },
      "SafetyStandardClassification": {
        "title": "SafetyStandardClassification",
        "description": "Use this class to classification type/level for security schemes for a place",
        "type": "object",
        "x-package": "place.characteristics",
        "properties": {
          "securityFeature": {
            "$ref": "#/components/schemas/ReferencedCodeListEntry"
          },
          "securityLevel": {
            "$ref": "#/components/schemas/ReferencedCodeListEntry"
          }
        }
      },
      "LinearDimension": {
        "title": "LinearDimension",
        "description": "A class defining information concerning a linear measure (distance) with unit.",
        "type": "object",
        "x-package": "place.characteristics",
        "properties": {
          "measure": {
            "type": "number",
            "format": "float",
            "description": "Quantity in the defined unit of measure."
          },
          "unitOfMeasure": {
            "$ref": "#/components/schemas/UnitOfMeasureDistanceEnum"
          }
        },
        "required": [
          "measure",
          "unitOfMeasure"
        ]
      },
      "AreaDimension": {
        "title": "AreaDimension",
        "type": "object",
        "description": "A class defining information concerning an area measurement with unit.",
        "x-package": "place.characteristics",
        "properties": {
          "measure": {
            "type": "number",
            "format": "float",
            "description": "Quantity in the defined unit of measure."
          },
          "unitOfMeasure": {
            "$ref": "#/components/schemas/UnitOfMeasureAreaEnum"
          }
        },
        "required": [
          "measure",
          "unitOfMeasure"
        ]
      },
      "WeightDimension": {
        "title": "WeightDimension",
        "description": "A class defining information concerning a weight quantity with unit.",
        "type": "object",
        "x-package": "place.characteristics",
        "properties": {
          "measure": {
            "type": "number",
            "description": "Quantity in the defined unit of measure.",
            "format": "float"
          },
          "unitOfMeasure": {
            "$ref": "#/components/schemas/UnitOfMeasureWeightEnum"
          }
        },
        "required": [
          "measure",
          "unitOfMeasure"
        ]
      },
      "OperatingRestrictionTypeEnum": {
        "title": "OperatingRestrictionTypeEnum",
        "description": "Defines operating restrictions to use the of a facility.\n* busOnly : Only buses are permitted.\n* busStop : This is a stopping place of bus pick-up or drop-off; not to be used for parking.\n* carpoolOnly : Only carpool vehicles are permitted.\n* commercialVehicleOnly : Only commercial vehicles are permitted.\n* disabledPersonPermitOnly : Only vehicles of registered disabled person permit holders permitted.\n* electricVehicleOnly : Only electric vehicles permitted.\n* freeParking : No fee for parking\n* governmentVehicleOnly : Only government vehicles permitted.\n* loadingZone : This is a loading zone; not to be used for parking.\n* loadingZoneCommercial : Only government vehicles permitted.\n* media : Only for use by the media\n* noParking : No parking permitted\n* noWaiting : No waiting or parking of vehicles is permitted\n* parkingTimeLimit : Time limited parking.\n* residentialPermitOnly : Only for use by residential permit holders only\n* snow : Snow clearing zone; no parking\n* streetCleaning : Street cleansing zone; no parking\n* taxiOnly : Only taxis are permitted.\n* valetOnly : Only valet service vehicles are permitted.",
        "type": "string",
        "x-package": "place.characteristics.enums",
        "enum": [
          "busOnly",
          "busStop",
          "carpoolOnly",
          "commercialVehicleOnly",
          "disabledPersonPermitOnly",
          "electricVehicleOnly",
          "freeParking",
          "governmentVehicleOnly",
          "loadingZone",
          "loadingZoneCommercial",
          "media",
          "noParking",
          "noWaiting",
          "parkingTimeLimit",
          "residentialPermitOnly",
          "snow",
          "streetCleaning",
          "taxiOnly",
          "valetOnly"
        ]
      },
      "DemandSpaceType": {
        "title": "DemandSpaceType",
        "description": "Identifies when a space was occupied and for how long.",
        "type": "object",
        "x-package": "place.occupancy",
        "properties": {
          "detectionUpdateTime": {
            "description": "Time of update, from detector.",
            "$ref": "#/components/schemas/DateTime"
          },
          "occupancyEstimatedStartTime": {
            "description": "The estimated time a space is expected to be occupied.",
            "$ref": "#/components/schemas/DateTime"
          },
          "occupancyEstimatedEndTime": {
            "description": "The estimated time a space is expected to be vacated.",
            "$ref": "#/components/schemas/DateTime"
          },
          "occupancyStartTime": {
            "description": "The actual time space is occupied.",
            "$ref": "#/components/schemas/DateTime"
          },
          "occupancyEndTime": {
            "description": "The actual time space is vacated.",
            "$ref": "#/components/schemas/DateTime"
          },
          "spaceId": {
            "$ref": "#/components/schemas/Reference"
          },
          "occupancyLevel": {
            "$ref": "#/components/schemas/OccupancyLevel"
          }
        },
        "required": [
          "detectionUpdateTime"
        ]
      },
      "AddressLineTypeEnum": {
        "title": "AddressLineTypeEnum",
        "description": "A table of types of address lines\n * apartment: Element indicating a discrete element of a building forming the address\n * building: Element identifying the number or name and type of the edifice or construction relevant for the address [derived from ISO19160-4]\n * districtTerritory: Element specifying the geographic or administrative area of the country for the address [Source: 19160-4]\n * floor: Element indicating the floor or level on which a delivery point is located in a multi-storey building [Source:ISO19160-4]\n * poBox: A postal delivery location identifier, not necessarily a physical location.\n * region: Element indicating the name of the area within or adjacent to the town in which delivery address is.\n * street: Element indicating road or street identifier or name \n * town: Element indicating the name of the populated place in which a delivery point is located, or near to or via which the delivery point is accessed. [Source: ISO19160-4]\n * unit: An element representing a section of a building or organisation.Free-text description of the condition that leads to a surcharge being applied.",
        "type": "string",
        "x-package": "place.enums",
        "enum": [
          "apartment",
          "building",
          "districtTerritory",
          "floor",
          "poBox",
          "region",
          "street",
          "town",
          "unit"
        ]
      },
      "RateLineTypeEnum": {
        "title": "RateLineTypeEnum",
        "description": "Describes the type of rates of a RateLine.\n* flatRate : A rate applied to the rate line which is not time/duration dependent. i.e. a single fixed payment.\n* flatRateTier : A flat rate charge rate associated with a specific time-based tier. This is a special case of an incrementing rate.\n* incrementingRate : A charge rate that increases by a defined amount in a defined time.",
        "type": "string",
        "x-package": "rate.enums",
        "enum": [
          "flatRate",
          "flatRateTier",
          "incrementingRate"
        ]
      },
      "RateUsageConditionsTypeEnum": {
        "title": "RateUsageConditionsTypeEnum",
        "description": "A list of supported rate usage condition types.\n* fixedDuration : Fixed duration - check Rate Usage Duration Limitation field\n* fixedNumber : check Rate Usage Count Limitation field\n* once : Permit can be used once\n* unlimited : Unlimited usage.\n",
        "type": "string",
        "x-package": "rate.enums",
        "enum": [
          "fixedDuration",
          "fixedNumber",
          "once",
          "unlimited"
        ]
      },
      "RateLineTax": {
        "title": "RateLineTax",
        "description": "Contains details of the tax to be applied to a RateLine.",
        "type": "object",
        "x-package": "rate",
        "properties": {
          "triggerDescription": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "triggerType": {
            "$ref": "#/components/schemas/TriggerTypeEnum"
          },
          "taxIncluded": {
            "type": "boolean",
            "description": "Indicates if the tax to be applied is included within the total rate associated with this rate line (TRUE) or if the tax is to be added additionally to the total (FALSE)."
          },
          "labelForDisplay": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "taxRate": {
            "type": "number",
            "description": "The percentage rate of tax to be applied.",
            "format": "float",
            "maximum": 100,
            "minimum": 0
          },
          "taxValue": {
            "$ref": "#/components/schemas/AmountInCurrency"
          }
        },
        "required": [
          "taxIncluded"
        ]
      },
      "PaymentTypeEnum": {
        "title": "PaymentTypeEnum",
        "description": "Indicates the nature of the payment made against an AssignedRight.\n* payment : Indicates financial payment made\n* validation : Indicates financial value offset through use of validation coupon or similar",
        "type": "string",
        "x-package": "rate.payment.enums",
        "enum": [
          "payment",
          "validation"
        ]
      },
      "FuelTypeEnum": {
        "title": "FuelTypeEnum",
        "description": "Type of fuel used by a vehicle : \n* all : All sort of fuel is accepted\n* battery : Battery\n* biodiesel : Biodiesel\n* diesel : Fuel used for compression - ignition (CI) engines\n* dieselBatteryHybrid : Diesel and battery hybrid\n* ethanol : Ethanol\\n* hydrogen: Hydrogen\n* liquidGas : Liquid gas of any type including LPG\n* lpg : Liquid petroleum gas\\n* methane: Methane gas\n* other : Other\n* petrol: Fuel used for positive-ignition (PI) engines\n* petrol95Octane : Petrol with 95 octane\\n* petrol98Octane: Petrol with 98 octane\n* petrolBatteryHybrid : Petrol and battery hybrid\n* petrolLeaded : Leaded petrol\n* petrolUnleaded : Unleaded petrol\n* unknown : The sort of fuel is not known\"",
        "type": "string",
        "x-package": "rate.eligibility.enums",
        "enum": [
          "all",
          "battery",
          "biodiesel",
          "diesel",
          "dieselBatteryHybrid",
          "ethanol",
          "hydrogen",
          "liquidGas",
          "lpg",
          "methane",
          "other",
          "petrol",
          "petrol95Octane",
          "petrol98Octane",
          "petrolBatteryHybrid",
          "petrolLeaded",
          "petrolUnleaded",
          "unknown"
        ]
      },
      "Emissions": {
        "title": "Emissions",
        "description": "Emission characteristics of vehicles.",
        "type": "object",
        "x-package": "rate.eligibility",
        "properties": {
          "emissionClassification": {
            "$ref": "#/components/schemas/ReferencedCodeListEntry"
          },
          "emissionClassificationOther": {
            "type": "array",
            "description": "Some other (probably locally defined) value(s) for emission classification.",
            "items": {
              "type": "string"
            }
          },
          "emissionLevel": {
            "$ref": "#/components/schemas/LowEmissionLevelEnum"
          },
          "vehicleCharacteristics": {
            "description": "emission characteristics of vehicle",
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ValueRange"
            },
            "examples": [
              {
                "class": "manufactureDate",
                "unit": "year",
                "boundaries": [
                  {
                    "value": 2000,
                    "comparisonOperator": "lessThanOrEqualTo"
                  }
                ]
              }
            ]
          }
        }
      },
      "GrossWeightCharacteristic": {
        "title": "GrossWeightCharacteristic",
        "description": "Gross weight characteristic of a vehicle.",
        "type": "object",
        "x-package": "rate.eligibility",
        "properties": {
          "comparisonOperator": {
            "$ref": "#/components/schemas/ComparisonOperatorEnum"
          },
          "grossVehicleWeight": {
            "type": "number",
            "description": "The gross weight of the vehicle and its load, including any trailers (in Tonnes).",
            "format": "float",
            "exclusiveMinimum": 0
          },
          "typeOfWeight": {
            "$ref": "#/components/schemas/WeightTypeEnum"
          }
        },
        "required": [
          "comparisonOperator",
          "grossVehicleWeight",
          "typeOfWeight"
        ]
      },
      "HeightCharacteristic": {
        "title": "HeightCharacteristic",
        "description": "Height characteristic of a vehicle.",
        "type": "object",
        "x-package": "rate.eligibility",
        "properties": {
          "comparisonOperator": {
            "$ref": "#/components/schemas/ComparisonOperatorEnum"
          },
          "vehicleHeight": {
            "type": "number",
            "description": "The height (in metres) of the highest part, excluding antennae, of an individual vehicle above the road surface.",
            "format": "float",
            "exclusiveMinimum": 0
          }
        },
        "required": [
          "comparisonOperator",
          "vehicleHeight"
        ]
      },
      "LengthCharacteristic": {
        "title": "LengthCharacteristic",
        "description": "Length characteristic of a vehicle.",
        "type": "object",
        "x-package": "rate.eligibility",
        "properties": {
          "comparisonOperator": {
            "$ref": "#/components/schemas/ComparisonOperatorEnum"
          },
          "vehicleLength": {
            "type": "number",
            "description": "The overall distance (in metres) between the front and back of an individual vehicle, including the length of any trailers, couplings or embedded features.",
            "format": "float",
            "exclusiveMinimum": 0
          }
        },
        "required": [
          "comparisonOperator",
          "vehicleLength"
        ]
      },
      "WidthCharacteristic": {
        "title": "WidthCharacteristic",
        "type": "object",
        "x-package": "rate.eligibility",
        "description": "Width characteristic of a vehicle",
        "properties": {
          "comparisonOperator": {
            "$ref": "#/components/schemas/ComparisonOperatorEnum"
          },
          "vehicleWidth": {
            "type": "number",
            "format": "float",
            "exclusiveMinimum": 0,
            "description": "The maximum width of an individual vehicle, including any features embedded or fixed on it, in metres"
          }
        },
        "required": [
          "comparisonOperator",
          "vehicleWidth"
        ]
      },
      "VehicleTypeEnum": {
        "title": "VehicleTypeEnum",
        "description": "* agriculturalVehicle : Vehicle normally used for agricultural purposes (e.g. tractor, combined harvester).\n* anyVehicle : Vehicle of any type.\n* articulatedBus : Articulated bus\n* articulatedTrolleyBus : Articulated trolley bus\n* articulatedVehicle : Articulated vehicle.\n* bicycle : Bicycle.\n* bus : Bus.\n* car : Vehicles designed and constructed for the carriage of passengers and comprising no more than eight seats (in addition to the driver seat), and having a maximum mass (technically permissible maximum laden mass) not exceeding 3.5 tons (M1).\n* caravan : Caravan.\n* carOrLightVehicle : Car or light vehicle.\n* carWithCaravan : Car towing a caravan.\n* carWithTrailer : Car towing a trailer.\n* constructionOrMaintenanceVehicle : Vehicle normally used for construction or maintenance purposes (e.g. digger, excavator, bulldozer, lorry mounted crane)\n* fourWheelDrive : Four wheel drive vehicle.\n* heavyDutyTransporter : A transporter for heavy duty (usually with abnormal dimensions).\n* heavyGoodsVehicle : Vehicles with a total weight above 3,500 kg (vehicle and load).\n* heavyGoodsVehicleWithTrailer : Heavy goods vehicle with trailer\n* heavyVehicle : Vehicle whose weight means it should be classed as a heavy vehicle\n* highSidedVehicle : High sided vehicle.\n* largeCar : Large car\n* largeGoodsVehicle : Vehicles for the carriage of goods and having a maximum mass exceeding 3.5 tonnes (belonging to class N2 when not exceeding 12 tonnes, otherwise class N3).\n* lightCommercialVehicle : Vehicles for the carriage of goods and having a maximum mass not exceeding 3.5 tonnes (class N1).\n* lightCommercialVehicleWithTrailer : Light goods vehicle with trailer\n* longHeavyLorry : A heavy lorry that is longer than normal.\n* lorry : Lorry of any type.\n* metro : Metro\n* minibus : Vehicles designed and constructed for the carriage of passengers, comprising more than eight seats (in addition to the driver seat), and having a maximum mass not exceeding 5 tonnes (class M2).\n* moped : Moped (a two wheeled motor vehicle characterized by a small engine typically less than 50cc and by normally having pedals).\n* motorcycle : Motorcycle.\n* motorcycleWithSideCar : Three wheeled vehicle comprising a motorcycle with an attached side car.\n* motorhome : motorhome\n* motorScooter : MotorScooter (a two wheeled motor vehicle characterized by a step-through frame and small diameter wheels).\n* other : Other than as defined in this enumeration.\n* passengerCar : Passenger car\n* smallCar : Small car\n* tanker : Vehicle with large tank for carrying bulk liquids.\n* threeWheeledVehicle : Three wheeled vehicle of unspecified type.\n* trailer : Trailer.\n* tram : Tram.\n* trolleyBus : Trolley bus\n* twoWheeledVehicle : Two wheeled vehicle of unspecified type.\n* unknown : Unknown.\n* van : Van.\n* vehicleWithCaravan : Vehicle (of unspecified type) towing a caravan.\n* vehicleWithCatalyticConverter : Vehicle with catalytic converter.\n* vehicleWithoutCatalyticConverter : Vehicle without catalytic converter.\n* vehicleWithTrailer : Vehicle (of unspecified type) towing a trailer.\n* withEvenNumberedRegistrationPlates : Vehicle with even numbered registration plate.\n* withOddNumberedRegistrationPlates : Vehicle with odd numbered registration plate.",
        "type": "string",
        "x-package": "rate.eligibility.enums",
        "enum": [
          "agriculturalVehicle",
          "anyVehicle",
          "articulatedBus",
          "articulatedTrolleyBus",
          "articulatedVehicle",
          "bicycle",
          "bus",
          "car",
          "caravan",
          "carOrLightVehicle",
          "carWithCaravan",
          "carWithTrailer",
          "constructionOrMaintenanceVehicle",
          "fourWheelDrive",
          "heavyDutyTransporter",
          "heavyGoodsVehicle",
          "heavyGoodsVehicleWithTrailer",
          "heavyVehicle",
          "highSidedVehicle",
          "largeCar",
          "largeGoodsVehicle",
          "lightCommercialVehicle",
          "lightCommercialVehicleWithTrailer",
          "longHeavyLorry",
          "lorry",
          "metro",
          "minibus",
          "moped",
          "motorcycle",
          "motorcycleWithSideCar",
          "motorhome",
          "motorScooter",
          "other",
          "passengerCar",
          "smallCar",
          "tanker",
          "threeWheeledVehicle",
          "trailer",
          "tram",
          "trolleyBus",
          "twoWheeledVehicle",
          "unknown",
          "van",
          "vehicleWithCaravan",
          "vehicleWithCatalyticConverter",
          "vehicleWithoutCatalyticConverter",
          "vehicleWithTrailer",
          "withEvenNumberedRegistrationPlates",
          "withOddNumberedRegistrationPlates"
        ]
      },
      "VehicleLoadTypeEnum": {
        "title": "VehicleLoadTypeEnum",
        "description": "* abnormalLoad : A load that exceeds normal vehicle dimensions in terms of height, length, width, gross vehicle weight or axle weight or any combination of these. Generally termed an \"abnormal load\".\n* ammunition : Ammunition.\n* chemicals : Chemicals of unspecified type.\n* combustibleMaterials : Combustible materials of unspecified type.\n* corrosiveMaterials : Corrosive materials of unspecified type.\n* debris : Debris of unspecified type.\n* empty : No load.\n* explosiveMaterials : Explosive materials of unspecified type.\n* extraHighLoad : A load of exceptional height.\n* extraLongLoad : A load of exceptional length.\n* extraWideLoad : A load of exceptional width.\n* fuel : Fuel of unspecified type.\n* glass : Glass.\n* goods : Any goods of a commercial nature.\n* hazardousMaterials : Materials classed as being of a hazardous nature.\n* liquid : Liquid of an unspecified nature.\n* livestock : Livestock.\n* materials : General materials of unspecified type.\n* materialsDangerousForPeople : Materials classed as being of a danger to people or animals.\n* materialsDangerousForTheEnvironment : Materials classed as being potentially dangerous to the environment.\n* materialsDangerousForWater : Materials classed as being dangerous when exposed to water (e.g. materials which may react exothermically with water).\n* oil : Oil.\n* ordinary : Materials that present limited environmental or health risk. Non-combustible, non-toxic, non-corrosive.\n* other : Other than as defined in this enumeration.\n* perishableProducts : Products or produce that will significantly degrade in quality or freshness over a short period of time.\n* petrol : Petrol or petroleum.\n* pharmaceuticalMaterials : Pharmaceutical materials.\n* radioactiveMaterials : Materials that emit significant quantities of electro-magnetic radiation that may present a risk to people, animals or the environment.\n* refrigeratedGoods : Refrigerated goods.\n* refuse : Refuse.\n* toxicMaterials : Materials of a toxic nature which may damage the environment or endanger public health.\n* vehicles : Vehicles of any type which are being transported.",
        "type": "string",
        "x-package": "rate.eligibility.enums",
        "enum": [
          "abnormalLoad",
          "ammunition",
          "chemicals",
          "combustibleMaterials",
          "corrosiveMaterials",
          "debris",
          "empty",
          "explosiveMaterials",
          "extraHighLoad",
          "extraLongLoad",
          "extraWideLoad",
          "fuel",
          "glass",
          "goods",
          "hazardousMaterials",
          "liquid",
          "livestock",
          "materials",
          "materialsDangerousForPeople",
          "materialsDangerousForTheEnvironment",
          "materialsDangerousForWater",
          "oil",
          "ordinary",
          "other",
          "perishableProducts",
          "petrol",
          "pharmaceuticalMaterials",
          "radioactiveMaterials",
          "refrigeratedGoods",
          "refuse",
          "toxicMaterials",
          "vehicles"
        ]
      },
      "UserQualification": {
        "title": "UserQualification",
        "description": "Defines user group characteristics",
        "type": "object",
        "x-package": "rate.eligibility",
        "properties": {
          "userGroup": {
            "$ref": "#/components/schemas/ReferencedCodeListEntry"
          }
        },
        "required": [
          "userGroup"
        ]
      },
      "LinkedRightSpecification": {
        "title": "LinkedRightSpecification",
        "description": "Time based constrained for a Qualification",
        "type": "object",
        "x-package": "rate.eligibility",
        "properties": {
          "assignedRightTimeRelative": {
            "description": "earliest/latest start/end relative (via offsets) or specific (via times)",
            "$ref": "#/components/schemas/AssignedRightTimeRelative"
          },
          "qualifyingRightSpecification": {
            "description": "held right specification to which this constraint relates",
            "$ref": "#/components/schemas/VersionedReference"
          }
        },
        "required": [
          "assignedRightTimeRelative",
          "qualifyingRightSpecification"
        ]
      },
      "AssignRightTime": {
        "title": "AssignRightTime",
        "description": "Qualification criteria for eligibility based on the duration of time relative to a defined time based qualification related to an assigned right.",
        "type": "object",
        "x-package": "rate.eligibility",
        "properties": {
          "assignedRightTime": {
            "type": "string",
            "description": "Assigned right time",
            "format": "date-time"
          },
          "comparisonOperator": {
            "$ref": "#/components/schemas/ComparisonOperatorEnum"
          },
          "unitOfTime": {
            "$ref": "#/components/schemas/UnitOfTimeEnum"
          }
        },
        "required": [
          "assignedRightTime",
          "comparisonOperator",
          "unitOfTime"
        ]
      },
      "IdentifiedArea": {
        "title": "IdentifiedArea",
        "description": "An identifiable discrete bounded geographic zone that shares common characteristics and that may be used for \nparking related or other purposes. \nIdentified Areas are segmented into two types : Vehicular Access class and Specific Area class.",
        "type": "object",
        "x-package": "place",
        "allOf": [
          {
            "$ref": "#/components/schemas/HierarchyElement"
          },
          {
            "type": "object",
            "properties": {
              "streetAddress": {
                "type": "array",
                "description": "Identified area street address.",
                "items": {
                  "$ref": "#/components/schemas/Address"
                }
              },
              "areaBoundedZone": {
                "type": "array",
                "description": "Identified area bounded zone.",
                "items": {
                  "$ref": "#/components/schemas/GeoJsonObject"
                }
              },
              "indicativePointLocation": {
                "type": "array",
                "description": "Indicative identified area point location.",
                "items": {
                  "$ref": "#/components/schemas/GeoJsonObject"
                }
              },
              "times": {
                "$ref": "#/components/schemas/Times"
              },
              "operatingRestrictions": {
                "type": "array",
                "description": "Operating restrictions",
                "items": {
                  "$ref": "#/components/schemas/OperatingRestrictions"
                }
              }
            }
          }
        ]
      },
      "AccessibilityTypeEnum": {
        "title": "AccessibilityTypeEnum",
        "description": "Special forms of accessibility, easements and marking for disabled people.\n* barrierFreeAccessible: Accessible without any steps or other barriers. Does not ensure the same access as disabledAccessible.\n* disabledAccessible: Accessible for disabled people. wheelChairAccessible is a special form of it.\n* disabledEasements: There are special easements for disabled people, like handrails or disabled-friendly furniture.\n* disabledMarkedThere: is a visible mark to support access by disabled people (e.g. a wheelchair symbol).\n* none: No form of special accessibility, i.e. usually not convenient for disabled people, e.g. because of steps or barriers.\n* orientationSystemForBlindPeople: There is some orientation system, which helps blind or visually impaired people. Examples might be some acoustic system or tactile paving.\n* other: Other.\n* unknown: It is unknown, whether there is a special form of accessibility.\n* wheelChairAccessible: Accessible by people in a wheelchair.",
        "type": "string",
        "x-package": "place.characteristics.enums",
        "enum": [
          "barrierFreeAccessible",
          "disabledAccessible",
          "disabledEasements",
          "disabledMarkedThere",
          "none",
          "orientationSystemForBlindPeople",
          "other",
          "unknown",
          "wheelChairAccessible"
        ]
      },
      "UserTypeEnum": {
        "title": "UserTypeEnum",
        "description": "Types of different users,for example used in the context of parking.\n* allUsers: All users.\n* commuters: Commuters.\n* customers: Customers.\n* disabled: Physically impaired people.\n* elderlyUsers: Elderly users.\n* employees: Employees.\n* families: Families.\n* handicapped: Persons with deficiencies in their daily life.\n* hearingImpaired: People with difficulties to hear.\n* hotelGuests: Hotel guests.\n* longTermParkers: Long-term parker.\n* members: Members.\n* men: Men.\n* other: Other.\n* overnightParkers: Overnight parker.\n* parkAndCycleUser: Park and cycle user.\n* parkAndRideUsers: Users that are exchanging into public transport at a park and ride station.\n* parkAndWalkUser: Park and walk user.\n* pensioners: Pensioners.\n* pregnantWomen: Pregnant women.\n* registeredDisabledUsers: Registered disabled persons.\n* reservationHolders: Those who have a valid reservation, e.g. for the duration of parking.\n* residents: Local residents.\n* seasonTicketHolders: Season ticket holders.\n* shoppers: Shoppers.\n* shortTermParkers: Short-term parker.\n* sportEventAwaySupporters: Sport event away supporters.\n* sportEventHomeSupporters: Sport event home supporters.\n* staff: Staff.\n* students: Students.\n* subscribers: Subscribers.\n* unknown: Unknown.\n* visitors: Visitors.\n* visuallyImpaired: People with difficulties to see.\n* wheelchairUsers: Wheelchair users.\n* women: Women.",
        "type": "string",
        "x-package": "place.enums",
        "enum": [
          "allUsers",
          "commuters",
          "customers",
          "disabled",
          "elderlyUsers",
          "employees",
          "families",
          "handicapped",
          "hearingImpaired",
          "hotelGuests",
          "longTermParkers",
          "members",
          "men",
          "other",
          "overnightParkers",
          "parkAndCycleUser",
          "parkAndRideUsers",
          "parkAndWalkUser",
          "pensioners",
          "pregnantWomen",
          "registeredDisabledUsers",
          "reservationHolders",
          "residents",
          "seasonTicketHolders",
          "shoppers",
          "shortTermParkers",
          "sportEventAwaySupporters",
          "sportEventHomeSupporters",
          "staff",
          "students",
          "subscribers",
          "unknown",
          "visitors",
          "visuallyImpaired",
          "wheelchairUsers",
          "women"
        ]
      },
      "AuthenticationAndIdentificationEnum": {
        "title": "AuthenticationAndIdentificationEnum",
        "description": "A table of authentication and/or identification methods: \n* activeRFIDChip: Phone (active RFID chip)\n* apps: Apps\n* calypso: RFID Calypso\n* cashPayment: No specific authentication by using cash\n* creditCard: Credit card\n* debitCard: Debit card\n* mifareClassic: RFID Card / Phone NFC - Mifare Classic\n* mifareDesfire: RFID Card / Phone NFC - Mifare Desfire\n* nfc: Nearfield communication\n* noAccess: No access granted\n* overTheAir: Over the air according to ISO 15118\n* phoneDialog: phone (dialog with platform)\n* phoneSMS: Phone (SMS)\n* pinpad: PINPAD\n* plc: PLC according to ISO 15118\n* prepaidCard: Pre-Paid card\n* rfid: RFID\n* unlimitedAccess: No authentication/identification required.\n* website: Using a website",
        "type": "string",
        "x-package": "place.service.enums",
        "enum": [
          "activeRFIDChip",
          "apps",
          "calypso",
          "cashPayment",
          "creditCard",
          "debitCard",
          "mifareClassic",
          "mifareDesfire",
          "nfc",
          "noAccess",
          "overTheAir",
          "phoneDialog",
          "phoneSMS",
          "pinpad",
          "plc",
          "prepaidCard",
          "rfid",
          "unlimitedAccess",
          "website"
        ]
      },
      "DeliveryUnitEnum": {
        "title": "DeliveryUnitEnum",
        "description": "Table with different units in which the delivery is measured.\n* gasGallonEquivalent: The amount of alternative fuel it takes to equal the energy content of one liquid gallon of gasoline. Used mostly in the US.\n* imperialGallon: Imperial Gallon (4.54609 litres)\n* kg: kilogram\n* kWh: kilowatt hour\n* litre: Litre\n* m3: cubic meter\n* usGallon: US-Gallon (3.785411784 litres)",
        "type": "string",
        "x-package": "place.service.enums",
        "enum": [
          "gasGallonEquivalent",
          "imperialGallon",
          "kg",
          "kWh",
          "litre",
          "m3",
          "usGallon"
        ]
      },
      "Units": {
        "title": "Units",
        "description": "Amount in units, which are specified by unitTypeEnum.",
        "type": "number",
        "x-package": "common.units"
      },
      "ReservationTypeEnum": {
        "title": "ReservationTypeEnum",
        "description": "Different types of reservation.\n* mandatory: Reservation is mandatory.\n* notAvailable: Reservation is not possible.\n* optional: Reservation is optional.\n* partly: There is a specific contingent, that can be reserved.\n* unknown: Possibility of reservation is unknown,\n* unspecified: Possibility of reservation is not specified.",
        "type": "string",
        "x-package": "place.service.enums",
        "enum": [
          "mandatory",
          "notAvailable",
          "optional",
          "partly",
          "unknown",
          "unspecified"
        ]
      },
      "ServiceTypeEnum": {
        "title": "ServiceTypeEnum",
        "description": "A table of different service levels to be expected for fuelling/charging and payment.\n* fullService: Full fuelling service carried out by an employee.\n* selfService: Self Service for fuelling\n* unattended: Unattended station, fuelling and payment to be done without assistance.",
        "type": "string",
        "x-package": "place.service.enums",
        "enum": [
          "fullService",
          "selfService",
          "unattended"
        ]
      },
      "DayEnum": {
        "title": "DayEnum",
        "description": "Defines permissible enumerations of identification of days within a week.",
        "type": "string",
        "x-package": "time.enums",
        "enum": [
          "monday",
          "tuesday",
          "wednesday",
          "thursday",
          "friday",
          "saturday",
          "sunday"
        ]
      },
      "MonthEnum": {
        "title": "MonthEnum",
        "description": "Defines permissible enumerations of identification of calendar months within a year.",
        "type": "string",
        "x-package": "time.enums",
        "enum": [
          "january",
          "february",
          "march",
          "april",
          "may",
          "june",
          "july",
          "august",
          "september",
          "october",
          "november",
          "december"
        ]
      },
      "WeekOfMonthEnum": {
        "title": "WeekOfMonthEnum",
        "description": "Weeks of the month\n\n* `firstWeekOfMonth`: First week of the month\n* `secondWeekOfMonth`: Second week of the month\n* `thirdWeekOfMonth`: Third week of the month\n* `fourthWeekOfMonth`: Fourth week of the month\n* `fifthWeekOfMonth`: Fifth week of the month (at most only 3 days and non in February when not a leap year)",
        "type": "string",
        "x-package": "time.enums",
        "enum": [
          "firstWeekOfMonth",
          "secondWeekOfMonth",
          "thirdWeekOfMonth",
          "fourthWeekOfMonth",
          "fifthWeekOfMonth"
        ]
      },
      "OtherSpecialDay": {
        "title": "OtherSpecialDay",
        "description": "Specification of a other type of special day.",
        "type": "object",
        "x-package": "time",
        "allOf": [
          {
            "$ref": "#/components/schemas/SpecialDay"
          }
        ]
      },
      "PublicHoliday": {
        "title": "PublicHoliday",
        "description": "Specification of a specific public holiday in case `specialDayType` is set to `publicHoliday`.",
        "type": "object",
        "x-package": "time",
        "allOf": [
          {
            "$ref": "#/components/schemas/SpecialDay"
          },
          {
            "type": "object",
            "properties": {
              "publicHolidayName": {
                "$ref": "#/components/schemas/MultilingualString"
              }
            },
            "required": [
              "publicHolidayName"
            ]
          }
        ]
      },
      "SpecialDayTypeEnum": {
        "title": "SpecialDayTypeEnum",
        "description": "Collection of special types of days\n* dayBeforePublicHoliday: The day preceding a public holiday\n* dayFollowingPublicHoliday: A day following a public holiday\n* inLieuOfPublicHoliday: A holiday in lieu of a public holiday that falls on a weekend\n* longWeekendDay: A day between a public holiday and the weekend\n* other: Some other special day\n* publicEventDay: A day of a public event. You may use the publicEvent attribute to specify the corresponding event\n* publicHoliday: Public holiday A public holiday in general. You may use the PublicHoliday class to refer on a specific public holiday\n* schoolDay: A school day\n* schoolHolidays: A day within the school holidays",
        "type": "string",
        "x-package": "time.enums",
        "enum": [
          "dayBeforePublicHoliday",
          "dayFollowingPublicHoliday",
          "inLieuOfPublicHoliday",
          "longWeekendDay",
          "other",
          "publicEventDay",
          "publicHoliday",
          "schoolDay",
          "schoolHolidays"
        ]
      },
      "CoveredTypeEnum": {
        "title": "CoveredTypeEnum",
        "description": "Defines the supported lists of different types describing roof coverage of the facility or entity\n* covered: Indicates that the facility or specific entity has a roof to provide protection from direct overhead sun or adverse weather\n* notCovered: Indicates that the facility or specific entity has no roof to provide protection from direct overhead sun or adverse weather\n* partiallyCovered: Indicates that the facility or specific entity has a roof offering partial coverage to provide protection from direct overhead sun or adverse weather\n* topLevelNotCovered: Indicates that in a multi-level facility or specific entity the top level(s) have no roof to provide protection from direct overhead sun or adverse weather",
        "type": "string",
        "x-package": "place.characteristics.enums",
        "enum": [
          "covered",
          "notCovered",
          "partiallyCovered",
          "topLevelNotCovered"
        ]
      },
      "OperatingModeTypeEnum": {
        "title": "OperatingModeTypeEnum",
        "description": "A list of supported parking operation modes\n* app : App â€“ payment is collected via an app that may also control access to the facility.\n* payAndDisplay : PND â€“ pay and display. Vehicle displays a credential to show it is paid. Typically prepaid and short term.\n* payByPlate : PBP - pay by plate - vehicle registration or license plate is used for recording and enforcement either on street or off street. Payment is collected on a prepaid basis or at the exit.\n* payBySpace : PBS â€“ pay by space. Vehicle makes a payment based on occupying a specific space. Typically prepaid.\n* permit : Similar to PND but for long term parking (e.g. monthly pass, quarterly, semester).\n* ticket : Payment is done with a ticket (e.g. with magnetic strip, barcode). Payment is collected at the exit.",
        "type": "string",
        "x-package": "place.characteristics.enums",
        "enum": [
          "app",
          "payAndDisplay",
          "payByPlate",
          "payBySpace",
          "permit",
          "ticket"
        ]
      },
      "StaffEnum": {
        "title": "StaffEnum",
        "description": "A list of supported values for staffing characteristics\n* staffed : Normally staffed during operating hours\n* temporary : Staffed on a temporary or part time basis.\n* unstaffed : Not normally staffed during operating hours",
        "type": "string",
        "x-package": "place.characteristics.enums",
        "enum": [
          "staffed",
          "temporary",
          "unstaffed"
        ]
      },
      "ImageAlbum": {
        "title": "ImageAlbum",
        "description": "A class defining information relating to images for a parking facility.",
        "type": "object",
        "x-package": "contact",
        "properties": {
          "photo": {
            "$ref": "#/components/schemas/Url"
          },
          "caption": {
            "$ref": "#/components/schemas/MultilingualString"
          },
          "logoImage": {
            "type": "array",
            "description": "URL to location of logo(s) the parking operator wishes to associate with this parking facility (e.g. their logo, schemes [ParkMark])",
            "items": {
              "$ref": "#/components/schemas/Url"
            }
          }
        }
      },
      "AccessAndEgress": {
        "title": "AccessAndEgress",
        "description": "Time periods specified for access to or from a parking facility.",
        "type": "object",
        "x-package": "time",
        "discriminator": {
          "propertyName": "accessAndEgressType",
          "mapping": {
            "accessAndEgressValidity": "#/components/schemas/AccessAndEgressValidity",
            "accessAndEgressPeriods": "#/components/schemas/AccessAndEgressPeriods"
          }
        },
        "properties": {
          "accessAndEgressType": {
            "$ref": "#/components/schemas/AccessAndEgressTypeEnum"
          },
          "exitPossibleAtAnyTime": {
            "type": "boolean",
            "description": "If true, specifies that the specified access is available for exit at all times."
          },
          "entranceOpenTimeArea": {
            "type": "array",
            "description": "Entrance open time area",
            "items": {
              "$ref": "#/components/schemas/EntranceOpenTime"
            }
          },
          "exitOpenTimeArea": {
            "type": "array",
            "description": "Exit open time area",
            "items": {
              "$ref": "#/components/schemas/ExitOpenTime"
            }
          }
        },
        "required": [
          "accessAndEgressType"
        ]
      },
      "OperatingTime": {
        "title": "OperatingTime",
        "description": "Specification of periods or time when the parking operates, do not represents times of accessibility.",
        "type": "object",
        "allOf": [
          {
            "$ref": "#/components/schemas/PeriodsOrValidity"
          }
        ],
        "x-package": "time"
      },
      "MeansOfPaymentEnum": {
        "title": "MeansOfPaymentEnum",
        "description": "Means of payment\n* cashBillsOnly : Cash payment using bills only.\n* cashCoinsAndBills : Cash payment using bills and/or coins only.\n* cashCoinsOnly : Cash payment with coins only.\n* mobileAccount : Payment method using an app or other functions typically via a smartphone, to a linked bank or card account.\n* paymentCreditCard : Payment by electronic payment credit card which is a small plastic card issued by a bank, building society, or  other financial institution (ISO/IEC 7813 and other related standards), allowing the holder to purchase goods or services on credit.\n* paymentDebitCard : Payment by electronic payment debit card which is a small plastic card (ISO/IEC 7813 and other related standards), allowing the holder to transfer money electronically from their bank account when making a purchase.\n* paymentValueCard : Payment by electronic payment debit card which is a small plastic card (ISO/IEC 7813 and other related standards)  with a monetary value stored on the card itself, not that may not be linked to an external account maintained by a financial institution.\n* prepay : Advanced payment for parking right.\n* tollTag : Toll tag (RFID) or similar, with associated account.\n* unknown : Unknown.",
        "type": "string",
        "x-package": "rate.payment.enums",
        "enum": [
          "cashBillsOnly",
          "cashCoinsAndBills",
          "cashCoinsOnly",
          "mobileAccount",
          "paymentCreditCard",
          "paymentDebitCard",
          "paymentValueCard",
          "prepay",
          "tollTag",
          "unknown"
        ]
      },
      "PaymentTimingEnum": {
        "title": "PaymentTimingEnum",
        "description": "Details of when payment is required.\n* other : Other.\n* payAfterExit : Payment on account\n* payAndExit : Pay directly at the exit with a payment card or other means of payment (usually, this payment card must have been used when entering as well).\n* payOnEntry : Pay at start of the parking session (e.g. for pay and display)\n* payPriorToExit : Pay at machine on foot prior to returning to vehicle and use payment ticket to exit.\n* prepay : Pay before entry",
        "type": "string",
        "x-package": "rate.payment.enums",
        "enum": [
          "other",
          "payAfterExit",
          "payAndExit",
          "payOnEntry",
          "payPriorToExit",
          "prepay"
        ]
      },
      "BrandsAcceptedCodeList": {
        "title": "BrandsAcceptedCodeList",
        "description": "Use this class to describe details of the brands that are accepted.",
        "type": "object",
        "x-package": "rate.payment",
        "properties": {
          "brandsAcceptedList": {
            "$ref": "#/components/schemas/ReferencedCodeListEntry"
          }
        },
        "required": [
          "brandsAcceptedList"
        ]
      },
      "BrandsAcceptedText": {
        "title": "BrandsAcceptedText",
        "description": "Use this class to describe details of the brands that are accepted.",
        "type": "object",
        "x-package": "rate.payment",
        "properties": {
          "brandsAccepted": {
            "$ref": "#/components/schemas/MultilingualString"
          }
        }
      },
      "UnitOfMeasureDistanceEnum": {
        "title": "UnitOfMeasureDistanceEnum",
        "description": "Unit used for length/distance elements.\n* foot: Imperial foot = 12 inches\n* metres: SI - metre",
        "type": "string",
        "x-package": "place.enums",
        "enum": [
          "foot",
          "metres"
        ]
      },
      "UnitOfMeasureAreaEnum": {
        "title": "UnitOfMeasureAreaEnum",
        "description": "Unit used for area/surface elements.\n* squareFeet: Unit of Square feet.\n* squareMetres: Unit of Metres Square.\n* squareYards: Unit of Square yards.",
        "type": "string",
        "x-package": "place.enums",
        "enum": [
          "squareFeet",
          "squareMetres",
          "squareYards"
        ]
      },
      "UnitOfMeasureWeightEnum": {
        "title": "UnitOfMeasureWeightEnum",
        "description": "Unit used for weight elements.\n* poundsWeight: 1 lb\n* tonnesMetric: 1000 kilogrammes",
        "type": "string",
        "x-package": "place.enums",
        "enum": [
          "poundsWeight",
          "tonnesMetric"
        ]
      },
      "TriggerTypeEnum": {
        "title": "TriggerTypeEnum",
        "description": "* firstUse : Trigger is applied on first use of the facility.\n* withTransaction : Trigger condition is met when the transaction is completed.",
        "type": "string",
        "x-package": "rate.enums",
        "enum": [
          "firstUse",
          "withTransaction"
        ]
      },
      "LowEmissionLevelEnum": {
        "title": "LowEmissionLevelEnum",
        "description": "The emission level of a vehicle\n* freeOfEmission : Only vehicles that do not produce emissions (e.g. electric driven). Hybrid driven cars are allowed, when they switch to emission free mode within the considered situation\n* lowLevelEmission : Vehicles with low level emission",
        "type": "string",
        "x-package": "rate.eligibility.enums",
        "enum": [
          "freeOfEmission",
          "lowLevelEmission"
        ]
      },
      "ValueRange": {
        "title": "ValueRange",
        "description": "value range for emission criteria",
        "x-package": "common",
        "type": "object",
        "properties": {
          "class": {
            "$ref": "#/components/schemas/ValueRangeClassEnum"
          },
          "unit": {
            "$ref": "#/components/schemas/UnitOfMeasureEnum"
          },
          "boundaries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ValueRangeBoundary"
            },
            "minItems": 1,
            "maxItems": 2
          }
        }
      },
      "ComparisonOperatorEnum": {
        "title": "ComparisonOperatorEnum",
        "description": "Logical comparison operations\n* equalTo : Logical comparison operator of \"equal to\".\n* greaterThan : Logical comparison operator of \"greater than\".\n* greaterThanOrEqualTo : Logical comparison operator of \"greater than or equal to\".\n* lessThan : Logical comparison operator of \"less than\".\n* lessThanOrEqualTo : Logical comparison operator of \"less than or equal to\".",
        "type": "string",
        "x-package": "common.enums",
        "enum": [
          "equalTo",
          "greaterThan",
          "greaterThanOrEqualTo",
          "lessThan",
          "lessThanOrEqualTo"
        ]
      },
      "WeightTypeEnum": {
        "title": "WeightTypeEnum",
        "description": "Type of weight - describing the meaning of a vehicle weight value\n* actual : The weight is the actual weight of a specific vehicle\n* maximumPermitted : The weight is the maximum permitted weight for a vehicle",
        "type": "string",
        "x-package": "rate.eligibility.enums",
        "enum": [
          "actual",
          "maximumPermitted"
        ]
      },
      "AssignedRightTimeRelative": {
        "title": "AssignedRightTimeRelative",
        "description": "Time based constrained for a Qualification (either specific times or relative offsets)",
        "type": "object",
        "x-package": "rate.eligibility",
        "discriminator": {
          "propertyName": "metaType",
          "mapping": {
            "RelativeOffsets": "#/components/schemas/RelativeOffsets",
            "RelativeTimes": "#/components/schemas/RelativeTimes",
            "TimesOfDay": "#/components/schemas/TimesOfDay"
          }
        },
        "properties": {
          "metaType": {
            "type": "string",
            "enum": [
              "RelativeOffsets",
              "RelativeTimes",
              "TimesOfDay"
            ]
          }
        }
      },
      "UnitOfTimeEnum": {
        "title": "UnitOfTimeEnum",
        "description": "The list of the supported units of measures of time.",
        "type": "string",
        "x-package": "time.enums",
        "enum": [
          "year",
          "month",
          "week",
          "day",
          "hour",
          "minute",
          "second"
        ]
      },
      "AccessAndEgressValidity": {
        "title": "AccessAndEgressValidity",
        "description": "Defines an AccessAndEgress variant with validity.",
        "type": "object",
        "x-package": "time",
        "allOf": [
          {
            "$ref": "#/components/schemas/AccessAndEgress"
          },
          {
            "type": "object",
            "properties": {
              "validity": {
                "description": "Specific validity information.",
                "$ref": "#/components/schemas/Validity"
              }
            }
          }
        ]
      },
      "AccessAndEgressPeriods": {
        "title": "AccessAndEgressPeriods",
        "description": "Defines an AccessAndEgress variant with periods.",
        "type": "object",
        "x-package": "time",
        "allOf": [
          {
            "$ref": "#/components/schemas/AccessAndEgress"
          },
          {
            "type": "object",
            "properties": {
              "periods": {
                "type": "array",
                "minItems": 1,
                "description": "list of periods",
                "items": {
                  "$ref": "#/components/schemas/Period"
                }
              }
            }
          }
        ]
      },
      "AccessAndEgressTypeEnum": {
        "title": "AccessAndEgressTypeEnum",
        "description": "Defines the type of access and egress for places.",
        "type": "string",
        "x-package": "time.enums",
        "enum": [
          "accessAndEgressValidity",
          "accessAndEgressPeriods"
        ]
      },
      "EntranceOpenTime": {
        "title": "EntranceOpenTime",
        "description": "Specification of periods of times when parking entrance(s) are open for vehicle movements.",
        "type": "object",
        "allOf": [
          {
            "$ref": "#/components/schemas/PeriodsOrValidity"
          }
        ],
        "x-package": "time"
      },
      "ExitOpenTime": {
        "title": "ExitOpenTime",
        "description": "Specification of periods of times when parking exit(s) are open for vehicle movements.",
        "type": "object",
        "allOf": [
          {
            "$ref": "#/components/schemas/PeriodsOrValidity"
          }
        ],
        "x-package": "time"
      },
      "PeriodsOrValidity": {
        "title": "PeriodsOrValidity",
        "description": "Describes the mutually exclusive use of one Validity or one or more Periods.",
        "type": "object",
        "x-package": "time",
        "discriminator": {
          "propertyName": "type",
          "mapping": {
            "validity": "#/components/schemas/ValidityAlias",
            "periods": "#/components/schemas/PeriodsAlias"
          }
        },
        "properties": {
          "type": {
            "$ref": "#/components/schemas/PeriodsOrValidityTypeEnum"
          }
        },
        "required": [
          "type"
        ]
      },
      "ValueRangeClassEnum": {
        "title": "ValueRangeClassEnum",
        "description": "class of value range specification",
        "x-package": "rate.eligibility.enums",
        "type": "string",
        "enum": [
          "batteryCapacity",
          "engineCapacityPetrol",
          "emissionStandard",
          "engineCapacityDiesel",
          "manufactureDate",
          "emissionValue"
        ]
      },
      "UnitOfMeasureEnum": {
        "title": "UnitOfMeasureEnum",
        "description": "emission-related units of measure",
        "x-package": "rate.eligibility.enums",
        "type": "string",
        "enum": [
          "cubicCentimetres",
          "cubicInches",
          "year",
          "gkm",
          "gpm",
          "kWh",
          "eurolevel"
        ]
      },
      "ValueRangeBoundary": {
        "title": "ValueRangeBoundary",
        "description": "boundary within a value range",
        "x-package": "common",
        "type": "object",
        "properties": {
          "value": {
            "type": "number"
          },
          "comparisonOperator": {
            "$ref": "#/components/schemas/ComparisonOperatorEnum"
          }
        }
      },
      "RelativeOffsets": {
        "title": "RelativeOffsets",
        "description": "Relative offsets definition used in a time-based constrained",
        "type": "object",
        "x-package": "time",
        "properties": {
          "earliestStartRelative": {
            "$ref": "#/components/schemas/Duration"
          },
          "earliestEndRelative": {
            "$ref": "#/components/schemas/Duration"
          },
          "latestStartRelative": {
            "$ref": "#/components/schemas/Duration"
          },
          "latestEndRelative": {
            "$ref": "#/components/schemas/Duration"
          }
        }
      },
      "RelativeTimes": {
        "title": "RelativeTimes",
        "description": "Relative times definition used in a time-based constrained",
        "type": "object",
        "x-package": "time",
        "properties": {
          "unit": {
            "$ref": "#/components/schemas/UnitOfTimeEnum"
          },
          "earliestStartRelative": {
            "$ref": "#/components/schemas/TimeUnitRelativeEnum"
          },
          "earliestEndRelative": {
            "$ref": "#/components/schemas/TimeUnitRelativeEnum"
          },
          "latestStartRelative": {
            "$ref": "#/components/schemas/TimeUnitRelativeEnum"
          },
          "latestEndRelative": {
            "$ref": "#/components/schemas/TimeUnitRelativeEnum"
          }
        }
      },
      "TimesOfDay": {
        "title": "TimesOfDay",
        "description": "Definition of times used in a time-based constrained.",
        "type": "object",
        "x-package": "time",
        "properties": {
          "earliestStart": {
            "$ref": "#/components/schemas/Time"
          },
          "earliestEnd": {
            "$ref": "#/components/schemas/Time"
          },
          "latestStart": {
            "$ref": "#/components/schemas/Time"
          },
          "latestEnd": {
            "$ref": "#/components/schemas/Time"
          }
        }
      },
      "ValidityAlias": {
        "title": "ValidityAlias",
        "description": "Represents a validity.",
        "type": "object",
        "x-package": "time",
        "allOf": [
          {
            "$ref": "#/components/schemas/PeriodsOrValidity"
          },
          {
            "type": "object",
            "properties": {
              "validity": {
                "$ref": "#/components/schemas/Validity"
              }
            }
          }
        ]
      },
      "PeriodsAlias": {
        "title": "PeriodsAlias",
        "description": "Represents an array of periods.",
        "type": "object",
        "x-package": "time",
        "allOf": [
          {
            "$ref": "#/components/schemas/PeriodsOrValidity"
          },
          {
            "type": "object",
            "properties": {
              "periods": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "$ref": "#/components/schemas/Period"
                }
              }
            }
          }
        ]
      },
      "PeriodsOrValidityTypeEnum": {
        "title": "PeriodsOrValidityTypeEnum",
        "description": "Collection of types for PeriodsOrValidity.\n* validity: using validity\n* periods: using periods",
        "type": "string",
        "x-package": "time.enums",
        "enum": [
          "validity",
          "periods"
        ]
      },
      "TimeUnitRelativeEnum": {
        "title": "TimeUnitRelativeEnum",
        "description": "A list of relativity operators for time units\n* `previous`\n* `current`\n* `next`",
        "type": "string",
        "x-package": "time.enums",
        "enum": [
          "previous",
          "current",
          "next"
        ]
      }
    },
    "responses": {
      "TooManyRequests": {
        "description": "Rate limited (problem type `rate-limited`, Part 12).",
        "headers": {
          "Retry-After": {
            "description": "Seconds to wait before retrying (RFC 9110).",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Missing, malformed, expired, or revoked access token (problem type\n`unauthenticated`, Part 12).",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "Forbidden": {
        "description": "Insufficient scope (problem type `insufficient-scope`) or place\ngrant (`insufficient-grant`) for this operation (Part 9).",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "NotFound": {
        "description": "The addressed resource does not exist (problem type\n`target-not-found`). A resource at a place outside the caller's\n`apx_places` grant is 403 `insufficient-grant` instead (Part 9 §9.3).\nA resource that exists but lies outside a narrower ownership scope\n(a merchant's own programs, a valet customer's own ticket) is\nreported as 404, so the answer never confirms another party's\nrecord exists (Part 9 §9.3a).",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "BadRequest": {
        "description": "The request is malformed: the body or a parameter fails the\noperation's schema or a normative field rule (problem type\n`invalid-request`, with an `errors[]` member naming each offending\nJSON Pointer), or a REQUIRED Idempotency-Key is absent\n(`idempotency-key-required`). Part 12.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "CursorRefused": {
        "description": "`mode=change` only (Part 5 §5.2): the cursor is unknown, older\nthan the retention window, or was issued for another (class,\ncredential, filter set). Problem type `target-not-found`; re-sync\nwith `mode=full`. The cursor is an APX parameter, so this refusal\nis always a Problem (Part 5 §5.2 rules 2 and 5).",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      }
    },
    "parameters": {
      "latitude": {
        "schema": {
          "type": "number",
          "format": "float"
        },
        "in": "query",
        "name": "latitude",
        "description": "Location latitude to use as filter (mandatory if __longitude__ and __radius__ are defined)"
      },
      "longitude": {
        "schema": {
          "type": "number",
          "format": "float"
        },
        "in": "query",
        "name": "longitude",
        "description": "Location longitude to use as filter (mandatory if __latitude__ and __radius__ are defined)"
      },
      "radius": {
        "schema": {
          "type": "integer",
          "minimum": 0
        },
        "in": "query",
        "name": "radius",
        "description": "Number of metres to use as search filter from given position (mandatory if __latitude__ and __longitude__ are defined)"
      },
      "place_types": {
        "schema": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/HierarchyElementTypeEnum"
          }
        },
        "name": "type",
        "in": "query",
        "description": "Comma-separated list of place types to consider. All will be assumed if parameter is not used or left blank.",
        "style": "form",
        "explode": false
      },
      "right_spec_types": {
        "schema": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/RightSpecificationTypeEnum"
          }
        },
        "name": "right_type",
        "in": "query",
        "description": "Comma-separated list of right specification types to consider. All will be assumed if parameter is not used or left blank.",
        "style": "form",
        "explode": false
      },
      "structure_type": {
        "schema": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/StructureTypeEnum"
          }
        },
        "name": "structure_type",
        "in": "query",
        "description": "Comma-separated list of types of structure in the hierarchy to consider (all will be assumed if parameter is not used or left blank)",
        "style": "form",
        "explode": false
      },
      "structure_grade": {
        "schema": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/StructureGradeEnum"
          }
        },
        "name": "structure_grade",
        "in": "query",
        "description": "Comma-separated list of Structure grades in the hierarchy to consider (all will be assumed if parameter is not used or left blank)",
        "style": "form",
        "explode": false
      },
      "place_name": {
        "schema": {
          "type": "string"
        },
        "name": "name",
        "in": "query",
        "description": "Name of place hierarchy element (in any of its supported languages)"
      },
      "place_layer": {
        "schema": {
          "type": "integer"
        },
        "name": "layer",
        "in": "query",
        "description": "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": {
        "schema": {
          "type": "string"
        },
        "in": "query",
        "name": "operator",
        "description": "id of the parking operator in charge of the location(s)"
      },
      "modified_since": {
        "schema": {
          "type": "integer",
          "minimum": 0
        },
        "in": "query",
        "name": "modified_since",
        "description": "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."
      },
      "places_expand": {
        "schema": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "all",
              "none",
              "rightSpecifications",
              "occupancy",
              "areaLocation",
              "pointLocation",
              "contacts",
              "operatingRestrictions",
              "characteristics",
              "paymentMethods",
              "openingTimes",
              "streetAddress"
            ]
          }
        },
        "description": "Comma-separated list of optional object attributes associated to a place hierarchy element that should be included in the result set.",
        "name": "expand",
        "in": "query",
        "style": "form",
        "explode": false
      },
      "page": {
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "in": "query",
        "name": "page",
        "description": "The page number for paginated responses."
      },
      "ModeParam": {
        "name": "mode",
        "in": "query",
        "required": false,
        "description": "APX change feed (Part 5 §5.2): `full` (default — the route's ordinary\nlist; on a native APDS route, exactly stock APDS 4.1) or `change` (the\nchanges after `cursor`: a ChangeFeedPage on a native route, the route's\nown list envelope with the change-page members on an APX list route,\nrule 8; on an APX list route without a cursor, an empty page holding the\ncurrent head cursor).",
        "schema": {
          "type": "string",
          "enum": [
            "full",
            "change"
          ],
          "default": "full"
        }
      },
      "CursorParam": {
        "name": "cursor",
        "in": "query",
        "required": false,
        "description": "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).",
        "schema": {
          "type": "string"
        }
      },
      "place_ids": {
        "schema": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "description": "Comma-separated list of unique place ids according to the requested types.",
        "name": "place",
        "in": "query",
        "explode": false,
        "style": "form"
      },
      "version": {
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "in": "query",
        "name": "version",
        "description": "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."
      },
      "start_before": {
        "schema": {
          "type": "integer",
          "minimum": 0
        },
        "in": "query",
        "name": "start_before",
        "description": "Unix epoch __instant__ to filter results starting before the given instant."
      },
      "end_before": {
        "schema": {
          "type": "integer",
          "minimum": 0
        },
        "in": "query",
        "name": "end_before",
        "description": "Unix epoch __instant__ to filter results ending before the given instant."
      },
      "start_after": {
        "schema": {
          "type": "integer",
          "minimum": 0
        },
        "in": "query",
        "name": "start_after",
        "description": "Unix epoch __instant__ to filter results starting after the given instant."
      },
      "end_after": {
        "schema": {
          "type": "integer",
          "minimum": 0
        },
        "in": "query",
        "name": "end_after",
        "description": "Unix epoch __instant__ to filter results ending after the given instant."
      },
      "issuer": {
        "schema": {
          "type": "string"
        },
        "in": "query",
        "name": "issuer",
        "description": "id of the entity that issued the returned records"
      },
      "right_specs_expand": {
        "schema": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "all",
              "none",
              "rateEligibility",
              "validity",
              "credentials",
              "rightPools"
            ]
          }
        },
        "description": "Comma-separated list of optional object attributes associated to a right specification that should be included in the result set.",
        "name": "expand",
        "in": "query",
        "style": "form",
        "explode": false
      },
      "right_spec_ids": {
        "schema": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "description": "Comma-separated list of unique right specification ids according to the requested types.",
        "name": "right_spec",
        "in": "query",
        "explode": false,
        "style": "form"
      },
      "rates_expand": {
        "schema": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "all",
              "none",
              "rateLineCollections",
              "rateLineCollections.rateLines"
            ]
          }
        },
        "description": "Comma-separated list of optional attributes associated to a rate that should be included in the result set.",
        "name": "expand",
        "in": "query",
        "style": "form",
        "explode": false
      },
      "credential_ids": {
        "schema": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "in": "query",
        "name": "credential_id",
        "description": "Comma-separated list of unique credential ids according to the requested types.",
        "style": "form",
        "explode": false
      },
      "credential_types": {
        "schema": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/CredentialTypeEnum"
          }
        },
        "name": "credential_type",
        "in": "query",
        "description": "Comma-separated list of credential types to consider. All will be assumed if parameter is not used or left blank.",
        "style": "form",
        "explode": false
      },
      "sessions_expand": {
        "schema": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "all",
              "none",
              "credentials",
              "vehicleAncillaryIdentification",
              "segments",
              "segments.space",
              "segments.assignedRight"
            ]
          }
        },
        "description": "Comma-separated list of optional attributes associated to a session or its segment.s that should be included in the result set.",
        "name": "expand",
        "in": "query",
        "style": "form",
        "explode": false
      },
      "assigned_expand": {
        "schema": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "all",
              "none",
              "plannedUses",
              "assignedRightIssuer"
            ]
          }
        },
        "description": "Comma-separated list of optional object attributes associated to an assigned right that should be included in the result set.",
        "name": "expand",
        "in": "query",
        "style": "form",
        "explode": false
      },
      "quote_type": {
        "name": "quote_type",
        "in": "query",
        "schema": {
          "type": "string",
          "description": "type of quote element requested",
          "enum": [
            "QuoteRightRequest",
            "QuoteRightResponse",
            "QuoteSessionExtensionRequest",
            "QuoteSessionExtensionResponse"
          ]
        }
      },
      "IdempotencyKeyOptional": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": false,
        "description": "When given, the operation is idempotent per Part 4 §4.2a: a replay\nwith the same body returns the current representation (200), a\ndifferent body is 409 `idempotency-conflict`. Clients that retry\nSHOULD send it.",
        "schema": {
          "type": "string"
        }
      },
      "IfMatch": {
        "name": "If-Match",
        "in": "header",
        "required": false,
        "description": "The `version` the client last read, as an entity tag (`\"7\"`). A\nstale value is 409 `version-conflict`; nothing is written (Part 4\n§4.2a). Equivalent to sending `version` in the body.",
        "schema": {
          "type": "string",
          "examples": [
            "\"7\""
          ]
        }
      }
    }
  }
}