{"openapi":"3.1.0","info":{"title":"Legal Search API","description":"Hybrid semantic + keyword search over EU legal data (case law, legislation, doctrine).","version":"0.1.0"},"paths":{"/v1/search":{"post":{"tags":["Search"],"summary":"Search","description":"Hybrid semantic + keyword search over legal documents.\n\nSet `namespace` to \"case_law\", \"legislation\", or \"doctrine\" to choose which collection to search.\n\n`result_detail` is opt-in. Omit it or pass \"snippet\" for the backward-compatible\ndefault SearchHit shape. Pass \"full_text\" to include bounded document text\nwhere available; if text cannot be loaded for a hit, that hit is returned with\n`text_unavailable=true` instead of failing the whole search.","operationId":"search_v1_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/documents/{country}/{source_name}/{source_id}":{"get":{"tags":["Documents"],"summary":"Get Document","description":"Retrieve a full document by path.\n\nSource is always {country}/{source_name} (2 segments); source_id:path captures\nthe rest, correctly handling source_ids that contain slashes.","operationId":"get_document_v1_documents__country___source_name___source_id__get","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","title":"Country"}},{"name":"source_name","in":"path","required":true,"schema":{"type":"string","title":"Source Name"}},{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/documents/{country}/{source_name}":{"get":{"tags":["Documents"],"summary":"Get Document By Query","description":"Retrieve a full document by source and source_id (query parameter).\n\nAlternative form for clients that prefer query parameters.\nExample: GET /v1/documents/US/CaselawAccessProject?source_id=us_462/html/0416-01.html","operationId":"get_document_by_query_v1_documents__country___source_name__get","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","title":"Country"}},{"name":"source_name","in":"path","required":true,"schema":{"type":"string","title":"Source Name"}},{"name":"source_id","in":"query","required":true,"schema":{"type":"string","description":"Document source_id (e.g. 'us_462/html/0416-01.html')","title":"Source Id"},"description":"Document source_id (e.g. 'us_462/html/0416-01.html')"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/resolve":{"post":{"tags":["Resolve"],"summary":"Resolve","description":"Resolve a loose legal reference to exact document(s).\n\nTries fast-path regex for machine-readable identifiers first,\nthen falls back to LLM parsing + SQL query. Capped at\nRESOLVE_BUDGET_SECONDS wall time; overrun returns match_type=\"timeout\".\n\nTIP: pass `hint_country` (and `hint_type` when known). It roughly doubles the\nresolution rate (~65% vs ~31% without it) — many citation formats are\nambiguous across the 230+ jurisdictions in the corpus, and the country hint\nscopes resolution to the right one. The resolver is strict (returns nothing\nrather than risk a wrong document), so the hint is often the difference\nbetween a result and none.","operationId":"resolve_v1_resolve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/resolve/coverage":{"get":{"tags":["Resolve"],"summary":"Resolve Coverage","description":"Pattern coverage report: which sources have resolve patterns and which don't.\n\nMerges source_patterns.yaml with the pre-computed manifest to show coverage\nstatus, pattern counts, and document counts per source.","operationId":"resolve_coverage_v1_resolve_coverage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/discover/countries":{"get":{"tags":["Discover"],"summary":"List Countries","description":"List all countries with source and document counts.","operationId":"list_countries_v1_discover_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountriesResponse"}}}}}}},"/v1/discover/countries/{country_code}/sources":{"get":{"tags":["Discover"],"summary":"List Sources","description":"List all sources for a given country with metadata.\n\nBy default hides sources with document_count == 0 (placeholders awaiting\nbackfill). Pass include_empty=true to see them.","operationId":"list_sources_v1_discover_countries__country_code__sources_get","parameters":[{"name":"country_code","in":"path","required":true,"schema":{"type":"string","title":"Country Code"}},{"name":"include_empty","in":"query","required":false,"schema":{"type":"boolean","description":"Include sources with 0 indexed documents","default":false,"title":"Include Empty"},"description":"Include sources with 0 indexed documents"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/discover/sources/{source}/filters":{"get":{"tags":["Discover"],"summary":"Get Filters","description":"Get available filter values for a specific source.\n\nReturns distinct courts, jurisdictions, chambers, decision types, languages,\nand date range. For sources where courts are stored in meta->>'jurisdiction'\n(e.g., FR/Judilibre), those are included too.\n\nSources whose `data_types` list is multi-element span multiple namespaces.\nUse the `namespace` query param to pick which one's filters you want.","operationId":"get_filters_v1_discover_sources__source__filters_get","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"For sources that span multiple namespaces (per discover_sources' data_types), pick which one to inspect: 'case_law', 'legislation', or 'doctrine'. Defaults to whichever namespace has the most rows.","title":"Namespace"},"description":"For sources that span multiple namespaces (per discover_sources' data_types), pick which one to inspect: 'case_law', 'legislation', or 'doctrine'. Defaults to whichever namespace has the most rows."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilterOptions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/discover/courts":{"get":{"tags":["Discover"],"summary":"List Courts","description":"Get distinct courts available for search filtering.\n\nThese are courts stored in the case_law `court` column which maps\nto Pinecone metadata, so they work as search filters.\nOptionally filter by country or source.","operationId":"list_courts_v1_discover_courts_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","title":"Country"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/stats":{"get":{"tags":["Stats"],"summary":"Get Stats","description":"Pipeline statistics (served from pre-computed manifest).","operationId":"get_stats_v1_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/manifest":{"get":{"tags":["Stats"],"summary":"Get Manifest","description":"Full pre-computed manifest: stats, countries, sources, courts.\n\nBuilt at startup — returns instantly with no DB queries.\nThe UI loads this once on init to populate all dropdowns.","operationId":"get_manifest_v1_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/contributors":{"get":{"tags":["Contributors"],"summary":"Get Contributors","description":"Get contributor credits per source, per country, and global top contributors.\n\nData is fetched from the worldwidelaw/legal-sources GitHub repo\n(issues and PRs) and cached for 1 hour.","operationId":"get_contributors_v1_contributors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/legal-acceptance":{"post":{"tags":["Auth"],"summary":"Accept Current Legal Bundle","description":"Record one-time acceptance and exchange the limited token for login continuation.","operationId":"accept_current_legal_bundle_auth_legal_acceptance_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_LegalAcceptanceBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/password-reset/request":{"post":{"tags":["Auth"],"summary":"Request Password Reset","description":"Create and email a one-time reset token if the account exists.","operationId":"request_password_reset_auth_password_reset_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_PasswordResetRequestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/password-reset/confirm":{"post":{"tags":["Auth"],"summary":"Confirm Password Reset","description":"Consume a password reset token and set a new password.","operationId":"confirm_password_reset_auth_password_reset_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_PasswordResetConfirmBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/register":{"post":{"tags":["Auth"],"summary":"Register","description":"Create a new account with email + password.\n\nReturns HTTP 409 if the email is already registered (including via OAuth),\nso there is no way to add a password to an existing account without\nthe account holder explicitly requesting it.","operationId":"register_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_EmailPasswordBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["Auth"],"summary":"Login","description":"Sign in with email + password.","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_EmailPasswordBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/password-authorize":{"post":{"tags":["Auth"],"summary":"Password Authorize","description":"Email/password sign-in that completes an MCP OAuth 2.1 flow.\n\nCalled by the JS on the /oauth/authorize consent page. Accepts JSON with\n{email, password, mcp_flow} where mcp_flow is the base64 OAuth param blob\nembedded in the page by the server. Returns {redirect_url} on success so\nJS can forward the browser to the OAuth client with the auth code.","operationId":"password_authorize_auth_password_authorize_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/dev-login":{"post":{"tags":["Auth"],"summary":"Dev Login","description":"Dev-only password login. Visit /login#dev to access the hidden form.","operationId":"dev_login_auth_dev_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/github":{"get":{"tags":["Auth"],"summary":"Github Login","description":"Redirect to GitHub OAuth authorization.","operationId":"github_login_auth_github_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/github/callback":{"get":{"tags":["Auth"],"summary":"Github Callback","description":"Handle GitHub OAuth callback.","operationId":"github_callback_auth_github_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/google":{"get":{"tags":["Auth"],"summary":"Google Login","description":"Redirect to Google OAuth authorization.","operationId":"google_login_auth_google_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google/callback":{"get":{"tags":["Auth"],"summary":"Google Callback","description":"Handle Google OAuth callback.","operationId":"google_callback_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/microsoft":{"get":{"tags":["Auth"],"summary":"Microsoft Login","description":"Redirect to Microsoft OAuth authorization.","operationId":"microsoft_login_auth_microsoft_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/microsoft/callback":{"get":{"tags":["Auth"],"summary":"Microsoft Callback","description":"Handle Microsoft OAuth callback.","operationId":"microsoft_callback_auth_microsoft_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["Auth"],"summary":"Me","description":"Return current user info.","operationId":"me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"tags":["Auth"],"summary":"Delete Me","description":"Permanently delete the authenticated user's application account.","operationId":"delete_me_auth_me_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_DeleteAccountBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys":{"get":{"tags":["API Keys"],"summary":"List Keys","description":"List all API keys for the current user.","operationId":"list_keys_v1_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["API Keys"],"summary":"Create Key","description":"Create a new API key. The full key is returned only once.","operationId":"create_key_v1_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys/{key_id}":{"delete":{"tags":["API Keys"],"summary":"Revoke Key","description":"Revoke an API key.","operationId":"revoke_key_v1_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"}}}}}}},"/v1/billing/plans":{"get":{"tags":["Billing"],"summary":"List Plans","description":"Return legacy schema by default; audience catalogues are additive.","operationId":"list_plans_v1_billing_plans_get","parameters":[{"name":"audience","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/audience":{"post":{"tags":["Billing"],"summary":"Set Pricing Audience","description":"Persist an authenticated Free user's explicit audience selection.","operationId":"set_pricing_audience_v1_billing_audience_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudienceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/checkout/verify":{"post":{"tags":["Billing"],"summary":"Verify Checkout","description":"Confirm checkout with Stripe and return only allowlisted attribution.","operationId":"verify_checkout_v1_billing_checkout_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/promo":{"get":{"tags":["Billing"],"summary":"Get Promo Status","description":"Check if a promotion code is valid and return discount info + seats remaining.","operationId":"get_promo_status_v1_billing_promo_get","parameters":[{"name":"code","in":"query","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"}}}}}}},"/v1/billing/checkout":{"post":{"tags":["Billing"],"summary":"Create Checkout","description":"Create a Stripe Checkout Session for upgrading to a paid plan.","operationId":"create_checkout_v1_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/credit-topups/auto":{"get":{"tags":["Billing"],"summary":"Get Auto Topup","description":"Return the user's auto top-up setting.","operationId":"get_auto_topup_v1_billing_credit_topups_auto_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["Billing"],"summary":"Set Auto Topup","description":"Enable/disable auto top-up configuration for active Pro accounts.\n\nThe stored rule is: when remaining extra credits fall below threshold_credits,\nautomatically charge the saved Stripe customer and grant amount_usd more\ncredits. The manual checkout endpoint remains the fallback.","operationId":"set_auto_topup_v1_billing_credit_topups_auto_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTopupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/credit-topups/checkout":{"post":{"tags":["Billing"],"summary":"Create Credit Topup Checkout","description":"Create a one-time Stripe Checkout Session for credits that stay until used.","operationId":"create_credit_topup_checkout_v1_billing_credit_topups_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTopupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/portal":{"get":{"tags":["Billing"],"summary":"Billing Portal","description":"Create a Customer Portal session for the authenticated user's billing account.","operationId":"billing_portal_v1_billing_portal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Billing"],"summary":"Billing Portal","description":"Create a Customer Portal session for the authenticated user's billing account.","operationId":"billing_portal_v1_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/billing/status":{"get":{"tags":["Billing"],"summary":"Billing Status","description":"Get current plan and subscription info.","operationId":"billing_status_v1_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/billing/webhooks":{"post":{"tags":["Billing"],"summary":"Stripe Webhook","description":"Handle Stripe webhook events.","operationId":"stripe_webhook_v1_billing_webhooks_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/team":{"get":{"tags":["Team"],"summary":"Get Team","description":"Return the caller's workspace + members + pending invites.","operationId":"get_team_v1_team_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/team/invites":{"post":{"tags":["Team"],"summary":"Create Invites","operationId":"create_invites_v1_team_invites_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/team/domains":{"put":{"tags":["Team"],"summary":"Set Allowed Domains","description":"Owner/admin: set the workspace's allowed email domains. Anyone who signs\nin with an email at one of these domains auto-joins (up to the seat limit).","operationId":"set_allowed_domains_v1_team_domains_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/team/invites/{invite_id}":{"delete":{"tags":["Team"],"summary":"Revoke Invite","description":"Owner/admin: revoke a pending (un-accepted) allowed-email invite, freeing\nthe reserved seat.","operationId":"revoke_invite_v1_team_invites__invite_id__delete","parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/team/join":{"post":{"tags":["Team"],"summary":"Join Workspace","description":"Accept an invite token (email-invite or shareable link) and join the workspace.","operationId":"join_workspace_v1_team_join_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/team/members/{member_user_id}":{"delete":{"tags":["Team"],"summary":"Remove Member","operationId":"remove_member_v1_team_members__member_user_id__delete","parameters":[{"name":"member_user_id","in":"path","required":true,"schema":{"type":"string","title":"Member User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/team/seats":{"post":{"tags":["Team"],"summary":"Update Seats","description":"Owner only: adjust the Stripe subscription quantity. Stripe webhook will\nsync workspaces.seat_limit when the subscription.updated event fires.","operationId":"update_seats_v1_team_seats_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/stats":{"get":{"tags":["Admin"],"summary":"Admin Stats","description":"Dashboard stats: daily request counts (30 days), total users, requests today,\nnew/active user counts, and top endpoints.","operationId":"admin_stats_v1_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/users":{"get":{"tags":["Admin"],"summary":"Admin Users","description":"Per-user request counts and metadata. Supports search by email/name and pagination.","operationId":"admin_users_v1_admin_users_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(requests|created_at|email)$","default":"requests","title":"Sort"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","maxLength":100,"default":"","title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{user_id}/endpoints":{"get":{"tags":["Admin"],"summary":"Admin User Endpoints","description":"Endpoint breakdown for a single user — top endpoints by call count.","operationId":"admin_user_endpoints_v1_admin_users__user_id__endpoints_get","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"}}}}}}},"/v1/admin/users/{user_id}":{"patch":{"tags":["Admin"],"summary":"Update User","description":"Update a user's plan — admin override for whitelisting/upgrading users.","operationId":"update_user_v1_admin_users__user_id__patch","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"}}}}}},"delete":{"tags":["Admin"],"summary":"Delete User","description":"Delete a user account for GDPR erasure requests.\n\nRecords the deletion in user_deletion_log before removing the user row.\nCascades: api_keys and subscriptions are deleted. api_usage/feedback user_id\nis set to NULL (anonymized, not deleted — needed for operational stats).\nStripe subscriptions are cancelled best-effort after the DB commit.","operationId":"delete_user_v1_admin_users__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"}}}}}}},"/v1/admin/feedback":{"get":{"tags":["Admin"],"summary":"Admin Feedback","description":"List feedback reports from MCP agents.","operationId":"admin_feedback_v1_admin_feedback_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(open|forwarded|resolved|dismissed|all)$","default":"open","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/feedback/{report_id}":{"patch":{"tags":["Admin"],"summary":"Update Feedback","description":"Update feedback report status (resolve / dismiss / forwarded).","operationId":"update_feedback_v1_admin_feedback__report_id__patch","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/feedback/{report_id}/mark-forwarded":{"post":{"tags":["Admin"],"summary":"Mark Feedback Forwarded","description":"Mark a feedback report as forwarded to the public GitHub repo.\n\nThe admin creates the issue manually (signed in as themselves) using\nthe pre-filled new-issue URL the dashboard builds client-side, then\npastes the resulting issue URL here so the row is tracked.","operationId":"mark_feedback_forwarded_v1_admin_feedback__report_id__mark_forwarded_post","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/usage/me":{"get":{"tags":["Usage"],"summary":"My Usage","description":"Current user's usage stats: today (rolling 24h), in period, daily history.","operationId":"my_usage_v1_usage_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["OAuth"],"summary":"Oauth Metadata","description":"RFC 8414 — Authorization Server Metadata (origin-based).\n\nPublic-client flow protected by PKCE: we don't validate `client_secret`,\nbut we accept the `client_id` either in the form body (`client_secret_post`\nstyle, sans secret) or in an HTTP Basic Authorization header\n(`client_secret_basic` — ChatGPT uses this). Advertising both lets clients\npick whichever they speak natively.","operationId":"oauth_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server/{path}":{"get":{"tags":["OAuth"],"summary":"Oauth Metadata Path","description":"RFC 8414 — path-aware metadata (some clients try this first).","operationId":"oauth_metadata_path__well_known_oauth_authorization_server__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"tags":["OAuth"],"summary":"Protected Resource Metadata","description":"RFC 9728 — Protected Resource Metadata.\n\nClaude.ai, ChatGPT and Mistral fetch this to discover the OAuth\nauthorization server for the MCP endpoint. We expose both transports:\nstreamable-HTTP at /mcp and SSE at /sse — clients pick whichever they\nspeak.","operationId":"protected_resource_metadata__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"tags":["OAuth"],"summary":"Protected Resource Metadata Mcp","description":"Per-resource metadata for the streamable-HTTP endpoint.","operationId":"protected_resource_metadata_mcp__well_known_oauth_protected_resource_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/sse":{"get":{"tags":["OAuth"],"summary":"Protected Resource Metadata Sse","description":"Per-resource metadata for the SSE endpoint.","operationId":"protected_resource_metadata_sse__well_known_oauth_protected_resource_sse_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-protected-resource/{path}":{"get":{"tags":["OAuth"],"summary":"Protected Resource Metadata Path","description":"RFC 9728 — path-aware protected resource metadata (fallback).","operationId":"protected_resource_metadata_path__well_known_oauth_protected_resource__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/register":{"post":{"tags":["OAuth"],"summary":"Oauth Register","description":"RFC 7591 — Dynamic Client Registration. Persisted to oauth_clients.","operationId":"oauth_register_oauth_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/authorize":{"get":{"tags":["OAuth"],"summary":"Oauth Authorize","description":"OAuth 2.1 Authorization Endpoint with PKCE.\n\nAccepts the RFC 8707 `resource` parameter — strict clients (ChatGPT) send\nit to bind the issued token to a specific resource (e.g. /mcp). The value\nflows through the auth-code store to the token endpoint, which embeds it\nas the JWT `aud` claim.","operationId":"oauth_authorize_oauth_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/token":{"post":{"tags":["OAuth"],"summary":"Oauth Token","description":"Exchange authorization code for access token (JWT).","operationId":"oauth_token_oauth_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AudienceRequest":{"properties":{"audience":{"type":"string","title":"Audience"}},"type":"object","required":["audience"],"title":"AudienceRequest"},"AutoTopupRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"threshold_usd":{"type":"integer","title":"Threshold Usd","default":10},"amount_usd":{"type":"integer","title":"Amount Usd","default":10}},"type":"object","title":"AutoTopupRequest"},"CheckoutRequest":{"properties":{"plan":{"type":"string","title":"Plan"},"interval":{"type":"string","title":"Interval","default":"monthly"},"quantity":{"type":"integer","title":"Quantity","default":1},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name"},"promo_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promo Code"},"audience":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience"},"legal_accepted":{"type":"boolean","title":"Legal Accepted","default":false}},"type":"object","required":["plan"],"title":"CheckoutRequest"},"CheckoutVerificationRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["session_id"],"title":"CheckoutVerificationRequest"},"CountriesResponse":{"properties":{"countries":{"items":{"$ref":"#/components/schemas/CountryInfo"},"type":"array","title":"Countries"}},"type":"object","required":["countries"],"title":"CountriesResponse"},"CountryInfo":{"properties":{"code":{"type":"string","title":"Code"},"case_law_sources":{"type":"integer","title":"Case Law Sources","default":0},"legislation_sources":{"type":"integer","title":"Legislation Sources","default":0},"doctrine_sources":{"type":"integer","title":"Doctrine Sources","default":0},"total_documents":{"type":"integer","title":"Total Documents","default":0}},"type":"object","required":["code"],"title":"CountryInfo"},"CreateKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name","default":"Default"}},"type":"object","title":"CreateKeyRequest"},"CreditTopupRequest":{"properties":{"amount_usd":{"type":"integer","title":"Amount Usd"}},"type":"object","required":["amount_usd"],"title":"CreditTopupRequest"},"DomainsRequest":{"properties":{"domains":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Domains"}},"type":"object","title":"DomainsRequest"},"FilterOptions":{"properties":{"courts":{"items":{"type":"string"},"type":"array","title":"Courts"},"jurisdictions":{"items":{"type":"string"},"type":"array","title":"Jurisdictions"},"chambers":{"items":{"type":"string"},"type":"array","title":"Chambers"},"decision_types":{"items":{"type":"string"},"type":"array","title":"Decision Types"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"court_tiers":{"items":{"type":"integer"},"type":"array","title":"Court Tiers"},"subdivisions":{"items":{"type":"string"},"type":"array","title":"Subdivisions"},"date_range":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Date Range"}},"type":"object","title":"FilterOptions"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteRequest":{"properties":{"emails":{"items":{"type":"string"},"type":"array","maxItems":50,"minItems":1,"title":"Emails"}},"type":"object","required":["emails"],"title":"InviteRequest"},"JoinRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"JoinRequest"},"ResolveRequest":{"properties":{"reference":{"type":"string","minLength":1,"title":"Reference","description":"Legal reference to resolve (e.g., 'art. 6 code civil')"},"hint_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint Country","description":"LDH jurisdiction code — mostly ISO 3166-1 alpha-2, plus aggregate/supranational codes (e.g. 'FR', 'DE', 'BG'; 'EU' for EU law, 'CoE' for ECtHR, 'INTL' for international courts, also 'UN', 'OECD'). Call discover_countries for the full list. STRONGLY RECOMMENDED: roughly doubles the resolution rate (~65% vs ~31%) by scoping ambiguous citations to the right one of 230+ jurisdictions. Pass it whenever the jurisdiction is known."},"hint_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint Type","description":"Type hint: 'legislation' or 'case_law'. Recommended — further narrows resolution."}},"type":"object","required":["reference"],"title":"ResolveRequest"},"SearchHit":{"properties":{"id":{"type":"string","title":"Id"},"source":{"type":"string","title":"Source"},"source_id":{"type":"string","title":"Source Id"},"score":{"type":"number","title":"Score"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"text_truncated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Text Truncated"},"full_text_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Full Text Size"},"text_unavailable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Text Unavailable"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"court":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Court"},"court_tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Court Tier"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"jurisdiction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jurisdiction"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"ecli":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ecli"},"case_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Case Number"},"chamber":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chamber"},"decision_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Type"},"decision_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Number"},"authority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authority"},"document_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Type"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Identifier"},"eli_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eli Uri"},"effective_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Date"},"expiry_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expiry Date"},"quality_tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Tier"},"granularity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granularity"},"unit_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Type"},"unit_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Number"},"canonical_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Path"},"parent_source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Source Id"}},"additionalProperties":true,"type":"object","required":["id","source","source_id","score"],"title":"SearchHit"},"SearchRequest":{"properties":{"q":{"type":"string","minLength":1,"title":"Q","description":"Search query text"},"top_k":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Top K","description":"Number of results","default":10},"alpha":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Alpha","description":"Semantic vs keyword weight (1.0=pure semantic, 0.0=pure keyword)","default":0.7},"country":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Country","description":"LDH jurisdiction codes — mostly ISO 3166-1 alpha-2, plus aggregate/supranational codes such as EU, UN, CoE, INTL, and OECD. Call discover_countries for the full list. E.g. ['FR', 'DE']."},"source":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Source","description":"Source IDs (e.g. ['FR/CNIL'])"},"court":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Court"},"court_tier":{"anyOf":[{"type":"integer","maximum":3.0,"minimum":1.0},{"type":"null"}],"title":"Court Tier"},"jurisdiction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jurisdiction"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Optional language-code filter (e.g. fr, de), mainly useful in multilingual jurisdictions. Do not infer it from the query language. Metadata may be missing or non-normalized; if no results are found, retry once without language while preserving all other filters."},"date_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Start","description":"Start date filter (YYYY-MM-DD)"},"date_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date End","description":"End date filter (YYYY-MM-DD)"},"namespace":{"type":"string","title":"Namespace","description":"Pinecone namespace: \"case_law\", \"legislation\", or \"doctrine\"","default":"case_law"},"result_detail":{"type":"string","enum":["snippet","summary_only","full_text","full_metadata"],"title":"Result Detail","description":"How much content to include per search hit. Omit or use 'snippet' for the backward-compatible default snippet response. Use 'summary_only' for concise summary/snippet content, 'full_text' to opt into document text where available, or 'full_metadata' for text plus public metadata. Large text is bounded and marked with text_truncated/full_text_size.","default":"snippet"}},"type":"object","required":["q"],"title":"SearchRequest"},"SearchResponse":{"properties":{"query":{"type":"string","title":"Query"},"hits":{"items":{"$ref":"#/components/schemas/SearchHit"},"type":"array","title":"Hits"},"total_hits":{"type":"integer","title":"Total Hits"},"alpha":{"type":"number","title":"Alpha"},"namespace":{"type":"string","title":"Namespace"},"elapsed_ms":{"type":"integer","title":"Elapsed Ms"}},"type":"object","required":["query","hits","total_hits","alpha","namespace","elapsed_ms"],"title":"SearchResponse"},"SeatsRequest":{"properties":{"quantity":{"type":"integer","minimum":1.0,"title":"Quantity"}},"type":"object","required":["quantity"],"title":"SeatsRequest"},"SourceInfo":{"properties":{"source_id":{"type":"string","title":"Source Id"},"data_types":{"items":{"type":"string"},"type":"array","title":"Data Types"},"court_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Court Name"},"tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tier"},"document_count":{"type":"integer","title":"Document Count","default":0},"date_range":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Date Range"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["source_id"],"title":"SourceInfo"},"SourcesResponse":{"properties":{"country":{"type":"string","title":"Country"},"sources":{"items":{"$ref":"#/components/schemas/SourceInfo"},"type":"array","title":"Sources"}},"type":"object","required":["country","sources"],"title":"SourcesResponse"},"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"},"_DeleteAccountBody":{"properties":{"confirmation":{"type":"string","title":"Confirmation"}},"type":"object","required":["confirmation"],"title":"_DeleteAccountBody"},"_EmailPasswordBody":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"accept_terms":{"type":"boolean","title":"Accept Terms","default":false},"acknowledge_privacy":{"type":"boolean","title":"Acknowledge Privacy","default":false}},"type":"object","required":["email","password"],"title":"_EmailPasswordBody"},"_LegalAcceptanceBody":{"properties":{"legal_acceptance_token":{"type":"string","title":"Legal Acceptance Token"},"accept_terms":{"type":"boolean","title":"Accept Terms","default":false},"acknowledge_privacy":{"type":"boolean","title":"Acknowledge Privacy","default":false}},"type":"object","required":["legal_acceptance_token"],"title":"_LegalAcceptanceBody"},"_PasswordResetConfirmBody":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"_PasswordResetConfirmBody"},"_PasswordResetRequestBody":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"_PasswordResetRequestBody"}}}}