{"openapi":"3.1.0","info":{"title":"Butler","summary":"The AI-native engine that runs service businesses by itself.","version":"0.0.1"},"paths":{"/api/v1/capabilities":{"get":{"tags":["v1"],"summary":"Capabilities","operationId":"capabilities_api_v1_capabilities_get","parameters":[{"name":"vertical","in":"query","required":false,"schema":{"type":"string","default":"tintbutler","title":"Vertical"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Capabilities Api V1 Capabilities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/estimate":{"post":{"tags":["v1"],"summary":"Estimate","description":"Tiered price estimate, delegated to the vertical's pricing rules (no side effects).","operationId":"estimate_api_v1_estimate_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Estimate Api V1 Estimate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants":{"post":{"tags":["v1"],"summary":"Create Tenant","operationId":"create_tenant_api_v1_tenants_post","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}":{"delete":{"tags":["v1"],"summary":"Delete Tenant","description":"Admin: hard-delete a tenant and all its data (FK-safe order). Used to clear demo/test tenants.","operationId":"delete_tenant_api_v1_tenants__tenant_id__delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/quotes":{"post":{"tags":["v1"],"summary":"Create Quote","operationId":"create_quote_api_v1_quotes_post","parameters":[{"name":"X-Butler-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Butler-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v1"],"summary":"List Quotes","operationId":"list_quotes_api_v1_quotes_get","parameters":[{"name":"X-Butler-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Butler-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs":{"post":{"tags":["v1"],"summary":"Book Job","description":"Book a job — from a quote_id (preferred) or directly. Dispatch to a contractor next.","operationId":"book_job_api_v1_jobs_post","parameters":[{"name":"X-Butler-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Butler-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v1"],"summary":"List Jobs","operationId":"list_jobs_api_v1_jobs_get","parameters":[{"name":"X-Butler-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Butler-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/contractors":{"post":{"tags":["v1"],"summary":"Add Contractor","operationId":"add_contractor_api_v1_contractors_post","parameters":[{"name":"X-Butler-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Butler-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v1"],"summary":"List Contractors","operationId":"list_contractors_api_v1_contractors_get","parameters":[{"name":"X-Butler-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Butler-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/jobs/{job_id}":{"patch":{"tags":["v1"],"summary":"Update Job","operationId":"update_job_api_v1_jobs__job_id__patch","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"X-Butler-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Butler-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/message":{"post":{"tags":["v1"],"summary":"Agent Message","description":"Send a customer message to the Butler agent; it replies (and may quote/book). The SMS/voice\nchannel adapters call this. `from` identifies the customer (phone/session); memory is per-contact.","operationId":"agent_message_api_v1_agent_message_post","parameters":[{"name":"X-Butler-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Butler-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/overview":{"get":{"tags":["v1"],"summary":"Admin Overview","operationId":"admin_overview_api_v1_admin_overview_get","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/applicants":{"get":{"tags":["v1"],"summary":"Admin Applicants","operationId":"admin_applicants_api_v1_admin_applicants_get","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/contractors/{cid}/qc":{"post":{"tags":["v1"],"summary":"Admin Qc","description":"AI photo-QC: Claude vision judges a candidate's install photos and suggests a tier.","operationId":"admin_qc_api_v1_admin_contractors__cid__qc_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/contractors/{cid}/activate":{"post":{"tags":["v1"],"summary":"Admin Activate","description":"Flip a vetted candidate to active (dispatchable) at a tier — or reject (suspend).","operationId":"admin_activate_api_v1_admin_contractors__cid__activate_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/tenants/{tenant_id}":{"patch":{"tags":["v1"],"summary":"Admin Update Tenant","description":"Set/merge a tenant's grounded profile (mobile, service_area, hours, services, ...).","operationId":"admin_update_tenant_api_v1_admin_tenants__tenant_id__patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers":{"get":{"tags":["v1"],"summary":"Admin Customers","operationId":"admin_customers_api_v1_admin_customers_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/customers/{cid}":{"get":{"tags":["v1"],"summary":"Admin Customer","description":"The customer 360 — contact, every quote + job, and their agent conversation transcripts.","operationId":"admin_customer_api_v1_admin_customers__cid__get","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/conversations":{"get":{"tags":["v1"],"summary":"Admin Conversations","operationId":"admin_conversations_api_v1_admin_conversations_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/conversations/{cid}":{"get":{"tags":["v1"],"summary":"Admin Conversation","operationId":"admin_conversation_api_v1_admin_conversations__cid__get","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/jobs/{jid}/status":{"post":{"tags":["v1"],"summary":"Admin Job Status","description":"CRM job lifecycle: advance status (state-machine checked) and/or reassign the contractor.","operationId":"admin_job_status_api_v1_admin_jobs__jid__status_post","parameters":[{"name":"jid","in":"path","required":true,"schema":{"type":"string","title":"Jid"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/payments":{"get":{"tags":["v1"],"summary":"Admin Payments","operationId":"admin_payments_api_v1_admin_payments_get","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/payments/{pid}/mark-paid":{"post":{"tags":["v1"],"summary":"Admin Mark Paid","description":"CRM: mark a pending payment as collected (for manual/offline collection).","operationId":"admin_mark_paid_api_v1_admin_payments__pid__mark_paid_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/agent-traffic":{"get":{"tags":["v1"],"summary":"Admin Agent Traffic","description":"Who's hitting the engine — AI agents vs crawlers vs humans (ported from the TA dashboard).","operationId":"admin_agent_traffic_api_v1_admin_agent_traffic_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"week","title":"Period"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/discovery-stack":{"get":{"tags":["v1"],"summary":"Admin Discovery Stack","description":"Live probe of the agent-discovery surface (Track B) — green/red, never hardcoded.","operationId":"admin_discovery_stack_api_v1_admin_discovery_stack_get","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users":{"post":{"tags":["v1"],"summary":"Admin Create User","description":"Create (or reset) a CRM operator login. X-Admin-Key gated — the break-glass that bootstraps the wall.","operationId":"admin_create_user_api_v1_admin_users_post","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/cities":{"get":{"tags":["v1"],"summary":"Admin Cities","description":"The shop/city list for the admin city selector.","operationId":"admin_cities_api_v1_admin_cities_get","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/appointments":{"get":{"tags":["v1"],"summary":"Admin Appointments","description":"The scheduling board — booked jobs as appointment cards (customer, service, pro, price, status).","operationId":"admin_appointments_api_v1_admin_appointments_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/contractors":{"get":{"tags":["v1"],"summary":"Admin Contractors","description":"The roster of vetted installers (and applicants in the pipeline).","operationId":"admin_contractors_api_v1_admin_contractors_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant Id"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/contractors/{cid}":{"get":{"tags":["v1"],"summary":"Admin Contractor","description":"A vetted tinter's profile — vetting, performance, and their job history.","operationId":"admin_contractor_api_v1_admin_contractors__cid__get","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/seed-demo":{"post":{"tags":["v1"],"summary":"Admin Seed Demo","description":"Plant synthetic demo data — a few cities of customers/jobs/installers/conversations + agent traffic.","operationId":"admin_seed_demo_api_v1_admin_seed_demo_post","parameters":[{"name":"cities","in":"query","required":false,"schema":{"type":"integer","default":4,"title":"Cities"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/installers":{"post":{"tags":["v1"],"summary":"Admin Create Installer","description":"Create (or reset) an installer login bound to a Contractor. X-Admin-Key gated.","operationId":"admin_create_installer_api_v1_admin_installers_post","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/me":{"get":{"tags":["v1"],"summary":"Installer Me","operationId":"installer_me_api_v1_installer_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/installer/jobs":{"get":{"tags":["v1"],"summary":"Installer Jobs","description":"The jobs dispatched to THIS installer — their run sheet.","operationId":"installer_jobs_api_v1_installer_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/installer/jobs/{jid}/checkin":{"post":{"tags":["v1"],"summary":"Installer Checkin","description":"Advance a job through the on-site flow: en_route -> arrived -> start -> complete (+ notes).","operationId":"installer_checkin_api_v1_installer_jobs__jid__checkin_post","parameters":[{"name":"jid","in":"path","required":true,"schema":{"type":"string","title":"Jid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/installer/jobs/{jid}/photo-qc":{"post":{"tags":["v1"],"summary":"Installer Photo Qc","description":"Completion photo-QC: Claude vision judges the install inline (base64, no storage) -> verdict + rating.","operationId":"installer_photo_qc_api_v1_installer_jobs__jid__photo_qc_post","parameters":[{"name":"jid","in":"path","required":true,"schema":{"type":"string","title":"Jid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/account/password":{"post":{"tags":["v1"],"summary":"Change Password","description":"Self-service password change for the logged-in operator/installer (session-authed).","operationId":"change_password_api_v1_account_password_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/wipe-demo":{"post":{"tags":["v1"],"summary":"Admin Wipe Demo","description":"Clear the synthetic demo cities (Phoenix/Dallas/Denver/Miami) + their data. Real cities untouched.","operationId":"admin_wipe_demo_api_v1_admin_wipe_demo_post","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/chat":{"post":{"tags":["v1"],"summary":"Public Chat","description":"The web chat widget calls this — no key (public-facing), rate-limited, tenant by public id.","operationId":"public_chat_api_v1_public_chat_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/glass-estimate":{"post":{"tags":["v1"],"summary":"Public Glass Estimate","description":"Photo -> ~square footage -> flat-glass tiers. Vision ballparks a window bank for an instant quote,\nremoving the measure-visit friction on commercial/residential flat glass.","operationId":"public_glass_estimate_api_v1_public_glass_estimate_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/quote":{"post":{"tags":["v1"],"summary":"Public Quote","description":"Structured quote from a city storefront form (Tint Atlanta template). Instant price; creates a\nquote when contact info is present. No key — rate-limited, tenant by public id.","operationId":"public_quote_api_v1_public_quote_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recruit/message":{"post":{"tags":["v1"],"summary":"Recruit Message","description":"The 'Become a pro' chat widget calls this. The recruiting agent onboards installers into vetting.","operationId":"recruit_message_api_v1_recruit_message_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/sms/inbound":{"post":{"tags":["webhooks"],"summary":"Inbound Sms","operationId":"inbound_sms_webhooks_sms_inbound_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["meta"],"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"servers":[{"url":"https://tintwaco.com"}]}