Add the new endpoints to contracts/openapi.yaml and docs/05-api-contract.md (return-preview, the four rule-specific data-quality resolution endpoints, search, integration status, scheduled-scan), document the role matrix and the audit before/after exposure in docs/12-security-and-audit.md, document each rule type's actual resolution flow in docs/07-data-quality.md (including the deliberate evidence-fingerprint simplification and the reopened_from/previous_decision recurrence link), document the preview/ commit relationship in docs/08-return-workflow.md, and update README.md's scope/integration-status/quality-gate sections to match what's actually implemented and verified now. Also drops docs/05-api-contract.md's mention of GET /api/v1/system/status, which was never implemented.
3.9 KiB
API contract summary
The machine-readable baseline is contracts/openapi.yaml.
Authentication
The demo may use signed server-issued sessions or short-lived JWTs. Demo-role buttons create an authenticated session; they do not bypass authorization middleware.
Required routes
System and demo
GET /healthPOST /api/v1/demo/loginGET /api/v1/demo/session— confirms the current session;Cache-Control: no-storePOST /api/v1/demo/logout— safe to call without a sessionPOST /api/v1/demo/reset— Operations Manager only; invalidates the caller's own session
Dashboard
GET /api/v1/dashboard
Vehicles
GET /api/v1/vehiclesGET /api/v1/vehicles/{public_ref}
Bookings and return
GET /api/v1/bookingsGET /api/v1/bookings/{public_ref}POST /api/v1/bookings/{public_ref}/return-preview— non-mutating; shares its domain evaluation with the commit endpoint below so the two cannot drift apartPOST /api/v1/bookings/{public_ref}/return
Return commands require an Idempotency-Key header. Concurrency safety is row-lock based
(SELECT ... FOR UPDATE on the booking and vehicle); no optimistic-version field is
accepted or needed on top of that.
Data quality
All Operations Manager only.
GET /api/v1/data-quality/issuesGET /api/v1/data-quality/issues/{public_ref}POST /api/v1/data-quality/scan— manual trigger for the deterministic five-rule scanPOST /api/v1/data-quality/issues/{public_ref}/deferPOST /api/v1/data-quality/issues/{public_ref}/rejectPOST /api/v1/data-quality/issues/{public_ref}/merge-customers— possible_duplicate_customerPOST /api/v1/data-quality/issues/{public_ref}/provide-fields— missing_required_fieldPOST /api/v1/data-quality/issues/{public_ref}/resolve-odometer-regression— odometer_regressionPOST /api/v1/data-quality/issues/{public_ref}/resolve-overlap— booking_overlapPOST /api/v1/data-quality/issues/{public_ref}/apply-recommended-status— vehicle_status_conflict
Each of the five rule types has exactly one bounded resolution path above (plus defer/reject, which apply to any open issue).
Search
GET /api/v1/search?q=...— bounded typed results (vehicle, booking, data_quality_issue, section); role-filtered server-side; customers are never returned (no customer detail route exists in this PoC)
Knowledge
POST /api/v1/knowledge/questionsGET /api/v1/knowledge/status
Automation and audit
GET /api/v1/workflows— Operations Manager onlyPOST /api/v1/workflows/{event_id}/retry— Operations Manager onlyGET /api/v1/audit— Operations Manager only; each event includesbefore/afterplus a resolvedentity_ref/entity_linkwhere the entity type supports oneGET /api/v1/integrations/status— Operations Manager only; truthful aggregate n8n state from outbox delivery counts (not just the most recent event), and the actual MCP Hubregistration_enabledsetting
n8n-service endpoints
Service-token protected (X-Service-Token, same shared secret as the return callback):
POST /api/v1/integrations/n8n/return-callbackPOST /api/v1/integrations/n8n/scheduled-scan— triggered by the scheduled quality-scan workflow; runs the same domain scan the manual UI action uses
MCP-provider endpoints
Service-token protected:
GET /api/v1/integrations/mcp/operations-summaryGET /api/v1/integrations/mcp/attention-vehiclesGET /api/v1/integrations/mcp/vehicles/{public_ref}
Knowledge search may be routed by the Hub directly to RAGcore or through a narrowly scoped MobilityOps façade. Use the contract chosen in docs/10-mcp-hub-integration.md.
Error shape
{
"error": {
"code": "ODOMETER_REGRESSION",
"message": "The submitted reading is below the current canonical odometer.",
"correlation_id": "...",
"details": {}
}
}