{"openapi":"3.1.0","info":{"title":"Ghana Market Data Cloud API","version":"0.0.1"},"paths":{"/v1/health":{"get":{"summary":"Health","description":"Liveness: is this process running? Deliberately dependency-free — a restart is\nthe wrong remedy for a database that is merely slow. See /v1/ready.","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health V1 Health Get"}}}}}}},"/v1/ready":{"get":{"summary":"Ready","description":"Readiness: can this process actually serve? Pings both pools, so an API whose\nPostgres pool is dead stops reporting itself healthy — which /v1/health could not\ndetect, because it never touched a dependency.","operationId":"ready_v1_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/macro/ghana/inflation":{"get":{"summary":"Inflation","operationId":"inflation_v1_macro_ghana_inflation_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Inflation V1 Macro Ghana Inflation Get"}}}}}}},"/v1/macro/ghana/policy-rate":{"get":{"summary":"Policy Rate","operationId":"policy_rate_v1_macro_ghana_policy_rate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Policy Rate V1 Macro Ghana Policy Rate Get"}}}}}}},"/v1/fx/USDGHS":{"get":{"summary":"Usdghs","operationId":"usdghs_v1_fx_USDGHS_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Usdghs V1 Fx Usdghs Get"}}}}}}},"/v1/fx":{"get":{"summary":"Fx Board","description":"Latest mid rate per currency pair (the full interbank board).","operationId":"fx_board_v1_fx_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Fx Board V1 Fx Get"}}}}}}},"/v1/commodities":{"get":{"summary":"Commodities","description":"Monthly cocoa, gold and Brent prices, international and Ghana-realized.\n\nBoth bases are returned together because the pair is the point: 'international' is\nthe world price and 'realized' is what Ghana actually got for its exports, and the\nspread between them is what no other feed carries.\n\nThese are monthly averages and the newest month is provisional — the Bank of Ghana\nrestates it in the following release — so a caller comparing two snapshots should\nexpect the most recent month to move.","operationId":"commodities_v1_commodities_get","parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"default":13,"title":"Months"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Commodities V1 Commodities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/macro/ghana/inflation/history":{"get":{"summary":"Inflation History","operationId":"inflation_history_v1_macro_ghana_inflation_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Inflation History V1 Macro Ghana Inflation History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fx/USDGHS/history":{"get":{"summary":"Fx History","operationId":"fx_history_v1_fx_USDGHS_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Fx History V1 Fx Usdghs History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/fixed-income/ghana/treasury-bills":{"get":{"summary":"Treasury Bills","operationId":"treasury_bills_v1_fixed_income_ghana_treasury_bills_get","parameters":[{"name":"tenor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Treasury Bills V1 Fixed Income Ghana Treasury Bills Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"summary":"Me","operationId":"me_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Me V1 Me Get"}}}}}},"patch":{"summary":"Update Me","description":"Update the account's display name. Email is the login identifier and the key\nthe billing/mail paths join on, so it is not editable here.","operationId":"update_me_v1_me_patch","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Update Me V1 Me Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tickers":{"get":{"summary":"Tickers","operationId":"tickers_v1_tickers_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Tickers V1 Tickers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tickers/{symbol}":{"get":{"summary":"Ticker Detail","operationId":"ticker_detail_v1_tickers__symbol__get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ticker Detail V1 Tickers  Symbol  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tickers/{symbol}/price":{"get":{"summary":"Ticker Price","operationId":"ticker_price_v1_tickers__symbol__price_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ticker Price V1 Tickers  Symbol  Price Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tickers/{symbol}/history":{"get":{"summary":"History","operationId":"history_v1_tickers__symbol__history_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"adjust","in":"query","required":false,"schema":{"type":"string","default":"splits_dividends","title":"Adjust"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response History V1 Tickers  Symbol  History Get","$ref":"#/components/schemas/Envelope"}}}},"503":{"description":"adjustment_unavailable: verified inputs or current factors missing; request adjust=none for raw history"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tickers/{symbol}/ohlc":{"get":{"summary":"Ohlc","description":"Daily prices for interactive charts (raw, unadjusted). Most-recent `days`\nsessions, oldest-first (what charting libraries expect).\n\nThe GSE feed reports a closing price only — no intraday open/high/low. Where\nthose are absent we echo the close so candle renderers still receive numbers,\nbut that produces a zero-range bar (a flat dash), which reads as real intraday\ndata when it isn't. `has_ohlc` says whether EVERY returned point carries a true\nrange, so clients can offer candles only when they'd be meaningful and fall back\nto a line otherwise.","operationId":"ohlc_v1_tickers__symbol__ohlc_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":180,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ohlc V1 Tickers  Symbol  Ohlc Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tickers/{symbol}/intraday":{"get":{"summary":"Intraday","description":"Today's intraday price points for the live chart, from the Redis series the\nlive-quote poller fills during market hours (app.services.live_quotes). Empty\noutside trading hours — the daily OHLC endpoint is the historical view.","operationId":"intraday_v1_tickers__symbol__intraday_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Intraday V1 Tickers  Symbol  Intraday Get","$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"stream_not_entitled: realtime grant required"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market/gainers":{"get":{"summary":"Gainers","operationId":"gainers_v1_market_gainers_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gainers V1 Market Gainers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market/losers":{"get":{"summary":"Losers","operationId":"losers_v1_market_losers_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Losers V1 Market Losers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market/most-active":{"get":{"summary":"Most Active","operationId":"most_active_v1_market_most_active_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Most Active V1 Market Most Active Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/market/snapshot":{"get":{"summary":"Snapshot","operationId":"snapshot_v1_market_snapshot_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Snapshot V1 Market Snapshot Get"}}}}}}},"/v1/indices":{"get":{"summary":"Indices","operationId":"indices_v1_indices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Indices V1 Indices Get"}}}}}}},"/v1/indices/{code}/history":{"get":{"summary":"Index History","description":"Daily closing level for an index, oldest-first. One point per session — see\nV028, which re-exposed the series that per-session versioning had hidden.","operationId":"index_history_v1_indices__code__history_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":180,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Index History V1 Indices  Code  History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/portfolios":{"get":{"summary":"List Portfolios","operationId":"list_portfolios_v1_portfolios_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Portfolios V1 Portfolios Get"}}}}}},"post":{"summary":"Create Portfolio","operationId":"create_portfolio_v1_portfolios_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Portfolio V1 Portfolios Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/portfolios/{portfolio_id}/holdings":{"post":{"summary":"Add Holding","operationId":"add_holding_v1_portfolios__portfolio_id__holdings_post","parameters":[{"name":"portfolio_id","in":"path","required":true,"schema":{"type":"integer","title":"Portfolio Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Holding V1 Portfolios  Portfolio Id  Holdings Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/portfolios/{portfolio_id}/holdings/csv":{"post":{"summary":"Import Holdings Csv","description":"CSV columns: symbol,quantity,cost_basis_minor. Valid rows load; invalid rows\nare reported per-row with reasons (the admin-console partial-success pattern).","operationId":"import_holdings_csv_v1_portfolios__portfolio_id__holdings_csv_post","parameters":[{"name":"portfolio_id","in":"path","required":true,"schema":{"type":"integer","title":"Portfolio Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Import Holdings Csv V1 Portfolios  Portfolio Id  Holdings Csv Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/portfolios/{portfolio_id}/valuation":{"get":{"summary":"Valuation","operationId":"valuation_v1_portfolios__portfolio_id__valuation_get","parameters":[{"name":"portfolio_id","in":"path","required":true,"schema":{"type":"integer","title":"Portfolio Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Valuation V1 Portfolios  Portfolio Id  Valuation Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys":{"get":{"summary":"List Keys","operationId":"list_keys_v1_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Keys V1 Keys Get"}}}}}},"post":{"summary":"Create Key","operationId":"create_key_v1_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_key_v1_keys_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Key V1 Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys/{key_id}":{"delete":{"summary":"Revoke Key","operationId":"revoke_key_v1_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Key V1 Keys  Key Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/usage":{"get":{"summary":"Usage","operationId":"usage_v1_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Usage V1 Usage Get"}}}}}}},"/v1/billing/plan":{"get":{"summary":"Billing Plan","operationId":"billing_plan_v1_billing_plan_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Billing Plan V1 Billing Plan Get"}}}}}}},"/v1/billing/checkout":{"post":{"summary":"Checkout","operationId":"checkout_v1_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_checkout_v1_billing_checkout_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Checkout V1 Billing Checkout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/verify":{"post":{"summary":"Verify","operationId":"verify_v1_billing_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_v1_billing_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Verify V1 Billing Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/webhook":{"post":{"summary":"Webhook","operationId":"webhook_v1_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Webhook V1 Billing Webhook Post"}}}}}}},"/v1/billing/cancel":{"post":{"summary":"Cancel","description":"Turn off auto-renew. The plan stays active until plan_renews_at, then the\nexpiry sweep drops it to free.","operationId":"cancel_v1_billing_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Cancel V1 Billing Cancel Post"}}}}}}},"/v1/billing/downgrade":{"post":{"summary":"Downgrade","description":"Immediately switch to the free plan and cancel any subscription.","operationId":"downgrade_v1_billing_downgrade_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Downgrade V1 Billing Downgrade Post"}}}}}}},"/v1/billing/invoices":{"get":{"summary":"Invoices","operationId":"invoices_v1_billing_invoices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Invoices V1 Billing Invoices Get"}}}}}}},"/v1/auth/register":{"post":{"summary":"Register","operationId":"register_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_register_v1_auth_register_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Register V1 Auth Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/login":{"post":{"summary":"Login","operationId":"login_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_login_v1_auth_login_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Login V1 Auth Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/set-password":{"post":{"summary":"Set Password","operationId":"set_password_v1_auth_set_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_password_v1_auth_set_password_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Password V1 Auth Set Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/logout-key":{"post":{"summary":"Logout Key","description":"Revoke a session key on logout. Only touches keys minted as web sessions, so a\nreal API key dropped into the cookie is never revoked by signing out.","operationId":"logout_key_v1_auth_logout_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_logout_key_v1_auth_logout_key_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Logout Key V1 Auth Logout Key Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/google":{"post":{"summary":"Google Sign In","operationId":"google_sign_in_v1_auth_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_google_sign_in_v1_auth_google_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Google Sign In V1 Auth Google Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/overview":{"get":{"summary":"Overview","operationId":"overview_v1_admin_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Overview V1 Admin Overview Get"}}}}}}},"/v1/admin/customers":{"get":{"summary":"Customers","description":"Full, searchable customer list — the operator's roster. Each row carries the\nplan, subscription state, live key count, and this-month usage so support can\ntriage without a DB console.","operationId":"customers_v1_admin_customers_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Customers V1 Admin Customers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/redistribution/license":{"get":{"summary":"My License","operationId":"my_license_v1_redistribution_license_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My License V1 Redistribution License Get"}}}}}}},"/v1/admin/redistribution":{"get":{"summary":"Admin List","operationId":"admin_list_v1_admin_redistribution_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin List V1 Admin Redistribution Get"}}}}}},"post":{"summary":"Admin Create","operationId":"admin_create_v1_admin_redistribution_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_admin_create_v1_admin_redistribution_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Create V1 Admin Redistribution Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/redistribution/{license_id}":{"patch":{"summary":"Admin Update","operationId":"admin_update_v1_admin_redistribution__license_id__patch","parameters":[{"name":"license_id","in":"path","required":true,"schema":{"type":"integer","title":"License Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_admin_update_v1_admin_redistribution__license_id__patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Update V1 Admin Redistribution  License Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/widget/data":{"get":{"summary":"Widget Data","operationId":"widget_data_v1_widget_data_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}},{"name":"widget","in":"query","required":false,"schema":{"type":"string","default":"ticker","title":"Widget"}},{"name":"symbol","in":"query","required":false,"schema":{"type":"string","default":"GCB","title":"Symbol"}},{"name":"index","in":"query","required":false,"schema":{"type":"string","default":"GSE-CI","title":"Index"}},{"name":"points","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Points"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Widget Data V1 Widget Data Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tickers/{symbol}/financials":{"get":{"summary":"Financials","operationId":"financials_v1_tickers__symbol__financials_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}},{"name":"statement","in":"query","required":false,"schema":{"type":"string","default":"income","title":"Statement"}},{"name":"years","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Years"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Financials V1 Tickers  Symbol  Financials Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tickers/{symbol}/dividends":{"get":{"summary":"Dividends","operationId":"dividends_v1_tickers__symbol__dividends_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dividends V1 Tickers  Symbol  Dividends Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tickers/{symbol}/ratios":{"get":{"summary":"Ratios","operationId":"ratios_v1_tickers__symbol__ratios_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ratios V1 Tickers  Symbol  Ratios Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/screener":{"get":{"summary":"Screener","operationId":"screener_v1_screener_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Screener V1 Screener Get"}}}}}}},"/v1/tickers/{symbol}/fundamentals":{"get":{"summary":"Fundamentals Summary","operationId":"fundamentals_summary_v1_tickers__symbol__fundamentals_get","parameters":[{"name":"symbol","in":"path","required":true,"schema":{"type":"string","title":"Symbol"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Fundamentals Summary V1 Tickers  Symbol  Fundamentals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alerts":{"get":{"summary":"List Alerts","operationId":"list_alerts_v1_alerts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Alerts V1 Alerts Get"}}}}}},"post":{"summary":"Create Alert","operationId":"create_alert_v1_alerts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_alert_v1_alerts_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Alert V1 Alerts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alerts/{alert_id}":{"patch":{"summary":"Update Alert","operationId":"update_alert_v1_alerts__alert_id__patch","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_alert_v1_alerts__alert_id__patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Alert V1 Alerts  Alert Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Alert","operationId":"delete_alert_v1_alerts__alert_id__delete","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Alert V1 Alerts  Alert Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alerts/events":{"get":{"summary":"Alert Events","operationId":"alert_events_v1_alerts_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alert Events V1 Alerts Events Get"}}}}}}},"/v1/team/members":{"get":{"summary":"List Members","description":"The roster, readable by every seat including viewers — deliberately.\n\nThis is the one team endpoint with no role gate, which reads like an oversight next to\nthe three below. It is not: the query is scoped to the caller's own account_id, so\nthere is nothing here a viewer cannot already see by looking at who else is in the room,\nand the Settings → Team tab renders it read-only for exactly that audience. Gating it\nwould blank a page for viewers and buy nothing.","operationId":"list_members_v1_team_members_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Members V1 Team Members Get"}}}}}}},"/v1/team/invite":{"post":{"summary":"Invite","operationId":"invite_v1_team_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_invite_v1_team_invite_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Invite V1 Team Invite Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/team/members/{member_id}":{"patch":{"summary":"Update Member","operationId":"update_member_v1_team_members__member_id__patch","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_member_v1_team_members__member_id__patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Member V1 Team Members  Member Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Remove Member","operationId":"remove_member_v1_team_members__member_id__delete","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Member V1 Team Members  Member Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/accept-invite":{"post":{"summary":"Accept Invite","operationId":"accept_invite_v1_auth_accept_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_accept_invite_v1_auth_accept_invite_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Accept Invite V1 Auth Accept Invite Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/news":{"get":{"summary":"News","operationId":"news_v1_news_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","default":"","title":"Category"}},{"name":"symbol","in":"query","required":false,"schema":{"type":"string","default":"","title":"Symbol"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response News V1 News Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/news/{item_id}/image":{"get":{"summary":"News Image","description":"Serve our cached copy of a story's picture.\n\nOurs, not the exchange's: hotlinking gse.com.gh would spend their bandwidth, leak\nevery reader's address to their server, and 404 the moment they reorganise uploads.\n\nCached hard and immutably at the edge. The object key is content-addressed, so a\ngiven id serves different bytes only if the upstream picture changed — at which\npoint the key changes too and this URL is genuinely stale. A week is a reasonable\ntrade for a thumbnail; the fallback glyph covers any gap.","operationId":"news_image_v1_news__item_id__image_get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/corporate-actions":{"get":{"summary":"Corporate Actions","operationId":"corporate_actions_v1_corporate_actions_get","parameters":[{"name":"symbol","in":"query","required":false,"schema":{"type":"string","default":"","title":"Symbol"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Corporate Actions V1 Corporate Actions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchlists":{"get":{"summary":"List Watchlists","operationId":"list_watchlists_v1_watchlists_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Watchlists V1 Watchlists Get"}}}}}},"post":{"summary":"Create Watchlist","operationId":"create_watchlist_v1_watchlists_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Watchlist V1 Watchlists Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchlists/{watchlist_id}":{"delete":{"summary":"Delete Watchlist","operationId":"delete_watchlist_v1_watchlists__watchlist_id__delete","parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Watchlist V1 Watchlists  Watchlist Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchlists/{watchlist_id}/items":{"get":{"summary":"List Items","operationId":"list_items_v1_watchlists__watchlist_id__items_get","parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Items V1 Watchlists  Watchlist Id  Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Add Item","operationId":"add_item_v1_watchlists__watchlist_id__items_post","parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Item V1 Watchlists  Watchlist Id  Items Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/watchlists/{watchlist_id}/items/{symbol}":{"delete":{"summary":"Remove Item","operationId":"remove_item_v1_watchlists__watchlist_id__items__symbol__delete","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":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Item V1 Watchlists  Watchlist Id  Items  Symbol  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports":{"get":{"summary":"List Reports","operationId":"list_reports_v1_reports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Reports V1 Reports Get"}}}}}}},"/v1/reports/{report_id}":{"get":{"summary":"Download Report","operationId":"download_report_v1_reports__report_id__get","parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"pdf","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/onboarding":{"get":{"summary":"Progress","operationId":"progress_v1_onboarding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Progress V1 Onboarding Get"}}}}}}},"/v1/onboarding/dismiss":{"post":{"summary":"Dismiss","operationId":"dismiss_v1_onboarding_dismiss_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dismiss V1 Onboarding Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhook":{"get":{"summary":"Get Webhook","operationId":"get_webhook_v1_webhook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Webhook V1 Webhook Get"}}}}}},"put":{"summary":"Put Webhook","description":"Create or replace the endpoint. The secret is generated here and returned\nexactly once — it is stored so we can sign, but never sent again.","operationId":"put_webhook_v1_webhook_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Webhook V1 Webhook Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Webhook","operationId":"delete_webhook_v1_webhook_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Delete Webhook V1 Webhook Delete"}}}}}}},"/v1/webhook/test":{"post":{"summary":"Test Webhook","operationId":"test_webhook_v1_webhook_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Test Webhook V1 Webhook Test Post"}}}}}}},"/v1/webhook/deliveries":{"get":{"summary":"Deliveries","operationId":"deliveries_v1_webhook_deliveries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Deliveries V1 Webhook Deliveries Get"}}}}}}},"/v1/operator/accept-invite":{"post":{"summary":"Accept Invite","description":"Set a password against an invite token and sign in.\n\nThrottled per address because the token space is walkable in principle, exactly as\nthe customer team invite is (app/services/team.py).","operationId":"accept_invite_v1_operator_accept_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_accept_invite_v1_operator_accept_invite_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Accept Invite V1 Operator Accept Invite Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/login":{"post":{"summary":"Login","operationId":"login_v1_operator_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_login_v1_operator_login_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Login V1 Operator Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/logout":{"post":{"summary":"Logout","description":"Revoke the presented session. Always reports success.\n\nWhether the token was live, already revoked, or nonsense, the caller ends up signed\nout and learns nothing about which — and the web layer clears its cookie regardless.","operationId":"logout_v1_operator_logout_post","parameters":[{"name":"X-Operator-Session","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Operator-Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Logout V1 Operator Logout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/me":{"get":{"summary":"Me","operationId":"me_v1_operator_me_get","parameters":[{"name":"X-Operator-Session","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Operator-Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Me V1 Operator Me Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/operators":{"get":{"summary":"List Operators","operationId":"list_operators_v1_operator_operators_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Operators V1 Operator Operators Get"}}}}}},"post":{"summary":"Invite Operator","operationId":"invite_operator_v1_operator_operators_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_invite_operator_v1_operator_operators_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Invite Operator V1 Operator Operators Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/operators/{operator_id}":{"patch":{"summary":"Update Operator","operationId":"update_operator_v1_operator_operators__operator_id__patch","parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"integer","title":"Operator Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_operator_v1_operator_operators__operator_id__patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Operator V1 Operator Operators  Operator Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/operators/{operator_id}/invitation":{"post":{"summary":"Rotate Invitation","operationId":"rotate_invitation_v1_operator_operators__operator_id__invitation_post","parameters":[{"name":"operator_id","in":"path","required":true,"schema":{"type":"integer","title":"Operator Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_rotate_invitation_v1_operator_operators__operator_id__invitation_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rotate Invitation V1 Operator Operators  Operator Id  Invitation Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/audit":{"get":{"summary":"Read Audit","operationId":"read_audit_v1_operator_audit_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Audit V1 Operator Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/ingestion":{"get":{"summary":"Ingestion","description":"One row per source: its last run, how fresh its data is, and what is held.","operationId":"ingestion_v1_operator_ingestion_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ingestion V1 Operator Ingestion Get"}}}}}}},"/v1/operator/ingestion/{code}/runs":{"get":{"summary":"Runs For","operationId":"runs_for_v1_operator_ingestion__code__runs_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Runs For V1 Operator Ingestion  Code  Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/dq":{"get":{"summary":"Dq Events","description":"Recent data-quality findings, newest first.\n\nAn empty list is the normal, healthy answer and the console says so — \"no findings\"\nshould not read the same as \"this panel is broken\".","operationId":"dq_events_v1_operator_dq_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dq Events V1 Operator Dq Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/ingestion/{code}/run":{"post":{"summary":"Run Now","operationId":"run_now_v1_operator_ingestion__code__run_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Now V1 Operator Ingestion  Code  Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/cache/invalidate":{"post":{"summary":"Invalidate Cache","description":"Drop cached responses, and optionally resolved auth contexts.\n\nScoped rather than a flushdb. Redis also holds rate-limit counters and websocket stream\nstate, and emptying the whole keyspace — which every ingest script used to do — resets\nevery caller's rate-limit window and forces an Argon2id verification on the next request\nfrom everyone. Neither is a thing anyone means by \"clear the cache\".","operationId":"invalidate_cache_v1_operator_cache_invalidate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_invalidate_cache_v1_operator_cache_invalidate_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Invalidate Cache V1 Operator Cache Invalidate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/customers/{account_id}":{"get":{"summary":"Customer Detail","description":"One account, assembled from the seven tables support would otherwise open by hand.\n\nThe list view answers \"who is this?\"; this answers \"what is going on with them?\" —\nwhich is the question actually being asked when someone writes in. Read-only, and the\nlowest role, because reading is what most of the team will do here.","operationId":"customer_detail_v1_admin_customers__account_id__get","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Customer Detail V1 Admin Customers  Account Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/customers/{account_id}/plan":{"patch":{"summary":"Change Plan","operationId":"change_plan_v1_admin_customers__account_id__plan_patch","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_change_plan_v1_admin_customers__account_id__plan_patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Change Plan V1 Admin Customers  Account Id  Plan Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/customers/{account_id}/status":{"patch":{"summary":"Change Status","operationId":"change_status_v1_admin_customers__account_id__status_patch","parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_change_status_v1_admin_customers__account_id__status_patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Change Status V1 Admin Customers  Account Id  Status Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/demo-requests":{"post":{"summary":"Create Demo Request","operationId":"create_demo_request_v1_demo_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_demo_request_v1_demo_requests_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Demo Request V1 Demo Requests Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/operator/demo-requests":{"get":{"summary":"List Demo Requests","operationId":"list_demo_requests_v1_operator_demo_requests_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Demo Requests V1 Operator Demo Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_accept_invite_v1_auth_accept_invite_post":{"properties":{"token":{"type":"string","title":"Token"},"name":{"type":"string","title":"Name","default":""},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"Body_accept_invite_v1_auth_accept_invite_post"},"Body_accept_invite_v1_operator_accept_invite_post":{"properties":{"token":{"type":"string","title":"Token","default":""},"password":{"type":"string","title":"Password","default":""}},"type":"object","title":"Body_accept_invite_v1_operator_accept_invite_post"},"Body_admin_create_v1_admin_redistribution_post":{"properties":{"email":{"type":"string","title":"Email","default":""},"account_id":{"type":"string","title":"Account Id","default":""},"licensee_name":{"type":"string","title":"Licensee Name"},"data_classes":{"items":{"type":"string"},"type":"array","title":"Data Classes","default":["gse_equity","gse_index"]},"allowed_domains":{"items":{"type":"string"},"type":"array","title":"Allowed Domains","default":[]},"attribution_required":{"type":"boolean","title":"Attribution Required","default":true},"attribution_text":{"type":"string","title":"Attribution Text","default":"Data by Ananse Market Data Cloud"},"monthly_fee_minor":{"type":"integer","title":"Monthly Fee Minor","default":0},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["licensee_name"],"title":"Body_admin_create_v1_admin_redistribution_post"},"Body_admin_update_v1_admin_redistribution__license_id__patch":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"allowed_domains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Domains"},"monthly_fee_minor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Fee Minor"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"}},"type":"object","title":"Body_admin_update_v1_admin_redistribution__license_id__patch"},"Body_change_plan_v1_admin_customers__account_id__plan_patch":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"Body_change_plan_v1_admin_customers__account_id__plan_patch"},"Body_change_status_v1_admin_customers__account_id__status_patch":{"properties":{"status":{"type":"string","title":"Status"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["status"],"title":"Body_change_status_v1_admin_customers__account_id__status_patch"},"Body_checkout_v1_billing_checkout_post":{"properties":{"plan_code":{"type":"string","title":"Plan Code"},"email":{"type":"string","title":"Email"},"period":{"type":"string","title":"Period","default":"monthly"}},"type":"object","required":["plan_code","email"],"title":"Body_checkout_v1_billing_checkout_post"},"Body_create_alert_v1_alerts_post":{"properties":{"name":{"type":"string","title":"Name","default":""},"kind":{"type":"string","title":"Kind"},"symbol":{"type":"string","title":"Symbol","default":""},"index_code":{"type":"string","title":"Index Code","default":""},"threshold":{"type":"number","title":"Threshold"},"channel":{"type":"string","title":"Channel","default":"both"}},"type":"object","required":["kind","threshold"],"title":"Body_create_alert_v1_alerts_post"},"Body_create_demo_request_v1_demo_requests_post":{"properties":{"first_name":{"type":"string","title":"First Name","default":""},"last_name":{"type":"string","title":"Last Name","default":""},"email":{"type":"string","title":"Email","default":""},"company":{"type":"string","title":"Company","default":""},"role":{"type":"string","title":"Role","default":""},"team_size":{"type":"string","title":"Team Size","default":""},"use_case":{"type":"string","title":"Use Case","default":""}},"type":"object","title":"Body_create_demo_request_v1_demo_requests_post"},"Body_create_key_v1_keys_post":{"properties":{"name":{"type":"string","title":"Name","default":"API key"},"environment":{"type":"string","title":"Environment","default":"test"}},"type":"object","title":"Body_create_key_v1_keys_post"},"Body_google_sign_in_v1_auth_google_post":{"properties":{"code":{"type":"string","title":"Code","default":""},"redirect_uri":{"type":"string","title":"Redirect Uri","default":""},"invite_token":{"type":"string","title":"Invite Token","default":""}},"type":"object","title":"Body_google_sign_in_v1_auth_google_post"},"Body_invalidate_cache_v1_operator_cache_invalidate_post":{"properties":{"scope":{"type":"string","title":"Scope","default":"responses"}},"type":"object","title":"Body_invalidate_cache_v1_operator_cache_invalidate_post"},"Body_invite_operator_v1_operator_operators_post":{"properties":{"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name","default":""},"operator_role":{"type":"string","title":"Operator Role","default":"viewer"}},"type":"object","required":["email"],"title":"Body_invite_operator_v1_operator_operators_post"},"Body_invite_v1_team_invite_post":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role","default":"member"},"name":{"type":"string","title":"Name","default":""}},"type":"object","required":["email"],"title":"Body_invite_v1_team_invite_post"},"Body_login_v1_auth_login_post":{"properties":{"email":{"type":"string","title":"Email","default":""},"password":{"type":"string","title":"Password","default":""}},"type":"object","title":"Body_login_v1_auth_login_post"},"Body_login_v1_operator_login_post":{"properties":{"email":{"type":"string","title":"Email","default":""},"password":{"type":"string","title":"Password","default":""}},"type":"object","title":"Body_login_v1_operator_login_post"},"Body_logout_key_v1_auth_logout_key_post":{"properties":{"token":{"type":"string","title":"Token","default":""}},"type":"object","title":"Body_logout_key_v1_auth_logout_key_post"},"Body_register_v1_auth_register_post":{"properties":{"name":{"type":"string","title":"Name","default":""},"email":{"type":"string","title":"Email","default":""},"password":{"type":"string","title":"Password","default":""}},"type":"object","title":"Body_register_v1_auth_register_post"},"Body_rotate_invitation_v1_operator_operators__operator_id__invitation_post":{"properties":{"revoke":{"type":"boolean","title":"Revoke","default":false}},"type":"object","title":"Body_rotate_invitation_v1_operator_operators__operator_id__invitation_post"},"Body_set_password_v1_auth_set_password_post":{"properties":{"new_password":{"type":"string","title":"New Password","default":""},"current_password":{"type":"string","title":"Current Password","default":""}},"type":"object","title":"Body_set_password_v1_auth_set_password_post"},"Body_update_alert_v1_alerts__alert_id__patch":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"Body_update_alert_v1_alerts__alert_id__patch"},"Body_update_member_v1_team_members__member_id__patch":{"properties":{"role":{"type":"string","title":"Role","default":""},"status":{"type":"string","title":"Status","default":""}},"type":"object","title":"Body_update_member_v1_team_members__member_id__patch"},"Body_update_operator_v1_operator_operators__operator_id__patch":{"properties":{"operator_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator Role"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"Body_update_operator_v1_operator_operators__operator_id__patch"},"Body_verify_v1_billing_verify_post":{"properties":{"reference":{"type":"string","title":"Reference"}},"type":"object","required":["reference"],"title":"Body_verify_v1_billing_verify_post"},"Envelope":{"properties":{"data":{"title":"Data"},"meta":{"$ref":"#/components/schemas/Meta"},"pagination":{"anyOf":[{"$ref":"#/components/schemas/Pagination"},{"type":"null"}]}},"type":"object","required":["data","meta"],"title":"Envelope"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Meta":{"properties":{"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"},"market_timezone":{"type":"string","title":"Market Timezone","default":"Africa/Accra"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"data_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Class"},"dataset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dataset"},"freshness_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Freshness Seconds"},"is_stale":{"type":"boolean","title":"Is Stale","default":false},"freshness_status":{"type":"string","enum":["fresh","stale","unknown","unavailable"],"title":"Freshness Status","default":"unknown"},"adjustment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adjustment Status"},"factor_set_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Factor Set Id"},"constituents":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/Meta"},"type":"object"},{"type":"null"}],"title":"Constituents"},"coverage_status":{"type":"string","enum":["complete","partial","empty","unknown"],"title":"Coverage Status","default":"unknown"},"is_adjusted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Adjusted"},"adjust":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Adjust"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"is_synthetic":{"type":"boolean","title":"Is Synthetic","default":false},"disclaimer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disclaimer"}},"type":"object","title":"Meta"},"Pagination":{"properties":{"limit":{"type":"integer","title":"Limit"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"next_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Url"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["limit"],"title":"Pagination"},"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"}}}}