{"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/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/public/draft":{"post":{"tags":["v1"],"summary":"Public Draft","description":"Persist the adaptive Tint Shop Sites questionnaire without charging the shop.\n\nThis is deliberately separate from ``public/signup``: the marketing promise is a free draft\nbefore checkout.  Repeated browser submissions reuse the same tenant via ``submission_id``.","operationId":"public_draft_api_v1_public_draft_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/signup":{"post":{"tags":["v1"],"summary":"Public Signup","description":"Keyless self-serve: a shop picks a package on the marketing site -> we create a PENDING tenant\nand return a Stripe checkout link. The webhook (checkout.session.completed) activates it on payment.\npayload: {shop, email, phone?, city?, state?, domain?, vertical?, website?:bool, ai?:bool}.","operationId":"public_signup_api_v1_public_signup_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/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/plans":{"get":{"tags":["v1"],"summary":"Admin Plans","description":"The pricing model — $199 base + add-ons (website +$200, ai +$300) + the 4 named packages.","operationId":"admin_plans_api_v1_admin_plans_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/subscriptions":{"get":{"tags":["v1"],"summary":"Admin Subscriptions","description":"Every tenant with its plan + billing status — the management console's billing view.","operationId":"admin_subscriptions_api_v1_admin_subscriptions_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/tenants/{tenant_id}/subscribe":{"post":{"tags":["v1"],"summary":"Admin Subscribe","description":"Open a Stripe Checkout for a tenant. payload: {website?:bool, ai?:bool} (base always included).\nReturns checkout_url (or mode=manual when no Stripe key → activate via /plan).","operationId":"admin_subscribe_api_v1_admin_tenants__tenant_id__subscribe_post","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/tenants/{tenant_id}/plan":{"post":{"tags":["v1"],"summary":"Admin Set Plan","description":"Operator override — set a tenant's add-ons directly (no Stripe). payload: {website?, ai?, status?}.","operationId":"admin_set_plan_api_v1_admin_tenants__tenant_id__plan_post","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/account/me":{"get":{"tags":["v1"],"summary":"Account Me","operationId":"account_me_api_v1_account_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/crm/reports/agent-traffic":{"get":{"tags":["v1"],"summary":"Crm Agent Traffic Report","description":"Tenant-safe LocalGEO arrival + conversion report for shop owners and managers.","operationId":"crm_agent_traffic_report_api_v1_crm_reports_agent_traffic_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"week","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/reports/agent-traffic/recent":{"get":{"tags":["v1"],"summary":"Crm Agent Traffic Recent","operationId":"crm_agent_traffic_recent_api_v1_crm_reports_agent_traffic_recent_get","parameters":[{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/reports/agent-traffic/journeys/{journey_id}":{"get":{"tags":["v1"],"summary":"Crm Agent Traffic Journey","operationId":"crm_agent_traffic_journey_api_v1_crm_reports_agent_traffic_journeys__journey_id__get","parameters":[{"name":"journey_id","in":"path","required":true,"schema":{"type":"string","title":"Journey Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/reports/agent-traffic/discovery":{"get":{"tags":["v1"],"summary":"Crm Agent Discovery Stack","description":"Live, tenant-specific discovery health. Never hardcoded to another Butler city.","operationId":"crm_agent_discovery_stack_api_v1_crm_reports_agent_traffic_discovery_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/crm/reports/revenue":{"get":{"tags":["v1"],"summary":"Crm Revenue Report","operationId":"crm_revenue_report_api_v1_crm_reports_revenue_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"month","title":"Period"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/reports/installers":{"get":{"tags":["v1"],"summary":"Crm Installer Report","operationId":"crm_installer_report_api_v1_crm_reports_installers_get","parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/reports/installers/{contractor_id}":{"get":{"tags":["v1"],"summary":"Crm Installer Report Detail","operationId":"crm_installer_report_detail_api_v1_crm_reports_installers__contractor_id__get","parameters":[{"name":"contractor_id","in":"path","required":true,"schema":{"type":"string","title":"Contractor Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/reports/leads":{"get":{"tags":["v1"],"summary":"Crm Lead Conversion Report","operationId":"crm_lead_conversion_report_api_v1_crm_reports_leads_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"month","title":"Period"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/dashboard":{"get":{"tags":["v1"],"summary":"Crm Dashboard","operationId":"crm_dashboard_api_v1_crm_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/crm/manager-dashboard":{"get":{"tags":["v1"],"summary":"Crm Manager Dashboard","description":"Operational team overview; deliberately excludes shop-wide revenue.","operationId":"crm_manager_dashboard_api_v1_crm_manager_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/crm/claims":{"get":{"tags":["v1"],"summary":"Crm Claims","operationId":"crm_claims_api_v1_crm_claims_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Type"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/claims/{claim_type}/{claim_id}":{"get":{"tags":["v1"],"summary":"Crm Claim","operationId":"crm_claim_api_v1_crm_claims__claim_type___claim_id__get","parameters":[{"name":"claim_type","in":"path","required":true,"schema":{"type":"string","title":"Claim Type"}},{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1"],"summary":"Crm Update Claim","operationId":"crm_update_claim_api_v1_crm_claims__claim_type___claim_id__patch","parameters":[{"name":"claim_type","in":"path","required":true,"schema":{"type":"string","title":"Claim Type"}},{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"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/crm/claims/manufacturer":{"post":{"tags":["v1"],"summary":"Crm Create Warranty Claim","operationId":"crm_create_warranty_claim_api_v1_crm_claims_manufacturer_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/crm/claims/{claim_type}/{claim_id}/schedule":{"post":{"tags":["v1"],"summary":"Crm Schedule Claim","operationId":"crm_schedule_claim_api_v1_crm_claims__claim_type___claim_id__schedule_post","parameters":[{"name":"claim_type","in":"path","required":true,"schema":{"type":"string","title":"Claim Type"}},{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","title":"Claim Id"}}],"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/crm/messages":{"get":{"tags":["v1"],"summary":"Crm Messages","operationId":"crm_messages_api_v1_crm_messages_get","parameters":[{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"needs_reply","title":"Filter"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/messages/{conversation_id}":{"get":{"tags":["v1"],"summary":"Crm Message Thread","operationId":"crm_message_thread_api_v1_crm_messages__conversation_id__get","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/messages/{conversation_id}/handled":{"post":{"tags":["v1"],"summary":"Crm Message Handled","operationId":"crm_message_handled_api_v1_crm_messages__conversation_id__handled_post","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"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/crm/messages/{conversation_id}/send":{"post":{"tags":["v1"],"summary":"Crm Message Send","operationId":"crm_message_send_api_v1_crm_messages__conversation_id__send_post","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"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/crm/messages/{conversation_id}/assign":{"post":{"tags":["v1"],"summary":"Crm Message Assign","operationId":"crm_message_assign_api_v1_crm_messages__conversation_id__assign_post","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"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/crm/email":{"get":{"tags":["v1"],"summary":"Crm Email","operationId":"crm_email_api_v1_crm_email_get","parameters":[{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"needs_reply","title":"Filter"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/email/{conversation_id}":{"get":{"tags":["v1"],"summary":"Crm Email Thread","operationId":"crm_email_thread_api_v1_crm_email__conversation_id__get","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/email/{conversation_id}/handled":{"post":{"tags":["v1"],"summary":"Crm Email Handled","operationId":"crm_email_handled_api_v1_crm_email__conversation_id__handled_post","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"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/crm/email/{conversation_id}/send":{"post":{"tags":["v1"],"summary":"Crm Email Send","operationId":"crm_email_send_api_v1_crm_email__conversation_id__send_post","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"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/crm/jobs":{"get":{"tags":["v1"],"summary":"Crm Jobs","operationId":"crm_jobs_api_v1_crm_jobs_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"service_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Service Type"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/jobs/{job_id}":{"get":{"tags":["v1"],"summary":"Crm Job","operationId":"crm_job_api_v1_crm_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1"],"summary":"Crm Update Job","operationId":"crm_update_job_api_v1_crm_jobs__job_id__patch","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"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/crm/appointments":{"get":{"tags":["v1"],"summary":"Crm Appointments","operationId":"crm_appointments_api_v1_crm_appointments_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"date_from","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date To"}},{"name":"contractor_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Contractor Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["v1"],"summary":"Crm Create Appointment","operationId":"crm_create_appointment_api_v1_crm_appointments_post","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/crm/appointments/{appointment_id}":{"get":{"tags":["v1"],"summary":"Crm Appointment","operationId":"crm_appointment_api_v1_crm_appointments__appointment_id__get","parameters":[{"name":"appointment_id","in":"path","required":true,"schema":{"type":"string","title":"Appointment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1"],"summary":"Crm Update Appointment","operationId":"crm_update_appointment_api_v1_crm_appointments__appointment_id__patch","parameters":[{"name":"appointment_id","in":"path","required":true,"schema":{"type":"string","title":"Appointment Id"}}],"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/crm/checkin":{"get":{"tags":["v1"],"summary":"Crm Checkin Board","operationId":"crm_checkin_board_api_v1_crm_checkin_get","parameters":[{"name":"appointment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Appointment Id"}},{"name":"job_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/checkin/walkins":{"post":{"tags":["v1"],"summary":"Crm Create Walkin Checkin","operationId":"crm_create_walkin_checkin_api_v1_crm_checkin_walkins_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/crm/checkin/appointments/{appointment_id}/arrive":{"post":{"tags":["v1"],"summary":"Crm Arrive Appointment","operationId":"crm_arrive_appointment_api_v1_crm_checkin_appointments__appointment_id__arrive_post","parameters":[{"name":"appointment_id","in":"path","required":true,"schema":{"type":"string","title":"Appointment Id"}}],"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/crm/checkin/catalog":{"get":{"tags":["v1"],"summary":"Crm Checkin Catalog","description":"Return the authenticated shop's normalized service menu for this vehicle.","operationId":"crm_checkin_catalog_api_v1_crm_checkin_catalog_get","parameters":[{"name":"job_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Job Id"}},{"name":"vehicle_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Vehicle Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/service-catalog":{"get":{"tags":["v1"],"summary":"Crm Manage Service Catalog","description":"Return the tenant-wide catalog owners and managers edit in the web CRM.","operationId":"crm_manage_service_catalog_api_v1_crm_service_catalog_get","parameters":[{"name":"vehicle_type","in":"query","required":false,"schema":{"type":"string","default":"sedan","title":"Vehicle Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["v1"],"summary":"Crm Save Service Catalog","description":"Replace this tenant's reviewed catalog; server normalization remains authoritative.","operationId":"crm_save_service_catalog_api_v1_crm_service_catalog_put","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/crm/service-catalog/film-boxes/analyze":{"post":{"tags":["v1"],"summary":"Crm Analyze Film Boxes","description":"Read box-end photos into a reviewable tenant film catalog; never auto-save guesses.","operationId":"crm_analyze_film_boxes_api_v1_crm_service_catalog_film_boxes_analyze_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/crm/service-catalog/film-boxes":{"put":{"tags":["v1"],"summary":"Crm Confirm Film Boxes","description":"Persist only manager-confirmed box reads as this tenant's available materials.","operationId":"crm_confirm_film_boxes_api_v1_crm_service_catalog_film_boxes_put","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/crm/checkin/price":{"post":{"tags":["v1"],"summary":"Crm Checkin Price","description":"The check-in screen and storefront share the tenant price book and calculator.","operationId":"crm_checkin_price_api_v1_crm_checkin_price_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/crm/checkin/{job_id}/media":{"post":{"tags":["v1"],"summary":"Crm Upload Checkin Media","description":"Persist one of the three hard-earned intake photos in protected storage.\n\nLicense, plate, and film-box are the live shop contract.  They remain private and can only be\nstreamed back through the tenant-scoped CRM media routes.","operationId":"crm_upload_checkin_media_api_v1_crm_checkin__job_id__media_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"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/crm/checkin/{job_id}":{"patch":{"tags":["v1"],"summary":"Crm Advance Checkin","operationId":"crm_advance_checkin_api_v1_crm_checkin__job_id__patch","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"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/crm/inspections/products":{"get":{"tags":["v1"],"summary":"Crm Inspection Products","operationId":"crm_inspection_products_api_v1_crm_inspections_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/crm/inspections":{"get":{"tags":["v1"],"summary":"Crm Inspections","operationId":"crm_inspections_api_v1_crm_inspections_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"customer_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Customer Id"}},{"name":"appointment_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Appointment Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["v1"],"summary":"Crm Create Inspection","operationId":"crm_create_inspection_api_v1_crm_inspections_post","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/crm/inspections/{inspection_id}":{"get":{"tags":["v1"],"summary":"Crm Inspection","operationId":"crm_inspection_api_v1_crm_inspections__inspection_id__get","parameters":[{"name":"inspection_id","in":"path","required":true,"schema":{"type":"string","title":"Inspection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1"],"summary":"Crm Update Inspection","operationId":"crm_update_inspection_api_v1_crm_inspections__inspection_id__patch","parameters":[{"name":"inspection_id","in":"path","required":true,"schema":{"type":"string","title":"Inspection Id"}}],"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/crm/inspections/{inspection_id}/quote":{"post":{"tags":["v1"],"summary":"Crm Inspection Quote","operationId":"crm_inspection_quote_api_v1_crm_inspections__inspection_id__quote_post","parameters":[{"name":"inspection_id","in":"path","required":true,"schema":{"type":"string","title":"Inspection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/organizations":{"get":{"tags":["v1"],"summary":"Crm Organizations","operationId":"crm_organizations_api_v1_crm_organizations_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"org_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Org Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["v1"],"summary":"Crm Create Organization","operationId":"crm_create_organization_api_v1_crm_organizations_post","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/crm/organizations/{organization_id}":{"get":{"tags":["v1"],"summary":"Crm Organization","operationId":"crm_organization_api_v1_crm_organizations__organization_id__get","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1"],"summary":"Crm Update Organization","operationId":"crm_update_organization_api_v1_crm_organizations__organization_id__patch","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"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/crm/customers":{"get":{"tags":["v1"],"summary":"Crm Customers","operationId":"crm_customers_api_v1_crm_customers_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Kind"}},{"name":"customer_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Customer Type"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/customers/{customer_id}":{"get":{"tags":["v1"],"summary":"Crm Customer","operationId":"crm_customer_api_v1_crm_customers__customer_id__get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1"],"summary":"Crm Update Customer","operationId":"crm_update_customer_api_v1_crm_customers__customer_id__patch","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"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/crm/customers/{customer_id}/checkin-media/{media_id}":{"get":{"tags":["v1"],"summary":"Crm Customer Checkin Media","operationId":"crm_customer_checkin_media_api_v1_crm_customers__customer_id__checkin_media__media_id__get","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}},{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/jobs/{job_id}/media/{media_id}":{"get":{"tags":["v1"],"summary":"Crm Job Media","operationId":"crm_job_media_api_v1_crm_jobs__job_id__media__media_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/customers/{customer_id}/vehicles":{"post":{"tags":["v1"],"summary":"Crm Create Customer Vehicle","operationId":"crm_create_customer_vehicle_api_v1_crm_customers__customer_id__vehicles_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"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/crm/vehicles/{vehicle_id}":{"patch":{"tags":["v1"],"summary":"Crm Update Vehicle","operationId":"crm_update_vehicle_api_v1_crm_vehicles__vehicle_id__patch","parameters":[{"name":"vehicle_id","in":"path","required":true,"schema":{"type":"string","title":"Vehicle Id"}}],"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/crm/customers/{customer_id}/jobs":{"post":{"tags":["v1"],"summary":"Crm Create Customer Job","operationId":"crm_create_customer_job_api_v1_crm_customers__customer_id__jobs_post","parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"string","title":"Customer Id"}}],"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/crm/pipeline":{"get":{"tags":["v1"],"summary":"Crm Pipeline","operationId":"crm_pipeline_api_v1_crm_pipeline_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/crm/leads":{"get":{"tags":["v1"],"summary":"Crm Leads","operationId":"crm_leads_api_v1_crm_leads_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source"}},{"name":"service_interest","in":"query","required":false,"schema":{"type":"string","default":"","title":"Service Interest"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"created_at","title":"Sort"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","default":"desc","title":"Direction"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["v1"],"summary":"Crm Create Lead","operationId":"crm_create_lead_api_v1_crm_leads_post","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/crm/leads/{lead_id}":{"get":{"tags":["v1"],"summary":"Crm Lead","operationId":"crm_lead_api_v1_crm_leads__lead_id__get","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1"],"summary":"Crm Update Lead","operationId":"crm_update_lead_api_v1_crm_leads__lead_id__patch","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}}],"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/crm/leads/{lead_id}/convert":{"post":{"tags":["v1"],"summary":"Crm Convert Lead","operationId":"crm_convert_lead_api_v1_crm_leads__lead_id__convert_post","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/quotes":{"get":{"tags":["v1"],"summary":"Crm Quotes","operationId":"crm_quotes_api_v1_crm_quotes_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["v1"],"summary":"Crm Create Standalone Quote","description":"Create the standalone staff estimate supported by Tint Atlanta's quote builder.","operationId":"crm_create_standalone_quote_api_v1_crm_quotes_post","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/crm/quotes/{quote_id}":{"get":{"tags":["v1"],"summary":"Crm Quote","operationId":"crm_quote_api_v1_crm_quotes__quote_id__get","parameters":[{"name":"quote_id","in":"path","required":true,"schema":{"type":"string","title":"Quote Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["v1"],"summary":"Crm Update Quote","operationId":"crm_update_quote_api_v1_crm_quotes__quote_id__patch","parameters":[{"name":"quote_id","in":"path","required":true,"schema":{"type":"string","title":"Quote Id"}}],"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/crm/leads/{lead_id}/quotes":{"post":{"tags":["v1"],"summary":"Crm Create Quote","operationId":"crm_create_quote_api_v1_crm_leads__lead_id__quotes_post","parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","title":"Lead Id"}}],"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/crm/quotes/{quote_id}/share":{"post":{"tags":["v1"],"summary":"Crm Share Quote","description":"Create the signed customer handoff used by iOS share/SMS/email sheets.\n\nThis records a share action, not an email delivery. emailed_at remains reserved for a\nsuccessful server email adapter, preserving Tint Atlanta's delivery audit semantics.","operationId":"crm_share_quote_api_v1_crm_quotes__quote_id__share_post","parameters":[{"name":"quote_id","in":"path","required":true,"schema":{"type":"string","title":"Quote Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/crm/quotes/{quote_id}/schedule":{"post":{"tags":["v1"],"summary":"Crm Schedule Quote","operationId":"crm_schedule_quote_api_v1_crm_quotes__quote_id__schedule_post","parameters":[{"name":"quote_id","in":"path","required":true,"schema":{"type":"string","title":"Quote Id"}}],"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/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}/customer-history":{"get":{"tags":["v1"],"summary":"Installer Customer History","description":"Assigned-job context without owner revenue, payments, notes, or protected ID photos.","operationId":"installer_customer_history_api_v1_installer_jobs__jid__customer_history_get","parameters":[{"name":"jid","in":"path","required":true,"schema":{"type":"string","title":"Jid"}}],"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}/checkin":{"post":{"tags":["v1"],"summary":"Installer Checkin","description":"On-site flow: en_route -> arrived -> start -> complete, plus `problem` (reason-coded exceptions,\nstatic rules — no conversational trees in v1) and `undo_last` (audited correction). Idempotent via\nclient_mutation_id: phones retry and thumbs double-tap; a repeated id returns current state.","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":"Photo submission. kind=before: document pre-existing condition (no QC, protects the installer).\nkind=completion (default): ADVISORY AI QC — verdicts accepted | needs_more_photos | pending_review.\nQC never writes the contractor's public rating (friction-round unwind); the score is stored\ninternally on the job only. Low confidence routes to review, never to failure. Completion is\npayable 24h after submission unless the owner flags it (no clawback except fraud/gross defect).","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/pricing":{"get":{"tags":["v1"],"summary":"Get Pricing","description":"The tenant's price book + a sample of the effective (book-over-defaults) estimate.","operationId":"get_pricing_api_v1_pricing_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"}}}}}},"put":{"tags":["v1"],"summary":"Set Pricing","description":"Set (replace) the tenant's price book. Empty book -> back to platform defaults.","operationId":"set_pricing_api_v1_pricing_put","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/public/slots":{"get":{"tags":["v1"],"summary":"Public Slots","description":"Open booking slots for a shop tenant: business hours minus booked capacity (profile.bays).","operationId":"public_slots_api_v1_public_slots_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"site_context","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Context"}}],"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-summary":{"get":{"tags":["v1"],"summary":"Public Quote Summary","description":"Safe quote echo for the booking page — film/price/vehicle + first name only.","operationId":"public_quote_summary_api_v1_public_quote_summary_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}},{"name":"site_context","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Context"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/book":{"post":{"tags":["v1"],"summary":"Public Book","description":"Book a quoted job into a shop slot. Idempotent per quote: rebooking returns the existing job.","operationId":"public_book_api_v1_public_book_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":{}}}}}}},"/webhooks/stripe":{"post":{"tags":["webhooks"],"summary":"Stripe Webhook","operationId":"stripe_webhook_webhooks_stripe_post","parameters":[{"name":"Stripe-Signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/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://tintphilly.com"}]}