{"openapi":"3.1.0","info":{"title":"thankyou.ke API","description":"Digital tips for teams in Kenya. Agents: start at https://thankyou.ke/llms.txt. Auth: 'Authorization: Bearer ty_...' (POST /api/agent/signup or /api/agent/connect).","version":"1.0.0"},"paths":{"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/properties":{"get":{"summary":"List Properties","description":"Public directory — v2 §6: ONLY listed tenants (default private).\n\nResponse shape unchanged, just filtered; empty until an owner opts\nin via the super-admin wizard's ``listed`` flag.","operationId":"list_properties_api_properties_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/properties/{slug}":{"get":{"summary":"Property Detail","description":"Public property payload (v3 §3.3): gains allow_individual_tips +\nthe active staff id+name pairs (T4: NEVER phone/weight/days). Fields\nare ALWAYS present — when the flag is off the picker is empty and\nthe client keeps the byte-identical v2 guest screen.","operationId":"property_detail_api_properties__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/login":{"post":{"summary":"Admin Login","description":"Login with v2 hardening (plan §5): per-account lockout, per-IP\nwindow, generic anti-enumeration 401, hashed-only attempt ledger.","operationId":"admin_login_api_admin_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_login_api_admin_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/logout":{"post":{"summary":"Admin Logout","operationId":"admin_logout_api_admin_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/whoami":{"get":{"summary":"Admin Whoami","description":"Session probe for the SPA guard: 200 + the session user when the\nty_session cookie resolves, 401 otherwise. (GET, so it never needs\nthe Origin guard; reads nothing but the caller's own identity.)\nUnverified sign-ups get it too, with ``email_verified: false``.\n``?property=`` (a branch of the login's business) describes that place.","operationId":"admin_whoami_api_admin_whoami_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/summary":{"get":{"summary":"Admin Summary","operationId":"admin_summary_api_admin_summary_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tips":{"get":{"summary":"Admin Tips","description":"All credited tips, newest first, paged — the History tab's list\n(same rows and payout status as the dashboard's recent tips).","operationId":"admin_tips_api_admin_tips_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tips/{tip_id}":{"get":{"summary":"Admin Tip Detail","description":"One tip in full: its journey and who got what from it.","operationId":"admin_tip_detail_api_admin_tips__tip_id__get","parameters":[{"name":"tip_id","in":"path","required":true,"schema":{"type":"string","title":"Tip Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/test-mode":{"get":{"summary":"Test Mode Get","operationId":"test_mode_get_api_admin_test_mode_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Test Mode Set","description":"Switch test mode. While on, guests can't pay for real: checkout is\nour own test page and payouts are recorded, not sent. Test tips and\npayouts live in their own ledger, so real money is never touched.","operationId":"test_mode_set_api_admin_test_mode_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestModeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/settings":{"get":{"summary":"Settings Get","description":"Tenant-scoped settings read. The property comes from the ACTOR —\na tenant can only ever see their own; other tenants' existence is\nnot disclosed.","operationId":"settings_get_api_admin_settings_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Settings Patch","description":"Persist guest-facing settings (flag, headline, chips).\nMutation → same Origin CSRF posture as the other admin writes.","operationId":"settings_patch_api_admin_settings_patch","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/staff":{"get":{"summary":"Staff List","operationId":"staff_list_api_admin_staff_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Staff Add","operationId":"staff_add_api_admin_staff_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/staff/{staff_id}":{"patch":{"summary":"Staff Edit","operationId":"staff_edit_api_admin_staff__staff_id__patch","parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"string","title":"Staff Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Staff Remove","operationId":"staff_remove_api_admin_staff__staff_id__delete","parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"string","title":"Staff Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/temps":{"get":{"summary":"Temps List","operationId":"temps_list_api_admin_temps_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Temps Save","description":"Save a temp (or update the saved one with the same number).","operationId":"temps_save_api_admin_temps_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TempIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/temps/{temp_id}":{"patch":{"summary":"Temps Update","description":"Edit a saved temp (name, number, share) from the Team page.","operationId":"temps_update_api_admin_temps__temp_id__patch","parameters":[{"name":"temp_id","in":"path","required":true,"schema":{"type":"string","title":"Temp Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TempIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Temps Forget","operationId":"temps_forget_api_admin_temps__temp_id__delete","parameters":[{"name":"temp_id","in":"path","required":true,"schema":{"type":"string","title":"Temp Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/named-tips":{"get":{"summary":"Named Tips Unmatched","description":"Tips guests left for a name that isn't on the team list.","operationId":"named_tips_unmatched_api_admin_named_tips_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/named-tips/{allocation_id}/resolve":{"post":{"summary":"Named Tip Resolve","description":"Match a written-in name to a team member, or give it to the team.","operationId":"named_tip_resolve_api_admin_named_tips__allocation_id__resolve_post","parameters":[{"name":"allocation_id","in":"path","required":true,"schema":{"type":"string","title":"Allocation Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveNamedTip"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/qr/{slug}":{"get":{"summary":"Admin Qr","operationId":"admin_qr_api_admin_qr__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tenants":{"get":{"summary":"Tenants List","operationId":"tenants_list_api_admin_tenants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Tenants Create","operationId":"tenants_create_api_admin_tenants_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tenants/{slug}/status":{"patch":{"summary":"Tenants Status","description":"Archive (active=false) or restore a property. Archived: the guest page\nand new tips stop, it leaves the Properties list; nothing is deleted and\nits ledger and logins stay intact.","operationId":"tenants_status_api_admin_tenants__slug__status_patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantStatus"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tenants/{slug}/billing":{"patch":{"summary":"Tenants Billing","description":"Set a property's platform fee and/or subscription plan (partial).\nA fee change applies to tips credited from now on; already-credited\ntips keep the net they were credited with.","operationId":"tenants_billing_api_admin_tenants__slug__billing_patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantBilling"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/disburse/preview":{"post":{"summary":"Disburse Preview","operationId":"disburse_preview_api_admin_disburse_preview_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisbursePreviewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/disburse/execute":{"post":{"summary":"Disburse Execute","operationId":"disburse_execute_api_admin_disburse_execute_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisburseExecuteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/disburse/schedule":{"post":{"summary":"Disburse Schedule","description":"Retired: booking ahead had to split money that wasn't there yet.\nOwners are emailed when tips are ready instead (payout_ready.py).\nExisting bookings still run and can be cancelled (DELETE below).","operationId":"disburse_schedule_api_admin_disburse_schedule_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisburseExecuteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Disburse Schedule Cancel","operationId":"disburse_schedule_cancel_api_admin_disburse_schedule_delete","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/payouts":{"get":{"summary":"Payouts History","description":"Payout history: runs (newest first, paged) with their per-person\nlines and live statuses (transfer webhooks keep them current).","operationId":"payouts_history_api_admin_payouts_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/payouts/lines/{line_id}/retry":{"post":{"summary":"Payout Line Retry","description":"Send one failed payment again: the same person, the same amount,\nto their current (or the given) M-Pesa number. Nobody else's money\nmoves; the payout boundary doesn't move.","operationId":"payout_line_retry_api_admin_payouts_lines__line_id__retry_post","parameters":[{"name":"line_id","in":"path","required":true,"schema":{"type":"string","title":"Line Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform/payout-lines/{line_id}/settle":{"post":{"summary":"Payout Line Settle","description":"Super admin: a failed payment was paid to the person outside the\napp (e.g. M-Pesa from the bank). Marks the line with a note; a line\nstill owed stops being owed. Its money doesn't go to the team.","operationId":"payout_line_settle_api_platform_payout_lines__line_id__settle_post","parameters":[{"name":"line_id","in":"path","required":true,"schema":{"type":"string","title":"Line Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tips/initiate":{"post":{"summary":"Tips Initiate","operationId":"tips_initiate_api_tips_initiate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TipInitiate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/paystack":{"post":{"summary":"Paystack Webhook","operationId":"paystack_webhook_api_webhooks_paystack_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tips/status/{paystack_reference}":{"get":{"summary":"Tip Status","description":"PUBLIC receipt polling — safe fields only, zero PII (R5).\n\nReads the transactions row; never touches staff, disbursements, or\nthe webhook's raw payload. A slow webhook is covered by\nreconcile-on-read (see _maybe_reconcile).","operationId":"tip_status_api_tips_status__paystack_reference__get","parameters":[{"name":"paystack_reference","in":"path","required":true,"schema":{"type":"string","title":"Paystack Reference"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tips/test-settle":{"post":{"summary":"Tip Test Settle","description":"Settle a TEST tip from the test checkout. Only ever touches rows in\na test ledger (no money exists behind them); a real tip's reference is\na 404 here. The fee is simulated at Paystack's rate for the method, so\nthe team's share looks exactly as it would for real.","operationId":"tip_test_settle_api_tips_test_settle_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSettleIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stand/{slug}":{"get":{"summary":"Stand Info","operationId":"stand_info_api_admin_stand__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stand/{slug}/tent.pdf":{"get":{"summary":"Stand Tent Pdf","description":"The table stand: the property's own QR, or ?staff=<id> / ?staff=all for personal stands.","operationId":"stand_tent_pdf_api_admin_stand__slug__tent_pdf_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"staff","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Staff"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stand/{slug}/face.svg":{"get":{"summary":"Stand Face Svg","operationId":"stand_face_svg_api_admin_stand__slug__face_svg_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"laser","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Laser"}},{"name":"download","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Download"}},{"name":"staff","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Staff"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stand/{slug}/cards.pdf":{"get":{"summary":"Stand Cards Pdf","description":"QR cards: everyone on the team, one person (?staff=), or a sheet of whole-team cards (?team=1).","operationId":"stand_cards_pdf_api_admin_stand__slug__cards_pdf_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"staff","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Staff"}},{"name":"team","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Team"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stand/{slug}/staff/{staff_id}/qr.png":{"get":{"summary":"Stand Staff Qr","description":"One person's QR code: opens the tip page with them already chosen.","operationId":"stand_staff_qr_api_admin_stand__slug__staff__staff_id__qr_png_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"staff_id","in":"path","required":true,"schema":{"type":"string","title":"Staff Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stand/{slug}/logo":{"put":{"summary":"Stand Logo Put","operationId":"stand_logo_put_api_admin_stand__slug__logo_put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_stand_logo_put_api_admin_stand__slug__logo_put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Stand Logo Delete","operationId":"stand_logo_delete_api_admin_stand__slug__logo_delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/staff/{staff_id}/photo":{"put":{"summary":"Staff Photo Put","operationId":"staff_photo_put_api_admin_staff__staff_id__photo_put","parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"string","title":"Staff Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_staff_photo_put_api_admin_staff__staff_id__photo_put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Staff Photo Delete","operationId":"staff_photo_delete_api_admin_staff__staff_id__photo_delete","parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"string","title":"Staff Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/staff-photo/{staff_id}":{"get":{"summary":"Staff Photo Get","operationId":"staff_photo_get_api_staff_photo__staff_id__get","parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"string","title":"Staff Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/signup":{"post":{"summary":"Signup","operationId":"signup_api_account_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/verify":{"post":{"summary":"Verify Email","operationId":"verify_email_api_account_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/verify/resend":{"post":{"summary":"Verify Resend","operationId":"verify_resend_api_account_verify_resend_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/options":{"get":{"summary":"Options","operationId":"options_api_account_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/forgot":{"post":{"summary":"Forgot","operationId":"forgot_api_account_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/reset":{"post":{"summary":"Reset","operationId":"reset_api_account_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/password":{"post":{"summary":"Change Password","operationId":"change_password_api_account_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/magic":{"get":{"summary":"Magic Login","description":"Dev-only sign-in link (Janna, 22 Oct): open a test build signed in.","operationId":"magic_login_api_account_magic_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"/admin","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/verification":{"get":{"summary":"Verification Get","operationId":"verification_get_api_admin_verification_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Verification Patch","operationId":"verification_patch_api_admin_verification_patch","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/verification/documents/{kind}":{"put":{"summary":"Verification Upload","operationId":"verification_upload_api_admin_verification_documents__kind__put","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_verification_upload_api_admin_verification_documents__kind__put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/verification/documents/{doc_id}":{"get":{"summary":"Verification Download","description":"Only the property's own admins and the platform owner. Another\nproperty's document id is a 404, exactly like a missing one.","operationId":"verification_download_api_admin_verification_documents__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/verification/submit":{"post":{"summary":"Verification Submit","operationId":"verification_submit_api_admin_verification_submit_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/verification-queue":{"get":{"summary":"Verification Queue","operationId":"verification_queue_api_admin_verification_queue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/tenants/{slug}/verification/approve":{"post":{"summary":"Tenant Approve","operationId":"tenant_approve_api_admin_tenants__slug__verification_approve_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tenants/{slug}/verification/reject":{"post":{"summary":"Tenant Reject","operationId":"tenant_reject_api_admin_tenants__slug__verification_reject_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/managers":{"get":{"summary":"Managers List","operationId":"managers_list_api_admin_managers_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Managers Add","operationId":"managers_add_api_admin_managers_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagerIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/managers/{user_id}/resend":{"post":{"summary":"Managers Resend","operationId":"managers_resend_api_admin_managers__user_id__resend_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/managers/{user_id}":{"delete":{"summary":"Managers Remove","description":"Deleting the login ends every session at once (a session resolves\nits user on each request).","operationId":"managers_remove_api_admin_managers__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Managers Role","description":"Make someone an owner, or an owner a manager. Not yourself; the place\nalways keeps at least one owner.","operationId":"managers_role_api_admin_managers__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/managers/{user_id}/places":{"put":{"summary":"Managers Places","description":"Which branches a manager runs. Owners always run every place.","operationId":"managers_places_api_admin_managers__user_id__places_put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlacesIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/managers/{user_id}/emails":{"put":{"summary":"Managers Emails","description":"An owner switches an email kind on or off for anyone in the place.","operationId":"managers_emails_api_admin_managers__user_id__emails_put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPrefIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/my-emails":{"get":{"summary":"My Emails","operationId":"my_emails_api_admin_my_emails_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"My Emails Set","operationId":"my_emails_set_api_admin_my_emails_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPrefIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/branches":{"get":{"summary":"Branches List","operationId":"branches_list_api_admin_branches_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Branches Add","operationId":"branches_add_api_admin_branches_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/periods":{"get":{"summary":"Periods List","operationId":"periods_list_api_admin_periods_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Period Create","operationId":"period_create_api_admin_periods_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeriodIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/periods/skip-tips":{"post":{"summary":"Period Skip Tips","description":"\"Not from a booking\": these tips stay with the team's general pot and\naren't asked about again (``undo``: ask again).","operationId":"period_skip_tips_api_admin_periods_skip_tips_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkipIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/periods/tips/{tip_id}/options":{"get":{"summary":"Period Tip Options","description":"\"Change booking\": the other bookings a tip could belong to.","operationId":"period_tip_options_api_admin_periods_tips__tip_id__options_get","parameters":[{"name":"tip_id","in":"path","required":true,"schema":{"type":"string","title":"Tip Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/periods/{period_id}":{"get":{"summary":"Period Get","operationId":"period_get_api_admin_periods__period_id__get","parameters":[{"name":"period_id","in":"path","required":true,"schema":{"type":"string","title":"Period Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Period Patch","operationId":"period_patch_api_admin_periods__period_id__patch","parameters":[{"name":"period_id","in":"path","required":true,"schema":{"type":"string","title":"Period Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeriodPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Period Delete","operationId":"period_delete_api_admin_periods__period_id__delete","parameters":[{"name":"period_id","in":"path","required":true,"schema":{"type":"string","title":"Period Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/periods/{period_id}/preview":{"post":{"summary":"Period Preview","description":"The split with unsaved days (the page's live amounts). No writes.","operationId":"period_preview_api_admin_periods__period_id__preview_post","parameters":[{"name":"period_id","in":"path","required":true,"schema":{"type":"string","title":"Period Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DaysIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/periods/{period_id}/tips":{"post":{"summary":"Period Add Tips","operationId":"period_add_tips_api_admin_periods__period_id__tips_post","parameters":[{"name":"period_id","in":"path","required":true,"schema":{"type":"string","title":"Period Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTipsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/periods/{period_id}/tips/{tip_id}":{"delete":{"summary":"Period Remove Tip","operationId":"period_remove_tip_api_admin_periods__period_id__tips__tip_id__delete","parameters":[{"name":"period_id","in":"path","required":true,"schema":{"type":"string","title":"Period Id"}},{"name":"tip_id","in":"path","required":true,"schema":{"type":"string","title":"Tip Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/periods/{period_id}/sign":{"post":{"summary":"Period Sign","operationId":"period_sign_api_admin_periods__period_id__sign_post","parameters":[{"name":"period_id","in":"path","required":true,"schema":{"type":"string","title":"Period Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DaysIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/periods/{period_id}/unsign":{"post":{"summary":"Period Unsign","operationId":"period_unsign_api_admin_periods__period_id__unsign_post","parameters":[{"name":"period_id","in":"path","required":true,"schema":{"type":"string","title":"Period Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/periods/{period_id}/resend":{"post":{"summary":"Period Resend","operationId":"period_resend_api_admin_periods__period_id__resend_post","parameters":[{"name":"period_id","in":"path","required":true,"schema":{"type":"string","title":"Period Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tips/{tip_id}/pay/preview":{"post":{"summary":"Tip Pay Preview","description":"Who gets what if this tip is paid out on its own. No writes.","operationId":"tip_pay_preview_api_admin_tips__tip_id__pay_preview_post","parameters":[{"name":"tip_id","in":"path","required":true,"schema":{"type":"string","title":"Tip Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DaysIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tips/{tip_id}/pay":{"post":{"summary":"Tip Pay","description":"Pay out this tip on its own (scheduled if it isn't released yet).","operationId":"tip_pay_api_admin_tips__tip_id__pay_post","parameters":[{"name":"tip_id","in":"path","required":true,"schema":{"type":"string","title":"Tip Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DaysIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/billing":{"get":{"summary":"Billing Get","operationId":"billing_get_api_admin_billing_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}},{"name":"ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/billing/checkout":{"post":{"summary":"Billing Checkout","operationId":"billing_checkout_api_admin_billing_checkout_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/billing/cancel":{"post":{"summary":"Billing Cancel","operationId":"billing_cancel_api_admin_billing_cancel_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/billing/manage-card":{"post":{"summary":"Billing Manage Card","operationId":"billing_manage_card_api_admin_billing_manage_card_post","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partners/signup":{"post":{"summary":"Partner Signup","description":"A partner-only login (no property), signed in, email unverified until\nthe 6-digit code is entered (same flow as a business sign-up).","operationId":"partner_signup_api_partners_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerSignupIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partner":{"get":{"summary":"Partner Get","operationId":"partner_get_api_partner_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Partner Save","description":"Start referring (an owner or manager), or change name / M-Pesa number.","operationId":"partner_save_api_partner_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partners/code/{code}":{"get":{"summary":"Partner Code","description":"Public: is this link real? (The landing page greets the visitor.)","operationId":"partner_code_api_partners_code__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform/partners":{"get":{"summary":"Platform Partners","operationId":"platform_partners_api_platform_partners_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/platform/partners/{user_id}/pause":{"post":{"summary":"Platform Pause","operationId":"platform_pause_api_platform_partners__user_id__pause_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PauseIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform/partners/payouts":{"post":{"summary":"Platform Payouts Switch","operationId":"platform_payouts_switch_api_platform_partners_payouts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwitchIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform/partners/referrals/{property_id}/retry":{"post":{"summary":"Platform Retry","description":"A bonus that failed three times goes back in the queue.","operationId":"platform_retry_api_platform_partners_referrals__property_id__retry_post","parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","title":"Property Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/setup-request":{"post":{"summary":"Create Setup Request","operationId":"create_setup_request_api_setup_request_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/ops/setup-requests/{req_id}/documents/{doc_id}":{"get":{"summary":"Setup Request Document","operationId":"setup_request_document_api_ops_setup_requests__req_id__documents__doc_id__get","parameters":[{"name":"req_id","in":"path","required":true,"schema":{"type":"string","title":"Req Id"}},{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/group":{"get":{"summary":"Group Overview","operationId":"group_overview_api_group_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/group/clients":{"post":{"summary":"Group Onboard","operationId":"group_onboard_api_group_clients_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/group/clients/{slug}":{"delete":{"summary":"Group Release","description":"Stop running a client. It keeps everything; someone must be able to\nsign in to it, so a client with no active owner can't be let go.","operationId":"group_release_api_group_clients__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/group/requests":{"post":{"summary":"Group Request","operationId":"group_request_api_group_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/group/requests/{request_id}":{"delete":{"summary":"Group Withdraw","operationId":"group_withdraw_api_group_requests__request_id__delete","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/group/logins":{"post":{"summary":"Group Login Add","operationId":"group_login_add_api_group_logins_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/group/logins/{user_id}/resend":{"post":{"summary":"Group Login Resend","operationId":"group_login_resend_api_group_logins__user_id__resend_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/group/logins/{user_id}":{"delete":{"summary":"Group Login Remove","operationId":"group_login_remove_api_group_logins__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/group/join-link":{"post":{"summary":"Group Join Link New","operationId":"group_join_link_new_api_group_join_link_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"summary":"Group Join Link Off","operationId":"group_join_link_off_api_group_join_link_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/join/{token}":{"get":{"summary":"Join Link View","operationId":"join_link_view_api_join__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Join Link Use","description":"A login for whoever has the link, pending until they use the\nset-password link we email them (so the email is theirs).","operationId":"join_link_use_api_join__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/management":{"get":{"summary":"Management Get","operationId":"management_get_api_admin_management_get","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Management End","operationId":"management_end_api_admin_management_delete","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/management/requests/{request_id}":{"post":{"summary":"Management Answer","operationId":"management_answer_api_admin_management_requests__request_id__post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnswerIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/groups":{"get":{"summary":"Platform Groups","operationId":"platform_groups_api_admin_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Platform Group Add","operationId":"platform_group_add_api_admin_groups_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/verification/source":{"put":{"summary":"Verification Source Set","operationId":"verification_source_set_api_admin_verification_source_put","parameters":[{"name":"property","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/signup":{"post":{"summary":"Agent Signup","operationId":"agent_signup_api_agent_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSignupIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/login-code":{"post":{"summary":"Agent Login Code","description":"Always the same answer (no account enumeration).","operationId":"agent_login_code_api_agent_login_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginCodeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/connect":{"post":{"summary":"Agent Connect","operationId":"agent_connect_api_agent_connect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/keys":{"get":{"summary":"Keys List","operationId":"keys_list_api_agent_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Keys Create","operationId":"keys_create_api_agent_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/keys/{key_id}":{"delete":{"summary":"Keys Revoke","operationId":"keys_revoke_api_agent_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/file/{token}":{"get":{"summary":"Agent File","description":"Replays one GET for the key that made the link (still checked: a\nrevoked key's links stop working).","operationId":"agent_file_api_agent_file__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/link":{"post":{"summary":"Link Create","operationId":"link_create_api_agent_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/link/{poll}":{"get":{"summary":"Link Poll","operationId":"link_poll_api_agent_link__poll__get","parameters":[{"name":"poll","in":"path","required":true,"schema":{"type":"string","title":"Poll"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/link-info":{"get":{"summary":"Link Info","description":"For the approval page: which agent is asking, and is the link still good.","operationId":"link_info_api_agent_link_info_get","parameters":[{"name":"c","in":"query","required":true,"schema":{"type":"string","title":"C"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/link/decide":{"post":{"summary":"Link Decide","description":"The signed-in person allows or refuses (browser session only: an agent\ncan't approve its own link with a key).","operationId":"link_decide_api_agent_link_decide_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkDecideIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/places":{"get":{"summary":"Ops Places","operationId":"ops_places_api_ops_places_get","parameters":[{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/stand/{slug}/laser.svg":{"get":{"summary":"Ops Stand Laser","operationId":"ops_stand_laser_api_ops_stand__slug__laser_svg_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AddTipsIn":{"properties":{"tip_ids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Tip Ids"},"gather":{"type":"boolean","title":"Gather","default":false}},"type":"object","required":["tip_ids"],"title":"AddTipsIn"},"AgentSignupIn":{"properties":{"property_name":{"type":"string","maxLength":120,"minLength":2,"title":"Property Name"},"business_type":{"type":"string","pattern":"^(stay|restaurant)$","title":"Business Type","default":"stay"},"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"password":{"anyOf":[{"type":"string","maxLength":128,"minLength":8},{"type":"null"}],"title":"Password"},"accept_terms":{"type":"boolean","title":"Accept Terms"},"referral_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Referral Code"},"key_label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Key Label"}},"type":"object","required":["property_name","email","accept_terms"],"title":"AgentSignupIn"},"AnswerIn":{"properties":{"accept":{"type":"boolean","title":"Accept"}},"type":"object","required":["accept"],"title":"AnswerIn"},"Body_admin_login_api_admin_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"Body_admin_login_api_admin_login_post"},"Body_staff_photo_put_api_admin_staff__staff_id__photo_put":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_staff_photo_put_api_admin_staff__staff_id__photo_put"},"Body_stand_logo_put_api_admin_stand__slug__logo_put":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_stand_logo_put_api_admin_stand__slug__logo_put"},"Body_verification_upload_api_admin_verification_documents__kind__put":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_verification_upload_api_admin_verification_documents__kind__put"},"BookingPrice":{"properties":{"check_in":{"type":"string","format":"date","title":"Check In"},"check_out":{"type":"string","format":"date","title":"Check Out"},"total_kes":{"type":"integer","maximum":10000000.0,"minimum":0.0,"title":"Total Kes"}},"type":"object","required":["check_in","check_out","total_kes"],"title":"BookingPrice"},"BranchIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":2,"title":"Name"}},"type":"object","required":["name"],"title":"BranchIn"},"CheckoutIn":{"properties":{"tier":{"type":"string","pattern":"^(villa|lodge|hotel)$","title":"Tier"},"interval":{"type":"string","pattern":"^(monthly|annually)$","title":"Interval"},"method":{"type":"string","pattern":"^(card|mpesa)$","title":"Method"}},"type":"object","required":["tier","interval","method"],"title":"CheckoutIn"},"ClientIn":{"properties":{"company_name":{"type":"string","maxLength":160,"minLength":2,"title":"Company Name"},"sites":{"items":{"$ref":"#/components/schemas/SiteIn"},"type":"array","maxItems":20,"minItems":1,"title":"Sites"},"owners":{"items":{"type":"string"},"type":"array","maxItems":5,"title":"Owners"},"accepted_terms":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","title":"Accepted Terms"},"verification":{"type":"string","pattern":"^(group|own)$","title":"Verification","default":"group"}},"type":"object","required":["company_name","sites","accepted_terms"],"title":"ClientIn"},"ConnectIn":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Code"},"password":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Password"},"key_label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Key Label"}},"type":"object","required":["email"],"title":"ConnectIn"},"DayOverride":{"properties":{"staff_id":{"type":"string","maxLength":64,"minLength":1,"title":"Staff Id"},"days":{"type":"integer","maximum":365.0,"minimum":0.0,"title":"Days"}},"type":"object","required":["staff_id","days"],"title":"DayOverride"},"DaysIn":{"properties":{"days":{"anyOf":[{"items":{"$ref":"#/components/schemas/DayOverride"},"type":"array"},{"type":"null"}],"title":"Days"}},"type":"object","title":"DaysIn"},"DisburseExecuteIn":{"properties":{"days":{"items":{"$ref":"#/components/schemas/DayOverride"},"type":"array","title":"Days"}},"type":"object","title":"DisburseExecuteIn"},"DisbursePreviewIn":{"properties":{"days":{"items":{"$ref":"#/components/schemas/DayOverride"},"type":"array","title":"Days"}},"type":"object","title":"DisbursePreviewIn","description":"Per-staff days; omitted staff use their roster default_days."},"EmailPrefIn":{"properties":{"kind":{"type":"string","maxLength":40,"title":"Kind"},"on":{"type":"boolean","title":"On"}},"type":"object","required":["kind","on"],"title":"EmailPrefIn"},"ExtraTip":{"properties":{"staff_id":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Staff Id"},"guest_name":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Guest Name"},"amount_kes":{"type":"integer","minimum":1.0,"title":"Amount Kes"}},"type":"object","required":["amount_kes"],"title":"ExtraTip","description":"Extra for one person: a roster ``staff_id`` OR a written-in\n``guest_name`` (someone not on the list, e.g. a temporary worker)."},"ForgotIn":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"}},"type":"object","required":["email"],"title":"ForgotIn"},"GroupIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":2,"title":"Name"},"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"}},"type":"object","required":["name","email"],"title":"GroupIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"KeyIn":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Label"}},"type":"object","title":"KeyIn"},"LinkDecideIn":{"properties":{"code":{"type":"string","maxLength":64,"minLength":8,"title":"Code"},"allow":{"type":"boolean","title":"Allow"}},"type":"object","required":["code","allow"],"title":"LinkDecideIn"},"LinkIn":{"properties":{"agent_name":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Agent Name"}},"type":"object","title":"LinkIn"},"LoginCodeIn":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"}},"type":"object","required":["email"],"title":"LoginCodeIn"},"LoginIn":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"}},"type":"object","required":["email"],"title":"LoginIn"},"ManagerIn":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"places":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Places"}},"type":"object","required":["email"],"title":"ManagerIn"},"OwnerIn":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"type":"object","required":["email","password"],"title":"OwnerIn"},"PartnerIn":{"properties":{"name":{"type":"string","maxLength":80,"minLength":2,"title":"Name"},"phone":{"type":"string","maxLength":20,"minLength":9,"title":"Phone"}},"type":"object","required":["name","phone"],"title":"PartnerIn"},"PartnerSignupIn":{"properties":{"name":{"type":"string","maxLength":80,"minLength":2,"title":"Name"},"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"phone":{"type":"string","maxLength":20,"minLength":9,"title":"Phone"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"accepted_terms":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","title":"Accepted Terms"},"website":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Website"},"turnstile_token":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Turnstile Token"}},"type":"object","required":["name","email","phone","password","accepted_terms"],"title":"PartnerSignupIn"},"PasswordIn":{"properties":{"current":{"type":"string","maxLength":128,"minLength":1,"title":"Current"},"new":{"type":"string","maxLength":128,"minLength":8,"title":"New"}},"type":"object","required":["current","new"],"title":"PasswordIn"},"PauseIn":{"properties":{"paused":{"type":"boolean","title":"Paused"}},"type":"object","required":["paused"],"title":"PauseIn"},"PeriodIn":{"properties":{"start_date":{"type":"string","maxLength":10,"minLength":10,"title":"Start Date"},"end_date":{"type":"string","maxLength":10,"minLength":10,"title":"End Date"},"label":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Label"},"tip_ids":{"items":{"type":"string"},"type":"array","maxItems":500,"title":"Tip Ids"},"gather":{"type":"boolean","title":"Gather","default":false}},"type":"object","required":["start_date","end_date"],"title":"PeriodIn"},"PeriodPatch":{"properties":{"start_date":{"anyOf":[{"type":"string","maxLength":10,"minLength":10},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","maxLength":10,"minLength":10},{"type":"null"}],"title":"End Date"},"label":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Label"},"days":{"anyOf":[{"items":{"$ref":"#/components/schemas/DayOverride"},"type":"array"},{"type":"null"}],"title":"Days"}},"type":"object","title":"PeriodPatch"},"PersonIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"weight":{"type":"number","maximum":10.0,"exclusiveMinimum":0.0,"title":"Weight","default":1.0}},"type":"object","required":["name"],"title":"PersonIn"},"PlacesIn":{"properties":{"places":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Places"}},"type":"object","title":"PlacesIn"},"ProfileIn":{"properties":{"business_type":{"anyOf":[{"type":"string","pattern":"^(limited_company|sole_proprietor_or_partnership|other)$"},{"type":"null"}],"title":"Business Type"},"business_type_other":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Business Type Other"},"registered_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Registered Name"},"registration_number":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Registration Number"},"kra_pin":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Kra Pin"},"cr12_issued_on":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Cr12 Issued On"}},"type":"object","title":"ProfileIn"},"RejectIn":{"properties":{"note":{"type":"string","maxLength":500,"minLength":1,"title":"Note"}},"type":"object","required":["note"],"title":"RejectIn"},"RequestIn":{"properties":{"to":{"type":"string","maxLength":254,"minLength":2,"title":"To"}},"type":"object","required":["to"],"title":"RequestIn"},"ResetIn":{"properties":{"token":{"type":"string","maxLength":200,"minLength":10,"title":"Token"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"type":"object","required":["token","password"],"title":"ResetIn"},"ResolveNamedTip":{"properties":{"staff_id":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Staff Id"},"to_team":{"type":"boolean","title":"To Team","default":false}},"type":"object","title":"ResolveNamedTip"},"RetryIn":{"properties":{"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"}},"type":"object","title":"RetryIn","description":"Optionally a new M-Pesa number for the person, saved before sending."},"RoleIn":{"properties":{"role":{"type":"string","pattern":"^(owner|manager)$","title":"Role"}},"type":"object","required":["role"],"title":"RoleIn"},"RosterRow":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"weight":{"type":"number","maximum":10.0,"exclusiveMinimum":0.0,"title":"Weight"},"default_days":{"type":"integer","maximum":365.0,"minimum":0.0,"title":"Default Days","default":5}},"type":"object","required":["name","weight"],"title":"RosterRow"},"SettingsPatch":{"properties":{"business_type":{"anyOf":[{"type":"string","pattern":"^(stay|restaurant)$"},{"type":"null"}],"title":"Business Type"},"allow_team_tips":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Team Tips"},"allow_individual_tips":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Individual Tips"},"track_days":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Track Days"},"bill_percents":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":4},{"type":"null"}],"title":"Bill Percents"},"headline":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Headline"},"chips":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":8,"minItems":1},{"type":"null"}],"title":"Chips"},"suggest_per_staff_day_kes":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":0.0},{"type":"null"}],"title":"Suggest Per Staff Day Kes"},"suggest_team_size":{"anyOf":[{"type":"integer","maximum":500.0,"minimum":0.0},{"type":"null"}],"title":"Suggest Team Size"},"suggest_mode":{"anyOf":[{"type":"string","pattern":"^(staff_day|booking)$"},{"type":"null"}],"title":"Suggest Mode"},"suggest_nightly_kes":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Suggest Nightly Kes"},"suggest_booking_percent":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Suggest Booking Percent"},"booking_prices":{"anyOf":[{"items":{"$ref":"#/components/schemas/BookingPrice"},"type":"array","maxItems":50},{"type":"null"}],"title":"Booking Prices"},"ical_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Ical Url"}},"type":"object","title":"SettingsPatch","description":"Every field optional; only the ones sent are written."},"SettleIn":{"properties":{"note":{"type":"string","maxLength":200,"minLength":3,"title":"Note"}},"type":"object","required":["note"],"title":"SettleIn"},"SignupIn":{"properties":{"property_name":{"type":"string","maxLength":120,"minLength":2,"title":"Property Name"},"business_type":{"type":"string","pattern":"^(stay|restaurant)$","title":"Business Type","default":"stay"},"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"accepted_terms":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","title":"Accepted Terms"},"website":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Website"},"turnstile_token":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Turnstile Token"},"referral_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Referral Code"}},"type":"object","required":["property_name","email","password","accepted_terms"],"title":"SignupIn"},"SiteIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":2,"title":"Name"},"business_type":{"type":"string","pattern":"^(stay|restaurant)$","title":"Business Type","default":"stay"},"team":{"items":{"$ref":"#/components/schemas/PersonIn"},"type":"array","maxItems":200,"title":"Team"}},"type":"object","required":["name"],"title":"SiteIn"},"SkipIn":{"properties":{"tip_ids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Tip Ids"},"undo":{"type":"boolean","title":"Undo","default":false}},"type":"object","required":["tip_ids"],"title":"SkipIn"},"SourceIn":{"properties":{"source":{"type":"string","pattern":"^(group|own)$","title":"Source"}},"type":"object","required":["source"],"title":"SourceIn"},"StaffIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"weight":{"type":"number","maximum":10.0,"exclusiveMinimum":0.0,"title":"Weight"},"default_days":{"type":"integer","maximum":365.0,"minimum":0.0,"title":"Default Days","default":5}},"type":"object","required":["name","weight"],"title":"StaffIn"},"StaffUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"weight":{"anyOf":[{"type":"number","maximum":10.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Weight"},"default_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":0.0},{"type":"null"}],"title":"Default Days"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},"type":"object","title":"StaffUpdate"},"SwitchIn":{"properties":{"on":{"type":"boolean","title":"On"}},"type":"object","required":["on"],"title":"SwitchIn"},"TempIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"phone":{"type":"string","maxLength":32,"minLength":1,"title":"Phone"},"weight":{"type":"number","maximum":10.0,"exclusiveMinimum":0.0,"title":"Weight","default":1.0}},"type":"object","required":["name","phone"],"title":"TempIn"},"TenantBilling":{"properties":{"platform_fee_bps":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":0.0},{"type":"null"}],"title":"Platform Fee Bps"},"plan":{"anyOf":[{"type":"string","pattern":"^(complimentary|trial|villa|lodge|hotel)$"},{"type":"null"}],"title":"Plan"},"payouts_approved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Payouts Approved"},"extend_trial_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Extend Trial Days"}},"type":"object","title":"TenantBilling"},"TenantCreate":{"properties":{"slug":{"type":"string","maxLength":64,"minLength":1,"title":"Slug"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"cta_headline":{"type":"string","maxLength":200,"minLength":1,"title":"Cta Headline"},"chips":{"items":{"type":"integer"},"type":"array","maxItems":8,"minItems":1,"title":"Chips"},"owner":{"$ref":"#/components/schemas/OwnerIn"},"roster":{"items":{"$ref":"#/components/schemas/RosterRow"},"type":"array","title":"Roster"},"listed":{"type":"boolean","title":"Listed","default":false}},"type":"object","required":["slug","name","cta_headline","owner"],"title":"TenantCreate"},"TenantStatus":{"properties":{"active":{"type":"boolean","title":"Active"}},"type":"object","required":["active"],"title":"TenantStatus"},"TestModeIn":{"properties":{"on":{"type":"boolean","title":"On"},"clear":{"type":"boolean","title":"Clear","default":false}},"type":"object","required":["on"],"title":"TestModeIn"},"TestSettleIn":{"properties":{"reference":{"type":"string","maxLength":64,"minLength":1,"title":"Reference"},"outcome":{"type":"string","pattern":"^(paid|failed)$","title":"Outcome"},"method":{"anyOf":[{"type":"string","pattern":"^(mpesa|card)$"},{"type":"null"}],"title":"Method"}},"type":"object","required":["reference","outcome"],"title":"TestSettleIn"},"TipContext":{"properties":{"from":{"type":"string","pattern":"^(group|self|bill)$","title":"From"},"days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Days"},"group_size":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Group Size"},"days_source":{"anyOf":[{"type":"string","pattern":"^(booking|guest)$"},{"type":"null"}],"title":"Days Source"},"bill_kes":{"anyOf":[{"type":"integer","maximum":10000000.0,"minimum":1.0},{"type":"null"}],"title":"Bill Kes"},"percent":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Percent"}},"type":"object","required":["from"],"title":"TipContext","description":"What the guest told us before choosing an amount (suggested tip).\nInformational only: it never changes what is charged."},"TipInitiate":{"properties":{"property_slug":{"type":"string","maxLength":64,"minLength":1,"title":"Property Slug"},"amount_kes":{"type":"integer","minimum":1.0,"title":"Amount Kes"},"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Email"},"target":{"anyOf":[{"$ref":"#/components/schemas/TipTarget"},{"type":"null"}]},"context":{"anyOf":[{"$ref":"#/components/schemas/TipContext"},{"type":"null"}]},"cover_fees":{"type":"boolean","title":"Cover Fees","default":false},"method":{"anyOf":[{"type":"string","pattern":"^(mpesa|card)$"},{"type":"null"}],"title":"Method"},"from_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"From Name"}},"type":"object","required":["property_slug","amount_kes"],"title":"TipInitiate"},"TipTarget":{"properties":{"kind":{"type":"string","pattern":"^(team|individual)$","title":"Kind","default":"team"},"staff_id":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Staff Id"},"guest_name":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Guest Name"},"extra":{"anyOf":[{"$ref":"#/components/schemas/ExtraTip"},{"type":"null"}]}},"type":"object","title":"TipTarget","description":"v3 §3.4 optional target:\n- omitted / kind=\"team\" → team tip (v2 behavior)\n- kind=\"individual\" + staff_id → whole amount earmarked\n- kind=\"team\" + extra{staff_id, amount_kes} → team + above-and-beyond"},"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"},"VerifyIn":{"properties":{"code":{"type":"string","maxLength":20,"minLength":1,"title":"Code"}},"type":"object","required":["code"],"title":"VerifyIn"}}}}