{"openapi":"3.1.0","info":{"title":"Not Human fleet operations (services/fleet-api)","version":"0.1.0","description":"M5 cloud for operating Terrain vehicles: dispatch & admission (C2), remote assistance (C3), monitoring (C4), releases (C5), profiles (C6), incident triage (C7). Live updates: GET /v1/ops/stream (text/event-stream). Device messaging is MQTT (see README); this document covers HTTP only. SIMULATION ONLY — not reviewed against a HARA/TARA."},"servers":[{"url":"http://127.0.0.1:4100"}],"tags":[{"name":"platform"},{"name":"dispatch"},{"name":"custody"},{"name":"loader"},{"name":"recipient"},{"name":"fleet"},{"name":"robots"},{"name":"monitoring"},{"name":"assistance"},{"name":"profiles"},{"name":"releases"},{"name":"incidents"},{"name":"support"},{"name":"public"},{"name":"customer"},{"name":"sim"}],"paths":{"/healthz":{"get":{"summary":"Liveness","tags":["platform"],"operationId":"getHealthz","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/readyz":{"get":{"summary":"Readiness (store reachable, audit chain intact, link counters)","tags":["platform"],"operationId":"getReadyz","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/clock":{"get":{"summary":"Service clock (SIM runs may shift it with NH_SIM_START; clients and SIM vehicles plan against it)","tags":["platform"],"operationId":"getV1Clock","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"summary":"This API description (OpenAPI 3.1)","tags":["platform"],"operationId":"getOpenapiJson","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings":{"post":{"summary":"Book a delivery (drop-offs by address, placeId, location or pose); admitted onto a vehicle or rejected with reasons (C2)","tags":["dispatch"],"operationId":"postV1Bookings","security":[{"partnerToken":[]},{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"summary":"Your deliveries with stage, lockers, vehicle position while active and timeline (recipient masked)","tags":["custody"],"operationId":"getV1Bookings","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings/{bookingId}":{"get":{"summary":"Booking and mission progress","tags":["dispatch"],"operationId":"getV1BookingsByBookingId","security":[{"partnerToken":[]},{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings/{bookingId}/cancel":{"post":{"summary":"Cancel (partners: before departure; the vehicle ends the mission safely). On a shared trip: the order leaves the trip before it is sent; after that only operations can cancel the whole trip","tags":["dispatch"],"operationId":"postV1BookingsByBookingIdCancel","security":[{"partnerToken":[]},{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings/{bookingId}/redeliver":{"post":{"summary":"Book an order that was not collected again as a redelivery (same items, recipient and drop-off; a new reference and window), linked to the first; charged as a new delivery","tags":["dispatch"],"operationId":"postV1BookingsByBookingIdRedeliver","security":[{"partnerToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings/{bookingId}/proof":{"get":{"summary":"Delivery proof: handover time, door, how it was opened (PIN, one-tap, remote with a hashed staff reference), door closed and empty, and the vehicle's reports at the stop, with a digest","tags":["custody"],"operationId":"getV1BookingsByBookingIdProof","security":[{"partnerToken":[]},{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/places":{"get":{"summary":"Search real drop-off addresses where a vehicle is in service (?q=); each names its service area","tags":["partner"],"operationId":"getV1PartnerPlaces","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/quota":{"get":{"summary":"Your per-minute limits on this API (requests, bookings, quotes) for the calling client or person","tags":["partner"],"operationId":"getV1PartnerQuota","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/partner-clients/{clientId}/quota":{"get":{"summary":"A partner API client's per-minute limits (its own, else the defaults)","tags":["partner"],"operationId":"getV1OpsPartnerClientsByClientIdQuota","security":[{"staffToken":[]}],"parameters":[{"name":"clientId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"summary":"Set a partner API client's own per-minute limits (null = back to the default; reason required; audited)","tags":["partner"],"operationId":"putV1OpsPartnerClientsByClientIdQuota","security":[{"staffToken":[]}],"parameters":[{"name":"clientId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/me":{"get":{"summary":"The signed-in partner: organisation, roles and what they may do","tags":["partner"],"operationId":"getV1PartnerMe","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/activity":{"get":{"summary":"Audit trail of the organisation's bookings and people","tags":["partner"],"operationId":"getV1PartnerActivity","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/directory":{"get":{"summary":"Organisations with their sites, service areas, and the organisation, site and area of each mission (Console scope)","tags":["dispatch"],"operationId":"getV1OpsDirectory","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/missions":{"get":{"summary":"Missions (filter ?state=)","tags":["dispatch"],"operationId":"getV1OpsMissions","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/missions/{missionId}":{"get":{"summary":"Mission with plan, assign body and state history","tags":["dispatch"],"operationId":"getV1OpsMissionsByMissionId","security":[{"staffToken":[]}],"parameters":[{"name":"missionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/missions/{missionId}/roads":{"get":{"summary":"Streets each leg takes on the zone lane graph (legs[i] ends at stop i; straight lines without a graph) and what each stop is (store name, delivery address)","tags":["dispatch"],"operationId":"getV1OpsMissionsByMissionIdRoads","security":[{"staffToken":[]}],"parameters":[{"name":"missionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/missions/{missionId}/cancel":{"post":{"summary":"Request cancellation (the vehicle decides how to end safely)","tags":["dispatch"],"operationId":"postV1OpsMissionsByMissionIdCancel","security":[{"staffToken":[]}],"parameters":[{"name":"missionId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/places":{"get":{"summary":"Search real drop-off addresses (or pickup shops, ?kind=pickup) in a service area (?area=&q=)","tags":["dispatch"],"operationId":"getV1OpsPlaces","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/bookings/quote":{"post":{"summary":"Dry-run admission for a partner booking (nothing is reserved)","tags":["dispatch"],"operationId":"postV1OpsBookingsQuote","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/bookings":{"post":{"summary":"Book a delivery for a partner (staff); admitted onto a vehicle or rejected with reasons","tags":["dispatch"],"operationId":"postV1OpsBookings","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/bookings/{bookingId}/recipient-link":{"get":{"summary":"SIM only: the tracking link the recipient would get by SMS","tags":["sim"],"operationId":"getV1OpsBookingsByBookingIdRecipientLink","security":[{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/service-areas":{"get":{"summary":"Service areas with their depots","tags":["fleet"],"operationId":"getV1OpsServiceAreas","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/identity/enrolled":{"get":{"summary":"Enrolled units not yet in the fleet (listed where the device registry can list)","tags":["fleet"],"operationId":"getV1OpsIdentityEnrolled","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/vehicles":{"post":{"summary":"Add a commissioned vehicle to the operational fleet","tags":["fleet"],"operationId":"postV1OpsVehicles","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"summary":"Fleet with live state","tags":["monitoring"],"operationId":"getV1OpsVehicles","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/vehicles/{deviceId}/edit":{"post":{"summary":"Change service area, depot or tags (audited with before/after)","tags":["fleet"],"operationId":"postV1OpsVehiclesByDeviceIdEdit","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/vehicles/{deviceId}/status":{"post":{"summary":"In service / maintenance / retired (audited; dispatch only uses in-service vehicles)","tags":["fleet"],"operationId":"postV1OpsVehiclesByDeviceIdStatus","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/vehicles/{deviceId}/profiles":{"post":{"summary":"Re-pin the signed profiles a vehicle runs (audited; each active; robot profile matches the model)","tags":["fleet"],"operationId":"postV1OpsVehiclesByDeviceIdProfiles","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/vehicles/{deviceId}/identity":{"get":{"summary":"Identity lifecycle from the device registry (registered / commissioned / quarantined / revoked, certificate)","tags":["fleet"],"operationId":"getV1OpsVehiclesByDeviceIdIdentity","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/vehicles/{deviceId}":{"get":{"summary":"One vehicle: registry record and live state","tags":["monitoring"],"operationId":"getV1OpsVehiclesByDeviceId","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/vehicles/{deviceId}/dtcs":{"get":{"summary":"DTC history (?faultKey=)","tags":["monitoring"],"operationId":"getV1OpsVehiclesByDeviceIdDtcs","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/vehicles/{deviceId}/diagnostics":{"get":{"summary":"Latest diagnostics report (autonomy blockers, safety, compute, topic rates, mission step) with its receive time, and the blocker / safety-state change history (newest first)","tags":["monitoring"],"operationId":"getV1OpsVehiclesByDeviceIdDiagnostics","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/vehicles/{deviceId}/logs":{"get":{"summary":"Vehicle log lines from diagnostics reports, newest first (?level=WARN|ERROR minimum level, q= text in message or node, limit= 1-1000, default 200; redacted)","tags":["monitoring"],"operationId":"getV1OpsVehiclesByDeviceIdLogs","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/alerts":{"get":{"summary":"Alerts (?status=open|acknowledged|resolved)","tags":["monitoring"],"operationId":"getV1OpsAlerts","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/alerts/{alertId}/ack":{"post":{"summary":"Acknowledge an alert","tags":["monitoring"],"operationId":"postV1OpsAlertsByAlertIdAck","security":[{"staffToken":[]}],"parameters":[{"name":"alertId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/alerts/{alertId}/resolve":{"post":{"summary":"Resolve an acknowledged alert","tags":["monitoring"],"operationId":"postV1OpsAlertsByAlertIdResolve","security":[{"staffToken":[]}],"parameters":[{"name":"alertId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/assist":{"get":{"summary":"Assistance queue (?status=)","tags":["assistance"],"operationId":"getV1OpsAssist","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/assist/{requestId}":{"get":{"summary":"One assistance request","tags":["assistance"],"operationId":"getV1OpsAssistByRequestId","security":[{"staffToken":[]}],"parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/assist/{requestId}/claim":{"post":{"summary":"Claim a request (one operator answers)","tags":["assistance"],"operationId":"postV1OpsAssistByRequestIdClaim","security":[{"staffToken":[]}],"parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/assist/{requestId}/respond":{"post":{"summary":"Mission-level guidance: CHOOSE_ROUTE | CONFIRM_PROCEED | WAIT (never direct control)","tags":["assistance"],"operationId":"postV1OpsAssistByRequestIdRespond","security":[{"staffToken":[]}],"parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/assist/{requestId}/snapshots/{snapshotId}":{"get":{"summary":"Camera snapshot reference (access is audited)","tags":["assistance"],"operationId":"getV1OpsAssistByRequestIdSnapshotsBySnapshotId","security":[{"staffToken":[]}],"parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string"}},{"name":"snapshotId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/assist/{requestId}/history":{"get":{"summary":"Audit trail of one request","tags":["assistance"],"operationId":"getV1OpsAssistByRequestIdHistory","security":[{"staffToken":[]}],"parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/profiles":{"post":{"summary":"Validate, sign and publish a profile version","tags":["profiles"],"operationId":"postV1OpsProfiles","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"summary":"All profile versions","tags":["profiles"],"operationId":"getV1OpsProfiles","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/profiles/{kind}/{profileId}/{version}/revoke":{"post":{"summary":"Revoke a profile version","tags":["profiles"],"operationId":"postV1OpsProfilesByKindByProfileIdByVersionRevoke","security":[{"staffToken":[]}],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string"}},{"name":"profileId","in":"path","required":true,"schema":{"type":"string"}},{"name":"version","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/profiles/keys":{"get":{"summary":"Trusted profile-signing public keys (robots pin these)","tags":["profiles"],"operationId":"getV1ProfilesKeys","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/device/profiles":{"get":{"summary":"Robot: the signed profiles pinned for this vehicle","tags":["profiles"],"operationId":"getV1DeviceProfiles","security":[{"deviceMtls":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/device/profiles/{kind}/{profileId}/{version}":{"get":{"summary":"Robot: fetch one signed profile envelope","tags":["profiles"],"operationId":"getV1DeviceProfilesByKindByProfileIdByVersion","security":[{"deviceMtls":[]}],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string"}},{"name":"profileId","in":"path","required":true,"schema":{"type":"string"}},{"name":"version","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/releases/bundles":{"post":{"summary":"Register a signed release bundle (with SBOM reference)","tags":["releases"],"operationId":"postV1OpsReleasesBundles","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"summary":"Registered bundles","tags":["releases"],"operationId":"getV1OpsReleasesBundles","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/releases/rollouts":{"post":{"summary":"Start a staged rollout (sign-in in the last 5 min)","tags":["releases"],"operationId":"postV1OpsReleasesRollouts","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"summary":"Rollouts","tags":["releases"],"operationId":"getV1OpsReleasesRollouts","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/releases/rollouts/{rolloutId}":{"get":{"summary":"Rollout status, stage members, health verdict, records","tags":["releases"],"operationId":"getV1OpsReleasesRolloutsByRolloutId","security":[{"staffToken":[]}],"parameters":[{"name":"rolloutId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/releases/rollouts/{rolloutId}/advance":{"post":{"summary":"Advance to the next stage (requires a healthy, proven stage)","tags":["releases"],"operationId":"postV1OpsReleasesRolloutsByRolloutIdAdvance","security":[{"staffToken":[]}],"parameters":[{"name":"rolloutId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/releases/rollouts/{rolloutId}/pause":{"post":{"summary":"Pause offering","tags":["releases"],"operationId":"postV1OpsReleasesRolloutsByRolloutIdPause","security":[{"staffToken":[]}],"parameters":[{"name":"rolloutId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/releases/rollouts/{rolloutId}/resume":{"post":{"summary":"Resume a paused rollout","tags":["releases"],"operationId":"postV1OpsReleasesRolloutsByRolloutIdResume","security":[{"staffToken":[]}],"parameters":[{"name":"rolloutId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/releases/rollouts/{rolloutId}/rollback":{"post":{"summary":"Halt and roll back manually","tags":["releases"],"operationId":"postV1OpsReleasesRolloutsByRolloutIdRollback","security":[{"staffToken":[]}],"parameters":[{"name":"rolloutId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/vehicles/{deviceId}/software":{"get":{"summary":"R156-style software inventory, RXSWIN and update records","tags":["releases"],"operationId":"getV1OpsVehiclesByDeviceIdSoftware","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/device/updates":{"get":{"summary":"Robot: update/rollback offers for this vehicle","tags":["releases"],"operationId":"getV1DeviceUpdates","security":[{"deviceMtls":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/device/updates/{recordId}/status":{"post":{"summary":"Robot: report update progress/result","tags":["releases"],"operationId":"postV1DeviceUpdatesByRecordIdStatus","security":[{"deviceMtls":[]}],"parameters":[{"name":"recordId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/devices/{deviceId}/access-changed":{"post":{"summary":"Device revoked/quarantined in platform-auth: drop cached ACL, re-check live MQTT sessions now","tags":["platform"],"operationId":"postV1OpsDevicesByDeviceIdAccessChanged","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents":{"get":{"summary":"Incidents (?state=&priority=&type=&deviceId=&ownerId=&open=true|false)","tags":["incidents"],"operationId":"getV1OpsIncidents","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Open an incident: manual, from an alert or from a fault (DTC record)","tags":["incidents"],"operationId":"postV1OpsIncidents","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents/{incidentId}":{"get":{"summary":"Incident with timeline, links, evidence references, review and allowed next steps","tags":["incidents"],"operationId":"getV1OpsIncidentsByIncidentId","security":[{"staffToken":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents/{incidentId}/transition":{"post":{"summary":"Triage state change (new, acknowledged, investigating, mitigated, closed); P1/P2 need a note","tags":["incidents"],"operationId":"postV1OpsIncidentsByIncidentIdTransition","security":[{"staffToken":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents/{incidentId}/assign":{"post":{"summary":"Assign the owner (P1/P2 hand-over needs a note)","tags":["incidents"],"operationId":"postV1OpsIncidentsByIncidentIdAssign","security":[{"staffToken":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents/{incidentId}/type":{"post":{"summary":"Reclassify the incident type (break_in, theft, handover, …)","tags":["incidents"],"operationId":"postV1OpsIncidentsByIncidentIdType","security":[{"staffToken":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents/{incidentId}/priority":{"post":{"summary":"Change priority (note required)","tags":["incidents"],"operationId":"postV1OpsIncidentsByIncidentIdPriority","security":[{"staffToken":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents/{incidentId}/notes":{"post":{"summary":"Add a timeline note","tags":["incidents"],"operationId":"postV1OpsIncidentsByIncidentIdNotes","security":[{"staffToken":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents/{incidentId}/links":{"post":{"summary":"Link alerts, faults (DTC records), the mission or the vehicle","tags":["incidents"],"operationId":"postV1OpsIncidentsByIncidentIdLinks","security":[{"staffToken":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents/{incidentId}/evidence":{"post":{"summary":"Add an evidence reference: log range, recording, or redacted camera snapshot id","tags":["incidents"],"operationId":"postV1OpsIncidentsByIncidentIdEvidence","security":[{"staffToken":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents/{incidentId}/review":{"post":{"summary":"Write or update the post-incident review (root cause, actions, scenario decision)","tags":["incidents"],"operationId":"postV1OpsIncidentsByIncidentIdReview","security":[{"staffToken":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/incidents/{incidentId}/audit":{"get":{"summary":"Audit trail of one incident (every operator action, refusals included)","tags":["incidents"],"operationId":"getV1OpsIncidentsByIncidentIdAudit","security":[{"staffToken":[]}],"parameters":[{"name":"incidentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/stream":{"get":{"summary":"Server-Sent Events: incident, alert, vehicle, mission, assist, diagnostics (?topics=a,b; Last-Event-ID resumes)","tags":["platform"],"operationId":"getV1OpsStream","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/access/keys":{"get":{"summary":"Access-grant signing public keys (vehicles verify grants with these until CR-IF-9 puts them in the robot profile)","tags":["custody"],"operationId":"getV1AccessKeys","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/sites":{"get":{"summary":"Your stores (pickup sites) with their default handover rules","tags":["custody"],"operationId":"getV1PartnerSites","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings/{bookingId}/delivery":{"get":{"summary":"One delivery (custody view)","tags":["custody"],"operationId":"getV1BookingsByBookingIdDelivery","security":[{"partnerToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings/quote":{"post":{"summary":"Dry-run admission: can a vehicle take this now, where each stop resolves to, planned times and an indicative price (nothing is reserved)","tags":["custody"],"operationId":"postV1BookingsQuote","security":[{"partnerToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings/{bookingId}/recipient-link":{"get":{"summary":"SIM only: the tracking link that would go out by SMS (no SMS provider in SIM)","tags":["sim"],"operationId":"getV1BookingsByBookingIdRecipientLink","security":[{"partnerToken":[]},{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/loader/sites":{"get":{"summary":"Sites this loader can work at","tags":["loader"],"operationId":"getV1LoaderSites","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/loader/sites/{siteId}/bay":{"get":{"summary":"Bay board: vehicles booked to load here, observed doors, and the orders to load","tags":["loader"],"operationId":"getV1LoaderSitesBySiteIdBay","security":[{"partnerToken":[]}],"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/loader/sites/{siteId}/activity":{"get":{"summary":"Who did what at this store's bays (loading, releases, problems), newest first","tags":["loader"],"operationId":"getV1LoaderSitesBySiteIdActivity","security":[{"partnerToken":[]}],"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/loader/bookings/{bookingId}/open":{"post":{"summary":"Ask the vehicle to open this order's doors: to load it, or (back at the bay, not collected) to take it back (it re-checks grant, stop, standstill and permit)","tags":["loader"],"operationId":"postV1LoaderBookingsByBookingIdOpen","security":[{"partnerToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/loader/bookings/{bookingId}/received":{"post":{"summary":"Confirm an order that was not collected is back in the store (only once the vehicle saw it taken out and the door closed empty)","tags":["loader"],"operationId":"postV1LoaderBookingsByBookingIdReceived","security":[{"partnerToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/loader/missions/{missionId}/release":{"post":{"summary":"Release the vehicle from the bay (every booked door must report closed, latched and loaded)","tags":["loader"],"operationId":"postV1LoaderMissionsByMissionIdRelease","security":[{"partnerToken":[]}],"parameters":[{"name":"missionId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/loader/bookings/{bookingId}/problem":{"post":{"summary":"Report a loading problem: opens a support case (and an incident when the vehicle or goods are affected); the answer carries the case number","tags":["loader"],"operationId":"postV1LoaderBookingsByBookingIdProblem","security":[{"partnerToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/delivery":{"get":{"summary":"The recipient's delivery: stage, their stop, the vehicle while it comes to them, doors (never the PIN); handover.otp says whether a one-time code is needed first","tags":["recipient"],"operationId":"getV1RDelivery","security":[{"recipientLink":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/pin":{"post":{"summary":"The keypad PIN, only while the vehicle is on its way or at the stop (audited; limited per link and address; after the one-time code where the booking asks for one)","tags":["recipient"],"operationId":"postV1RPin","security":[{"recipientLink":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/open":{"post":{"summary":"One-tap open, only where the partner allows it, only at the stop and only within 30 m of the robot (the vehicle re-checks; limited per link and address)","tags":["recipient"],"operationId":"postV1ROpen","security":[{"recipientLink":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/otp/send":{"post":{"summary":"Text a one-time code to the recipient's phone (bookings with handover.otp; 3 an hour, 10 minutes each)","tags":["recipient"],"operationId":"postV1ROtpSend","security":[{"recipientLink":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/otp/verify":{"post":{"summary":"Check the one-time code (5 tries per code); answers the session value to send as X-Recipient-Otp","tags":["recipient"],"operationId":"postV1ROtpVerify","security":[{"recipientLink":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/more-time":{"post":{"summary":"Ask the vehicle to wait 5 more minutes (once)","tags":["recipient"],"operationId":"postV1RMoreTime","security":[{"recipientLink":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/rebook":{"post":{"summary":"Not collected: ask the store for another delivery (optionally a window and a note); the partner decides and books it","tags":["recipient"],"operationId":"postV1RRebook","security":[{"recipientLink":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/problem":{"post":{"summary":"Report a problem: opens a support case (and an incident when the vehicle or goods are affected); the answer carries the case number","tags":["recipient"],"operationId":"postV1RProblem","security":[{"recipientLink":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/rating":{"post":{"summary":"Rate the handover after collecting","tags":["recipient"],"operationId":"postV1RRating","security":[{"recipientLink":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/receipt":{"get":{"summary":"After collecting: what was collected, when, from which door and store (RCP-07)","tags":["recipient"],"operationId":"getV1RReceipt","security":[{"recipientLink":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/deliveries/{bookingId}":{"get":{"summary":"Custody view of one booking, with the notification outbox","tags":["custody"],"operationId":"getV1OpsDeliveriesByBookingId","security":[{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/deliveries/{bookingId}/open":{"post":{"summary":"Open the recipient's door remotely after checking the camera (reason required, sign-in in the last 5 min; the vehicle re-checks)","tags":["custody"],"operationId":"postV1OpsDeliveriesByBookingIdOpen","security":[{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/sim/world/{deviceId}/{action}":{"post":{"summary":"SIM only: what a person does at the vehicle (type on the keypad, close a door, take items out, put items in)","tags":["sim"],"operationId":"postV1SimWorldByDeviceIdByAction","security":[],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}},{"name":"action","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/sim/{action}":{"post":{"summary":"SIM only: the recipient at their robot (keypad, take items out, close the door); the vehicle comes from the link","tags":["sim"],"operationId":"postV1RSimByAction","security":[{"recipientLink":[]}],"parameters":[{"name":"action","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/sim/session/loader":{"post":{"summary":"SIM only: a 10-minute loader token for org_sim_retailer (no platform-auth in SIM)","tags":["sim"],"operationId":"postV1SimSessionLoader","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones":{"get":{"summary":"Zone rules (?status=draft|pending_approval|active|archived)","tags":["zones"],"operationId":"getV1OpsZones","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Draw a zone rule (starts as a draft)","tags":["zones"],"operationId":"postV1OpsZones","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/preview":{"post":{"summary":"Vehicles a selector matches right now","tags":["zones"],"operationId":"postV1OpsZonesPreview","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/emergency":{"post":{"summary":"Emergency zone: one person (signed in within 5 min), active at once, ends by itself (15 min to 12 h)","tags":["zones"],"operationId":"postV1OpsZonesEmergency","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/health":{"get":{"summary":"Per rule: bookings refused or steered to another vehicle (30 days), entries, exits and waits","tags":["zones"],"operationId":"getV1OpsZonesHealth","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/bundle":{"get":{"summary":"The active rules as one signed bundle for vehicles (version = sha256 of the rules)","tags":["zones"],"operationId":"getV1OpsZonesBundle","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/what-if":{"post":{"summary":"What switching a rule on would change: vehicles inside now, unfinished missions with a stop inside, the last 30 days","tags":["zones"],"operationId":"postV1OpsZonesWhatIf","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/events":{"get":{"summary":"Recent zone entries, exits and over-long waits (?zoneId=&deviceId=&limit=)","tags":["zones"],"operationId":"getV1OpsZonesEvents","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/applies":{"get":{"summary":"Active rules for a vehicle at a point and time, and the winning effects (?deviceId=&lat=&lon=&at=)","tags":["zones"],"operationId":"getV1OpsZonesApplies","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/{zoneId}":{"get":{"summary":"One zone rule","tags":["zones"],"operationId":"getV1OpsZonesByZoneId","security":[{"staffToken":[]}],"parameters":[{"name":"zoneId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/{zoneId}/edit":{"post":{"summary":"Change a draft (withdraws approvals)","tags":["zones"],"operationId":"postV1OpsZonesByZoneIdEdit","security":[{"staffToken":[]}],"parameters":[{"name":"zoneId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/{zoneId}/activate":{"post":{"summary":"Activate; safety effects need a second person","tags":["zones"],"operationId":"postV1OpsZonesByZoneIdActivate","security":[{"staffToken":[]}],"parameters":[{"name":"zoneId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/zones/{zoneId}/archive":{"post":{"summary":"Archive (stops applying)","tags":["zones"],"operationId":"postV1OpsZonesByZoneIdArchive","security":[{"staffToken":[]}],"parameters":[{"name":"zoneId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/areas":{"get":{"summary":"Your own areas: where your robots may not go, must stay, slow down or stay quiet, for all your jobs or some of your sites","tags":["areas"],"operationId":"getV1PartnerAreas","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Draw an area for your own jobs (starts as a draft); it can only add restrictions","tags":["areas"],"operationId":"postV1PartnerAreas","security":[{"partnerToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/areas/what-if":{"post":{"summary":"What switching an area on would change for your jobs: robots inside or outside now, your unfinished jobs, the last 30 days","tags":["areas"],"operationId":"postV1PartnerAreasWhatIf","security":[{"partnerToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/areas/{areaId}/edit":{"post":{"summary":"Change a draft area","tags":["areas"],"operationId":"postV1PartnerAreasByAreaIdEdit","security":[{"partnerToken":[]}],"parameters":[{"name":"areaId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/areas/{areaId}/activate":{"post":{"summary":"Switch an area on","tags":["areas"],"operationId":"postV1PartnerAreasByAreaIdActivate","security":[{"partnerToken":[]}],"parameters":[{"name":"areaId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/areas/{areaId}/archive":{"post":{"summary":"Switch an area off for good (kept for the record)","tags":["areas"],"operationId":"postV1PartnerAreasByAreaIdArchive","security":[{"partnerToken":[]}],"parameters":[{"name":"areaId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/insights":{"get":{"summary":"Insights views the signed-in role may open, the fleet time zone and the pricing basis","tags":["insights"],"operationId":"getV1OpsInsights","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/insights/trips":{"get":{"summary":"Trip ledger: every booking in the period with outcome, planned and driven km, timings and price (?from=&to=&organizationId=&siteIds=&serviceArea=&partnerKind=&outcome=; format=csv downloads it)","tags":["insights"],"operationId":"getV1OpsInsightsTrips","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/insights/trips/{bookingId}":{"get":{"summary":"One trip end to end: the ledger row, planned stops, the driven trace by leg, mission states and the delivery timeline","tags":["insights"],"operationId":"getV1OpsInsightsTripsByBookingId","security":[{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/insights/{view}":{"get":{"summary":"One team view for a period and scope: finance, operations, fleet (vehicle health), partners or road (same filters as the ledger)","tags":["insights"],"operationId":"getV1OpsInsightsByView","security":[{"staffToken":[]}],"parameters":[{"name":"view","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/risk":{"get":{"summary":"Incident hotspots of the last N days with counts by type and hour, and a suggested zone each (?days=30&cellM=250)","tags":["incidents"],"operationId":"getV1OpsRisk","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/kpis":{"get":{"summary":"Detection and response KPIs over the last N days (?days=30): pages, time to acknowledge and mitigate, incidents by type, per 1,000 km","tags":["incidents"],"operationId":"getV1OpsKpis","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/webhooks":{"get":{"summary":"Your webhook endpoints (secrets are never shown again)","tags":["webhooks"],"operationId":"getV1PartnerWebhooks","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Register an endpoint for signed delivery events; the secret is in this answer only","tags":["webhooks"],"operationId":"postV1PartnerWebhooks","security":[{"partnerToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/webhooks/{webhookId}/rotate":{"post":{"summary":"New signing secret and key id (the old one stops at once)","tags":["webhooks"],"operationId":"postV1PartnerWebhooksByWebhookIdRotate","security":[{"partnerToken":[]}],"parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/webhooks/{webhookId}/status":{"post":{"summary":"Pause or resume an endpoint","tags":["webhooks"],"operationId":"postV1PartnerWebhooksByWebhookIdStatus","security":[{"partnerToken":[]}],"parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/webhooks/{webhookId}/ping":{"post":{"summary":"Send a test event now and return the attempt","tags":["webhooks"],"operationId":"postV1PartnerWebhooksByWebhookIdPing","security":[{"partnerToken":[]}],"parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/webhooks/{webhookId}/deliveries":{"get":{"summary":"Delivery log of an endpoint, newest first","tags":["webhooks"],"operationId":"getV1PartnerWebhooksByWebhookIdDeliveries","security":[{"partnerToken":[]}],"parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/webhook-deliveries/{deliveryId}/replay":{"post":{"summary":"Send a delivery again now (same event id)","tags":["webhooks"],"operationId":"postV1PartnerWebhookDeliveriesByDeliveryIdReplay","security":[{"partnerToken":[]}],"parameters":[{"name":"deliveryId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/rate-cards":{"get":{"summary":"Rate cards: the default and every partner version","tags":["billing"],"operationId":"getV1OpsRateCards","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"A new rate card version for a partner (or the default) from a date; audited","tags":["billing"],"operationId":"postV1OpsRateCards","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/invoices":{"get":{"summary":"Invoices for a month (?month=YYYY-MM), one per organisation; format=csv downloads them (finance)","tags":["billing"],"operationId":"getV1OpsInvoices","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/invoices/{organizationId}/{month}":{"get":{"summary":"One organisation's invoice with its lines; format=csv downloads the lines (finance)","tags":["billing"],"operationId":"getV1OpsInvoicesByOrganizationIdByMonth","security":[{"staffToken":[]}],"parameters":[{"name":"organizationId","in":"path","required":true,"schema":{"type":"string"}},{"name":"month","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/ledger":{"get":{"summary":"Ledger entries for a month (?month=YYYY-MM&organizationId=), oldest first; format=csv downloads them","tags":["billing"],"operationId":"getV1OpsLedger","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/credits":{"post":{"summary":"Credit a charged booking (missing or damaged item, goodwill); reason required, audited","tags":["billing"],"operationId":"postV1OpsCredits","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/invoices":{"get":{"summary":"Months you have an invoice for, newest first","tags":["billing"],"operationId":"getV1PartnerInvoices","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/invoices/{month}":{"get":{"summary":"Your invoice for a month (a draft until the month ends)","tags":["billing"],"operationId":"getV1PartnerInvoicesByMonth","security":[{"partnerToken":[]}],"parameters":[{"name":"month","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/organisations":{"get":{"summary":"Partner organisations known to operations, with their store, depot and vehicle counts","tags":["organisations"],"operationId":"getV1OpsOrganisations","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/organisations/sync":{"post":{"summary":"Organisation profiles from platform-auth (name, kind, live or test, linked test twin); the Console sends them","tags":["organisations"],"operationId":"postV1OpsOrganisationsSync","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/organisations/{organizationId}":{"get":{"summary":"One organisation's stores, depots and linked vehicles, and the fleet to link from","tags":["organisations"],"operationId":"getV1OpsOrganisationsByOrganizationId","security":[{"staffToken":[]}],"parameters":[{"name":"organizationId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/organisations/{organizationId}/sites":{"post":{"summary":"A new store (pickup site) for an organisation; audited","tags":["organisations"],"operationId":"postV1OpsOrganisationsByOrganizationIdSites","security":[{"staffToken":[]}],"parameters":[{"name":"organizationId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/sites/{siteId}/edit":{"post":{"summary":"Change a store: name, address and position, bays, handover; audited","tags":["organisations"],"operationId":"postV1OpsSitesBySiteIdEdit","security":[{"staffToken":[]}],"parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/depots":{"get":{"summary":"Every depot: configured per service area and added from the Console","tags":["organisations"],"operationId":"getV1OpsDepots","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"A new depot in a service area, optionally an organisation's; audited","tags":["organisations"],"operationId":"postV1OpsDepots","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/depots/{depotId}/edit":{"post":{"summary":"Rename a depot, or link it to (or unlink it from) an organisation; audited","tags":["organisations"],"operationId":"postV1OpsDepotsByDepotIdEdit","security":[{"staffToken":[]}],"parameters":[{"name":"depotId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/organisations/{organizationId}/vehicles":{"post":{"summary":"Link a vehicle to an organisation (or unlink it); a label, dispatch is unchanged; audited","tags":["organisations"],"operationId":"postV1OpsOrganisationsByOrganizationIdVehicles","security":[{"staffToken":[]}],"parameters":[{"name":"organizationId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings/bulk":{"post":{"summary":"Book from a CSV file (one row per item, rows with the same externalRef are one order): a result per order and row; dryRun only validates; idempotent by externalRef; within the booking quota","tags":["partner"],"operationId":"postV1BookingsBulk","security":[{"partnerToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/slots":{"get":{"summary":"Recurring slots: each with its last occurrences and the next five (recipient masked)","tags":["partner"],"operationId":"getV1PartnerSlots","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Create a recurring slot (days, local time, store, drop-off, items): each occurrence is booked aheadMinutes before its pickup window","tags":["partner"],"operationId":"postV1PartnerSlots","security":[{"partnerToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/slots/{slotId}":{"get":{"summary":"One recurring slot","tags":["partner"],"operationId":"getV1PartnerSlotsBySlotId","security":[{"partnerToken":[]}],"parameters":[{"name":"slotId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/slots/{slotId}/pause":{"post":{"summary":"Pause a recurring slot (books nothing until resumed)","tags":["partner"],"operationId":"postV1PartnerSlotsBySlotIdPause","security":[{"partnerToken":[]}],"parameters":[{"name":"slotId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/slots/{slotId}/resume":{"post":{"summary":"Resume a paused slot","tags":["partner"],"operationId":"postV1PartnerSlotsBySlotIdResume","security":[{"partnerToken":[]}],"parameters":[{"name":"slotId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/contact":{"post":{"summary":"A message from the website contact form: becomes a support case; answers with its reference","tags":["support"],"operationId":"postV1PublicContact","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/robot":{"post":{"summary":"The report page behind a robot's QR code: the robot's public name and what can be reported ({ token } from the QR code)","tags":["support"],"operationId":"postV1PublicRobot","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/robot-report":{"post":{"summary":"Report something about a robot from its QR code ({ token, kind, text, callback? }): a support case, and an incident for a collision, obstruction, unsafe behaviour or damage; answers with its reference; rate-limited","tags":["support"],"operationId":"postV1PublicRobotReport","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases":{"get":{"summary":"Support cases, newest first (sort=priority: most urgent first); ?status=&topic=&source=&queue=&priority=&assignee=|none&bookingId=&jobId=&deviceId=&organizationId=&open=&breached=","tags":["support"],"operationId":"getV1OpsSupportCases","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Open a case from a call, an email or the Console, optionally on a booking or a robot","tags":["support"],"operationId":"postV1OpsSupportCases","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/queues":{"get":{"summary":"Support inbox: open, new, unassigned, waiting on us and SLA-breached cases per queue","tags":["support"],"operationId":"getV1OpsSupportQueues","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}":{"get":{"summary":"One support case: timeline, photo, links, SLA, credits, the job (a delivery's detail and loader photos) and activity merging the case, the job and the robot","tags":["support"],"operationId":"getV1OpsSupportCasesByCaseId","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}/status":{"post":{"summary":"Move a case: new, open, waiting for the customer, resolved, closed (optional note)","tags":["support"],"operationId":"postV1OpsSupportCasesByCaseIdStatus","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}/notes":{"post":{"summary":"An internal note on a case (staff only)","tags":["support"],"operationId":"postV1OpsSupportCasesByCaseIdNotes","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}/assign":{"post":{"summary":"Take a case (\"me\"), assign it to someone (their id) or unassign it (null)","tags":["support"],"operationId":"postV1OpsSupportCasesByCaseIdAssign","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}/reply":{"post":{"summary":"Answer the customer: { text } or { macroId }; to recipient (SMS) | partner (job timeline) | email (recorded) | phone (recorded call), by default the way the case came in; the case then waits unless status says otherwise","tags":["support"],"operationId":"postV1OpsSupportCasesByCaseIdReply","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}/incident":{"post":{"summary":"Open an incident for a report about a robot, linked to the case (once)","tags":["support"],"operationId":"postV1OpsSupportCasesByCaseIdIncident","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}/priority":{"post":{"summary":"Change the priority (urgent, high, normal, low); the SLA targets follow","tags":["support"],"operationId":"postV1OpsSupportCasesByCaseIdPriority","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}/links":{"post":{"summary":"Link a booking (and its job), a robot or an incident","tags":["support"],"operationId":"postV1OpsSupportCasesByCaseIdLinks","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}/credit":{"post":{"summary":"Credit the partner for the case's booking through billing (staff_finance); the ledger entry links back to the case","tags":["support"],"operationId":"postV1OpsSupportCasesByCaseIdCredit","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}/callback":{"post":{"summary":"The number to call back (the case's contact, or a delivery recipient's); staff_support only, audited","tags":["support"],"operationId":"postV1OpsSupportCasesByCaseIdCallback","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/macros":{"get":{"summary":"Canned replies (built-in and the team's) with their audience and the status they set (?archived=true includes archived)","tags":["support"],"operationId":"getV1OpsSupportMacros","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"A new canned reply (staff_support); variables {{case}} {{reference}} {{site}} {{firstName}} {{robot}} {{credit}}","tags":["support"],"operationId":"postV1OpsSupportMacros","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/macros/{macroId}/archive":{"post":{"summary":"Archive a canned reply (staff_support; built-in ones stay)","tags":["support"],"operationId":"postV1OpsSupportMacrosByMacroIdArchive","security":[{"staffToken":[]}],"parameters":[{"name":"macroId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/support/cases/{caseId}/macros/{macroId}":{"get":{"summary":"A canned reply filled in for this case (missing: variables the case has no value for)","tags":["support"],"operationId":"getV1OpsSupportCasesByCaseIdMacrosByMacroId","security":[{"staffToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"macroId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/bookings/{bookingId}/communications":{"get":{"summary":"Every message about a booking and its job: SMS (provider, status; never a text that carries the link), webhooks, notices, case messages and staff notes","tags":["support"],"operationId":"getV1OpsBookingsByBookingIdCommunications","security":[{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/bookings/{bookingId}/notes":{"post":{"summary":"A staff note on a booking (in its communications log; never shown to the partner)","tags":["support"],"operationId":"postV1OpsBookingsByBookingIdNotes","security":[{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/feedback":{"get":{"summary":"Delivery recipients' ratings with their comments, newest first (?maxStars=1-5&organizationId=)","tags":["support"],"operationId":"getV1OpsFeedback","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/robots/{deviceId}/report-qr":{"get":{"summary":"The QR code to put on a robot: the public report link for that robot","tags":["robots"],"operationId":"getV1OpsRobotsByDeviceIdReportQr","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/robots/{deviceId}/report-qr/rotate":{"post":{"summary":"A new QR code for a robot (the old one stops working at once); audited","tags":["robots"],"operationId":"postV1OpsRobotsByDeviceIdReportQrRotate","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/support/cases":{"get":{"summary":"Your support cases, latest first (?status=&bookingId=)","tags":["support"],"operationId":"getV1PartnerSupportCases","security":[{"partnerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Open a support case, about one of your bookings or in general","tags":["support"],"operationId":"postV1PartnerSupportCases","security":[{"partnerToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/support/cases/{caseId}":{"get":{"summary":"One of your cases: the conversation, credits and activity with the job's timeline","tags":["support"],"operationId":"getV1PartnerSupportCasesByCaseId","security":[{"partnerToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/support/cases/{caseId}/messages":{"post":{"summary":"Write to support on one of your cases (reopens a waiting or resolved case)","tags":["support"],"operationId":"postV1PartnerSupportCasesByCaseIdMessages","security":[{"partnerToken":[]}],"parameters":[{"name":"caseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/partner/bookings/{bookingId}/communications":{"get":{"summary":"Every message about your booking: SMS to the recipient (provider, status), webhooks, notices and case messages","tags":["support"],"operationId":"getV1PartnerBookingsByBookingIdCommunications","security":[{"partnerToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/cases":{"get":{"summary":"Your support cases on this delivery and what support wrote to you","tags":["recipient"],"operationId":"getV1RCases","security":[{"recipientLink":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/r/cases/{reference}/messages":{"post":{"summary":"Answer support on one of your cases","tags":["recipient"],"operationId":"postV1RCasesByReferenceMessages","security":[{"recipientLink":[]}],"parameters":[{"name":"reference","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/privacy":{"get":{"summary":"Personal data retention: days after a delivery ends before the recipient is erased, and the last purge","tags":["privacy"],"operationId":"getV1OpsPrivacy","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/privacy/export":{"post":{"summary":"Data-subject request: everything held for a phone number, as JSON (support; sign-in in the last 5 min; audited without the number)","tags":["privacy"],"operationId":"postV1OpsPrivacyExport","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/privacy/erase":{"post":{"summary":"Data-subject request: erase a phone number's personal data now (refused while a delivery is under way; support; sign-in in the last 5 min; audited)","tags":["privacy"],"operationId":"postV1OpsPrivacyErase","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/customer/me":{"get":{"summary":"Your profile, saved places and recipients","tags":["customer"],"operationId":"getV1CustomerMe","security":[{"customerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Change your name, saved places or saved recipients","tags":["customer"],"operationId":"postV1CustomerMe","security":[{"customerToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/customer/places":{"get":{"summary":"Addresses where a robot is in service (?q=)","tags":["customer"],"operationId":"getV1CustomerPlaces","security":[{"customerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/customer/quote":{"post":{"summary":"Can a robot take this now, planned times and the price (nothing is reserved or charged)","tags":["customer"],"operationId":"postV1CustomerQuote","security":[{"customerToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/customer/orders":{"post":{"summary":"Pay and send: the card is charged only if a robot takes it (test cards only)","tags":["customer"],"operationId":"postV1CustomerOrders","security":[{"customerToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"summary":"Your orders, newest first","tags":["customer"],"operationId":"getV1CustomerOrders","security":[{"customerToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/customer/orders/{orderId}":{"get":{"summary":"One order and its delivery (stage, the robot while active, the timeline)","tags":["customer"],"operationId":"getV1CustomerOrdersByOrderId","security":[{"customerToken":[]}],"parameters":[{"name":"orderId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/customer/orders/{orderId}/open":{"post":{"summary":"At pickup: open the locker to put the parcel in (the robot must be there and stopped)","tags":["customer"],"operationId":"postV1CustomerOrdersByOrderIdOpen","security":[{"customerToken":[]}],"parameters":[{"name":"orderId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/customer/orders/{orderId}/send-off":{"post":{"summary":"Locker closed and latched: send the robot on its way","tags":["customer"],"operationId":"postV1CustomerOrdersByOrderIdSendOff","security":[{"customerToken":[]}],"parameters":[{"name":"orderId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/customer/orders/{orderId}/cancel":{"post":{"summary":"Cancel before the robot leaves with the parcel; refunded in full","tags":["customer"],"operationId":"postV1CustomerOrdersByOrderIdCancel","security":[{"customerToken":[]}],"parameters":[{"name":"orderId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/templates":{"get":{"summary":"Limit and dispatch-policy templates (?kind=, all=1 for superseded versions too)","tags":["templates"],"operationId":"getV1OpsTemplates","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Make a template: limits (only stricter than the signed profiles) or dispatch policy, for everyone, an organisation or site, robot models or robots","tags":["templates"],"operationId":"postV1OpsTemplates","security":[{"staffToken":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/templates/catalogue":{"get":{"summary":"Robot kinds, the settings each declares, and the signed profiles' ceilings","tags":["templates"],"operationId":"getV1OpsTemplatesCatalogue","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/templates/effective":{"get":{"summary":"What applies to a robot (and a job for an organisation and site): each setting and the template it came from","tags":["templates"],"operationId":"getV1OpsTemplatesEffective","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/templates/{templateId}/history":{"get":{"summary":"Every version of a template, newest first","tags":["templates"],"operationId":"getV1OpsTemplatesByTemplateIdHistory","security":[{"staffToken":[]}],"parameters":[{"name":"templateId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/templates/{templateId}/new-version":{"post":{"summary":"Change a template: a new version; the old one is kept and stops applying","tags":["templates"],"operationId":"postV1OpsTemplatesByTemplateIdNewVersion","security":[{"staffToken":[]}],"parameters":[{"name":"templateId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/templates/{templateId}/archive":{"post":{"summary":"Stop a template applying (kept for the record)","tags":["templates"],"operationId":"postV1OpsTemplatesByTemplateIdArchive","security":[{"staffToken":[]}],"parameters":[{"name":"templateId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/robots/{deviceId}/recall":{"post":{"summary":"Recall a robot to its base (reason required): a robot on a job is asked to end it safely (it decides how) and then sent back; an idle robot away from base gets a return-to-base job. The robot may refuse; its answer shows on the recall","tags":["robots"],"operationId":"postV1OpsRobotsByDeviceIdRecall","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/robots/{deviceId}/recalls":{"get":{"summary":"Recent recalls of a robot, newest first: status (ending_job, sent, returning, returned, at_base, refused, no_answer, ended, not_sent) and the robot's own answer","tags":["robots"],"operationId":"getV1OpsRobotsByDeviceIdRecalls","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/robots/{deviceId}/out-of-service":{"post":{"summary":"Take a robot out of service (maintenance) with a reason and an optional service ticket; only between jobs (recall it first). Back in service: POST /v1/ops/vehicles/{deviceId}/status","tags":["robots"],"operationId":"postV1OpsRobotsByDeviceIdOutOfService","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/robots/{deviceId}/incidents":{"post":{"summary":"Open an incident on a robot (with its current job unless one is named); same body as POST /v1/ops/incidents without source and deviceId","tags":["robots"],"operationId":"postV1OpsRobotsByDeviceIdIncidents","security":[{"staffToken":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/loader/bookings/{bookingId}/photos":{"post":{"summary":"Add a photo of the order as loaded (JPEG data URL, ≤ 300 kB; items, not labels)","tags":["loader"],"operationId":"postV1LoaderBookingsByBookingIdPhotos","security":[{"partnerToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"201":{"description":"Created"},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings/{bookingId}/photos":{"get":{"summary":"Photos of the order as loaded (metadata)","tags":["custody"],"operationId":"getV1BookingsByBookingIdPhotos","security":[{"partnerToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/bookings/{bookingId}/photos/{photoId}":{"get":{"summary":"One photo (data URL)","tags":["custody"],"operationId":"getV1BookingsByBookingIdPhotosByPhotoId","security":[{"partnerToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}},{"name":"photoId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/bookings/{bookingId}/photos":{"get":{"summary":"Photos of the order as loaded (metadata)","tags":["custody"],"operationId":"getV1OpsBookingsByBookingIdPhotos","security":[{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/bookings/{bookingId}/photos/{photoId}":{"get":{"summary":"One photo (data URL)","tags":["custody"],"operationId":"getV1OpsBookingsByBookingIdPhotosByPhotoId","security":[{"staffToken":[]}],"parameters":[{"name":"bookingId","in":"path","required":true,"schema":{"type":"string"}},{"name":"photoId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/audit":{"get":{"summary":"Audit trail (?targetId=&action=&actorId=)","tags":["platform"],"operationId":"getV1OpsAudit","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ops/audit/verify":{"get":{"summary":"Verify the audit hash chain","tags":["platform"],"operationId":"getV1OpsAuditVerify","security":[{"staffToken":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{}}}},"4XX":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"partnerToken":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"platform-auth access token (aud = delivery API; scopes delivery:book/read/cancel). DPoP-bound tokens use the DPoP scheme."},"staffToken":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"platform-auth access token for the ops audience with nh_role (platform_admin, staff_ops, staff_support, staff_release)."},"recipientLink":{"type":"http","scheme":"Capability","description":"Recipient tracking link token (one booking, HMAC-signed, expires 30 min after the handover). Sent as Authorization: Capability <token>; never in a URL to this API."},"customerToken":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"platform-auth access token of a person signed in to the customer app (aud = the customer audience); works only on their own profile and orders."},"deviceMtls":{"type":"mutualTLS","description":"Device client certificate from platform-auth device CA (SAN urn:nothuman:device:<deviceId>); status checked via /devices/broker/authorize."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}