{"openapi":"3.1.0","info":{"title":"FactIQ API","description":"Programmatic access to curated economic time series data sourced from the BLS, Census, BEA, and OEWS pipelines. Endpoints cover direct series lookups, authentication, and MCP-based data tools for analysis.","contact":{"name":"FactIQ","url":"https://www.factiq.com/contact"},"version":"1.0.0"},"paths":{"/":{"get":{"tags":["Service"],"summary":"Service health check","description":"Lightweight endpoint that confirms the API process is running.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/series/{series_id}":{"get":{"tags":["Series"],"summary":"Fetch a time series by identifier","description":"Return metadata and datapoints for the requested series. Prefix the identifier with `schema::` to query a non-default schema; otherwise the `bls` schema is assumed.","operationId":"get_series_data_series__series_id__get","parameters":[{"name":"series_id","in":"path","required":true,"schema":{"type":"string","description":"Series identifier. Use the format `schema::series_id` to target a specific schema; defaults to the BLS schema.","examples":["bls::CES0000000001"],"title":"Series Id"},"description":"Series identifier. Use the format `schema::series_id` to target a specific schema; defaults to the BLS schema."}],"responses":{"200":{"description":"Series metadata and datapoints were retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataSeries"}}}},"400":{"description":"The requested schema name was not valid."},"404":{"description":"No series matched the supplied identifier."},"500":{"description":"Database error while retrieving the series."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/google":{"post":{"tags":["Auth"],"summary":"Authenticate With Google","description":"Authenticate the user using a Google ID token, creating a local account if needed.","operationId":"authenticate_with_google_auth_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAuthRequest"}}},"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"}}}}}}},"/auth/email/signup":{"post":{"tags":["Auth"],"summary":"Signup With Email","description":"Create a user account with email/password credentials.","operationId":"signup_with_email_auth_email_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSignupRequest"}}},"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"}}}}}}},"/auth/email/login":{"post":{"tags":["Auth"],"summary":"Login With Email","description":"Authenticate a user with email/password credentials.","operationId":"login_with_email_auth_email_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailLoginRequest"}}},"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"}}}}}}},"/auth/password/reset/request":{"post":{"tags":["Auth"],"summary":"Request Password Reset","description":"Send a password reset email for the requested account.","operationId":"request_password_reset_auth_password_reset_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/password/reset/confirm":{"post":{"tags":["Auth"],"summary":"Confirm Password Reset","description":"Reset the user's password using a valid reset token.","operationId":"confirm_password_reset_auth_password_reset_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirmRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/email/verify/request":{"post":{"tags":["Auth"],"summary":"Request Email Verification","description":"Send (or resend) a verification email for the given address.","operationId":"request_email_verification_auth_email_verify_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/email/verify/confirm":{"post":{"tags":["Auth"],"summary":"Confirm Email Verification","description":"Mark the email associated with the token as verified.","operationId":"confirm_email_verification_auth_email_verify_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationConfirmRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["Auth"],"summary":"Get Profile","description":"Return the current user's profile, usage snapshot and connected assistants.","operationId":"get_profile_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfile"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/api-key":{"get":{"tags":["Auth"],"summary":"Api Key Info","description":"Display metadata for the user's API key (the key itself is never returned).","operationId":"api_key_info_auth_api_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyInfo"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Auth"],"summary":"Create Api Key","description":"Generate the user's API key. Returns the plaintext key exactly once.\n\nIf a key already exists, requires `regenerate: true` — regenerating\ninvalidates the previous key immediately.","operationId":"create_api_key_auth_api_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/refresh":{"post":{"tags":["Auth"],"summary":"Refresh Tokens","description":"Exchange a refresh token for a new access token.","operationId":"refresh_tokens_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"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"}}}}}}},"/auth/passkeys/register/options":{"post":{"tags":["Auth"],"summary":"Passkey Register Options","description":"Return PublicKeyCredentialCreationOptions for passkey registration.","operationId":"passkey_register_options_auth_passkeys_register_options_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/passkeys/register/verify":{"post":{"tags":["Auth"],"summary":"Passkey Register Verify","description":"Verify and store a new passkey credential.","operationId":"passkey_register_verify_auth_passkeys_register_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyRegistrationVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/passkeys/authenticate/options":{"post":{"tags":["Auth"],"summary":"Passkey Authenticate Options","description":"Return PublicKeyCredentialRequestOptions for passkey authentication.","operationId":"passkey_authenticate_options_auth_passkeys_authenticate_options_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyAuthenticationOptionsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyAuthenticationOptionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/passkeys/authenticate/verify":{"post":{"tags":["Auth"],"summary":"Passkey Authenticate Verify","description":"Verify a passkey assertion and return tokens.","operationId":"passkey_authenticate_verify_auth_passkeys_authenticate_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyAuthenticationVerifyRequest"}}},"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"}}}}}}},"/auth/passkeys":{"get":{"tags":["Auth"],"summary":"List Passkeys","description":"List all passkeys for the current user.","operationId":"list_passkeys_auth_passkeys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyListResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/passkeys/{passkey_id}":{"patch":{"tags":["Auth"],"summary":"Update Passkey","description":"Rename a passkey.","operationId":"update_passkey_auth_passkeys__passkey_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"passkey_id","in":"path","required":true,"schema":{"type":"integer","title":"Passkey Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Auth"],"summary":"Remove Passkey","description":"Delete a passkey.","operationId":"remove_passkey_auth_passkeys__passkey_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"passkey_id","in":"path","required":true,"schema":{"type":"integer","title":"Passkey Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/create-checkout-session":{"post":{"tags":["Billing"],"summary":"Create Checkout Session","description":"Start a paid-plan subscription, or change an existing subscriber's plan.\n\nFree/guest users get a Stripe Checkout Session (locked to their account\nemail so the webhook's email-match upgrade applies) and a `checkout_url` to\nredirect to. Existing paid subscribers have their live subscription updated\nin place (prorated) instead of opening a second one — which would\ndouble-bill — and get `{checkout_url: null, updated: true}`.","operationId":"create_checkout_session_billing_create_checkout_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Checkout Session Billing Create Checkout Session Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/billing/stripe/webhook":{"post":{"tags":["Billing"],"summary":"Stripe Webhook","operationId":"stripe_webhook_billing_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Stripe Webhook Billing Stripe Webhook Post"}}}}}}},"/admin/stats":{"get":{"tags":["Admin"],"summary":"Get Stats","operationId":"get_stats_admin_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"}},{"name":"exclude_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Exclude Admins"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mcp/usage":{"get":{"tags":["Admin"],"summary":"Get Mcp Usage","description":"MCP connector usage for the admin dashboard.\n\nCalls are logged one row per `tools/call` (the only grain the server sees —\na fan-out of N calls in one LLM turn is N rows), so `totalCalls` is inflated\nby fan-out; lead with `activeUsers` and `approxSessions` (calls bucketed into\nbursts more than five minutes apart) for a per-question feel.","operationId":"get_mcp_usage_admin_mcp_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"}},{"name":"exclude_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Exclude Admins"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mcp/tool-detail":{"get":{"tags":["Admin"],"summary":"Get Mcp Tool Detail","description":"Daily volume, latency distribution, and recent calls for one MCP tool.","operationId":"get_mcp_tool_detail_admin_mcp_tool_detail_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tool","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Tool"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"}},{"name":"exclude_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Exclude Admins"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mcp/sql-stages":{"get":{"tags":["Admin"],"summary":"Get Mcp Sql Stages","description":"Where the time of a `run_sql` (or, with `tool=get_series`, a\n`get_series`) call goes: p50 and p95 per stage over the last `days` days,\nnext to the same percentiles for the whole call.\n\nStages are the keys of `mcp_tool_calls.timings` (auth, parse, cache,\ndb_connect, db_execute, enrich, serialise, log; see\nrouters/agent/call_stats.py). A\nstage that did not run in a call (no enrichment, say) is absent from that\nrow and so does not pull its percentiles down. `unaccounted` is the gap\nbetween the whole call and the stages on the critical path (everything but\n`log`, which is written after the client has its answer).","operationId":"get_mcp_sql_stages_admin_mcp_sql_stages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}},{"name":"exclude_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Exclude Admins"}},{"name":"tool","in":"query","required":false,"schema":{"type":"string","default":"run_sql","title":"Tool"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mcp/schemas":{"get":{"tags":["Admin"],"summary":"Get Mcp Schema Usage","description":"Tool-call volume by referenced source schema, and how sessions move\nbetween schemas.\n\nThe schema comes straight from the logged tool arguments: the scalar\n``schema`` argument (run_sql, get_series, search_series, describe_dataset)\nplus the ``schemas`` array on search_datasets. Sessions reuse the\n5-minute-gap bucketing from /admin/mcp/usage over ALL calls (retired tool\nnames included, so totalSessions matches that endpoint's approxSessions);\nwithin a session, consecutive references to the same schema collapse into\none step, and the resulting per-session schema sequence yields starting\nschemas, schema-to-schema transitions, distinct-schema depth, and the most\ncommon journey paths. Retired tool names (always ok=false) are excluded\nfrom the schema references themselves so stale-client traffic doesn't\ndistort per-schema success rates.","operationId":"get_mcp_schema_usage_admin_mcp_schemas_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"}},{"name":"exclude_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Exclude Admins"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mcp/retention":{"get":{"tags":["Admin"],"summary":"Get Mcp Retention","description":"Weekly retention for MCP users: who comes back and what they do.\n\nA user's cohort is the ISO week of their first-ever MCP call (computed\nover full history, not the requested window, so a long-time user active\nthis week is classified as returning rather than new). \"New\" always means\nfirst_call_at >= start_date, in the weekly split, the newUsers summary,\nand the cohort grid alike. The window bounds everything else: the weekly\nnew/returning split, the cohort grid (share of each in-window cohort\nactive 0..N weeks after its first call), and the per-user behavior rows\n(active weeks/days, 5-minute-gap sessions, calls, top tools, top\nschemas). Week-1 retention only counts cohorts whose week-1 window is\nfully inside the range, so a partial current week doesn't bias it low.\nCalls to retired tool names (always ok=false) are excluded — a stale\nclient erroring against a renamed tool isn't engagement.","operationId":"get_mcp_retention_admin_mcp_retention_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"}},{"name":"exclude_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Exclude Admins"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"tags":["Admin"],"summary":"Get Users","operationId":"get_users_admin_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"}},{"name":"exclude_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Exclude Admins"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/signups/activity":{"get":{"tags":["Admin"],"summary":"Get Signup Activity","description":"Per-day MCP tool-call activity for every user who signed up on/after\n``start_date``, for the signups dot plot. One object per new user with a\n``calls_by_day`` map, the total, and the day they first connected via an\nMCP client — all bucketed into calendar days of ``tz`` (the launch is\nreasoned about in Singapore time). Aggregated in SQL so heavy users are\ncounted in full rather than truncated to a page of recent rows, and so the\nwhole grid is one query instead of one request per user.","operationId":"get_signup_activity_admin_signups_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End Date"}},{"name":"tz","in":"query","required":false,"schema":{"type":"string","default":"UTC","title":"Tz"}},{"name":"exclude_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Exclude Admins"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/waitlist":{"get":{"tags":["Admin"],"summary":"Get Waitlist Signups","description":"Everyone on the Pro (or given ``plan``) waitlist — name, email, when they\njoined, and whether they already have a registered account (matched by\nemail). Not all waitlist signups are registered users, so this is a\nsuperset of the dot-plot's ``on_pro_waitlist`` flag. Admin emails are\nexcluded — they're our own test signups, not real prospects.","operationId":"get_waitlist_signups_admin_waitlist_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"plan","in":"query","required":false,"schema":{"type":"string","default":"pro","title":"Plan"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/analytics":{"get":{"tags":["Admin"],"summary":"Get Analytics","operationId":"get_analytics_admin_analytics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"}},{"name":"exclude_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Exclude Admins"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{email}/questions":{"get":{"tags":["Admin"],"summary":"Get User Questions","operationId":"get_user_questions_admin_users__email__questions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{email}/mcp":{"get":{"tags":["Admin"],"summary":"Get User Mcp Calls","description":"A user's recent plugin (MCP) tool calls, newest first — the plugin-side\ncounterpart to the question history. One row per tool call.","operationId":"get_user_mcp_calls_admin_users__email__mcp_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Date"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{email}/plan":{"post":{"tags":["Admin"],"summary":"Set User Plan","operationId":"set_user_plan_admin_users__email__plan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetUserPlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{email}/block":{"post":{"tags":["Admin"],"summary":"Block User","description":"Block an account: every request with its credentials gets 403 from now on.","operationId":"block_user_admin_users__email__block_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockUserRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{email}/unblock":{"post":{"tags":["Admin"],"summary":"Unblock User","description":"Lift a block so the account can sign in and call the API again.","operationId":"unblock_user_admin_users__email__unblock_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/intel/stats":{"get":{"tags":["Admin"],"summary":"Get Intel Stats","operationId":"get_intel_stats_admin_intel_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/intel/extractions":{"get":{"tags":["Admin"],"summary":"List Intel Extractions","operationId":"list_intel_extractions_admin_intel_extractions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End Date"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"is_relevant","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Relevant"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/intel/extractions/{extraction_id}":{"get":{"tags":["Admin"],"summary":"Get Intel Extraction Detail","operationId":"get_intel_extraction_detail_admin_intel_extractions__extraction_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"extraction_id","in":"path","required":true,"schema":{"type":"integer","title":"Extraction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/intel/items":{"get":{"tags":["Admin"],"summary":"List Intel Items","operationId":"list_intel_items_admin_intel_items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End Date"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"item_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"schema","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schema"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/intel/assets":{"get":{"tags":["Admin"],"summary":"List Intel Assets","operationId":"list_intel_assets_admin_intel_assets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"End Date"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"feed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feed"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"has_extraction","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Extraction"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/intel/assets/{asset_id}":{"get":{"tags":["Admin"],"summary":"Get Intel Asset","description":"Return a single asset by id in the same shape as the list endpoint.\n\nUsed by the UI to render a pinned 'linked asset' panel when the page is\nopened via a deep-link, regardless of whether the asset would be on the\ncurrent page of the paginated list.","operationId":"get_intel_asset_admin_intel_assets__asset_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"integer","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/catalog/series_counts":{"get":{"tags":["Catalog"],"summary":"Get Series Counts","description":"Latest series count per schema, plus the grand total.\n\nOnly publicly visible schemas are counted, so this endpoint and\n`/catalog/schemas` describe the same set of sources — a hidden or\nadmin-only schema is not named here either.\n\nResponse: {\"counts\": {schema: count, ...}, \"total\": int,\n           \"counted_at\": ISO timestamp of the newest snapshot | null}","operationId":"get_series_counts_catalog_series_counts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/catalog/schemas":{"get":{"tags":["Catalog"],"summary":"Get Schemas","description":"Every publicly visible schema with its identity, summary and counts.\n\nResponse: {\"schemas\": [{schema, organization, country, acronym, summary,\n           dataset_count, series_count, has_series_tables}],\n           \"tables\": TABLE_REFERENCE, \"example_sql\": str,\n           \"counted_at\": str | null}\n\n`dataset_count` is the number of datasets loaded in the database when that\nhas been computed (see `_db_dataset_counts`), else the number described in\nthe catalog metadata; any schema still on the metadata figure is queued\nfor a background warm.","operationId":"get_schemas_catalog_schemas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/catalog/search":{"get":{"tags":["Catalog"],"summary":"Catalog Search","description":"Search public datasets and companies with verified FactIQ holdings.","operationId":"catalog_search_catalog_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/catalog/datasets/{schema}":{"get":{"tags":["Catalog"],"summary":"Get Datasets","description":"Datasets loaded in one schema: [{dataset_code, title, topic,\nseries_count}] sorted by title.\n\nDescribed-but-unloaded datasets are dropped; loaded-but-undescribed ones\nare included with their code as the title. If the database cannot be\nreached the described list is returned without counts.","operationId":"get_datasets_catalog_datasets__schema__get","parameters":[{"name":"schema","in":"path","required":true,"schema":{"type":"string","title":"Schema"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/catalog/datasets/{schema}/{dataset_code}":{"get":{"tags":["Catalog"],"summary":"Get Dataset Detail","description":"Full detail for one dataset: topic, methodology, live dimensions and\nexample series. Cached for six hours — the dimension scan can be slow on\nthe largest schemas.","operationId":"get_dataset_detail_catalog_datasets__schema___dataset_code__get","parameters":[{"name":"schema","in":"path","required":true,"schema":{"type":"string","title":"Schema"}},{"name":"dataset_code","in":"path","required":true,"schema":{"type":"string","title":"Dataset Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/catalog/sample/{schema}/{series_id}":{"get":{"tags":["Catalog"],"summary":"Get Series Sample","description":"A series' catalog row plus its most recent rows.\n\nResponse: {\"series\": {...series columns...}, \"columns\": [...],\n           \"rows\": [[...], ...], \"total_rows\": int}","operationId":"get_series_sample_catalog_sample__schema___series_id__get","parameters":[{"name":"schema","in":"path","required":true,"schema":{"type":"string","title":"Schema"}},{"name":"series_id","in":"path","required":true,"schema":{"type":"string","title":"Series Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/{dashboard_id}/config":{"get":{"tags":["Dashboards"],"summary":"Get Dashboard Config","description":"Return layout metadata (sections, series, chart types) — no data payload.","operationId":"get_dashboard_config_dashboards__dashboard_id__config_get","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/{dashboard_id}/kpis":{"get":{"tags":["Dashboards"],"summary":"Get Dashboard Kpis","description":"Latest values + sparkline + delta for KPI tiles.","operationId":"get_dashboard_kpis_dashboards__dashboard_id__kpis_get","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/{dashboard_id}/sections/{section_id}":{"get":{"tags":["Dashboards"],"summary":"Get Section Data","description":"Batch time series for all series in a section.","operationId":"get_section_data_dashboards__dashboard_id__sections__section_id__get","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}},{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/{dashboard_id}/map/{map_id}":{"get":{"tags":["Dashboards"],"summary":"Get Map Data","description":"Latest data point per state for map visualizations.","operationId":"get_map_data_dashboards__dashboard_id__map__map_id__get","parameters":[{"name":"dashboard_id","in":"path","required":true,"schema":{"type":"string","title":"Dashboard Id"}},{"name":"map_id","in":"path","required":true,"schema":{"type":"string","title":"Map Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/featured-stories":{"get":{"tags":["Featured Stories"],"summary":"Get featured stories for the home page","description":"Returns the editorially-approved list of stories. Empty when no admin has approved any picks (homepage falls back to the 'Try these examples' empty state).","operationId":"get_featured_stories_featured_stories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/featured-stories/candidates":{"get":{"tags":["Featured Stories"],"summary":"List featured story picks for the editorial surface","description":"Return pick rows + enriched story payload for each.\n\n`status` filter is optional — when omitted, returns all non-rejected picks\nso the admin can see pending + approved side by side.","operationId":"list_candidates_admin_featured_stories_candidates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/featured-stories/candidates/{question_id}/approve":{"post":{"tags":["Featured Stories"],"summary":"Approve a pick so it appears in /featured-stories","operationId":"approve_candidate_admin_featured_stories_candidates__question_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","title":"Question Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickDecision"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/featured-stories/candidates/{question_id}/reject":{"post":{"tags":["Featured Stories"],"summary":"Reject a pick — never shows on the homepage","operationId":"reject_candidate_admin_featured_stories_candidates__question_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","title":"Question Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PickDecision"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/featured-stories/reorder":{"post":{"tags":["Featured Stories"],"summary":"Set carousel position for approved picks","description":"Assign display_order = 1..N to the given approved picks in the listed order.\n\nPicks not present in `ordered_question_ids` keep their existing\ndisplay_order. Non-approved picks in the list are skipped.","operationId":"reorder_approved_picks_admin_featured_stories_reorder_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/artifacts/by-question/{question_id}":{"get":{"tags":["Artifacts"],"summary":"List artifacts for a question","description":"Returns metadata for every artifact generated for the given question id.","operationId":"list_artifacts_for_question_artifacts_by_question__question_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","description":"The question_id (run_id) of the agent run","title":"Question Id"},"description":"The question_id (run_id) of the agent run"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/artifacts/{artifact_id}/download":{"get":{"tags":["Artifacts"],"summary":"Download an artifact","description":"Returns the artifact bytes (e.g. an .xlsx workbook) with appropriate Content-Type and filename.","operationId":"download_artifact_artifacts__artifact_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"artifact_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Artifact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/artifacts/{artifact_id}":{"get":{"tags":["Artifacts"],"summary":"Get artifact metadata","description":"Returns artifact metadata without the file bytes (for status polling).","operationId":"get_artifact_artifacts__artifact_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"artifact_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"title":"Artifact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/gwr/phrases":{"get":{"tags":["GWR Dashboard"],"summary":"Get Phrases","description":"Return all tracked-phrase time series for the dashboard.\n\nEach phrase contributes one entry combining the `*-count` and `*-norm-freq`\nseries, with per-year values, plus the curator metadata (chinese_term,\nenglish_variants, discovery_metric_origin, first_appearance_year, peak_year,\npeak_count, total_count, notes) carried as `dimensions`.","operationId":"get_phrases_dashboards_gwr_phrases_get","parameters":[{"name":"schema","in":"query","required":false,"schema":{"type":"string","description":"Schema to query (china_gwr)","default":"china_gwr","title":"Schema"},"description":"Schema to query (china_gwr)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Phrases Dashboards Gwr Phrases Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/gwr/targets":{"get":{"tags":["GWR Dashboard"],"summary":"Get Targets","description":"Return the quantitative target trajectories with per-year modifier/regime\nmetadata. The non-numeric details (modifier, target_regime,\nis_explicitly_absent, unit, source_passage_id, source_quote) are stored as\nper-year dimensions of the form `{YYYY}__{type}` — so we pivot them back\nonto each year's data point.","operationId":"get_targets_dashboards_gwr_targets_get","parameters":[{"name":"schema","in":"query","required":false,"schema":{"type":"string","default":"china_gwr","title":"Schema"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Targets Dashboards Gwr Targets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/gwr/coverage":{"get":{"tags":["GWR Dashboard"],"summary":"Get Coverage","description":"Per-year ingestion coverage: provenance, source URL, word count, premier.\n\nReads `{schema}.documents` (the canonical source-of-truth populated by\n`passages_to_postgres.py`). One row per year that has been successfully\ningested. Years with no row are silently absent — the dashboard infers\n\"missing\" from the gap.","operationId":"get_coverage_dashboards_gwr_coverage_get","parameters":[{"name":"schema","in":"query","required":false,"schema":{"type":"string","default":"china_gwr","title":"Schema"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Coverage Dashboards Gwr Coverage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/gwr/realised":{"get":{"tags":["GWR Dashboard"],"summary":"Get Realised Vs Target","description":"Pair a GWR target series with its NBS realised counterpart, year by year.\n\nREAD-ONLY against the NBS `china` schema — does not write or alter any\nNBS objects. The mapping (target → realised series + transform) is\ndefined in `REALISED_SOURCES` above.","operationId":"get_realised_vs_target_dashboards_gwr_realised_get","parameters":[{"name":"target_id","in":"query","required":true,"schema":{"type":"string","description":"GWR target series_id, e.g. gwr-target-gdp-growth","title":"Target Id"},"description":"GWR target series_id, e.g. gwr-target-gdp-growth"},{"name":"schema","in":"query","required":false,"schema":{"type":"string","description":"GWR schema (china_gwr)","default":"china_gwr","title":"Schema"},"description":"GWR schema (china_gwr)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Realised Vs Target Dashboards Gwr Realised Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboards/gwr/passages/{passage_id}":{"get":{"tags":["GWR Dashboard"],"summary":"Get Passage","description":"Drill-down: return a single passage's text + its document metadata.","operationId":"get_passage_dashboards_gwr_passages__passage_id__get","parameters":[{"name":"passage_id","in":"path","required":true,"schema":{"type":"string","description":"Passage id, e.g. gwr-2024-p0096","title":"Passage Id"},"description":"Passage id, e.g. gwr-2024-p0096"},{"name":"schema","in":"query","required":false,"schema":{"type":"string","default":"china_gwr","title":"Schema"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Passage Dashboards Gwr Passages  Passage Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/equities/watchlists":{"get":{"tags":["Equities"],"summary":"List Watchlists","operationId":"list_watchlists_equities_watchlists_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Watchlist"},"type":"array","title":"Response List Watchlists Equities Watchlists Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Equities"],"summary":"Create Watchlist","operationId":"create_watchlist_equities_watchlists_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Watchlist"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/equities/watchlists/{watchlist_id}":{"patch":{"tags":["Equities"],"summary":"Update Watchlist","operationId":"update_watchlist_equities_watchlists__watchlist_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Watchlist"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Equities"],"summary":"Delete Watchlist","operationId":"delete_watchlist_equities_watchlists__watchlist_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/equities/watchlists/{watchlist_id}/items":{"post":{"tags":["Equities"],"summary":"Add Watchlist Item","operationId":"add_watchlist_item_equities_watchlists__watchlist_id__items_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistItemCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Watchlist"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/equities/watchlists/{watchlist_id}/items/{symbol}":{"delete":{"tags":["Equities"],"summary":"Remove Watchlist Item","operationId":"remove_watchlist_item_equities_watchlists__watchlist_id__items__symbol__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}},{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/equities/{ticker}/fundamentals":{"get":{"tags":["Equities"],"summary":"Company Fundamentals","description":"A single SEC fundamentals statement (income / balance sheet / cash flow)\nfor a ticker, newest period first. Returns the same {columns, results, ...}\npayload the agent's market-data tool serves, or an empty result set when we\nhave no SEC coverage for this ticker/statement (the UI shows an empty\nstate — we do NOT fall back to a different source for the deterministic\ntable).","operationId":"company_fundamentals_equities__ticker__fundamentals_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"statement","in":"query","required":false,"schema":{"type":"string","default":"income_statement","title":"Statement"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"quarterly","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/equities/{ticker}/segments":{"get":{"tags":["Equities"],"summary":"Company Segments","description":"Segment / product / geography breakdown of one SEC metric, pivoted wide\n(one column per member, newest period first) for stacked charting.\n\nSeries IDs are not safely splittable (both metric_code and member names\ncontain underscores), so members are resolved through unified series dimensions\ntable: each breakdown series carries a `metric_code` dimension and a\n`<breakout>_member` dimension. We also return every available\n(breakout, metric) combo so the UI can offer a picker.\n\nThe company's series are found through `filings.securities` (indexed on\nupper(ticker)) and `filings.source_series.issuer_id`, never by matching the\nseries-id prefix: a prefix comparison cannot use an index and reads every\ndimension row in the schema (issue: the admin company page took minutes).","operationId":"company_segments_equities__ticker__segments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"breakout","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Breakout"}},{"name":"metric","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"quarterly","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/equities/{ticker}/transcripts":{"get":{"tags":["Equities"],"summary":"Company Transcripts","description":"Earnings-transcript intelligence for a ticker: the transcript list plus\nextracted claims and Q&A pressure points. Read-only from the `transcripts`\nschema on the DATA cluster. Note only structured claims are stored — there\nis no raw transcript text.","operationId":"company_transcripts_equities__ticker__transcripts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/equities/{ticker}/kpis":{"get":{"tags":["Equities"],"summary":"Company Kpis","description":"All operational-KPI series for a ticker, grouped into chartable blocks —\none block per (kpi_code, value_form, frequency), pivoted wide with one\ncolumn per member, newest period first (same wide shape as /segments).\nBlocks with value_form='yoy_change' are management-stated percent changes,\nNOT levels (companies like SNDK only disclose the change). Also returns the\ndiscovery-profile state and per-filing extraction progress so the admin\npage can show pipeline status even before any series exist.","operationId":"company_kpis_equities__ticker__kpis_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/equities/{ticker}/kpis/provenance":{"get":{"tags":["Equities"],"summary":"Company Kpi Provenance","description":"Per-point provenance for one KPI block: the verbatim filing quote each\nvalue was re-parsed from (fact_lineage.context_ref) plus the source filing.\nFetched on demand by the admin UI when the user expands 'filing quotes' —\nquotes are too heavy to inline into /kpis for every point.","operationId":"company_kpi_provenance_equities__ticker__kpis_provenance_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}},{"name":"kpi","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Kpi"}},{"name":"value_form","in":"query","required":false,"schema":{"type":"string","default":"absolute","title":"Value Form"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"quarterly","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/equities/{ticker}/warehouse":{"get":{"tags":["Equities"],"summary":"Company Warehouse","description":"Every warehouse time series stored for a ticker, grouped by data schema.\n\nTicker strings collide across exchanges, so listings are namespaced the\nway Yahoo Finance does it: a \".DE\"-suffixed ticker serves the German\nlisting only, and a bare ticker serves the US data only. When a bare\nticker also matches a German company, the response carries a\n`german_listing` pointer to the \".DE\" page instead of mixing two\ncompanies' data on one page.\n\nRead-only against the DATA cluster. A schema that does not exist on the\ncluster yet comes back as an empty, `loaded: false` group instead of an\nerror, so the view keeps working while a new company data source is still\nbeing built.","operationId":"company_warehouse_equities__ticker__warehouse_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcripts/overview":{"get":{"tags":["Transcripts Admin"],"summary":"Overview","description":"Per-transcript counts + how much of each has been reviewed.","operationId":"overview_admin_transcripts_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/transcripts/topics":{"get":{"tags":["Transcripts Admin"],"summary":"Topics","description":"Candidate topic leaves (optionally all) with claim samples + decisions.","operationId":"topics_admin_transcripts_topics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_matched","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Matched"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcripts/claims":{"get":{"tags":["Transcripts Admin"],"summary":"Claims","description":"Claims with their review state merged. Data-side filters in SQL, review\nfilters + pagination in Python (Phase-0 scale).","operationId":"claims_admin_transcripts_claims_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"transcript_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Id"}},{"name":"claim_family","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Family"}},{"name":"topic_path","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Path"}},{"name":"candidate_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Candidate Only"}},{"name":"review_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Status"}},{"name":"flagged","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Flagged"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcripts/pressure-points":{"get":{"tags":["Transcripts Admin"],"summary":"Pressure Points","operationId":"pressure_points_admin_transcripts_pressure_points_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"transcript_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/transcripts/disclosure-profiles":{"get":{"tags":["Transcripts Admin"],"summary":"Disclosure Profiles","operationId":"disclosure_profiles_admin_transcripts_disclosure_profiles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/transcripts/topic-curation":{"post":{"tags":["Transcripts Admin"],"summary":"Upsert Topic Curation","operationId":"upsert_topic_curation_admin_transcripts_topic_curation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicCurationIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/transcripts/claim-review":{"post":{"tags":["Transcripts Admin"],"summary":"Upsert Claim Review","operationId":"upsert_claim_review_admin_transcripts_claim_review_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimReviewIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/transcripts/pressure-point-review":{"post":{"tags":["Transcripts Admin"],"summary":"Upsert Pressure Point Review","operationId":"upsert_pressure_point_review_admin_transcripts_pressure_point_review_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PressurePointReviewIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/transcripts/disclosure-curation":{"post":{"tags":["Transcripts Admin"],"summary":"Upsert Disclosure Curation","operationId":"upsert_disclosure_curation_admin_transcripts_disclosure_curation_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisclosureCurationIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/transcripts/apply-curation":{"post":{"tags":["Transcripts Admin"],"summary":"Apply Curation Endpoint","description":"Flush saved curation decisions from the primary cluster into the data\ncluster's ``transcripts`` schema.\n\nThis is the in-app equivalent of the offline\n``load_to_postgres --apply-curation`` loader. The dashboard records decisions\non the primary cluster only; this endpoint runs the same idempotent apply\nlogic against a write-capable data-cluster connection\n(``DATA_DB_ADMIN_*``), re-pointing claims for promoted/merged/renamed/\nrejected topic leaves, applying per-claim corrections, and writing curated\ndisclosure profiles. ``dry_run=true`` previews the changes and rolls back\nwithout stamping anything, so an admin can see what will move before\ncommitting. Idempotent: re-running only touches decisions changed since their\nlast apply.\n\nRuns in a worker thread because ``apply_curation`` uses blocking psycopg\nconnections, and is imported lazily so the data-processing loader stays out\nof the app's startup import graph.","operationId":"apply_curation_endpoint_admin_transcripts_apply_curation_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transcript-coverage/companies":{"get":{"tags":["Transcript Coverage"],"summary":"Get Transcript Coverage Companies","operationId":"get_transcript_coverage_companies_transcript_coverage_companies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/transcript-coverage/matrix":{"get":{"tags":["Transcript Coverage"],"summary":"Get Transcript Coverage Matrix","operationId":"get_transcript_coverage_matrix_transcript_coverage_matrix_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/transcript-coverage/matrix/{company_id}":{"get":{"tags":["Transcript Coverage"],"summary":"Get Transcript Coverage Matrix Company","operationId":"get_transcript_coverage_matrix_company_transcript_coverage_matrix__company_id__get","parameters":[{"name":"company_id","in":"path","required":true,"schema":{"type":"string","title":"Company Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transcript-coverage/companies/{ticker}":{"get":{"tags":["Transcript Coverage"],"summary":"Get Transcript Coverage Company","operationId":"get_transcript_coverage_company_transcript_coverage_companies__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/transcripts/{token}":{"get":{"tags":["Transcript Sources"],"summary":"Transcript Source","description":"Return only the turn context authorized by one opaque permalink.","operationId":"transcript_source_sources_transcripts__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/sources/transcripts/{token}":{"delete":{"tags":["Admin"],"summary":"Revoke Transcript Source","description":"Revoke one transcript permalink without deleting its audit history.","operationId":"revoke_transcript_source_admin_sources_transcripts__token__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/sec_anomalies":{"get":{"tags":["SEC Anomalies Admin"],"summary":"List Sec Anomaly Reports","operationId":"list_sec_anomaly_reports_admin_sec_anomalies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/sec_anomalies/{ticker}":{"get":{"tags":["SEC Anomalies Admin"],"summary":"Get Sec Anomaly Report","operationId":"get_sec_anomaly_report_admin_sec_anomalies__ticker__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/fiq_worker/overview":{"get":{"tags":["FactIQ Worker Admin"],"summary":"Worker Overview","operationId":"worker_overview_admin_fiq_worker_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/fiq_worker/requests":{"get":{"tags":["FactIQ Worker Admin"],"summary":"List Worker Requests","operationId":"list_worker_requests_admin_fiq_worker_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated statuses; 'active' and 'finished' expand to their groups.","title":"Status"},"description":"Comma-separated statuses; 'active' and 'finished' expand to their groups."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/fiq_worker/requests/{request_id}":{"get":{"tags":["FactIQ Worker Admin"],"summary":"Get Worker Request","operationId":"get_worker_request_admin_fiq_worker_requests__request_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"integer","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/sql":{"post":{"tags":["Tools"],"summary":"Run a read-only SQL query against a data schema","description":"Executes SELECT-only SQL via the read-only pool with the agent's query transformations (title coalescing, frequency normalization) and series-metadata enrichment. `sample=true` returns a context-budget preview; `sample=false` returns full rows. `max_rows` bounds the returned rows and the constituent_series metadata list in both modes. `auto_retry=true` opts into the server-side LLM reviser on zero rows. `page` reads the next block of rows; it works only on the nasa_fires schema, whose single detections cannot be aggregated away, and the query needs an ORDER BY or the pages will not line up.","operationId":"tools_sql_tools_sql_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SqlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tools Sql Tools Sql Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/tools/search":{"post":{"tags":["Tools"],"summary":"Search the series catalog by title terms","description":"Deterministic ILIKE matching on series titles (and active compound series), per schema. Substring matching, not semantic search — the caller supplies already-decomposed terms per schema. For anything this misses, fall back to exploration SQL on the `series` and `dimensions` tables.","operationId":"tools_search_tools_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tools Search Tools Search Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/tools/series/{schema_name}/{series_id}":{"get":{"tags":["Tools"],"summary":"Fetch one series (timeseries, tabular, or COMPOUND::)","operationId":"tools_series_tools_series__schema_name___series_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"schema_name","in":"path","required":true,"schema":{"type":"string","title":"Schema Name"}},{"name":"series_id","in":"path","required":true,"schema":{"type":"string","title":"Series Id"}},{"name":"from_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"From Year"}},{"name":"to_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"To Year"}},{"name":"sample","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Sample"}},{"name":"transform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Tools Series Tools Series  Schema Name   Series Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/market":{"post":{"tags":["Tools"],"summary":"Fetch market data (quotes, profiles, forex, commodities)","operationId":"tools_market_tools_market_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tools Market Tools Market Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/tools/geo_data":{"post":{"tags":["Tools"],"summary":"Fetch a satellite-derived indicator aggregated over a region","description":"On-demand satellite signals (fire detections, NO2/SO2/CO columns, aerosol index, vegetation index, rainfall, temperature, soil moisture) aggregated server-side at the provider over a country, state/province, or bounding box — returned as a small time series with source attribution. Regions: ISO3/country name, 'Country/State', or 'bbox:w,s,e,n'. At most 50 intervals per call; results are cached. For fires, NDVI, and the Sentinel-5P columns, aggregation='grid' returns the spatial pattern (one row per lat/lon grid cell) instead of a time series; for fires, aggregation='points' returns the individual detections (only when the window has at most 500) and aggregation='seasons' returns the same calendar window in every year since 2012, one row per year. Fires come from our own detection database, so they allow 200 intervals per call, a chosen grid resolution, and include_flares to count gas flares and other permanent heat sources.","operationId":"tools_geo_data_tools_geo_data_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tools Geo Data Tools Geo Data Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/tools/company_filings":{"post":{"tags":["Tools"],"summary":"Search one company's filed reports (US SEC filers and companies listed in Germany, the UK and France)","description":"This is FactIQ's central tool for company filings. It searches structured\nfacts and report metadata from one company's filed reports, for every company\nin the filings store: US SEC filers (10-K, 10-Q, 8-K, plus 20-F, 40-F, 6-K\nfor foreign filers) and companies listed in Germany, the UK and France\n(annual, half-year, Q1, and Q3 reports; for example company=\"BAS\" for BASF SE\nfrom German issuer reports in EUR, company=\"ULVR\" for Unilever plc from the\nFCA National Storage Mechanism, and company=\"MC\" for LVMH from the AMF via\ninfo-financiere.gouv.fr; UK values are in the issuer's reporting currency,\nGBP, USD or EUR, and French values in EUR). The search is deterministic and does not call a language model. Every\nsuccessful response is a tree and does not expose database row IDs. Set\nformat=\"json\" for the structured tree field. Set format=\"pretty\" for only a\nhuman-readable rendered_tree text. The two formats are never returned together.\nJSON filing and fact nodes retain source_url and add a standardized source_link\nobject for the original filing/report; the pretty rendering ends with a\n\"Source documents\" list mapping each cited filing to its URL. When using a\nreturned figure, place its source URL beside the claim as a Markdown link, for\nexample: FY2025 revenue was $40.0B\n([Visa Inc. FY2025 10-K](https://www.sec.gov/Archives/...)). A sources line\nthat names the filing without linking its URL is not sufficient. Do not make\na second call solely to find a citation or substitute a related press release.\nsource_precision=\"document\" means the URL opens the source document, not an\nexact passage.\n\nUse an exact ticker when possible. A company name is accepted only when it\nidentifies one issuer. A share-class sibling ticker resolves to the same SEC\nfiler (for example GOOGL resolves to the stored GOOG). If a ticker has several\nexact matches, possible_matches lists every tied company and its identifiers.\nWhen nothing matches, possible_matches lists the closest stored companies.\n\nconcept selects one registered financial concept and returns it over time. For\nexample, concept=\"revenue\" selects the best revenue concept stored for that\ncompany. The response states the selected concept. Use query instead for a\nbroad search across several concepts.\n\nsearch_target controls the tree content. coverage shows available report types\nand dates. filings shows report records and source URLs. metrics shows available\nconcepts, dimensions, units, and period coverage. facts shows reported numeric\nvalues. An empty facts browse is filing-first. A facts search with query or\nconcept is concept-first so that values across reporting periods stay together.\n\ncommentary and risk_changes return qualitative statements extracted from SEC\nfilings when each filing was processed; every statement carries a verbatim\nquote from the filing. commentary returns management's explanatory statements\nfrom MD&A sections and earnings press releases: growth drivers, demand and\npricing commentary, capacity and execution milestones, strategy changes, and\nvaguely quantified statements such as \"grew mid-teens\" with a numeric range\nattached. risk_changes returns year-over-year changes in the stated risk\nfactors of annual reports (Item 1A or Item 3.D): new, modified, and removed\nrisks, with the changed passage quoted. A period with no risk_changes rows\nmeans the risk factors were unchanged from the prior year or that filing is\nnot yet processed — never that the company reported no risks. Both targets\ncover US SEC filers only; commentary and risk_changes remain SEC-only and\nreturn no rows for German, UK, or French issuer reports.\n\nquery searches concept names, source labels, source codes, XBRL concepts,\naliases, definitions, and segment names. For commentary and risk_changes it\nsearches topics, statements, and quotes. Filters are applied before search.\nreport_type accepts a common report type (annual, quarterly, half_year) or a\nsource form such as 10-K or 10-Q. For German, UK, and French filers,\nquarterly covers the Q1, half-year, and Q3 reports; their source forms are\nthe document codes of the source (FCA ACS, FR, IR; AMF AMF-RFA, AMF-RFS,\nAMF-IT, AMF-URD, AMF-RES).\nfiscal_year and fiscal_period accept company reporting labels such as 2026 and\nQ3. Earnings 8-Ks take their quarter from the 10-Q or 10-K whose period ended\nwithin the 80 days before the 8-K, and keep the 8-K filing date as the\nreported date. A freshly announced 8-K whose periodic filing has not arrived\nyet carries a quarter estimated from the company's fiscal calendar, replaced\nby the exact period when the filing lands. If neither is available, the tool\nomits the fiscal label instead of guessing.\n\nSome companies file the same concept twice for one period and segment — for\nexample a gross segment total next to a net-of-eliminations figure. Both are\nserved: the extra line is its own series node whose name ends in \"(reported\nline 2)\", and its evidence_note says so. The two lines are alternative\nstatements of the same item. Never add a \"reported line 2\" series to its\nordinary counterpart — that double-counts.\n\nFor non-admin callers, active_only is always enforced by the tool endpoint.\nWith active_only enabled, every target is limited to facts currently marked\nactive and serving; coverage and filings omit reports with no such facts.\n\nIf an exact-ticker metrics or facts request has no matching serving data, the\ntool falls back to Twelve Data standardized consolidated statements. A resolved\nissuer listed in Germany, the UK, or France is sent to the vendor with its\nexchange suffix (.DE, .L, .PA) appended to a bare stored ticker; a stored\nticker that already carries the suffix (MC.PA) is sent as is. Company names\nand bare tickers without a resolved issuer remain filings-database-only so\nvendor data cannot be attributed to a different issuer with the same ticker.\nA request that names no report_type or fiscal_period tries quarterly statements\nand then annual, so\nannual-only vendor coverage still answers. A concept the filings database\nalready holds is never answered from the vendor, even when the other filters\nleave no rows. Fallback values carry no filing-document, source-page, or\nsegment evidence. coverage, filings, and segment-filtered requests remain\nfilings-database-only.","operationId":"tools_company_filings_tools_company_filings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyFilingsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tools Company Filings Tools Company Filings Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/tools/earnings":{"post":{"tags":["Tools"],"summary":"Full-text search over earnings-call claim graphs — management claims ('claims'), analyst Q&A pressure points ('pressure_points'), a company's disclosure habits ('disclosure_profile'), and covered tickers/quarters ('coverage'). For filed XBRL financials use the `sec` schema via SQL.","description":"Search earnings-call intelligence from live calls,\ndecomposed into atomic, quote-anchored claims and Q&A pressure points — never\na raw transcript dump.\n\nRetrieval for \"claims\" and \"pressure_points\" is lexical, not semantic. A\nnonempty query uses an OR-of-tokens full-text candidate set; strict\nwebsearch_to_tsquery matches receive a fixed ranking boost, so strict matches\nrank ahead of loose partial-term matches. Lower-ranked rows may match only\nsome query terms. If that filtered full-text search returns no rows, a trigram\nfallback handles typos and sub-word variants. Quoted phrases use websearch\nsyntax, but synonyms are not inferred: try the company's own vocabulary\n(\"capex\" and \"capital expenditure\", segment names, abbreviations). An empty\nor partial result is not proof that management did not discuss a topic;\ncoverage and vocabulary both matter.\n\nTarget and filter semantics:\n- \"claims\" (default) searches or browses normalized management/analyst claim\n  rows. ticker, quarter_filter, claim_family, section, detail, and\n  limit apply. claim_family matches primary or secondary families; section is\n  \"prepared_remarks\" or \"qa\". Base rows include direction/value/unit where\n  checkable, assertion_status, canonical_statement, verbatim_quote, speaker,\n  speaker_role, section, transcript_id, source_block_index, qa_turn_id, and a\n  source_link object.\n- \"pressure_points\" searches or browses what analysts pressed for and whether\n  management confirmed, declined, deflected, or partially answered. ticker,\n  quarter_filter, claim_family (the linked family), detail, and limit apply.\n  section is ignored because every pressure point is from Q&A. Base rows\n  include specific_ask, response_quality, refused_number, linked_family,\n  linked_claim_id, verbatim_quote, transcript_id, source_block_index,\n  qa_turn_id, and a source_link object.\n- \"disclosure_profile\" is a direct company lookup, not text search. The ticker\n  is the first ticker value, or query when ticker is empty.\n  Profiles are curated separately from transcript coverage, so a covered company\n  may not have one; availability is \"available\" or \"unavailable\" accordingly.\n  quarter_filter, claim_family, section, detail, and limit do not narrow it.\n- \"coverage\" is corpus inventory, not text search. ticker and limit\n  apply; query, quarter_filter, claim_family, section, and detail do not narrow\n  it. Rows report calls_covered, earliest_period, latest_period,\n  latest_call_date, claims, and pressure_points.\n\nAn empty query is a capped browse, not a completeness guarantee. Rows are\nordered by newest fiscal period/call and then source-block (spoken) order\nwithin one call. Every response is limited to at most 50 rows, and a browse\nthat reaches its limit may omit additional rows even if no truncation flag is\npresent. For a latest-call note: (1) call \"coverage\" with one ticker, (2) read\nlatest_period, (3) call \"claims\" with that ticker, quarter_filter=latest_period,\nquery=\"\", detail=true, and a deliberate limit, then (4) call\n\"pressure_points\" with the same ticker and quarter. Treat both browses as\ncapped evidence, not a complete transcript. Narrow large result sets with\nticker, quarter, target, claim_family, and (for claims) section. For media\nquotes, run_sql can read `transcripts.appearance_claims.verbatim_quote`;\nother transcript tables remain restricted.\n\nEvidence rules: canonical_statement is normalized and must not be quoted as\nverbatim. Quote only verbatim_quote, with its speaker, role, ticker, and fiscal\nperiod. A […] inside verbatim_quote marks omitted transcript sentences between\nnon-adjacent evidence spans: preserve it exactly when quoting, and never\npresent text on either side of it as one continuous statement. When a quote is used, render source_link.source_label as the Markdown\nlink text for source_link.source_url beside the claim. The label names the\ncompany, fiscal period, and earnings call transcript; never replace it with an\ningestion vendor. Do not make a second call just to find a citation, do not\ninvent a replacement when source_url is null, and do not call a document-level\nlink exact context. source_locator still identifies the stored transcript block\nor Q&A turn. assertion_status is load-bearing: analyst_hypothesized is the\nanalyst's framing, while mgmt_declined_to_confirm is a refusal, not a management\nassertion. Spoken call claims are a different source class from filed XBRL\nactuals (`run_sql` on the `sec` schema) and formally issued targets (the\n`sec_guidance` dataset); label them separately.\n\nExamples:\n- Latest call: search_earnings_transcripts(query=\"\", search_target=\"coverage\",\n  ticker=\"MU\"), then repeat with search_target=\"claims\",\n  quarter_filter=<latest_period>, detail=true, limit=50, and finally with\n  search_target=\"pressure_points\" for the same ticker and quarter.\n- Cross-company theme: search_earnings_transcripts(query=\"capital expenditure\n  capacity\", search_target=\"claims\", ticker=\"MU,NVDA\", detail=true);\n  inspect each returned row for topical support, do not assume every term\n  matched, and retry vocabulary as needed.\n- Disclosure habits: search_earnings_transcripts(query=\"\",\n  search_target=\"disclosure_profile\", ticker=\"MU\").\n\nclaim_family codes: driver_attribution, forward_conviction, prior_view_revision, strategic_agreement, pricing_mechanics, demand_magnitude, capacity_milestone, competitive_positioning, cohort_behavior, cost_margin_bridge, capital_allocation, stated_risk_constraint, qa_dynamics, regulatory_policy, pipeline_backlog, commodity_hedging, ma_deal, labor_org.\nTopic paths (topic_path column) are rooted at: demand, supply_capacity, pricing, cost_margin, capital, competition, customer, product_roadmap, risk, governance.","operationId":"tools_earnings_tools_earnings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EarningsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tools Earnings Tools Earnings Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/tools/media":{"post":{"tags":["Tools"],"summary":"Lexically search precomputed claims and passage cards from podcasts, TV interviews, and conference talks by executives, investors, analysts, economists, and other guests, about listed and unlisted companies, institutions, and markets.","description":"Deterministically search precomputed intelligence from\npodcasts, TV interviews, and conference talks outside earnings calls. The\nspeakers are company executives, investors, fund managers, analysts,\neconomists, journalists, and other guests, and their claims cover listed and\nunlisted companies (OpenAI, DeepSeek, MiniMax), institutions (the Federal\nReserve, the European Central Bank, regulators), and whole markets and\nindustries, not only the speaker's own employer. No serving-time model\ninterprets or expands the query.\n\nRetrieval for structured findings is lexical, not semantic: strict full-text\nmatching is tried first, loose any-term full-text matching only when strict\nmatching returns no candidates, then trigram matching only when both full-text\nstages are empty. Natural-language questions work because person names and\ncommon question scaffolding are normalized. Prefer concise topical terms; retry\nsynonyms or the speaker's own vocabulary before concluding there is no coverage.\n\nCanonical search_target values:\n- \"search\" (default): blended structured claims and broad passage cards.\n- \"claims\": normalized decision-relevant claims only.\n- \"passages\": broad substantive paraphrase cards only.\n- \"pressure_points\": stored refusal and declined-to-confirm claim rows.\n- \"appearances\": video-level catalog rows.\n- \"coverage\": company-level structured-corpus inventory.\n\nCompatibility aliases remain accepted for older clients: \"all\" maps to\n\"search\", \"videos\" to \"appearances\", and \"companies\" to \"coverage\". New\ncallers should use the six canonical values; \"search\" is the primary blended\ntarget, not a legacy alias.\n\nResult contracts:\n- search/claims/passages/pressure_points return result_kind, canonical_paraphrase,\n  speaker, primary ticker, topic labels, video/channel/publication metadata,\n  lexical relevance, and source_url (a timestamped YouTube deep link, or the\n  episode page for a podcast). detail=true adds normalized\n  claim and attribution fields but never raw transcript text or evidence spans.\n- appearances returns video metadata, primary ticker, attribution metadata,\n  matching claim count, URL, and relevance score. detail has no effect.\n- coverage returns company-level appearance, publication-date-span, channel,\n  claim, and low-confidence-attribution counts. It is structured coverage, not\n  a per-person acquired-video/hour inventory; query, sort, and detail have no\n  effect.\n\nFilter and ordering semantics:\n- company is comma-separated tickers and company names, mixed freely. A\n  stored ticker matches the appearance's company or a section subject with\n  that ticker; any other value is read as the name of a company, institution,\n  or organisation a podcast section is about, matched after dropping\n  punctuation, a leading \"The\", and corporate suffixes. Every ticker attached\n  to a matched name joins the ticker filter, so \"Alphabet\" also reaches GOOGL\n  rows. The result records company_tickers, company_names, company_matched,\n  and company_unmatched (a value that matched nothing, with up to five\n  possible matches); an unmatched value returns no rows, not an error.\n  company_filter is the old name of company and behaves the same; passing\n  both is an error. The appearances and coverage targets also match every\n  value, upper-cased, against the entity references of claims (products,\n  rivals, partners such as \"CUDA\"); a value found only there is listed under\n  company_references. Alternate spellings can return different appearances\n  or coverage rows because reference names are matched exactly (\"open ai\"\n  and \"OpenAI\" select the same subject but not the same references); the\n  claims rows are the same.\n- person is a case-insensitive substring over the finding speaker and/or\n  appearance speaker metadata. appearance_type applies to every target.\n- claim_family restricts structured claims. With blended search it suppresses\n  passage cards; pairing it with search_target=\"passages\" is an error. For\n  appearances/coverage it requires videos with matching structured claims.\n- date_from/date_to are inclusive YYYY-MM-DD bounds on the video's stored\n  publication/upload date, which can differ from the recording or event date.\n- relevance orders lexical score first, then publication date; newest orders\n  publication date first, then lexical score. Coverage has fixed inventory\n  ordering by latest covered publication date.\n\nWith an empty query, search and claims browse recent high-signal claims without\ngeneric passage cards; passages browses recent passage cards; pressure_points\nbrowses recent refusal rows; appearances browses the video catalog; coverage\nreturns the company inventory. Each result set is capped at 1-50 rows.\n\nEvidence safety: canonical_paraphrase is a normalized paraphrase, not a\ntranscript quotation. Cite source_url (timestamped for YouTube) with the returned\nspeaker, publication date, and video metadata. Do not put canonical_paraphrase\nin quotation marks unless you independently verify the wording at the source\nlink. The tool never returns raw transcript text.\n\nDetail-field safety: detail adds normalized claim fields only. The extraction\npipeline's internal audit flags are not published, because they describe how a\nrow was built rather than anything checkable about the claim; judge a claim from\nvalue, assertion_status, and the timestamped source link instead.\ncompany_attribution_confidence and company_attribution_source concern only the\nvideo-to-company/ticker assignment; inferred attribution is not independent\nconfirmation.","operationId":"tools_media_tools_media_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tools Media Tools Media Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/tools/news":{"post":{"tags":["Tools"],"summary":"Search curated business & economics news","description":"Search the curated news feed FactIQ continuously ingests: Bloomberg, the\nFinancial Times, and the Wall Street Journal RSS sections, plus India-macro\n(Zerodha Daily Brief, ET HealthWorld) and global-health sources (WHO, ECDC,\nCDC MMWR, STAT, KFF, and others). Each result is the article's headline, its\nshort publisher-written summary, and the link to the publisher — full article\nbodies are never stored or returned — plus FactIQ-derived metadata: tickers of\nlisted companies explicitly named in the text ({symbol, exchange, country})\nand an `analysis` block: keywords, a geography, and an `angle` — one sentence\non why the story matters to an investor. Pivot macro stories into\nsearch_series / run_sql, and company stories into get_market_data /\nsearch_earnings_transcripts / run_sql on the sec schema.\n\nCoverage is recent news, not an archive: most feeds start late 2025 to\nmid 2026 (Bloomberg back to Dec 2024). All arguments combine (AND).\n\n- query: full-text search over headline + summary. Lexical, not semantic —\n  every word must match, so start with ONE distinctive term (\"Novartis\",\n  \"copper\") and add words only to narrow. If a multi-word query matches\n  nothing, the tool automatically retries matching ANY of the words, ranked\n  so rare words and multi-word matches come first (meta.query_mode =\n  \"any_term\" when that happened). Supports quoted \"exact phrases\" and\n  -exclusion.\n- tickers: match articles naming any of these companies (bare symbols, e.g.\n  [\"NVDA\", \"RELIANCE\"]). Share classes and cross-listings of major companies\n  match automatically (GOOG also matches GOOGL; TSM also matches its Taiwan\n  listing 2330) — pass whichever symbol you know. Most macro stories\n  legitimately name no listed company.\n- topic: one of markets, economics, companies, technology, politics, world, energy, health, india, opinion. Combined with a query, topic is a\n  ranking preference — articles from that topic's feeds rank first, but\n  matches from other sections still return (feed sections are coarse; an\n  energy story often runs in a markets feed). Without a query it is a hard\n  filter on the topic's feeds.\n- start_date / end_date: ISO dates (YYYY-MM-DD) on publication time,\n  inclusive. Start wide or omit; narrow only after seeing results.\n- sources: publisher slugs, any of bloomberg, cdc-mmwr, ecdc, et-healthworld, fierce-pharma, ft, global-fund, kff, stat-news, un-news, who, wsj, zerodha.\n- sort: \"latest\" (default, newest first) or \"relevance\" (text-match rank;\n  needs a non-empty query, otherwise falls back to latest).\n- limit: max rows (1-50, default 20).\n\nReturns {rows: [{id, published_at, source, feed, topics, title, summary, url,\ntickers, analysis}], meta: {matched, returned, sort, query_mode?,\ntopic_mode?}}. `analysis` is null for articles not yet analysed or with no\nbusiness/economic content.","operationId":"tools_news_tools_news_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tools News Tools News Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/tools/context":{"get":{"tags":["Tools"],"summary":"Dataset catalog and table structure for orchestrators","description":"Returns the available schemas, a compact per-schema index, and the shared table DDL. By default `dataset_descriptions` is the lean schema index (a couple of KB) — use `search_datasets` / `describe_dataset` to drill in. Pass `full=true` to get the heavy per-dataset description dump the in-house agent historically inlined (back-compat). `schemas` filters either mode. Schemas whose data has not loaded are listed under `schemas_without_data`. Call once per session before exploring.","operationId":"tools_context_tools_context_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"schemas","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schemas"}},{"name":"full","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Full"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Tools Context Tools Context Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/search_datasets":{"post":{"tags":["Tools"],"summary":"Find datasets by keyword across all schemas","description":"Keyword (BM25, not semantic) ranking over dataset titles and topics across every schema at once — the first step in discovery. Returns ranked {schema, dataset_code, title, topic}. Follow up with `describe_dataset` for detail or `sql` on the series/dimensions tables for the exact series.","operationId":"tools_search_datasets_tools_search_datasets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetSearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tools Search Datasets Tools Search Datasets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/tools/describe_dataset/{schema_name}/{dataset_code}":{"get":{"tags":["Tools"],"summary":"Full metadata for one dataset","description":"Returns a dataset's topic, methodology and discontinuities (when the source provides them), any base-change notice, plus the live list of dimensions and example series. Call after `search_datasets` narrows you to a dataset.","operationId":"tools_describe_dataset_tools_describe_dataset__schema_name___dataset_code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"schema_name","in":"path","required":true,"schema":{"type":"string","title":"Schema Name"}},{"name":"dataset_code","in":"path","required":true,"schema":{"type":"string","title":"Dataset Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Tools Describe Dataset Tools Describe Dataset  Schema Name   Dataset Code  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/report":{"post":{"tags":["Tools"],"summary":"Publish an externally generated report as a public shared run","description":"Accepts a fully formed report (summary + sections of narrative and charts), validates it into the same hydrated shape the in-house agent produces, and stores it as a completed public run. The returned share link renders on the standard share-report page and can be forked by signed-in users. Tabular charts (line/bar/table) take `columns` plus row arrays or objects; other chart types use the hydrated config documented in the skill's report-spec reference. A `text` chart is a prose panel: `title` plus a `body` of one to a few paragraphs, for qualitative content (policy context, caveats) that doesn't belong in a table. A `quote` chart is an attributed-quote panel: `title` plus `quotes` (1-8 items of `{quote, speaker, speaker_role?, affiliation?, context?, source_label?}`), for verbatim quoted speech (e.g. earnings-call quotes) — quotes never go in a text panel body. Neither prose panel counts toward the required minimum of one data chart.","operationId":"tools_share_report_tools_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/shared-charts":{"post":{"tags":["Shared Charts"],"summary":"Create a share-chart","description":"Persist a chart behind a stable /share-chart/<share_id> link. Requires authentication — the caller is recorded as the owner so the chart is editable, and so creation can't be looped anonymously to fill the DB. (Legacy anonymous blob charts predate this and are read via fallback.)","operationId":"create_shared_chart_shared_charts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartSharePayload"}}},"required":true},"responses":{"201":{"description":"Share-chart created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSharedChartResponse"}}}},"400":{"description":"Missing or invalid chart payload."},"401":{"description":"Authentication required."},"413":{"description":"Chart payload too large."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/shared-charts/{share_id}":{"get":{"tags":["Shared Charts"],"summary":"Get the current spec for a share-chart","operationId":"get_shared_chart_shared_charts__share_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"string","description":"Public share slug.","title":"Share Id"},"description":"Public share slug."}],"responses":{"200":{"description":"Current chart spec.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedChartResponse"}}}},"404":{"description":"Not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Shared Charts"],"summary":"Edit a share-chart in place","description":"Overwrite the current spec behind a share link; the prior state is kept as a new version. Owner-only — the URL never changes.","operationId":"update_shared_chart_shared_charts__share_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"string","description":"Public share slug.","title":"Share Id"},"description":"Public share slug."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChartSharePayload"}}}},"responses":{"200":{"description":"Chart updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedChartResponse"}}}},"400":{"description":"Invalid chart payload."},"403":{"description":"Not the owner."},"404":{"description":"Not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/shared-charts/{share_id}/versions":{"get":{"tags":["Shared Charts"],"summary":"List a share-chart's version history","description":"Owner-only. The version list includes editor emails and older chart states the owner may no longer intend to publish, so it requires authentication and ownership — it is never exposed to public viewers.","operationId":"get_shared_chart_versions_shared_charts__share_id__versions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"string","description":"Public share slug.","title":"Share Id"},"description":"Public share slug."}],"responses":{"200":{"description":"Version list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedChartVersionsResponse"}}}},"401":{"description":"Authentication required."},"403":{"description":"Not the owner."},"404":{"description":"Not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/shared-charts/{share_id}/versions/{version}":{"get":{"tags":["Shared Charts"],"summary":"Get a single prior version's spec (read-only preview)","description":"Owner-only. Returns the full chart spec as it was at a given version WITHOUT mutating current — the history UI uses this to preview an older version before deciding whether to restore it. Restoring (which does change current) is the separate POST .../restore.","operationId":"get_shared_chart_version_shared_charts__share_id__versions__version__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"string","description":"Public share slug.","title":"Share Id"},"description":"Public share slug."},{"name":"version","in":"path","required":true,"schema":{"type":"integer","description":"Version number to preview.","title":"Version"},"description":"Version number to preview."}],"responses":{"200":{"description":"The version's chart spec.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedChartResponse"}}}},"401":{"description":"Authentication required."},"403":{"description":"Not the owner."},"404":{"description":"Chart or version not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/shared-charts/{share_id}/restore":{"post":{"tags":["Shared Charts"],"summary":"Restore a previous share-chart version","description":"Copy a prior version's spec back to current, recording the restore as a new version. Owner-only.","operationId":"restore_shared_chart_version_shared_charts__share_id__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"string","description":"Public share slug.","title":"Share Id"},"description":"Public share slug."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreSharedChartRequest"}}}},"responses":{"200":{"description":"Version restored.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedChartResponse"}}}},"403":{"description":"Not the owner."},"404":{"description":"Chart or version not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/waitlist":{"post":{"tags":["Waitlist"],"summary":"Join Waitlist","description":"Record a waitlist signup (idempotent per email + plan).","operationId":"join_waitlist_waitlist_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Join Waitlist Waitlist Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/public/{share_id}":{"get":{"tags":["Public Share"],"summary":"Get shared agent run metadata","operationId":"get_public_question_detail_agent_public__share_id__get","parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"string","description":"Share identifier for the agent run.","title":"Share Id"},"description":"Share identifier for the agent run."}],"responses":{"200":{"description":"Metadata for the shared run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuestionDetail"}}}},"404":{"description":"Shared run not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/public/{share_id}/events":{"get":{"tags":["Public Share"],"summary":"View shared agent run events","operationId":"get_public_question_events_agent_public__share_id__events_get","parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"string","description":"Share identifier for the agent run.","title":"Share Id"},"description":"Share identifier for the agent run."}],"responses":{"200":{"description":"Events for the shared run.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventLogEntry"},"title":"Response Get Public Question Events Agent Public  Share Id  Events Get"}}}},"404":{"description":"Shared run not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/public/{share_id}/fork":{"post":{"tags":["Public Share"],"summary":"Fork a shared agent run into the current user's account","operationId":"fork_public_question_agent_public__share_id__fork_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"share_id","in":"path","required":true,"schema":{"type":"string","description":"Share identifier for the agent run.","title":"Share Id"},"description":"Share identifier for the agent run."}],"responses":{"200":{"description":"Run forked successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuestionForkResponse"}}}},"401":{"description":"Authentication required."},"404":{"description":"Shared run not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/history":{"get":{"tags":["Agent"],"summary":"List previous questions","description":"Return recent questions asked by the authenticated user, ordered from most recent to oldest.","operationId":"get_question_history_agent_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum number of history entries to return.","examples":[50],"default":50,"title":"Limit"},"description":"Maximum number of history entries to return."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":200},{"type":"null"}],"description":"Optional text to search for in previous questions.","examples":["inflation"],"title":"Search"},"description":"Optional text to search for in previous questions."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QuestionLogEntry"},"title":"Response Get Question History Agent History Get"}}}},"401":{"description":"Authentication required."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/history/shared-charts":{"get":{"tags":["Agent"],"summary":"List the caller's standalone shared charts","description":"Return the authenticated user's standalone shared charts published directly (not as part of a run) — e.g. via the MCP `share_chart` tool. These live in the `shared_charts` table and do not appear in the regular question history, which only covers runs.","operationId":"get_shared_chart_history_agent_history_shared_charts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum number of shared charts to return.","examples":[50],"default":50,"title":"Limit"},"description":"Maximum number of shared charts to return."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SharedChartHistoryEntry"},"title":"Response Get Shared Chart History Agent History Shared Charts Get"}}}},"401":{"description":"Authentication required."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/history/{question_id}":{"get":{"tags":["Agent"],"summary":"Get question metadata","description":"Retrieve metadata for a previously asked question by id. Admins may fetch any user's question; other users may only fetch their own.","operationId":"get_question_detail_agent_history__question_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","description":"Question identifier from the history list.","examples":[123],"title":"Question Id"},"description":"Question identifier from the history list."},{"name":"anon_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Anonymous identifier for runs started without authentication.","title":"Anon Id"},"description":"Anonymous identifier for runs started without authentication."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuestionLogEntry"}}}},"401":{"description":"Authentication required."},"404":{"description":"Question not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/history/{question_id}/events":{"get":{"tags":["Agent"],"summary":"Get question events","description":"Retrieve the logged server-sent events for a previously answered question.","operationId":"get_question_events_agent_history__question_id__events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","description":"Question identifier from the history list.","examples":[123],"title":"Question Id"},"description":"Question identifier from the history list."},{"name":"anon_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Anonymous identifier for runs started without authentication.","title":"Anon Id"},"description":"Anonymous identifier for runs started without authentication."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventLogEntry"},"title":"Response Get Question Events Agent History  Question Id  Events Get"}}}},"401":{"description":"Authentication required."},"404":{"description":"Question not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/history/{question_id}/archive":{"post":{"tags":["Agent"],"summary":"Archive question","description":"Mark a question history entry as archived so it no longer appears in the default list.","operationId":"archive_question_agent_history__question_id__archive_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","description":"Question identifier to archive.","examples":[123],"title":"Question Id"},"description":"Question identifier to archive."}],"responses":{"200":{"description":"Question archived successfully.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Archive Question Agent History  Question Id  Archive Post"}}}},"401":{"description":"Authentication required."},"404":{"description":"Question not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/history/{question_id}/share":{"post":{"tags":["Agent"],"summary":"Share agent run publicly","description":"Generate a share identifier so this question's agent run can be viewed without authentication.","operationId":"make_question_public_agent_history__question_id__share_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","description":"Question identifier to share.","examples":[123],"title":"Question Id"},"description":"Question identifier to share."}],"responses":{"200":{"description":"Question shared successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicQuestionShareResponse"}}}},"401":{"description":"Authentication required."},"404":{"description":"Question not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/history/{question_id}/hero-share":{"post":{"tags":["Agent"],"summary":"Attach a hero-chart share to a shared agent run","description":"Record the /share-chart identifier of this report's hero chart on the report row. The report must already be public; the hero-chart share itself is created client-side via the chart-share flow.","operationId":"attach_hero_chart_share_agent_history__question_id__hero_share_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","description":"Question identifier to attach the hero-chart share to.","examples":[123],"title":"Question Id"},"description":"Question identifier to attach the hero-chart share to."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeroChartShareRequest"}}}},"responses":{"200":{"description":"Hero-chart share attached successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeroChartShareResponse"}}}},"400":{"description":"Report is not public."},"401":{"description":"Authentication required."},"404":{"description":"Question not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace":{"get":{"tags":["Workspace"],"summary":"Get Workspace","operationId":"get_workspace_workspace_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/members":{"get":{"tags":["Workspace"],"summary":"List Members","operationId":"list_members_workspace_members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/invitations":{"get":{"tags":["Workspace"],"summary":"List Invitations","operationId":"list_invitations_workspace_invitations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workspace"],"summary":"Create Invitation","operationId":"create_invitation_workspace_invitations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/member-invitations":{"get":{"tags":["Workspace"],"summary":"List Member Invitations","operationId":"list_member_invitations_workspace_member_invitations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workspace"],"summary":"Create Member Invitation","operationId":"create_member_invitation_workspace_member_invitations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberInvitationCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/member-invitations/{invitation_id}/resend":{"post":{"tags":["Workspace"],"summary":"Resend Member Invitation","operationId":"resend_member_invitation_workspace_member_invitations__invitation_id__resend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}},{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/member-invitations/{invitation_id}":{"delete":{"tags":["Workspace"],"summary":"Cancel Member Invitation","operationId":"cancel_member_invitation_workspace_member_invitations__invitation_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}},{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/invitations/{invitation_id}/recipients":{"post":{"tags":["Workspace"],"summary":"Add Recipients","operationId":"add_recipients_workspace_invitations__invitation_id__recipients_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}},{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workspace"],"summary":"Remove Recipient","operationId":"remove_recipient_workspace_invitations__invitation_id__recipients_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}},{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientRemoveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/invitations/{invitation_id}/regenerate":{"post":{"tags":["Workspace"],"summary":"Regenerate Invitation","operationId":"regenerate_invitation_workspace_invitations__invitation_id__regenerate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}},{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/invitations/{invitation_id}/revoke":{"post":{"tags":["Workspace"],"summary":"Revoke Invitation","operationId":"revoke_invitation_workspace_invitations__invitation_id__revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}},{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/members/{user_id}":{"delete":{"tags":["Workspace"],"summary":"Remove Member","operationId":"remove_member_workspace_members__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/members/{user_id}/role":{"patch":{"tags":["Workspace"],"summary":"Change Member Role","operationId":"change_member_role_workspace_members__user_id__role_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"workspace_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/invitations/validate":{"post":{"tags":["Workspace"],"summary":"Validate Invitation","operationId":"validate_invitation_workspace_invitations_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/workspace/invitations/accept":{"post":{"tags":["Workspace"],"summary":"Accept Invitation","operationId":"accept_invitation_workspace_invitations_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/demo/companies/{ticker}":{"get":{"tags":["Demo"],"summary":"Demo Company","operationId":"demo_company_demo_companies__ticker__get","parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/demo/companies/{ticker}/cache":{"delete":{"tags":["Demo"],"summary":"Demo Company Bust Cache","description":"Drop the cached snapshot (e.g. after re-ingesting demo company data).","operationId":"demo_company_bust_cache_demo_companies__ticker__cache_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ticker","in":"path","required":true,"schema":{"type":"string","title":"Ticker"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/mcp/authorize/info":{"get":{"tags":["MCP OAuth"],"summary":"Authorize Info","description":"Public details for the consent screen. No user auth — the txn id is the\ncapability, and nothing sensitive is returned.","operationId":"authorize_info_oauth_mcp_authorize_info_get","parameters":[{"name":"txn","in":"query","required":true,"schema":{"type":"string","title":"Txn"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Authorize Info Oauth Mcp Authorize Info Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/mcp/authorize/complete":{"post":{"tags":["MCP OAuth"],"summary":"Authorize Complete","description":"Mint the authorization code for the signed-in user (or build the denial\nredirect), and return where the browser should go next.","operationId":"authorize_complete_oauth_mcp_authorize_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Authorize Complete Oauth Mcp Authorize Complete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/.well-known/oauth-protected-resource":{"get":{"tags":["MCP OAuth"],"summary":"Protected Resource Metadata","operationId":"protected_resource_metadata__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Protected Resource Metadata  Well Known Oauth Protected Resource Get"}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"tags":["MCP OAuth"],"summary":"Protected Resource Metadata","operationId":"protected_resource_metadata__well_known_oauth_protected_resource_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Protected Resource Metadata  Well Known Oauth Protected Resource Mcp Get"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["MCP OAuth"],"summary":"Authorization Server Metadata","operationId":"authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server/mcp":{"get":{"tags":["MCP OAuth"],"summary":"Authorization Server Metadata","operationId":"authorization_server_metadata__well_known_oauth_authorization_server_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ApiKeyCreateRequest":{"properties":{"regenerate":{"type":"boolean","title":"Regenerate","default":false}},"type":"object","title":"ApiKeyCreateRequest"},"ApiKeyCreateResponse":{"properties":{"api_key":{"type":"string","title":"Api Key"},"prefix":{"type":"string","title":"Prefix"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["api_key","prefix","created_at"],"title":"ApiKeyCreateResponse"},"ApiKeyInfo":{"properties":{"has_key":{"type":"boolean","title":"Has Key"},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefix"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["has_key"],"title":"ApiKeyInfo"},"BlockUserRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"BlockUserRequest"},"ChartSharePayload":{"properties":{"chart":{"additionalProperties":true,"type":"object","title":"Chart"},"chartData":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Chartdata"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"runId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runid"},"toolCallId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Toolcallid"},"yAxisLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Yaxislabel"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"transformStack":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Transformstack"},"editSummary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Editsummary"}},"type":"object","required":["chart"],"title":"ChartSharePayload","description":"Body for create + edit. camelCase aliases match the frontend record."},"ClaimReviewIn":{"properties":{"claim_id":{"type":"string","title":"Claim Id"},"status":{"type":"string","enum":["pending","approved","rejected","needs_fix"],"title":"Status","default":"pending"},"flagged":{"type":"boolean","title":"Flagged","default":false},"corrected_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Corrected Family"},"corrected_topic_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Corrected Topic Path"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","default":[]},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["claim_id"],"title":"ClaimReviewIn"},"CompanyFilingsRequest":{"properties":{"company":{"type":"string","maxLength":200,"minLength":1,"title":"Company"},"query":{"type":"string","maxLength":500,"title":"Query","default":""},"concept":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Concept"},"search_target":{"type":"string","enum":["coverage","filings","metrics","facts","commentary","risk_changes"],"title":"Search Target","default":"facts"},"report_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Report Type"},"fiscal_year":{"anyOf":[{"type":"integer","maximum":2200.0,"minimum":1900.0},{"type":"null"}],"title":"Fiscal Year"},"fiscal_period":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Fiscal Period"},"metric_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Class"},"segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment"},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"},"active_only":{"type":"boolean","title":"Active Only","default":true},"format":{"type":"string","enum":["json","pretty"],"title":"Format","default":"json"},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","default":20}},"type":"object","required":["company"],"title":"CompanyFilingsRequest"},"CompleteRequest":{"properties":{"txn":{"type":"string","title":"Txn"},"approve":{"type":"boolean","title":"Approve"}},"type":"object","required":["txn","approve"],"title":"CompleteRequest"},"CreateCheckoutSessionRequest":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"CreateCheckoutSessionRequest"},"CreateSharedChartResponse":{"properties":{"shareId":{"type":"string","title":"Shareid"}},"type":"object","required":["shareId"],"title":"CreateSharedChartResponse"},"DataPoint":{"properties":{"id":{"type":"string","title":"Id"},"value":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"}],"title":"Value"},"label":{"type":"string","title":"Label"},"date":{"type":"string","title":"Date"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"}},"type":"object","required":["id","value","label","date","unit"],"title":"DataPoint"},"DataSeries":{"properties":{"id":{"type":"string","title":"Id"},"schemaName":{"type":"string","title":"Schemaname"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"units":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Units"},"seasonality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seasonality"},"dataPoints":{"items":{"$ref":"#/components/schemas/DataPoint"},"type":"array","title":"Datapoints"},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frequency"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"county_or_metro_area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"County Or Metro Area"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"survey_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Survey Title"},"survey_details":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Survey Details"},"source":{"anyOf":[{"$ref":"#/components/schemas/SourceInfo"},{"type":"null"}]},"is_compound":{"type":"boolean","title":"Is Compound","default":false},"data_type":{"type":"string","title":"Data Type","default":"timeseries"},"pivotedColumns":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pivotedcolumns"},"pivotedData":{"anyOf":[{"items":{"items":{},"type":"array"},"type":"array"},{"type":"null"}],"title":"Pivoteddata"}},"type":"object","required":["id","schemaName","name","description","units","seasonality","dataPoints","frequency","state","county_or_metro_area","organization","survey_title","survey_details"],"title":"DataSeries"},"DatasetSearchRequest":{"properties":{"query":{"type":"string","title":"Query"},"schemas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Schemas"},"limit":{"type":"integer","title":"Limit","default":15}},"type":"object","required":["query"],"title":"DatasetSearchRequest"},"DisclosureCurationIn":{"properties":{"ticker":{"type":"string","title":"Ticker"},"breaks_out":{"items":{"type":"string"},"type":"array","title":"Breaks Out","default":[]},"not_broken_out":{"items":{"type":"string"},"type":"array","title":"Not Broken Out","default":[]},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["ticker"],"title":"DisclosureCurationIn"},"EarningsRequest":{"properties":{"query":{"type":"string","title":"Query","description":"For claims/pressure_points: lexical websearch text; strict matches rank above loose partial-term matches, with trigram fallback only when FTS returns no rows. Empty text browses capped rows. For disclosure_profile, it can supply the ticker when ticker is empty. Ignored by coverage.","default":""},"search_target":{"type":"string","enum":["claims","pressure_points","disclosure_profile","coverage"],"title":"Search Target","description":"claims or pressure_points perform lexical retrieval/browse; disclosure_profile is a direct company lookup; coverage is corpus inventory.","default":"claims"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker","description":"Ticker, or a comma-separated list of tickers, for claims, pressure_points, and coverage; case-insensitive. Company names belong in company_name; pass only one of the two. A name passed here is still read as a name when it fits a stored company, and the response says so. The response lists possible matches for a value that is not in the transcript corpus. disclosure_profile uses only the first ticker."},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Company name, or a comma-separated list of names, for claims, pressure_points, and coverage; case-insensitive ('nvidia', 'HP Inc', 'Ford Motor'). Each name resolves to the stored ticker(s) that match it best; the response reports the resolution and lists possible matches for a name that resolved to nothing. Pass either company_name or ticker, not both. disclosure_profile uses only the first resolved ticker."},"company_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Filter","description":"Deprecated alias of ticker, kept for clients installed before the parameter was renamed. Pass ticker instead."},"quarter_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quarter Filter","description":"Exact fiscal period such as FY2026Q3; applies to claims and pressure_points. Ignored by disclosure_profile and coverage. Pin this after coverage for a single-call browse."},"claim_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Family","description":"Claim-family code. Matches primary/secondary families on claims and the linked family on pressure_points; ignored by disclosure_profile and coverage."},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section","description":"prepared_remarks or qa; applies only to claims. Ignored for pressure_points because those rows are all Q&A, and ignored by lookup/inventory targets."},"detail":{"type":"boolean","title":"Detail","description":"For claims, add structured_fields, secondary_families, period, time_horizon, conviction_qualifier, denominator, and falsifiable; for pressure_points, add tone_note. Ignored by disclosure_profile and coverage. The extractor's quantified flag is not published: it only records that the extractor wrote something into value, which the caller can already see in value itself.","default":false},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","description":"Maximum 1-50 rows (default 15). This is a hard cap, not proof the result is complete; narrow by ticker, quarter, target, family, and claims section.","default":15}},"type":"object","title":"EarningsRequest"},"EmailLoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"EmailLoginRequest"},"EmailSignupRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"}},"type":"object","required":["email","password"],"title":"EmailSignupRequest"},"EmailVerificationConfirmRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"EmailVerificationConfirmRequest"},"EmailVerificationRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"EmailVerificationRequest"},"EmailVerificationResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"EmailVerificationResponse"},"EventLogEntry":{"properties":{"id":{"type":"integer","title":"Id"},"question_id":{"type":"integer","title":"Question Id"},"event_type":{"type":"string","title":"Event Type"},"event_payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Event Payload"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","question_id","event_type","created_at"],"title":"EventLogEntry"},"ExternalReport":{"properties":{"summary":{"type":"string","maxLength":5000,"minLength":1,"title":"Summary"},"sections":{"items":{"$ref":"#/components/schemas/ExternalReportSection"},"type":"array","maxItems":12,"minItems":1,"title":"Sections"},"methodology_notes":{"type":"string","title":"Methodology Notes","default":""}},"type":"object","required":["summary","sections"],"title":"ExternalReport"},"ExternalReportSection":{"properties":{"heading":{"type":"string","title":"Heading"},"narrative":{"type":"string","title":"Narrative","default":""},"charts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Charts"}},"type":"object","required":["heading"],"title":"ExternalReportSection"},"GeoRequest":{"properties":{"dataset":{"type":"string","title":"Dataset"},"region":{"type":"string","title":"Region"},"start_date":{"type":"string","title":"Start Date"},"end_date":{"type":"string","title":"End Date"},"aggregation":{"type":"string","title":"Aggregation","default":"monthly"},"resolution":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Resolution"},"include_flares":{"type":"boolean","title":"Include Flares","default":false}},"type":"object","required":["dataset","region","start_date","end_date"],"title":"GeoRequest"},"GoogleAuthRequest":{"properties":{"id_token":{"type":"string","title":"Id Token","description":"Google ID token obtained from the client-side OAuth flow."}},"type":"object","required":["id_token"],"title":"GoogleAuthRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HeroChartShareRequest":{"properties":{"hero_chart_share_id":{"type":"string","title":"Hero Chart Share Id"}},"type":"object","required":["hero_chart_share_id"],"title":"HeroChartShareRequest"},"HeroChartShareResponse":{"properties":{"question_id":{"type":"integer","title":"Question Id"},"hero_chart_share_id":{"type":"string","title":"Hero Chart Share Id"}},"type":"object","required":["question_id","hero_chart_share_id"],"title":"HeroChartShareResponse"},"InvitationCreateRequest":{"properties":{"emails":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Emails"},"role":{"type":"string","enum":["owner","member"],"title":"Role","default":"member"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["emails"],"title":"InvitationCreateRequest"},"InvitationEmailRequest":{"properties":{"token":{"type":"string","title":"Token"},"email":{"type":"string","title":"Email"}},"type":"object","required":["token","email"],"title":"InvitationEmailRequest"},"MarketRequest":{"properties":{"asset":{"type":"string","title":"Asset"},"data_type":{"type":"string","enum":["price_history","quote","company_profile","etf_profile","symbol_search"],"title":"Data Type","default":"price_history"},"frequency":{"type":"string","enum":["daily","weekly","monthly"],"title":"Frequency","default":"daily"},"limit":{"type":"integer","maximum":5000.0,"minimum":1.0,"title":"Limit","default":100},"sample":{"type":"boolean","title":"Sample","default":true}},"type":"object","required":["asset"],"title":"MarketRequest"},"McpConnection":{"properties":{"client":{"type":"string","title":"Client"},"connected_at":{"type":"string","format":"date-time","title":"Connected At"},"last_connected_at":{"type":"string","format":"date-time","title":"Last Connected At"}},"type":"object","required":["client","connected_at","last_connected_at"],"title":"McpConnection","description":"One AI assistant the user has connected to FactIQ.\n\nclient is the assistant's display name (\"Claude\", \"Claude Code\", \"Codex\",\n\"ChatGPT\", or \"API key\" for raw fiq_ keys). connected_at is the first time\nit connected; last_connected_at the most recent sign-in from it."},"MediaRequest":{"properties":{"query":{"type":"string","title":"Query","description":"Lexical search text. Natural-language questions are accepted because person/question scaffolding is normalized, not because a serving-time model interprets them. Use concise topical vocabulary and retry synonyms or the speaker's own terminology if needed. Ignored by coverage; appearances matches only video title/channel metadata.","default":""},"search_target":{"type":"string","enum":["search","claims","passages","pressure_points","appearances","coverage","all","videos","companies"],"title":"Search Target","description":"Canonical targets: \"search\" (default blended claims + passages), \"claims\" (normalized decision-relevant claims), \"passages\" (broad substantive paraphrase cards), \"pressure_points\" (refusals and declined-to-confirm claims), \"appearances\" (video catalog), and \"coverage\" (company-level structured-corpus inventory). Compatibility aliases are \"all\" -> \"search\", \"videos\" -> \"appearances\", and \"companies\" -> \"coverage\"; new callers should use the canonical values.","default":"search"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company","description":"Comma-separated tickers and company names, mixed freely (for example, 'NVDA,OpenAI' or 'Federal Reserve,Alphabet'). A value that is a stored ticker matches the appearance's company or a section subject with that ticker. Any other value is read as the name of a company, institution, or organisation the podcast section is about, so unlisted companies (OpenAI, MiniMax, Manycore Tech), central banks, and regulators are found by name. Names are matched after dropping punctuation, a leading 'The', and corporate suffixes ('NVIDIA Corp.' finds NVIDIA; 'Alphabet' also reaches GOOGL rows), and each result records how every value was read: company_tickers, company_names, company_matched, and company_unmatched (with up to five possible matches per value that matched nothing). The appearances and coverage targets also match every value, upper-cased, against the entity references of claims (products, rivals, partners such as 'CUDA' or 'ChatGPT'); a value found only there is listed under company_references. Alternate spellings can return different appearances or coverage rows because reference names are matched exactly ('open ai' and 'OpenAI' select the same subject but not the same references); the claims rows are the same."},"company_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Filter","description":"Old name of company. Accepted with the same behaviour; the response note asks the client to update its plugin. Do not pass both."},"person":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person","description":"Case-insensitive name substring matched against the result speaker and/or the appearance speaker metadata."},"sort":{"type":"string","enum":["relevance","newest"],"title":"Sort","description":"\"relevance\" orders lexical score first and publication date second; \"newest\" orders publication date first and lexical score second. Coverage uses its fixed company-inventory ordering.","default":"relevance"},"appearance_type":{"anyOf":[{"type":"string","enum":["podcast","tv_interview","conference","other"]},{"type":"null"}],"title":"Appearance Type","description":"Optional appearance-type filter: podcast, tv_interview, conference, or other. Applies to every canonical target."},"claim_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claim Family","description":"Optional claim-ontology code. Blended search then returns structured claims only; appearances/coverage require matching claims. It is incompatible with search_target='passages'. Invalid codes return the valid vocabulary."},"date_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From","description":"Inclusive YYYY-MM-DD lower bound on the video's stored publication/upload date, which may differ from its recording or event date."},"date_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To","description":"Inclusive YYYY-MM-DD upper bound on the video's stored publication/upload date, which may differ from its recording or event date."},"detail":{"type":"boolean","title":"Detail","description":"For search/claims/passages/pressure_points, add normalized claim and company-attribution fields. Internal audit flags use bounded public names and include field_semantics; raw transcript text and evidence spans remain excluded. Has no effect on appearances or coverage rows.","default":false},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","description":"Maximum rows returned, from 1 through 50.","default":15}},"type":"object","title":"MediaRequest"},"MemberInvitationCreateRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"MemberInvitationCreateRequest"},"NewsRequest":{"properties":{"query":{"type":"string","title":"Query","default":""},"tickers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tickers"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sources"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"sort":{"type":"string","enum":["latest","relevance"],"title":"Sort","default":"latest"},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","default":20}},"type":"object","title":"NewsRequest"},"PasskeyAuthenticationOptionsRequest":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","title":"PasskeyAuthenticationOptionsRequest"},"PasskeyAuthenticationOptionsResponse":{"properties":{"options":{"additionalProperties":true,"type":"object","title":"Options"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["options","session_id"],"title":"PasskeyAuthenticationOptionsResponse"},"PasskeyAuthenticationVerifyRequest":{"properties":{"credential":{"type":"string","title":"Credential"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["credential","session_id"],"title":"PasskeyAuthenticationVerifyRequest"},"PasskeyInfo":{"properties":{"id":{"type":"integer","title":"Id"},"device_name":{"type":"string","title":"Device Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"backed_up":{"type":"boolean","title":"Backed Up"},"transports":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Transports"}},"type":"object","required":["id","device_name","created_at","last_used_at","backed_up","transports"],"title":"PasskeyInfo"},"PasskeyListResponse":{"properties":{"passkeys":{"items":{"$ref":"#/components/schemas/PasskeyInfo"},"type":"array","title":"Passkeys"}},"type":"object","required":["passkeys"],"title":"PasskeyListResponse"},"PasskeyRegistrationVerifyRequest":{"properties":{"credential":{"type":"string","title":"Credential"},"device_name":{"type":"string","title":"Device Name","default":"Passkey"}},"type":"object","required":["credential"],"title":"PasskeyRegistrationVerifyRequest"},"PasskeyUpdateRequest":{"properties":{"device_name":{"type":"string","title":"Device Name"}},"type":"object","required":["device_name"],"title":"PasskeyUpdateRequest"},"PasswordResetConfirmRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"PasswordResetConfirmRequest"},"PasswordResetRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"PasswordResetRequest"},"PasswordResetResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"PasswordResetResponse"},"PickDecision":{"properties":{"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"display_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Order"}},"type":"object","title":"PickDecision"},"PressurePointReviewIn":{"properties":{"pp_id":{"type":"string","title":"Pp Id"},"status":{"type":"string","enum":["pending","approved","rejected","needs_fix"],"title":"Status","default":"pending"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["pp_id"],"title":"PressurePointReviewIn"},"PublicQuestionDetail":{"properties":{"question_id":{"type":"integer","title":"Question Id"},"run_id":{"type":"string","title":"Run Id"},"share_id":{"type":"string","title":"Share Id"},"question":{"type":"string","title":"Question"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"shared_at":{"type":"string","format":"date-time","title":"Shared At"},"hero_chart_share_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Chart Share Id"}},"type":"object","required":["question_id","run_id","share_id","question","created_at","shared_at"],"title":"PublicQuestionDetail"},"PublicQuestionForkResponse":{"properties":{"question_id":{"type":"integer","title":"Question Id"},"run_id":{"type":"string","title":"Run Id"}},"type":"object","required":["question_id","run_id"],"title":"PublicQuestionForkResponse"},"PublicQuestionShareResponse":{"properties":{"question_id":{"type":"integer","title":"Question Id"},"run_id":{"type":"string","title":"Run Id"},"share_id":{"type":"string","title":"Share Id"},"shared_at":{"type":"string","format":"date-time","title":"Shared At"}},"type":"object","required":["question_id","run_id","share_id","shared_at"],"title":"PublicQuestionShareResponse"},"QuestionLogEntry":{"properties":{"question_id":{"type":"integer","title":"Question Id"},"question":{"type":"string","title":"Question"},"archived":{"type":"boolean","title":"Archived"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_public":{"type":"boolean","title":"Is Public","default":false},"public_share_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Share Id"},"public_shared_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Public Shared At"}},"type":"object","required":["question_id","question","archived","created_at"],"title":"QuestionLogEntry"},"RecipientRemoveRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"RecipientRemoveRequest"},"RecipientRequest":{"properties":{"emails":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Emails"}},"type":"object","required":["emails"],"title":"RecipientRequest"},"RefreshTokenRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshTokenRequest"},"RegenerateRequest":{"properties":{"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","title":"RegenerateRequest"},"ReorderPayload":{"properties":{"ordered_question_ids":{"items":{"type":"integer"},"type":"array","title":"Ordered Question Ids"}},"type":"object","required":["ordered_question_ids"],"title":"ReorderPayload"},"RestoreSharedChartRequest":{"properties":{"version":{"type":"integer","title":"Version"}},"type":"object","required":["version"],"title":"RestoreSharedChartRequest"},"RoleRequest":{"properties":{"role":{"type":"string","enum":["owner","member"],"title":"Role"}},"type":"object","required":["role"],"title":"RoleRequest"},"SearchQuery":{"properties":{"schema":{"type":"string","title":"Schema"},"terms":{"items":{"type":"string"},"type":"array","title":"Terms"}},"type":"object","required":["schema","terms"],"title":"SearchQuery"},"SearchRequest":{"properties":{"queries":{"items":{"$ref":"#/components/schemas/SearchQuery"},"type":"array","title":"Queries"},"limit":{"type":"integer","title":"Limit","default":15},"include_compound":{"type":"boolean","title":"Include Compound","default":true}},"type":"object","required":["queries"],"title":"SearchRequest"},"SetUserPlanRequest":{"properties":{"plan_type":{"type":"string","title":"Plan Type"},"duration_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Months"}},"type":"object","required":["plan_type"],"title":"SetUserPlanRequest"},"ShareReportRequest":{"properties":{"question":{"type":"string","maxLength":2000,"minLength":1,"title":"Question"},"report":{"$ref":"#/components/schemas/ExternalReport"},"model":{"type":"string","maxLength":100,"title":"Model","description":"Label for the model/orchestrator that generated the report.","default":""}},"type":"object","required":["question","report"],"title":"ShareReportRequest"},"ShareReportResponse":{"properties":{"question_id":{"type":"integer","title":"Question Id"},"run_id":{"type":"string","title":"Run Id"},"response_id":{"type":"string","title":"Response Id"},"share_id":{"type":"string","title":"Share Id"},"share_path":{"type":"string","title":"Share Path"},"share_url":{"type":"string","title":"Share Url"}},"type":"object","required":["question_id","run_id","response_id","share_id","share_path","share_url"],"title":"ShareReportResponse"},"SharedChartHistoryEntry":{"properties":{"share_id":{"type":"string","title":"Share Id"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"chart_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chart Type"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["share_id","created_at"],"title":"SharedChartHistoryEntry","description":"A standalone shared chart (shared_charts table) surfaced in the history\nsidebar. These have no question_logs run — they are published directly, e.g.\nvia the MCP `share_chart` tool — so they carry their own stable share slug."},"SharedChartResponse":{"properties":{"id":{"type":"string","title":"Id"},"version":{"type":"integer","title":"Version","default":1},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Createdat"},"updatedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updatedat"},"isOwner":{"type":"boolean","title":"Isowner","default":false},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"runId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runid"},"toolCallId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Toolcallid"},"yAxisLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Yaxislabel"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"chart":{"additionalProperties":true,"type":"object","title":"Chart"},"chartData":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Chartdata"},"transformStack":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Transformstack"}},"type":"object","required":["id","chart"],"title":"SharedChartResponse","description":"Current spec for a share link. Serialized camelCase to match the frontend\nChartShareRecord shape so the client can consume it with minimal mapping."},"SharedChartVersionEntry":{"properties":{"version":{"type":"integer","title":"Version"},"editSummary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Editsummary"},"editedBy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Editedby"},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Createdat"},"chartTitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charttitle"},"chartType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Charttype"}},"type":"object","required":["version"],"title":"SharedChartVersionEntry"},"SharedChartVersionsResponse":{"properties":{"versions":{"items":{"$ref":"#/components/schemas/SharedChartVersionEntry"},"type":"array","title":"Versions"},"currentVersion":{"type":"integer","title":"Currentversion"}},"type":"object","required":["versions","currentVersion"],"title":"SharedChartVersionsResponse"},"SourceInfo":{"properties":{"country":{"type":"string","title":"Country"},"organization_acronym":{"type":"string","title":"Organization Acronym"},"original_info":{"type":"string","title":"Original Info"}},"type":"object","required":["country","organization_acronym","original_info"],"title":"SourceInfo","description":"Structured source information for search results."},"SqlRequest":{"properties":{"question":{"type":"string","title":"Question","default":""},"sql":{"type":"string","title":"Sql"},"schema":{"type":"string","title":"Schema"},"exploration":{"type":"boolean","title":"Exploration","default":false},"auto_retry":{"type":"boolean","title":"Auto Retry","default":false},"sample":{"type":"boolean","title":"Sample","default":true},"max_rows":{"type":"integer","title":"Max Rows","default":500},"page":{"type":"integer","title":"Page","default":1}},"type":"object","required":["sql","schema"],"title":"SqlRequest"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"user":{"$ref":"#/components/schemas/User"},"monthly_usage":{"anyOf":[{"$ref":"#/components/schemas/UsageQuota"},{"type":"null"}]},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}},"type":"object","required":["access_token","user"],"title":"TokenResponse"},"TopicCurationIn":{"properties":{"topic_path":{"type":"string","title":"Topic Path"},"decision":{"type":"string","enum":["pending","promote","merge","rename","reject"],"title":"Decision","default":"pending"},"merge_into":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Merge Into"},"new_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Name"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["topic_path"],"title":"TopicCurationIn"},"UsageQuota":{"properties":{"usage_month":{"type":"string","format":"date","title":"Usage Month"},"request_count":{"type":"integer","title":"Request Count"},"request_limit":{"type":"integer","title":"Request Limit"}},"type":"object","required":["usage_month","request_count","request_limit"],"title":"UsageQuota"},"User":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"picture_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Picture Url"},"plan_type":{"type":"string","title":"Plan Type"},"personal_plan_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Personal Plan Type"},"plan_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Plan Expires At"},"personal_plan_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Personal Plan Expires At"},"entitlement_source":{"type":"string","title":"Entitlement Source","default":"personal"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"email_verified":{"type":"boolean","title":"Email Verified","default":false},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"blocked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Blocked At"}},"type":"object","required":["id","email","plan_type"],"title":"User"},"UserProfile":{"properties":{"user":{"$ref":"#/components/schemas/User"},"monthly_usage":{"anyOf":[{"$ref":"#/components/schemas/UsageQuota"},{"type":"null"}]},"is_admin":{"type":"boolean","title":"Is Admin","default":false},"mcp_connections":{"items":{"$ref":"#/components/schemas/McpConnection"},"type":"array","title":"Mcp Connections"}},"type":"object","required":["user"],"title":"UserProfile"},"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"},"WaitlistRequest":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"plan":{"type":"string","title":"Plan","default":"pro"}},"type":"object","required":["name","email"],"title":"WaitlistRequest"},"Watchlist":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"position":{"type":"integer","title":"Position"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"items":{"items":{"$ref":"#/components/schemas/WatchlistItem"},"type":"array","title":"Items"}},"type":"object","required":["id","name","position","created_at","updated_at","items"],"title":"Watchlist"},"WatchlistCreate":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"WatchlistCreate"},"WatchlistItem":{"properties":{"id":{"type":"integer","title":"Id"},"symbol":{"type":"string","title":"Symbol"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"position":{"type":"integer","title":"Position"},"added_at":{"type":"string","format":"date-time","title":"Added At"}},"type":"object","required":["id","symbol","position","added_at"],"title":"WatchlistItem"},"WatchlistItemCreate":{"properties":{"symbol":{"type":"string","title":"Symbol"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"}},"type":"object","required":["symbol"],"title":"WatchlistItemCreate"},"WatchlistUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"type":"object","title":"WatchlistUpdate"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"Series","description":"Lookup time series metadata and datapoints from the curated economic datasets."},{"name":"Auth","description":"Authenticate with Google OAuth and manage access/refresh tokens."},{"name":"Service","description":"Utility endpoints that expose health and operational details."},{"name":"Billing","description":"Stripe webhooks and billing-related callbacks."},{"name":"Admin","description":"Admin dashboard endpoints."},{"name":"Dashboards","description":"Pre-built interactive economic dashboards (public, no auth required)."},{"name":"Featured Stories","description":"Curated publicly shared stories for the home page."},{"name":"Artifacts","description":"Download generated artifacts (e.g. spreadsheet workbooks) for agent reports."}]}