{"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"title":"Detail","type":"array"}},"title":"HTTPValidationError","type":"object"},"PublicApiMeta":{"properties":{"api_version":{"default":"v1","title":"Api Version","type":"string"},"request_id":{"title":"Request Id","type":"string"}},"required":["request_id"],"title":"PublicApiMeta","type":"object"},"PublicCoverageCheckRequest":{"additionalProperties":false,"properties":{"lat":{"title":"Lat","type":"number"},"lng":{"title":"Lng","type":"number"},"service_skill":{"title":"Service Skill","type":"string"}},"required":["lat","lng","service_skill"],"title":"PublicCoverageCheckRequest","type":"object"},"PublicCoverageCheckResponse":{"properties":{"data":{"$ref":"#/components/schemas/PublicCoverageCheckResult"},"meta":{"$ref":"#/components/schemas/PublicApiMeta"}},"required":["data","meta"],"title":"PublicCoverageCheckResponse","type":"object"},"PublicCoverageCheckResult":{"properties":{"covered":{"title":"Covered","type":"boolean"},"service_skill":{"title":"Service Skill","type":"string"}},"required":["covered","service_skill"],"title":"PublicCoverageCheckResult","type":"object"},"PublicDispatchAuthorizationRequest":{"additionalProperties":false,"properties":{"channel":{"title":"Channel","type":"string"},"evidence_reference":{"title":"Evidence Reference","type":"string"},"terms_version":{"title":"Terms Version","type":"string"}},"required":["channel","evidence_reference","terms_version"],"title":"PublicDispatchAuthorizationRequest","type":"object"},"PublicDispatchAuthorizationResponse":{"properties":{"data":{"$ref":"#/components/schemas/PublicDispatchAuthorizationResult"},"meta":{"$ref":"#/components/schemas/PublicApiMeta"}},"required":["data","meta"],"title":"PublicDispatchAuthorizationResponse","type":"object"},"PublicDispatchAuthorizationResult":{"properties":{"dispatch_scope":{"title":"Dispatch Scope","type":"string"},"request_reference":{"title":"Request Reference","type":"string"},"routing_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Routing Outcome"},"status":{"title":"Status","type":"string"}},"required":["request_reference","dispatch_scope","status"],"title":"PublicDispatchAuthorizationResult","type":"object"},"PublicServiceCategory":{"properties":{"code":{"title":"Code","type":"string"},"label":{"title":"Label","type":"string"},"skills":{"items":{"$ref":"#/components/schemas/PublicServiceSkill"},"title":"Skills","type":"array"}},"required":["code","label","skills"],"title":"PublicServiceCategory","type":"object"},"PublicServiceRequestCancellationRequest":{"additionalProperties":false,"properties":{"reason":{"title":"Reason","type":"string"}},"required":["reason"],"title":"PublicServiceRequestCancellationRequest","type":"object"},"PublicServiceRequestCancellationResponse":{"properties":{"data":{"$ref":"#/components/schemas/PublicServiceRequestCancellationResult"},"meta":{"$ref":"#/components/schemas/PublicApiMeta"}},"required":["data","meta"],"title":"PublicServiceRequestCancellationResponse","type":"object"},"PublicServiceRequestCancellationResult":{"properties":{"request_reference":{"title":"Request Reference","type":"string"},"status":{"title":"Status","type":"string"}},"required":["request_reference","status"],"title":"PublicServiceRequestCancellationResult","type":"object"},"PublicServiceRequestConsent":{"additionalProperties":false,"description":"Consent must exist at creation time, not deferred to a later\nauthorization step (Tier 1 decision, docs/HANDOFF.md 2026-08-22).","properties":{"policy_version":{"title":"Policy Version","type":"string"},"terms_accepted":{"title":"Terms Accepted","type":"boolean"}},"required":["terms_accepted","policy_version"],"title":"PublicServiceRequestConsent","type":"object"},"PublicServiceRequestCreate":{"additionalProperties":false,"properties":{"consent":{"$ref":"#/components/schemas/PublicServiceRequestConsent"},"customer":{"anyOf":[{"$ref":"#/components/schemas/PublicServiceRequestCustomer"},{"type":"null"}]},"dispatch_scope":{"enum":["private_partner","network"],"title":"Dispatch Scope","type":"string"},"location":{"$ref":"#/components/schemas/PublicServiceRequestLocation"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"service_skill":{"title":"Service Skill","type":"string"},"situation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Situation"},"urgency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Urgency"}},"required":["dispatch_scope","service_skill","location","consent"],"title":"PublicServiceRequestCreate","type":"object"},"PublicServiceRequestCustomer":{"additionalProperties":false,"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"title":"PublicServiceRequestCustomer","type":"object"},"PublicServiceRequestDetail":{"properties":{"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"dispatch_scope":{"title":"Dispatch Scope","type":"string"},"request_reference":{"title":"Request Reference","type":"string"},"status":{"title":"Status","type":"string"}},"required":["request_reference","dispatch_scope","status"],"title":"PublicServiceRequestDetail","type":"object"},"PublicServiceRequestDetailResponse":{"properties":{"data":{"$ref":"#/components/schemas/PublicServiceRequestDetail"},"meta":{"$ref":"#/components/schemas/PublicApiMeta"}},"required":["data","meta"],"title":"PublicServiceRequestDetailResponse","type":"object"},"PublicServiceRequestLocation":{"additionalProperties":false,"properties":{"lat":{"title":"Lat","type":"number"},"lng":{"title":"Lng","type":"number"},"raw_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Text"}},"required":["lat","lng"],"title":"PublicServiceRequestLocation","type":"object"},"PublicServiceRequestResponse":{"properties":{"data":{"$ref":"#/components/schemas/PublicServiceRequestResult"},"meta":{"$ref":"#/components/schemas/PublicApiMeta"}},"required":["data","meta"],"title":"PublicServiceRequestResponse","type":"object"},"PublicServiceRequestResult":{"properties":{"dispatch_scope":{"title":"Dispatch Scope","type":"string"},"request_reference":{"title":"Request Reference","type":"string"},"status":{"title":"Status","type":"string"}},"required":["request_reference","dispatch_scope","status"],"title":"PublicServiceRequestResult","type":"object"},"PublicServiceSkill":{"properties":{"code":{"title":"Code","type":"string"},"label":{"title":"Label","type":"string"},"requires_verification":{"title":"Requires Verification","type":"boolean"}},"required":["code","label","requires_verification"],"title":"PublicServiceSkill","type":"object"},"PublicServicesResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicServiceCategory"},"title":"Data","type":"array"},"meta":{"$ref":"#/components/schemas/PublicApiMeta"}},"required":["data","meta"],"title":"PublicServicesResponse","type":"object"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"title":"Location","type":"array"},"msg":{"title":"Message","type":"string"},"type":{"title":"Error Type","type":"string"}},"required":["loc","msg","type"],"title":"ValidationError","type":"object"}}},"info":{"title":"ClueXP Public API","version":"v1"},"openapi":"3.1.0","paths":{"/coverage-checks":{"post":{"description":"Public coverage lookup: does the verified network have an available,\nskilled technician near this location? Pure read over existing\n`list_available_technicians()` — no ticket/job is created, no dispatch is\ntriggered, and no technician identity or roster is ever returned, only an\naggregate boolean. Safe against Phase 2 network-routing business logic:\nthis answers \"is coverage plausible\" the same way an unauthenticated\ncustomer's own eligibility question would, using the same rule engine\n(`rank_candidates`) the existing dispatch flow already trusts.","operationId":"public_v1_coverage_checks_v1_coverage_checks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCoverageCheckRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCoverageCheckResponse"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Public V1 Coverage Checks"}},"/service-requests":{"post":{"description":"Create a canonical service-request record only (ADR-6). Deliberately\nnever calls `store.set_job_status(..., \"pending_dispatch\")` -- the ops\nqueue and dispatch sweep both gate strictly on that status already, so an\nunauthorized external request stays invisible and un-dispatched by\nconstruction, not by an extra flag. `origin_org_id`/`customer_owner_org_id`\nare resolved server-side from the authenticated client, never from the\nrequest body, mirroring ADR-4's existing anti-spoofing rule for\nbrowser-supplied `org_id`.","operationId":"public_v1_create_service_request_v1_service_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicServiceRequestCreate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicServiceRequestResponse"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Public V1 Create Service Request"}},"/service-requests/{request_id}":{"get":{"operationId":"public_v1_get_service_request_v1_service_requests__request_id__get","parameters":[{"in":"path","name":"request_id","required":true,"schema":{"title":"Request Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicServiceRequestDetailResponse"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Public V1 Get Service Request"}},"/service-requests/{request_id}/cancellations":{"post":{"description":"Idempotent: an already-cancelled request returns the same success\nshape rather than erroring. Gate: draft (never authorized, nothing to\nundo) or the existing customer-cancel window (pending_dispatch through\nen_route) -- blocked once fulfillment is too far along, exactly matching\nthe existing customer-facing cancel rule.","operationId":"public_v1_cancel_service_request_v1_service_requests__request_id__cancellations_post","parameters":[{"in":"path","name":"request_id","required":true,"schema":{"title":"Request Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicServiceRequestCancellationRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicServiceRequestCancellationResponse"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Public V1 Cancel Service Request"}},"/service-requests/{request_id}/dispatch-authorizations":{"post":{"operationId":"public_v1_authorize_dispatch_v1_service_requests__request_id__dispatch_authorizations_post","parameters":[{"in":"path","name":"request_id","required":true,"schema":{"title":"Request Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDispatchAuthorizationRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDispatchAuthorizationResponse"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Public V1 Authorize Dispatch"}},"/service-requests/{request_id}/tracking":{"get":{"description":"Reuses the exact customer-safe dispatch state machine\n(`store.get_dispatch_status`) the internal `/tickets/{id}/tracking`\nalready uses -- technician identity is revealed only at `matched`, never\nearlier, by construction (one function, not two that could drift).","operationId":"public_v1_service_request_tracking_v1_service_requests__request_id__tracking_get","parameters":[{"in":"path","name":"request_id","required":true,"schema":{"title":"Request Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"title":"Response Public V1 Service Request Tracking V1 Service Requests  Request Id  Tracking Get","type":"object"}}},"description":"Successful Response"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"description":"Validation Error"}},"summary":"Public V1 Service Request Tracking"}},"/services":{"get":{"operationId":"public_v1_services_v1_services_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicServicesResponse"}}},"description":"Successful Response"}},"summary":"Public V1 Services"}}},"servers":[{"description":"Canonical public machine API","url":"https://api.cluexp.com/v1"},{"description":"Legacy origin, available during migration","url":"https://intake.cluexp.com/api/v1"}]}