{"openapi":"3.1.0","info":{"title":"Stock-Your-Inventory","version":"0.1.0"},"paths":{"/api/v1/health":{"get":{"summary":"Health","description":"Liveness, and whether the billing ticker is still turning (M5.4).\n\n503 when the ticker has not completed a pass in `3 × TICK_INTERVAL_SEC`.\nThree intervals, not one: it leaves room for a slow tick plus its sleep, so\nthe alarm means \"stopped\" rather than \"busy\".\n\n⚠️ **Measured against wall time, never against `ticker_heartbeat`.** That\nfield is written from the platform clock, which the test suite moves by\nmonths (and which a demo panel could move, until M0). A liveness check\nanswers \"is the loop running\", and that is a question about real time.\n`ticker_heartbeat_wall` exists for this and nothing else.\n\nWhen no ticker runs in this process the field is unset and the check is\nskipped, reported as such rather than passed over in silence: a monitor\naimed at a process that was never going to tick should be able to see that\nfrom the answer. Under pytest that is every process — the suite drives\n`run_tick` directly with a demo clock.\n\nSame body in both cases, and deliberately so: a monitor that has to parse\ntwo shapes to tell healthy from stale will eventually parse the wrong one.","operationId":"health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/time":{"get":{"summary":"Platform Time","description":"The platform's sense of 'now' — the same value every time-dependent rule\non the server is evaluated against.\n\nThe SPA needs this because the browser clock is a *different clock*: it can\nbe wrong, and it is in the visitor's zone. A date derived from `new Date()`\ncan then be in the past for `create_hold`, and the booking is refused with\na 422. Found when a demo could still move the server's clock (M5.8 in\nTODO.md); the two clocks were never guaranteed to agree.\n\nDeliberately unauthenticated and not env-gated:\n  * unauthenticated because it discloses nothing new — `/health` already\n    publishes the ticker heartbeat, which *is* platform time — and because\n    an expired session must not silently fall back to the wrong clock;\n  * not env-gated because the frontend must not care which environment\n    it is in. It is the system clock in all of them since M0.\n\n`platform_tz` ships alongside because an instant is not a date. The server\nresolves every date boundary in `PLATFORM_TZ` (M5.20) while the browser was\nstill slicing an ISO string, i.e. asking UTC — so between midnight and 02:00\nin Rome the SPA sent yesterday's `start_date` and `create_hold` answered 422\n(M5.22). The zone, not the date, because one sync at startup has to stay\ncorrect across midnight; the browser recomputes the date from the offset it\nalready holds.","operationId":"platform_time_api_v1_time_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Platform Time Api V1 Time Get"}}}}}}},"/api/v1/auth/signup":{"post":{"summary":"Signup","operationId":"signup_api_v1_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"summary":"Login","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/refresh":{"post":{"summary":"Refresh","description":"A new pair of tokens for a refresh token that is still good, which is\nthen spent. The token comes in the body, from a caller that holds it, or\nas the browser's cookie (M10): then the request must carry the CSRF value,\nlike every request that acts with a cookie.","operationId":"refresh_api_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RefreshRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"summary":"Logout","description":"End this session (M10): the refresh token it holds stops working and\nthe browser's cookies are cleared. The same answer whatever was sent: a\ntoken that is unknown, expired or already spent leaves nothing to end.\n\nUntil M10 signing out only emptied the browser's storage and the refresh\ntoken stayed good for its fourteen days.","operationId":"logout_api_v1_auth_logout_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RefreshRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/impersonation/stop":{"post":{"summary":"Stop Impersonation","description":"Drop the act-as cookie an admin was given on a demo (M10): the admin's\nown session, which was never replaced, is what the browser has left.","operationId":"stop_impersonation_api_v1_auth_impersonation_stop_post","responses":{"204":{"description":"Successful Response"}}}},"/api/v1/auth/verify-email/resend":{"post":{"summary":"Resend Verification","operationId":"resend_verification_api_v1_auth_verify_email_resend_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-email":{"post":{"summary":"Verify Email","operationId":"verify_email_api_v1_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/password-reset/request":{"post":{"summary":"Request Password Reset","operationId":"request_password_reset_api_v1_auth_password_reset_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/password-reset/confirm":{"post":{"summary":"Confirm Password Reset","operationId":"confirm_password_reset_api_v1_auth_password_reset_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/code":{"post":{"summary":"Request Code","description":"Mail a code to an address. One per address per window: asking again\nsooner sends nothing and answers the same.","operationId":"request_code_api_v1_auth_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/code/verify":{"post":{"summary":"Verify Code","description":"Sign in with the code. One refusal for a code that is wrong, expired,\nused, or spent by five wrong tries; after that a new code is needed.","operationId":"verify_code_api_v1_auth_code_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeVerifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/invitations/preview":{"post":{"summary":"Preview Invitation","description":"Who is inviting, and which address, for the page that asks for a\npassword. POST, so the token is in a body and not in a URL or a log.","operationId":"preview_invitation_api_v1_auth_invitations_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationPreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/invitations/accept":{"post":{"summary":"Accept Invitation","operationId":"accept_invitation_api_v1_auth_invitations_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationAccept"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me":{"get":{"summary":"Me","operationId":"me_api_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/consultations":{"get":{"summary":"My Consultations","description":"The appointments this account asked for, newest first. Cancelled ones\nincluded: an appointment that quietly disappears reads as one still on.\n\nScoped through `specialist_leads.user_id` (0021), so a lead older than the\nlogin gate, which belongs to nobody, appears for nobody.","operationId":"my_consultations_api_v1_me_consultations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MyConsultation"},"type":"array","title":"Response My Consultations Api V1 Me Consultations Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/notifications":{"get":{"summary":"My Notifications","operationId":"my_notifications_api_v1_me_notifications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":"array","title":"Response My Notifications Api V1 Me Notifications Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/notifications/read":{"post":{"summary":"Read My Notifications","operationId":"read_my_notifications_api_v1_me_notifications_read_post","responses":{"204":{"description":"Successful Response"}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/notifications/{notification_id}/archive":{"post":{"summary":"Archive My Notification","description":"Put one away. It leaves the page and stays in the table. Somebody else's\nnotification does not exist, as everywhere else.","operationId":"archive_my_notification_api_v1_me_notifications__notification_id__archive_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Notification Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/client-profile":{"post":{"summary":"Create Client Profile","operationId":"create_client_profile_api_v1_me_client_profile_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/seller-profile/payment-method":{"post":{"summary":"Set Seller Payment Method","description":"Put a card on file for the operator (4 October).\n\nThe browser tokenises the card with the payment provider and sends only the\nresulting id, as it would with Stripe Elements; the demo's provider is a\nmock and no charge is made. A second call replaces the card.","operationId":"set_seller_payment_method_api_v1_me_seller_profile_payment_method_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerPaymentMethodRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/seller-profile":{"get":{"summary":"Get Seller Profile","operationId":"get_seller_profile_api_v1_me_seller_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerProfileResponse"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/seller-profile/sales-mode":{"patch":{"summary":"Set Sales Mode","description":"Turn published prices — or self-serve booking — on and off.\n\nBoth default to false because that is what the Italian market does, and the\ndemo of 6 October opens on the model the operator in the room actually runs.\nThis is a switch to flip in the room rather than a story to tell, and it is\nthe same endpoint on the pilot, so nothing shown here is demo-only.\n\nAudited: this changes what the public can see about someone's business.","operationId":"set_sales_mode_api_v1_me_seller_profile_sales_mode_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerSalesModeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/seller-profile/publish-check":{"post":{"summary":"Publish Check","operationId":"publish_check_api_v1_me_seller_profile_publish_check_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Publish Check Api V1 Me Seller Profile Publish Check Post"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/seller-profile/completeness":{"get":{"summary":"Seller Completeness","description":"What is still missing before this operator's page can be published, in\nthe order they will meet it (M3B).","operationId":"seller_completeness_api_v1_me_seller_profile_completeness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerCompleteness"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/operator/verification":{"get":{"summary":"Operator Verification","description":"The status card: where the verification of the business stands, what is\nstill missing, and the centres waiting in a claim. The same for the owner\nand for a member; it names no admin and masks the owner's address.","operationId":"operator_verification_api_v1_me_operator_verification_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorVerification"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/operator/claims/{claim_id}/proof":{"post":{"summary":"Type Proof Code","description":"Type the code sent to the business. The owner or a member may: whoever\nreads the mailbox is not always who signed up. A wrong code is counted and\nthe fifth voids it; the answer says how many are left.","operationId":"type_proof_code_api_v1_me_operator_claims__claim_id__proof_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProofCodeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProofAttemptOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/operator/claims/{claim_id}/proof/request-callback":{"post":{"summary":"Ask For A Callback","description":"\"Preferisco essere chiamato\": no code, a call to the number the centre\npublishes. The claim shows on the desk among those to call.","operationId":"ask_for_a_callback_api_v1_me_operator_claims__claim_id__proof_request_callback_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/operator/claims/{claim_id}/proof/resend":{"post":{"summary":"Resend Proof Code","description":"\"Reinvia\". To the claimant's own address a new code goes at once; for\na PEC the request goes back to the team, who looked the address up.","operationId":"resend_proof_code_api_v1_me_operator_claims__claim_id__proof_resend_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProofResendOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/operator/suggested-sites":{"get":{"summary":"Suggested Sites","description":"\"Forse sono tuoi\": listed centres nobody manages whose public-source\noperator shares this operator's VAT number, domain or name. What their\npages say and on what the suggestion rests; nothing of the source\noperator's company facts.","operationId":"suggested_sites_api_v1_me_operator_suggested_sites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SuggestedSite"},"type":"array","title":"Response Suggested Sites Api V1 Me Operator Suggested Sites Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/operator/suggested-sites/{site_id}/dismiss":{"post":{"summary":"Dismiss Suggested Site","description":"\"Non è mio\": the centre is not suggested to this operator again. It\ncan still be searched for and claimed.","operationId":"dismiss_suggested_site_api_v1_me_operator_suggested_sites__site_id__dismiss_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/operator/claims":{"post":{"summary":"Claim From Dashboard","description":"An operator claims listed centres from its own area: the same claims\nthe sign-up files, decided by an admin in the same queue. Only the owner\ncan, like the terms: a claim says what the business runs.","operationId":"claim_from_dashboard_api_v1_me_operator_claims_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorClaimCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ListingClaimOut"},"type":"array","title":"Response Claim From Dashboard Api V1 Me Operator Claims Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/operator/verification/correction":{"post":{"summary":"Answer Correction","description":"The operator gives again the facts about the business an admin asked\nfor (0046). Only the owner can: they are the business's declarations. The\nanswer is the same whatever the new VAT number turns out to be.","operationId":"answer_correction_api_v1_me_operator_verification_correction_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CorrectionAnswer"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/seller-profile/terms":{"post":{"summary":"Accept Operator Terms","description":"The operator accepts the terms in force. Only the owner can: it binds\nthe business.","operationId":"accept_operator_terms_api_v1_me_seller_profile_terms_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorTermsAcceptRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorTermsAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/export":{"get":{"summary":"Export My Data","description":"Everything the platform holds about the account that asks, as one JSON\ndocument: the account, its profile, its requests with their answers, the\noffers and threads received, appointments, bookings, notifications, what\nit agreed to, and the audit trail of its own actions.\n\n**This is the only export the platform has**, and it exists because the\nlaw gives a person the right to a copy of their own data: nothing else is\ndownloadable (CSV-1). It reads only the caller's own rows, is limited per\naccount, and each copy leaves an audit event.","operationId":"export_my_data_api_v1_me_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnDataExport"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/closure":{"get":{"summary":"Closure Preview","description":"What closing this account would touch, and what stands in the way of\ndeleting it, so that the screen can say it before the last step.","operationId":"closure_preview_api_v1_me_closure_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClosurePreview"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]},"post":{"summary":"Close My Account","description":"Steps two and three: the reason, and the submission. `deactivate`\nswitches the account off and deletes nothing; `delete` removes the person\n(`services/account_closure.py`). Either way every session of the account\nends here. 409 with a key while something must end first: a tenancy that\nis running, a payment outstanding, a team that still has members.","operationId":"close_my_account_api_v1_me_closure_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClosureRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClosureDone"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/closure/code":{"post":{"summary":"Request Closure Code","description":"Step one: mail a fresh code to the account's own address. Asking again\ninside the resend window sends nothing and answers the same.","operationId":"request_closure_code_api_v1_me_closure_code_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedResponse"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/closure/confirm":{"post":{"summary":"Confirm Closure Code","description":"Step one, completed: the code comes back, and the browser is given a\nticket for the last step. One refusal for a code that is wrong, expired,\nused, spent by five wrong tries, or was mailed to sign in.","operationId":"confirm_closure_code_api_v1_me_closure_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClosureCodeConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClosureTicket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/requests/questions":{"get":{"summary":"Questions","description":"The questions of a category, in the language of the request. Stores nothing.","operationId":"questions_api_v1_requests_questions_get","parameters":[{"name":"categoria","in":"query","required":false,"schema":{"type":"string","maxLength":40,"default":"self_storage","title":"Categoria"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionSetOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/requests/centres":{"get":{"summary":"Centres","description":"The cities that have a centre, and the centres of one city or the one\ncentre a page linked to: what the \"where\" screen offers. Public facts only,\ncopied from `PublicSite`. Stores nothing.","operationId":"centres_api_v1_requests_centres_get","parameters":[{"name":"citta","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Citta"}},{"name":"centro","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Centro"}},{"name":"categoria","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Categoria"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCentres"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/requests/estimate":{"post":{"summary":"Estimate Request","description":"The published price range for the answers so far, or \"not available\".\nStores nothing and calls no model.","operationId":"estimate_request_api_v1_requests_estimate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/requests":{"post":{"summary":"Create Request","description":"The wizard's email step: the request is stored, and waits for the code\nmailed to its address unless a verified account sent it.","operationId":"create_request_api_v1_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/requests/funnel":{"post":{"summary":"Report Funnel Step","description":"A browser says how far a walk through the wizard got (M6, F61). No\nlogin is read and none is needed: the row is tied to no account, no\nrequest and no address (`services/funnel.py`). It changes nothing a person\ncan see, so it writes no audit event; it is itself the record.","operationId":"report_funnel_step_api_v1_requests_funnel_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunnelEventIn"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/requests":{"get":{"summary":"My Requests","description":"Every request this account made, in the wizard or in Stora, newest\nfirst, with the centres each went to and what they answered.","operationId":"my_requests_api_v1_me_requests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MyRequestRow"},"type":"array","title":"Response My Requests Api V1 Me Requests Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/me/requests/{request_id}":{"get":{"summary":"My Request","description":"One request with a card per centre: its state, its offer and its\nthread. Opening it reads what the centres wrote.","operationId":"my_request_api_v1_me_requests__request_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/requests/{request_id}/cancel":{"post":{"summary":"Cancel My Request","description":"Withdraw a request, with a reason. The centres that had it see it as\ncancelled; one that never had it never learns of it.","operationId":"cancel_my_request_api_v1_me_requests__request_id__cancel_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCancel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/requests/{request_id}/recipients/{recipient_id}/messages":{"post":{"summary":"Write To Centre","description":"Write to a centre that answered this request (M4B, F58). Plain text.","operationId":"write_to_centre_api_v1_me_requests__request_id__recipients__recipient_id__messages_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}},{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadMessageCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/requests/{request_id}/recipients/{recipient_id}/report":{"post":{"summary":"Report Centre Thread","description":"Flag a thread for an admin (MSG-1).","operationId":"report_centre_thread_api_v1_me_requests__request_id__recipients__recipient_id__report_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}},{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/requests/{request_id}/choose":{"post":{"summary":"Choose Centre","description":"\"I chose this centre\" (M4B, F59): that centre has the request, the\nothers are told the customer chose another one. A request closed already\nanswers 409.","operationId":"choose_centre_api_v1_me_requests__request_id__choose_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestChoose"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/geocode":{"get":{"summary":"Geocode Address","description":"Resolve a free-text address to coordinates for the client map search.\nReuses the server-side geocoder (Nominatim in prod, deterministic stub in tests).\n\n`bbox` is the extent of the place when what was typed is a town or a\ndistrict rather than an address, and null otherwise: the map opens on the\nwhole of \"Milano\", and on a neighbourhood around \"via Tortona 12\".","operationId":"geocode_address_api_v1_search_geocode_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Geocode Address Api V1 Search Geocode Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/geocode-suggest":{"get":{"summary":"Geocode Suggest","description":"Autocomplete candidates for the client address search.","operationId":"geocode_suggest_api_v1_search_geocode_suggest_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":8,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Geocode Suggest Api V1 Search Geocode Suggest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search":{"get":{"summary":"Search","description":"Centres within a radius, nearest first — the list the assistant's map and\nthe pre-M7 search page read. Capped at `SEARCH_MAX_RESULTS`, silently: a\ncaller who needs to know it was cut uses `/search/area`.","operationId":"search_api_v1_search_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"}},{"name":"lng","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Lng"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":500,"exclusiveMinimum":0,"default":10,"title":"Radius Km"}},{"name":"min_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100000,"minimum":0},{"type":"null"}],"title":"Min M2"}},{"name":"max_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100000,"minimum":0},{"type":"null"}],"title":"Max M2"}},{"name":"max_price_cents","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Max Price Cents"}},{"name":"features","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"title":"Features"}},{"name":"amenities","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"title":"Amenities"}},{"name":"operators","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":20,"title":"Operators"}},{"name":"available","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Available"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SearchResultItem"},"title":"Response Search Api V1 Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/area":{"get":{"summary":"Search Area","description":"Centres inside the map's rectangle (M7) — the question a map asks.\n\n`lat`/`lng` are the point distances are measured from (an address the\ncustomer typed); without them, the middle of the rectangle. `radius_km`\nthen narrows the rectangle to a circle around that point. Nearest first,\nat most `SEARCH_MAX_RESULTS`, and `truncated` says when there were more.","operationId":"search_area_api_v1_search_area_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"min_lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Min Lat"}},{"name":"max_lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Max Lat"}},{"name":"min_lng","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Min Lng"}},{"name":"max_lng","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Max Lng"}},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Lat"}},{"name":"lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Lng"}},{"name":"radius_km","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":500,"exclusiveMinimum":0},{"type":"null"}],"title":"Radius Km"}},{"name":"min_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100000,"minimum":0},{"type":"null"}],"title":"Min M2"}},{"name":"max_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100000,"minimum":0},{"type":"null"}],"title":"Max M2"}},{"name":"max_price_cents","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Max Price Cents"}},{"name":"features","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"title":"Features"}},{"name":"amenities","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"title":"Amenities"}},{"name":"operators","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"maxItems":20,"title":"Operators"}},{"name":"available","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Available"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchAreaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/site/{site_id}":{"get":{"summary":"Public Site","operationId":"public_site_api_v1_search_site__site_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/specialist/resolve":{"post":{"summary":"Resolve Request","operationId":"resolve_request_api_v1_specialist_resolve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpecialistResolveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpecialistResolution"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/specialist/overview":{"post":{"summary":"Overview Request","description":"Every centre in range, each with its closest thing to the request (M6.18).\n\nDeterministic, like `/resolve`, and on purpose not a chat turn: widening the\nradius is a question about the estate, not about what the customer meant,\nso it neither spends one of the conversation's turns nor calls the model.","operationId":"overview_request_api_v1_specialist_overview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpecialistOverviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpecialistOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/specialist/leads":{"post":{"summary":"Create Lead","description":"A cold request from the web, resolved and put in front of a human.\n\nWhatever `interpretation` claims, the numbers are recomputed here. That is\nthe whole of M6.0 in one handler: the model interprets, the invariants decide.","operationId":"create_lead_api_v1_specialist_leads_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/specialist/sites/{site_id}/slots":{"get":{"summary":"Free Slots","operationId":"free_slots_api_v1_specialist_sites__site_id__slots_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SlotOption"},"title":"Response Free Slots Api V1 Specialist Sites  Site Id  Slots Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/specialist/consultations":{"post":{"summary":"Book Consultation","description":"The client books a consultation, not a box.\n\nNo unit is held and no `Booking` row is created — there is a test that counts\nboth at zero. Whether the slot is still free is decided by the partial unique\nindex, never by a check up here.","operationId":"book_consultation_api_v1_specialist_consultations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultationBookRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/specialist/operators/{slug}":{"get":{"summary":"Public Operator","description":"Who the assistant at this address belongs to, and where they are.\n\nPublic and unauthenticated, like the rest of the customer path. It carries\nonly what a customer needs to recognise whose tool they are on and to be told\nhonestly when their city is not one this operator serves — which the page\ncould previously only report as \"nothing of that size\", a different and much\nmore hopeful sentence than the truth.","operationId":"public_operator_api_v1_specialist_operators__slug__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOperator"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/specialist/message":{"post":{"summary":"Message","description":"Free text in, a structured request out — and the numbers from Python.\n\nThe model interprets and the invariants decide, and here that is not a\nconvention a caller has to honour: the prose and the resolution come back as\ntwo separate objects, and the model never sees the inventory that produced\nthe second one.","operationId":"message_api_v1_specialist_message_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpecialistMessageRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpecialistMessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/specialist/guided":{"get":{"summary":"Guided Steps","description":"The questions of the guided start (M6.17), from the server's one copy,\nin the language of the request. The keys are the same in both.","operationId":"guided_steps_api_v1_specialist_guided_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/GuidedStepOut"},"type":"array","title":"Response Guided Steps Api V1 Specialist Guided Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]},"post":{"summary":"Guided","description":"The buttons' answers in, the same answer as a chat turn out (M6.17).\n\nNo model is called, so the daily budget is neither checked nor spent: the\nevent is `specialist_guided`, not `specialist_intake`, which is the row\n`_within_todays_budget` counts. The conversation it opens is an ordinary\none, and the free chat continues on it.","operationId":"guided_api_v1_specialist_guided_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuidedRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpecialistMessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/sites":{"post":{"summary":"Create Site","operationId":"create_site_api_v1_sites_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/sites/mine":{"get":{"summary":"List My Sites","description":"The operator's centres, and after them the centres waiting in an open\nclaim, each with the draft the operator prepared for it (`claim_status`).","operationId":"list_my_sites_api_v1_sites_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SiteResponse"},"type":"array","title":"Response List My Sites Api V1 Sites Mine Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/sites/mine/availability":{"get":{"summary":"List My Availability","description":"What each of the operator's centres declares about its space (0036), for\nthe dashboard. Somebody registered as an operator who has no profile yet\nhas no centre: an empty list, like an operator who has not added one.","operationId":"list_my_availability_api_v1_sites_mine_availability_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SiteAvailabilityResponse"},"type":"array","title":"Response List My Availability Api V1 Sites Mine Availability Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/sites/{site_id}/availability":{"get":{"summary":"Get Availability","operationId":"get_availability_api_v1_sites__site_id__availability_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteAvailabilityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Availability","description":"The operator declares how full the centre is and how much is left of\neach size. The whole declaration every time. On a centre still in a claim\nit is kept as a draft and declared when the claim is approved.","operationId":"put_availability_api_v1_sites__site_id__availability_put","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteAvailabilityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteAvailabilityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}":{"get":{"summary":"Get Site","operationId":"get_site_api_v1_sites__site_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Site","description":"Change what a centre says. Every fact written is recorded as supplied\nby the operator, today.\n\nA new address is applied at once on a centre that has never been public.\nOn one that has, the pin does not move: the answer is **202** with the\nproposal in `address_change`, and an admin decides. Everything else in the\nsame call is written.\n\nOn a centre the operator claimed and an admin has not decided, nothing is\nwritten on the centre: the body is validated and kept as a draft, which\nthe answer shows over the public facts with `draft: true`.","operationId":"patch_site_api_v1_sites__site_id__patch","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/price-points":{"get":{"summary":"Get Price Points","description":"The centre's prices as its editor shows them: the operator's own rows,\nor, while there are none, the ones read on their website. For a centre\nstill in a claim, the draft the operator prepared.","operationId":"get_price_points_api_v1_sites__site_id__price_points_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PricePointOut"},"title":"Response Get Price Points Api V1 Sites  Site Id  Price Points Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Price Points","description":"The operator's whole price list, replacing the one before. It is shown\nin public only while the operator publishes prices (the account's switch).\nA price read on the operator's website stays stored with its source and is\nno longer shown beside these.","operationId":"put_price_points_api_v1_sites__site_id__price_points_put","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricePointsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PricePointOut"},"title":"Response Put Price Points Api V1 Sites  Site Id  Price Points Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/photos":{"get":{"summary":"List Photos","operationId":"list_photos_api_v1_sites__site_id__photos_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PhotoRef"},"title":"Response List Photos Api V1 Sites  Site Id  Photos Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Upload Photo","operationId":"upload_photo_api_v1_sites__site_id__photos_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_photo_api_v1_sites__site_id__photos_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotoRef"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/photos/{photo_id}/file":{"get":{"summary":"Draft Photo File","description":"A photograph as its own operator sees it, drafts included. Private,\nnever cached by anything shared: the public address (`/photos/{id}`) is\nthe one for everybody, and it does not serve a draft.","operationId":"draft_photo_file_api_v1_sites__site_id__photos__photo_id__file_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}},{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Photo Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/signage":{"post":{"summary":"Upload Signage","description":"The photograph of the sign an admin asked for, with the claim's short\ncode in view: proof for one centre of a brand. It is the claim's, like a\ndraft photograph, and unlike one it never becomes a picture of the centre:\nno gallery lists it and it is deleted when the centre is decided. A second\nupload replaces the first.","operationId":"upload_signage_api_v1_sites__site_id__signage_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_signage_api_v1_sites__site_id__signage_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/photos/{photo_id}":{"patch":{"summary":"Patch Photo","operationId":"patch_photo_api_v1_sites__site_id__photos__photo_id__patch","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}},{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Photo Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhotoPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PhotoRef"},"title":"Response Patch Photo Api V1 Sites  Site Id  Photos  Photo Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Photo","operationId":"delete_photo_api_v1_sites__site_id__photos__photo_id__delete","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}},{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Photo Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/publish":{"post":{"summary":"Publish Site","operationId":"publish_site_api_v1_sites__site_id__publish_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/unpublish":{"post":{"summary":"Unpublish Site","operationId":"unpublish_site_api_v1_sites__site_id__unpublish_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/detach":{"post":{"summary":"Detach Site","description":"\"Non lo gestisco più\": the centre leaves this operator. Only the owner\ncan, like the terms: it changes what the business runs. The centre is\nunpublished and goes back to a public-source operator; nothing of it is\ndeleted. Taking it back is a claim, which an admin decides.","operationId":"detach_site_api_v1_sites__site_id__detach_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Detach Site Api V1 Sites  Site Id  Detach Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sites/{site_id}/plans":{"get":{"summary":"List Plans","operationId":"list_plans_api_v1_sites__site_id__plans_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Plans Api V1 Sites  Site Id  Plans Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Plan","operationId":"create_plan_api_v1_sites__site_id__plans_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/photos/{photo_id}":{"get":{"summary":"Get Photo","description":"Deliberately unauthenticated. The SPA sends its JWT through an axios\ninterceptor and a plain `<img src>` cannot carry it; blob fetches or query\ntokens would be complexity for no gain. The id is an unguessable UUID and the\nphotos belong to published sites, consistent with the PRD's \"address privacy\nis a non-goal\". Registered as an accepted pilot risk in the implementation\nplan's hardening checklist (Section 7).","operationId":"get_photo_api_v1_photos__photo_id__get","parameters":[{"name":"photo_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Photo Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plans/{plan_id}":{"get":{"summary":"Get Plan","operationId":"get_plan_api_v1_plans__plan_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/plans/{plan_id}/layout":{"put":{"summary":"Save Layout","operationId":"save_layout_api_v1_plans__plan_id__layout_put","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LayoutSaveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/units/{unit_id}":{"patch":{"summary":"Patch Unit","operationId":"patch_unit_api_v1_units__unit_id__patch","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"unit_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Unit Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bookings/hold":{"post":{"summary":"Create Hold","operationId":"create_hold_api_v1_bookings_hold_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoldRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/bookings/{booking_id}/confirm":{"post":{"summary":"Confirm Booking","operationId":"confirm_booking_api_v1_bookings__booking_id__confirm_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bookings/{booking_id}":{"delete":{"summary":"Cancel Hold","operationId":"cancel_hold_api_v1_bookings__booking_id__delete","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bookings/{booking_id}/notice":{"post":{"summary":"Give Notice","operationId":"give_notice_api_v1_bookings__booking_id__notice_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bookings/mine":{"get":{"summary":"My Bookings","operationId":"my_bookings_api_v1_bookings_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MyBookingItem"},"type":"array","title":"Response My Bookings Api V1 Bookings Mine Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/seller/dashboard":{"get":{"summary":"Dashboard","operationId":"dashboard_api_v1_seller_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dashboard Api V1 Seller Dashboard Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/seller/earnings":{"get":{"summary":"Earnings","description":"What came in, what is owed, and what the current tenants are worth.\n\nThree queries plus one for the months, each grouped in SQL. The ledger does\nnot carry a site, so every figure walks\n`LedgerEntry -> Booking -> Unit -> FloorPlan -> Site` — four joins and one\nGROUP BY, never a query per site. M5.13 closed exactly that N+1 here.","operationId":"earnings_api_v1_seller_earnings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerEarnings"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/seller/ledger":{"get":{"summary":"Ledger","description":"The raw register, paginated.\n\nIt used to return every row the seller had ever earned. That is fine on a\nseed and unbounded on a real site, and the totals it was being read for now\nlive in /earnings — this is the drill-down, not the summary.","operationId":"ledger_api_v1_seller_ledger_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ledger Api V1 Seller Ledger Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/leads":{"get":{"summary":"Inbox","description":"The inbox as it was before M4B: newest first, filtered by the old\nstatus. One row per centre a request went to, read through the same\nservice as `/opportunities`.","operationId":"inbox_api_v1_seller_leads_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"site_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Site Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeadInboxRow"},"title":"Response Inbox Api V1 Seller Leads Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/opportunities":{"get":{"summary":"Opportunity Inbox","description":"The requests customers sent to this operator's centres (M4B, F56):\nunread first by default, or newest, or soonest needed; one centre or all;\nopen or closed. No name, email or phone of a customer the centre has not\nanswered.","operationId":"opportunity_inbox_api_v1_seller_opportunities_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(unread|newest|soonest)$","default":"unread","title":"Sort"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(open|closed)$"},{"type":"null"}],"title":"Scope"}},{"name":"site_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Site Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LeadInboxRow"},"title":"Response Opportunity Inbox Api V1 Seller Opportunities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/activity":{"get":{"summary":"Activity","description":"Received, answered, time to answer, won: this operator's own (F60).","operationId":"activity_api_v1_seller_activity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityOut"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/seller/leads/{lead_id}":{"get":{"summary":"Lead Detail","operationId":"lead_detail_api_v1_seller_leads__lead_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Lead Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Override Lead","description":"The override, and the moment the guardrail becomes visible.\n\nA new class does not simply overwrite a label: the server re-resolves against\nwhat is actually free, using the lead's own coordinates and radius — never\nanything from this body, which must not be able to move the point on the map.\nThe original reading survives untouched.\n\nSince M4B the correction, the note and the centre are this operator's row\nof the request, not the request: another centre that received the same\nrequest reads its own. The status is no longer set here: it follows from\nwhat the centre does (respond, decline, won), and a body that asks for a\ndifferent one answers 409.","operationId":"override_lead_api_v1_seller_leads__lead_id__patch","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Lead Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/opportunities/{recipient_id}":{"get":{"summary":"Opportunity Detail","description":"One request at one of this operator's centres: answers, the area, the\nintent, how many other centres were asked, its own offer and thread. The\ncustomer's name and contact details only once this centre has answered.","operationId":"opportunity_detail_api_v1_seller_opportunities__recipient_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/opportunities/{recipient_id}/respond":{"post":{"summary":"Respond","description":"The centre answers with a price or a range and a message (F57). From\nthis moment it sees the contact details the customer's preference allows.","operationId":"respond_api_v1_seller_opportunities__recipient_id__respond_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/opportunities/{recipient_id}/decline":{"post":{"summary":"Decline","description":"The centre turns the request down, with a reason from the list. The\ncustomer sees the centre as not available, and never the reason.","operationId":"decline_api_v1_seller_opportunities__recipient_id__decline_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpportunityDecline"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/opportunities/{recipient_id}/messages":{"post":{"summary":"Post Message","description":"Write to the customer in the thread of a request this centre answered.","operationId":"post_message_api_v1_seller_opportunities__recipient_id__messages_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadMessageCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/opportunities/{recipient_id}/report":{"post":{"summary":"Report Thread","description":"Flag the thread for an admin (MSG-1).","operationId":"report_thread_api_v1_seller_opportunities__recipient_id__report_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/opportunities/{recipient_id}/won":{"post":{"summary":"Mark Won","description":"The operator records that the customer took this centre (F59). The\nother centres are told the customer chose another one; a request closed\nalready answers 409.","operationId":"mark_won_api_v1_seller_opportunities__recipient_id__won_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/opportunities/{recipient_id}/move-in":{"post":{"summary":"Confirm Move In","description":"The operator says whether the customer of a request it won moved in\n(M6): what the platform counts as a confirmed move-in. Only on the centre\nthe request was closed on (409 `NOT_WON` otherwise), and it can be\ncorrected.","operationId":"confirm_move_in_api_v1_seller_opportunities__recipient_id__move_in_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveInConfirmation"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/leads/{lead_id}/consultation":{"post":{"summary":"Book For Lead","description":"The store manager books a slot of the lead's own centre, and says how the\nappointment will be held.\n\n`book()` decides, exactly as it does for a client: eligibility up here,\navailability in the index. The one difference is the notice — sixty minutes\nprotect the operator from clients, not from themselves.\n\nThe client is told twice: a notification on their account, in the same\ntransaction as the appointment, and the confirmation email after the commit.","operationId":"book_for_lead_api_v1_seller_leads__lead_id__consultation_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Lead Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorBookRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/sites/{site_id}/slots":{"get":{"summary":"Site Slots","operationId":"site_slots_api_v1_seller_sites__site_id__slots_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SellerSlotRow"},"title":"Response Site Slots Api V1 Seller Sites  Site Id  Slots Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Generate Slots","description":"Materialise a weekly pattern. Running it twice creates nothing the second\ntime, so a seller can adjust and re-run without moving anyone's appointment.","operationId":"generate_slots_api_v1_seller_sites__site_id__slots_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlotPatternRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlotGenerationResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/slots/{slot_id}":{"patch":{"summary":"Patch Slot","description":"Closing withdraws a slot from the public list. It never cancels an\nappointment already taken on it — that is a conversation, not a toggle.","operationId":"patch_slot_api_v1_seller_slots__slot_id__patch","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"slot_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Slot Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlotPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SellerSlotRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/consultations/{consultation_id}/confirm":{"post":{"summary":"Confirm Consultation","description":"The operator answers a client's request: yes, and this is how we meet.\n\nOnly a `requested` appointment can be confirmed. The slot does not move — it\nhas been held since the client asked — so there is no race to lose here.","operationId":"confirm_consultation_api_v1_seller_consultations__consultation_id__confirm_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"consultation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Consultation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultationConfirmRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/consultations/{consultation_id}/cancel":{"post":{"summary":"Cancel Consultation","description":"Cancel a requested or a confirmed appointment. Answers the lead, which has\nno live appointment any more, with the receipt of what the client was told.","operationId":"cancel_consultation_api_v1_seller_consultations__consultation_id__cancel_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"consultation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Consultation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/consultations/{consultation_id}":{"patch":{"summary":"Patch Consultation","operationId":"patch_consultation_api_v1_seller_consultations__consultation_id__patch","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"consultation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Consultation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultationPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsultationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/sellers":{"get":{"summary":"List Sellers","operationId":"list_sellers_api_v1_admin_sellers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AdminSellerRow"},"type":"array","title":"Response List Sellers Api V1 Admin Sellers Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/sellers/{seller_id}/verify":{"post":{"summary":"Verify Seller","description":"An admin verified this operator: who they are, and that they may publish\n(M3B). In production this is how an operator becomes verified: there is no\nverification provider yet and no verdict to simulate. Until it is done,\nnothing the operator entered is public.\n\nRefused for an operator who has not accepted the terms: without them there\nis no licence to publish what they supply.","operationId":"verify_seller_api_v1_admin_sellers__seller_id__verify_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"seller_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Seller Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSellerRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/sellers/{seller_id}/kyc":{"post":{"summary":"Deliver Kyc Verdict","description":"Record the outcome of an operator's verification.\n\nLived under `/demo` until M0, as one of the demo panel's controls. It is the\nonly way an operator becomes verified until operator onboarding replaces it\n(M3B), so it moved here when that router was deleted. The verdict still\ntravels as a provider event through the one handler, which is what makes a\nreplay harmless and what a real verification provider will call.","operationId":"deliver_kyc_verdict_api_v1_admin_sellers__seller_id__kyc_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"seller_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Seller Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KycVerdictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deliver Kyc Verdict Api V1 Admin Sellers  Seller Id  Kyc Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/bookings":{"get":{"summary":"List Bookings","operationId":"list_bookings_api_v1_admin_bookings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Bookings Api V1 Admin Bookings Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/gmv":{"get":{"summary":"Gmv","operationId":"gmv_api_v1_admin_gmv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Gmv Api V1 Admin Gmv Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/metrics":{"get":{"summary":"Platform Metrics","operationId":"platform_metrics_api_v1_admin_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Platform Metrics Api V1 Admin Metrics Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/sellers-tree":{"get":{"summary":"Sellers Tree","operationId":"sellers_tree_api_v1_admin_sellers_tree_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Sellers Tree Api V1 Admin Sellers Tree Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/bookings/{booking_id}/close":{"post":{"summary":"Close Delinquent Booking","description":"Evict a defaulting tenant: `delinquent` -> `vacated` (M5.19).\n\nUntil now `delinquent` was a state with no way out. The machine defined\n(\"delinquent\", \"admin_close\") -> vacated and *nothing called it* — there was\nno admin route for booking state at all. Meanwhile `delinquent` is in\n`_BILLABLE`, so the ticker kept minting monthly cycles for a tenant who had\nstopped paying, and it is in `BLOCKING_STATES`, so the unit stayed off the\nmarket for ever. `_terminate_ended` could not help either: it only matches\n`notice_given` and `active`.\n\nDeliberately admin-only and deliberately narrow. Closing a booking releases\na unit somebody may still have possessions in, so it is an operator decision\nwith a real-world step attached, not something to automate on a timer.","operationId":"close_delinquent_booking_api_v1_admin_bookings__booking_id__close_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"booking_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Booking Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Close Delinquent Booking Api V1 Admin Bookings  Booking Id  Close Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/impersonate/{user_id}":{"post":{"summary":"Impersonate","operationId":"impersonate_api_v1_admin_impersonate__user_id__post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Impersonate Api V1 Admin Impersonate  User Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/requests":{"post":{"summary":"Enter Request","description":"A request taken on the phone from a real person, typed by an admin\n(M4A, F54; DEMAND-1).\n\nIt is stored with the admin's id and stays `pending_verification`: no\noperator is told and it counts in no demand figure. A confirmation goes to\nthe person's own address, and the request is distributed only when they\nenter the code from that email. The audit event names the admin and the\ncentre, and nothing of the person.","operationId":"enter_request_api_v1_admin_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRequestCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/proof-pack":{"get":{"summary":"Proof Pack View","description":"The proof pack (M4B, M6): coverage, requests and where they came from,\nhow they were answered, won and confirmed as move-ins, and what demand\nwent unmet, overall, by city, by operator and by centre. `city` is a\ncity's slug, `operator` an operator's id. JSON for a screen: there is no\nexport (CSV-1). Counts and keys only: no customer's name or contact\ndetails. Only requests a person confirmed (`services/proof_pack.py`).","operationId":"proof_pack_view_api_v1_admin_proof_pack_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},{"name":"operator","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Operator"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProofPack"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/funnel":{"get":{"summary":"Funnel View","description":"How far visitors get in the request wizard (M6, F61): the share that\nreached each screen and where the others left, for the days from `since`\nto `until`, both included. The last seven days when neither is given, so\nany week can be read by naming its Monday and its Sunday. Platform days.","operationId":"funnel_view_api_v1_admin_funnel_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Until"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunnelReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/threads/reported":{"get":{"summary":"Reported Threads","description":"The threads a customer or an operator flagged, the latest report first.","operationId":"reported_threads_api_v1_admin_threads_reported_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ReportedThread"},"type":"array","title":"Response Reported Threads Api V1 Admin Threads Reported Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/threads/{recipient_id}":{"get":{"summary":"Read Thread","description":"What was written in a thread, for the admin who judges a report.","operationId":"read_thread_api_v1_admin_threads__recipient_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminThread"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/threads/{recipient_id}/close":{"post":{"summary":"Close Thread","description":"Close a thread: neither side writes in it again (MSG-1). Audited.","operationId":"close_thread_api_v1_admin_threads__recipient_id__close_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"recipient_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Recipient Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminThread"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/operator-signup/steps":{"get":{"summary":"Steps","operationId":"steps_api_v1_operator_signup_steps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SignupStep"},"type":"array","title":"Response Steps Api V1 Operator Signup Steps Get"}}}}}}},"/api/v1/operator-signup/steps/{step}":{"post":{"summary":"Validate Step","description":"Check one step with the answers so far. Stores nothing. The identity\nstep also says whether the business looks already listed, and the centres\nstep whether a centre added by hand is; the email step says nothing about\nthe address.","operationId":"validate_step_api_v1_operator_signup_steps__step__post","parameters":[{"name":"step","in":"path","required":true,"schema":{"type":"string","title":"Step"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupAnswers"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupStepResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/operator-signup/request-context":{"post":{"summary":"Request Context","description":"How many requests are waiting for the centre a notice was sent about.\nThe token arrives in the body: an address is logged. It names no customer\nand returns none: a count and the centre the link already names.","operationId":"request_context_api_v1_operator_signup_request_context_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestContextIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestContextOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/operator-signup/complete":{"post":{"summary":"Complete Signup","operationId":"complete_signup_api_v1_operator_signup_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupAnswers"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/operator-signup/upgrade":{"post":{"summary":"Upgrade Account","description":"Somebody signed in finishes the sign-up: their account becomes an\noperator's, with what it already had, and the centres they ticked are\nclaimed in the same call.","operationId":"upgrade_account_api_v1_operator_signup_upgrade_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupAnswers"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupUpgraded"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/listings/terms":{"get":{"summary":"Terms","description":"The operator terms in force, in the reader's language. `version` asks\nfor the one announced and not yet in force, so that it can be read before\nit is accepted; any other name gets the one in force.","operationId":"terms_api_v1_listings_terms_get","parameters":[{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorTermsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/listings/preview":{"post":{"summary":"Preview","operationId":"preview_api_v1_listings_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingPreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/listings/confirm":{"post":{"summary":"Confirm","description":"The five-minute form: the operator confirms the facts shown, may give a\nsize range, a price or a range and the hours, and accepts the terms. The\nlisting moves to rung 1 and may go online today.","operationId":"confirm_api_v1_listings_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingConfirmRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingPreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/listings/find":{"get":{"summary":"Find","description":"\"Is my centre already listed?\" (10 October 2026): the listed centres\nwhose name, operator, address or town carry every word asked for. A name,\nan address, or some of each.\n\nIt answers with what the centre's public page says and no more, for\ncentres that are public and no others. The words are bound parameters of a\n`LIKE`, with its two wildcards escaped: nothing typed here is read as SQL\nor as a pattern.","operationId":"find_api_v1_listings_find_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":120,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ListedCentre"},"title":"Response Find Api V1 Listings Find Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/listings/find-siblings/{site_id}":{"get":{"summary":"Find Siblings","description":"The centre \"Gestisci questa scheda\" was pressed on, and the other\ncentres of the same public-source operator: what the sign-up ticks to\nstart with.\n\nFor a centre nobody manages that is public, or whose operator has been\ntold about it; anything else is a 404, a managed centre included. It\nanswers with what the pages say: names, addresses, and the domain of the\noperator's website. Nothing else of `seller_profiles` leaves here.","operationId":"find_siblings_api_v1_listings_find_siblings__site_id__get","parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingSiblings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/listings/requests":{"post":{"summary":"Create Request","operationId":"create_request_api_v1_listings_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingRequestCreate"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingRequestAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/listings/claims":{"post":{"summary":"Create Claim","description":"Say that some centres are yours. Nothing changes until an admin\ndecides. One claim per public-source operator the centres sit under.","operationId":"create_claim_api_v1_listings_claims_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingClaimCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ListingClaimOut"},"type":"array","title":"Response Create Claim Api V1 Listings Claims Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/listings/claims/mine":{"get":{"summary":"My Claims","operationId":"my_claims_api_v1_listings_claims_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ListingClaimOut"},"type":"array","title":"Response My Claims Api V1 Listings Claims Mine Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/listings/claims/{claim_id}":{"delete":{"summary":"Withdraw Claim","description":"The claimant takes an open claim back. Anybody else's claim does not\nexist for them.","operationId":"withdraw_claim_api_v1_listings_claims__claim_id__delete","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/import/template":{"get":{"summary":"Import Template","description":"The empty workbook, as the repository holds it. One of the two things\nthis application lets anyone download.","operationId":"import_template_api_v1_admin_import_template_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/import":{"post":{"summary":"Import Workbook","description":"Read a workbook and say what it would do (`dry_run`, the default) or do\nit. `override` lets one row through the company-channels rule; it is named\nin the audit event.","operationId":"import_workbook_api_v1_admin_import_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"filename","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"title":"Filename"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"override","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"title":"Override"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRunDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/import/runs":{"get":{"summary":"Import Runs","operationId":"import_runs_api_v1_admin_import_runs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ImportRunRow"},"type":"array","title":"Response Import Runs Api V1 Admin Import Runs Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/import/runs/{run_id}":{"get":{"summary":"Import Run","operationId":"import_run_api_v1_admin_import_runs__run_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRunDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/listings":{"get":{"summary":"Listings","description":"Every operator with its centres: rung, what is online, how old the\noldest fact is, and the last contact.","operationId":"listings_api_v1_admin_listings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AdminListingOperator"},"type":"array","title":"Response Listings Api V1 Admin Listings Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/listings/operators":{"post":{"summary":"Create Operator","description":"List an operator from public facts: no login, no page yet.","operationId":"create_operator_api_v1_admin_listings_operators_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminOperatorWrite"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Operator Api V1 Admin Listings Operators Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/listings/operators/{seller_id}":{"patch":{"summary":"Edit Operator","operationId":"edit_operator_api_v1_admin_listings_operators__seller_id__patch","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"seller_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Seller Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminOperatorWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Edit Operator Api V1 Admin Listings Operators  Seller Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/listings/operators/{seller_id}/sites":{"post":{"summary":"Create Listing Site","description":"A centre of an operator listed from public facts: unpublished, rung 0,\nevery fact with the page it was read on and the day.","operationId":"create_listing_site_api_v1_admin_listings_operators__seller_id__sites_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"seller_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Seller Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSiteWrite"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Listing Site Api V1 Admin Listings Operators  Seller Id  Sites Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/listings/sites/{site_id}":{"patch":{"summary":"Edit Listing Site","description":"Correct the facts of a centre an operator does not manage: everything a\nworkbook row says about it. A new address is looked up again and the old\npublic address keeps answering with a redirect. The details (hours,\namenities, sizes, district) are left alone by a request that names none.","operationId":"edit_listing_site_api_v1_admin_listings_sites__site_id__patch","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSiteWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Edit Listing Site Api V1 Admin Listings Sites  Site Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/listings/sites/{site_id}/prices":{"get":{"summary":"Listing Site Prices","description":"The centre's price list as it is stored, with the source of its newest\nrow to start the form from.","operationId":"listing_site_prices_api_v1_admin_listings_sites__site_id__prices_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPricePoints"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Edit Listing Site Prices","description":"The whole price list of a centre nobody manages, replacing the one\nbefore, as the import replaces it: one source and one day for the list.\nWhether a price is shown stays the operator's `publishes_public_prices`.","operationId":"edit_listing_site_prices_api_v1_admin_listings_sites__site_id__prices_put","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPricePointsWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPricePoints"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/prenotify":{"post":{"summary":"Prenotify Operators","description":"Tell operators their page is about to go online, or (`dry_run`, the\ndefault) say who would be told. A batch above the cap is refused whole.","operationId":"prenotify_operators_api_v1_admin_prenotify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrenotifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrenotifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/listings/operators/{seller_id}/confirmed-by-phone":{"post":{"summary":"Confirmed By Phone","description":"The operator said on the phone that the page may go online. Recorded\nwith the admin who took the call; the page goes online today.","operationId":"confirmed_by_phone_api_v1_admin_listings_operators__seller_id__confirmed_by_phone_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"seller_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Seller Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Confirmed By Phone Api V1 Admin Listings Operators  Seller Id  Confirmed By Phone Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/listings/operators/{seller_id}/remove":{"post":{"summary":"Remove Operator","description":"The operator does not want to be on the platform: its centres go\noffline now and nothing notifies or publishes them again. The operator and\nits centres stay here, with the contact that says why, for the day it is\nasked again. One with an account is suspended on the desk instead.","operationId":"remove_operator_api_v1_admin_listings_operators__seller_id__remove_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"seller_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Seller Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorRemovalRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Operator Api V1 Admin Listings Operators  Seller Id  Remove Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/listings/operators/{seller_id}/restore":{"post":{"summary":"Restore Operator","description":"It changed its mind. Nothing goes online by this: the notice, or a\nconfirmation by phone, does that, as for any operator in the list.","operationId":"restore_operator_api_v1_admin_listings_operators__seller_id__restore_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"seller_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Seller Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorRestoreRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Restore Operator Api V1 Admin Listings Operators  Seller Id  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline":{"get":{"summary":"Pipeline","description":"Where every operator stands, as counts: the overview's numbers.","operationId":"pipeline_api_v1_admin_pipeline_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorPipeline"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/request-reads":{"get":{"summary":"Request Read Report","description":"Requests opened per operator and calendar month, the last few months:\nhow many operators would pass the free quota (Pro features, task 10).\nRead-only.","operationId":"request_read_report_api_v1_admin_request_reads_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestReadReport"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/demand":{"get":{"summary":"Demand","description":"Requests by the way they came in, and how far conversations with the\nassistant get before somebody leaves (13 October 2026). Counts only.","operationId":"demand_api_v1_admin_demand_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemandOverview"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/claims":{"get":{"summary":"Claims","operationId":"claims_api_v1_admin_claims_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminClaimRow"},"title":"Response Claims Api V1 Admin Claims Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/claims/{claim_id}/callback":{"post":{"summary":"Claim Callback","operationId":"claim_callback_api_v1_admin_claims__claim_id__callback_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimCallbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminClaimRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/claims/{claim_id}/decision":{"post":{"summary":"Claim Decision","description":"Approve or reject, centre by centre. An approved centre moves to the\nclaimant's operator, in one transaction, and an approval is refused without\na matching domain, a recorded call back or a verified proof. Whoever is\nturned down is given a reason.","operationId":"claim_decision_api_v1_admin_claims__claim_id__decision_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimDecisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminClaimRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/sites/{site_id}/address-change":{"post":{"summary":"Decide Address Change","description":"Answer a new address an operator asked for on a centre that has been\npublic. Approved, the centre moves and its old public address redirects;\nrefused, nothing moves and the operator is told.","operationId":"decide_address_change_api_v1_admin_sites__site_id__address_change_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressChangeDecision"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Decide Address Change Api V1 Admin Sites  Site Id  Address Change Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/listing-requests":{"get":{"summary":"Listing Requests","operationId":"listing_requests_api_v1_admin_listing_requests_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminListingRequestRow"},"title":"Response Listing Requests Api V1 Admin Listing Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/listing-requests/{request_id}/close":{"post":{"summary":"Close Listing Request","operationId":"close_listing_request_api_v1_admin_listing_requests__request_id__close_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingRequestCloseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Close Listing Request Api V1 Admin Listing Requests  Request Id  Close Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/requests/lookup":{"get":{"summary":"Find Request","description":"The request a customer quotes by its number, held or not: the list of\nheld requests does not carry the ones a centre already has. A list, because\neight characters of an id are not promised to be one request's alone.","operationId":"find_request_api_v1_admin_requests_lookup_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"reference","in":"query","required":true,"schema":{"type":"string","title":"Reference"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminRequestFound"},"title":"Response Find Request Api V1 Admin Requests Lookup Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/held-requests":{"get":{"summary":"List Held Requests","operationId":"list_held_requests_api_v1_admin_held_requests_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminHeldRequestRow"},"title":"Response List Held Requests Api V1 Admin Held Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/held-requests/{held_id}/notice":{"post":{"summary":"Send Held Notice","description":"\"Invia l'avviso\": tell the operator a request is waiting. For a\nbusiness the team has reached by phone and whose company mailbox is on\nfile. Without a recorded call it is refused, unless the admin writes why\nit goes anyway, which is audited. One notice per held request.","operationId":"send_held_notice_api_v1_admin_held_requests__held_id__notice_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"held_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Held Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeldNoticeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Send Held Notice Api V1 Admin Held Requests  Held Id  Notice Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/held-requests/{held_id}":{"patch":{"summary":"Update Held Request","description":"Follow a held request. Forwarding puts the lead in the operator's inbox,\nand is refused until that operator manages their listing: before that there\nis nobody who agreed to receive it.","operationId":"update_held_request_api_v1_admin_held_requests__held_id__patch","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"held_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Held Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeldRequestUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Held Request Api V1 Admin Held Requests  Held Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/outreach":{"get":{"summary":"Outreach","operationId":"outreach_api_v1_admin_outreach_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"seller_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Seller Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OutreachContactOut"},"title":"Response Outreach Api V1 Admin Outreach Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Record Outreach","operationId":"record_outreach_api_v1_admin_outreach_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachContactWrite"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachContactOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/queue":{"get":{"summary":"Queue","description":"Operators with something to decide. `filter`: `open` (the default),\n`needs_call` (a claim with nothing to approve it on yet), `waiting_operator`\n(a claim sent back with a question), `auto_approved`, `decided`, and `all`:\nevery operator with an account, by name.","operationId":"queue_api_v1_admin_verification_queue_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VerificationQueueRow"},"title":"Response Queue Api V1 Admin Verification Queue Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/operators/{operator_id}":{"get":{"summary":"Operator Detail","description":"The operator's row and what the detail page shows: who the business\nsays it is, its centres, its claims decided and waiting, its team, the\nterms it accepted and the history of the checks run on it.","operationId":"operator_detail_api_v1_admin_verification_operators__operator_id__get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Operator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationOperatorDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/operators/{operator_id}/decision":{"post":{"summary":"Operator Decision","description":"Approve the operator, or turn it down with a reason. A rejection closes\nits open claims with the same reason and takes its centres offline; the\noperator reads the reason on the status card and in one email.","operationId":"operator_decision_api_v1_admin_verification_operators__operator_id__decision_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Operator Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorDecisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationOperatorDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/auto-approvals":{"get":{"summary":"Auto Approvals","description":"The approvals the system gave to verified operators adding centres of\ntheir own business, for the days an admin may still undo them. The list\nthat stands in for an admin's eyes on those approvals.","operationId":"auto_approvals_api_v1_admin_verification_auto_approvals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AutoApprovalRow"},"type":"array","title":"Response Auto Approvals Api V1 Admin Verification Auto Approvals Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/verification/claims/{claim_id}/revert":{"post":{"summary":"Revert Auto Approval","description":"Undo an automatic approval, within its review days: the centres go\nback to the operator they were listed under, unpublished. 409\n`REVIEW_WINDOW_CLOSED` after that: the remedy then is a suspension.","operationId":"revert_auto_approval_api_v1_admin_verification_claims__claim_id__revert_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoApprovalRevertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminClaimRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/suspension-reasons":{"get":{"summary":"Suspension Reasons","description":"The grounds the terms list for a suspension, each with the opening of\na statement of reasons for the admin to complete.","operationId":"suspension_reasons_api_v1_admin_verification_suspension_reasons_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SuspensionReason"},"type":"array","title":"Response Suspension Reasons Api V1 Admin Verification Suspension Reasons Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/admin/verification/operators/{operator_id}/suspend":{"post":{"summary":"Suspend Operator","description":"Suspend the operator with a statement of reasons. Its centres go\noffline, new requests for them are held, its inbox becomes read-only, and\nit is told why in an email and on its status card. The one way an admin\ntakes an operator offline.","operationId":"suspend_operator_api_v1_admin_verification_operators__operator_id__suspend_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Operator Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorSuspendRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationOperatorDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/operators/{operator_id}/reinstate":{"post":{"summary":"Reinstate Operator","description":"Lift a suspension. Nothing is put back online: the operator publishes.\nThe requests held meanwhile are forwarded.","operationId":"reinstate_operator_api_v1_admin_verification_operators__operator_id__reinstate_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Operator Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorReinstateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationOperatorDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/operators/{operator_id}/correction-request":{"post":{"summary":"Ask Correction","description":"\"Chiedi una correzione\": the operator is asked to give again the facts\nnamed, with a note it reads, and answers from its own workspace (0046).","operationId":"ask_correction_api_v1_admin_verification_operators__operator_id__correction_request_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Operator Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorCorrectionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationOperatorDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/operators/{operator_id}/vat-transfer":{"post":{"summary":"Transfer Vat","description":"The VAT number this operator typed is on another account, which was\nturned down or suspended: the number moves here (0046).","operationId":"transfer_vat_api_v1_admin_verification_operators__operator_id__vat_transfer_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Operator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationOperatorDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/operators/{operator_id}/owner-email":{"post":{"summary":"Change Owner Email","description":"The owner never confirmed the address they typed: the link to choose a\npassword goes to another one, or again to the same (0046). Refused once\nthe address is confirmed.","operationId":"change_owner_email_api_v1_admin_verification_operators__operator_id__owner_email_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Operator Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorOwnerEmailRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationOperatorDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/operators/{operator_id}/vat-check":{"post":{"summary":"Operator Vat Check","description":"Ask the register about the operator's partita IVA again. The same\ncheck the tick runs for a new operator, with the admin as its actor; a\nregister that does not answer is `error` on the row, not an error here.","operationId":"operator_vat_check_api_v1_admin_verification_operators__operator_id__vat_check_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Operator Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationOperatorDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/operators/{operator_id}/pec":{"post":{"summary":"Record Operator Pec","description":"Write down the business's PEC as read in the INI-PEC register. The\naddress is typed by an admin from the register, never taken from what the\noperator said: it is where the proof goes.","operationId":"record_operator_pec_api_v1_admin_verification_operators__operator_id__pec_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Operator Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperatorPecRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationOperatorDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/claims/{claim_id}/send-code":{"post":{"summary":"Send Proof Code","description":"Send the claim's code: to the PEC recorded for the claimant's business,\nor again to the claimant's own address when it is at the centre's domain.\nAny code sent before stops working.","operationId":"send_proof_code_api_v1_admin_verification_claims__claim_id__send_code_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimSendCodeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminClaimRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/claims/{claim_id}/use-callback":{"post":{"summary":"Use Callback","description":"\"Passa a call-back\": no code for this claim, a call to the number the\ncentre publishes. What the operator's own \"chiamatemi\" does.","operationId":"use_callback_api_v1_admin_verification_claims__claim_id__use_callback_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminClaimRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/claims/{claim_id}/sites/{site_id}/proof-required":{"post":{"summary":"Ask For Signage","description":"\"Richiedi foto insegna\": ask the claimant for a photograph of this\ncentre's sign with the claim's short code in view. The proof for one\ncentre of a brand; the admin's own decision on the centre is the review.","operationId":"ask_for_signage_api_v1_admin_verification_claims__claim_id__sites__site_id__proof_required_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimSiteProofRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminClaimRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/claims/{claim_id}/sites/{site_id}/signage":{"get":{"summary":"Signage File","description":"The photograph of the sign, for the admin who decides. Private: it is\nin no gallery and at no public address.","operationId":"signage_file_api_v1_admin_verification_claims__claim_id__sites__site_id__signage_get","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}},{"name":"site_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Site Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/verification/claims/{claim_id}/more-info":{"post":{"summary":"Claim More Info","description":"\"Chiedi altre informazioni\": the claim goes back to its operator with a\nquestion, and waits. The note is sent to them as written.","operationId":"claim_more_info_api_v1_admin_verification_claims__claim_id__more_info_post","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimMoreInfoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminClaimRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/terms/versions":{"get":{"summary":"List Versions","description":"Every version, newest first, and last the draft they replaced.","operationId":"list_versions_api_v1_admin_terms_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TermsVersionOut"},"type":"array","title":"Response List Versions Api V1 Admin Terms Versions Get"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]},"post":{"summary":"Publish Version","description":"Publish a version and tell every operator. 409 `NOTICE_TOO_SHORT` when\nit would take effect in under fifteen days.","operationId":"publish_version_api_v1_admin_terms_versions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TermsVersionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TermsPublished"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/seller/team":{"get":{"summary":"Team","operationId":"team_api_v1_seller_team_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamResponse"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/seller/team/invitations":{"post":{"summary":"Invite Member","description":"Invite an address. The answer is the same whether or not the address\nalready has an account: that is settled by whoever opens the link.","operationId":"invite_member_api_v1_seller_team_invitations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}]}},"/api/v1/seller/team/invitations/{invitation_id}":{"delete":{"summary":"Revoke Invitation","operationId":"revoke_invitation_api_v1_seller_team_invitations__invitation_id__delete","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seller/team/members/{member_id}":{"delete":{"summary":"Remove Member","description":"Remove a member. Their sessions end in this transaction, and their next\nrequest is refused whatever token it carries.","operationId":"remove_member_api_v1_seller_team_members__member_id__delete","security":[{"APIKeyHeader":[]},{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/email-events":{"post":{"summary":"Email Events","operationId":"email_events_api_v1_email_events_post","parameters":[{"name":"x-email-events-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Email-Events-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Email Events Api V1 Email Events Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AcceptedResponse":{"properties":{"status":{"type":"string","const":"accepted","title":"Status","default":"accepted"}},"type":"object","title":"AcceptedResponse","description":"The one answer of every endpoint that takes an email address and may or\nmay not send to it: identical whether the address has an account or not."},"ActivityOut":{"properties":{"received":{"type":"integer","title":"Received"},"answered":{"type":"integer","title":"Answered"},"declined":{"type":"integer","title":"Declined"},"waiting":{"type":"integer","title":"Waiting"},"won":{"type":"integer","title":"Won"},"moved_in":{"type":"integer","title":"Moved In","default":0},"median_minutes_to_answer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Median Minutes To Answer"}},"type":"object","required":["received","answered","declined","waiting","won","median_minutes_to_answer"],"title":"ActivityOut","description":"An operator's own numbers on the requests it received (F60)."},"AddressChange":{"properties":{"address_line":{"type":"string","title":"Address Line"},"city":{"type":"string","title":"City"},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postcode"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"}},"type":"object","required":["address_line","city","lat","lng","requested_at"],"title":"AddressChange","description":"A new address waiting for an admin, as the operator's page and the\nadmin's read it."},"AddressChangeDecision":{"properties":{"approve":{"type":"boolean","title":"Approve"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["approve"],"title":"AddressChangeDecision"},"AdminClaimRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"operator_id":{"type":"string","format":"uuid","title":"Operator Id"},"operator_name":{"type":"string","title":"Operator Name"},"source_operator_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Source Operator Id"},"source_operator_name":{"type":"string","title":"Source Operator Name"},"operator_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator Website"},"published_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published Phone"},"evidence_email":{"type":"string","title":"Evidence Email"},"email_verified":{"type":"boolean","title":"Email Verified"},"domain_match":{"type":"boolean","title":"Domain Match"},"status":{"type":"string","title":"Status"},"proof_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proof Method"},"proof_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Proof Verified At"},"proof_state":{"type":"string","title":"Proof State","default":"none"},"proof_sent_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proof Sent To"},"proof_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Proof Sent At"},"proof_attempts":{"type":"integer","title":"Proof Attempts","default":0},"callback_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Callback At"},"callback_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Callback Note"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"decision_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Note"},"sites":{"items":{"$ref":"#/components/schemas/AdminClaimSiteRow"},"type":"array","title":"Sites"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Decided At"}},"type":"object","required":["id","operator_id","operator_name","source_operator_id","source_operator_name","operator_website","published_phone","evidence_email","email_verified","domain_match","status","proof_method","proof_verified_at","callback_at","callback_note","reason_code","decision_note","sites","created_at","decided_at"],"title":"AdminClaimRow"},"AdminClaimSiteRow":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"status":{"type":"string","title":"Status"},"other_open_claims":{"type":"integer","title":"Other Open Claims"},"proof_required":{"type":"boolean","title":"Proof Required"},"has_signage":{"type":"boolean","title":"Has Signage","default":false}},"type":"object","required":["site_id","name","city","status","other_open_claims","proof_required"],"title":"AdminClaimSiteRow"},"AdminHeldRequestRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"site_name":{"type":"string","title":"Site Name"},"operator_name":{"type":"string","title":"Operator Name"},"operator_takes_requests":{"type":"boolean","title":"Operator Takes Requests"},"lead_id":{"type":"string","format":"uuid","title":"Lead Id"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"status":{"type":"string","title":"Status"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"entered_by_admin":{"type":"boolean","title":"Entered By Admin","default":false},"also_held_for":{"items":{"type":"string"},"type":"array","title":"Also Held For"},"operator_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Operator Id"},"needs_call":{"type":"boolean","title":"Needs Call","default":false},"call_recorded":{"type":"boolean","title":"Call Recorded","default":false},"has_company_email":{"type":"boolean","title":"Has Company Email","default":false},"operator_notified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Operator Notified At"},"notification_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Channel"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"days_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Left"}},"type":"object","required":["id","site_id","site_name","operator_name","operator_takes_requests","lead_id","size_class_m2","contact_name","contact_email","contact_phone","status","note","created_at"],"title":"AdminHeldRequestRow"},"AdminListingOperator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"business_name":{"type":"string","title":"Business Name"},"slug":{"type":"string","title":"Slug"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"company_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Email"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"},"company_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Phone"},"publishes_public_prices":{"type":"boolean","title":"Publishes Public Prices"},"legal_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Form"},"vat_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Number"},"hq_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hq Address"},"hq_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hq City"},"manages_listing":{"type":"boolean","title":"Manages Listing"},"import_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Import Key"},"kyc_state":{"type":"string","title":"Kyc State"},"admin_approved":{"type":"boolean","title":"Admin Approved"},"terms_accepted":{"type":"boolean","title":"Terms Accepted"},"opted_out":{"type":"boolean","title":"Opted Out"},"removed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Removed At"},"removal_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Removal Kind"},"missing":{"items":{"type":"string"},"type":"array","title":"Missing"},"last_contact_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Last Contact On"},"last_contact_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Contact Outcome"},"stage":{"type":"string","title":"Stage"},"sites":{"items":{"$ref":"#/components/schemas/AdminListingSite"},"type":"array","title":"Sites"}},"type":"object","required":["id","business_name","slug","website","company_email","legal_name","company_phone","publishes_public_prices","manages_listing","import_key","kyc_state","admin_approved","terms_accepted","opted_out","missing","last_contact_on","last_contact_outcome","stage","sites"],"title":"AdminListingOperator"},"AdminListingRequestRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"site_name":{"type":"string","title":"Site Name"},"operator_name":{"type":"string","title":"Operator Name"},"kind":{"type":"string","title":"Kind"},"requester_email":{"type":"string","title":"Requester Email"},"requester_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requester Phone"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"status":{"type":"string","title":"Status"},"due_on":{"type":"string","format":"date","title":"Due On"},"overdue":{"type":"boolean","title":"Overdue"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"closed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closed At"}},"type":"object","required":["id","site_id","site_name","operator_name","kind","requester_email","requester_phone","body","status","due_on","overdue","created_at","closed_at"],"title":"AdminListingRequestRow"},"AdminListingSite":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"address_line":{"type":"string","title":"Address Line"},"public_path":{"type":"string","title":"Public Path"},"listing_rung":{"type":"integer","title":"Listing Rung"},"published":{"type":"boolean","title":"Published"},"prenotified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Prenotified At"},"public_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Public From"},"oldest_checked_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Oldest Checked On"},"import_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Import Key"},"category":{"type":"string","title":"Category"},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postcode"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Kind"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"checked_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Checked On"},"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"opening_soon":{"type":"boolean","title":"Opening Soon","default":false},"opening_hours":{"anyOf":[{"$ref":"#/components/schemas/OpeningHours"},{"type":"null"}]},"hours_source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hours Source Url"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"},"declared_min_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Min M2"},"declared_max_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Max M2"},"price_unit":{"type":"string","title":"Price Unit","default":"m2"},"min_term_months":{"type":"integer","title":"Min Term Months","default":1},"price_count":{"type":"integer","title":"Price Count","default":0},"address_change":{"anyOf":[{"$ref":"#/components/schemas/AddressChange"},{"type":"null"}]}},"type":"object","required":["id","name","city","address_line","public_path","listing_rung","published","prenotified_at","public_from","oldest_checked_on","import_key","category","postcode","province","phone","website","source_kind","source_url","checked_on"],"title":"AdminListingSite"},"AdminOperatorWrite":{"properties":{"brand_name":{"type":"string","maxLength":200,"minLength":1,"title":"Brand Name"},"website":{"type":"string","maxLength":500,"pattern":"^https://[^\\s/]+\\.[^\\s]+$","title":"Website"},"legal_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Legal Name"},"company_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Company Email"},"company_phone":{"anyOf":[{"type":"string","pattern":"^\\+?[0-9][0-9 ./-]{4,24}$"},{"type":"null"}],"title":"Company Phone"},"publishes_public_prices":{"type":"boolean","title":"Publishes Public Prices","default":false},"legal_form":{"anyOf":[{"type":"string","enum":["srl","srls","spa","sas","snc","cooperativa","ditta_individuale","other","unknown"]},{"type":"null"}],"title":"Legal Form"},"vat_number":{"anyOf":[{"type":"string","pattern":"^\\d{11}$"},{"type":"null"}],"title":"Vat Number"},"hq_address":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Hq Address"},"hq_city":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Hq City"}},"type":"object","required":["brand_name","website"],"title":"AdminOperatorWrite","description":"An operator listed from public facts. Company channels only; a web\naddress is stored and linked, never requested (SSRF-1)."},"AdminPricePointRow":{"properties":{"size_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size Label"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"volume_m3":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume M3"},"price_from_cents":{"type":"integer","title":"Price From Cents"},"price_to_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price To Cents"},"price_period":{"type":"string","title":"Price Period"},"price_basis":{"type":"string","title":"Price Basis"},"vat_included":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Vat Included"},"insurance_included":{"type":"string","title":"Insurance Included"},"is_promotion":{"type":"boolean","title":"Is Promotion"},"promotion_terms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promotion Terms"}},"type":"object","required":["size_label","area_m2","volume_m3","price_from_cents","price_to_cents","price_period","price_basis","vat_included","insurance_included","is_promotion","promotion_terms"],"title":"AdminPricePointRow","description":"A stored price as the form shows it. Not `PricePointIn`: a row a workbook\nbrought in may say less than the form asks for, and is still shown."},"AdminPricePoints":{"properties":{"points":{"items":{"$ref":"#/components/schemas/AdminPricePointRow"},"type":"array","title":"Points"},"source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Kind"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"checked_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Checked On"}},"type":"object","required":["points","source_kind","source_url","checked_on"],"title":"AdminPricePoints"},"AdminPricePointsWrite":{"properties":{"points":{"items":{"$ref":"#/components/schemas/PricePointIn"},"type":"array","maxItems":40,"title":"Points"},"source_kind":{"type":"string","enum":["operator_site","operator_supplied","business_register"],"title":"Source Kind"},"source_url":{"anyOf":[{"type":"string","maxLength":500,"pattern":"^https://[^\\s/]+\\.[^\\s]+$"},{"type":"null"}],"title":"Source Url"},"checked_on":{"type":"string","format":"date","title":"Checked On"}},"type":"object","required":["points","source_kind","checked_on"],"title":"AdminPricePointsWrite","description":"The whole price list of a centre nobody manages, as an admin read it:\none page and one day for the list. A row left out is a price no longer\nlisted."},"AdminRequestCentre":{"properties":{"site_name":{"type":"string","title":"Site Name"},"operator_name":{"type":"string","title":"Operator Name"},"operator_id":{"type":"string","format":"uuid","title":"Operator Id"},"state":{"type":"string","title":"State"}},"type":"object","required":["site_name","operator_name","operator_id","state"],"title":"AdminRequestCentre"},"AdminRequestCreate":{"properties":{"category":{"type":"string","maxLength":40,"title":"Category"},"answers":{"items":{"$ref":"#/components/schemas/AnswerIn"},"type":"array","maxItems":40,"title":"Answers"},"details":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Details"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"contact_name":{"type":"string","maxLength":120,"minLength":2,"title":"Contact Name"},"contact_email":{"type":"string","format":"email","title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string","pattern":"^\\+?[0-9][0-9 ./-]{4,24}$"},{"type":"null"}],"title":"Contact Phone"},"contact_preference":{"type":"string","enum":["call","message_only"],"title":"Contact Preference"}},"additionalProperties":false,"type":"object","required":["category","answers","site_id","contact_name","contact_email","contact_preference"],"title":"AdminRequestCreate","description":"A request an admin types for a real person on the phone (DEMAND-1). It\nis flagged, and distributed only when that person confirms from the email."},"AdminRequestFound":{"properties":{"lead_id":{"type":"string","format":"uuid","title":"Lead Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"distribution_state":{"type":"string","title":"Distribution State"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"centres":{"items":{"$ref":"#/components/schemas/AdminRequestCentre"},"type":"array","title":"Centres"}},"type":"object","required":["lead_id","created_at","distribution_state","size_class_m2","contact_name","contact_email","contact_phone"],"title":"AdminRequestFound","description":"A customer's request found by the number they were given (\"TS-\" and the\nfirst eight characters of its id): what an admin needs to say where it is\nwhen the customer writes or calls quoting it."},"AdminSellerRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"business_name":{"type":"string","title":"Business Name"},"city":{"type":"string","title":"City"},"country_code":{"type":"string","title":"Country Code"},"kyc_state":{"type":"string","title":"Kyc State"},"admin_approved":{"type":"boolean","title":"Admin Approved"},"manages_listing":{"type":"boolean","title":"Manages Listing","default":true},"suspended":{"type":"boolean","title":"Suspended","default":false}},"type":"object","required":["id","user_id","business_name","city","country_code","kyc_state","admin_approved"],"title":"AdminSellerRow"},"AdminSiteWrite":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"category":{"type":"string","enum":["self_storage","container_yard","mover_depository"],"title":"Category","default":"self_storage"},"address_line":{"type":"string","maxLength":300,"minLength":1,"title":"Address Line"},"postcode":{"type":"string","pattern":"^\\d{5}$","title":"Postcode"},"city":{"type":"string","maxLength":120,"minLength":1,"title":"City"},"province":{"type":"string","pattern":"^[A-Z]{2}$","title":"Province"},"phone":{"anyOf":[{"type":"string","pattern":"^\\+?[0-9][0-9 ./-]{4,24}$"},{"type":"null"}],"title":"Phone"},"website":{"anyOf":[{"type":"string","maxLength":500,"pattern":"^https://[^\\s/]+\\.[^\\s]+$"},{"type":"null"}],"title":"Website"},"source_kind":{"type":"string","enum":["operator_site","operator_supplied","business_register"],"title":"Source Kind"},"source_url":{"anyOf":[{"type":"string","maxLength":500,"pattern":"^https://[^\\s/]+\\.[^\\s]+$"},{"type":"null"}],"title":"Source Url"},"checked_on":{"type":"string","format":"date","title":"Checked On"},"district":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"District"},"opening_soon":{"type":"boolean","title":"Opening Soon","default":false},"opening_hours":{"anyOf":[{"$ref":"#/components/schemas/OpeningHours"},{"type":"null"}]},"hours_source_url":{"anyOf":[{"type":"string","maxLength":500,"pattern":"^https://[^\\s/]+\\.[^\\s]+$"},{"type":"null"}],"title":"Hours Source Url"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"},"declared_min_m2":{"anyOf":[{"type":"number","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Declared Min M2"},"declared_max_m2":{"anyOf":[{"type":"number","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Declared Max M2"},"price_unit":{"type":"string","enum":["m2","m3"],"title":"Price Unit","default":"m2"},"min_term_months":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Min Term Months","default":1}},"type":"object","required":["name","address_line","postcode","city","province","source_kind","checked_on"],"title":"AdminSiteWrite"},"AdminThread":{"properties":{"recipient_id":{"type":"string","format":"uuid","title":"Recipient Id"},"lead_id":{"type":"string","format":"uuid","title":"Lead Id"},"site_name":{"type":"string","title":"Site Name"},"closed":{"type":"boolean","title":"Closed"},"messages":{"items":{"$ref":"#/components/schemas/ThreadMessageOut"},"type":"array","title":"Messages"}},"type":"object","required":["recipient_id","lead_id","site_name","closed","messages"],"title":"AdminThread"},"AnswerIn":{"properties":{"set":{"type":"string","maxLength":40,"title":"Set"},"question":{"type":"string","maxLength":40,"title":"Question"},"values":{"items":{"type":"string","maxLength":40},"type":"array","maxItems":12,"title":"Values"},"other":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Other"}},"additionalProperties":false,"type":"object","required":["set","question","values"],"title":"AnswerIn","description":"One answer: keys of the question set, and the few words behind an\n\"other\". Anything else in it is refused."},"AssistantUse":{"properties":{"conversations":{"type":"integer","title":"Conversations"},"buttons_only":{"type":"integer","title":"Buttons Only"},"one_message":{"type":"integer","title":"One Message"},"two_messages":{"type":"integer","title":"Two Messages"},"three_or_more":{"type":"integer","title":"Three Or More"},"with_a_size":{"type":"integer","title":"With A Size"},"shown_a_centre":{"type":"integer","title":"Shown A Centre"},"shown_nothing":{"type":"integer","title":"Shown Nothing"},"became_request":{"type":"integer","title":"Became Request"},"left_with_centres":{"type":"integer","title":"Left With Centres"}},"type":"object","required":["conversations","buttons_only","one_message","two_messages","three_or_more","with_a_size","shown_a_centre","shown_nothing","became_request","left_with_centres"],"title":"AssistantUse","description":"How far conversations with the assistant get. Counts only: nothing a\ncustomer wrote is here."},"AutoApprovalRevertRequest":{"properties":{"reason_code":{"type":"string","maxLength":40,"title":"Reason Code"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["reason_code"],"title":"AutoApprovalRevertRequest","description":"Undo an automatic approval. `note` is read by the operator."},"AutoApprovalRow":{"properties":{"claim":{"$ref":"#/components/schemas/AdminClaimRow"},"kind":{"type":"string","title":"Kind"},"days_left":{"type":"integer","title":"Days Left"},"edits_since":{"type":"integer","title":"Edits Since"}},"type":"object","required":["claim","kind","days_left","edits_since"],"title":"AutoApprovalRow","description":"An approval the system gave, while an admin may still undo it."},"BillingCycleResponse":{"properties":{"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"amount_cents":{"type":"integer","title":"Amount Cents"},"status":{"type":"string","title":"Status"}},"type":"object","required":["period_start","period_end","amount_cents","status"],"title":"BillingCycleResponse"},"Body_upload_photo_api_v1_sites__site_id__photos_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_photo_api_v1_sites__site_id__photos_post"},"Body_upload_signage_api_v1_sites__site_id__signage_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_signage_api_v1_sites__site_id__signage_post"},"BookingResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"unit_id":{"type":"string","format":"uuid","title":"Unit Id"},"state":{"type":"string","title":"State"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"hold_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Hold Expires At"}},"type":"object","required":["id","unit_id","state","start_date","end_date","hold_expires_at"],"title":"BookingResponse"},"ClaimCallbackRequest":{"properties":{"note":{"type":"string","maxLength":500,"minLength":5,"title":"Note"}},"type":"object","required":["note"],"title":"ClaimCallbackRequest","description":"Which published number was called and which office answered. A role,\nnot a person's name."},"ClaimDecisionRequest":{"properties":{"site_decisions":{"items":{"$ref":"#/components/schemas/ClaimSiteDecision"},"type":"array","maxItems":500,"title":"Site Decisions"},"reason_code":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Reason Code"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["site_decisions"],"title":"ClaimDecisionRequest","description":"One answer per centre. A centre of the claim that is not named is\nrejected with the rest. `reason_code` is required as soon as one centre is\nturned down; `note` is read by the claimant."},"ClaimMoreInfoRequest":{"properties":{"note":{"type":"string","maxLength":500,"minLength":5,"title":"Note"}},"type":"object","required":["note"],"title":"ClaimMoreInfoRequest","description":"What the operator is asked, in the admin's words: they read it."},"ClaimSendCodeRequest":{"properties":{"method":{"type":"string","enum":["pec","email_code"],"title":"Method","default":"pec"}},"type":"object","title":"ClaimSendCodeRequest"},"ClaimSiteDecision":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"approve":{"type":"boolean","title":"Approve"}},"type":"object","required":["site_id","approve"],"title":"ClaimSiteDecision"},"ClaimSiteOut":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"status":{"type":"string","title":"Status"}},"type":"object","required":["site_id","name","city","status"],"title":"ClaimSiteOut"},"ClaimSiteProofRequest":{"properties":{"required":{"type":"boolean","title":"Required"}},"type":"object","required":["required"],"title":"ClaimSiteProofRequest"},"ClientNotice":{"properties":{"action":{"type":"string","enum":["confirmed","cancelled"],"title":"Action"},"email":{"type":"string","title":"Email"},"notified":{"type":"boolean","title":"Notified"}},"type":"object","required":["action","email","notified"],"title":"ClientNotice","description":"What the client was told about the action the operator just took. Only on\nthe response to that action: it is a receipt, not a property of the lead."},"ClosureCodeConfirm":{"properties":{"code":{"type":"string","maxLength":16,"minLength":1,"title":"Code"}},"additionalProperties":false,"type":"object","required":["code"],"title":"ClosureCodeConfirm","description":"Step one of closing an account: the code that was mailed to it."},"ClosureDone":{"properties":{"action":{"type":"string","enum":["deactivate","delete"],"title":"Action"},"done":{"type":"boolean","const":true,"title":"Done","default":true}},"type":"object","required":["action"],"title":"ClosureDone"},"ClosurePreview":{"properties":{"role":{"type":"string","title":"Role"},"owns_operator":{"type":"boolean","title":"Owns Operator"},"requests":{"type":"integer","title":"Requests"},"centres":{"type":"integer","title":"Centres"},"delete_blockers":{"items":{"type":"string"},"type":"array","title":"Delete Blockers"}},"type":"object","required":["role","owns_operator","requests","centres","delete_blockers"],"title":"ClosurePreview","description":"What closing this account would touch, said before the last step."},"ClosureRequest":{"properties":{"ticket":{"type":"string","maxLength":200,"minLength":1,"title":"Ticket"},"action":{"type":"string","enum":["deactivate","delete"],"title":"Action"},"reason":{"type":"string","enum":["no_longer_needed","found_elsewhere","too_many_messages","privacy","not_satisfied","other"],"title":"Reason"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note"}},"additionalProperties":false,"type":"object","required":["ticket","action","reason"],"title":"ClosureRequest","description":"Steps two and three: why, and which of the two."},"ClosureTicket":{"properties":{"ticket":{"type":"string","title":"Ticket"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["ticket","expires_at"],"title":"ClosureTicket","description":"What the browser holds between the code and the last step: good for\nfifteen minutes, for this account, once."},"CodeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"request_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Request Id"}},"additionalProperties":false,"type":"object","required":["email"],"title":"CodeRequest"},"CodeVerifyRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","maxLength":12,"minLength":4,"title":"Code"}},"additionalProperties":false,"type":"object","required":["email","code"],"title":"CodeVerifyRequest"},"CodeVerifyResponse":{"properties":{"access":{"type":"string","title":"Access"},"refresh":{"type":"string","title":"Refresh"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"request_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["access","refresh"],"title":"CodeVerifyResponse"},"ConsultationBookRequest":{"properties":{"lead_id":{"type":"string","format":"uuid","title":"Lead Id"},"slot_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Slot Id"},"preferred_window":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Preferred Window"},"contact_name":{"type":"string","maxLength":200,"minLength":1,"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Contact Phone"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"}},"type":"object","required":["lead_id","contact_name"],"title":"ConsultationBookRequest"},"ConsultationConfirmRequest":{"properties":{"meeting_type":{"type":"string","enum":["in_person","phone","video_call"],"title":"Meeting Type"}},"type":"object","required":["meeting_type"],"title":"ConsultationConfirmRequest","description":"The operator answers a client's request, and says how it will be held."},"ConsultationPatchRequest":{"properties":{"state":{"type":"string","title":"State"}},"type":"object","required":["state"],"title":"ConsultationPatchRequest"},"ConsultationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"lead_id":{"type":"string","format":"uuid","title":"Lead Id"},"state":{"type":"string","title":"State"},"slot_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Slot Id"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"duration_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Min"},"site_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Site Id"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"preferred_window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Window"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"meeting_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Type"},"confirmation_email_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmation Email Status"}},"type":"object","required":["id","lead_id","state","slot_id","starts_at","duration_min","site_id","site_name","preferred_window","note"],"title":"ConsultationResponse"},"CorrectionAnswer":{"properties":{"vat_number":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Vat Number"},"legal_name":{"anyOf":[{"type":"string","maxLength":160,"minLength":2},{"type":"null"}],"title":"Legal Name"},"business_type":{"anyOf":[{"type":"string","pattern":"^(company|sole_trader)$"},{"type":"null"}],"title":"Business Type"},"registered_address_line":{"anyOf":[{"type":"string","maxLength":200,"minLength":3},{"type":"null"}],"title":"Registered Address Line"},"registered_city":{"anyOf":[{"type":"string","maxLength":120,"minLength":2},{"type":"null"}],"title":"Registered City"},"registered_postcode":{"anyOf":[{"type":"string","pattern":"^[0-9]{5}$"},{"type":"null"}],"title":"Registered Postcode"},"registered_province":{"anyOf":[{"type":"string","pattern":"^[A-Za-z]{2}$"},{"type":"null"}],"title":"Registered Province"},"contact_role":{"anyOf":[{"type":"string","pattern":"^(owner|director|site_manager|consultant)$"},{"type":"null"}],"title":"Contact Role"},"phone":{"anyOf":[{"type":"string","pattern":"^\\+?[0-9][0-9 ./-]{4,24}$"},{"type":"null"}],"title":"Phone"}},"type":"object","title":"CorrectionAnswer","description":"What the operator gives again. Every field is optional here: which\nmust be there is what was asked."},"DemandChannels":{"properties":{"form":{"type":"integer","title":"Form"},"assistant":{"type":"integer","title":"Assistant"},"by_admin":{"type":"integer","title":"By Admin"}},"type":"object","required":["form","assistant","by_admin"],"title":"DemandChannels","description":"How many requests arrived by each way in."},"DemandOverview":{"properties":{"all_time":{"$ref":"#/components/schemas/DemandChannels"},"last_30_days":{"$ref":"#/components/schemas/DemandChannels"},"assistant":{"$ref":"#/components/schemas/AssistantUse"},"form_started":{"type":"integer","title":"Form Started"},"form_confirmed":{"type":"integer","title":"Form Confirmed"}},"type":"object","required":["all_time","last_30_days","assistant","form_started","form_confirmed"],"title":"DemandOverview","description":"The overview's numbers about demand: requests by the way they came in,\nover all time and over the last 30 days, and the assistant's conversations\nthat are still kept (they are deleted with their retention period)."},"EmailRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"EmailRequest"},"EstimateOut":{"properties":{"available":{"type":"boolean","title":"Available"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"size_class_m2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Class M2"},"min_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Cents"},"max_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Cents"},"month":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Month"},"sample":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sample"}},"type":"object","required":["available"],"title":"EstimateOut","description":"A published cell of the price index, or `available: false` and nothing\nelse. Never a figure that is not a published cell (PRICE-1)."},"EstimateRequest":{"properties":{"category":{"type":"string","maxLength":40,"title":"Category"},"answers":{"items":{"$ref":"#/components/schemas/AnswerIn"},"type":"array","maxItems":40,"title":"Answers"},"city":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"City"}},"additionalProperties":false,"type":"object","required":["category"],"title":"EstimateRequest"},"FieldSource":{"properties":{"field":{"type":"string","title":"Field"},"source_kind":{"type":"string","title":"Source Kind"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"checked_on":{"type":"string","format":"date","title":"Checked On"}},"type":"object","required":["field","source_kind","checked_on"],"title":"FieldSource","description":"Where one fact on a listing was read, and the day it was checked (M2)."},"FromPrice":{"properties":{"cents":{"type":"integer","title":"Cents"},"period":{"type":"string","title":"Period"},"basis":{"type":"string","title":"Basis"},"vat_included":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Vat Included"},"insurance_included":{"type":"string","title":"Insurance Included"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"checked_on":{"type":"string","format":"date","title":"Checked On"}},"type":"object","required":["cents","period","basis","insurance_included","checked_on"],"title":"FromPrice","description":"The lowest price an operator publishes, as published: never converted,\nand never without where and when it was read (M2)."},"FunnelEntryPage":{"properties":{"page":{"type":"string","title":"Page"},"walks":{"type":"integer","title":"Walks"}},"type":"object","required":["page","walks"],"title":"FunnelEntryPage"},"FunnelEventIn":{"properties":{"run_id":{"type":"string","format":"uuid","title":"Run Id"},"event":{"type":"string","enum":["step_reached","exit","estimate_shown","code_sent","confirmed"],"title":"Event"},"step":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Step"},"category":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Category"},"origin":{"anyOf":[{"$ref":"#/components/schemas/VisitOrigin"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["run_id","event"],"title":"FunnelEventIn","description":"One step of the wizard, reported by a browser (M6). No field of it can\nhold a name or an address: keys of ours, and a random number."},"FunnelReport":{"properties":{"since":{"type":"string","format":"date","title":"Since"},"until":{"type":"string","format":"date","title":"Until"},"runs":{"type":"integer","title":"Runs"},"estimate_shown":{"type":"integer","title":"Estimate Shown"},"code_sent":{"type":"integer","title":"Code Sent"},"confirmed":{"type":"integer","title":"Confirmed"},"confirmed_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confirmed Share"},"steps":{"items":{"$ref":"#/components/schemas/FunnelStep"},"type":"array","title":"Steps"},"by_origin":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Origin"},"by_entry_page":{"items":{"$ref":"#/components/schemas/FunnelEntryPage"},"type":"array","title":"By Entry Page"}},"type":"object","required":["since","until","runs","estimate_shown","code_sent","confirmed","confirmed_share","steps","by_origin","by_entry_page"],"title":"FunnelReport","description":"How far visitors get in the request wizard, for a span of days (M6,\nF61). What browsers reported: shares, not a count of people, and tied to\nno person and no request."},"FunnelStep":{"properties":{"step":{"type":"string","title":"Step"},"reached":{"type":"integer","title":"Reached"},"share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share"},"left_here":{"type":"integer","title":"Left Here"}},"type":"object","required":["step","reached","share","left_here"],"title":"FunnelStep"},"GuidedAnswers":{"properties":{"purpose":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Purpose"},"amount":{"type":"string","maxLength":40,"title":"Amount"},"duration":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Duration"},"city":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"City"},"urgency":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Urgency"},"features":{"items":{"type":"string"},"type":"array","maxItems":5,"title":"Features"}},"type":"object","required":["amount"],"title":"GuidedAnswers","description":"What the buttons said. Keys, never prose: an unknown key is a 422."},"GuidedOptionOut":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"}},"type":"object","required":["key","label"],"title":"GuidedOptionOut"},"GuidedRequest":{"properties":{"operator_slug":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Operator Slug"},"answers":{"$ref":"#/components/schemas/GuidedAnswers"},"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lng"}},"type":"object","required":["answers"],"title":"GuidedRequest","description":"The buttons' answers. Always opens a new conversation: the guided start\nis the first turn or nothing, and the free chat carries on from it."},"GuidedStepOut":{"properties":{"key":{"type":"string","title":"Key"},"question":{"type":"string","title":"Question"},"options":{"items":{"$ref":"#/components/schemas/GuidedOptionOut"},"type":"array","title":"Options"},"multiple":{"type":"boolean","title":"Multiple"},"optional":{"type":"boolean","title":"Optional"}},"type":"object","required":["key","question","options","multiple","optional"],"title":"GuidedStepOut","description":"One question of the guided start (M6.17), served so the browser keeps no\ncopy of its own. `options` is empty for the step answered with a place."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HeldNoticeRequest":{"properties":{"override_note":{"anyOf":[{"type":"string","maxLength":500,"minLength":5},{"type":"null"}],"title":"Override Note"}},"type":"object","title":"HeldNoticeRequest","description":"Send the notice for a held request. `override_note` is why it goes to a\nbusiness nobody has reached by phone: without a recorded call it is\nrequired, and it is kept in the audit trail."},"HeldRequestUpdate":{"properties":{"status":{"type":"string","enum":["held","operator_contacted","forwarded","expired"],"title":"Status"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["status"],"title":"HeldRequestUpdate"},"HoldRequest":{"properties":{"unit_id":{"type":"string","format":"uuid","title":"Unit Id"},"start_date":{"type":"string","format":"date","title":"Start Date"},"term_months":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":1.0},{"type":"null"}],"title":"Term Months"}},"type":"object","required":["unit_id","start_date"],"title":"HoldRequest"},"ImportRunDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"admin_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Admin User Id"},"file_sha256":{"type":"string","title":"File Sha256"},"template_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Version"},"dry_run":{"type":"boolean","title":"Dry Run"},"counts":{"additionalProperties":true,"type":"object","title":"Counts"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"report":{"additionalProperties":true,"type":"object","title":"Report"}},"type":"object","required":["id","admin_user_id","file_sha256","template_version","dry_run","counts","created_at","report"],"title":"ImportRunDetail"},"ImportRunRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"admin_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Admin User Id"},"file_sha256":{"type":"string","title":"File Sha256"},"template_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Version"},"dry_run":{"type":"boolean","title":"Dry Run"},"counts":{"additionalProperties":true,"type":"object","title":"Counts"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","admin_user_id","file_sha256","template_version","dry_run","counts","created_at"],"title":"ImportRunRow","description":"One upload of the operators' workbook, without its report."},"InvitationAccept":{"properties":{"token":{"type":"string","maxLength":200,"minLength":10,"title":"Token"},"password":{"type":"string","maxLength":72,"minLength":10,"title":"Password"}},"type":"object","required":["token","password"],"title":"InvitationAccept"},"InvitationPreview":{"properties":{"operator":{"type":"string","title":"Operator"},"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["operator","email"],"title":"InvitationPreview","description":"What a person holding an invitation link is shown before they accept."},"KybEventRow":{"properties":{"kind":{"type":"string","title":"Kind"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"actor":{"type":"string","title":"Actor"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["kind","result","actor","created_at"],"title":"KybEventRow"},"KycVerdictRequest":{"properties":{"verdict":{"type":"string","title":"Verdict"},"event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Id"}},"type":"object","required":["verdict"],"title":"KycVerdictRequest"},"LabelledAnswer":{"properties":{"question":{"type":"string","title":"Question"},"answers":{"items":{"type":"string"},"type":"array","title":"Answers"},"other":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Other"}},"type":"object","required":["question","answers"],"title":"LabelledAnswer"},"LayoutSaveRequest":{"properties":{"version":{"type":"integer","title":"Version"},"units":{"items":{"$ref":"#/components/schemas/UnitPayload"},"type":"array","title":"Units"},"obstacles":{"items":{"$ref":"#/components/schemas/ObstaclePayload"},"type":"array","title":"Obstacles"}},"type":"object","required":["version","units"],"title":"LayoutSaveRequest"},"LeadCreateRequest":{"properties":{"original_text":{"type":"string","maxLength":4000,"minLength":1,"title":"Original Text"},"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lng":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"},"operator_slug":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Operator Slug"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"radius_km":{"type":"number","maximum":500.0,"exclusiveMinimum":0.0,"title":"Radius Km","default":25.0},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"origin":{"anyOf":[{"$ref":"#/components/schemas/VisitOrigin"},{"type":"null"}]},"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"},"preferred_site_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Preferred Site Id"},"interpretation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Interpretation"},"contact_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Contact Phone"}},"type":"object","required":["original_text","lat","lng","size_class_m2"],"title":"LeadCreateRequest","description":"What the public path posts. The server trusts nothing here for a number.\n\n`interpretation` is the model's account of how it read the request (M6.2). It\nis archived verbatim and never consulted: the resolution is recomputed\nserver-side from lat/lng/class, and that recomputation is what the inbox\nshows. The boundary of M6.0, in one request body."},"LeadCreateResponse":{"properties":{"lead_id":{"type":"string","format":"uuid","title":"Lead Id"},"site_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Site Id"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"resolution":{"$ref":"#/components/schemas/SpecialistResolution"},"held":{"type":"boolean","title":"Held","default":false},"distribution_state":{"type":"string","title":"Distribution State","default":"distributed"}},"type":"object","required":["lead_id","site_id","size_class_m2","resolution"],"title":"LeadCreateResponse"},"LeadDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"status":{"type":"string","title":"Status"},"site_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Site Id"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"interpreted_size_class_m2":{"type":"integer","title":"Interpreted Size Class M2"},"overridden":{"type":"boolean","title":"Overridden"},"free_count":{"type":"integer","title":"Free Count"},"zero_results":{"type":"boolean","title":"Zero Results"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"appointment_starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Appointment Starts At"},"appointment_meeting_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appointment Meeting Type"},"appointment_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appointment State"},"intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent"},"contact_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Preference"},"distribution_state":{"type":"string","title":"Distribution State","default":"distributed"},"entered_by_admin":{"type":"boolean","title":"Entered By Admin","default":false},"size_known":{"type":"boolean","title":"Size Known","default":true},"recipient_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Recipient Id"},"state":{"type":"string","title":"State","default":"sent"},"unread":{"type":"boolean","title":"Unread","default":false},"unread_messages":{"type":"integer","title":"Unread Messages","default":0},"others_count":{"type":"integer","title":"Others Count","default":0},"direct":{"type":"boolean","title":"Direct","default":false},"area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"},"offered":{"type":"boolean","title":"Offered","default":false},"closed_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Closed Reason"},"own_centres":{"items":{"$ref":"#/components/schemas/OwnCentreRow"},"type":"array","title":"Own Centres"},"origin":{"type":"string","title":"Origin","default":"other"},"origin_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Detail"},"moved_in":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Moved In"},"contact_released":{"type":"boolean","title":"Contact Released","default":false},"original_text":{"type":"string","title":"Original Text"},"interpretation":{"additionalProperties":true,"type":"object","title":"Interpretation"},"resolution":{"$ref":"#/components/schemas/SpecialistResolution"},"resolved_at":{"type":"string","format":"date-time","title":"Resolved At"},"radius_km":{"type":"number","title":"Radius Km"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"internal_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Internal Note"},"consultation":{"anyOf":[{"$ref":"#/components/schemas/ConsultationResponse"},{"type":"null"}]},"transcript":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Transcript"},"size_class_options":{"items":{"type":"integer"},"type":"array","title":"Size Class Options"},"client_notice":{"anyOf":[{"$ref":"#/components/schemas/ClientNotice"},{"type":"null"}]},"other_operators_centres":{"type":"integer","title":"Other Operators Centres","default":0},"request_answers":{"items":{"$ref":"#/components/schemas/LabelledAnswer"},"type":"array","title":"Request Answers"},"cancel_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Reason"},"offer":{"anyOf":[{"$ref":"#/components/schemas/OfferOut"},{"type":"null"}]},"messages":{"items":{"$ref":"#/components/schemas/ThreadMessageOut"},"type":"array","title":"Messages"},"can_respond":{"type":"boolean","title":"Can Respond","default":false},"can_decline":{"type":"boolean","title":"Can Decline","default":false},"can_message":{"type":"boolean","title":"Can Message","default":false},"can_mark_won":{"type":"boolean","title":"Can Mark Won","default":false},"can_confirm_move_in":{"type":"boolean","title":"Can Confirm Move In","default":false},"thread_closed":{"type":"boolean","title":"Thread Closed","default":false},"decline_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decline Reason"}},"type":"object","required":["id","created_at","status","site_id","site_name","size_class_m2","interpreted_size_class_m2","overridden","free_count","zero_results","contact_name","appointment_starts_at","original_text","interpretation","resolution","resolved_at","radius_km","features","contact_email","contact_phone","internal_note","consultation","transcript","size_class_options"],"title":"LeadDetail"},"LeadInboxRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"status":{"type":"string","title":"Status"},"site_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Site Id"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"interpreted_size_class_m2":{"type":"integer","title":"Interpreted Size Class M2"},"overridden":{"type":"boolean","title":"Overridden"},"free_count":{"type":"integer","title":"Free Count"},"zero_results":{"type":"boolean","title":"Zero Results"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"appointment_starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Appointment Starts At"},"appointment_meeting_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appointment Meeting Type"},"appointment_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appointment State"},"intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent"},"contact_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Preference"},"distribution_state":{"type":"string","title":"Distribution State","default":"distributed"},"entered_by_admin":{"type":"boolean","title":"Entered By Admin","default":false},"size_known":{"type":"boolean","title":"Size Known","default":true},"recipient_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Recipient Id"},"state":{"type":"string","title":"State","default":"sent"},"unread":{"type":"boolean","title":"Unread","default":false},"unread_messages":{"type":"integer","title":"Unread Messages","default":0},"others_count":{"type":"integer","title":"Others Count","default":0},"direct":{"type":"boolean","title":"Direct","default":false},"area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"},"offered":{"type":"boolean","title":"Offered","default":false},"closed_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Closed Reason"},"own_centres":{"items":{"$ref":"#/components/schemas/OwnCentreRow"},"type":"array","title":"Own Centres"},"origin":{"type":"string","title":"Origin","default":"other"},"origin_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Detail"},"moved_in":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Moved In"},"contact_released":{"type":"boolean","title":"Contact Released","default":false}},"type":"object","required":["id","created_at","status","site_id","site_name","size_class_m2","interpreted_size_class_m2","overridden","free_count","zero_results","contact_name","appointment_starts_at"],"title":"LeadInboxRow"},"LeadPatchRequest":{"properties":{"size_class_m2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Class M2"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"internal_note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Internal Note"},"site_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Site Id"}},"type":"object","title":"LeadPatchRequest","description":"The store manager's override.\n\nA different class makes the server re-resolve against live inventory and\nwrite a fresh snapshot. The original reading — `original_text`,\n`interpretation`, `interpreted_size_class_m2` — is never touched."},"ListedCentre":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"operator_name":{"type":"string","title":"Operator Name"},"address":{"type":"string","title":"Address"},"city":{"type":"string","title":"City"},"managed":{"type":"boolean","title":"Managed"},"path":{"type":"string","title":"Path"}},"type":"object","required":["site_id","name","operator_name","address","city","managed","path"],"title":"ListedCentre","description":"A listed centre as an operator looking for their own finds it: what its\npublic page already says, and whether somebody runs the listing."},"ListingCentrePreview":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"address_line":{"type":"string","title":"Address Line"},"city":{"type":"string","title":"City"},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postcode"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"category":{"type":"string","title":"Category"},"listing_rung":{"type":"integer","title":"Listing Rung"},"published":{"type":"boolean","title":"Published"},"public_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Public From"},"public_path":{"type":"string","title":"Public Path"},"opening_hours":{"anyOf":[{"$ref":"#/components/schemas/OpeningHours"},{"type":"null"}]},"declared_min_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Min M2"},"declared_max_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Max M2"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"},"prices":{"items":{"$ref":"#/components/schemas/ListingPriceOut"},"type":"array","title":"Prices"},"sources":{"items":{"$ref":"#/components/schemas/ListingSourceOut"},"type":"array","title":"Sources"}},"type":"object","required":["site_id","name","address_line","city","postcode","province","phone","website","category","listing_rung","published","public_from","public_path","opening_hours","declared_min_m2","declared_max_m2","amenities","prices","sources"],"title":"ListingCentrePreview"},"ListingClaimCreate":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":200,"minLength":10},{"type":"null"}],"title":"Token"},"site_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Site Id"},"site_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":500,"minItems":1},{"type":"null"}],"title":"Site Ids"}},"type":"object","title":"ListingClaimCreate","description":"The centres somebody says are theirs: `site_ids`, or the token of the\npre-notification's link, which stands for every centre of that operator.\n`site_id` is the one centre the old callers sent, kept for one release."},"ListingClaimOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"operator_id":{"type":"string","format":"uuid","title":"Operator Id"},"source_operator_name":{"type":"string","title":"Source Operator Name"},"status":{"type":"string","title":"Status"},"domain_match":{"type":"boolean","title":"Domain Match"},"proof_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proof Method"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"decision_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Note"},"sites":{"items":{"$ref":"#/components/schemas/ClaimSiteOut"},"type":"array","title":"Sites"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Decided At"}},"type":"object","required":["id","operator_id","source_operator_name","status","domain_match","proof_method","reason_code","decision_note","sites","created_at","decided_at"],"title":"ListingClaimOut"},"ListingConfirmRequest":{"properties":{"token":{"type":"string","maxLength":200,"minLength":10,"title":"Token"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"declared_min_m2":{"anyOf":[{"type":"number","maximum":10000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Declared Min M2"},"declared_max_m2":{"anyOf":[{"type":"number","maximum":10000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Declared Max M2"},"price_from_eur":{"anyOf":[{"type":"number","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Price From Eur"},"price_to_eur":{"anyOf":[{"type":"number","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Price To Eur"},"price_period":{"type":"string","enum":["day","week","month"],"title":"Price Period","default":"month"},"opening_hours":{"anyOf":[{"$ref":"#/components/schemas/OpeningHours"},{"type":"null"}]},"accept_terms":{"type":"boolean","const":true,"title":"Accept Terms"}},"type":"object","required":["token","site_id","accept_terms"],"title":"ListingConfirmRequest","description":"The five-minute form. Everything is optional but the acceptance: an\noperator may confirm the page as it is."},"ListingOperator":{"properties":{"slug":{"type":"string","title":"Slug"},"business_name":{"type":"string","title":"Business Name"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"},"manages_listing":{"type":"boolean","title":"Manages Listing"},"has_specialist":{"type":"boolean","title":"Has Specialist"},"publishes_public_prices":{"type":"boolean","title":"Publishes Public Prices"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"accent_colour":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Colour"}},"type":"object","required":["slug","business_name","manages_listing","has_specialist","publishes_public_prices"],"title":"ListingOperator","description":"Whose centre this is, on every card and centre page (M7).\n\nUntil M7 nothing public said whose a centre was — the search carried no\noperator at all, because there was only ever one on the map. `manages_listing`\nis what the page needs to know it is looking at a listing read off a\ncompetitor's website rather than at inventory somebody is selling."},"ListingPreview":{"properties":{"operator_name":{"type":"string","title":"Operator Name"},"operator_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator Website"},"terms_version":{"type":"string","title":"Terms Version"},"terms_text":{"type":"string","title":"Terms Text"},"terms_accepted":{"type":"boolean","title":"Terms Accepted"},"removed":{"type":"boolean","title":"Removed"},"centres":{"items":{"$ref":"#/components/schemas/ListingCentrePreview"},"type":"array","title":"Centres"}},"type":"object","required":["operator_name","operator_website","terms_version","terms_text","terms_accepted","removed","centres"],"title":"ListingPreview","description":"What an operator sees from the link in the pre-notification: their\ncentres as TrovaStorage holds them, and where each fact was read."},"ListingPriceOut":{"properties":{"size_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size Label"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"volume_m3":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume M3"},"price_from_cents":{"type":"integer","title":"Price From Cents"},"price_to_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price To Cents"},"price_period":{"type":"string","title":"Price Period"},"price_basis":{"type":"string","title":"Price Basis"},"source_kind":{"type":"string","title":"Source Kind"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"checked_on":{"type":"string","format":"date","title":"Checked On"}},"type":"object","required":["size_label","area_m2","volume_m3","price_from_cents","price_to_cents","price_period","price_basis","source_kind","source_url","checked_on"],"title":"ListingPriceOut"},"ListingRequestAccepted":{"properties":{"received":{"type":"boolean","title":"Received","default":true},"due_on":{"type":"string","format":"date","title":"Due On"}},"type":"object","required":["due_on"],"title":"ListingRequestAccepted","description":"The same for every request: nothing here says what was found."},"ListingRequestCloseRequest":{"properties":{"status":{"type":"string","enum":["done","rejected"],"title":"Status"}},"type":"object","required":["status"],"title":"ListingRequestCloseRequest"},"ListingRequestCreate":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":200,"minLength":10},{"type":"null"}],"title":"Token"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"kind":{"type":"string","enum":["correct","remove","contact"],"title":"Kind"},"requester_email":{"type":"string","format":"email","title":"Requester Email"},"requester_phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Requester Phone"},"body":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Body"}},"type":"object","required":["site_id","kind","requester_email"],"title":"ListingRequestCreate","description":"\"Correct this\", \"remove this\" or \"contact me about this\". With the\noperator's token the request is the operator's; without it, it is anybody's\nand waits for an admin."},"ListingSiblings":{"properties":{"centre":{"$ref":"#/components/schemas/ListedCentre"},"siblings":{"items":{"$ref":"#/components/schemas/ListedCentre"},"type":"array","title":"Siblings"},"operator_name":{"type":"string","title":"Operator Name"},"website_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Domain"}},"type":"object","required":["centre","siblings","operator_name","website_domain"],"title":"ListingSiblings","description":"A centre nobody manages and the others of the same public-source\noperator, for the sign-up to tick. What their pages say, and the domain of\nthe operator's website."},"ListingSourceOut":{"properties":{"field":{"type":"string","title":"Field"},"source_kind":{"type":"string","title":"Source Kind"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"checked_on":{"type":"string","format":"date","title":"Checked On"}},"type":"object","required":["field","source_kind","source_url","checked_on"],"title":"ListingSourceOut"},"ListingTokenRequest":{"properties":{"token":{"type":"string","maxLength":200,"minLength":10,"title":"Token"}},"type":"object","required":["token"],"title":"ListingTokenRequest","description":"The token of the link in the pre-notification. In the body, never in the\naddress: an address is logged."},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"MeResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"role":{"type":"string","title":"Role"},"is_admin":{"type":"boolean","title":"Is Admin"},"has_client_profile":{"type":"boolean","title":"Has Client Profile"},"has_seller_profile":{"type":"boolean","title":"Has Seller Profile"},"kyc_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kyc State"},"admin_approved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Admin Approved"},"impersonated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Impersonated By"},"email_verified":{"type":"boolean","title":"Email Verified","default":false},"operator_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator Role"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"has_password":{"type":"boolean","title":"Has Password","default":true}},"type":"object","required":["id","email","role","is_admin","has_client_profile","has_seller_profile"],"title":"MeResponse"},"MonthEarnings":{"properties":{"month":{"type":"string","title":"Month"},"collected_cents":{"type":"integer","title":"Collected Cents"},"by_site":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Site"}},"type":"object","required":["month","collected_cents","by_site"],"title":"MonthEarnings","description":"One calendar month in PLATFORM_TZ, not UTC — see the endpoint."},"MoveInConfirmation":{"properties":{"moved_in":{"type":"boolean","title":"Moved In"}},"additionalProperties":false,"type":"object","required":["moved_in"],"title":"MoveInConfirmation"},"MyBookingItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"unit_label":{"type":"string","title":"Unit Label"},"site_name":{"type":"string","title":"Site Name"},"state":{"type":"string","title":"State"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"hold_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Hold Expires At"},"cycles":{"items":{"$ref":"#/components/schemas/BillingCycleResponse"},"type":"array","title":"Cycles"},"unit_type":{"type":"string","title":"Unit Type"},"floor_level":{"type":"integer","title":"Floor Level"},"address_line":{"type":"string","title":"Address Line"},"city":{"type":"string","title":"City"},"access_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Rules"},"booked_area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Booked Area M2"},"booked_height_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Booked Height M"},"booked_dimension_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booked Dimension Source"},"booked_measurement_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Booked Measurement Method"},"booked_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Booked Verified At"}},"type":"object","required":["id","unit_label","site_name","state","start_date","end_date","hold_expires_at","cycles","unit_type","floor_level","address_line","city","access_rules","booked_area_m2","booked_height_m","booked_dimension_source","booked_measurement_method","booked_verified_at"],"title":"MyBookingItem"},"MyConsultation":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"state":{"type":"string","title":"State"},"starts_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Starts At"},"duration_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Min"},"preferred_window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Window"},"meeting_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Type"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"site_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Address"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","state","starts_at","duration_min","preferred_window","meeting_type","site_name","site_address","created_at"],"title":"MyConsultation","description":"An appointment as the client who asked for it sees it: where, when, and\n— once the operator has answered — how it will be held."},"MyRequestCentre":{"properties":{"recipient_id":{"type":"string","format":"uuid","title":"Recipient Id"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"site_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site City"},"status":{"type":"string","title":"Status"},"offer":{"anyOf":[{"$ref":"#/components/schemas/OfferOut"},{"type":"null"}]},"messages":{"items":{"$ref":"#/components/schemas/ThreadMessageOut"},"type":"array","title":"Messages"},"unread":{"type":"integer","title":"Unread","default":0},"can_message":{"type":"boolean","title":"Can Message","default":false},"can_choose":{"type":"boolean","title":"Can Choose","default":false},"thread_closed":{"type":"boolean","title":"Thread Closed","default":false}},"type":"object","required":["recipient_id","site_id","site_name","site_city","status"],"title":"MyRequestCentre","description":"One centre a request went to, as its customer sees it."},"MyRequestDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"status":{"type":"string","title":"Status"},"active":{"type":"boolean","title":"Active"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"site_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site City"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent"},"size_class_m2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Class M2"},"timeline":{"items":{"$ref":"#/components/schemas/TimelineStep"},"type":"array","title":"Timeline"},"entered_by_admin":{"type":"boolean","title":"Entered By Admin","default":false},"centres":{"items":{"$ref":"#/components/schemas/MyRequestCentre"},"type":"array","title":"Centres"},"details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Details"},"answers":{"items":{"$ref":"#/components/schemas/LabelledAnswer"},"type":"array","title":"Answers"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"contact_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Preference"},"cancel_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Reason"},"can_cancel":{"type":"boolean","title":"Can Cancel"}},"type":"object","required":["id","created_at","status","active","site_name","site_city","category","intent","size_class_m2","timeline","details","answers","contact_name","contact_phone","contact_preference","cancel_reason","can_cancel"],"title":"MyRequestDetail"},"MyRequestRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"status":{"type":"string","title":"Status"},"active":{"type":"boolean","title":"Active"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"site_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site City"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent"},"size_class_m2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Class M2"},"timeline":{"items":{"$ref":"#/components/schemas/TimelineStep"},"type":"array","title":"Timeline"},"entered_by_admin":{"type":"boolean","title":"Entered By Admin","default":false},"centres":{"items":{"$ref":"#/components/schemas/MyRequestCentre"},"type":"array","title":"Centres"}},"type":"object","required":["id","created_at","status","active","site_name","site_city","category","intent","size_class_m2","timeline"],"title":"MyRequestRow"},"NewSite":{"properties":{"name":{"type":"string","maxLength":120,"minLength":2,"title":"Name"},"address_line":{"type":"string","maxLength":200,"minLength":3,"title":"Address Line"},"city":{"type":"string","maxLength":120,"minLength":2,"title":"City"}},"type":"object","required":["name","address_line","city"],"title":"NewSite","description":"A centre that is not listed yet, as the picker's small form asks it."},"NotificationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"type":{"type":"string","title":"Type"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"read_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Read At"}},"type":"object","required":["id","type","payload","created_at","read_at"],"title":"NotificationResponse"},"ObstaclePayload":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"kind":{"type":"string","title":"Kind"},"x_m":{"type":"number","title":"X M"},"y_m":{"type":"number","title":"Y M"},"width_m":{"type":"number","exclusiveMinimum":0.0,"title":"Width M"},"depth_m":{"type":"number","exclusiveMinimum":0.0,"title":"Depth M"},"rotation":{"type":"integer","title":"Rotation","default":0}},"type":"object","required":["kind","x_m","y_m","width_m","depth_m"],"title":"ObstaclePayload"},"ObstacleResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"kind":{"type":"string","title":"Kind"},"x_m":{"type":"number","title":"X M"},"y_m":{"type":"number","title":"Y M"},"width_m":{"type":"number","title":"Width M"},"depth_m":{"type":"number","title":"Depth M"},"rotation":{"type":"integer","title":"Rotation"}},"type":"object","required":["id","kind","x_m","y_m","width_m","depth_m","rotation"],"title":"ObstacleResponse"},"OfferCreate":{"properties":{"price_min_cents":{"type":"integer","maximum":10000000.0,"exclusiveMinimum":0.0,"title":"Price Min Cents"},"price_max_cents":{"anyOf":[{"type":"integer","maximum":10000000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Price Max Cents"},"price_unit":{"type":"string","enum":["month","week","total"],"title":"Price Unit"},"message":{"type":"string","maxLength":2000,"minLength":1,"title":"Message"}},"additionalProperties":false,"type":"object","required":["price_min_cents","price_unit","message"],"title":"OfferCreate","description":"A centre's answer: one price, or a range, with its unit and a message."},"OfferOut":{"properties":{"price_min_cents":{"type":"integer","title":"Price Min Cents"},"price_max_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Max Cents"},"price_unit":{"type":"string","enum":["month","week","total"],"title":"Price Unit"},"message":{"type":"string","title":"Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["price_min_cents","price_max_cents","price_unit","message","created_at"],"title":"OfferOut"},"OpeningHours":{"properties":{"office":{"anyOf":[{"items":{"$ref":"#/components/schemas/OpeningInterval"},"type":"array"},{"type":"null"}],"title":"Office"},"access":{"anyOf":[{"items":{"$ref":"#/components/schemas/OpeningInterval"},"type":"array"},{"type":"null"}],"title":"Access"},"access_24_7":{"type":"boolean","title":"Access 24 7","default":false}},"additionalProperties":false,"type":"object","title":"OpeningHours","description":"When a centre is staffed and when a customer can get in (0017).\n\n`None` and `[]` are different answers and the difference is the point:\n`office: None` means the operator does not publish office hours, `office: []`\nmeans there are no fixed ones — by appointment, or no staffed office. A card\nthat turns \"we do not know\" into \"closed\" says something false about a real\nbusiness."},"OpeningInterval":{"properties":{"days":{"items":{"type":"integer"},"type":"array","title":"Days"},"opens":{"type":"string","title":"Opens"},"closes":{"type":"string","title":"Closes"}},"additionalProperties":false,"type":"object","required":["days","opens","closes"],"title":"OpeningInterval","description":"One stretch of opening, on one or more weekdays. 0 is Monday, as in\n`services/consultations.WeeklyRule`. A lunch break is two intervals, and an\novernight span is two as well — \"22:00–02:00\" reads the wrong way round in\nevery sort."},"OperatorBookRequest":{"properties":{"slot_id":{"type":"string","format":"uuid","title":"Slot Id"},"meeting_type":{"type":"string","enum":["in_person","phone","video_call"],"title":"Meeting Type"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"}},"type":"object","required":["slot_id","meeting_type"],"title":"OperatorBookRequest","description":"The store manager books a slot for a lead. No address, no name: the\nrecipient of the confirmation is the lead's own contact, read from the\ndatabase, so this body cannot be used to send mail anywhere else."},"OperatorClaimCreate":{"properties":{"site_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":500,"minItems":1,"title":"Site Ids"}},"type":"object","required":["site_ids"],"title":"OperatorClaimCreate","description":"The centres an operator claims from its own area."},"OperatorCorrectionRequest":{"properties":{"fields":{"items":{"type":"string","enum":["vat_number","legal_name","legal_form","registered_address","contact"]},"type":"array","maxItems":5,"minItems":1,"title":"Fields"},"note":{"type":"string","maxLength":2000,"minLength":5,"title":"Note"}},"type":"object","required":["fields","note"],"title":"OperatorCorrectionRequest","description":"An admin asks the operator to give some facts about the business\nagain. `note` is read by the operator."},"OperatorDecisionRequest":{"properties":{"approve":{"type":"boolean","title":"Approve"},"reason_code":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Reason Code"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"},"vat_override":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Vat Override"}},"type":"object","required":["approve"],"title":"OperatorDecisionRequest","description":"Approve the operator, or turn it down with a reason. `note` is read by\nthe operator."},"OperatorOwnerEmailRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"note":{"type":"string","maxLength":500,"minLength":10,"title":"Note"}},"type":"object","required":["email","note"],"title":"OperatorOwnerEmailRequest","description":"Another address for an owner who never confirmed theirs. `note` says\nhow the admin knows it is the business's: it is kept, not sent."},"OperatorPecRequest":{"properties":{"pec_email":{"type":"string","format":"email","title":"Pec Email"},"source":{"type":"string","enum":["ini_pec_manual","ini_pec_api"],"title":"Source","default":"ini_pec_manual"}},"type":"object","required":["pec_email"],"title":"OperatorPecRequest","description":"The business's PEC as an admin read it in the public register."},"OperatorPipeline":{"properties":{"operators":{"type":"integer","title":"Operators"},"centres":{"type":"integer","title":"Centres"},"centres_online":{"type":"integer","title":"Centres Online"},"without_account":{"type":"integer","title":"Without Account"},"never_contacted":{"type":"integer","title":"Never Contacted"},"in_contact":{"type":"integer","title":"In Contact"},"online_without_account":{"type":"integer","title":"Online Without Account"},"declined":{"type":"integer","title":"Declined"},"removal_asked":{"type":"integer","title":"Removal Asked"},"contacted":{"type":"integer","title":"Contacted"},"with_account":{"type":"integer","title":"With Account"},"in_verification":{"type":"integer","title":"In Verification"},"verified":{"type":"integer","title":"Verified"},"verified_claimed":{"type":"integer","title":"Verified Claimed"},"verified_own_centres":{"type":"integer","title":"Verified Own Centres"},"rejected":{"type":"integer","title":"Rejected"},"suspended":{"type":"integer","title":"Suspended"},"to_decide":{"type":"integer","title":"To Decide"},"requests_open":{"type":"integer","title":"Requests Open"},"held_waiting":{"type":"integer","title":"Held Waiting"},"online_booking":{"type":"boolean","title":"Online Booking"}},"type":"object","required":["operators","centres","centres_online","without_account","never_contacted","in_contact","online_without_account","declined","removal_asked","contacted","with_account","in_verification","verified","verified_claimed","verified_own_centres","rejected","suspended","to_decide","requests_open","held_waiting","online_booking"],"title":"OperatorPipeline","description":"Where every operator stands, as counts (13 October 2026). An operator\nis counted once in `without_account` or in `with_account`; `contacted` is\nacross both, because the contact log follows an operator into its account."},"OperatorReinstateRequest":{"properties":{"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","title":"OperatorReinstateRequest"},"OperatorRemovalRequest":{"properties":{"kind":{"type":"string","enum":["declined","removal_asked"],"title":"Kind"},"channel":{"type":"string","enum":["phone","email","form","post","in_person"],"title":"Channel","default":"phone"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["kind"],"title":"OperatorRemovalRequest","description":"An operator with no account is taken off the public pages (0047).\n`declined`: it said no when contacted. `removal_asked`: it was listed and\nasked to be taken off. The note is about the company, as in the log."},"OperatorRestoreRequest":{"properties":{"channel":{"type":"string","enum":["phone","email","form","post","in_person"],"title":"Channel","default":"phone"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","title":"OperatorRestoreRequest"},"OperatorSuspendRequest":{"properties":{"reason_code":{"type":"string","maxLength":40,"title":"Reason Code"},"statement":{"type":"string","maxLength":2000,"minLength":20,"title":"Statement"},"terminate_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Terminate On"}},"type":"object","required":["reason_code","statement"],"title":"OperatorSuspendRequest","description":"Suspend an operator. `statement` is the statement of reasons: the\noperator reads it as written, in the email and on the status card."},"OperatorTermsAcceptRequest":{"properties":{"version":{"type":"string","maxLength":40,"minLength":1,"title":"Version"},"accept":{"type":"boolean","const":true,"title":"Accept"}},"type":"object","required":["version","accept"],"title":"OperatorTermsAcceptRequest"},"OperatorTermsAccepted":{"properties":{"version":{"type":"string","title":"Version"},"accepted":{"type":"boolean","title":"Accepted"}},"type":"object","required":["version","accepted"],"title":"OperatorTermsAccepted"},"OperatorTermsOut":{"properties":{"version":{"type":"string","title":"Version"},"text":{"type":"string","title":"Text"}},"type":"object","required":["version","text"],"title":"OperatorTermsOut"},"OperatorVerification":{"properties":{"state":{"type":"string","title":"State"},"kyb_level":{"type":"integer","title":"Kyb Level"},"next_action":{"anyOf":[{"$ref":"#/components/schemas/VerificationAction"},{"type":"null"}]},"expected_days":{"type":"integer","title":"Expected Days"},"contact_email":{"type":"string","title":"Contact Email"},"claims":{"items":{"$ref":"#/components/schemas/VerificationClaim"},"type":"array","title":"Claims"},"terms":{"$ref":"#/components/schemas/VerificationTerms"},"missing":{"items":{"type":"string"},"type":"array","title":"Missing"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"reason_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Text"},"reason_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Hint"},"decision_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Note"},"more_info_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"More Info Note"},"proof":{"anyOf":[{"$ref":"#/components/schemas/VerificationProof"},{"type":"null"}]},"first_site_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"First Site Id"},"suspended":{"anyOf":[{"$ref":"#/components/schemas/VerificationSuspension"},{"type":"null"}]},"correction":{"anyOf":[{"$ref":"#/components/schemas/VerificationCorrection"},{"type":"null"}]},"pro_free_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Pro Free Until"}},"type":"object","required":["state","kyb_level","next_action","expected_days","contact_email","claims","terms","missing","reason_code","decision_note","first_site_id","suspended"],"title":"OperatorVerification","description":"The status card of an operator's workspace: where the verification of\nthe business stands and what, if anything, the operator must do. It names\nno admin, and the owner's address is masked: every member reads it."},"OpportunityDecline":{"properties":{"reason":{"type":"string","enum":["not_our_size","no_availability","outside_area","not_serious","other"],"title":"Reason"}},"additionalProperties":false,"type":"object","required":["reason"],"title":"OpportunityDecline"},"OutreachContactOut":{"properties":{"seller_profile_id":{"type":"string","format":"uuid","title":"Seller Profile Id"},"contacted_on":{"type":"string","format":"date","title":"Contacted On"},"channel":{"type":"string","enum":["phone","email","form","post","in_person"],"title":"Channel"},"outcome":{"type":"string","enum":["no_answer","reached","interested","confirmed","declined","removal_asked","prenotified"],"title":"Outcome"},"prices_received":{"type":"boolean","title":"Prices Received","default":false},"link_placed":{"type":"boolean","title":"Link Placed","default":false},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"},"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["seller_profile_id","contacted_on","channel","outcome","id","created_at"],"title":"OutreachContactOut"},"OutreachContactWrite":{"properties":{"seller_profile_id":{"type":"string","format":"uuid","title":"Seller Profile Id"},"contacted_on":{"type":"string","format":"date","title":"Contacted On"},"channel":{"type":"string","enum":["phone","email","form","post","in_person"],"title":"Channel"},"outcome":{"type":"string","enum":["no_answer","reached","interested","confirmed","declined","removal_asked","prenotified"],"title":"Outcome"},"prices_received":{"type":"boolean","title":"Prices Received","default":false},"link_placed":{"type":"boolean","title":"Link Placed","default":false},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["seller_profile_id","contacted_on","channel","outcome"],"title":"OutreachContactWrite","description":"One contact with an operator. `note` is about the company: no person's\nname, mobile or private mailbox goes here."},"OverviewOptionOut":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"distance_km":{"type":"number","title":"Distance Km"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"missing_features":{"items":{"type":"string"},"type":"array","title":"Missing Features"},"free_count":{"type":"integer","title":"Free Count"},"free_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Free From"},"full":{"type":"boolean","title":"Full","default":false},"operator":{"type":"string","title":"Operator","default":""},"listing_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Url"},"declared":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Declared"}},"type":"object","required":["site_id","name","city","lat","lng","distance_km","size_class_m2","missing_features","free_count","free_from"],"title":"OverviewOptionOut"},"OwnAccount":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"email_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Verified At"},"has_password":{"type":"boolean","title":"Has Password"}},"type":"object","required":["id","email","role","created_at","email_verified_at","has_password"],"title":"OwnAccount"},"OwnBooking":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"site_name":{"type":"string","title":"Site Name"},"unit_label":{"type":"string","title":"Unit Label"},"state":{"type":"string","title":"State"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"cycles":{"items":{"$ref":"#/components/schemas/BillingCycleResponse"},"type":"array","title":"Cycles"}},"type":"object","required":["id","site_name","unit_label","state","start_date","end_date","created_at","cycles"],"title":"OwnBooking"},"OwnCentre":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"address_line":{"type":"string","title":"Address Line"},"city":{"type":"string","title":"City"},"published":{"type":"boolean","title":"Published"}},"type":"object","required":["id","name","address_line","city","published"],"title":"OwnCentre"},"OwnCentreRow":{"properties":{"recipient_id":{"type":"string","format":"uuid","title":"Recipient Id"},"site_name":{"type":"string","title":"Site Name"},"state":{"type":"string","title":"State"}},"type":"object","required":["recipient_id","site_name","state"],"title":"OwnCentreRow","description":"Another centre of the same operator that has the same request."},"OwnClientProfile":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["display_name","phone","created_at"],"title":"OwnClientProfile"},"OwnConsent":{"properties":{"kind":{"type":"string","title":"Kind"},"version":{"type":"string","title":"Version"},"accepted_at":{"type":"string","format":"date-time","title":"Accepted At"}},"type":"object","required":["kind","version","accepted_at"],"title":"OwnConsent","description":"Something the person agreed to, with its date. Today: an operator's\nacceptance of the operator terms."},"OwnDataExport":{"properties":{"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"account":{"$ref":"#/components/schemas/OwnAccount"},"client_profile":{"anyOf":[{"$ref":"#/components/schemas/OwnClientProfile"},{"type":"null"}]},"operator":{"anyOf":[{"$ref":"#/components/schemas/OwnOperator"},{"type":"null"}]},"requests":{"items":{"$ref":"#/components/schemas/MyRequestDetail"},"type":"array","title":"Requests"},"consultations":{"items":{"$ref":"#/components/schemas/MyConsultation"},"type":"array","title":"Consultations"},"bookings":{"items":{"$ref":"#/components/schemas/OwnBooking"},"type":"array","title":"Bookings"},"notifications":{"items":{"$ref":"#/components/schemas/NotificationResponse"},"type":"array","title":"Notifications"},"consents":{"items":{"$ref":"#/components/schemas/OwnConsent"},"type":"array","title":"Consents"},"events":{"items":{"$ref":"#/components/schemas/OwnEvent"},"type":"array","title":"Events"}},"type":"object","required":["generated_at","account","client_profile","operator","requests","consultations","bookings","notifications","consents","events"],"title":"OwnDataExport","description":"Everything the platform holds about the person who asks, as one document."},"OwnEvent":{"properties":{"action":{"type":"string","title":"Action"},"entity_type":{"type":"string","title":"Entity Type"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"by_staff":{"type":"boolean","title":"By Staff"}},"type":"object","required":["action","entity_type","occurred_at","by_staff"],"title":"OwnEvent","description":"One line of the audit trail where the account is the actor: what and\nwhen. `by_staff` is true when an admin did it while acting as the account."},"OwnOperator":{"properties":{"role":{"type":"string","title":"Role"},"member_since":{"type":"string","format":"date-time","title":"Member Since"},"business_name":{"type":"string","title":"Business Name"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"address_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"},"vat_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Number"},"fiscal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Code"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"registered_address_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered Address Line"},"registered_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered City"},"registered_postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered Postcode"},"registered_province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered Province"},"contact_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Role"},"self_certified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Self Certified At"},"first_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Verified At"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"company_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Email"},"card_brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Brand"},"card_last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Last4"},"centres":{"items":{"$ref":"#/components/schemas/OwnCentre"},"type":"array","title":"Centres"}},"type":"object","required":["role","member_since","business_name"],"title":"OwnOperator","description":"The operator the account acts for. A member who is not the owner gets\nthe operator's name and their own role; the rest is the owner's."},"PasswordResetConfirm":{"properties":{"token":{"type":"string","maxLength":200,"minLength":10,"title":"Token"},"password":{"type":"string","maxLength":72,"minLength":10,"title":"Password"}},"type":"object","required":["token","password"],"title":"PasswordResetConfirm"},"PhotoPatchRequest":{"properties":{"position":{"type":"integer","minimum":0.0,"title":"Position"}},"type":"object","required":["position"],"title":"PhotoPatchRequest"},"PhotoRef":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"url":{"type":"string","title":"Url"},"position":{"type":"integer","title":"Position"},"draft":{"type":"boolean","title":"Draft","default":false}},"type":"object","required":["id","url","position"],"title":"PhotoRef","description":"`url` is a path, not an absolute URL: the backend does not know its own\npublic origin. The SPA prefixes it with the API base it already configures."},"PlanCreateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"level":{"type":"integer","maximum":20.0,"minimum":0.0,"title":"Level","default":0},"width_m":{"type":"number","exclusiveMinimum":0.0,"title":"Width M"},"depth_m":{"type":"number","exclusiveMinimum":0.0,"title":"Depth M"},"corridor_m":{"type":"number","exclusiveMinimum":0.0,"title":"Corridor M","default":1.5},"unit_mix":{"items":{"$ref":"#/components/schemas/UnitMixRow"},"type":"array","title":"Unit Mix"}},"type":"object","required":["width_m","depth_m","unit_mix"],"title":"PlanCreateRequest"},"PlanCreateResponse":{"properties":{"plan":{"$ref":"#/components/schemas/PlanResponse"},"unplaced":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Unplaced"}},"type":"object","required":["plan","unplaced"],"title":"PlanCreateResponse"},"PlanResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"level":{"type":"integer","title":"Level"},"width_m":{"type":"number","title":"Width M"},"depth_m":{"type":"number","title":"Depth M"},"corridor_m":{"type":"number","title":"Corridor M"},"version":{"type":"integer","title":"Version"},"designed_height_m":{"type":"number","title":"Designed Height M"},"units":{"items":{"$ref":"#/components/schemas/UnitResponse"},"type":"array","title":"Units"},"obstacles":{"items":{"$ref":"#/components/schemas/ObstacleResponse"},"type":"array","title":"Obstacles"}},"type":"object","required":["id","site_id","name","level","width_m","depth_m","corridor_m","version","designed_height_m","units","obstacles"],"title":"PlanResponse"},"PrenotifyOutcome":{"properties":{"seller_id":{"type":"string","format":"uuid","title":"Seller Id"},"business_name":{"type":"string","title":"Business Name"},"action":{"type":"string","enum":["send","skip"],"title":"Action"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"public_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Public From"}},"type":"object","required":["seller_id","business_name","action","reason","public_from"],"title":"PrenotifyOutcome"},"PrenotifyRequest":{"properties":{"seller_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":500,"minItems":1,"title":"Seller Ids"},"dry_run":{"type":"boolean","title":"Dry Run","default":true}},"type":"object","required":["seller_ids"],"title":"PrenotifyRequest"},"PrenotifyResponse":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run"},"sent":{"type":"integer","title":"Sent"},"skipped":{"type":"integer","title":"Skipped"},"outcomes":{"items":{"$ref":"#/components/schemas/PrenotifyOutcome"},"type":"array","title":"Outcomes"}},"type":"object","required":["dry_run","sent","skipped","outcomes"],"title":"PrenotifyResponse"},"PricePointIn":{"properties":{"size_label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Size Label"},"area_m2":{"anyOf":[{"type":"number","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Area M2"},"volume_m3":{"anyOf":[{"type":"number","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Volume M3"},"price_from_cents":{"type":"integer","maximum":100000000.0,"exclusiveMinimum":0.0,"title":"Price From Cents"},"price_to_cents":{"anyOf":[{"type":"integer","maximum":100000000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Price To Cents"},"price_period":{"type":"string","enum":["day","week","month"],"title":"Price Period","default":"month"},"price_basis":{"type":"string","enum":["per_unit","per_m2","per_m3"],"title":"Price Basis","default":"per_unit"},"vat_included":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Vat Included"},"insurance_included":{"type":"string","enum":["yes","no","not_stated"],"title":"Insurance Included","default":"not_stated"},"is_promotion":{"type":"boolean","title":"Is Promotion","default":false},"promotion_terms":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Promotion Terms"}},"additionalProperties":false,"type":"object","required":["price_from_cents"],"title":"PricePointIn","description":"One size and its price, as the operator publishes it. Stored as given,\nnever converted."},"PricePointOut":{"properties":{"size_label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Size Label"},"area_m2":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Area M2"},"volume_m3":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Volume M3"},"price_from_cents":{"type":"integer","maximum":100000000.0,"exclusiveMinimum":0.0,"title":"Price From Cents"},"price_to_cents":{"anyOf":[{"type":"integer","maximum":100000000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Price To Cents"},"price_period":{"type":"string","enum":["day","week","month"],"title":"Price Period","default":"month"},"price_basis":{"type":"string","enum":["per_unit","per_m2","per_m3"],"title":"Price Basis","default":"per_unit"},"vat_included":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Vat Included"},"insurance_included":{"type":"string","enum":["yes","no","not_stated"],"title":"Insurance Included","default":"not_stated"},"is_promotion":{"type":"boolean","title":"Is Promotion","default":false},"promotion_terms":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Promotion Terms"},"source_kind":{"type":"string","title":"Source Kind"},"checked_on":{"type":"string","format":"date","title":"Checked On"}},"type":"object","required":["price_from_cents","source_kind","checked_on"],"title":"PricePointOut"},"PricePointsUpdate":{"properties":{"points":{"items":{"$ref":"#/components/schemas/PricePointIn"},"type":"array","maxItems":40,"title":"Points"}},"type":"object","required":["points"],"title":"PricePointsUpdate","description":"The operator's whole price list, every time: a row left out is a price\nno longer published."},"ProofAttemptOut":{"properties":{"outcome":{"type":"string","title":"Outcome"},"attempts_left":{"type":"integer","title":"Attempts Left","default":0}},"type":"object","required":["outcome"],"title":"ProofAttemptOut"},"ProofCodeRequest":{"properties":{"code":{"type":"string","maxLength":20,"minLength":4,"title":"Code"}},"type":"object","required":["code"],"title":"ProofCodeRequest"},"ProofPack":{"properties":{"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"operator":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Operator"},"coverage":{"$ref":"#/components/schemas/ProofPackCoverage"},"won":{"type":"integer","title":"Won","default":0},"moved_in":{"type":"integer","title":"Moved In","default":0},"not_moved_in":{"type":"integer","title":"Not Moved In","default":0},"admin_entered":{"type":"integer","title":"Admin Entered","default":0},"admin_entered_waiting":{"type":"integer","title":"Admin Entered Waiting","default":0},"by_origin":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Origin"},"by_site":{"items":{"$ref":"#/components/schemas/ProofPackGroup"},"type":"array","title":"By Site"},"unmet":{"items":{"$ref":"#/components/schemas/ProofPackUnmet"},"type":"array","title":"Unmet"},"requests":{"type":"integer","title":"Requests"},"requests_answered":{"type":"integer","title":"Requests Answered"},"answer_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Answer Rate"},"median_minutes_to_first_answer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Median Minutes To First Answer"},"decline_reasons":{"additionalProperties":{"type":"integer"},"type":"object","title":"Decline Reasons"},"cancel_reasons":{"additionalProperties":{"type":"integer"},"type":"object","title":"Cancel Reasons"},"by_city":{"items":{"$ref":"#/components/schemas/ProofPackGroup"},"type":"array","title":"By City"},"by_operator":{"items":{"$ref":"#/components/schemas/ProofPackGroup"},"type":"array","title":"By Operator"}},"type":"object","required":["city","operator","coverage","requests","requests_answered","answer_rate","median_minutes_to_first_answer","decline_reasons","cancel_reasons","by_city","by_operator"],"title":"ProofPack","description":"Coverage, requests and how they ended, on screen only (CSV-1: no\nexport). Counts and keys: no name, address or phone of a customer is in\nit. Only requests a person confirmed are counted (DEMAND-1). Visits are\nread in Google Analytics, not here."},"ProofPackCityCoverage":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"centres_listed":{"type":"integer","title":"Centres Listed"},"centres_managed":{"type":"integer","title":"Centres Managed"}},"type":"object","required":["key","name","centres_listed","centres_managed"],"title":"ProofPackCityCoverage"},"ProofPackCoverage":{"properties":{"centres_listed":{"type":"integer","title":"Centres Listed"},"centres_managed":{"type":"integer","title":"Centres Managed"},"operators_listed":{"type":"integer","title":"Operators Listed"},"operators_managed":{"type":"integer","title":"Operators Managed"},"by_city":{"items":{"$ref":"#/components/schemas/ProofPackCityCoverage"},"type":"array","title":"By City"}},"type":"object","required":["centres_listed","centres_managed","operators_listed","operators_managed"],"title":"ProofPackCoverage","description":"The centres a visitor can find, and those whose operator manages the\nlisting."},"ProofPackGroup":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"sent":{"type":"integer","title":"Sent"},"answered":{"type":"integer","title":"Answered"},"answer_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Answer Rate"},"median_minutes_to_first_answer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Median Minutes To First Answer"},"won":{"type":"integer","title":"Won","default":0},"moved_in":{"type":"integer","title":"Moved In","default":0}},"type":"object","required":["key","name","sent","answered","answer_rate","median_minutes_to_first_answer"],"title":"ProofPackGroup","description":"Requests sent to a set of centres, and how they were answered."},"ProofPackUnmet":{"properties":{"city":{"type":"string","title":"City"},"city_name":{"type":"string","title":"City Name"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"requests":{"type":"integer","title":"Requests"},"unmet":{"type":"integer","title":"Unmet"},"no_free_unit":{"type":"integer","title":"No Free Unit"}},"type":"object","required":["city","city_name","size_class_m2","requests","unmet","no_free_unit"],"title":"ProofPackUnmet","description":"Demand by the city of the centre and the size asked (M6)."},"ProofResendOut":{"properties":{"outcome":{"type":"string","title":"Outcome"}},"type":"object","required":["outcome"],"title":"ProofResendOut"},"PublicOperator":{"properties":{"slug":{"type":"string","title":"Slug"},"business_name":{"type":"string","title":"Business Name"},"coverage":{"items":{"type":"string"},"type":"array","title":"Coverage"},"opening_soon":{"items":{"type":"string"},"type":"array","title":"Opening Soon"},"publishes_public_prices":{"type":"boolean","title":"Publishes Public Prices"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"accent_colour":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Colour"}},"type":"object","required":["slug","business_name","coverage","publishes_public_prices"],"title":"PublicOperator","description":"Whose assistant a customer has landed on (0016)."},"PublicPlan":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"level":{"type":"integer","title":"Level"},"width_m":{"type":"number","title":"Width M"},"depth_m":{"type":"number","title":"Depth M"},"designed_height_m":{"type":"number","title":"Designed Height M"},"units":{"items":{"$ref":"#/components/schemas/PublicUnit"},"type":"array","title":"Units"},"obstacles":{"items":{"$ref":"#/components/schemas/ObstacleResponse"},"type":"array","title":"Obstacles"}},"type":"object","required":["id","name","level","width_m","depth_m","designed_height_m","units","obstacles"],"title":"PublicPlan"},"PublicSiteResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"public_path":{"type":"string","title":"Public Path"},"category":{"type":"string","enum":["self_storage","container_yard","mover_depository"],"title":"Category"},"price_unit":{"type":"string","enum":["m2","m3"],"title":"Price Unit"},"listing_rung":{"type":"integer","title":"Listing Rung"},"listing_status":{"type":"string","enum":["unmanaged","confirmed","managed"],"title":"Listing Status"},"confirmed_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Confirmed On"},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postcode"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"from_price":{"anyOf":[{"$ref":"#/components/schemas/FromPrice"},{"type":"null"}]},"field_sources":{"items":{"$ref":"#/components/schemas/FieldSource"},"type":"array","title":"Field Sources"},"size_availability":{"items":{"$ref":"#/components/schemas/SizeAvailability"},"type":"array","title":"Size Availability"},"availability_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Availability Updated At"},"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"address_line":{"type":"string","title":"Address Line"},"city":{"type":"string","title":"City"},"country_code":{"type":"string","title":"Country Code"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"access_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Rules"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"},"photos":{"items":{"$ref":"#/components/schemas/PhotoRef"},"type":"array","title":"Photos"},"plans":{"items":{"$ref":"#/components/schemas/PublicPlan"},"type":"array","title":"Plans"},"self_serve_booking":{"type":"boolean","title":"Self Serve Booking","default":true},"min_term_months":{"type":"integer","title":"Min Term Months","default":1},"operator":{"$ref":"#/components/schemas/ListingOperator"},"opening_hours":{"anyOf":[{"$ref":"#/components/schemas/OpeningHours"},{"type":"null"}]},"declared_min_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Min M2"},"declared_max_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Max M2"},"declared_from_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Declared From Price Cents"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"source_checked_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Source Checked On"}},"type":"object","required":["slug","public_path","category","price_unit","listing_rung","listing_status","id","name","address_line","city","country_code","lat","lng","description","access_rules","amenities","photos","plans","operator"],"title":"PublicSiteResponse"},"PublicUnit":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"label":{"type":"string","title":"Label"},"x_m":{"type":"number","title":"X M"},"y_m":{"type":"number","title":"Y M"},"width_m":{"type":"number","title":"Width M"},"depth_m":{"type":"number","title":"Depth M"},"rotation":{"type":"integer","title":"Rotation"},"area_m2":{"type":"number","title":"Area M2"},"unit_type":{"type":"string","title":"Unit Type"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"price_month_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Month Cents"},"currency":{"type":"string","title":"Currency"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"availability":{"type":"string","title":"Availability"},"effective_width_m":{"type":"number","title":"Effective Width M"},"effective_depth_m":{"type":"number","title":"Effective Depth M"},"effective_area_m2":{"type":"number","title":"Effective Area M2"},"effective_height_m":{"type":"number","title":"Effective Height M"},"dimension_source":{"type":"string","title":"Dimension Source"},"dimension_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Dimension Verified At"}},"type":"object","required":["id","label","x_m","y_m","width_m","depth_m","rotation","area_m2","unit_type","size_class_m2","price_month_cents","currency","features","availability","effective_width_m","effective_depth_m","effective_area_m2","effective_height_m","dimension_source","dimension_verified_at"],"title":"PublicUnit"},"QuestionOptionOut":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"other":{"type":"boolean","title":"Other","default":false},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"move_to_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Move To Category"}},"type":"object","required":["key","label"],"title":"QuestionOptionOut"},"QuestionOut":{"properties":{"key":{"type":"string","title":"Key"},"question":{"type":"string","title":"Question"},"role":{"type":"string","title":"Role"},"multiple":{"type":"boolean","title":"Multiple"},"optional":{"type":"boolean","title":"Optional"},"options":{"items":{"$ref":"#/components/schemas/QuestionOptionOut"},"type":"array","title":"Options"}},"type":"object","required":["key","question","role","multiple","optional","options"],"title":"QuestionOut"},"QuestionSetOut":{"properties":{"category":{"type":"string","title":"Category"},"name":{"type":"string","title":"Name"},"questions":{"items":{"$ref":"#/components/schemas/QuestionOut"},"type":"array","title":"Questions"},"other_max_chars":{"type":"integer","title":"Other Max Chars"},"details_max_chars":{"type":"integer","title":"Details Max Chars"}},"type":"object","required":["category","name","questions","other_max_chars","details_max_chars"],"title":"QuestionSetOut"},"RefreshRequest":{"properties":{"refresh":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh"}},"type":"object","title":"RefreshRequest"},"ReportedThread":{"properties":{"recipient_id":{"type":"string","format":"uuid","title":"Recipient Id"},"lead_id":{"type":"string","format":"uuid","title":"Lead Id"},"site_name":{"type":"string","title":"Site Name"},"operator_name":{"type":"string","title":"Operator Name"},"reported_by":{"type":"string","title":"Reported By"},"reported_at":{"type":"string","format":"date-time","title":"Reported At"},"reports":{"type":"integer","title":"Reports"},"messages":{"type":"integer","title":"Messages"},"closed":{"type":"boolean","title":"Closed"}},"type":"object","required":["recipient_id","lead_id","site_name","operator_name","reported_by","reported_at","reports","messages","closed"],"title":"ReportedThread"},"RequestCancel":{"properties":{"reason":{"type":"string","enum":["found_elsewhere","no_longer_needed","too_expensive","mistake","other"],"title":"Reason"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note"}},"additionalProperties":false,"type":"object","required":["reason"],"title":"RequestCancel"},"RequestCentre":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"address_line":{"type":"string","title":"Address Line"},"city":{"type":"string","title":"City"},"city_slug":{"type":"string","title":"City Slug"},"category":{"type":"string","enum":["self_storage","container_yard","mover_depository"],"title":"Category"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"km_from_centre":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Km From Centre"}},"type":"object","required":["site_id","name","address_line","city","city_slug","category","lat","lng"],"title":"RequestCentre","description":"A centre a request can be sent to: public facts only."},"RequestCentres":{"properties":{"city":{"anyOf":[{"$ref":"#/components/schemas/RequestCity"},{"type":"null"}]},"cities":{"items":{"$ref":"#/components/schemas/RequestCity"},"type":"array","title":"Cities"},"centres":{"items":{"$ref":"#/components/schemas/RequestCentre"},"type":"array","title":"Centres"},"max_recipients":{"type":"integer","title":"Max Recipients","default":3}},"type":"object","required":["city","cities","centres"],"title":"RequestCentres"},"RequestChoose":{"properties":{"recipient_id":{"type":"string","format":"uuid","title":"Recipient Id"}},"additionalProperties":false,"type":"object","required":["recipient_id"],"title":"RequestChoose"},"RequestCity":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"}},"type":"object","required":["slug","name"],"title":"RequestCity"},"RequestContextIn":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"RequestContextIn"},"RequestContextOut":{"properties":{"waiting":{"type":"integer","title":"Waiting"},"site_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Site Id"}},"type":"object","required":["waiting"],"title":"RequestContextOut","description":"What the notice of a waiting request lets the wizard say. Zero for a\ntoken that is wrong, old, or about a request no longer waiting: the\nwizard then says nothing, and works as it does without one."},"RequestCreate":{"properties":{"category":{"type":"string","maxLength":40,"title":"Category"},"answers":{"items":{"$ref":"#/components/schemas/AnswerIn"},"type":"array","maxItems":40,"title":"Answers"},"details":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Details"},"site_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":10,"minItems":1,"title":"Site Ids"},"direct_site_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Direct Site Id"},"contact_name":{"type":"string","maxLength":120,"minLength":2,"title":"Contact Name"},"contact_phone":{"anyOf":[{"type":"string","pattern":"^\\+?[0-9][0-9 ./-]{4,24}$"},{"type":"null"}],"title":"Contact Phone"},"contact_preference":{"type":"string","enum":["call","message_only"],"title":"Contact Preference"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"accepted_terms":{"type":"boolean","const":true,"title":"Accepted Terms"},"origin":{"anyOf":[{"$ref":"#/components/schemas/VisitOrigin"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["category","answers","site_ids","contact_name","contact_preference","accepted_terms"],"title":"RequestCreate"},"RequestCreated":{"properties":{"request_id":{"type":"string","format":"uuid","title":"Request Id"},"distribution_state":{"type":"string","title":"Distribution State"},"needs_code":{"type":"boolean","title":"Needs Code"}},"type":"object","required":["request_id","distribution_state","needs_code"],"title":"RequestCreated","description":"The same for an address with an account and one without."},"RequestReadReport":{"properties":{"quota":{"type":"integer","title":"Quota"},"months":{"type":"integer","title":"Months"},"rows":{"items":{"$ref":"#/components/schemas/RequestReadRow"},"type":"array","title":"Rows"}},"type":"object","required":["quota","months","rows"],"title":"RequestReadReport","description":"Customer requests opened per operator and month (Pro features, task 10):\none count per request, in the month the operator first opened it. Read\nonly; nothing is enforced with it."},"RequestReadRow":{"properties":{"operator_id":{"type":"string","format":"uuid","title":"Operator Id"},"business_name":{"type":"string","title":"Business Name"},"month":{"type":"string","format":"date","title":"Month"},"reads":{"type":"integer","title":"Reads"},"over_quota":{"type":"boolean","title":"Over Quota"}},"type":"object","required":["operator_id","business_name","month","reads","over_quota"],"title":"RequestReadRow"},"ResolvedAlternative":{"properties":{"kind":{"type":"string","title":"Kind"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"radius_km":{"type":"number","title":"Radius Km"},"free_count":{"type":"integer","title":"Free Count"},"centres":{"items":{"$ref":"#/components/schemas/ResolvedCentre"},"type":"array","title":"Centres"},"dropped_features":{"items":{"type":"string"},"type":"array","title":"Dropped Features"}},"type":"object","required":["kind","size_class_m2","radius_km","free_count","centres"],"title":"ResolvedAlternative"},"ResolvedCentre":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"distance_km":{"type":"number","title":"Distance Km"},"free_count":{"type":"integer","title":"Free Count"},"operator":{"type":"string","title":"Operator","default":""},"listing_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Url"},"declared":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Declared"}},"type":"object","required":["site_id","name","city","lat","lng","distance_km","free_count"],"title":"ResolvedCentre"},"ResolvedFreesUp":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"distance_km":{"type":"number","title":"Distance Km"},"free_from":{"type":"string","format":"date","title":"Free From"}},"type":"object","required":["site_id","name","distance_km","free_from"],"title":"ResolvedFreesUp","description":"A taken box of the class with an end date: \"dovrebbe liberarsi dal\"."},"SearchAreaResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SearchResultItem"},"type":"array","title":"Results"},"truncated":{"type":"boolean","title":"Truncated"},"max_results":{"type":"integer","title":"Max Results"}},"type":"object","required":["results","truncated","max_results"],"title":"SearchAreaResponse","description":"`GET /search/area` (M7). An envelope rather than a bare list, because a\nmap has to know when it is not seeing everything in the rectangle."},"SearchResultItem":{"properties":{"slug":{"type":"string","title":"Slug"},"public_path":{"type":"string","title":"Public Path"},"category":{"type":"string","enum":["self_storage","container_yard","mover_depository"],"title":"Category"},"price_unit":{"type":"string","enum":["m2","m3"],"title":"Price Unit"},"listing_rung":{"type":"integer","title":"Listing Rung"},"listing_status":{"type":"string","enum":["unmanaged","confirmed","managed"],"title":"Listing Status"},"confirmed_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Confirmed On"},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postcode"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"from_price":{"anyOf":[{"$ref":"#/components/schemas/FromPrice"},{"type":"null"}]},"field_sources":{"items":{"$ref":"#/components/schemas/FieldSource"},"type":"array","title":"Field Sources"},"size_availability":{"items":{"$ref":"#/components/schemas/SizeAvailability"},"type":"array","title":"Size Availability"},"availability_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Availability Updated At"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"address_line":{"type":"string","title":"Address Line"},"city":{"type":"string","title":"City"},"country_code":{"type":"string","title":"Country Code"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"distance_km":{"type":"number","title":"Distance Km"},"starting_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Starting Price Cents"},"available_unit_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Available Unit Count"},"size_classes":{"items":{"type":"integer"},"type":"array","title":"Size Classes"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"},"cover_photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Photo Url"},"self_serve_booking":{"type":"boolean","title":"Self Serve Booking","default":true},"size_unknown":{"type":"boolean","title":"Size Unknown","default":false},"operator":{"$ref":"#/components/schemas/ListingOperator"},"opening_hours":{"anyOf":[{"$ref":"#/components/schemas/OpeningHours"},{"type":"null"}]},"declared_min_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Min M2"},"declared_max_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Max M2"},"declared_from_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Declared From Price Cents"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"source_checked_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Source Checked On"}},"type":"object","required":["slug","public_path","category","price_unit","listing_rung","listing_status","site_id","name","address_line","city","country_code","lat","lng","distance_km","starting_price_cents","available_unit_count","size_classes","amenities","operator"],"title":"SearchResultItem"},"SellerCompleteness":{"properties":{"missing":{"items":{"type":"string"},"type":"array","title":"Missing"},"next_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Step"},"awaiting_verification":{"type":"boolean","title":"Awaiting Verification"},"terms_version":{"type":"string","title":"Terms Version"},"terms_accepted":{"type":"boolean","title":"Terms Accepted"}},"type":"object","required":["missing","next_step","awaiting_verification","terms_version","terms_accepted"],"title":"SellerCompleteness","description":"What an operator still has to do before their page can be published."},"SellerEarnings":{"properties":{"collected_cents":{"type":"integer","title":"Collected Cents"},"due_cents":{"type":"integer","title":"Due Cents"},"run_rate_cents":{"type":"integer","title":"Run Rate Cents"},"by_site":{"items":{"$ref":"#/components/schemas/SiteEarnings"},"type":"array","title":"By Site"},"by_month":{"items":{"$ref":"#/components/schemas/MonthEarnings"},"type":"array","title":"By Month"}},"type":"object","required":["collected_cents","due_cents","run_rate_cents","by_site","by_month"],"title":"SellerEarnings","description":"Three figures that are three different kinds of truth, kept apart on\npurpose: what came in, what was billed and has not come in, and what the\ncurrent tenants are worth per month. No forward projection — multiplying\nrents by months needs a churn assumption nobody has, and the result would\nsit next to a GMV that means money actually collected."},"SellerPaymentMethodRequest":{"properties":{"payment_method_id":{"type":"string","maxLength":64,"minLength":1,"title":"Payment Method Id"}},"type":"object","required":["payment_method_id"],"title":"SellerPaymentMethodRequest","description":"A payment method the browser already tokenised with the provider — the\ncard number itself never reaches this API."},"SellerProfileResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"business_name":{"type":"string","title":"Business Name"},"contact_phone":{"type":"string","title":"Contact Phone"},"address_line":{"type":"string","title":"Address Line"},"city":{"type":"string","title":"City"},"country_code":{"type":"string","title":"Country Code"},"kyc_state":{"type":"string","title":"Kyc State"},"admin_approved":{"type":"boolean","title":"Admin Approved"},"is_publish_eligible":{"type":"boolean","title":"Is Publish Eligible"},"publishes_public_prices":{"type":"boolean","title":"Publishes Public Prices"},"self_serve_booking":{"type":"boolean","title":"Self Serve Booking"},"has_specialist":{"type":"boolean","title":"Has Specialist"},"slug":{"type":"string","title":"Slug"},"card_brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Brand"},"card_last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Last4"}},"type":"object","required":["id","business_name","contact_phone","address_line","city","country_code","kyc_state","admin_approved","is_publish_eligible","publishes_public_prices","self_serve_booking","has_specialist","slug"],"title":"SellerProfileResponse"},"SellerSalesModeRequest":{"properties":{"publishes_public_prices":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Publishes Public Prices"},"self_serve_booking":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Self Serve Booking"},"has_specialist":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Specialist"}},"type":"object","title":"SellerSalesModeRequest","description":"The two commercial switches, changed by the operator who owns them.\n\nA demo needs to turn prices on in the room, and a pilot needs to turn them\non for good; both are the same act, so there is one endpoint rather than a\ndemo-only hook that would not exist where it matters."},"SellerSlotRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"duration_min":{"type":"integer","title":"Duration Min"},"state":{"type":"string","title":"State"},"taken":{"type":"boolean","title":"Taken"},"consultation":{"anyOf":[{"$ref":"#/components/schemas/ConsultationResponse"},{"type":"null"}]}},"type":"object","required":["id","site_id","starts_at","duration_min","state","taken","consultation"],"title":"SellerSlotRow"},"SignupAccepted":{"properties":{"status":{"type":"string","title":"Status","default":"check_email"}},"type":"object","title":"SignupAccepted","description":"The whole answer, whatever was found."},"SignupAnswers":{"properties":{"centre_count":{"anyOf":[{"type":"string","pattern":"^(one|city_multi|multi_city)$"},{"type":"null"}],"title":"Centre Count"},"business_type":{"anyOf":[{"type":"string","pattern":"^(company|sole_trader)$"},{"type":"null"}],"title":"Business Type"},"legal_name":{"anyOf":[{"type":"string","maxLength":160,"minLength":2},{"type":"null"}],"title":"Legal Name"},"vat_number":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Vat Number"},"fiscal_code":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Fiscal Code"},"brand_name":{"anyOf":[{"type":"string","maxLength":120,"minLength":2},{"type":"null"}],"title":"Brand Name"},"registered_address_line":{"anyOf":[{"type":"string","maxLength":200,"minLength":3},{"type":"null"}],"title":"Registered Address Line"},"registered_city":{"anyOf":[{"type":"string","maxLength":120,"minLength":2},{"type":"null"}],"title":"Registered City"},"registered_postcode":{"anyOf":[{"type":"string","pattern":"^[0-9]{5}$"},{"type":"null"}],"title":"Registered Postcode"},"registered_province":{"anyOf":[{"type":"string","pattern":"^[A-Za-z]{2}$"},{"type":"null"}],"title":"Registered Province"},"site_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":500,"title":"Site Ids"},"new_sites":{"items":{"$ref":"#/components/schemas/NewSite"},"type":"array","maxItems":10,"title":"New Sites"},"contact_person":{"anyOf":[{"type":"string","maxLength":120,"minLength":2},{"type":"null"}],"title":"Contact Person"},"contact_role":{"anyOf":[{"type":"string","pattern":"^(owner|director|site_manager|consultant)$"},{"type":"null"}],"title":"Contact Role"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string","pattern":"^\\+?[0-9][0-9 ./-]{4,24}$"},{"type":"null"}],"title":"Phone"},"self_certified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Self Certified"},"terms_version":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Terms Version"},"request_context_token":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Request Context Token"}},"type":"object","title":"SignupAnswers","description":"Everything the steps ask. Every field is optional here so that a step\ncan be validated with what has been answered so far; `missing_through`\nsays which must be there."},"SignupCentre":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"operator_name":{"type":"string","title":"Operator Name"},"address":{"type":"string","title":"Address"},"city":{"type":"string","title":"City"},"managed":{"type":"boolean","title":"Managed"},"path":{"type":"string","title":"Path"}},"type":"object","required":["site_id","name","operator_name","address","city","managed","path"],"title":"SignupCentre","description":"A listed centre as the picker shows it: what its public page says."},"SignupDuplicate":{"properties":{"new_index":{"type":"integer","title":"New Index"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["new_index","site_id","name"],"title":"SignupDuplicate","description":"A centre added by hand that looks like one already listed."},"SignupMatch":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"operator_name":{"type":"string","title":"Operator Name"},"site_name":{"type":"string","title":"Site Name"},"address_line":{"type":"string","title":"Address Line"},"city":{"type":"string","title":"City"},"managed":{"type":"boolean","title":"Managed"},"strong":{"type":"boolean","title":"Strong"},"kind":{"type":"string","title":"Kind"},"sibling_site_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Sibling Site Ids"}},"type":"object","required":["site_id","operator_name","site_name","address_line","city","managed","strong","kind","sibling_site_ids"],"title":"SignupMatch"},"SignupRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":72,"minLength":10,"title":"Password"},"role":{"type":"string","title":"Role","default":"client"},"full_name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Full Name"},"phone":{"anyOf":[{"type":"string","maxLength":32,"minLength":5},{"type":"null"}],"title":"Phone"}},"type":"object","required":["email","password"],"title":"SignupRequest"},"SignupStep":{"properties":{"id":{"type":"string","title":"Id"},"milestone":{"type":"string","title":"Milestone"}},"type":"object","required":["id","milestone"],"title":"SignupStep"},"SignupStepResponse":{"properties":{"step":{"type":"string","title":"Step"},"next_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Step"},"matches":{"items":{"$ref":"#/components/schemas/SignupMatch"},"type":"array","title":"Matches"},"probable_centres":{"items":{"$ref":"#/components/schemas/SignupCentre"},"type":"array","title":"Probable Centres"},"duplicates":{"items":{"$ref":"#/components/schemas/SignupDuplicate"},"type":"array","title":"Duplicates"},"terms_version":{"type":"string","title":"Terms Version"},"operators_contact_email":{"type":"string","title":"Operators Contact Email"}},"type":"object","required":["step","next_step","matches","probable_centres","duplicates","terms_version","operators_contact_email"],"title":"SignupStepResponse"},"SignupUpgraded":{"properties":{"seller_profile_id":{"type":"string","format":"uuid","title":"Seller Profile Id"},"slug":{"type":"string","title":"Slug"}},"type":"object","required":["seller_profile_id","slug"],"title":"SignupUpgraded"},"SiteAvailabilityResponse":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"published":{"type":"boolean","title":"Published"},"occupancy_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Occupancy Pct"},"sizes":{"items":{"$ref":"#/components/schemas/SizeAvailability"},"type":"array","title":"Sizes"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["site_id","name","published","occupancy_pct","sizes","updated_at"],"title":"SiteAvailabilityResponse","description":"A centre's declared space, as its operator reads and edits it."},"SiteAvailabilityUpdate":{"properties":{"occupancy_pct":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Occupancy Pct"},"small":{"anyOf":[{"type":"string","enum":["available","limited","full"]},{"type":"null"}],"title":"Small"},"medium":{"anyOf":[{"type":"string","enum":["available","limited","full"]},{"type":"null"}],"title":"Medium"},"large":{"anyOf":[{"type":"string","enum":["available","limited","full"]},{"type":"null"}],"title":"Large"}},"additionalProperties":false,"type":"object","title":"SiteAvailabilityUpdate","description":"What an operator declares about a centre's space (0036). The whole\ndeclaration every time: a field sent as null, or left out, is no longer\ndeclared."},"SiteCreateRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"},"address_line":{"type":"string","minLength":1,"title":"Address Line"},"city":{"type":"string","minLength":1,"title":"City"},"country_code":{"type":"string","maxLength":2,"minLength":2,"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"access_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Rules"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"},"min_term_months":{"type":"integer","minimum":1.0,"title":"Min Term Months","default":1},"notice_period_days":{"type":"integer","minimum":0.0,"title":"Notice Period Days","default":15},"grace_period_days":{"type":"integer","minimum":0.0,"title":"Grace Period Days","default":7},"category":{"type":"string","enum":["self_storage","container_yard","mover_depository"],"title":"Category","default":"self_storage"},"price_unit":{"type":"string","enum":["m2","m3"],"title":"Price Unit","default":"m2"},"ignore_duplicate":{"type":"boolean","title":"Ignore Duplicate","default":false}},"type":"object","required":["name","address_line","city","country_code"],"title":"SiteCreateRequest"},"SiteEarnings":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"collected_cents":{"type":"integer","title":"Collected Cents"},"due_cents":{"type":"integer","title":"Due Cents"},"run_rate_cents":{"type":"integer","title":"Run Rate Cents"}},"type":"object","required":["site_id","name","collected_cents","due_cents","run_rate_cents"],"title":"SiteEarnings"},"SitePatchRequest":{"properties":{"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Description"},"access_rules":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Access Rules"},"amenities":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Amenities"},"opening_hours":{"anyOf":[{"$ref":"#/components/schemas/OpeningHours"},{"type":"null"}]},"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":2},{"type":"null"}],"title":"Name"},"brand_label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Brand Label"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"website":{"anyOf":[{"type":"string","maxLength":300,"pattern":"^https://[^\\s]+$"},{"type":"null"}],"title":"Website"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"},"declared_min_m2":{"anyOf":[{"type":"number","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Declared Min M2"},"declared_max_m2":{"anyOf":[{"type":"number","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Declared Max M2"},"min_term_months":{"anyOf":[{"type":"integer","maximum":120.0,"minimum":1.0},{"type":"null"}],"title":"Min Term Months"},"notice_period_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Notice Period Days"},"grace_period_days":{"anyOf":[{"type":"integer","maximum":90.0,"minimum":0.0},{"type":"null"}],"title":"Grace Period Days"},"price_unit":{"anyOf":[{"type":"string","enum":["m2","m3"]},{"type":"null"}],"title":"Price Unit"},"operator_reference":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Operator Reference"},"address_line":{"anyOf":[{"type":"string","maxLength":200,"minLength":3},{"type":"null"}],"title":"Address Line"},"city":{"anyOf":[{"type":"string","maxLength":120,"minLength":2},{"type":"null"}],"title":"City"},"postcode":{"anyOf":[{"type":"string","pattern":"^[0-9]{5}$"},{"type":"null"}],"title":"Postcode"},"province":{"anyOf":[{"type":"string","pattern":"^[A-Za-z]{2}$"},{"type":"null"}],"title":"Province"}},"type":"object","title":"SitePatchRequest","description":"What an operator changes about a centre. A field left out is left as it\nis. Of the fields added on 10 October 2026, the ones that can be empty\n(`brand_label`, `phone`, `website`, `contact_email`, the declared sizes,\n`postcode`, `province`, `operator_reference`) are cleared by sending\n`null`; the four older ones keep reading `null` as \"unchanged\".\n\n`website` and `contact_email` are stored and linked, never requested\n(SSRF-1). The address is one group: any of its four fields is a change of\naddress, applied at once on a centre that has never been public and held\nfor an admin on one that has."},"SiteResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"address_line":{"type":"string","title":"Address Line"},"city":{"type":"string","title":"City"},"country_code":{"type":"string","title":"Country Code"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"access_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Rules"},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities"},"min_term_months":{"type":"integer","title":"Min Term Months"},"notice_period_days":{"type":"integer","title":"Notice Period Days"},"grace_period_days":{"type":"integer","title":"Grace Period Days"},"published":{"type":"boolean","title":"Published"},"unit_count":{"type":"integer","title":"Unit Count","default":0},"cover_photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Photo Url"},"opening_hours":{"anyOf":[{"$ref":"#/components/schemas/OpeningHours"},{"type":"null"}]},"slug":{"type":"string","title":"Slug"},"public_path":{"type":"string","title":"Public Path"},"category":{"type":"string","enum":["self_storage","container_yard","mover_depository"],"title":"Category"},"price_unit":{"type":"string","enum":["m2","m3"],"title":"Price Unit"},"listing_rung":{"type":"integer","title":"Listing Rung"},"brand_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Label"},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postcode"},"province":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Province"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"declared_min_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Min M2"},"declared_max_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Declared Max M2"},"operator_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator Reference"},"address_change":{"anyOf":[{"$ref":"#/components/schemas/AddressChange"},{"type":"null"}]},"claim_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Status"},"claim_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Claim Id"},"draft":{"type":"boolean","title":"Draft","default":false},"signage_required":{"type":"boolean","title":"Signage Required","default":false},"signage_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signage Code"},"signage_uploaded":{"type":"boolean","title":"Signage Uploaded","default":false}},"type":"object","required":["id","name","address_line","city","country_code","lat","lng","description","access_rules","amenities","min_term_months","notice_period_days","grace_period_days","published","slug","public_path","category","price_unit","listing_rung"],"title":"SiteResponse"},"SizeAvailability":{"properties":{"size":{"type":"string","enum":["small","medium","large"],"title":"Size"},"min_m2":{"type":"integer","title":"Min M2"},"max_m2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max M2"},"status":{"anyOf":[{"type":"string","enum":["available","limited","full"]},{"type":"null"}],"title":"Status"}},"type":"object","required":["size","min_m2","max_m2","status"],"title":"SizeAvailability","description":"One of the three sizes a centre's space is told in (0036), with its\nsquare metres and what the operator declared for it. The ranges come from\n`services/space_availability.py`: a page prints them and keeps no copy.\n\n`max_m2` is None for the last size, which has no upper end. `status` is\nNone when the operator has not said: \"on request\"."},"SlotGenerationResult":{"properties":{"created":{"type":"integer","title":"Created"},"already_there":{"type":"integer","title":"Already There"},"skipped_nonexistent":{"type":"integer","title":"Skipped Nonexistent"},"from_date":{"type":"string","format":"date","title":"From Date"},"to_date":{"type":"string","format":"date","title":"To Date"}},"type":"object","required":["created","already_there","skipped_nonexistent","from_date","to_date"],"title":"SlotGenerationResult"},"SlotOption":{"properties":{"slot_id":{"type":"string","format":"uuid","title":"Slot Id"},"site_id":{"type":"string","format":"uuid","title":"Site Id"},"starts_at":{"type":"string","format":"date-time","title":"Starts At"},"duration_min":{"type":"integer","title":"Duration Min"}},"type":"object","required":["slot_id","site_id","starts_at","duration_min"],"title":"SlotOption"},"SlotPatchRequest":{"properties":{"state":{"type":"string","title":"State"}},"type":"object","required":["state"],"title":"SlotPatchRequest"},"SlotPatternRequest":{"properties":{"from_date":{"type":"string","format":"date","title":"From Date"},"to_date":{"type":"string","format":"date","title":"To Date"},"duration_min":{"type":"integer","maximum":480.0,"minimum":15.0,"title":"Duration Min","default":45},"rules":{"items":{"$ref":"#/components/schemas/WeeklyRuleRequest"},"type":"array","maxItems":21,"minItems":1,"title":"Rules"}},"type":"object","required":["from_date","to_date","rules"],"title":"SlotPatternRequest","description":"A weekly pattern, materialised into rows. Not stored as a template.\n\nRe-posting the same pattern is a no-op, so a seller can adjust and re-run it\nwithout moving an appointment somebody already took."},"SpecialistMessageRequest":{"properties":{"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"},"operator_slug":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Operator Slug"},"text":{"type":"string","maxLength":4000,"minLength":1,"title":"Text"},"lat":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Lng"},"place_from_text":{"type":"boolean","title":"Place From Text","default":false}},"type":"object","required":["text"],"title":"SpecialistMessageRequest","description":"One customer turn. The browser holds an opaque id and never the transcript.\n\n`lat`/`lng` are optional: if the browser already knows where the customer is\nit saves a geocode, and if it does not, the model repeats the place name and\nthe existing geocoder reads it."},"SpecialistMessageResponse":{"properties":{"conversation_id":{"type":"string","format":"uuid","title":"Conversation Id"},"reply":{"type":"string","title":"Reply"},"reading":{"$ref":"#/components/schemas/SpecialistReading"},"resolution":{"anyOf":[{"$ref":"#/components/schemas/SpecialistResolution"},{"type":"null"}]},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"turns_left":{"type":"integer","title":"Turns Left"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"}},"type":"object","required":["conversation_id","reply","reading","resolution","lat","lng","turns_left"],"title":"SpecialistMessageResponse"},"SpecialistOverview":{"properties":{"size_class_m2":{"type":"integer","title":"Size Class M2"},"radius_km":{"type":"number","title":"Radius Km"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"options":{"items":{"$ref":"#/components/schemas/OverviewOptionOut"},"type":"array","title":"Options"}},"type":"object","required":["size_class_m2","radius_km","features","options"],"title":"SpecialistOverview"},"SpecialistOverviewRequest":{"properties":{"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lng":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"operator_slug":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Operator Slug"},"radius_km":{"type":"number","maximum":100.0,"exclusiveMinimum":0.0,"title":"Radius Km","default":25.0},"features":{"items":{"type":"string"},"type":"array","title":"Features"}},"type":"object","required":["lat","lng","size_class_m2"],"title":"SpecialistOverviewRequest","description":"The comparison table's question (M6.18): the same request, a chosen radius.\n\nCapped at the radius `resolve` already widens to on a miss. Past 100 km a\ncentre is another city, and the operator's own coverage line says so better."},"SpecialistReading":{"properties":{"size_class_m2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Class M2"},"size_band":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size Band"},"volume_m3_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume M3 Min"},"volume_m3_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume M3 Max"},"duration_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Months"},"constraints":{"items":{"type":"string"},"type":"array","title":"Constraints"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"confidence":{"type":"number","title":"Confidence"},"reasoning":{"type":"string","title":"Reasoning"},"class_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Note"},"next_question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Question"}},"type":"object","required":["size_class_m2","volume_m3_min","volume_m3_max","duration_months","constraints","features","confidence","reasoning","class_note","next_question"],"title":"SpecialistReading","description":"How the request was read. Prose and estimates — never availability.\n\nAvailability lives in `SpecialistMessageResponse.resolution`, which Python\ncomputed. Keeping them in separate objects is what stops a client from\nrendering the model's guess as a fact (M6.0)."},"SpecialistResolution":{"properties":{"size_class_m2":{"type":"integer","title":"Size Class M2"},"band_min_m2":{"type":"number","title":"Band Min M2"},"band_max_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Band Max M2"},"radius_km":{"type":"number","title":"Radius Km"},"free_count":{"type":"integer","title":"Free Count"},"centres":{"items":{"$ref":"#/components/schemas/ResolvedCentre"},"type":"array","title":"Centres"},"alternatives":{"items":{"$ref":"#/components/schemas/ResolvedAlternative"},"type":"array","title":"Alternatives"},"zero_results":{"type":"boolean","title":"Zero Results"},"sites_in_range":{"type":"integer","title":"Sites In Range","default":0},"coverage":{"items":{"type":"string"},"type":"array","title":"Coverage"},"unavailable_features":{"items":{"type":"string"},"type":"array","title":"Unavailable Features"},"frees_up":{"items":{"$ref":"#/components/schemas/ResolvedFreesUp"},"type":"array","title":"Frees Up"},"access_rules":{"items":{"type":"string"},"type":"array","title":"Access Rules"}},"type":"object","required":["size_class_m2","band_min_m2","band_max_m2","radius_km","free_count","centres","alternatives","zero_results"],"title":"SpecialistResolution"},"SpecialistResolveRequest":{"properties":{"lat":{"type":"number","maximum":90.0,"minimum":-90.0,"title":"Lat"},"lng":{"type":"number","maximum":180.0,"minimum":-180.0,"title":"Lng"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"operator_slug":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Operator Slug"},"radius_km":{"type":"number","maximum":500.0,"exclusiveMinimum":0.0,"title":"Radius Km","default":25.0},"features":{"items":{"type":"string"},"type":"array","title":"Features"}},"type":"object","required":["lat","lng","size_class_m2"],"title":"SpecialistResolveRequest","description":"What the conversation hands to the code that decides.\n\nA *size class*, not an area: the model proposes a rung of the published\nladder and `services/specialist` validates it against that ladder before any\nquery runs (M6.0). Nothing here is free text — this is the whole boundary\nbetween the half that interprets and the half that decides."},"SuggestedSite":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"address":{"type":"string","title":"Address"},"city":{"type":"string","title":"City"},"match_kind":{"type":"string","title":"Match Kind"},"source_operator_name":{"type":"string","title":"Source Operator Name"}},"type":"object","required":["site_id","name","address","city","match_kind","source_operator_name"],"title":"SuggestedSite","description":"A listed centre that looks like the caller's own (\"Forse sono tuoi\")."},"SuspensionReason":{"properties":{"code":{"type":"string","title":"Code"},"statement":{"type":"string","title":"Statement"}},"type":"object","required":["code","statement"],"title":"SuspensionReason"},"TeamInvitation":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["id","email","expires_at"],"title":"TeamInvitation"},"TeamMember":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"role":{"type":"string","enum":["owner","member"],"title":"Role"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"is_you":{"type":"boolean","title":"Is You"}},"type":"object","required":["id","email","role","joined_at","is_you"],"title":"TeamMember"},"TeamResponse":{"properties":{"members":{"items":{"$ref":"#/components/schemas/TeamMember"},"type":"array","title":"Members"},"invitations":{"items":{"$ref":"#/components/schemas/TeamInvitation"},"type":"array","title":"Invitations"},"can_manage_team":{"type":"boolean","title":"Can Manage Team"}},"type":"object","required":["members","invitations","can_manage_team"],"title":"TeamResponse"},"TermsPublished":{"properties":{"version":{"type":"string","title":"Version"},"effective_from":{"type":"string","format":"date","title":"Effective From"},"operators_told":{"type":"integer","title":"Operators Told"}},"type":"object","required":["version","effective_from","operators_told"],"title":"TermsPublished"},"TermsVersionCreate":{"properties":{"version":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{1,39}$","title":"Version"},"effective_from":{"type":"string","format":"date","title":"Effective From"},"text_it":{"type":"string","maxLength":60000,"minLength":20,"title":"Text It"},"text_en":{"type":"string","maxLength":60000,"minLength":20,"title":"Text En"},"summary_it":{"type":"string","maxLength":2000,"minLength":5,"title":"Summary It"},"summary_en":{"type":"string","maxLength":2000,"minLength":5,"title":"Summary En"}},"type":"object","required":["version","effective_from","text_it","text_en","summary_it","summary_en"],"title":"TermsVersionCreate","description":"A new version of the operator terms. It cannot take effect in under\n`TERMS_NOTICE_DAYS`, and every operator is told when it is published."},"TermsVersionOut":{"properties":{"version":{"type":"string","title":"Version"},"effective_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective From"},"in_force":{"type":"boolean","title":"In Force"},"text_it":{"type":"string","title":"Text It"},"text_en":{"type":"string","title":"Text En"},"summary_it":{"type":"string","title":"Summary It"},"summary_en":{"type":"string","title":"Summary En"}},"type":"object","required":["version","effective_from","in_force","text_it","text_en","summary_it","summary_en"],"title":"TermsVersionOut"},"ThreadMessageCreate":{"properties":{"body":{"type":"string","maxLength":2000,"minLength":1,"title":"Body"}},"additionalProperties":false,"type":"object","required":["body"],"title":"ThreadMessageCreate"},"ThreadMessageOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"sender":{"type":"string","title":"Sender"},"body":{"type":"string","title":"Body"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"read":{"type":"boolean","title":"Read"}},"type":"object","required":["id","sender","body","created_at","read"],"title":"ThreadMessageOut"},"TimelineStep":{"properties":{"step":{"type":"string","title":"Step"},"reached":{"type":"boolean","title":"Reached"}},"type":"object","required":["step","reached"],"title":"TimelineStep"},"TokenRequest":{"properties":{"token":{"type":"string","maxLength":200,"minLength":10,"title":"Token"}},"type":"object","required":["token"],"title":"TokenRequest"},"TokenResponse":{"properties":{"access":{"type":"string","title":"Access"},"refresh":{"type":"string","title":"Refresh"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access","refresh"],"title":"TokenResponse"},"UnitMixRow":{"properties":{"count":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Count"},"width_m":{"type":"number","exclusiveMinimum":0.0,"title":"Width M"},"depth_m":{"type":"number","exclusiveMinimum":0.0,"title":"Depth M"},"price_month_cents":{"type":"integer","minimum":0.0,"title":"Price Month Cents"},"unit_type":{"type":"string","title":"Unit Type","default":"unit"},"features":{"items":{"type":"string"},"type":"array","title":"Features"}},"type":"object","required":["count","width_m","depth_m","price_month_cents"],"title":"UnitMixRow"},"UnitPatchRequest":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"price_month_cents":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Price Month Cents"},"features":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Features"},"built_width_m":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Built Width M"},"built_depth_m":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Built Depth M"},"built_area_m2":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Built Area M2"},"designed_height_m":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Designed Height M"},"clear_height_m":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Clear Height M"},"dimension_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimension Source"},"measurement_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Measurement Method"},"dimension_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Dimension Verified At"}},"type":"object","title":"UnitPatchRequest"},"UnitPayload":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"label":{"type":"string","minLength":1,"title":"Label"},"x_m":{"type":"number","title":"X M"},"y_m":{"type":"number","title":"Y M"},"width_m":{"type":"number","exclusiveMinimum":0.0,"title":"Width M"},"depth_m":{"type":"number","exclusiveMinimum":0.0,"title":"Depth M"},"rotation":{"type":"integer","title":"Rotation","default":0},"unit_type":{"type":"string","title":"Unit Type","default":"unit"},"price_month_cents":{"type":"integer","minimum":0.0,"title":"Price Month Cents"},"features":{"items":{"type":"string"},"type":"array","title":"Features"}},"type":"object","required":["label","x_m","y_m","width_m","depth_m","price_month_cents"],"title":"UnitPayload"},"UnitResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"label":{"type":"string","title":"Label"},"x_m":{"type":"number","title":"X M"},"y_m":{"type":"number","title":"Y M"},"width_m":{"type":"number","title":"Width M"},"depth_m":{"type":"number","title":"Depth M"},"rotation":{"type":"integer","title":"Rotation"},"area_m2":{"type":"number","title":"Area M2"},"unit_type":{"type":"string","title":"Unit Type"},"price_month_cents":{"type":"integer","title":"Price Month Cents"},"next_price_month_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Price Month Cents"},"currency":{"type":"string","title":"Currency"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"is_locked":{"type":"boolean","title":"Is Locked"},"built_width_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Built Width M"},"built_depth_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Built Depth M"},"built_area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Built Area M2"},"designed_height_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Designed Height M"},"clear_height_m":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Clear Height M"},"dimension_source":{"type":"string","title":"Dimension Source"},"measurement_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Measurement Method"},"dimension_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Dimension Verified At"},"effective_area_m2":{"type":"number","title":"Effective Area M2"},"effective_height_m":{"type":"number","title":"Effective Height M"},"size_class_m2":{"type":"integer","title":"Size Class M2"},"drift_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Drift Ratio"},"needs_reclass":{"type":"boolean","title":"Needs Reclass"}},"type":"object","required":["id","label","x_m","y_m","width_m","depth_m","rotation","area_m2","unit_type","price_month_cents","next_price_month_cents","currency","features","is_locked","built_width_m","built_depth_m","built_area_m2","designed_height_m","clear_height_m","dimension_source","measurement_method","dimension_verified_at","effective_area_m2","effective_height_m","size_class_m2","drift_ratio","needs_reclass"],"title":"UnitResponse"},"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"},"VatDuplicateHolder":{"properties":{"operator_id":{"type":"string","format":"uuid","title":"Operator Id"},"business_name":{"type":"string","title":"Business Name"},"kyc_state":{"type":"string","title":"Kyc State"},"suspended":{"type":"boolean","title":"Suspended"},"releasable":{"type":"boolean","title":"Releasable"}},"type":"object","required":["operator_id","business_name","kyc_state","suspended","releasable"],"title":"VatDuplicateHolder","description":"The account that already has the VAT number an operator typed (0046)."},"VerificationAction":{"properties":{"kind":{"type":"string","title":"Kind"},"claim_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Claim Id"}},"type":"object","required":["kind"],"title":"VerificationAction"},"VerificationClaim":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"source_operator_name":{"type":"string","title":"Source Operator Name"},"status":{"type":"string","title":"Status"},"proof_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proof Method"},"sites":{"items":{"$ref":"#/components/schemas/ClaimSiteOut"},"type":"array","title":"Sites"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"reason_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Text"},"decision_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Note"}},"type":"object","required":["id","source_operator_name","status","proof_method","sites","reason_code","decision_note"],"title":"VerificationClaim"},"VerificationCorrection":{"properties":{"fields":{"items":{"type":"string"},"type":"array","title":"Fields"},"note":{"type":"string","title":"Note"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"values":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Values"}},"type":"object","required":["fields","note","requested_at","values"],"title":"VerificationCorrection","description":"What the operator is asked to give again, with what is on file for it.\nNever the VAT number."},"VerificationEvidence":{"properties":{"email_verified":{"type":"boolean","title":"Email Verified"},"vat_check_status":{"type":"string","title":"Vat Check Status"},"vat_check_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Check Name"},"legal_name_match_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Legal Name Match Score"},"vat_duplicate":{"type":"boolean","title":"Vat Duplicate"},"domain_match_any":{"type":"boolean","title":"Domain Match Any"},"pec_on_file":{"type":"boolean","title":"Pec On File"},"proof_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Proof Verified At"},"callback_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Callback At"},"self_certified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Self Certified At"},"terms_accepted_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms Accepted Version"},"register_connected":{"type":"boolean","title":"Register Connected","default":true}},"type":"object","required":["email_verified","vat_check_status","vat_check_name","legal_name_match_score","vat_duplicate","domain_match_any","pec_on_file","proof_verified_at","callback_at","self_certified_at","terms_accepted_version"],"title":"VerificationEvidence","description":"What has been collected about an operator so far, as the desk's pills."},"VerificationMember":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"}},"type":"object","required":["email","role"],"title":"VerificationMember"},"VerificationOperatorDetail":{"properties":{"operator_id":{"type":"string","format":"uuid","title":"Operator Id"},"business_name":{"type":"string","title":"Business Name"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"},"segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"age_days":{"type":"integer","title":"Age Days"},"sla_breached":{"type":"boolean","title":"Sla Breached"},"state":{"type":"string","title":"State"},"door":{"type":"string","title":"Door"},"open_claims":{"items":{"$ref":"#/components/schemas/AdminClaimRow"},"type":"array","title":"Open Claims"},"claimed_sites":{"type":"integer","title":"Claimed Sites"},"source_sites":{"type":"integer","title":"Source Sites"},"requests_waiting":{"type":"integer","title":"Requests Waiting"},"evidence":{"$ref":"#/components/schemas/VerificationEvidence"},"auto_approved_recent":{"type":"boolean","title":"Auto Approved Recent","default":false},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Decided At"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"owner_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner User Id"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"contact_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Role"},"legal_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Form"},"vat_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Number"},"fiscal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Code"},"registered_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registered Address"},"kyb_level":{"type":"integer","title":"Kyb Level"},"decision_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Note"},"suspended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Suspended At"},"suspension_reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suspension Reason Code"},"suspension_statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suspension Statement"},"termination_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Termination On"},"pec_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pec Email"},"pec_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pec Source"},"pec_recorded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pec Recorded At"},"register_counts":{"type":"boolean","title":"Register Counts","default":true},"correction_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Correction Fields"},"correction_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correction Note"},"correction_requested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Correction Requested At"},"vat_duplicate_of":{"anyOf":[{"$ref":"#/components/schemas/VatDuplicateHolder"},{"type":"null"}]},"first_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Verified At"},"pro_free_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Pro Free Until"},"sites":{"items":{"$ref":"#/components/schemas/VerificationOperatorSite"},"type":"array","title":"Sites"},"decided_claims":{"items":{"$ref":"#/components/schemas/AdminClaimRow"},"type":"array","title":"Decided Claims"},"members":{"items":{"$ref":"#/components/schemas/VerificationMember"},"type":"array","title":"Members"},"terms":{"items":{"$ref":"#/components/schemas/VerificationTermsRow"},"type":"array","title":"Terms"},"events":{"items":{"$ref":"#/components/schemas/KybEventRow"},"type":"array","title":"Events"}},"type":"object","required":["operator_id","business_name","legal_name","segment","created_at","age_days","sla_breached","state","door","open_claims","claimed_sites","source_sites","requests_waiting","evidence","owner_email","contact_phone","contact_role","legal_form","vat_number","fiscal_code","registered_address","kyb_level","decision_note","sites","decided_claims","members","terms","events"],"title":"VerificationOperatorDetail","description":"The row, and everything the detail page shows. The one schema that\ncarries the VAT number beside the owner's own copy: an admin needs it to\nlook the business up in the public registers."},"VerificationOperatorSite":{"properties":{"site_id":{"type":"string","format":"uuid","title":"Site Id"},"name":{"type":"string","title":"Name"},"city":{"type":"string","title":"City"},"address_line":{"type":"string","title":"Address Line"},"published":{"type":"boolean","title":"Published"},"listing_rung":{"type":"integer","title":"Listing Rung"},"public_path":{"type":"string","title":"Public Path"},"address_change":{"anyOf":[{"$ref":"#/components/schemas/AddressChange"},{"type":"null"}]}},"type":"object","required":["site_id","name","city","address_line","published","listing_rung","public_path"],"title":"VerificationOperatorSite"},"VerificationProof":{"properties":{"claim_id":{"type":"string","format":"uuid","title":"Claim Id"},"method":{"type":"string","title":"Method"},"state":{"type":"string","title":"State"},"sent_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sent To"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"attempts_left":{"type":"integer","title":"Attempts Left"}},"type":"object","required":["claim_id","method","state","sent_to","sent_at","expires_at","attempts_left"],"title":"VerificationProof","description":"The code an operator has to type, as the card shows it. The address is\nmasked: every member reads the card."},"VerificationQueueRow":{"properties":{"operator_id":{"type":"string","format":"uuid","title":"Operator Id"},"business_name":{"type":"string","title":"Business Name"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"},"segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"age_days":{"type":"integer","title":"Age Days"},"sla_breached":{"type":"boolean","title":"Sla Breached"},"state":{"type":"string","title":"State"},"door":{"type":"string","title":"Door"},"open_claims":{"items":{"$ref":"#/components/schemas/AdminClaimRow"},"type":"array","title":"Open Claims"},"claimed_sites":{"type":"integer","title":"Claimed Sites"},"source_sites":{"type":"integer","title":"Source Sites"},"requests_waiting":{"type":"integer","title":"Requests Waiting"},"evidence":{"$ref":"#/components/schemas/VerificationEvidence"},"auto_approved_recent":{"type":"boolean","title":"Auto Approved Recent","default":false},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Decided At"}},"type":"object","required":["operator_id","business_name","legal_name","segment","created_at","age_days","sla_breached","state","door","open_claims","claimed_sites","source_sites","requests_waiting","evidence"],"title":"VerificationQueueRow","description":"One operator with something to decide."},"VerificationSuspension":{"properties":{"since":{"type":"string","format":"date-time","title":"Since"},"statement":{"type":"string","title":"Statement"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"termination_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Termination On"},"complaints_email":{"type":"string","title":"Complaints Email","default":""}},"type":"object","required":["since","statement"],"title":"VerificationSuspension","description":"Why the account is suspended, as the operator reads it, and where to\ncontest it (Regulation (EU) 2019/1150, article 4)."},"VerificationTerms":{"properties":{"accepted":{"type":"boolean","title":"Accepted"},"version":{"type":"string","title":"Version"},"accepted_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accepted By"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At"},"outdated":{"type":"boolean","title":"Outdated","default":false},"effective_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective From"},"grace_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Grace Until"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"upcoming":{"anyOf":[{"$ref":"#/components/schemas/VerificationTermsUpcoming"},{"type":"null"}]}},"type":"object","required":["accepted","version","accepted_by","accepted_at"],"title":"VerificationTerms"},"VerificationTermsRow":{"properties":{"version":{"type":"string","title":"Version"},"accepted_at":{"type":"string","format":"date-time","title":"Accepted At"},"accepted_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accepted By"}},"type":"object","required":["version","accepted_at","accepted_by"],"title":"VerificationTermsRow"},"VerificationTermsUpcoming":{"properties":{"version":{"type":"string","title":"Version"},"effective_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective From"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"}},"type":"object","required":["version","effective_from"],"title":"VerificationTermsUpcoming","description":"A version announced and not yet in force, which the operator may\nalready accept."},"VisitOrigin":{"properties":{"source":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Source"},"referrer":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Referrer"},"page":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Page"}},"additionalProperties":false,"type":"object","title":"VisitOrigin","description":"What the browser kept from the first page of the visit (M6): that\npage's `utm_source`, the host that linked to it and its path. Untrusted,\nall of it: `services/origin.py` decides what it means."},"WeeklyRuleRequest":{"properties":{"weekday":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Weekday"},"start_time":{"type":"string","format":"time","title":"Start Time"},"end_time":{"type":"string","format":"time","title":"End Time"}},"type":"object","required":["weekday","start_time","end_time"],"title":"WeeklyRuleRequest"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-Access-Token"},"HTTPBearer":{"type":"http","scheme":"bearer"}}}}