{"openapi":"3.1.0","info":{"title":"TravelMindsAI API Gateway","description":"Customer-facing gateway for the TravelMindsAI dataset. Auth via Bearer API keys for data endpoints; session JWT for dashboard endpoints. Hosted billing via Paddle (international) and Razorpay (India). Rate-limit + quota enforced per plan.","version":"0.13.0"},"paths":{"/v1/freshness":{"get":{"tags":["freshness"],"summary":"Get Freshness","description":"Return per-watcher freshness summary.","operationId":"get_freshness_v1_freshness_get","parameters":[{"name":"watcher","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter to one watcher_kind","title":"Watcher"},"description":"filter to one watcher_kind"},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter to one watcher_scope","title":"Scope"},"description":"filter to one watcher_scope"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Freshness V1 Freshness Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/licenses":{"get":{"tags":["public"],"summary":"Full TMAIV2 license registry","description":"Promoted from the inline main.py handler. Returns the same shape.","operationId":"list_licenses_v1_licenses_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Licenses V1 Licenses Get"}}}}}}},"/v1/licenses/audit":{"get":{"tags":["public"],"summary":"Per-endpoint + per-marketplace-channel license posture","description":"Live attestation that mirrors legal/license_attestation_v1.json.\n\nComposes:\n  - The static per-endpoint license map.\n  - Active rows from tmai_marketplace_publications, joined to the\n    canonical subset license list.\n  - Publication channels not yet active are still surfaced so a\n    reviewer can see the planned coverage.","operationId":"audit_v1_licenses_audit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Audit V1 Licenses Audit Get"}}}}}}},"/dashboard/sva.html":{"get":{"tags":["public"],"summary":"SVA operator console","description":"Render the SVA console HTML.","operationId":"sva_dashboard_dashboard_sva_html_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sva/queue.html":{"get":{"tags":["public"],"summary":"SVA queue — review / edit / skip upcoming slots","operationId":"sva_queue_page_dashboard_sva_queue_html_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sva/queue/skip":{"post":{"tags":["public"],"summary":"Write a declined marker for a slot","operationId":"sva_queue_skip_dashboard_sva_queue_skip_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_sva_queue_skip_dashboard_sva_queue_skip_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sva/queue/edit":{"post":{"tags":["public"],"summary":"Replace the body of a queued slot","operationId":"sva_queue_edit_dashboard_sva_queue_edit_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_sva_queue_edit_dashboard_sva_queue_edit_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sdr.html":{"get":{"tags":["public"],"summary":"SDR operator console","operationId":"sdr_dashboard_dashboard_sdr_html_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sdr/feedback":{"post":{"tags":["public"],"summary":"Record founder feedback on a prospect","operationId":"post_feedback_dashboard_sdr_feedback_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_post_feedback_dashboard_sdr_feedback_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sdr/status":{"post":{"tags":["public"],"summary":"Update a prospect's pipeline status","operationId":"post_status_dashboard_sdr_status_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_post_status_dashboard_sdr_status_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sdr/drafts.html":{"get":{"tags":["public"],"summary":"Loop B drafts queue — approve / skip / edit in place","operationId":"drafts_page_dashboard_sdr_drafts_html_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sdr/drafts/{draft_id}/approve":{"post":{"tags":["public"],"summary":"Mark a Loop B draft approved for sending","operationId":"post_draft_approve_dashboard_sdr_drafts__draft_id__approve_post","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","title":"Draft Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sdr/drafts/{draft_id}/skip":{"post":{"tags":["public"],"summary":"Mark a Loop B draft skipped (no send)","operationId":"post_draft_skip_dashboard_sdr_drafts__draft_id__skip_post","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","title":"Draft Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/sdr/drafts/{draft_id}/edit":{"post":{"tags":["public"],"summary":"Replace draft body before send","operationId":"post_draft_edit_dashboard_sdr_drafts__draft_id__edit_post","parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","title":"Draft Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},{"name":"x-tmai-console-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Console-Token"}},{"name":"tmai_console_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tmai Console Token"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_post_draft_edit_dashboard_sdr_drafts__draft_id__edit_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"tags":["public"],"summary":"Liveness probe — returns gateway version, no DB touch","description":"Lightweight uptime check. Returns gateway version + service name. Does not touch the Postgres pool. Use this for load-balancer health checks and uptime monitors (StatusCake, Pingdom, etc.).","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/v1/plans":{"get":{"tags":["public"],"summary":"List active plan tiers with pricing and quotas","description":"Source of truth for the pricing-page renderer. Returns every active plan with monthly_request_quota, rate_limit_per_minute, and per-currency pricing (USD + INR, monthly + annual). Public endpoint, no auth required.","operationId":"list_plans_v1_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PlanOut"},"type":"array","title":"Response List Plans V1 Plans Get"}}}}}}},"/v1/newsletter/subscribe":{"post":{"tags":["public"],"summary":"Subscribe to the monthly Coverage Flywheel newsletter","description":"Public endpoint — accepts an email + optional UTM tags. Sends a double-opt-in confirmation email; the row stays unconfirmed until the user clicks the link. GDPR-compliant double-opt-in flow.","operationId":"newsletter_subscribe_v1_newsletter_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSubscribeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/newsletter/confirm":{"get":{"tags":["public"],"summary":"Consume a newsletter double-opt-in confirmation token","operationId":"newsletter_confirm_v1_newsletter_confirm_get","parameters":[{"name":"token","in":"query","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"}}}}}}},"/v1/partners/inquiry":{"post":{"tags":["public"],"summary":"Submit a partner-program inquiry","description":"Public endpoint backing the /partners signup form. Records the inquiry in tmai_partner_inquiries and emails the founder.","operationId":"partners_inquiry_v1_partners_inquiry_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerInquiryBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/signup":{"post":{"tags":["auth"],"summary":"Create an account in pending_verify status; queue verification email","description":"Registers a new account, queues an email-verification message into tmai_email_outbox (the worker dispatches within ~1 minute), and returns the new account_id. billing_country is ISO-3166 alpha-2 — used by checkout when BILLING_PROVIDER_MODE='country' (currently 'paddle' by default, see /v1/checkout).","operationId":"signup_v1_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify-email":{"post":{"tags":["auth"],"summary":"Consume an email-verification token from the verify link","description":"Flips email_verified=true on the account and schedules a D+1 onboarding email. Idempotent — re-verifying produces zero rows because the token is nulled on first call.","operationId":"verify_email_v1_verify_email_post","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/login":{"post":{"tags":["auth"],"summary":"Verify password and issue access + refresh tokens","description":"Verifies the password (Argon2id), records the session in tmai_sessions, and returns a 1h access JWT plus a 30-day refresh token. Use the access token as Authorization: Bearer for session-authenticated routes.","operationId":"login_v1_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/refresh":{"post":{"tags":["auth"],"summary":"Rotate the refresh token; mint a fresh access + refresh pair","description":"Validates the supplied refresh token, replaces the stored hash, and issues a new access JWT + new refresh token. The old refresh token stops working immediately (rotation pattern — limits damage on leak).","operationId":"refresh_v1_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forgot-password":{"post":{"tags":["auth"],"summary":"Email a 2-hour password-reset token","description":"Always returns {sent: true} even on unknown emails to prevent account enumeration. On a real match, queues a password-reset email with a single-use token valid for 2 hours.","operationId":"forgot_password_v1_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reset-password":{"post":{"tags":["auth"],"summary":"Consume reset token, set new password, revoke all sessions","description":"Accepts a reset token + new password. On success: hashes the new password with Argon2id, clears the reset token, and revokes ALL active sessions for the account (forces re-login from every device — best practice after credential rotation).","operationId":"reset_password_v1_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/api-keys":{"post":{"tags":["account"],"summary":"Create an API key — full secret returned once, never again","description":"Generates a new API key shaped tmai_live_<8hex>.<32urlsafe>. The full key is returned in api_key on this response only; subsequent reads via GET /v1/api-keys return key_prefix only. Store the full key securely on creation.","operationId":"create_api_key_v1_api_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["account"],"summary":"List the calling account's API keys (prefixes only)","description":"Returns each key's id, name, key_prefix, and timestamps. The full secret is never returned — the server only stores its argon2 hash. Sorted newest-first.","operationId":"list_api_keys_v1_api_keys_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyOut"},"title":"Response List Api Keys V1 Api Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/api-keys/{key_id}":{"delete":{"tags":["account"],"summary":"Soft-revoke an API key (sets revoked_at)","description":"Idempotent revocation — re-revoking a revoked key returns 404. The key row is preserved (revoked_at timestamp set) for audit. Subsequent requests with this key return 401.","operationId":"revoke_api_key_v1_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account":{"get":{"tags":["account"],"summary":"Snapshot of the account: profile, active subscription, current-month usage","description":"Returns account profile, active subscription (or null on free tier), and this calendar month's request_count + bytes_returned + remaining quota. Drives the dashboard home screen.","operationId":"get_account_v1_account_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/onboarding/event":{"post":{"tags":["account"],"summary":"Record completion of an onboarding tutorial step","description":"Idempotent — re-recording the same event is a no-op. Used by the dashboard tutorial widget when the user creates their first key, makes their first call, etc.","operationId":"record_onboarding_event_v1_onboarding_event_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingEventBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/onboarding/state":{"get":{"tags":["account"],"summary":"Return the dashboard onboarding tutorial state","description":"Returns the list of all ONBOARDING_STEPS, each annotated as completed or not. Some steps (api_key_created, first_call, concierge_tried) are auto-detected from existing tables — the user doesn't have to POST an event for those.","operationId":"get_onboarding_state_v1_onboarding_state_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/usage":{"get":{"tags":["account"],"summary":"Detailed usage for the dashboard — daily series + top endpoints","description":"Returns the current calendar month's usage at daily granularity, the top-5 endpoints by call count, and a 7-day extrapolation used by the dashboard to prompt for an upgrade ahead of quota exhaustion. Use this for the in-dashboard usage chart; use /v1/account for the lighter summary that drives the home screen.","operationId":"get_usage_detailed_v1_usage_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"tags":["data"],"summary":"Live snapshot of plan + quota for the calling key/session","description":"Cheapest way to read your live counters programmatically. Returns plan_id, quota, used, remaining, and rate_limit_per_minute. Counts as 1 quota call — if you only need the headers, read them off your next real request instead.","operationId":"me_v1_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/checkout":{"post":{"tags":["billing"],"summary":"Create a hosted-checkout session (Paddle by default; configurable)","description":"Provider is chosen by BILLING_PROVIDER_MODE: 'paddle' (default, all customers cleared through Paddle as Merchant of Record), 'razorpay' (force Razorpay for all), or 'country' (route IN -> Razorpay, else -> Paddle). plan_id='enterprise' returns a mailto: contact-sales URL.","operationId":"create_checkout_v1_checkout_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/paddle":{"post":{"tags":["webhooks"],"summary":"Paddle webhook receiver — HMAC-SHA256 verified, persists raw events","description":"Verifies the Paddle-Signature header (HMAC-SHA256 of `<ts>:<body>` with PADDLE_WEBHOOK_SECRET), then persists the raw event into tmai_payment_events. The reconciler worker reads from there and maps events to tmai_subscriptions state.","operationId":"paddle_webhook_webhooks_paddle_post","parameters":[{"name":"Paddle-Signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paddle-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/razorpay":{"post":{"tags":["webhooks"],"summary":"Razorpay webhook receiver — HMAC-SHA256 verified, persists raw events","description":"Verifies the X-Razorpay-Signature header (HMAC-SHA256 of body with RAZORPAY_WEBHOOK_SECRET), then persists the raw event into tmai_payment_events. The reconciler worker maps events to tmai_subscriptions state.","operationId":"razorpay_webhook_webhooks_razorpay_post","parameters":[{"name":"X-Razorpay-Signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Razorpay-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/resend/inbound":{"post":{"tags":["webhooks"],"summary":"Resend inbound webhook — Svix-verified; routes replies to prospect_replies","description":"Verifies svix-id / svix-timestamp / svix-signature headers against RESEND_INBOUND_SECRET, persists the raw event, then matches the inbound's In-Reply-To header against prospect_touches.resend_message_id to insert a prospect_replies row (classification='unclassified'). The async reply_classifier picks it up on next tick; on 'unsubscribe' it flips prospects.do_not_contact.","operationId":"resend_inbound_webhook_webhooks_resend_inbound_post","parameters":[{"name":"svix-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Svix-Id"}},{"name":"svix-timestamp","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Svix-Timestamp"}},{"name":"svix-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Svix-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/cities":{"get":{"tags":["data"],"summary":"Curated cities ranked by a composite desirability score","description":"Filtered by country (iso_alpha2) and minimum score (min_score). The child_city_count and aggregates_neighborhoods markers indicate which rows are megacity rollups (NYC, London, Paris, Tokyo). tier_version pins against a specific quarterly snapshot for reproducibility (default = current; see /v1/cities/tier-versions).","operationId":"get_cities_v1_cities_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"iso_alpha2","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2"}},{"name":"min_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Score"}},{"name":"tier_version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tier Version"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CityOut"},"title":"Response Get Cities V1 Cities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/cities/tier-versions":{"get":{"tags":["data"],"summary":"List ranking-snapshot versions","description":"Returns the available tier_version values, with row count and min/max score per version. Pin /v1/cities?tier_version=N for reproducible queries across quarterly rebuilds.","operationId":"get_tier_versions_v1_cities_tier_versions_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/cities/{city_id}/similar":{"get":{"tags":["data"],"summary":"Cities most similar to a destination","description":"Returns the K cities most similar to the anchor by similarity-embedding cosine distance (a learned geographic + thematic city embedding, ~135K-city coverage). Captures character/setting similarity ('cities like this one'), not just geographic proximity. Backs the Concierge similar-destinations tool; exposed here as a direct developer endpoint.","operationId":"get_similar_cities_v1_cities__city_id__similar_get","parameters":[{"name":"city_id","in":"path","required":true,"schema":{"type":"string","title":"City Id"}},{"name":"k","in":"query","required":false,"schema":{"type":"integer","default":8,"title":"K"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pois/{poi_id}/nearby":{"get":{"tags":["data"],"summary":"Nearest POIs to an anchor POI","description":"Top-K nearest POIs to an anchor, from a nightly-materialised proximity index. Sub-200ms. Backs the Concierge nearby-POIs tool; exposed here as a direct developer endpoint.","operationId":"get_nearby_pois_endpoint_v1_pois__poi_id__nearby_get","parameters":[{"name":"poi_id","in":"path","required":true,"schema":{"type":"string","title":"Poi Id"}},{"name":"k","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"K"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pois":{"get":{"tags":["data"],"summary":"Points of interest, ranked by quality, significance, and knowledge-base grounding","description":"Returns curated POIs (utility/duplicate/tribute/corrupted classes filtered out). Ordering is internal: editorial quality, then significance (world-heritage > national > regional), then strength of knowledge-base grounding, then rating. When city_id is a megacity that has neighborhood children (e.g. New York City), results are automatically rolled up from those children. With no city_id or iso_alpha2 filter, returns a curated sample of verified heritage POIs (scope by city_id or iso_alpha2 for full results).","operationId":"get_pois_v1_pois_get","parameters":[{"name":"city_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Id"}},{"name":"iso_alpha2","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2"}},{"name":"has_qid","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Qid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/POIOut"},"title":"Response Get Pois V1 Pois Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/hotels":{"get":{"tags":["data"],"summary":"Hotels for a city, ranked by rating then curation richness","description":"Ordering: rating DESC > metadata.rating DESC > quality_class > presence of curation flags (notable_for, style, booking_url) > data_quality. Megacity rollup applies to city_id queries (e.g. New York City returns hotels from all NYC boroughs).","operationId":"get_hotels_v1_hotels_get","parameters":[{"name":"city_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Id"}},{"name":"iso_alpha2","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LodgingOut"},"title":"Response Get Hotels V1 Hotels Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/restaurants":{"get":{"tags":["data"],"summary":"Restaurants for a city, ranked by guide tier then rating","description":"Ordering: guide tier (3-star > 2-star > 1-star > value-pick > listed > none) > rating DESC > quality_class > curation richness (notable_for, description) > data_quality. Guide tier is the dominant signal where present (~19k restaurants); rating-based ranking applies otherwise. Megacity rollup applies to city_id (e.g. Paris aggregates from arrondissements).","operationId":"get_restaurants_v1_restaurants_get","parameters":[{"name":"city_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Id"}},{"name":"iso_alpha2","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LodgingOut"},"title":"Response Get Restaurants V1 Restaurants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/experiences":{"get":{"tags":["data"],"summary":"Curated experiences (excludes hotels/utilities/banks/offices/transit/retail)","description":"Ordering: rating DESC NULLS LAST. View `experiences_curated` applies a 12-category POSIX exclusion regex to filter out non-experience venues. Megacity rollup applies.","operationId":"get_experiences_v1_experiences_get","parameters":[{"name":"city_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Id"}},{"name":"iso_alpha2","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LodgingOut"},"title":"Response Get Experiences V1 Experiences Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/visa":{"get":{"tags":["data"],"summary":"Visa rules between two countries (78,804 country-pair edges)","description":"Backed by visa_matrix (W109). Pass passport and/or destination as country code or English name (case-insensitive). requirement is one of visa_free, visa_on_arrival, e_visa, visa_required, no_admission.","operationId":"get_visa_v1_visa_get","parameters":[{"name":"passport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Passport"}},{"name":"destination","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VisaOut"},"title":"Response Get Visa V1 Visa Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/scores/{city_id}":{"get":{"tags":["data"],"summary":"Full composite-score row for a city: master + sub-scores + derived indices","description":"Returns master_score, social/connectivity/NPS/value sub-scores, dimensions_scored, and the seven derived indices (family / luxury / adventure / retirement / weekend-getaway / overtourism-risk / best-fit). Length 0 if the city has no score row.","operationId":"get_city_score_v1_scores__city_id__get","parameters":[{"name":"city_id","in":"path","required":true,"schema":{"type":"string","title":"City Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScoreOut"},"title":"Response Get City Score V1 Scores  City Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/narratives/{city_id}":{"get":{"tags":["data"],"summary":"Narratives for a city, one row per section","description":"Returns every narrative section a city has — generated long-form sections plus extractive overviews — with one best row per section. Rows the multilingual hallucination checker flagged, or that carry a score-leak / quarantine hold, are excluded. Optional ?section= filter.","operationId":"get_narratives_v1_narratives__city_id__get","parameters":[{"name":"city_id","in":"path","required":true,"schema":{"type":"string","title":"City Id"}},{"name":"section","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NarrativeOut"},"title":"Response Get Narratives V1 Narratives  City Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/cities/{city_id}/context":{"get":{"tags":["data"],"summary":"India-enriched context bundle for a city — admin, airport, ASI heritage, circuits","description":"The dense object the Concierge agent's get_city_context tool also calls. Returns admin (state / district / region), nearest airport, ASI monument count + nearby heritage (≤25, India only), tourism circuit memberships, rail stop count, sentiment (paid tier only), and inventory counts.","operationId":"get_city_context_v1_cities__city_id__context_get","parameters":[{"name":"city_id","in":"path","required":true,"schema":{"type":"string","title":"City Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/unesco":{"get":{"tags":["data"],"summary":"UNESCO World Heritage Sites — 2,432 unique across 167 countries","description":"Deduped on (site_name, country_id) preferring rows that carry coordinates, then earliest created_at. Optional iso_alpha2 filter and in_danger boolean. Ordered by year_inscribed DESC.","operationId":"get_unesco_v1_unesco_get","parameters":[{"name":"iso_alpha2","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2"}},{"name":"in_danger","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Danger"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UNESCOOut"},"title":"Response Get Unesco V1 Unesco Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/circuits":{"get":{"tags":["data"],"summary":"List the canonical tourism circuits (India + global)","description":"34 named multi-city circuits: 17 across India (buddhist-circuit, golden-triangle, kerala-backwaters, ...) and 17 global (silk-road, camino-de-santiago, safari-trail, world-wine-trail, northern-lights, ...). Each row has slug, name, description, ideal_duration_days, best_season, the regions traversed (states[] for India, country codes for global), and scope ('india'|'global'). Filter with ?scope=india or ?scope=global.","operationId":"list_circuits_v1_circuits_get","parameters":[{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CircuitOut"},"title":"Response List Circuits V1 Circuits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/circuits/{slug}":{"get":{"tags":["data"],"summary":"Circuit detail with member cities in sequence order","description":"Same fields as CircuitOut plus members[] in sequence_no order, each linked back to a TMAIV2 city UUID where possible (gives you the lat/lon and lets you fan out into other endpoints).","operationId":"get_circuit_v1_circuits__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CircuitDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/states/in":{"get":{"tags":["data"],"summary":"The 36 Indian states + union territories with admin metadata","description":"Returns ISO-3166-2 state_code, state_name, capital, type (state | union_territory), region (cardinal), population, area_km2, and Wikidata QID. Optional region/type filters.","operationId":"list_in_states_v1_states_in_get","parameters":[{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StateOut"},"title":"Response List In States V1 States In Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sentiment/{city_id}":{"get":{"tags":["data"],"summary":"Aggregated traveler sentiment per category — Starter+ tier","description":"Returns avg_rating, review_count, positive/negative %, common_praise + common_complaints keyword arrays per category (overall, hotels, restaurants where available). Megacity rollup applies. Free tier returns 403.","operationId":"get_city_sentiment_v1_sentiment__city_id__get","parameters":[{"name":"city_id","in":"path","required":true,"schema":{"type":"string","title":"City Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/airports/{icao}/weather":{"get":{"tags":["data"],"summary":"Current METAR + TAF forecast + static airport info for an ICAO airport","description":"Returns NOAA Aviation Weather Center data for one airport: current observation (METAR — temp, wind, visibility, ceiling, flight category VFR/MVFR/IFR/LIFR), forecast (TAF, broken into change periods covering ~24h forward), and static metadata (IATA/FAA ids, runways, elevation, tower frequencies). Use `mode=current` for METAR only, `mode=forecast` for TAF only, default `mode=both` returns all three. Cached 10 min in-process. License: PD-US (NOAA, public domain). Attribution: 'Source: NOAA Aviation Weather Center.'","operationId":"get_airport_weather_endpoint_v1_airports__icao__weather_get","parameters":[{"name":"icao","in":"path","required":true,"schema":{"type":"string","title":"Icao"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"both","title":"Mode"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/exchange":{"get":{"tags":["data"],"summary":"Currency conversion using ECB reference rates","description":"Convert an amount between currencies using European Central Bank daily reference rates. Optional `date` (YYYY-MM-DD) for historical rates; defaults to latest. License: PD-ECB. 12-hour in-process cache.","operationId":"exchange_endpoint_v1_exchange_get","parameters":[{"name":"amount","in":"query","required":true,"schema":{"type":"number","title":"Amount"}},{"name":"from_","in":"query","required":true,"schema":{"type":"string","title":"From "}},{"name":"to","in":"query","required":true,"schema":{"type":"string","title":"To"}},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/holidays/{country_iso2}/{year}":{"get":{"tags":["data"],"summary":"Public holidays for a country/year (python-holidays library)","description":"List of public holidays for a country in a given year, with optional sub-national breakdown. Coverage: 200+ countries including **India with 36 state subdivisions** (subdivision='KA' for Karnataka, 'MH' for Maharashtra, etc.). Backed by the BSD-3-licensed `holidays` Python library — in-process lookup, no network hop, no rate limit. The response includes the full list of available subdivisions for the country so the caller can drill in. License: BSD-3-holidays-py.","operationId":"holidays_endpoint_v1_holidays__country_iso2___year__get","parameters":[{"name":"country_iso2","in":"path","required":true,"schema":{"type":"string","title":"Country Iso2"}},{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"subdivision","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subdivision"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forecast":{"get":{"tags":["data"],"summary":"Hourly weather forecast for a city_id or any lat/lon (Norwegian Met Institute)","description":"Hourly forecast for the next 1-36 hours at any point on Earth (not restricted to airports). Returns temperature, humidity, wind, precipitation, cloud cover, plus symbol-code summaries (clear/cloudy/rain/snow/fog/...). Use this for city-grained weather questions; use /v1/airports/{icao}/weather for airport-specific aviation weather. License: CC-BY-4.0 (met.no). 1-hour cache.","operationId":"forecast_endpoint_v1_forecast_get","parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"}},{"name":"city_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Id"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Hours"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/local-time":{"get":{"tags":["data"],"summary":"IANA timezone + local clock time for any lat/lon (offline)","description":"Resolve the IANA timezone for a point on Earth and return the current local clock time (or local time at a specified UTC instant). Fully offline — backed by `timezonefinder` (MIT) + stdlib `zoneinfo` and the IANA tz database. Useful for 'what time is it in <city>?' and UTC↔local conversions.","operationId":"local_time_endpoint_v1_local_time_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","title":"Lat"}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","title":"Lon"}},{"name":"at","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"At"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/countries/{country_iso2}":{"get":{"tags":["data"],"summary":"ISO-3166-1 country info: ISO-3 code, currencies, languages, display name","description":"Canonical country metadata for an ISO-3166-1 alpha-2 code: ISO-3 code, numeric code, official name, official currency (ISO-4217 via Babel/CLDR), official languages (ISO-639), and a locale-aware display name. Fully offline — pycountry (LGPL) + Babel (BSD-3) ship the underlying data.","operationId":"country_info_endpoint_v1_countries__country_iso2__get","parameters":[{"name":"country_iso2","in":"path","required":true,"schema":{"type":"string","title":"Country Iso2"}},{"name":"locale","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Locale"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/calendar/convert":{"get":{"tags":["data"],"summary":"Convert dates across Gregorian/Julian/Hijri/Hebrew/Saka/Jalali/Bahá'í","description":"Convert a date between civil calendars. Gregorian, Julian, Islamic (arithmetic/tabular Hijri), Hebrew, Indian Civil (Saka), Persian (Jalali), Bahá'í are all supported. The Islamic conversion is arithmetic — observed/sighted Hijri may differ ±1 day; the response flags this. License: MIT (convertdate).","operationId":"calendar_convert_endpoint_v1_calendar_convert_get","parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","title":"Date"}},{"name":"from_calendar","in":"query","required":true,"schema":{"type":"string","title":"From Calendar"}},{"name":"to_calendar","in":"query","required":true,"schema":{"type":"string","title":"To Calendar"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/snapshots":{"get":{"tags":["data"],"summary":"Quarterly Parquet snapshot manifest — Growth+ tier","description":"Returns the latest snapshot_id, generated_at, base_url, and a tables map per Parquet file (count, columns, license note). Free / Starter tiers return 403; Growth and Enterprise can read and download from base_url + filename.","operationId":"list_snapshots_v1_snapshots_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/heritage/in":{"get":{"tags":["data"],"summary":"ASI Centrally Protected Monuments — 4,312 rows","description":"All 4,312 ASI-protected monuments. Linked to nearest_city_id where possible. Filterable by state_code (ISO-3166-2 like 'IN-BR') and nearest_city_id. Ordered by distance from nearest city (closest first).","operationId":"list_in_heritage_v1_heritage_in_get","parameters":[{"name":"state_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Code"}},{"name":"nearest_city_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nearest City Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HeritageMonumentOut"},"title":"Response List In Heritage V1 Heritage In Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agent/concierge":{"post":{"tags":["agent"],"summary":"Natural-language travel concierge — grounded itineraries with citations","description":"Send a natural-language travel query (any language script) and receive a structured, citation-bearing itinerary grounded in TravelMindsAI's data layer. The agent calls internal data tools (cities, circuits, heritage, restaurants, hotels, UNESCO) and composes a day-by-day plan. Counts as 1 quota call plus per-tool sub-calls.","operationId":"concierge_v1_agent_concierge_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConciergeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agent/concierge-public":{"post":{"tags":["public"],"summary":"Public Concierge demo — no API key, IP rate-limited","description":"Lower-friction Concierge path for the marketing playground at travelminds.ai/app/console and /demo/. No authentication required. Rate-limited at 10 calls per IP per hour. Queries are logged for moderation review and may be filtered. Use /v1/agent/concierge with an API key for production traffic. Pass ?stream=1 (or Accept: text/event-stream) to receive SSE events: `started`, `tool_call`, `tool_result`, `thinking` (2s keepalive), and a final `done` event carrying the full ConciergeOut JSON.","operationId":"concierge_public_v1_agent_concierge_public_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConciergeOut"}}}}}}},"/v1/agent/tool/{name}":{"post":{"tags":["agent"],"summary":"Direct invocation of any single Concierge tool by name","description":"Atomic per-tool entry point — bypasses the ReAct loop and just runs one tool against the same Postgres pool the agent uses. Body matches the tool's input_schema (see GET /v1/agent/tools for the registry). Same auth / quota / rate-limits as the data API. One call = one quota.","operationId":"concierge_subtool_v1_agent_tool__name__post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-rapidapi-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-Proxy-Secret"}},{"name":"x-rapidapi-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Rapidapi-User"}},{"name":"x-tmai-proxy-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Secret"}},{"name":"x-tmai-proxy-provider","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-Provider"}},{"name":"x-tmai-proxy-user","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tmai-Proxy-User"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Concierge Subtool V1 Agent Tool  Name  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agent/tools":{"get":{"tags":["agent"],"summary":"List all Concierge sub-tools and their input schemas","description":"Public registry view. Each entry has name, description, and input_schema (JSON Schema, same shape Anthropic's tool API expects). Drives client-side SDK generation and the /docs/api/concierge.md atomic-tool-endpoints section.","operationId":"list_concierge_tools_v1_agent_tools_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Concierge Tools V1 Agent Tools Get"}}}}}}}},"components":{"schemas":{"AccountView":{"properties":{"account":{"additionalProperties":true,"type":"object","title":"Account"},"plan_id":{"type":"string","title":"Plan Id"},"subscription":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Subscription"},"usage_this_month":{"$ref":"#/components/schemas/UsageView"}},"type":"object","required":["account","plan_id","usage_this_month"],"title":"AccountView"},"AnchorExperience":{"properties":{"name":{"type":"string","title":"Name"},"why_it_matters":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why It Matters"},"best_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Time"}},"type":"object","required":["name"],"title":"AnchorExperience","description":"Best-in-class itinerary doctrine: each day is built around ONE titled hero\nmoment with explicit significance. Optional — populated when the day has a\nclear anchor; absent for pure transfer/leisure days."},"ApiKeyCreate":{"properties":{"name":{"type":"string","title":"Name","default":"default"}},"type":"object","title":"ApiKeyCreate"},"ApiKeyCreateResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["id","key_prefix","api_key"],"title":"ApiKeyCreateResponse"},"ApiKeyOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","key_prefix"],"title":"ApiKeyOut"},"Body_post_draft_edit_dashboard_sdr_drafts__draft_id__edit_post":{"properties":{"body":{"type":"string","title":"Body"}},"type":"object","required":["body"],"title":"Body_post_draft_edit_dashboard_sdr_drafts__draft_id__edit_post"},"Body_post_feedback_dashboard_sdr_feedback_post":{"properties":{"prospect_id":{"type":"string","title":"Prospect Id"},"kind":{"type":"string","title":"Kind"}},"type":"object","required":["prospect_id","kind"],"title":"Body_post_feedback_dashboard_sdr_feedback_post"},"Body_post_status_dashboard_sdr_status_post":{"properties":{"prospect_id":{"type":"string","title":"Prospect Id"},"new_status":{"type":"string","title":"New Status"}},"type":"object","required":["prospect_id","new_status"],"title":"Body_post_status_dashboard_sdr_status_post"},"Body_sva_queue_edit_dashboard_sva_queue_edit_post":{"properties":{"date":{"type":"string","title":"Date"},"platform":{"type":"string","title":"Platform"},"time":{"type":"string","title":"Time"},"body":{"type":"string","title":"Body"}},"type":"object","required":["date","platform","time","body"],"title":"Body_sva_queue_edit_dashboard_sva_queue_edit_post"},"Body_sva_queue_skip_dashboard_sva_queue_skip_post":{"properties":{"date":{"type":"string","title":"Date"},"platform":{"type":"string","title":"Platform"},"time":{"type":"string","title":"Time"}},"type":"object","required":["date","platform","time"],"title":"Body_sva_queue_skip_dashboard_sva_queue_skip_post"},"CheckoutBody":{"properties":{"plan_id":{"type":"string","pattern":"^(starter|growth|scale|enterprise)$","title":"Plan Id"},"billing_cycle":{"type":"string","pattern":"^(monthly|annual)$","title":"Billing Cycle","default":"monthly"}},"type":"object","required":["plan_id"],"title":"CheckoutBody"},"CheckoutResponse":{"properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Id"},"subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Id"},"contact_sales":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Contact Sales"}},"type":"object","title":"CheckoutResponse"},"CircuitDetailOut":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"ideal_duration_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ideal Duration Days"},"best_season":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Season"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"members":{"items":{"$ref":"#/components/schemas/CircuitMemberOut"},"type":"array","title":"Members"}},"type":"object","required":["slug","name","members"],"title":"CircuitDetailOut"},"CircuitMemberOut":{"properties":{"sequence_no":{"type":"integer","title":"Sequence No"},"city_name":{"type":"string","title":"City Name"},"state_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Code"},"country_iso2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Iso2"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"city_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Id"},"latitude":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Longitude"}},"type":"object","required":["sequence_no","city_name"],"title":"CircuitMemberOut"},"CircuitOut":{"properties":{"slug":{"type":"string","title":"Slug","description":"Kebab-case circuit identifier (e.g. 'buddhist-circuit')."},"name":{"type":"string","title":"Name","description":"Human-readable circuit name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"One-paragraph circuit description."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Theme (e.g. 'spiritual', 'heritage', 'eco')."},"ideal_duration_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ideal Duration Days","description":"Recommended trip length in days."},"best_season":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Season","description":"Best season window (free-form)."},"states":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"States","description":"Regions traversed: ISO-3166-2 state codes (India circuits) or ISO-3166-1 country codes (global circuits)."},"cross_border":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cross Border","description":"True if the circuit crosses an international border."},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope","description":"'india' or 'global'."},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"License id from the registry."},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Public URL of the license text."},"attribution_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attribution Required","description":"True if downstream use must cite the upstream source."}},"type":"object","required":["slug","name"],"title":"CircuitOut"},"CitationsBlock":{"properties":{"tool_calls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tool Calls","default":[]},"data_sources":{"items":{"type":"string"},"type":"array","title":"Data Sources","default":[]},"attribution_lines":{"items":{"type":"string"},"type":"array","title":"Attribution Lines","default":[]},"ground_truth_refs":{"items":{"type":"string"},"type":"array","title":"Ground Truth Refs","default":[]}},"type":"object","title":"CitationsBlock"},"CityOut":{"properties":{"id":{"type":"string","title":"Id","description":"Canonical city UUID. Stable across reads."},"name":{"type":"string","title":"Name","description":"City name in source script (en preferred when both exist)."},"iso_alpha2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2","description":"ISO-3166 alpha-2 country code, uppercase (e.g. 'IN', 'JP')."},"population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Population","description":"Latest known population from source metadata."},"latitude":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latitude","description":"Decimal degrees, signed (string for arbitrary precision)."},"longitude":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Longitude","description":"Decimal degrees, signed (string for arbitrary precision)."},"master_score":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Master Score","description":"Composite TMAIV2 master score, rounded to 2dp. Range 0-1."},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"Internal classification tier (e.g. 'tier-1', 'tier-2')."},"child_city_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Child City Count","description":"Number of child neighborhoods/boroughs aggregated under this row (W52 rollup)."},"aggregates_neighborhoods":{"type":"boolean","title":"Aggregates Neighborhoods","description":"True when this is a megacity row that rolls up child neighborhoods (NYC, London, Paris, Tokyo).","default":false},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"License id from the registry (D7 posture). See GET /v1/licenses."},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Public URL of the license text."},"attribution_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attribution Required","description":"True if downstream use must cite TravelMindsAI / the upstream source."}},"type":"object","required":["id","name"],"title":"CityOut"},"CityRef":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"type":"string","title":"Name"},"iso_alpha2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2"},"state_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Code"}},"type":"object","required":["name"],"title":"CityRef"},"ConciergeOut":{"properties":{"version":{"type":"string","title":"Version","default":"concierge_v0"},"query":{"type":"string","title":"Query"},"language_detected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Detected"},"summary":{"type":"string","title":"Summary","default":""},"itinerary":{"items":{"$ref":"#/components/schemas/ItineraryDay"},"type":"array","title":"Itinerary","default":[]},"restaurants_recommended":{"items":{"$ref":"#/components/schemas/RestaurantRecommended"},"type":"array","title":"Restaurants Recommended","default":[]},"heritage_highlights":{"items":{"$ref":"#/components/schemas/HeritageHighlight"},"type":"array","title":"Heritage Highlights","default":[]},"coverage_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverage Notes"},"citations":{"$ref":"#/components/schemas/CitationsBlock","default":{"tool_calls":[],"data_sources":[],"attribution_lines":[],"ground_truth_refs":[]}},"partial":{"type":"boolean","title":"Partial","default":false},"degraded_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Degraded Reason"},"tokens_used":{"$ref":"#/components/schemas/TokensUsed","default":{"input":0,"output":0,"cache_read":0,"cache_create":0}},"tool_calls_made":{"type":"integer","title":"Tool Calls Made","default":0},"elapsed_ms":{"type":"integer","title":"Elapsed Ms","default":0},"layout_hint":{"type":"string","title":"Layout Hint","default":"universal"}},"type":"object","required":["query"],"title":"ConciergeOut"},"ForgotPasswordBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordBody"},"ForgotPasswordResponse":{"properties":{"sent":{"type":"boolean","title":"Sent","default":true}},"type":"object","title":"ForgotPasswordResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"service":{"type":"string","title":"Service","default":"tmaiv2-gateway"},"version":{"type":"string","title":"Version","default":"0.6.0"}},"type":"object","title":"HealthResponse"},"HeritageHighlight":{"properties":{"name":{"type":"string","title":"Name"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"citation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation"}},"type":"object","required":["name"],"title":"HeritageHighlight"},"HeritageMonumentOut":{"properties":{"id":{"type":"string","title":"Id","description":"Monument UUID (ASI Centrally Protected Monuments)."},"name":{"type":"string","title":"Name","description":"Monument name as published by the ASI."},"state_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Code","description":"ISO-3166-2 state code (e.g. 'IN-BR')."},"district_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District Name","description":"District name as published."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Heritage category (e.g. 'temple', 'fort', 'tomb')."},"protected_since":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Protected Since","description":"Year the monument was first protected by the ASI."},"latitude":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latitude","description":"Decimal degrees, signed."},"longitude":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Longitude","description":"Decimal degrees, signed."},"nearest_city_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nearest City Id","description":"Canonical UUID of the nearest TMAIV2-tracked city."},"nearest_city_km":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nearest City Km","description":"Crow-fly distance to nearest_city_id in km."},"wikidata_qid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Qid","description":"Wikidata QID if grounded."},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"License id (typically 'CC-BY-4.0' for ASI publications)."},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Public URL of the license text."},"attribution_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attribution Required","description":"True if downstream use must cite the ASI."}},"type":"object","required":["id","name"],"title":"HeritageMonumentOut"},"ItineraryDay":{"properties":{"day":{"type":"integer","title":"Day"},"city":{"anyOf":[{"$ref":"#/components/schemas/CityRef"},{"type":"null"}]},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"anchor":{"anyOf":[{"$ref":"#/components/schemas/AnchorExperience"},{"type":"null"}]},"pace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pace"},"morning":{"items":{"$ref":"#/components/schemas/ItineraryItem"},"type":"array","title":"Morning","default":[]},"afternoon":{"items":{"$ref":"#/components/schemas/ItineraryItem"},"type":"array","title":"Afternoon","default":[]},"evening":{"items":{"$ref":"#/components/schemas/ItineraryItem"},"type":"array","title":"Evening","default":[]},"items":{"items":{"$ref":"#/components/schemas/ItineraryItem"},"type":"array","title":"Items","default":[]},"stay":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stay"},"transit_in":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Transit In"}},"type":"object","required":["day"],"title":"ItineraryDay"},"ItineraryItem":{"properties":{"item":{"type":"string","title":"Item"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"duration_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Min"},"timings":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timings"},"fee":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fee"},"citation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation"}},"type":"object","required":["item"],"title":"ItineraryItem"},"LodgingOut":{"properties":{"id":{"type":"string","title":"Id","description":"Canonical hotel / restaurant / experience UUID."},"name":{"type":"string","title":"Name","description":"Venue name."},"city_id":{"type":"string","title":"City Id","description":"Parent city UUID. Megacity rollup applies on city_id queries."},"city_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Name","description":"Parent city name (denormalised)."},"iso_alpha2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2","description":"Country code of the parent city."},"rating":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rating","description":"Source-provided rating (string-typed; precision varies)."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Upstream data source (e.g. 'michelin', 'booking', 'foursquare')."},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"License id from the registry."},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Public URL of the license text."},"attribution_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attribution Required","description":"True if downstream use must cite the upstream source."}},"type":"object","required":["id","name","city_id"],"title":"LodgingOut"},"LoginBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginBody"},"MeResponse":{"properties":{"account_id":{"type":"string","title":"Account Id"},"plan_id":{"type":"string","title":"Plan Id"},"subscription_status":{"type":"string","title":"Subscription Status"},"quota":{"type":"integer","title":"Quota"},"used":{"type":"integer","title":"Used"},"remaining":{"type":"integer","title":"Remaining"},"concierge_quota":{"type":"integer","title":"Concierge Quota","default":0},"concierge_used":{"type":"integer","title":"Concierge Used","default":0},"concierge_remaining":{"type":"integer","title":"Concierge Remaining","default":0},"rate_limit_per_minute":{"type":"integer","title":"Rate Limit Per Minute"}},"type":"object","required":["account_id","plan_id","subscription_status","quota","used","remaining","rate_limit_per_minute"],"title":"MeResponse"},"NarrativeOut":{"properties":{"section":{"type":"string","title":"Section","description":"Narrative section slug (e.g. 'overview', 'food', 'getting-around')."},"content":{"type":"string","title":"Content","description":"The narrative body. Hallucination-checked (W9 v2 multilingual)."},"word_count":{"type":"integer","title":"Word Count","description":"Word count of the content body."},"model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Name","description":"LLM that generated the narrative (e.g. 'qwen/qwen3-30b-a3b-2507')."},"model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Version","description":"Model version / prompt-version stamp."},"generated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Generated At","description":"UTC timestamp of generation."}},"type":"object","required":["section","content","word_count"],"title":"NarrativeOut"},"NewsletterSubscribeBody":{"properties":{"email":{"type":"string","maxLength":254,"minLength":4,"title":"Email"},"source_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Path"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"}},"type":"object","required":["email"],"title":"NewsletterSubscribeBody"},"OnboardingEventBody":{"properties":{"event":{"type":"string","pattern":"^(api_key_created|first_call|concierge_tried|docs_read)$","title":"Event"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"}},"type":"object","required":["event"],"title":"OnboardingEventBody"},"POIOut":{"properties":{"id":{"type":"string","title":"Id","description":"Canonical POI UUID."},"name":{"type":"string","title":"Name","description":"POI name in source script."},"city_id":{"type":"string","title":"City Id","description":"Parent city UUID. Megacity rollup applies on city_id queries."},"city_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Name","description":"Parent city name (denormalised for convenience)."},"iso_alpha2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2","description":"Country code of the parent city."},"rating":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rating","description":"Source-provided rating (string-typed; precision varies by source)."},"fsq_categories":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fsq Categories","description":"Raw upstream category labels. **Deprecated 2026-07-21** — switch to `category_normalized`."},"category_normalized":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Category Normalized","description":"Ordered, deduplicated list of in-house category slugs (e.g. ['do.beach', 'eat.cafe']). First element is the primary category. ~64 leaves across 8 domains (eat / sleep / see / do / shop / move / live / geo). See https://travelminds.ai/docs/category-normalized for the full taxonomy."},"wikidata_qid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Qid","description":"Wikidata QID (e.g. 'Q243') if the POI is grounded."},"wikipedia_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikipedia En","description":"English Wikipedia article slug if known."},"wikidata_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Label","description":"Wikidata label used for matching."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Upstream data source (e.g. 'foursquare', 'osm', 'wikidata')."},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"License id from the registry (D7 posture)."},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Public URL of the license text."},"attribution_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attribution Required","description":"True if downstream use must cite the upstream source."}},"type":"object","required":["id","name","city_id"],"title":"POIOut"},"PartnerInquiryBody":{"properties":{"name":{"type":"string","maxLength":120,"minLength":2,"title":"Name"},"email":{"type":"string","maxLength":254,"minLength":4,"title":"Email"},"company":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Company"},"partner_type":{"type":"string","pattern":"^(agency|academic|integration|other)$","title":"Partner Type"},"description":{"type":"string","maxLength":4000,"minLength":10,"title":"Description"},"expected_volume":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Expected Volume"}},"type":"object","required":["name","email","partner_type","description"],"title":"PartnerInquiryBody"},"PlanOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"monthly_request_quota":{"type":"integer","title":"Monthly Request Quota"},"monthly_concierge_quota":{"type":"integer","title":"Monthly Concierge Quota","default":0},"rate_limit_per_minute":{"type":"integer","title":"Rate Limit Per Minute"},"price_usd_monthly":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Usd Monthly"},"price_usd_annual":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Usd Annual"},"price_inr_monthly":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Inr Monthly"},"price_inr_annual":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Inr Annual"},"features":{"additionalProperties":true,"type":"object","title":"Features","default":{}}},"type":"object","required":["id","name","monthly_request_quota","rate_limit_per_minute"],"title":"PlanOut"},"RefreshBody":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshBody"},"ResetPasswordBody":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","maxLength":128,"minLength":10,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordBody"},"ResetPasswordResponse":{"properties":{"reset":{"type":"boolean","title":"Reset","default":true},"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ResetPasswordResponse"},"RestaurantRecommended":{"properties":{"city_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Id"},"name":{"type":"string","title":"Name"},"michelin_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Michelin Tier"},"citation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation"}},"type":"object","required":["name"],"title":"RestaurantRecommended"},"RevokeResponse":{"properties":{"revoked":{"type":"string","title":"Revoked"}},"type":"object","required":["revoked"],"title":"RevokeResponse"},"ScoreOut":{"properties":{"city_id":{"type":"string","title":"City Id","description":"City UUID this score row applies to."},"name":{"type":"string","title":"Name","description":"City name."},"iso_alpha2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2","description":"Country code."},"master_score":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Master Score","description":"Composite master score (0-1, 2dp)."},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"Internal tier classification."},"social_sub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Social Sub","description":"Social/travel-buzz sub-score."},"connectivity_sub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connectivity Sub","description":"Connectivity (air/rail/road) sub-score."},"nps_sub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nps Sub","description":"Net-promoter style sub-score from review aggregates."},"value_index":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Index","description":"Cost-vs-quality value index."},"dimensions_scored":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Dimensions Scored","description":"Number of input dimensions used to compute this score."},"rising_star":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rising Star","description":"Rising-star momentum signal."},"family_travel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family Travel","description":"Family-travel suitability index."},"luxury_index":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Luxury Index","description":"Luxury-travel suitability index."},"adventure_travel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adventure Travel","description":"Adventure-travel suitability index."},"retirement_expat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retirement Expat","description":"Retirement / long-term expat suitability."},"weekend_getaway":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weekend Getaway","description":"Short-trip / weekend-getaway suitability."},"overtourism_risk":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Overtourism Risk","description":"Overtourism risk index (higher = more crowded)."},"best_fit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Fit","description":"Best-fit traveler-persona label (free-form short string)."},"indices_scored":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Indices Scored","description":"Number of derived indices populated for this row."}},"type":"object","required":["city_id","name"],"title":"ScoreOut"},"SignupBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":10,"title":"Password"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"organisation_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organisation Name"},"billing_country":{"type":"string","maxLength":2,"minLength":2,"title":"Billing Country"},"signup_plan_intent":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Signup Plan Intent"},"signup_cycle_intent":{"anyOf":[{"type":"string","maxLength":12},{"type":"null"}],"title":"Signup Cycle Intent"}},"type":"object","required":["email","password","billing_country"],"title":"SignupBody"},"SignupResponse":{"properties":{"account_id":{"type":"string","title":"Account Id"},"email":{"type":"string","title":"Email"},"email_verification":{"type":"string","title":"Email Verification","default":"sent"}},"type":"object","required":["account_id","email"],"title":"SignupResponse"},"StateOut":{"properties":{"state_code":{"type":"string","title":"State Code","description":"ISO-3166-2 state code (e.g. 'IN-BR')."},"state_name":{"type":"string","title":"State Name","description":"Official state name in English."},"capital":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capital","description":"State capital city name."},"type":{"type":"string","title":"Type","description":"'state' or 'union_territory'."},"region":{"type":"string","title":"Region","description":"Cardinal region (north / south / east / west / north-east / central)."},"population":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Population","description":"Latest census population."},"area_km2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Area Km2","description":"Area in square kilometres."},"wikidata_qid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Qid","description":"Wikidata QID for the state entity."}},"type":"object","required":["state_code","state_name","type","region"],"title":"StateOut"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"Bearer"},"expires_in":{"type":"integer","title":"Expires In","default":3600},"account":{"additionalProperties":true,"type":"object","title":"Account"}},"type":"object","required":["access_token","refresh_token","account"],"title":"TokenResponse"},"TokensUsed":{"properties":{"input":{"type":"integer","title":"Input","default":0},"output":{"type":"integer","title":"Output","default":0},"cache_read":{"type":"integer","title":"Cache Read","default":0},"cache_create":{"type":"integer","title":"Cache Create","default":0}},"type":"object","title":"TokensUsed"},"UNESCOOut":{"properties":{"id":{"type":"string","title":"Id","description":"Site UUID."},"site_name":{"type":"string","title":"Site Name","description":"Official UNESCO site name."},"year_inscribed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year Inscribed","description":"Year the site was first inscribed."},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region","description":"UNESCO region (e.g. 'Asia and the Pacific')."},"site_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Type","description":"cultural / natural / mixed."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"inscribed / in_danger / delisted."},"significance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Significance","description":"UNESCO statement of outstanding universal value (excerpt)."},"latitude":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latitude","description":"Decimal degrees, signed."},"longitude":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Longitude","description":"Decimal degrees, signed."},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name","description":"Country name (English)."},"iso_alpha2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso Alpha2","description":"Country ISO-3166 alpha-2 code."},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"License id from the registry."},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Public URL of the license text."},"attribution_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attribution Required","description":"True if downstream use must cite UNESCO."}},"type":"object","required":["id","site_name"],"title":"UNESCOOut"},"UsageView":{"properties":{"request_count":{"type":"integer","title":"Request Count"},"bytes_returned":{"type":"integer","title":"Bytes Returned"},"quota":{"type":"integer","title":"Quota"},"remaining":{"type":"integer","title":"Remaining"},"concierge_count":{"type":"integer","title":"Concierge Count","default":0},"concierge_quota":{"type":"integer","title":"Concierge Quota","default":0},"concierge_remaining":{"type":"integer","title":"Concierge Remaining","default":0}},"type":"object","required":["request_count","bytes_returned","quota","remaining"],"title":"UsageView"},"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"},"VerifyEmailResponse":{"properties":{"verified":{"type":"boolean","title":"Verified"},"account_id":{"type":"string","title":"Account Id"},"email":{"type":"string","title":"Email"}},"type":"object","required":["verified","account_id","email"],"title":"VerifyEmailResponse"},"VisaOut":{"properties":{"passport_country":{"type":"string","title":"Passport Country","description":"Country of the passport holder."},"destination_country":{"type":"string","title":"Destination Country","description":"Country being travelled to."},"requirement":{"type":"string","title":"Requirement","description":"One of: visa_free, visa_on_arrival, e_visa, visa_required, no_admission."},"duration_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Days","description":"Allowed stay in days (visa-free/visa-on-arrival)."},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","description":"Free-form caveats from the source (e.g. fee, conditions)."},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"License of this row (registry ID)."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Source organisation or dataset name."},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","description":"Canonical link back to the upstream."},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Registry URL for this license."},"attribution_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attribution Required","description":"True if downstream consumers must attribute."}},"type":"object","required":["passport_country","destination_country","requirement"],"title":"VisaOut"},"WebhookResponse":{"properties":{"received":{"type":"boolean","title":"Received","default":true},"event_type":{"type":"string","title":"Event Type"},"event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Id"}},"type":"object","required":["event_type"],"title":"WebhookResponse"}}},"tags":[{"name":"public","description":"No authentication required."},{"name":"auth","description":"Signup, login, email verification, refresh."},{"name":"account","description":"Account, API keys, usage. Session-authenticated."},{"name":"billing","description":"Hosted checkout via Paddle or Razorpay."},{"name":"data","description":"The dataset itself. API-key-authenticated."},{"name":"webhooks","description":"Provider event ingestion. Signature-verified."}],"servers":[{"url":"https://api.travelminds.ai","description":"Production"}]}