{"openapi":"3.1.0","info":{"title":"Overchain Dashboard API (read-only)","version":"1.0.0","description":"Overchain Dashboard data (read-only). Overchain is a crypto payments and OTC desk; \"merchants\" / \"clients\" are business clients.\n\nHow to answer well:\n- Use the curated tools first (revenue_summary, list_clients, get_client, client_counterparties, get_counterparty, merchant_balances, ops_health…). Reconciliation and month-end data are not available through this API. They apply the dashboard's business rules and return server-side totals. Use query_dataset / aggregate_dataset only for what they don't cover.\n- Never add up rows yourself. Every response carries totals where they make sense; when has_more is true the rows are a page, not the whole set: use aggregate_dataset or the tool's totals instead.\n- Quote figures with their unit, currency and period exactly as returned (amount_usd = US dollars; native amounts carry an asset/currency field). Dates are UTC unless the response says otherwise.\n- Every response has as_of (when it was answered) and data_as_of / freshness (when the underlying data was last refreshed). Mention staleness if it matters.\n- Flow vocabulary for clients and counterparties, never summed into one figure and never called \"with us\": \"1st party\" = the client's own deposits into and withdrawals from Overchain; \"3rd party\" = other payment types through Overchain (payment requests, payments, crypto payouts, internal transfers); \"1st party else\" = on-chain flow between the client's own wallets and anyone other than Overchain.\n- A client's own wallets are only addresses that deposited into Overchain or received an Overchain withdrawal (tier PROVEN). Addresses linked by screening names, declarations or heuristics are counterparties, not the client's wallets.\n- An empty result means no matching rows for the filters given, not missing data; the response says which filters were applied. If a tool says access is denied, the caller lacks that area; do not guess the data.\n- Call get_definitions for the full glossary (revenue, statuses, flows, wallet tiers, units) and describe_dataset before querying an unfamiliar dataset.\n- Links in responses (dashboard_url) open the same data in the dashboard.\n\n## Authentication\n- API keys: `Authorization: Bearer ocd_pat_...` (create in the dashboard: account menu, API access). Optional IP allowlist per key.\n- OAuth 2.1 (MCP clients such as Claude.ai and ChatGPT): authorization code + PKCE; consent on the dashboard after Microsoft sign-in.\n- /account/* uses the dashboard's own session.\n\n## Envelope, paging, limits\nEvery data response is an envelope: data plus as_of, data_as_of, freshness, units, timezone, filters_applied, row_count, total_count, has_more, next_cursor, totals, notes and dashboard_url. When has_more is true pass next_cursor back unchanged for the next page; never sum a page, use totals or aggregate_dataset. Max 500 rows a page; 8 s per statement; 60 calls a minute and 1,000 an hour per user. Callers without client names receive pseudonyms (the dashboard's aliases) everywhere."},"servers":[{"url":"https://mcp.overchain-live.co.uk"}],"x-datasets":[{"key":"transactions","area":"transactions","area_label":"Transactions and merchants","summary":"Every platform transaction (V1 invoice) with merchant, type, status, amounts, fees and USD volume. Unmasked."},{"key":"transactions_v","area":"transactions","area_label":"Transactions and merchants","summary":"Transactions as the Transactions page shows them, with the headline compliance (screening) columns joined."},{"key":"merchants","area":"transactions","area_label":"Transactions and merchants","summary":"Merchant master: one row per merchant account with fee rates per flow, group, entity, HubSpot/Sumsub ids, churn and attribution fields."},{"key":"merchants_v","area":"transactions","area_label":"Transactions and merchants","summary":"Merchants as the pages read them (group alias resolved)."},{"key":"merchant_current_names","area":"transactions","area_label":"Transactions and merchants","summary":"The name V1 currently uses for each V1 merchant id."},{"key":"merchant_group_aliases","area":"transactions","area_label":"Transactions and merchants","summary":"Group alias numbers used for name masking in the dashboard."},{"key":"entity_mappings","area":"transactions","area_label":"Transactions and merchants","summary":"Raw entity labels (untracked revenue) mapped to merchants."},{"key":"entity_mappings_v","area":"transactions","area_label":"Transactions and merchants","summary":"Entity mappings as the pages read them."},{"key":"merchant_expected_volumes","area":"transactions","area_label":"Transactions and merchants","summary":"Expected volumes per merchant (entered by staff)."},{"key":"merchant_expected_volumes_v","area":"transactions","area_label":"Transactions and merchants","summary":"Expected volumes as the pages read them."},{"key":"industry_labels","area":"transactions","area_label":"Transactions and merchants","summary":"Industry list."},{"key":"merchant_industry_sync_state","area":"transactions","area_label":"Transactions and merchants","summary":"Industry sync job state."},{"key":"merchant_attribution_sync_log","area":"transactions","area_label":"Transactions and merchants","summary":"HubSpot attribution sync log."},{"key":"settlement_stats","area":"transactions","area_label":"Transactions and merchants","summary":"Settlement time statistics (Settlement Times page)."},{"key":"ingested_files","area":"transactions","area_label":"Transactions and merchants","summary":"S3 report files ingested into transactions (key, ETag, when)."},{"key":"manual_uploads","area":"transactions","area_label":"Transactions and merchants","summary":"CSV uploads of transactions (legacy)."},{"key":"analytics.transaction","area":"transactions","area_label":"Transactions and merchants","summary":"Gold layer: one row per transaction with business rules applied as columns (revenue_usd, transfer_volume_usd, is_dead, is_excluded…)."},{"key":"analytics.client","area":"transactions","area_label":"Transactions and merchants","summary":"Gold layer: one row per client (HubSpot ticket or trading merchant) with status and lifetime revenue. The canonical \"who is a client\"."},{"key":"analytics.client_link","area":"transactions","area_label":"Transactions and merchants","summary":"Gold layer: which HubSpot ticket each merchant record belongs to."},{"key":"analytics.exclusion","area":"transactions","area_label":"Transactions and merchants","summary":"Gold layer: the one list of what analytics leaves out (test/internal entities, excluded transactions)."},{"key":"analytics.metric","area":"transactions","area_label":"Transactions and merchants","summary":"Gold layer: registry of business metrics with exact definitions."},{"key":"analytics.revenue_daily","area":"revenue","area_label":"Revenue and metrics","summary":"Gold layer: canonical revenue per merchant per day, per timezone (filter tz)."},{"key":"analytics.revenue_monthly","area":"revenue","area_label":"Revenue and metrics","summary":"Gold layer: revenue_daily rolled up to calendar months per timezone."},{"key":"untracked_revenue","area":"revenue","area_label":"Revenue and metrics","summary":"Revenue booked outside the platform (desk trades), USD profit per trade."},{"key":"untracked_revenue_v","area":"revenue","area_label":"Revenue and metrics","summary":"Untracked revenue as the pages read it (merchant resolved)."},{"key":"lending_interest","area":"revenue","area_label":"Revenue and metrics","summary":"B2C2 lending interest (reported as merchant \"Lending\" in revenue)."},{"key":"monthly_revenue_targets","area":"revenue","area_label":"Revenue and metrics","summary":"Monthly revenue targets (Finance page)."},{"key":"exchange_rates","area":"rates","area_label":"Exchange rates","summary":"Saved quotes (B2C2/Binance mids, bid/ask) per base currency. 4.1M rows."},{"key":"cash_balances","area":"treasury","area_label":"Treasury cash balances","summary":"Saved provider cash balance snapshots (every 10 minutes)."},{"key":"latest_cash_balances","area":"treasury","area_label":"Treasury cash balances","summary":"Latest saved balance per provider, currency and balance type."},{"key":"merchant_ledger_entries","area":"merchant_balances","area_label":"Merchant balances and ledger","summary":"V1-exact merchant ledger entries (all builds; filter build_id or use the merchant_ledger tool for the published build)."},{"key":"merchant_ledger_builds","area":"merchant_balances","area_label":"Merchant balances and ledger","summary":"Merchant ledger builds; exactly one is published."},{"key":"merchant_balances_v","area":"merchant_balances","area_label":"Merchant balances and ledger","summary":"Current merchant balances per merchant and asset from the published build (native units)."},{"key":"cabinet_invoices","area":"merchant_balances","area_label":"Merchant balances and ledger","summary":"V1 merchant-cabinet invoice exports (one row per invoice per export)."},{"key":"cabinet_statement_states","area":"merchant_balances","area_label":"Merchant balances and ledger","summary":"V1 merchant-cabinet statement states per invoice."},{"key":"v1_admin_invoices","area":"merchant_balances","area_label":"Merchant balances and ledger","summary":"V1 admin invoice exports (gap filler for the ledger)."},{"key":"ci_client_facts","area":"client_intelligence","area_label":"Client Intelligence","summary":"One row per client with the precomputed facts (90/365-day flows, trading figures, top counterparties). Prefer list_clients / get_client."},{"key":"ci_counterparty_monthly","area":"client_intelligence","area_label":"Client Intelligence","summary":"1st party else: on-chain USD in/out between each client's own wallets and each counterparty entity, per month and chain."},{"key":"ci_kyt_monthly","area":"client_intelligence","area_label":"Client Intelligence","summary":"Screening (Sumsub KYT) counterparty names on each client's settled transactions per month, direction and type (1st party = Deposit/Withdraw, 3rd party = other types)."},{"key":"ci_market_daily","area":"client_intelligence","area_label":"Client Intelligence","summary":"Daily market closes (BTC/ETH/USDT/USDC/EUR/GBP) and the volatility basket z."},{"key":"ci_touchpoints","area":"client_intelligence","area_label":"Client Intelligence","summary":"Provider touchpoints: screening labels naming another conversion/payments provider."},{"key":"ci_entity_aliases","area":"client_intelligence","area_label":"Client Intelligence","summary":"Entity key aliases that merge spellings into one counterparty."},{"key":"ci_group_entities","area":"client_intelligence","area_label":"Client Intelligence","summary":"Entity keys treated as Overchain's own group."},{"key":"client_status_daily","area":"client_intelligence","area_label":"Client Intelligence","summary":"One status per client per day (history)."},{"key":"client_status_latest","area":"client_intelligence","area_label":"Client Intelligence","summary":"Latest status per client."},{"key":"client_status_config","area":"client_intelligence","area_label":"Client Intelligence","summary":"Versioned client status rule parameters."},{"key":"client_dossier_daily","area":"client_intelligence","area_label":"Client Intelligence","summary":"Headline dossier facts per client per day (history)."},{"key":"client_dossier_latest","area":"client_intelligence","area_label":"Client Intelligence","summary":"Latest dossier per client (profile, revenue and rate, wallets, on-chain)."},{"key":"client_intelligence_accounts","area":"client_intelligence","area_label":"Client Intelligence","summary":"Client Intelligence accounts (one per client)."},{"key":"client_intelligence_cases","area":"client_intelligence","area_label":"Client Intelligence","summary":"Client Intelligence cases."},{"key":"client_intelligence_evidence","area":"client_intelligence","area_label":"Client Intelligence","summary":"Evidence rows behind Client Intelligence accounts."},{"key":"client_intelligence_runs","area":"client_intelligence","area_label":"Client Intelligence","summary":"Client Intelligence sync runs."},{"key":"client_intelligence_activity","area":"client_intelligence","area_label":"Client Intelligence","summary":"Client Intelligence case activity."},{"key":"client_intelligence_latest_evidence","area":"client_intelligence","area_label":"Client Intelligence","summary":"Latest evidence per account."},{"key":"client_intelligence_outcomes","area":"client_intelligence","area_label":"Client Intelligence","summary":"Case outcomes."},{"key":"client_intelligence_owners","area":"client_intelligence","area_label":"Client Intelligence","summary":"Assignable case owners."},{"key":"client_intelligence_routes","area":"client_intelligence","area_label":"Client Intelligence","summary":"Payment routes per client."},{"key":"client_type_map","area":"client_intelligence","area_label":"Client Intelligence","summary":"Client type by merchant or group name."},{"key":"client_type_links","area":"client_intelligence","area_label":"Client Intelligence","summary":"Last client_type_map row each merchant matched."},{"key":"client_record_merges","area":"client_intelligence","area_label":"Client Intelligence","summary":"HubSpot tickets merged into a platform merchant."},{"key":"client_wallets","area":"client_intelligence","area_label":"Client Intelligence","summary":"Wallet registry: every address linked to a client with its tier. Only tier PROVEN is the client's own wallet."},{"key":"client_wallet_evidence","area":"client_intelligence","area_label":"Client Intelligence","summary":"Evidence rows behind client_wallets."},{"key":"client_wallet_address_book","area":"client_intelligence","area_label":"Client Intelligence","summary":"Addresses that are never a client's own wallet (Overchain vaults, LP wallets…)."},{"key":"client_wallet_exclusions","area":"client_intelligence","area_label":"Client Intelligence","summary":"Addresses excluded from being a client's own wallet, with reasons."},{"key":"client_wallet_flows","area":"client_intelligence","area_label":"Client Intelligence","summary":"Per registry address USDT/USDC flow since 2025-10-01."},{"key":"client_wallet_sumsub_checks","area":"client_intelligence","area_label":"Client Intelligence","summary":"Wallet facts from Sumsub applicant actions."},{"key":"client_wallet_sumsub_fetch","area":"client_intelligence","area_label":"Client Intelligence","summary":"State of the Sumsub applicant-action fetch."},{"key":"client_wallet_scope","area":"client_intelligence","area_label":"Client Intelligence","summary":"Wallet discovery input: merchant scope."},{"key":"client_wallet_scope_names","area":"client_intelligence","area_label":"Client Intelligence","summary":"Wallet discovery input: scope names."},{"key":"client_wallet_sumsub_applicants","area":"client_intelligence","area_label":"Client Intelligence","summary":"Wallet discovery input: Sumsub applicants per client."},{"key":"onchain_transfers","area":"client_intelligence","area_label":"Client Intelligence","summary":"USDT/USDC transfers touching a pulled (own) wallet. 353k rows."},{"key":"onchain_client_flows","area":"client_intelligence","area_label":"Client Intelligence","summary":"Client-perspective transfers of the client's own wallets (Overchain-side addresses marked)."},{"key":"client_onchain_daily","area":"client_intelligence","area_label":"Client Intelligence","summary":"Per client, chain and UTC day: inflow from third parties, payouts from Overchain, sent to Overchain, sent elsewhere."},{"key":"client_onchain_inflow_daily","area":"client_intelligence","area_label":"Client Intelligence","summary":"Per client and day on-chain inflow (named client)."},{"key":"onchain_targets","area":"client_intelligence","area_label":"Client Intelligence","summary":"Addresses the wallet pull covers."},{"key":"onchain_cursor","area":"client_intelligence","area_label":"Client Intelligence","summary":"Wallet pull coverage per wallet and token."},{"key":"onchain_deposit_addresses","area":"client_intelligence","area_label":"Client Intelligence","summary":"Overchain deposit addresses with completed inbound flow."},{"key":"onchain_overchain_addresses","area":"client_intelligence","area_label":"Client Intelligence","summary":"Overchain's own addresses (never a counterparty; never sent to Arkham)."},{"key":"onchain_chain_state","area":"client_intelligence","area_label":"Client Intelligence","summary":"Per chain backfill start and EVM block."},{"key":"onchain_fireblocks_checks","area":"client_intelligence","area_label":"Client Intelligence","summary":"Daily on-chain vs Fireblocks completeness check."},{"key":"onchain_alerts_sent","area":"client_intelligence","area_label":"Client Intelligence","summary":"Alerts sent for large 1st party else transfers."},{"key":"onchain_client_coverage","area":"client_intelligence","area_label":"Client Intelligence","summary":"Pull coverage per client."},{"key":"counterparty_client_flows","area":"client_intelligence","area_label":"Client Intelligence","summary":"Per client and counterparty address: USD in/out with the client's own wallets (1st party else)."},{"key":"counterparty_flow_totals","area":"client_intelligence","area_label":"Client Intelligence","summary":"Per counterparty address: totals across all clients."},{"key":"counterparty_client_baseline","area":"client_intelligence","area_label":"Client Intelligence","summary":"Counterparty baseline per client."},{"key":"counterparty_baseline_wallets","area":"client_intelligence","area_label":"Client Intelligence","summary":"Wallets in the counterparty baseline."},{"key":"counterparty_labels","area":"client_intelligence","area_label":"Client Intelligence","summary":"One label per material counterparty address (source, category, grade)."},{"key":"counterparty_labels_current","area":"client_intelligence","area_label":"Client Intelligence","summary":"Current labels with flow totals."},{"key":"counterparty_label_candidates","area":"client_intelligence","area_label":"Client Intelligence","summary":"Raw label provider answers (tronscan, arkham, evm_nonce)."},{"key":"counterparty_label_provider_state","area":"client_intelligence","area_label":"Client Intelligence","summary":"Label provider back-off state."},{"key":"counterparty_brand_aliases","area":"client_intelligence","area_label":"Client Intelligence","summary":"Brand aliases per client."},{"key":"counterparty_lp_addresses","area":"client_intelligence","area_label":"Client Intelligence","summary":"LP wallets outside the code LP book."},{"key":"client_top_counterparties","area":"client_intelligence","area_label":"Client Intelligence","summary":"Top 20 counterparties per client by USD with own wallets."},{"key":"static_address_labels","area":"client_intelligence","area_label":"Client Intelligence","summary":"Public label lists (462k rows): one row per chain, address and source."},{"key":"arkham_address_intel","area":"client_intelligence","area_label":"Client Intelligence","summary":"Saved Arkham answer per chain and address (raw payload included). No live Arkham calls."},{"key":"arkham_entities","area":"client_intelligence","area_label":"Client Intelligence","summary":"Arkham entities seen in answers."},{"key":"arkham_entities_summary","area":"client_intelligence","area_label":"Client Intelligence","summary":"Arkham entity summary."},{"key":"arkham_responses","area":"client_intelligence","area_label":"Client Intelligence","summary":"Append-only raw Arkham API responses."},{"key":"arkham_new_large_tx_queue","area":"client_intelligence","area_label":"Client Intelligence","summary":"Counterparties selected for Arkham lookup (>= $50k)."},{"key":"arkham_new_large_tx_state","area":"client_intelligence","area_label":"Client Intelligence","summary":"Arkham job checkpoints."},{"key":"market_vol_closes","area":"client_intelligence","area_label":"Client Intelligence","summary":"Daily closes of the volatility basket indices."},{"key":"market_vol_basket_daily","area":"client_intelligence","area_label":"Client Intelligence","summary":"Volatility basket per trading day."},{"key":"market_vol_basket_weekly","area":"client_intelligence","area_label":"Client Intelligence","summary":"Volatility basket per week."},{"key":"next_trade_scores","area":"client_intelligence","area_label":"Client Intelligence","summary":"Next-trade model predictions per merchant and run."},{"key":"next_trade_runs","area":"client_intelligence","area_label":"Client Intelligence","summary":"Next-trade scoring runs."},{"key":"next_trade_latest","area":"client_intelligence","area_label":"Client Intelligence","summary":"Latest next-trade score per merchant."},{"key":"next_trade_outcomes","area":"client_intelligence","area_label":"Client Intelligence","summary":"Next-trade predictions against outcomes."},{"key":"next_trade_daily_runs","area":"client_intelligence","area_label":"Client Intelligence","summary":"Next-trade runs per day."},{"key":"next_trade_never_traded","area":"client_intelligence","area_label":"Client Intelligence","summary":"Approved clients with no completed conversion."},{"key":"next_trade_client_pricing","area":"client_intelligence","area_label":"Client Intelligence","summary":"Per client fee rate distribution over recent conversions."},{"key":"next_trade_call_log","area":"client_intelligence","area_label":"Client Intelligence","summary":"Call outcomes recorded from the old Who to call sheet."},{"key":"next_trade_call_log_named","area":"client_intelligence","area_label":"Client Intelligence","summary":"Call log with staff names."},{"key":"next_trade_wallets","area":"client_intelligence","area_label":"Client Intelligence","summary":"Treasury wallets attributed from KYT analysis (legacy scoring input)."},{"key":"next_trade_onchain_daily","area":"client_intelligence","area_label":"Client Intelligence","summary":"Name-keyed wallet flows for the scoring inputs."},{"key":"next_trade_onchain_cursor","area":"client_intelligence","area_label":"Client Intelligence","summary":"Retired pull cursor (history)."},{"key":"next_trade_input_compliance_days","area":"client_intelligence","area_label":"Client Intelligence","summary":"Scoring input snapshot."},{"key":"next_trade_input_merchant_days","area":"client_intelligence","area_label":"Client Intelligence","summary":"Scoring input snapshot."},{"key":"next_trade_input_merchant_state","area":"client_intelligence","area_label":"Client Intelligence","summary":"Scoring input snapshot."},{"key":"next_trade_input_onchain_daily","area":"client_intelligence","area_label":"Client Intelligence","summary":"Scoring input snapshot."},{"key":"next_trade_input_state","area":"client_intelligence","area_label":"Client Intelligence","summary":"Scoring input rebuild state."},{"key":"next_trade_input_tickets","area":"client_intelligence","area_label":"Client Intelligence","summary":"Scoring input snapshot."},{"key":"next_trade_compliance_days","area":"client_intelligence","area_label":"Client Intelligence","summary":"Scoring input view: compliance days."},{"key":"next_trade_merchant_days","area":"client_intelligence","area_label":"Client Intelligence","summary":"Scoring input view: merchant days."},{"key":"next_trade_merchant_state","area":"client_intelligence","area_label":"Client Intelligence","summary":"Scoring input view: merchant state."},{"key":"next_trade_tickets","area":"client_intelligence","area_label":"Client Intelligence","summary":"Scoring input view: tickets."},{"key":"sumsub_txn_compliance","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Sumsub transaction screening per record (raw payload included; 416 MB)."},{"key":"transaction_compliance_v","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"The compliance record per transaction as the Transactions drawer shows it."},{"key":"transaction_compliance_search_v","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Compliance records with readable rule/trigger/exposure columns for search."},{"key":"transaction_compliance_link","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Which Sumsub record matches which transaction."},{"key":"sumsub_vasp","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Sumsub VASP directory (cached)."},{"key":"sumsub_applicants","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Sumsub applicants (KYC individuals and KYB companies), raw."},{"key":"sumsub_kyt_transactions","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Every Sumsub KYT record for merchant applicants, raw."},{"key":"sumsub_compliance_sync_state","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Sumsub compliance sync cursors."},{"key":"wallet_verification_cases","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Wallet verification cases."},{"key":"analytics.compliance","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Gold layer: compliance search."},{"key":"analytics.kyt_transaction","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Gold layer: KYT records with the payer resolved."},{"key":"analytics.payer","area":"compliance","area_label":"Compliance (Sumsub, KYT, Travel Rule)","summary":"Gold layer: one row per Sumsub applicant."},{"key":"retail_deposits","area":"retail","area_label":"Retail deposits and onboarding","summary":"Customer payments into merchants (sender, KYC level, wallet, amounts, our_status)."},{"key":"retail_clients","area":"retail","area_label":"Retail deposits and onboarding","summary":"Retail customers onboarded through the Customer API."},{"key":"retail_clients_v","area":"retail","area_label":"Retail deposits and onboarding","summary":"Retail clients as the Clients panel reads them."},{"key":"retail_client_beneficiaries","area":"retail","area_label":"Retail deposits and onboarding","summary":"KYB directors, shareholders and UBOs."},{"key":"retail_client_documents","area":"retail","area_label":"Retail deposits and onboarding","summary":"Document METADATA only (type, name, size, state). Files are never returned."},{"key":"retail_client_events","area":"retail","area_label":"Retail deposits and onboarding","summary":"Customer API calls and responses per retail client."},{"key":"retail_monitor_deposits","area":"retail","area_label":"Retail deposits and onboarding","summary":"Retail Slack monitor: deposits tracked for escalation."},{"key":"retail_monitor_onboardings","area":"retail","area_label":"Retail deposits and onboarding","summary":"Retail Slack monitor: onboardings tracked for escalation."},{"key":"retail_monitor_state","area":"retail","area_label":"Retail deposits and onboarding","summary":"Retail monitor state."},{"key":"retail_sync_state","area":"retail","area_label":"Retail deposits and onboarding","summary":"Retail deposit sync cursors."},{"key":"analytics.retail_payment","area":"retail","area_label":"Retail deposits and onboarding","summary":"Gold layer: one row per retail payment intent."},{"key":"analytics.retail_daily","area":"retail","area_label":"Retail deposits and onboarding","summary":"Gold layer: retail payments per merchant, payer kind and day (filter tz)."},{"key":"hubspot_pipeline_cache","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"HubSpot onboarding pipeline snapshot (one row, tickets JSON)."},{"key":"hubspot_pipeline_cache_v","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"Pipeline snapshot as the Pipeline page reads it."},{"key":"analytics.pipeline_ticket","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"Gold layer: one row per HubSpot onboarding ticket (every stage)."},{"key":"hubspot_pipeline_stages","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"HubSpot pipeline stages."},{"key":"hubspot_sync_log","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"HubSpot API call log (150k rows)."},{"key":"pipeline_aliases","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"Pipeline masking aliases."},{"key":"merchant_pipeline_notes","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"Staff notes on pipeline merchants."},{"key":"block_list","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"Merchants blocked from onboarding."},{"key":"block_list_v","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"Block list as the pages read it."},{"key":"prescreen_runs","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"Prescreen runs."},{"key":"merchant_churn_monthly","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"Merchant x month activity used for churn."},{"key":"merchant_churn_monthly_v","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"Churn by month as the pages read it."},{"key":"hs_partners","area":"partners","area_label":"Partners","summary":"Introducing partners from HubSpot."},{"key":"hs_partner_referrals","area":"partners","area_label":"Partners","summary":"Partner referrals with commission."},{"key":"hs_partner_referrals_v","area":"partners","area_label":"Partners","summary":"Partner referrals as the pages read them."},{"key":"partner_client_mappings","area":"partners","area_label":"Partners","summary":"Partner to client mappings."},{"key":"partner_client_mappings_v","area":"partners","area_label":"Partners","summary":"Partner to client mappings as the pages read them."},{"key":"partners","area":"partners","area_label":"Partners","summary":"Legacy partners table."},{"key":"partner_payouts","area":"partners","area_label":"Partners","summary":"Legacy partner payouts."},{"key":"partner_statement_deliveries","area":"partners","area_label":"Partners","summary":"Partner statement deliveries."},{"key":"partner_email_batches","area":"partners","area_label":"Partners","summary":"Monthly partner statement email batches."},{"key":"partner_email_batch_items","area":"partners","area_label":"Partners","summary":"Items in partner statement batches."},{"key":"partner_email_log","area":"partners","area_label":"Partners","summary":"Partner statement emails sent."},{"key":"job_runs","area":"ops","area_label":"Ops and Command Centre","summary":"One row per scheduled-job execution (status, rows, coverage, error)."},{"key":"cron_run_log","area":"ops","area_label":"Ops and Command Centre","summary":"8-day copy of pg_cron run details (status and return message; never the command)."},{"key":"cron_http_requests","area":"ops","area_label":"Ops and Command Centre","summary":"pg_net request log per cron job / function."},{"key":"webhook_function_runs","area":"ops","area_label":"Ops and Command Centre","summary":"Edge function / webhook run outcomes (214k rows)."},{"key":"fireblocks_alerts_sent","area":"ops","area_label":"Ops and Command Centre","summary":"Fireblocks alerts sent to Slack."},{"key":"fireblocks_approval_nudges","area":"ops","area_label":"Ops and Command Centre","summary":"Fireblocks approval nudges."},{"key":"fireblocks_approval_replies","area":"ops","area_label":"Ops and Command Centre","summary":"Fireblocks approval replies."},{"key":"fireblocks_approver_groups","area":"ops","area_label":"Ops and Command Centre","summary":"Fireblocks approver groups."},{"key":"fireblocks_approvers","area":"ops","area_label":"Ops and Command Centre","summary":"Fireblocks approvers."},{"key":"fireblocks_tx_matches","area":"ops","area_label":"Ops and Command Centre","summary":"Fireblocks transaction matches to platform transactions."},{"key":"fireblocks_webhook_debug","area":"ops","area_label":"Ops and Command Centre","summary":"Last Fireblocks webhook bodies (headers are never returned)."},{"key":"equals_webhook_events","area":"ops","area_label":"Ops and Command Centre","summary":"Equals webhook events."},{"key":"equals_incidents","area":"ops","area_label":"Ops and Command Centre","summary":"Equals incidents."},{"key":"equals_batch_inspections","area":"ops","area_label":"Ops and Command Centre","summary":"Equals batch inspections."},{"key":"equals_recipients","area":"ops","area_label":"Ops and Command Centre","summary":"Equals recipients."},{"key":"equals_approval_nudges","area":"ops","area_label":"Ops and Command Centre","summary":"Equals approval nudges."},{"key":"equals_webhook_debug","area":"ops","area_label":"Ops and Command Centre","summary":"Last Equals webhook bodies (headers are never returned)."},{"key":"reactions_added","area":"ops","area_label":"Ops and Command Centre","summary":"Slack reactions recorded."},{"key":"reactions_missed","area":"ops","area_label":"Ops and Command Centre","summary":"Slack reactions missed."},{"key":"sprint_burndown_history","area":"ops","area_label":"Ops and Command Centre","summary":"Jira sprint burndown history."},{"key":"s3_archive_jobs","area":"ops","area_label":"Ops and Command Centre","summary":"S3 archive export jobs (signed URLs are never returned)."},{"key":"user_roles","area":"admin","area_label":"Admin (owner only)","summary":"Dashboard role per user."},{"key":"profiles","area":"admin","area_label":"Admin (owner only)","summary":"Staff profiles (name, timezone)."},{"key":"access_allowlist","area":"admin","area_label":"Admin (owner only)","summary":"Email prefixes allowed to sign in, with their role."},{"key":"access_page_overrides","area":"admin","area_label":"Admin (owner only)","summary":"Per-user page overrides."},{"key":"role_page_permissions","area":"admin","area_label":"Admin (owner only)","summary":"Role x page baseline."},{"key":"audit_log","area":"admin","area_label":"Admin (owner only)","summary":"Dashboard audit log."},{"key":"api_access_grants","area":"admin","area_label":"Admin (owner only)","summary":"Owner-set API access overrides."},{"key":"api_audit_log","area":"admin","area_label":"Admin (owner only)","summary":"Every API call (append-only)."},{"key":"api_tokens","area":"admin","area_label":"Admin (owner only)","summary":"API tokens (hashes are never returned)."},{"key":"audit_log_v","area":"admin","area_label":"Admin (owner only)","summary":"The dashboard's masked view of audit_log (names follow the caller's client-names setting)."},{"key":"equals_batch_inspections_v","area":"ops","area_label":"Ops and Command Centre","summary":"The dashboard's masked view of equals_batch_inspections (names follow the caller's client-names setting)."},{"key":"equals_incidents_v","area":"ops","area_label":"Ops and Command Centre","summary":"The dashboard's masked view of equals_incidents (names follow the caller's client-names setting)."},{"key":"equals_webhook_events_v","area":"ops","area_label":"Ops and Command Centre","summary":"The dashboard's masked view of equals_webhook_events (names follow the caller's client-names setting)."},{"key":"fireblocks_alerts_sent_v","area":"ops","area_label":"Ops and Command Centre","summary":"The dashboard's masked view of fireblocks_alerts_sent (names follow the caller's client-names setting)."},{"key":"fireblocks_tx_matches_v","area":"ops","area_label":"Ops and Command Centre","summary":"The dashboard's masked view of fireblocks_tx_matches (names follow the caller's client-names setting)."},{"key":"merchant_pipeline_notes_v","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"The dashboard's masked view of merchant_pipeline_notes (names follow the caller's client-names setting)."},{"key":"partner_email_batch_items_v","area":"partners","area_label":"Partners","summary":"The dashboard's masked view of partner_email_batch_items (names follow the caller's client-names setting)."},{"key":"partner_email_log_v","area":"partners","area_label":"Partners","summary":"The dashboard's masked view of partner_email_log (names follow the caller's client-names setting)."},{"key":"prescreen_runs_v","area":"pipeline","area_label":"Pipeline, CRM and churn","summary":"The dashboard's masked view of prescreen_runs (names follow the caller's client-names setting)."},{"key":"retail_deposits_v","area":"retail","area_label":"Retail deposits and onboarding","summary":"The dashboard's masked view of retail_deposits (names follow the caller's client-names setting)."},{"key":"retail_monitor_deposits_v","area":"retail","area_label":"Retail deposits and onboarding","summary":"The dashboard's masked view of retail_monitor_deposits (names follow the caller's client-names setting)."},{"key":"retail_monitor_onboardings_v","area":"retail","area_label":"Retail deposits and onboarding","summary":"The dashboard's masked view of retail_monitor_onboardings (names follow the caller's client-names setting)."},{"key":"webhook_function_runs_v","area":"ops","area_label":"Ops and Command Centre","summary":"The dashboard's masked view of webhook_function_runs (names follow the caller's client-names setting)."}],"tags":[{"name":"transactions","description":"Transactions and merchants. Platform transactions (V1 invoices), merchants and fee rates, entity mappings, expected volumes, industries, settlement times, S3 ingest log and the analytics gold layer for transactions and clients. Default access: dashboard page(s) transactions."},{"name":"revenue","description":"Revenue and metrics. Canonical revenue (gold layer and metrics RPCs), untracked (desk) revenue, lending interest, monthly revenue targets, flow metrics and the volatility basket against volume. Default access: dashboard page(s) revenue."},{"name":"rates","description":"Exchange rates. Saved B2C2/Binance quotes (exchange_rates, 4M rows: time filters required) and the rate RPCs. Default access: dashboard page(s) rates."},{"name":"treasury","description":"Treasury cash balances. Saved provider cash balances (B2C2, Fireblocks, Equals, OpenPayd), refreshed every 10 minutes. No live provider calls. Default access: dashboard page(s) balances."},{"name":"merchant_balances","description":"Merchant balances and ledger. V1-exact merchant balances and ledger, ledger builds, V1 cabinet invoices/statements and V1 admin invoice exports. Default access: dashboard page(s) merchant_balances."},{"name":"client_intelligence","description":"Client Intelligence. Clients, facts, status and dossier, accounts/cases/evidence, wallets and wallet evidence, on-chain transfers and daily flows, counterparties and flows, labels, raw Arkham data, static labels, market volatility basket and next-trade scores. Default access: dashboard page(s) pipeline + revenue + real merchant names."},{"name":"compliance","description":"Compliance (Sumsub, KYT, Travel Rule). Sumsub transaction screening, KYT records, applicants, VASPs, compliance links and wallet verification cases, including raw payloads. Default access: dashboard page(s) transactions or retail."},{"name":"retail","description":"Retail deposits and onboarding. Retail deposits, retail clients, beneficiaries, events, document metadata (never files), retail monitor tables and the retail gold layer. Default access: dashboard page(s) retail."},{"name":"pipeline","description":"Pipeline, CRM and churn. HubSpot pipeline cache and stages, pipeline notes, block list, prescreen runs, churn by month, HubSpot sync log. Default access: dashboard page(s) pipeline."},{"name":"partners","description":"Partners. HubSpot partners (introducers) and referrals, partner-client mappings, legacy partners and payouts, statement deliveries and email batches. Default access: dashboard page(s) partners."},{"name":"ops","description":"Ops and Command Centre. Cron job health (name and schedule only), job runs, edge/webhook health, Fireblocks and Equals approval/alert tables, Slack reactions, sprint burndown. Default access: dashboard page(s) webhooks."},{"name":"admin","description":"Admin (owner only). Users and roles, page permissions and overrides, the dashboard audit log, API access grants and the API audit log. Default access: dashboard page(s) owner only."},{"name":"general","description":"Available to every caller with API access."},{"name":"datasets","description":"Generic dataset access over the allowlisted catalogue."},{"name":"oauth","description":"OAuth 2.1 authorization server for MCP clients."},{"name":"account","description":"Key management, connector grants and the API playground (dashboard session)."}],"paths":{"/v1/tools/whoami":{"post":{"operationId":"whoami","summary":"Who am I and what can I read","description":"Your identity, effective API access level, the areas (and so datasets and tools) you can read, whether an owner override applies, and the API limits.\n\nArea: any. Read-only.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"example":{"value":{}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"whoami_get","summary":"Who am I and what can I read (query string)","description":"Your identity, effective API access level, the areas (and so datasets and tools) you can read, whether an owner override applies, and the API limits.\n\nArea: any. Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/get_definitions":{"post":{"operationId":"get_definitions","summary":"Definitions and glossary","description":"The glossary: revenue and status rules, the 1st party / 3rd party / 1st party else flow vocabulary, wallet ownership rules, units, timezones and data refresh times. Read it before answering anything about clients, flows or revenue.\n\nArea: any. Read-only.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"example":{"value":{}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"get_definitions_get","summary":"Definitions and glossary (query string)","description":"The glossary: revenue and status rules, the 1st party / 3rd party / 1st party else flow vocabulary, wallet ownership rules, units, timezones and data refresh times. Read it before answering anything about clients, flows or revenue.\n\nArea: any. Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/search":{"post":{"operationId":"search","summary":"Search","description":"Search clients (by name, legal entity or group), counterparties, transactions (by 8-character id, hash or internal id), blockchain addresses and retail clients. Returns ids for fetch, titles and dashboard links. Only areas you can read are searched.\n\nArea: any. Read-only.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Name, id, hash or address."}}},"examples":{"example":{"value":{"query":"Binance"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResult"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"search_get","summary":"Search (query string)","description":"Search clients (by name, legal entity or group), counterparties, transactions (by 8-character id, hash or internal id), blockchain addresses and retail clients. Returns ids for fetch, titles and dashboard links. Only areas you can read are searched.\n\nArea: any. Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"query","in":"query","required":true,"description":"Name, id, hash or address.","schema":{"type":"string","description":"Name, id, hash or address."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResult"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/fetch":{"post":{"operationId":"fetch","summary":"Fetch","description":"Fetch one item returned by search (id like client:<uuid>, counterparty:<key>, transaction:<id>, address:<address>, retail_client:<uuid>) as a readable document with its dashboard link.\n\nArea: any. Read-only.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"examples":{"example":{"value":{"id":"transaction:96EB33B6"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchResult"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"fetch_get","summary":"Fetch (query string)","description":"Fetch one item returned by search (id like client:<uuid>, counterparty:<key>, transaction:<id>, address:<address>, retail_client:<uuid>) as a readable document with its dashboard link.\n\nArea: any. Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchResult"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/list_datasets":{"post":{"operationId":"list_datasets","summary":"List datasets","description":"Every dataset (table or view) you can read, grouped by area, with a one-line summary, approximate row count, default time column and whether a filter is required. Use describe_dataset for columns.\n\nArea: any. Read-only.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"area":{"type":"string","enum":["transactions","revenue","rates","treasury","merchant_balances","client_intelligence","compliance","retail","pipeline","partners","ops","admin"]},"q":{"type":"string","description":"Text to match in the key or summary."}}},"examples":{"example":{"value":{"area":"revenue"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"list_datasets_get","summary":"List datasets (query string)","description":"Every dataset (table or view) you can read, grouped by area, with a one-line summary, approximate row count, default time column and whether a filter is required. Use describe_dataset for columns.\n\nArea: any. Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"area","in":"query","required":false,"schema":{"type":"string","enum":["transactions","revenue","rates","treasury","merchant_balances","client_intelligence","compliance","retail","pipeline","partners","ops","admin"]}},{"name":"q","in":"query","required":false,"description":"Text to match in the key or summary.","schema":{"type":"string","description":"Text to match in the key or summary."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/describe_dataset":{"post":{"operationId":"describe_dataset","summary":"Describe a dataset","description":"Columns of one dataset with type and meaning, plus its area, time column, default sort, required filters, refresh cadence and the dashboard page that shows it.\n\nArea: any. Read-only.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["dataset"],"properties":{"dataset":{"type":"string"}}},"examples":{"example":{"value":{"dataset":"transactions"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"describe_dataset_get","summary":"Describe a dataset (query string)","description":"Columns of one dataset with type and meaning, plus its area, time column, default sort, required filters, refresh cadence and the dashboard page that shows it.\n\nArea: any. Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"dataset","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/query_dataset":{"post":{"operationId":"query_dataset","summary":"Query a dataset","description":"Rows from one dataset with typed filters, column selection, sort and cursor paging (max 500 rows per call). Returns total_count (exact up to 100,000) and has_more; never sum a page: use aggregate_dataset for totals. Heavy tables (exchange_rates, onchain_transfers, static_address_labels, sumsub_txn_compliance, webhook_function_runs, cron_run_log, hubspot_sync_log…) require a time range or key filter; describe_dataset says which. Long JSON/text values are shortened unless you name the column in columns.\n\nArea: any. Read-only.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["dataset"],"properties":{"dataset":{"type":"string","description":"Dataset key from list_datasets."},"columns":{"type":"array","items":{"type":"string"},"description":"Columns to return (default: all)."},"filters":{"type":"array","maxItems":20,"description":"Conditions, all must hold.","items":{"type":"object","required":["column","op"],"properties":{"column":{"type":"string"},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in","not_in","contains","starts_with","is_null","not_null"]},"value":{"description":"String, number or boolean; an array for in / not_in."}}}},"from":{"type":"string","description":"Inclusive start on the time column (YYYY-MM-DD or ISO timestamp)."},"to":{"type":"string","description":"Inclusive end; a date means the whole day."},"time_column":{"type":"string","description":"Date/timestamp column for from/to (default: the dataset's time column)."},"order_by":{"type":"array","maxItems":3,"items":{"type":"object","required":["column"],"properties":{"column":{"type":"string"},"direction":{"type":"string","enum":["asc","desc"]}}}},"limit":{"type":"integer","minimum":1,"maximum":500,"default":50},"cursor":{"type":"string","description":"next_cursor from the previous call (same query)."}}},"examples":{"example":{"value":{"dataset":"transactions","columns":["transaction_id","merchant_name","transaction_type","status","total_fee_usd","trade_date_utc"],"filters":[{"column":"status","op":"in","value":["Done","Completed","Client Completed"]}],"from":"2026-09-01","to":"2026-09-30","order_by":[{"column":"total_fee_usd","direction":"desc"}],"limit":50}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"query_dataset_get","summary":"Query a dataset (query string)","description":"Rows from one dataset with typed filters, column selection, sort and cursor paging (max 500 rows per call). Returns total_count (exact up to 100,000) and has_more; never sum a page: use aggregate_dataset for totals. Heavy tables (exchange_rates, onchain_transfers, static_address_labels, sumsub_txn_compliance, webhook_function_runs, cron_run_log, hubspot_sync_log…) require a time range or key filter; describe_dataset says which. Long JSON/text values are shortened unless you name the column in columns.\n\nArea: any. Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"dataset","in":"query","required":true,"description":"Dataset key from list_datasets.","schema":{"type":"string","description":"Dataset key from list_datasets."}},{"name":"columns","in":"query","required":false,"description":"Columns to return (default: all).","schema":{"type":"string","description":"JSON-encoded"}},{"name":"filters","in":"query","required":false,"description":"Conditions, all must hold.","schema":{"type":"string","description":"JSON-encoded"}},{"name":"from","in":"query","required":false,"description":"Inclusive start on the time column (YYYY-MM-DD or ISO timestamp).","schema":{"type":"string","description":"Inclusive start on the time column (YYYY-MM-DD or ISO timestamp)."}},{"name":"to","in":"query","required":false,"description":"Inclusive end; a date means the whole day.","schema":{"type":"string","description":"Inclusive end; a date means the whole day."}},{"name":"time_column","in":"query","required":false,"description":"Date/timestamp column for from/to (default: the dataset's time column).","schema":{"type":"string","description":"Date/timestamp column for from/to (default: the dataset's time column)."}},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","description":"JSON-encoded"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":50}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from the previous call (same query).","schema":{"type":"string","description":"next_cursor from the previous call (same query)."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/aggregate_dataset":{"post":{"operationId":"aggregate_dataset","summary":"Aggregate a dataset","description":"Server-side totals over one dataset: count, count_distinct, sum, avg, min, max of columns, optionally grouped by up to 3 columns (dates can be bucketed by day, week, month, quarter or year). Returns the groups plus grand totals over ALL matching rows (not just the groups shown) and the number of groups. Use this instead of adding up rows. Same filters and required-filter rules as query_dataset.\n\nArea: any. Read-only.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["dataset","metrics"],"properties":{"dataset":{"type":"string"},"group_by":{"type":"array","maxItems":3,"items":{"anyOf":[{"type":"string"},{"type":"object","required":["column"],"properties":{"column":{"type":"string"},"bucket":{"type":"string","enum":["day","week","month","quarter","year"]}}}]}},"metrics":{"type":"array","minItems":1,"maxItems":8,"items":{"type":"object","required":["fn"],"properties":{"fn":{"type":"string","enum":["count","count_distinct","sum","avg","min","max"]},"column":{"type":"string","description":"Omit for count(*)."}}}},"filters":{"type":"array","maxItems":20,"description":"Conditions, all must hold.","items":{"type":"object","required":["column","op"],"properties":{"column":{"type":"string"},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in","not_in","contains","starts_with","is_null","not_null"]},"value":{"description":"String, number or boolean; an array for in / not_in."}}}},"from":{"type":"string"},"to":{"type":"string"},"time_column":{"type":"string"},"order_by":{"type":"string","description":"A group or metric name (e.g. sum_volume_usd). Default: first metric, largest first; date buckets in date order."},"direction":{"type":"string","enum":["asc","desc"]},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100}}},"examples":{"example":{"value":{"dataset":"analytics.transaction","from":"2026-07-01","to":"2026-09-30","time_column":"trade_date_utc","group_by":[{"column":"trade_date_utc","bucket":"month"}],"metrics":[{"fn":"sum","column":"revenue_usd"},{"fn":"count"}]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"aggregate_dataset_get","summary":"Aggregate a dataset (query string)","description":"Server-side totals over one dataset: count, count_distinct, sum, avg, min, max of columns, optionally grouped by up to 3 columns (dates can be bucketed by day, week, month, quarter or year). Returns the groups plus grand totals over ALL matching rows (not just the groups shown) and the number of groups. Use this instead of adding up rows. Same filters and required-filter rules as query_dataset.\n\nArea: any. Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"dataset","in":"query","required":true,"schema":{"type":"string"}},{"name":"group_by","in":"query","required":false,"schema":{"type":"string","description":"JSON-encoded"}},{"name":"metrics","in":"query","required":true,"schema":{"type":"string","description":"JSON-encoded"}},{"name":"filters","in":"query","required":false,"description":"Conditions, all must hold.","schema":{"type":"string","description":"JSON-encoded"}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}},{"name":"time_column","in":"query","required":false,"schema":{"type":"string"}},{"name":"order_by","in":"query","required":false,"description":"A group or metric name (e.g. sum_volume_usd). Default: first metric, largest first; date buckets in date order.","schema":{"type":"string","description":"A group or metric name (e.g. sum_volume_usd). Default: first metric, largest first; date buckets in date order."}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/revenue_summary":{"post":{"operationId":"revenue_summary","summary":"Revenue summary","description":"Canonical revenue (the Overview figure: platform fees on completed trades + desk revenue + lending interest) and volumes for a period, as a total or grouped by client, month or day, in one of the dashboard's four trading-day timezones. Optional client filter. Also returns the previous period of the same length for comparison. Totals are computed server-side over the whole period.\n\nArea: revenue (Revenue and metrics). Read-only.","tags":["revenue"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","description":"First day, inclusive (YYYY-MM-DD). Default: first day of the current month."},"to":{"type":"string","description":"Last day, inclusive (YYYY-MM-DD). Default: today."},"tz":{"type":"string","enum":["utc","london","ny","vilnius"],"default":"utc","description":"Trading-day timezone used to date transactions."},"group_by":{"type":"string","enum":["total","client","month","day"],"default":"total"},"client":{"type":"string","description":"Only this client (merchant id or name)."},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100}}},"examples":{"example":{"value":{"from":"2026-09-01","to":"2026-09-30","group_by":"client","tz":"utc"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"revenue_summary_get","summary":"Revenue summary (query string)","description":"Canonical revenue (the Overview figure: platform fees on completed trades + desk revenue + lending interest) and volumes for a period, as a total or grouped by client, month or day, in one of the dashboard's four trading-day timezones. Optional client filter. Also returns the previous period of the same length for comparison. Totals are computed server-side over the whole period.\n\nArea: revenue (Revenue and metrics). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["revenue"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"from","in":"query","required":false,"description":"First day, inclusive (YYYY-MM-DD). Default: first day of the current month.","schema":{"type":"string","description":"First day, inclusive (YYYY-MM-DD). Default: first day of the current month."}},{"name":"to","in":"query","required":false,"description":"Last day, inclusive (YYYY-MM-DD). Default: today.","schema":{"type":"string","description":"Last day, inclusive (YYYY-MM-DD). Default: today."}},{"name":"tz","in":"query","required":false,"description":"Trading-day timezone used to date transactions.","schema":{"type":"string","enum":["utc","london","ny","vilnius"],"default":"utc","description":"Trading-day timezone used to date transactions."}},{"name":"group_by","in":"query","required":false,"schema":{"type":"string","enum":["total","client","month","day"],"default":"total"}},{"name":"client","in":"query","required":false,"description":"Only this client (merchant id or name).","schema":{"type":"string","description":"Only this client (merchant id or name)."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/metrics":{"post":{"operationId":"metrics","summary":"Dashboard metric RPCs","description":"The dashboard's aggregate RPCs, unchanged: daily_merchant_metrics (Overview: revenue, volumes, fees, count per merchant per day), monthly_merchant_metrics (per merchant per month), monthly_flow_metrics (Flows page: volume and revenue by month, merchant, type and currency pair; Rejected/Cancelled/Failed count as zero volume), vol_basket_vs_volume_weekly / _monthly (volatility basket z-score against conversion and transfer volume), analytics_clients (canonical client list with status) and analytics_exclusions (what analytics leaves out). Returns rows plus server-side totals of every numeric column.\n\nArea: revenue (Revenue and metrics). Read-only.","tags":["revenue"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","enum":["daily_merchant_metrics","monthly_merchant_metrics","monthly_flow_metrics","vol_basket_vs_volume_weekly","vol_basket_vs_volume_monthly","analytics_clients","analytics_exclusions"]},"tz":{"type":"string","enum":["utc","london","ny","vilnius"],"default":"utc"},"from":{"type":"string","description":"First day (YYYY-MM-DD). Daily: default 30 days ago; monthly: filters months >= this month."},"to":{"type":"string","description":"Last day (YYYY-MM-DD)."},"merchant":{"type":"string","description":"Only rows whose merchant name contains this."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":200}}},"examples":{"example":{"value":{"name":"monthly_flow_metrics","from":"2026-07-01"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"metrics_get","summary":"Dashboard metric RPCs (query string)","description":"The dashboard's aggregate RPCs, unchanged: daily_merchant_metrics (Overview: revenue, volumes, fees, count per merchant per day), monthly_merchant_metrics (per merchant per month), monthly_flow_metrics (Flows page: volume and revenue by month, merchant, type and currency pair; Rejected/Cancelled/Failed count as zero volume), vol_basket_vs_volume_weekly / _monthly (volatility basket z-score against conversion and transfer volume), analytics_clients (canonical client list with status) and analytics_exclusions (what analytics leaves out). Returns rows plus server-side totals of every numeric column.\n\nArea: revenue (Revenue and metrics). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["revenue"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","enum":["daily_merchant_metrics","monthly_merchant_metrics","monthly_flow_metrics","vol_basket_vs_volume_weekly","vol_basket_vs_volume_monthly","analytics_clients","analytics_exclusions"]}},{"name":"tz","in":"query","required":false,"schema":{"type":"string","enum":["utc","london","ny","vilnius"],"default":"utc"}},{"name":"from","in":"query","required":false,"description":"First day (YYYY-MM-DD). Daily: default 30 days ago; monthly: filters months >= this month.","schema":{"type":"string","description":"First day (YYYY-MM-DD). Daily: default 30 days ago; monthly: filters months >= this month."}},{"name":"to","in":"query","required":false,"description":"Last day (YYYY-MM-DD).","schema":{"type":"string","description":"Last day (YYYY-MM-DD)."}},{"name":"merchant","in":"query","required":false,"description":"Only rows whose merchant name contains this.","schema":{"type":"string","description":"Only rows whose merchant name contains this."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/exchange_rates":{"post":{"operationId":"exchange_rates","summary":"Exchange rates","description":"Saved market quotes in USD per unit of a currency (B2C2 / Binance mids, bid and ask). mode latest = newest quote per currency; at = the quote nearest before a time; history = mid prices for one currency between from and to (at most 31 days).\n\nArea: rates (Exchange rates). Read-only.","tags":["rates"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["latest","at","history"],"default":"latest"},"currency":{"type":"string","description":"Base currency (e.g. BTC, ETH, EUR). Required for history."},"at":{"type":"string","description":"ISO timestamp for mode at."},"from":{"type":"string"},"to":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":200}}},"examples":{"example":{"value":{"mode":"latest","currency":"BTC"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"exchange_rates_get","summary":"Exchange rates (query string)","description":"Saved market quotes in USD per unit of a currency (B2C2 / Binance mids, bid and ask). mode latest = newest quote per currency; at = the quote nearest before a time; history = mid prices for one currency between from and to (at most 31 days).\n\nArea: rates (Exchange rates). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["rates"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","enum":["latest","at","history"],"default":"latest"}},{"name":"currency","in":"query","required":false,"description":"Base currency (e.g. BTC, ETH, EUR). Required for history.","schema":{"type":"string","description":"Base currency (e.g. BTC, ETH, EUR). Required for history."}},{"name":"at","in":"query","required":false,"description":"ISO timestamp for mode at.","schema":{"type":"string","description":"ISO timestamp for mode at."}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/list_clients":{"post":{"operationId":"list_clients","summary":"List clients","description":"Every client with status, last trade and the three 90-day flows: 1st party (own deposits + withdrawals with Overchain), 3rd party (other payment types through Overchain) and 1st party else (on-chain flow of own wallets with others). Sorted by last trade, newest first, unless sort_by is given. Totals cover every matching client, not just the page.\n\nArea: client_intelligence (Client Intelligence). Read-only.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"q":{"type":"string","description":"Filter by client name (part of the name)."},"status":{"type":"string","enum":["money_waiting","overdue","lapsed","normal","not_trading","account_problem"],"description":"Filter by client status."},"sort_by":{"type":"string","enum":["last_trade","first_party_90d","third_party_90d","first_party_else_90d","converts_90d","name"],"default":"last_trade"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50,"description":"Rows to return (default 50, max 200)."},"cursor":{"type":"string","description":"next_cursor from the previous page, to continue."}}},"examples":{"example":{"value":{"status":"overdue"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"list_clients_get","summary":"List clients (query string)","description":"Every client with status, last trade and the three 90-day flows: 1st party (own deposits + withdrawals with Overchain), 3rd party (other payment types through Overchain) and 1st party else (on-chain flow of own wallets with others). Sorted by last trade, newest first, unless sort_by is given. Totals cover every matching client, not just the page.\n\nArea: client_intelligence (Client Intelligence). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"q","in":"query","required":false,"description":"Filter by client name (part of the name).","schema":{"type":"string","description":"Filter by client name (part of the name)."}},{"name":"status","in":"query","required":false,"description":"Filter by client status.","schema":{"type":"string","enum":["money_waiting","overdue","lapsed","normal","not_trading","account_problem"],"description":"Filter by client status."}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","enum":["last_trade","first_party_90d","third_party_90d","first_party_else_90d","converts_90d","name"],"default":"last_trade"}},{"name":"limit","in":"query","required":false,"description":"Rows to return (default 50, max 200).","schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"description":"Rows to return (default 50, max 200)."}},{"name":"cursor","in":"query","required":false,"description":"next_cursor from the previous page, to continue.","schema":{"type":"string","description":"next_cursor from the previous page, to continue."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/get_client":{"post":{"operationId":"get_client","summary":"Get one client","description":"One client in full: status and reason, 1st party / 3rd party / 1st party else flows over 90 and 365 days (kept separate), converts, top counterparties, fee rates, profile ids, compliance summary, wallet counts, and revenue when you have the revenue area. Accepts a merchant id or a name.\n\nArea: client_intelligence (Client Intelligence). Read-only.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["client"],"properties":{"client":{"type":"string","description":"Client: merchant id (uuid), or a name / part of a name. Ambiguous names return the candidates instead of guessing."}}},"examples":{"example":{"value":{"client":"Thecorio"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"get_client_get","summary":"Get one client (query string)","description":"One client in full: status and reason, 1st party / 3rd party / 1st party else flows over 90 and 365 days (kept separate), converts, top counterparties, fee rates, profile ids, compliance summary, wallet counts, and revenue when you have the revenue area. Accepts a merchant id or a name.\n\nArea: client_intelligence (Client Intelligence). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"client","in":"query","required":true,"description":"Client: merchant id (uuid), or a name / part of a name. Ambiguous names return the candidates instead of guessing.","schema":{"type":"string","description":"Client: merchant id (uuid), or a name / part of a name. Ambiguous names return the candidates instead of guessing."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/client_counterparties":{"post":{"operationId":"client_counterparties","summary":"A client's counterparties","description":"Who a client transacts with, one row per counterparty entity, each flow kept separate: first_party (screened senders of its deposits / receivers of its withdrawals), third_party (screened customers and payees of its other payment types) and first_party_else (on-chain flow between its own wallets and the counterparty). Excludes the client itself, its group, Overchain and unlabelled addresses (unlabelled 1st party else is reported as a total). Data is monthly: the window covers whole calendar months from `from` to `to` (default: the last 90 days). Default sort: last seen, newest first.\n\nArea: client_intelligence (Client Intelligence). Read-only.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["client"],"properties":{"client":{"type":"string","description":"Client: merchant id (uuid), or a name / part of a name. Ambiguous names return the candidates instead of guessing."},"from":{"type":"string","description":"Start date, inclusive, YYYY-MM-DD (UTC unless tz says otherwise)."},"to":{"type":"string","description":"End date, inclusive, YYYY-MM-DD."},"sort_by":{"type":"string","enum":["last_seen","first_party","third_party","first_party_else","name"],"default":"last_seen","description":"first_party / third_party / first_party_else sort by that flow's in + out."},"flow":{"type":"string","enum":["any","first_party","third_party","first_party_else"],"default":"any","description":"Only counterparties present in this flow."},"include_our_clients":{"type":"boolean","default":true,"description":"Include counterparties that are other Overchain clients."},"limit":{"type":"integer","minimum":1,"maximum":300,"default":50,"description":"Rows to return (default 50, max 300)."}}},"examples":{"example":{"value":{"client":"Thecorio","from":"2026-07-01","to":"2026-09-30","sort_by":"first_party_else"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"client_counterparties_get","summary":"A client's counterparties (query string)","description":"Who a client transacts with, one row per counterparty entity, each flow kept separate: first_party (screened senders of its deposits / receivers of its withdrawals), third_party (screened customers and payees of its other payment types) and first_party_else (on-chain flow between its own wallets and the counterparty). Excludes the client itself, its group, Overchain and unlabelled addresses (unlabelled 1st party else is reported as a total). Data is monthly: the window covers whole calendar months from `from` to `to` (default: the last 90 days). Default sort: last seen, newest first.\n\nArea: client_intelligence (Client Intelligence). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"client","in":"query","required":true,"description":"Client: merchant id (uuid), or a name / part of a name. Ambiguous names return the candidates instead of guessing.","schema":{"type":"string","description":"Client: merchant id (uuid), or a name / part of a name. Ambiguous names return the candidates instead of guessing."}},{"name":"from","in":"query","required":false,"description":"Start date, inclusive, YYYY-MM-DD (UTC unless tz says otherwise).","schema":{"type":"string","description":"Start date, inclusive, YYYY-MM-DD (UTC unless tz says otherwise)."}},{"name":"to","in":"query","required":false,"description":"End date, inclusive, YYYY-MM-DD.","schema":{"type":"string","description":"End date, inclusive, YYYY-MM-DD."}},{"name":"sort_by","in":"query","required":false,"description":"first_party / third_party / first_party_else sort by that flow's in + out.","schema":{"type":"string","enum":["last_seen","first_party","third_party","first_party_else","name"],"default":"last_seen","description":"first_party / third_party / first_party_else sort by that flow's in + out."}},{"name":"flow","in":"query","required":false,"description":"Only counterparties present in this flow.","schema":{"type":"string","enum":["any","first_party","third_party","first_party_else"],"default":"any","description":"Only counterparties present in this flow."}},{"name":"include_our_clients","in":"query","required":false,"description":"Include counterparties that are other Overchain clients.","schema":{"type":"boolean","default":true,"description":"Include counterparties that are other Overchain clients."}},{"name":"limit","in":"query","required":false,"description":"Rows to return (default 50, max 300).","schema":{"type":"integer","minimum":1,"maximum":300,"default":50,"description":"Rows to return (default 50, max 300)."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/client_wallets":{"post":{"operationId":"client_wallets","summary":"A client's wallets","description":"A client's wallet registry split by what the address is: own (tier PROVEN: deposited into Overchain or received an Overchain withdrawal; the only addresses that are the client's and feed 1st party else) versus linked (THIRD_PARTY, STRONG, CANDIDATE: linked by screening names, declarations or heuristics; these are counterparties, not the client's wallets) and excluded / discarded.\n\nArea: client_intelligence (Client Intelligence). Read-only.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["client"],"properties":{"client":{"type":"string","description":"Client: merchant id (uuid), or a name / part of a name. Ambiguous names return the candidates instead of guessing."},"include_excluded":{"type":"boolean","default":false}}},"examples":{"example":{"value":{"client":"Thecorio"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"client_wallets_get","summary":"A client's wallets (query string)","description":"A client's wallet registry split by what the address is: own (tier PROVEN: deposited into Overchain or received an Overchain withdrawal; the only addresses that are the client's and feed 1st party else) versus linked (THIRD_PARTY, STRONG, CANDIDATE: linked by screening names, declarations or heuristics; these are counterparties, not the client's wallets) and excluded / discarded.\n\nArea: client_intelligence (Client Intelligence). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"client","in":"query","required":true,"description":"Client: merchant id (uuid), or a name / part of a name. Ambiguous names return the candidates instead of guessing.","schema":{"type":"string","description":"Client: merchant id (uuid), or a name / part of a name. Ambiguous names return the candidates instead of guessing."}},{"name":"include_excluded","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/get_counterparty":{"post":{"operationId":"get_counterparty","summary":"Get one counterparty","description":"One counterparty entity (e.g. Binance, Kraken, another client) across all clients: totals and, per client, 1st party / 3rd party (screened value through Overchain) and 1st party else (on-chain with the client's own wallets), each split into in (to the client) and out (from the client), never summed. Window: the last 90 or 365 days.\n\nArea: client_intelligence (Client Intelligence). Read-only.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["counterparty"],"properties":{"counterparty":{"type":"string","description":"Entity key or name (e.g. \"binance\", \"Kraken\")."},"days":{"type":"integer","enum":[90,365],"default":365}}},"examples":{"example":{"value":{"counterparty":"binance","days":365}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"get_counterparty_get","summary":"Get one counterparty (query string)","description":"One counterparty entity (e.g. Binance, Kraken, another client) across all clients: totals and, per client, 1st party / 3rd party (screened value through Overchain) and 1st party else (on-chain with the client's own wallets), each split into in (to the client) and out (from the client), never summed. Window: the last 90 or 365 days.\n\nArea: client_intelligence (Client Intelligence). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"counterparty","in":"query","required":true,"description":"Entity key or name (e.g. \"binance\", \"Kraken\").","schema":{"type":"string","description":"Entity key or name (e.g. \"binance\", \"Kraken\")."}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","enum":[90,365],"default":365}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/address_lookup":{"post":{"operationId":"address_lookup","summary":"Look up an address","description":"Everything saved about one blockchain address: whether it is Overchain's own, which clients own it or are linked to it (with wallet tier), its counterparty label, public static labels, the saved Arkham answer (cache only; never calls Arkham) and on-chain flow totals with clients.\n\nArea: client_intelligence (Client Intelligence). Read-only.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address"],"properties":{"address":{"type":"string"}}},"examples":{"example":{"value":{"address":"TJvgCSvdc19i9yocqRcCwb8PDKBHxQRNAp"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"address_lookup_get","summary":"Look up an address (query string)","description":"Everything saved about one blockchain address: whether it is Overchain's own, which clients own it or are linked to it (with wallet tier), its counterparty label, public static labels, the saved Arkham answer (cache only; never calls Arkham) and on-chain flow totals with clients.\n\nArea: client_intelligence (Client Intelligence). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["client_intelligence"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/cash_balances":{"post":{"operationId":"cash_balances","summary":"Treasury cash balances","description":"Latest SAVED provider cash balances (B2C2, Fireblocks, Equals, OpenPayd…) per provider, currency and balance type, with USD values and totals by provider. Saved every 10 minutes; never calls a provider live.\n\nArea: treasury (Treasury cash balances). Read-only.","tags":["treasury"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","description":"Filter by provider (part of the name)."},"currency":{"type":"string","description":"Filter by currency code."}}},"examples":{"example":{"value":{}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"cash_balances_get","summary":"Treasury cash balances (query string)","description":"Latest SAVED provider cash balances (B2C2, Fireblocks, Equals, OpenPayd…) per provider, currency and balance type, with USD values and totals by provider. Saved every 10 minutes; never calls a provider live.\n\nArea: treasury (Treasury cash balances). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["treasury"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"provider","in":"query","required":false,"description":"Filter by provider (part of the name).","schema":{"type":"string","description":"Filter by provider (part of the name)."}},{"name":"currency","in":"query","required":false,"description":"Filter by currency code.","schema":{"type":"string","description":"Filter by currency code."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/merchant_balances":{"post":{"operationId":"merchant_balances","summary":"Merchant balances","description":"Client (merchant) balances held with Overchain from the V1-exact ledger: one row per client with available / locked / pending in USD and every currency in native units, last movement time and the rate used. Same rules as the Merchant Balances page: house accounts and dust left out unless asked; currencies without a USD rate are listed under unpriced and left out of USD totals. as_of (YYYY-MM-DD) gives the position at 23:59:59 UTC that day.\n\nArea: merchant_balances (Merchant balances and ledger). Read-only.","tags":["merchant_balances"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"merchant":{"type":"string","description":"Filter by client name (part of the name)."},"asset":{"type":"string","description":"Only this currency/asset (e.g. USD, EUR, USDT-TRC20)."},"as_of":{"type":"string","description":"Position at the end of this UTC day (YYYY-MM-DD). Default: now."},"include_house":{"type":"boolean","default":false},"include_zero":{"type":"boolean","description":"Include zero / dust balances. Default: true when merchant is given, else false."},"limit":{"type":"integer","minimum":1,"maximum":300,"default":100}}},"examples":{"example":{"value":{"asset":"USD"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"merchant_balances_get","summary":"Merchant balances (query string)","description":"Client (merchant) balances held with Overchain from the V1-exact ledger: one row per client with available / locked / pending in USD and every currency in native units, last movement time and the rate used. Same rules as the Merchant Balances page: house accounts and dust left out unless asked; currencies without a USD rate are listed under unpriced and left out of USD totals. as_of (YYYY-MM-DD) gives the position at 23:59:59 UTC that day.\n\nArea: merchant_balances (Merchant balances and ledger). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["merchant_balances"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"merchant","in":"query","required":false,"description":"Filter by client name (part of the name).","schema":{"type":"string","description":"Filter by client name (part of the name)."}},{"name":"asset","in":"query","required":false,"description":"Only this currency/asset (e.g. USD, EUR, USDT-TRC20).","schema":{"type":"string","description":"Only this currency/asset (e.g. USD, EUR, USDT-TRC20)."}},{"name":"as_of","in":"query","required":false,"description":"Position at the end of this UTC day (YYYY-MM-DD). Default: now.","schema":{"type":"string","description":"Position at the end of this UTC day (YYYY-MM-DD). Default: now."}},{"name":"include_house","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"include_zero","in":"query","required":false,"description":"Include zero / dust balances. Default: true when merchant is given, else false.","schema":{"type":"boolean","description":"Include zero / dust balances. Default: true when merchant is given, else false."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":300,"default":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/merchant_ledger":{"post":{"operationId":"merchant_ledger","summary":"Merchant ledger","description":"The V1-exact ledger behind a client's balance: entries newest first with event type, transaction id, bucket (available / locked / pending), amount and running balances, per asset. Use it for 'when did X's USD balance last change and why'.\n\nArea: merchant_balances (Merchant balances and ledger). Read-only.","tags":["merchant_balances"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["merchant"],"properties":{"merchant":{"type":"string","description":"Client name (or part) or merchant_ref from merchant_balances."},"asset":{"type":"string","description":"Asset (e.g. USD, EUR, USDT-TRC20). Strongly recommended."},"from":{"type":"string","description":"Start (YYYY-MM-DD or ISO timestamp)."},"to":{"type":"string","description":"End (YYYY-MM-DD = end of that UTC day, or ISO timestamp)."},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100}}},"examples":{"example":{"value":{"merchant":"XPA Holdings Limited","asset":"USD","limit":20}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"merchant_ledger_get","summary":"Merchant ledger (query string)","description":"The V1-exact ledger behind a client's balance: entries newest first with event type, transaction id, bucket (available / locked / pending), amount and running balances, per asset. Use it for 'when did X's USD balance last change and why'.\n\nArea: merchant_balances (Merchant balances and ledger). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["merchant_balances"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"merchant","in":"query","required":true,"description":"Client name (or part) or merchant_ref from merchant_balances.","schema":{"type":"string","description":"Client name (or part) or merchant_ref from merchant_balances."}},{"name":"asset","in":"query","required":false,"description":"Asset (e.g. USD, EUR, USDT-TRC20). Strongly recommended.","schema":{"type":"string","description":"Asset (e.g. USD, EUR, USDT-TRC20). Strongly recommended."}},{"name":"from","in":"query","required":false,"description":"Start (YYYY-MM-DD or ISO timestamp).","schema":{"type":"string","description":"Start (YYYY-MM-DD or ISO timestamp)."}},{"name":"to","in":"query","required":false,"description":"End (YYYY-MM-DD = end of that UTC day, or ISO timestamp).","schema":{"type":"string","description":"End (YYYY-MM-DD = end of that UTC day, or ISO timestamp)."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/get_transaction":{"post":{"operationId":"get_transaction","summary":"Get one transaction","description":"One platform transaction by its 8-character transaction_id, row id, internal id or on-chain hash: type, status, amounts and USD values, fees (revenue), addresses, settlement time, plus its Sumsub compliance records (with the compliance area) and the retail deposit it belongs to (with the retail area).\n\nArea: transactions (Transactions and merchants). Read-only.","tags":["transactions"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"transaction_id (e.g. 96EB33B6), row id, internal id or transaction hash."}}},"examples":{"example":{"value":{"id":"96EB33B6"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"get_transaction_get","summary":"Get one transaction (query string)","description":"One platform transaction by its 8-character transaction_id, row id, internal id or on-chain hash: type, status, amounts and USD values, fees (revenue), addresses, settlement time, plus its Sumsub compliance records (with the compliance area) and the retail deposit it belongs to (with the retail area).\n\nArea: transactions (Transactions and merchants). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["transactions"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"id","in":"query","required":true,"description":"transaction_id (e.g. 96EB33B6), row id, internal id or transaction hash.","schema":{"type":"string","description":"transaction_id (e.g. 96EB33B6), row id, internal id or transaction hash."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/compliance_lookup":{"post":{"operationId":"compliance_lookup","summary":"Compliance lookup","description":"Sumsub compliance records (review answer, screening status and risk, Chainalysis cluster, Travel Rule, counterparty and VASP) by transaction id, Sumsub record id, applicant id, screened address or a date range with filters (risk level, review answer, screening status). Returns records plus counts by risk level, review answer and screening status for everything that matched. A screening_status other than \"screened\" is a coverage gap, not a clean result.\n\nArea: compliance (Compliance (Sumsub, KYT, Travel Rule)). Read-only.","tags":["compliance"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"transaction_id":{"type":"string"},"sumsub_id":{"type":"string"},"applicant_id":{"type":"string"},"address":{"type":"string","description":"Screened address."},"from":{"type":"string","description":"With to: records created in this range (max 92 days)."},"to":{"type":"string"},"risk_level":{"type":"string","enum":["Severe","High","Medium","Low"]},"review_answer":{"type":"string","enum":["GREEN","RED"]},"screening_status":{"type":"string","description":"e.g. screened, unavailable, not_applicable."},"limit":{"type":"integer","minimum":1,"maximum":300,"default":50}}},"examples":{"example":{"value":{"from":"2026-09-01","to":"2026-09-30","risk_level":"High"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"compliance_lookup_get","summary":"Compliance lookup (query string)","description":"Sumsub compliance records (review answer, screening status and risk, Chainalysis cluster, Travel Rule, counterparty and VASP) by transaction id, Sumsub record id, applicant id, screened address or a date range with filters (risk level, review answer, screening status). Returns records plus counts by risk level, review answer and screening status for everything that matched. A screening_status other than \"screened\" is a coverage gap, not a clean result.\n\nArea: compliance (Compliance (Sumsub, KYT, Travel Rule)). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["compliance"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"transaction_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"sumsub_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"applicant_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"address","in":"query","required":false,"description":"Screened address.","schema":{"type":"string","description":"Screened address."}},{"name":"from","in":"query","required":false,"description":"With to: records created in this range (max 92 days).","schema":{"type":"string","description":"With to: records created in this range (max 92 days)."}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}},{"name":"risk_level","in":"query","required":false,"schema":{"type":"string","enum":["Severe","High","Medium","Low"]}},{"name":"review_answer","in":"query","required":false,"schema":{"type":"string","enum":["GREEN","RED"]}},{"name":"screening_status","in":"query","required":false,"description":"e.g. screened, unavailable, not_applicable.","schema":{"type":"string","description":"e.g. screened, unavailable, not_applicable."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":300,"default":50}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/retail_summary":{"post":{"operationId":"retail_summary","summary":"Retail deposits summary","description":"Retail payments into merchants (gold layer analytics.retail_payment) for a period: payments, funded, settled and identified counts, unique payers, settled USD and revenue, grouped by client, payer, payer kind, day or month, with totals. Optionally the latest deposits themselves (sender, KYC level, status, amount).\n\nArea: retail (Retail deposits and onboarding). Read-only.","tags":["retail"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","description":"Default: first day of this month."},"to":{"type":"string","description":"Default: today."},"tz":{"type":"string","enum":["utc","london"],"default":"utc"},"group_by":{"type":"string","enum":["total","client","payer","payer_kind","day","month"],"default":"client"},"client":{"type":"string","description":"Only this merchant (name or id)."},"include_deposits":{"type":"boolean","default":false,"description":"Also list the deposits (newest first)."},"our_status":{"type":"string","enum":["Done","Pending","Incomplete"],"description":"Filter for the deposit list."},"limit":{"type":"integer","minimum":1,"maximum":300,"default":50}}},"examples":{"example":{"value":{"from":"2026-09-01","to":"2026-09-30","group_by":"client"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"retail_summary_get","summary":"Retail deposits summary (query string)","description":"Retail payments into merchants (gold layer analytics.retail_payment) for a period: payments, funded, settled and identified counts, unique payers, settled USD and revenue, grouped by client, payer, payer kind, day or month, with totals. Optionally the latest deposits themselves (sender, KYC level, status, amount).\n\nArea: retail (Retail deposits and onboarding). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["retail"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"from","in":"query","required":false,"description":"Default: first day of this month.","schema":{"type":"string","description":"Default: first day of this month."}},{"name":"to","in":"query","required":false,"description":"Default: today.","schema":{"type":"string","description":"Default: today."}},{"name":"tz","in":"query","required":false,"schema":{"type":"string","enum":["utc","london"],"default":"utc"}},{"name":"group_by","in":"query","required":false,"schema":{"type":"string","enum":["total","client","payer","payer_kind","day","month"],"default":"client"}},{"name":"client","in":"query","required":false,"description":"Only this merchant (name or id).","schema":{"type":"string","description":"Only this merchant (name or id)."}},{"name":"include_deposits","in":"query","required":false,"description":"Also list the deposits (newest first).","schema":{"type":"boolean","default":false,"description":"Also list the deposits (newest first)."}},{"name":"our_status","in":"query","required":false,"description":"Filter for the deposit list.","schema":{"type":"string","enum":["Done","Pending","Incomplete"],"description":"Filter for the deposit list."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":300,"default":50}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/ops_health":{"post":{"operationId":"ops_health","summary":"Cron, job and webhook health","description":"Command Centre health: cron jobs (name, schedule, last run, status, failures; never the command text), scheduled job runs (rows written, clients covered, partial / failed in 7 days), recent cron failures and edge HTTP failures, and per-function webhook health. view = summary (default) shows only what is failing or late plus counts.\n\nArea: ops (Ops and Command Centre). Read-only.","tags":["ops"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"view":{"type":"string","enum":["summary","cron","jobs","failures","webhooks"],"default":"summary"},"name":{"type":"string","description":"Filter by job / function name (part)."}}},"examples":{"example":{"value":{"view":"summary"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"ops_health_get","summary":"Cron, job and webhook health (query string)","description":"Command Centre health: cron jobs (name, schedule, last run, status, failures; never the command text), scheduled job runs (rows written, clients covered, partial / failed in 7 days), recent cron failures and edge HTTP failures, and per-function webhook health. view = summary (default) shows only what is failing or late plus counts.\n\nArea: ops (Ops and Command Centre). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["ops"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"view","in":"query","required":false,"schema":{"type":"string","enum":["summary","cron","jobs","failures","webhooks"],"default":"summary"}},{"name":"name","in":"query","required":false,"description":"Filter by job / function name (part).","schema":{"type":"string","description":"Filter by job / function name (part)."}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools/list_users":{"post":{"operationId":"list_users","summary":"Users and API access (owner)","description":"Owner only: every dashboard user with role, page overrides, real/masked names, vault access, last sign-in, and their effective API access (areas, whether from the dashboard or an owner override).\n\nArea: admin (Admin (owner only)). Read-only.","tags":["admin"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"example":{"value":{}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"list_users_get","summary":"Users and API access (owner) (query string)","description":"Owner only: every dashboard user with role, page overrides, real/masked names, vault access, last sign-in, and their effective API access (areas, whether from the dashboard or an owner override).\n\nArea: admin (Admin (owner only)). Read-only.\n\nSame as POST; arrays and objects are JSON-encoded in the query string.","tags":["admin"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/tools":{"get":{"operationId":"list_tools","summary":"Tools you can call","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"responses":{"200":{"description":"Tool list with input schemas and the server instructions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolList"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/whoami":{"get":{"operationId":"whoami_rest","summary":"Who am I","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/definitions":{"get":{"operationId":"definitions","summary":"Glossary","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/datasets":{"get":{"operationId":"list_datasets_rest","summary":"Datasets you can read","tags":["datasets"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/datasets/{key}":{"get":{"operationId":"describe_dataset_rest","summary":"Columns and rules of a dataset","tags":["datasets"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","enum":["transactions","transactions_v","merchants","merchants_v","merchant_current_names","merchant_group_aliases","entity_mappings","entity_mappings_v","merchant_expected_volumes","merchant_expected_volumes_v","industry_labels","merchant_industry_sync_state","merchant_attribution_sync_log","settlement_stats","ingested_files","manual_uploads","analytics.transaction","analytics.client","analytics.client_link","analytics.exclusion","analytics.metric","analytics.revenue_daily","analytics.revenue_monthly","untracked_revenue","untracked_revenue_v","lending_interest","monthly_revenue_targets","exchange_rates","cash_balances","latest_cash_balances","merchant_ledger_entries","merchant_ledger_builds","merchant_balances_v","cabinet_invoices","cabinet_statement_states","v1_admin_invoices","ci_client_facts","ci_counterparty_monthly","ci_kyt_monthly","ci_market_daily","ci_touchpoints","ci_entity_aliases","ci_group_entities","client_status_daily","client_status_latest","client_status_config","client_dossier_daily","client_dossier_latest","client_intelligence_accounts","client_intelligence_cases","client_intelligence_evidence","client_intelligence_runs","client_intelligence_activity","client_intelligence_latest_evidence","client_intelligence_outcomes","client_intelligence_owners","client_intelligence_routes","client_type_map","client_type_links","client_record_merges","client_wallets","client_wallet_evidence","client_wallet_address_book","client_wallet_exclusions","client_wallet_flows","client_wallet_sumsub_checks","client_wallet_sumsub_fetch","client_wallet_scope","client_wallet_scope_names","client_wallet_sumsub_applicants","onchain_transfers","onchain_client_flows","client_onchain_daily","client_onchain_inflow_daily","onchain_targets","onchain_cursor","onchain_deposit_addresses","onchain_overchain_addresses","onchain_chain_state","onchain_fireblocks_checks","onchain_alerts_sent","onchain_client_coverage","counterparty_client_flows","counterparty_flow_totals","counterparty_client_baseline","counterparty_baseline_wallets","counterparty_labels","counterparty_labels_current","counterparty_label_candidates","counterparty_label_provider_state","counterparty_brand_aliases","counterparty_lp_addresses","client_top_counterparties","static_address_labels","arkham_address_intel","arkham_entities","arkham_entities_summary","arkham_responses","arkham_new_large_tx_queue","arkham_new_large_tx_state","market_vol_closes","market_vol_basket_daily","market_vol_basket_weekly","next_trade_scores","next_trade_runs","next_trade_latest","next_trade_outcomes","next_trade_daily_runs","next_trade_never_traded","next_trade_client_pricing","next_trade_call_log","next_trade_call_log_named","next_trade_wallets","next_trade_onchain_daily","next_trade_onchain_cursor","next_trade_input_compliance_days","next_trade_input_merchant_days","next_trade_input_merchant_state","next_trade_input_onchain_daily","next_trade_input_state","next_trade_input_tickets","next_trade_compliance_days","next_trade_merchant_days","next_trade_merchant_state","next_trade_tickets","sumsub_txn_compliance","transaction_compliance_v","transaction_compliance_search_v","transaction_compliance_link","sumsub_vasp","sumsub_applicants","sumsub_kyt_transactions","sumsub_compliance_sync_state","wallet_verification_cases","analytics.compliance","analytics.kyt_transaction","analytics.payer","retail_deposits","retail_clients","retail_clients_v","retail_client_beneficiaries","retail_client_documents","retail_client_events","retail_monitor_deposits","retail_monitor_onboardings","retail_monitor_state","retail_sync_state","analytics.retail_payment","analytics.retail_daily","hubspot_pipeline_cache","hubspot_pipeline_cache_v","analytics.pipeline_ticket","hubspot_pipeline_stages","hubspot_sync_log","pipeline_aliases","merchant_pipeline_notes","block_list","block_list_v","prescreen_runs","merchant_churn_monthly","merchant_churn_monthly_v","hs_partners","hs_partner_referrals","hs_partner_referrals_v","partner_client_mappings","partner_client_mappings_v","partners","partner_payouts","partner_statement_deliveries","partner_email_batches","partner_email_batch_items","partner_email_log","job_runs","cron_run_log","cron_http_requests","webhook_function_runs","fireblocks_alerts_sent","fireblocks_approval_nudges","fireblocks_approval_replies","fireblocks_approver_groups","fireblocks_approvers","fireblocks_tx_matches","fireblocks_webhook_debug","equals_webhook_events","equals_incidents","equals_batch_inspections","equals_recipients","equals_approval_nudges","equals_webhook_debug","reactions_added","reactions_missed","sprint_burndown_history","s3_archive_jobs","user_roles","profiles","access_allowlist","access_page_overrides","role_page_permissions","audit_log","api_access_grants","api_audit_log","api_tokens","audit_log_v","equals_batch_inspections_v","equals_incidents_v","equals_webhook_events_v","fireblocks_alerts_sent_v","fireblocks_tx_matches_v","merchant_pipeline_notes_v","partner_email_batch_items_v","partner_email_log_v","prescreen_runs_v","retail_deposits_v","retail_monitor_deposits_v","retail_monitor_onboardings_v","webhook_function_runs_v"]},"description":"Dataset key (list_datasets). Each key's area is in x-dataset-areas here and in the top-level x-datasets.","x-dataset-areas":{"transactions":"transactions","transactions_v":"transactions","merchants":"transactions","merchants_v":"transactions","merchant_current_names":"transactions","merchant_group_aliases":"transactions","entity_mappings":"transactions","entity_mappings_v":"transactions","merchant_expected_volumes":"transactions","merchant_expected_volumes_v":"transactions","industry_labels":"transactions","merchant_industry_sync_state":"transactions","merchant_attribution_sync_log":"transactions","settlement_stats":"transactions","ingested_files":"transactions","manual_uploads":"transactions","analytics.transaction":"transactions","analytics.client":"transactions","analytics.client_link":"transactions","analytics.exclusion":"transactions","analytics.metric":"transactions","analytics.revenue_daily":"revenue","analytics.revenue_monthly":"revenue","untracked_revenue":"revenue","untracked_revenue_v":"revenue","lending_interest":"revenue","monthly_revenue_targets":"revenue","exchange_rates":"rates","cash_balances":"treasury","latest_cash_balances":"treasury","merchant_ledger_entries":"merchant_balances","merchant_ledger_builds":"merchant_balances","merchant_balances_v":"merchant_balances","cabinet_invoices":"merchant_balances","cabinet_statement_states":"merchant_balances","v1_admin_invoices":"merchant_balances","ci_client_facts":"client_intelligence","ci_counterparty_monthly":"client_intelligence","ci_kyt_monthly":"client_intelligence","ci_market_daily":"client_intelligence","ci_touchpoints":"client_intelligence","ci_entity_aliases":"client_intelligence","ci_group_entities":"client_intelligence","client_status_daily":"client_intelligence","client_status_latest":"client_intelligence","client_status_config":"client_intelligence","client_dossier_daily":"client_intelligence","client_dossier_latest":"client_intelligence","client_intelligence_accounts":"client_intelligence","client_intelligence_cases":"client_intelligence","client_intelligence_evidence":"client_intelligence","client_intelligence_runs":"client_intelligence","client_intelligence_activity":"client_intelligence","client_intelligence_latest_evidence":"client_intelligence","client_intelligence_outcomes":"client_intelligence","client_intelligence_owners":"client_intelligence","client_intelligence_routes":"client_intelligence","client_type_map":"client_intelligence","client_type_links":"client_intelligence","client_record_merges":"client_intelligence","client_wallets":"client_intelligence","client_wallet_evidence":"client_intelligence","client_wallet_address_book":"client_intelligence","client_wallet_exclusions":"client_intelligence","client_wallet_flows":"client_intelligence","client_wallet_sumsub_checks":"client_intelligence","client_wallet_sumsub_fetch":"client_intelligence","client_wallet_scope":"client_intelligence","client_wallet_scope_names":"client_intelligence","client_wallet_sumsub_applicants":"client_intelligence","onchain_transfers":"client_intelligence","onchain_client_flows":"client_intelligence","client_onchain_daily":"client_intelligence","client_onchain_inflow_daily":"client_intelligence","onchain_targets":"client_intelligence","onchain_cursor":"client_intelligence","onchain_deposit_addresses":"client_intelligence","onchain_overchain_addresses":"client_intelligence","onchain_chain_state":"client_intelligence","onchain_fireblocks_checks":"client_intelligence","onchain_alerts_sent":"client_intelligence","onchain_client_coverage":"client_intelligence","counterparty_client_flows":"client_intelligence","counterparty_flow_totals":"client_intelligence","counterparty_client_baseline":"client_intelligence","counterparty_baseline_wallets":"client_intelligence","counterparty_labels":"client_intelligence","counterparty_labels_current":"client_intelligence","counterparty_label_candidates":"client_intelligence","counterparty_label_provider_state":"client_intelligence","counterparty_brand_aliases":"client_intelligence","counterparty_lp_addresses":"client_intelligence","client_top_counterparties":"client_intelligence","static_address_labels":"client_intelligence","arkham_address_intel":"client_intelligence","arkham_entities":"client_intelligence","arkham_entities_summary":"client_intelligence","arkham_responses":"client_intelligence","arkham_new_large_tx_queue":"client_intelligence","arkham_new_large_tx_state":"client_intelligence","market_vol_closes":"client_intelligence","market_vol_basket_daily":"client_intelligence","market_vol_basket_weekly":"client_intelligence","next_trade_scores":"client_intelligence","next_trade_runs":"client_intelligence","next_trade_latest":"client_intelligence","next_trade_outcomes":"client_intelligence","next_trade_daily_runs":"client_intelligence","next_trade_never_traded":"client_intelligence","next_trade_client_pricing":"client_intelligence","next_trade_call_log":"client_intelligence","next_trade_call_log_named":"client_intelligence","next_trade_wallets":"client_intelligence","next_trade_onchain_daily":"client_intelligence","next_trade_onchain_cursor":"client_intelligence","next_trade_input_compliance_days":"client_intelligence","next_trade_input_merchant_days":"client_intelligence","next_trade_input_merchant_state":"client_intelligence","next_trade_input_onchain_daily":"client_intelligence","next_trade_input_state":"client_intelligence","next_trade_input_tickets":"client_intelligence","next_trade_compliance_days":"client_intelligence","next_trade_merchant_days":"client_intelligence","next_trade_merchant_state":"client_intelligence","next_trade_tickets":"client_intelligence","sumsub_txn_compliance":"compliance","transaction_compliance_v":"compliance","transaction_compliance_search_v":"compliance","transaction_compliance_link":"compliance","sumsub_vasp":"compliance","sumsub_applicants":"compliance","sumsub_kyt_transactions":"compliance","sumsub_compliance_sync_state":"compliance","wallet_verification_cases":"compliance","analytics.compliance":"compliance","analytics.kyt_transaction":"compliance","analytics.payer":"compliance","retail_deposits":"retail","retail_clients":"retail","retail_clients_v":"retail","retail_client_beneficiaries":"retail","retail_client_documents":"retail","retail_client_events":"retail","retail_monitor_deposits":"retail","retail_monitor_onboardings":"retail","retail_monitor_state":"retail","retail_sync_state":"retail","analytics.retail_payment":"retail","analytics.retail_daily":"retail","hubspot_pipeline_cache":"pipeline","hubspot_pipeline_cache_v":"pipeline","analytics.pipeline_ticket":"pipeline","hubspot_pipeline_stages":"pipeline","hubspot_sync_log":"pipeline","pipeline_aliases":"pipeline","merchant_pipeline_notes":"pipeline","block_list":"pipeline","block_list_v":"pipeline","prescreen_runs":"pipeline","merchant_churn_monthly":"pipeline","merchant_churn_monthly_v":"pipeline","hs_partners":"partners","hs_partner_referrals":"partners","hs_partner_referrals_v":"partners","partner_client_mappings":"partners","partner_client_mappings_v":"partners","partners":"partners","partner_payouts":"partners","partner_statement_deliveries":"partners","partner_email_batches":"partners","partner_email_batch_items":"partners","partner_email_log":"partners","job_runs":"ops","cron_run_log":"ops","cron_http_requests":"ops","webhook_function_runs":"ops","fireblocks_alerts_sent":"ops","fireblocks_approval_nudges":"ops","fireblocks_approval_replies":"ops","fireblocks_approver_groups":"ops","fireblocks_approvers":"ops","fireblocks_tx_matches":"ops","fireblocks_webhook_debug":"ops","equals_webhook_events":"ops","equals_incidents":"ops","equals_batch_inspections":"ops","equals_recipients":"ops","equals_approval_nudges":"ops","equals_webhook_debug":"ops","reactions_added":"ops","reactions_missed":"ops","sprint_burndown_history":"ops","s3_archive_jobs":"ops","user_roles":"admin","profiles":"admin","access_allowlist":"admin","access_page_overrides":"admin","role_page_permissions":"admin","audit_log":"admin","api_access_grants":"admin","api_audit_log":"admin","api_tokens":"admin","audit_log_v":"admin","equals_batch_inspections_v":"ops","equals_incidents_v":"ops","equals_webhook_events_v":"ops","fireblocks_alerts_sent_v":"ops","fireblocks_tx_matches_v":"ops","merchant_pipeline_notes_v":"pipeline","partner_email_batch_items_v":"partners","partner_email_log_v":"partners","prescreen_runs_v":"pipeline","retail_deposits_v":"retail","retail_monitor_deposits_v":"retail","retail_monitor_onboardings_v":"retail","webhook_function_runs_v":"ops"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/datasets/{key}/query":{"post":{"operationId":"query_dataset_rest","summary":"Rows (filters, columns, sort, cursor paging; max 500 a page)","tags":["datasets"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","enum":["transactions","transactions_v","merchants","merchants_v","merchant_current_names","merchant_group_aliases","entity_mappings","entity_mappings_v","merchant_expected_volumes","merchant_expected_volumes_v","industry_labels","merchant_industry_sync_state","merchant_attribution_sync_log","settlement_stats","ingested_files","manual_uploads","analytics.transaction","analytics.client","analytics.client_link","analytics.exclusion","analytics.metric","analytics.revenue_daily","analytics.revenue_monthly","untracked_revenue","untracked_revenue_v","lending_interest","monthly_revenue_targets","exchange_rates","cash_balances","latest_cash_balances","merchant_ledger_entries","merchant_ledger_builds","merchant_balances_v","cabinet_invoices","cabinet_statement_states","v1_admin_invoices","ci_client_facts","ci_counterparty_monthly","ci_kyt_monthly","ci_market_daily","ci_touchpoints","ci_entity_aliases","ci_group_entities","client_status_daily","client_status_latest","client_status_config","client_dossier_daily","client_dossier_latest","client_intelligence_accounts","client_intelligence_cases","client_intelligence_evidence","client_intelligence_runs","client_intelligence_activity","client_intelligence_latest_evidence","client_intelligence_outcomes","client_intelligence_owners","client_intelligence_routes","client_type_map","client_type_links","client_record_merges","client_wallets","client_wallet_evidence","client_wallet_address_book","client_wallet_exclusions","client_wallet_flows","client_wallet_sumsub_checks","client_wallet_sumsub_fetch","client_wallet_scope","client_wallet_scope_names","client_wallet_sumsub_applicants","onchain_transfers","onchain_client_flows","client_onchain_daily","client_onchain_inflow_daily","onchain_targets","onchain_cursor","onchain_deposit_addresses","onchain_overchain_addresses","onchain_chain_state","onchain_fireblocks_checks","onchain_alerts_sent","onchain_client_coverage","counterparty_client_flows","counterparty_flow_totals","counterparty_client_baseline","counterparty_baseline_wallets","counterparty_labels","counterparty_labels_current","counterparty_label_candidates","counterparty_label_provider_state","counterparty_brand_aliases","counterparty_lp_addresses","client_top_counterparties","static_address_labels","arkham_address_intel","arkham_entities","arkham_entities_summary","arkham_responses","arkham_new_large_tx_queue","arkham_new_large_tx_state","market_vol_closes","market_vol_basket_daily","market_vol_basket_weekly","next_trade_scores","next_trade_runs","next_trade_latest","next_trade_outcomes","next_trade_daily_runs","next_trade_never_traded","next_trade_client_pricing","next_trade_call_log","next_trade_call_log_named","next_trade_wallets","next_trade_onchain_daily","next_trade_onchain_cursor","next_trade_input_compliance_days","next_trade_input_merchant_days","next_trade_input_merchant_state","next_trade_input_onchain_daily","next_trade_input_state","next_trade_input_tickets","next_trade_compliance_days","next_trade_merchant_days","next_trade_merchant_state","next_trade_tickets","sumsub_txn_compliance","transaction_compliance_v","transaction_compliance_search_v","transaction_compliance_link","sumsub_vasp","sumsub_applicants","sumsub_kyt_transactions","sumsub_compliance_sync_state","wallet_verification_cases","analytics.compliance","analytics.kyt_transaction","analytics.payer","retail_deposits","retail_clients","retail_clients_v","retail_client_beneficiaries","retail_client_documents","retail_client_events","retail_monitor_deposits","retail_monitor_onboardings","retail_monitor_state","retail_sync_state","analytics.retail_payment","analytics.retail_daily","hubspot_pipeline_cache","hubspot_pipeline_cache_v","analytics.pipeline_ticket","hubspot_pipeline_stages","hubspot_sync_log","pipeline_aliases","merchant_pipeline_notes","block_list","block_list_v","prescreen_runs","merchant_churn_monthly","merchant_churn_monthly_v","hs_partners","hs_partner_referrals","hs_partner_referrals_v","partner_client_mappings","partner_client_mappings_v","partners","partner_payouts","partner_statement_deliveries","partner_email_batches","partner_email_batch_items","partner_email_log","job_runs","cron_run_log","cron_http_requests","webhook_function_runs","fireblocks_alerts_sent","fireblocks_approval_nudges","fireblocks_approval_replies","fireblocks_approver_groups","fireblocks_approvers","fireblocks_tx_matches","fireblocks_webhook_debug","equals_webhook_events","equals_incidents","equals_batch_inspections","equals_recipients","equals_approval_nudges","equals_webhook_debug","reactions_added","reactions_missed","sprint_burndown_history","s3_archive_jobs","user_roles","profiles","access_allowlist","access_page_overrides","role_page_permissions","audit_log","api_access_grants","api_audit_log","api_tokens","audit_log_v","equals_batch_inspections_v","equals_incidents_v","equals_webhook_events_v","fireblocks_alerts_sent_v","fireblocks_tx_matches_v","merchant_pipeline_notes_v","partner_email_batch_items_v","partner_email_log_v","prescreen_runs_v","retail_deposits_v","retail_monitor_deposits_v","retail_monitor_onboardings_v","webhook_function_runs_v"]},"description":"Dataset key (list_datasets). Each key's area is in x-dataset-areas here and in the top-level x-datasets.","x-dataset-areas":{"transactions":"transactions","transactions_v":"transactions","merchants":"transactions","merchants_v":"transactions","merchant_current_names":"transactions","merchant_group_aliases":"transactions","entity_mappings":"transactions","entity_mappings_v":"transactions","merchant_expected_volumes":"transactions","merchant_expected_volumes_v":"transactions","industry_labels":"transactions","merchant_industry_sync_state":"transactions","merchant_attribution_sync_log":"transactions","settlement_stats":"transactions","ingested_files":"transactions","manual_uploads":"transactions","analytics.transaction":"transactions","analytics.client":"transactions","analytics.client_link":"transactions","analytics.exclusion":"transactions","analytics.metric":"transactions","analytics.revenue_daily":"revenue","analytics.revenue_monthly":"revenue","untracked_revenue":"revenue","untracked_revenue_v":"revenue","lending_interest":"revenue","monthly_revenue_targets":"revenue","exchange_rates":"rates","cash_balances":"treasury","latest_cash_balances":"treasury","merchant_ledger_entries":"merchant_balances","merchant_ledger_builds":"merchant_balances","merchant_balances_v":"merchant_balances","cabinet_invoices":"merchant_balances","cabinet_statement_states":"merchant_balances","v1_admin_invoices":"merchant_balances","ci_client_facts":"client_intelligence","ci_counterparty_monthly":"client_intelligence","ci_kyt_monthly":"client_intelligence","ci_market_daily":"client_intelligence","ci_touchpoints":"client_intelligence","ci_entity_aliases":"client_intelligence","ci_group_entities":"client_intelligence","client_status_daily":"client_intelligence","client_status_latest":"client_intelligence","client_status_config":"client_intelligence","client_dossier_daily":"client_intelligence","client_dossier_latest":"client_intelligence","client_intelligence_accounts":"client_intelligence","client_intelligence_cases":"client_intelligence","client_intelligence_evidence":"client_intelligence","client_intelligence_runs":"client_intelligence","client_intelligence_activity":"client_intelligence","client_intelligence_latest_evidence":"client_intelligence","client_intelligence_outcomes":"client_intelligence","client_intelligence_owners":"client_intelligence","client_intelligence_routes":"client_intelligence","client_type_map":"client_intelligence","client_type_links":"client_intelligence","client_record_merges":"client_intelligence","client_wallets":"client_intelligence","client_wallet_evidence":"client_intelligence","client_wallet_address_book":"client_intelligence","client_wallet_exclusions":"client_intelligence","client_wallet_flows":"client_intelligence","client_wallet_sumsub_checks":"client_intelligence","client_wallet_sumsub_fetch":"client_intelligence","client_wallet_scope":"client_intelligence","client_wallet_scope_names":"client_intelligence","client_wallet_sumsub_applicants":"client_intelligence","onchain_transfers":"client_intelligence","onchain_client_flows":"client_intelligence","client_onchain_daily":"client_intelligence","client_onchain_inflow_daily":"client_intelligence","onchain_targets":"client_intelligence","onchain_cursor":"client_intelligence","onchain_deposit_addresses":"client_intelligence","onchain_overchain_addresses":"client_intelligence","onchain_chain_state":"client_intelligence","onchain_fireblocks_checks":"client_intelligence","onchain_alerts_sent":"client_intelligence","onchain_client_coverage":"client_intelligence","counterparty_client_flows":"client_intelligence","counterparty_flow_totals":"client_intelligence","counterparty_client_baseline":"client_intelligence","counterparty_baseline_wallets":"client_intelligence","counterparty_labels":"client_intelligence","counterparty_labels_current":"client_intelligence","counterparty_label_candidates":"client_intelligence","counterparty_label_provider_state":"client_intelligence","counterparty_brand_aliases":"client_intelligence","counterparty_lp_addresses":"client_intelligence","client_top_counterparties":"client_intelligence","static_address_labels":"client_intelligence","arkham_address_intel":"client_intelligence","arkham_entities":"client_intelligence","arkham_entities_summary":"client_intelligence","arkham_responses":"client_intelligence","arkham_new_large_tx_queue":"client_intelligence","arkham_new_large_tx_state":"client_intelligence","market_vol_closes":"client_intelligence","market_vol_basket_daily":"client_intelligence","market_vol_basket_weekly":"client_intelligence","next_trade_scores":"client_intelligence","next_trade_runs":"client_intelligence","next_trade_latest":"client_intelligence","next_trade_outcomes":"client_intelligence","next_trade_daily_runs":"client_intelligence","next_trade_never_traded":"client_intelligence","next_trade_client_pricing":"client_intelligence","next_trade_call_log":"client_intelligence","next_trade_call_log_named":"client_intelligence","next_trade_wallets":"client_intelligence","next_trade_onchain_daily":"client_intelligence","next_trade_onchain_cursor":"client_intelligence","next_trade_input_compliance_days":"client_intelligence","next_trade_input_merchant_days":"client_intelligence","next_trade_input_merchant_state":"client_intelligence","next_trade_input_onchain_daily":"client_intelligence","next_trade_input_state":"client_intelligence","next_trade_input_tickets":"client_intelligence","next_trade_compliance_days":"client_intelligence","next_trade_merchant_days":"client_intelligence","next_trade_merchant_state":"client_intelligence","next_trade_tickets":"client_intelligence","sumsub_txn_compliance":"compliance","transaction_compliance_v":"compliance","transaction_compliance_search_v":"compliance","transaction_compliance_link":"compliance","sumsub_vasp":"compliance","sumsub_applicants":"compliance","sumsub_kyt_transactions":"compliance","sumsub_compliance_sync_state":"compliance","wallet_verification_cases":"compliance","analytics.compliance":"compliance","analytics.kyt_transaction":"compliance","analytics.payer":"compliance","retail_deposits":"retail","retail_clients":"retail","retail_clients_v":"retail","retail_client_beneficiaries":"retail","retail_client_documents":"retail","retail_client_events":"retail","retail_monitor_deposits":"retail","retail_monitor_onboardings":"retail","retail_monitor_state":"retail","retail_sync_state":"retail","analytics.retail_payment":"retail","analytics.retail_daily":"retail","hubspot_pipeline_cache":"pipeline","hubspot_pipeline_cache_v":"pipeline","analytics.pipeline_ticket":"pipeline","hubspot_pipeline_stages":"pipeline","hubspot_sync_log":"pipeline","pipeline_aliases":"pipeline","merchant_pipeline_notes":"pipeline","block_list":"pipeline","block_list_v":"pipeline","prescreen_runs":"pipeline","merchant_churn_monthly":"pipeline","merchant_churn_monthly_v":"pipeline","hs_partners":"partners","hs_partner_referrals":"partners","hs_partner_referrals_v":"partners","partner_client_mappings":"partners","partner_client_mappings_v":"partners","partners":"partners","partner_payouts":"partners","partner_statement_deliveries":"partners","partner_email_batches":"partners","partner_email_batch_items":"partners","partner_email_log":"partners","job_runs":"ops","cron_run_log":"ops","cron_http_requests":"ops","webhook_function_runs":"ops","fireblocks_alerts_sent":"ops","fireblocks_approval_nudges":"ops","fireblocks_approval_replies":"ops","fireblocks_approver_groups":"ops","fireblocks_approvers":"ops","fireblocks_tx_matches":"ops","fireblocks_webhook_debug":"ops","equals_webhook_events":"ops","equals_incidents":"ops","equals_batch_inspections":"ops","equals_recipients":"ops","equals_approval_nudges":"ops","equals_webhook_debug":"ops","reactions_added":"ops","reactions_missed":"ops","sprint_burndown_history":"ops","s3_archive_jobs":"ops","user_roles":"admin","profiles":"admin","access_allowlist":"admin","access_page_overrides":"admin","role_page_permissions":"admin","audit_log":"admin","api_access_grants":"admin","api_audit_log":"admin","api_tokens":"admin","audit_log_v":"admin","equals_batch_inspections_v":"ops","equals_incidents_v":"ops","equals_webhook_events_v":"ops","fireblocks_alerts_sent_v":"ops","fireblocks_tx_matches_v":"ops","merchant_pipeline_notes_v":"pipeline","partner_email_batch_items_v":"partners","partner_email_log_v":"partners","prescreen_runs_v":"pipeline","retail_deposits_v":"retail","retail_monitor_deposits_v":"retail","retail_monitor_onboardings_v":"retail","webhook_function_runs_v":"ops"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"columns":{"type":"array","items":{"type":"string"},"description":"Columns to return (default: all)."},"filters":{"type":"array","maxItems":20,"description":"Conditions, all must hold.","items":{"type":"object","required":["column","op"],"properties":{"column":{"type":"string"},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in","not_in","contains","starts_with","is_null","not_null"]},"value":{"description":"String, number or boolean; an array for in / not_in."}}}},"from":{"type":"string","description":"Inclusive start on the time column (YYYY-MM-DD or ISO timestamp)."},"to":{"type":"string","description":"Inclusive end; a date means the whole day."},"time_column":{"type":"string","description":"Date/timestamp column for from/to (default: the dataset's time column)."},"order_by":{"type":"array","maxItems":3,"items":{"type":"object","required":["column"],"properties":{"column":{"type":"string"},"direction":{"type":"string","enum":["asc","desc"]}}}},"limit":{"type":"integer","minimum":1,"maximum":500,"default":50},"cursor":{"type":"string","description":"next_cursor from the previous call (same query)."}}},"examples":{"example":{"value":{"columns":["transaction_id","merchant_name","transaction_type","status","total_fee_usd","trade_date_utc"],"filters":[{"column":"status","op":"in","value":["Done","Completed","Client Completed"]}],"from":"2026-09-01","to":"2026-09-30","order_by":[{"column":"total_fee_usd","direction":"desc"}],"limit":50}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/datasets/{key}/aggregate":{"post":{"operationId":"aggregate_dataset_rest","summary":"Grouped totals over all matching rows","tags":["datasets"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","enum":["transactions","transactions_v","merchants","merchants_v","merchant_current_names","merchant_group_aliases","entity_mappings","entity_mappings_v","merchant_expected_volumes","merchant_expected_volumes_v","industry_labels","merchant_industry_sync_state","merchant_attribution_sync_log","settlement_stats","ingested_files","manual_uploads","analytics.transaction","analytics.client","analytics.client_link","analytics.exclusion","analytics.metric","analytics.revenue_daily","analytics.revenue_monthly","untracked_revenue","untracked_revenue_v","lending_interest","monthly_revenue_targets","exchange_rates","cash_balances","latest_cash_balances","merchant_ledger_entries","merchant_ledger_builds","merchant_balances_v","cabinet_invoices","cabinet_statement_states","v1_admin_invoices","ci_client_facts","ci_counterparty_monthly","ci_kyt_monthly","ci_market_daily","ci_touchpoints","ci_entity_aliases","ci_group_entities","client_status_daily","client_status_latest","client_status_config","client_dossier_daily","client_dossier_latest","client_intelligence_accounts","client_intelligence_cases","client_intelligence_evidence","client_intelligence_runs","client_intelligence_activity","client_intelligence_latest_evidence","client_intelligence_outcomes","client_intelligence_owners","client_intelligence_routes","client_type_map","client_type_links","client_record_merges","client_wallets","client_wallet_evidence","client_wallet_address_book","client_wallet_exclusions","client_wallet_flows","client_wallet_sumsub_checks","client_wallet_sumsub_fetch","client_wallet_scope","client_wallet_scope_names","client_wallet_sumsub_applicants","onchain_transfers","onchain_client_flows","client_onchain_daily","client_onchain_inflow_daily","onchain_targets","onchain_cursor","onchain_deposit_addresses","onchain_overchain_addresses","onchain_chain_state","onchain_fireblocks_checks","onchain_alerts_sent","onchain_client_coverage","counterparty_client_flows","counterparty_flow_totals","counterparty_client_baseline","counterparty_baseline_wallets","counterparty_labels","counterparty_labels_current","counterparty_label_candidates","counterparty_label_provider_state","counterparty_brand_aliases","counterparty_lp_addresses","client_top_counterparties","static_address_labels","arkham_address_intel","arkham_entities","arkham_entities_summary","arkham_responses","arkham_new_large_tx_queue","arkham_new_large_tx_state","market_vol_closes","market_vol_basket_daily","market_vol_basket_weekly","next_trade_scores","next_trade_runs","next_trade_latest","next_trade_outcomes","next_trade_daily_runs","next_trade_never_traded","next_trade_client_pricing","next_trade_call_log","next_trade_call_log_named","next_trade_wallets","next_trade_onchain_daily","next_trade_onchain_cursor","next_trade_input_compliance_days","next_trade_input_merchant_days","next_trade_input_merchant_state","next_trade_input_onchain_daily","next_trade_input_state","next_trade_input_tickets","next_trade_compliance_days","next_trade_merchant_days","next_trade_merchant_state","next_trade_tickets","sumsub_txn_compliance","transaction_compliance_v","transaction_compliance_search_v","transaction_compliance_link","sumsub_vasp","sumsub_applicants","sumsub_kyt_transactions","sumsub_compliance_sync_state","wallet_verification_cases","analytics.compliance","analytics.kyt_transaction","analytics.payer","retail_deposits","retail_clients","retail_clients_v","retail_client_beneficiaries","retail_client_documents","retail_client_events","retail_monitor_deposits","retail_monitor_onboardings","retail_monitor_state","retail_sync_state","analytics.retail_payment","analytics.retail_daily","hubspot_pipeline_cache","hubspot_pipeline_cache_v","analytics.pipeline_ticket","hubspot_pipeline_stages","hubspot_sync_log","pipeline_aliases","merchant_pipeline_notes","block_list","block_list_v","prescreen_runs","merchant_churn_monthly","merchant_churn_monthly_v","hs_partners","hs_partner_referrals","hs_partner_referrals_v","partner_client_mappings","partner_client_mappings_v","partners","partner_payouts","partner_statement_deliveries","partner_email_batches","partner_email_batch_items","partner_email_log","job_runs","cron_run_log","cron_http_requests","webhook_function_runs","fireblocks_alerts_sent","fireblocks_approval_nudges","fireblocks_approval_replies","fireblocks_approver_groups","fireblocks_approvers","fireblocks_tx_matches","fireblocks_webhook_debug","equals_webhook_events","equals_incidents","equals_batch_inspections","equals_recipients","equals_approval_nudges","equals_webhook_debug","reactions_added","reactions_missed","sprint_burndown_history","s3_archive_jobs","user_roles","profiles","access_allowlist","access_page_overrides","role_page_permissions","audit_log","api_access_grants","api_audit_log","api_tokens","audit_log_v","equals_batch_inspections_v","equals_incidents_v","equals_webhook_events_v","fireblocks_alerts_sent_v","fireblocks_tx_matches_v","merchant_pipeline_notes_v","partner_email_batch_items_v","partner_email_log_v","prescreen_runs_v","retail_deposits_v","retail_monitor_deposits_v","retail_monitor_onboardings_v","webhook_function_runs_v"]},"description":"Dataset key (list_datasets). Each key's area is in x-dataset-areas here and in the top-level x-datasets.","x-dataset-areas":{"transactions":"transactions","transactions_v":"transactions","merchants":"transactions","merchants_v":"transactions","merchant_current_names":"transactions","merchant_group_aliases":"transactions","entity_mappings":"transactions","entity_mappings_v":"transactions","merchant_expected_volumes":"transactions","merchant_expected_volumes_v":"transactions","industry_labels":"transactions","merchant_industry_sync_state":"transactions","merchant_attribution_sync_log":"transactions","settlement_stats":"transactions","ingested_files":"transactions","manual_uploads":"transactions","analytics.transaction":"transactions","analytics.client":"transactions","analytics.client_link":"transactions","analytics.exclusion":"transactions","analytics.metric":"transactions","analytics.revenue_daily":"revenue","analytics.revenue_monthly":"revenue","untracked_revenue":"revenue","untracked_revenue_v":"revenue","lending_interest":"revenue","monthly_revenue_targets":"revenue","exchange_rates":"rates","cash_balances":"treasury","latest_cash_balances":"treasury","merchant_ledger_entries":"merchant_balances","merchant_ledger_builds":"merchant_balances","merchant_balances_v":"merchant_balances","cabinet_invoices":"merchant_balances","cabinet_statement_states":"merchant_balances","v1_admin_invoices":"merchant_balances","ci_client_facts":"client_intelligence","ci_counterparty_monthly":"client_intelligence","ci_kyt_monthly":"client_intelligence","ci_market_daily":"client_intelligence","ci_touchpoints":"client_intelligence","ci_entity_aliases":"client_intelligence","ci_group_entities":"client_intelligence","client_status_daily":"client_intelligence","client_status_latest":"client_intelligence","client_status_config":"client_intelligence","client_dossier_daily":"client_intelligence","client_dossier_latest":"client_intelligence","client_intelligence_accounts":"client_intelligence","client_intelligence_cases":"client_intelligence","client_intelligence_evidence":"client_intelligence","client_intelligence_runs":"client_intelligence","client_intelligence_activity":"client_intelligence","client_intelligence_latest_evidence":"client_intelligence","client_intelligence_outcomes":"client_intelligence","client_intelligence_owners":"client_intelligence","client_intelligence_routes":"client_intelligence","client_type_map":"client_intelligence","client_type_links":"client_intelligence","client_record_merges":"client_intelligence","client_wallets":"client_intelligence","client_wallet_evidence":"client_intelligence","client_wallet_address_book":"client_intelligence","client_wallet_exclusions":"client_intelligence","client_wallet_flows":"client_intelligence","client_wallet_sumsub_checks":"client_intelligence","client_wallet_sumsub_fetch":"client_intelligence","client_wallet_scope":"client_intelligence","client_wallet_scope_names":"client_intelligence","client_wallet_sumsub_applicants":"client_intelligence","onchain_transfers":"client_intelligence","onchain_client_flows":"client_intelligence","client_onchain_daily":"client_intelligence","client_onchain_inflow_daily":"client_intelligence","onchain_targets":"client_intelligence","onchain_cursor":"client_intelligence","onchain_deposit_addresses":"client_intelligence","onchain_overchain_addresses":"client_intelligence","onchain_chain_state":"client_intelligence","onchain_fireblocks_checks":"client_intelligence","onchain_alerts_sent":"client_intelligence","onchain_client_coverage":"client_intelligence","counterparty_client_flows":"client_intelligence","counterparty_flow_totals":"client_intelligence","counterparty_client_baseline":"client_intelligence","counterparty_baseline_wallets":"client_intelligence","counterparty_labels":"client_intelligence","counterparty_labels_current":"client_intelligence","counterparty_label_candidates":"client_intelligence","counterparty_label_provider_state":"client_intelligence","counterparty_brand_aliases":"client_intelligence","counterparty_lp_addresses":"client_intelligence","client_top_counterparties":"client_intelligence","static_address_labels":"client_intelligence","arkham_address_intel":"client_intelligence","arkham_entities":"client_intelligence","arkham_entities_summary":"client_intelligence","arkham_responses":"client_intelligence","arkham_new_large_tx_queue":"client_intelligence","arkham_new_large_tx_state":"client_intelligence","market_vol_closes":"client_intelligence","market_vol_basket_daily":"client_intelligence","market_vol_basket_weekly":"client_intelligence","next_trade_scores":"client_intelligence","next_trade_runs":"client_intelligence","next_trade_latest":"client_intelligence","next_trade_outcomes":"client_intelligence","next_trade_daily_runs":"client_intelligence","next_trade_never_traded":"client_intelligence","next_trade_client_pricing":"client_intelligence","next_trade_call_log":"client_intelligence","next_trade_call_log_named":"client_intelligence","next_trade_wallets":"client_intelligence","next_trade_onchain_daily":"client_intelligence","next_trade_onchain_cursor":"client_intelligence","next_trade_input_compliance_days":"client_intelligence","next_trade_input_merchant_days":"client_intelligence","next_trade_input_merchant_state":"client_intelligence","next_trade_input_onchain_daily":"client_intelligence","next_trade_input_state":"client_intelligence","next_trade_input_tickets":"client_intelligence","next_trade_compliance_days":"client_intelligence","next_trade_merchant_days":"client_intelligence","next_trade_merchant_state":"client_intelligence","next_trade_tickets":"client_intelligence","sumsub_txn_compliance":"compliance","transaction_compliance_v":"compliance","transaction_compliance_search_v":"compliance","transaction_compliance_link":"compliance","sumsub_vasp":"compliance","sumsub_applicants":"compliance","sumsub_kyt_transactions":"compliance","sumsub_compliance_sync_state":"compliance","wallet_verification_cases":"compliance","analytics.compliance":"compliance","analytics.kyt_transaction":"compliance","analytics.payer":"compliance","retail_deposits":"retail","retail_clients":"retail","retail_clients_v":"retail","retail_client_beneficiaries":"retail","retail_client_documents":"retail","retail_client_events":"retail","retail_monitor_deposits":"retail","retail_monitor_onboardings":"retail","retail_monitor_state":"retail","retail_sync_state":"retail","analytics.retail_payment":"retail","analytics.retail_daily":"retail","hubspot_pipeline_cache":"pipeline","hubspot_pipeline_cache_v":"pipeline","analytics.pipeline_ticket":"pipeline","hubspot_pipeline_stages":"pipeline","hubspot_sync_log":"pipeline","pipeline_aliases":"pipeline","merchant_pipeline_notes":"pipeline","block_list":"pipeline","block_list_v":"pipeline","prescreen_runs":"pipeline","merchant_churn_monthly":"pipeline","merchant_churn_monthly_v":"pipeline","hs_partners":"partners","hs_partner_referrals":"partners","hs_partner_referrals_v":"partners","partner_client_mappings":"partners","partner_client_mappings_v":"partners","partners":"partners","partner_payouts":"partners","partner_statement_deliveries":"partners","partner_email_batches":"partners","partner_email_batch_items":"partners","partner_email_log":"partners","job_runs":"ops","cron_run_log":"ops","cron_http_requests":"ops","webhook_function_runs":"ops","fireblocks_alerts_sent":"ops","fireblocks_approval_nudges":"ops","fireblocks_approval_replies":"ops","fireblocks_approver_groups":"ops","fireblocks_approvers":"ops","fireblocks_tx_matches":"ops","fireblocks_webhook_debug":"ops","equals_webhook_events":"ops","equals_incidents":"ops","equals_batch_inspections":"ops","equals_recipients":"ops","equals_approval_nudges":"ops","equals_webhook_debug":"ops","reactions_added":"ops","reactions_missed":"ops","sprint_burndown_history":"ops","s3_archive_jobs":"ops","user_roles":"admin","profiles":"admin","access_allowlist":"admin","access_page_overrides":"admin","role_page_permissions":"admin","audit_log":"admin","api_access_grants":"admin","api_audit_log":"admin","api_tokens":"admin","audit_log_v":"admin","equals_batch_inspections_v":"ops","equals_incidents_v":"ops","equals_webhook_events_v":"ops","fireblocks_alerts_sent_v":"ops","fireblocks_tx_matches_v":"ops","merchant_pipeline_notes_v":"pipeline","partner_email_batch_items_v":"partners","partner_email_log_v":"partners","prescreen_runs_v":"pipeline","retail_deposits_v":"retail","retail_monitor_deposits_v":"retail","retail_monitor_onboardings_v":"retail","webhook_function_runs_v":"ops"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["metrics"],"properties":{"group_by":{"type":"array","maxItems":3,"items":{"anyOf":[{"type":"string"},{"type":"object","required":["column"],"properties":{"column":{"type":"string"},"bucket":{"type":"string","enum":["day","week","month","quarter","year"]}}}]}},"metrics":{"type":"array","minItems":1,"maxItems":8,"items":{"type":"object","required":["fn"],"properties":{"fn":{"type":"string","enum":["count","count_distinct","sum","avg","min","max"]},"column":{"type":"string","description":"Omit for count(*)."}}}},"filters":{"type":"array","maxItems":20,"description":"Conditions, all must hold.","items":{"type":"object","required":["column","op"],"properties":{"column":{"type":"string"},"op":{"type":"string","enum":["eq","neq","gt","gte","lt","lte","in","not_in","contains","starts_with","is_null","not_null"]},"value":{"description":"String, number or boolean; an array for in / not_in."}}}},"from":{"type":"string"},"to":{"type":"string"},"time_column":{"type":"string"},"order_by":{"type":"string","description":"A group or metric name (e.g. sum_volume_usd). Default: first metric, largest first; date buckets in date order."},"direction":{"type":"string","enum":["asc","desc"]},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/openapi.json":{"get":{"operationId":"openapi","summary":"This document","tags":["general"],"security":[],"responses":{"200":{"description":"OpenAPI 3.1"}}}},"/ip":{"get":{"operationId":"ip_seen","summary":"The client IP this API sees (for building allowlists)","tags":["general"],"security":[],"responses":{"200":{"description":"ip_seen plus the forwarding headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpSeen"}}}}}}},"/v1/ip":{"get":{"operationId":"ip_seen_v1","summary":"Same as /ip","tags":["general"],"security":[],"responses":{"200":{"description":"ip_seen plus the forwarding headers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpSeen"}}}}}}},"/mcp":{"post":{"operationId":"mcp","summary":"MCP Streamable HTTP endpoint (JSON-RPC 2.0)","description":"Model Context Protocol, stateless, JSON responses (no SSE), protocol 2025-03-26 to 2025-11-25. Same tools, limits and audit as REST. 401 with WWW-Authenticate resource_metadata starts OAuth.","tags":["general"],"security":[{"apiKey":[]},{"oauth2":["dashboard:read"]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"JSON-RPC 2.0 request (initialize, tools/list, tools/call, resources/list, resources/read…)"}}}},"responses":{"200":{"description":"JSON-RPC response"},"202":{"description":"Notification accepted"},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"GET/DELETE: no SSE stream on this stateless server"}}}},"/.well-known/oauth-protected-resource":{"get":{"operationId":"protected_resource_metadata","summary":"RFC 9728 protected resource metadata","tags":["oauth"],"security":[],"responses":{"200":{"description":"OK"}}}},"/.well-known/oauth-authorization-server":{"get":{"operationId":"as_metadata","summary":"RFC 8414 authorization server metadata (also at /.well-known/openid-configuration)","tags":["oauth"],"security":[],"responses":{"200":{"description":"OK"}}}},"/oauth/register":{"post":{"operationId":"oauth_register","summary":"Dynamic client registration (RFC 7591), public clients","tags":["oauth"],"security":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["redirect_uris"],"properties":{"client_name":{"type":"string"},"redirect_uris":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"201":{"description":"Registered"},"400":{"description":"invalid_redirect_uri / invalid_client_metadata"}}}},"/oauth/authorize":{"get":{"operationId":"oauth_authorize","summary":"Authorization endpoint (code + PKCE S256). Redirects to the dashboard consent page.","tags":["oauth"],"security":[],"parameters":[{"name":"response_type","in":"query","required":true,"schema":{"type":"string"}},{"name":"client_id","in":"query","required":true,"schema":{"type":"string"}},{"name":"redirect_uri","in":"query","required":false,"schema":{"type":"string"}},{"name":"code_challenge","in":"query","required":true,"schema":{"type":"string"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string"}},{"name":"state","in":"query","required":false,"schema":{"type":"string"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string"}},{"name":"resource","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"302":{"description":"To the consent page, or back to the client with an error"}}}},"/oauth/token":{"post":{"operationId":"oauth_token","summary":"Token endpoint: authorization_code (PKCE) and refresh_token (rotating)","tags":["oauth"],"security":[],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"grant_type":{"type":"string","enum":["authorization_code","refresh_token"]},"code":{"type":"string"},"code_verifier":{"type":"string"},"redirect_uri":{"type":"string"},"client_id":{"type":"string"},"refresh_token":{"type":"string"},"resource":{"type":"string"}}}}}},"responses":{"200":{"description":"access_token (1 h), refresh_token (30 d, rotated)"},"400":{"description":"invalid_grant / unsupported_grant_type / invalid_target"}}}},"/oauth/revoke":{"post":{"operationId":"oauth_revoke","summary":"Token revocation (RFC 7009); revokes the whole grant","tags":["oauth"],"security":[],"responses":{"200":{"description":"OK"}}}},"/account/me":{"get":{"operationId":"account_me","summary":"Your API access, keys, connector grants, presets and endpoints","tags":["account"],"security":[{"dashboardSession":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/datasets":{"get":{"operationId":"account_datasets","summary":"Every dataset with its area and whether you can read it through the API","tags":["account"],"security":[{"dashboardSession":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDatasets"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/keys":{"get":{"operationId":"list_keys","summary":"Your active API keys (owner: ?all=true for everyone's)","tags":["account"],"security":[{"dashboardSession":[]}],"parameters":[{"name":"all","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}}}}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_key","summary":"Create an API key. The raw key is in this response only.","tags":["account"],"security":[{"dashboardSession":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"expires_days":{"type":["integer","null"],"minimum":1,"maximum":730,"description":"null = no expiry. Default 90."},"ip_allowlist":{"type":"array","items":{"type":"string"},"description":"Optional IPv4/IPv6 addresses or CIDR ranges. Empty (and no presets) = any IP."},"ip_presets":{"type":"array","items":{"type":"string"},"description":"Optional preset names from GET /account/ip-presets (e.g. claude_ai, chatgpt)."}}},"examples":{"example":{"value":{"name":"Claude Code on my laptop","expires_days":90,"ip_allowlist":["203.0.113.7"]}}}}}},"responses":{"201":{"description":"Created; includes key (shown once)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreated"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/keys/{id}/revoke":{"post":{"operationId":"revoke_key","summary":"Revoke a key (yours; owner: anyone's)","tags":["account"],"security":[{"dashboardSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Revoked"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/keys/{id}/allowlist":{"put":{"operationId":"set_key_allowlist","summary":"Replace a key's IP allowlist (empty = any IP)","tags":["account"],"security":[{"dashboardSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ip_allowlist":{"type":"array","items":{"type":"string"},"description":"Optional IPv4/IPv6 addresses or CIDR ranges. Empty (and no presets) = any IP."},"ip_presets":{"type":"array","items":{"type":"string"},"description":"Optional preset names from GET /account/ip-presets (e.g. claude_ai, chatgpt)."}}}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllowlistResult"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/connections":{"get":{"operationId":"list_connections","summary":"Your connector grants (Claude, ChatGPT…); owner: ?all=true","tags":["account"],"security":[{"dashboardSession":[]}],"parameters":[{"name":"all","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Connections"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/connections/{id}/allowlist":{"put":{"operationId":"set_connection_allowlist","summary":"Attach an IP allowlist to a connector grant (presets: claude_ai, chatgpt)","tags":["account"],"security":[{"dashboardSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"ip_allowlist":{"type":"array","items":{"type":"string"},"description":"Optional IPv4/IPv6 addresses or CIDR ranges. Empty (and no presets) = any IP."},"ip_presets":{"type":"array","items":{"type":"string"},"description":"Optional preset names from GET /account/ip-presets (e.g. claude_ai, chatgpt)."}}},"examples":{"claude":{"value":{"ip_presets":["claude_ai"]}}}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllowlistResult"}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/connections/{id}/revoke":{"post":{"operationId":"revoke_connection","summary":"Disconnect an app (revokes the grant)","tags":["account"],"security":[{"dashboardSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Revoked"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/ip-presets":{"get":{"operationId":"ip_presets","summary":"IP allowlist presets and where their ranges come from","tags":["account"],"security":[{"dashboardSession":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpPresets"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/playground":{"post":{"operationId":"playground","summary":"Run a tool, or GET /v1/tools or /v1/ip, as one of your keys (by key_id, never the raw key), under that key's access, name redaction and IP allowlist checked against your browser's IP. Tool calls are logged as playground calls.","tags":["account"],"security":[{"dashboardSession":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["key_id"],"description":"Either tool (+ arguments) or path.","properties":{"key_id":{"type":"string","format":"uuid"},"tool":{"type":"string","enum":["whoami","get_definitions","search","fetch","list_datasets","describe_dataset","query_dataset","aggregate_dataset","revenue_summary","metrics","exchange_rates","list_clients","get_client","client_counterparties","client_wallets","get_counterparty","address_lookup","cash_balances","merchant_balances","merchant_ledger","get_transaction","compliance_lookup","retail_summary","ops_health","list_users"]},"arguments":{"type":"object"},"path":{"type":"string","enum":["/v1/tools","/v1/ip"],"description":"Instead of tool: run this key-scoped GET."}}},"examples":{"example":{"value":{"key_id":"00000000-0000-4000-8000-000000000000","tool":"revenue_summary","arguments":{"from":"2026-09-01","to":"2026-09-30","group_by":"client","tz":"utc"}}},"tools":{"value":{"key_id":"00000000-0000-4000-8000-000000000000","path":"/v1/tools"}}}}}},"responses":{"200":{"description":"The tool's envelope (or ToolList / IpSeen for path)","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Envelope"},{"$ref":"#/components/schemas/ToolList"},{"$ref":"#/components/schemas/IpSeen"}]}}}},"400":{"description":"Invalid input (error: invalid_input, filter_required, invalid_cursor, ambiguous, too_large). The message says how to fix it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid, expired or revoked token. WWW-Authenticate points at the protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool, dataset or record (not_found, unknown_tool, unknown_dataset).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (rate_limited): 60 calls a minute and 1,000 an hour per user. retry_after_seconds is in the body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"The query ran past its time limit (timeout: 8 s per statement, 20 s for slow views). Narrow the filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/admin/users":{"get":{"operationId":"admin_users","summary":"Owner: everyone's dashboard default and effective API access","tags":["account"],"security":[{"dashboardSession":[]}],"responses":{"200":{"description":"OK"},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/admin/grant":{"post":{"operationId":"admin_grant","summary":"Owner: set or clear a user's API access override","tags":["account"],"security":[{"dashboardSession":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["user_id"],"properties":{"user_id":{"type":"string","format":"uuid"},"clear":{"type":"boolean"},"enabled":{"type":"boolean"},"api_role":{"type":["string","null"],"enum":["admin","finance","partnerships","viewer",null]},"areas":{"type":["array","null"],"items":{"type":"string","enum":["transactions","revenue","rates","treasury","merchant_balances","client_intelligence","compliance","retail","pipeline","partners","ops"]}},"client_names":{"type":["boolean","null"]},"note":{"type":"string"}}}}}},"responses":{"200":{"description":"Effective access after the change"},"403":{"description":"Forbidden: the area is not in your API access (forbidden), the account has no API access, or the request IP is outside the key's allowlist (ip_not_allowed; the message names the IP seen).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"ocd_pat_...","description":"API key created in the dashboard. Optional IP allowlist; requests from other IPs get 403 ip_not_allowed."},"oauth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://mcp.overchain-live.co.uk/oauth/authorize","tokenUrl":"https://mcp.overchain-live.co.uk/oauth/token","refreshUrl":"https://mcp.overchain-live.co.uk/oauth/token","scopes":{"dashboard:read":"Read dashboard data within your API access"}}}},"dashboardSession":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"The dashboard's Supabase session (Microsoft staff sign-in). For /account/* only."}},"schemas":{"Envelope":{"type":"object","required":["tool","as_of","data"],"properties":{"tool":{"type":"string"},"as_of":{"type":"string","format":"date-time","description":"When the API answered"},"data_as_of":{"type":["string","null"],"description":"When the source data was last refreshed"},"freshness":{"type":["string","null"]},"timezone":{"type":"string"},"units":{"type":"object","additionalProperties":{"type":"string"}},"filters_applied":{"type":"array","items":{"type":"string"}},"row_count":{"type":"integer"},"total_count":{"type":["integer","null"],"description":"All matching rows (null = unknown)"},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"],"description":"Opaque; pass back unchanged with the same query"},"totals":{"description":"Server-side totals over ALL matching rows"},"data":{},"notes":{"type":"array","items":{"type":"string"}},"dashboard_url":{"type":["string","null"]}}},"Error":{"type":"object","properties":{"error":{"type":"string","enum":["invalid_input","filter_required","invalid_cursor","ambiguous","too_large","unauthorized","invalid_token","forbidden","ip_not_allowed","not_found","unknown_tool","unknown_dataset","rate_limited","timeout","maintenance","internal"]},"message":{"type":"string"}}},"SearchResult":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"}}}}}},"FetchResult":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"text":{"type":"string"},"url":{"type":"string"},"metadata":{"type":"object"}}},"Key":{"type":"object","required":["id","name","prefix","created_at"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"prefix":{"type":"string","description":"First 12 characters of the key, for recognising it"},"created_at":{"type":"string","format":"date-time"},"expires_at":{"type":["string","null"],"description":"null = no expiry"},"last_used_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"],"description":"Always null in lists (only active keys are listed)"},"ip_allowlist":{"type":"array","items":{"type":"string"}},"ip_presets":{"type":"array","items":{"type":"string"}},"user_id":{"type":"string","format":"uuid","description":"Owner view (?all=true) only"},"email":{"type":"string","description":"Owner view (?all=true) only"}}},"KeyCreated":{"allOf":[{"$ref":"#/components/schemas/Key"},{"type":"object","required":["key"],"properties":{"key":{"type":"string","description":"The raw key (ocd_pat_...). Shown once; only its SHA-256 hash is stored."},"note":{"type":"string"}}}]},"Revoked":{"type":"object","required":["revoked"],"properties":{"revoked":{"type":"boolean","const":true}}},"AllowlistResult":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"ip_allowlist":{"type":"array","items":{"type":"string"}},"ip_presets":{"type":"array","items":{"type":"string"}},"any_ip":{"type":"boolean","description":"True when no allowlist is set (any IP accepted)"}}},"Connection":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Use with /account/connections/{id}/revoke and /allowlist"},"family_id":{"type":"string","format":"uuid"},"client":{"type":"string","description":"App name (e.g. Claude, ChatGPT)"},"client_id":{"type":"string"},"connected_at":{"type":"string","format":"date-time"},"expires_at":{"type":"string"},"last_used_at":{"type":["string","null"]},"ip_allowlist":{"type":"array","items":{"type":"string"}},"ip_presets":{"type":"array","items":{"type":"string"}},"user_id":{"type":"string","description":"Owner view only"},"email":{"type":"string","description":"Owner view only"}}},"Connections":{"type":"object","properties":{"connections":{"type":"array","items":{"$ref":"#/components/schemas/Connection"}}}},"IpPreset":{"type":"object","properties":{"name":{"type":"string"},"label":{"type":"string"},"ranges":{"type":"integer"},"cidrs":{"type":"array","items":{"type":"string"}},"source_url":{"type":["string","null"]},"auto_refresh":{"type":"boolean"},"source_created_at":{"type":["string","null"]},"refreshed_at":{"type":["string","null"]}}},"IpPresets":{"type":"object","properties":{"presets":{"type":"array","items":{"$ref":"#/components/schemas/IpPreset"}}}},"IpSeen":{"type":"object","properties":{"ip_seen":{"type":["string","null"]},"headers":{"type":"object","additionalProperties":{"type":["string","null"]}}}},"ToolList":{"type":"object","properties":{"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"title":{"type":"string"},"area":{"type":["string","null"]},"description":{"type":"string"},"input_schema":{"type":"object"},"call":{"type":"string"}}}},"instructions":{"type":"string"}}},"Access":{"type":"object","properties":{"allowed":{"type":"boolean"},"level":{"type":"string"},"source":{"type":"string"},"override_used":{"type":"boolean"},"denied_reason":{"type":["string","null"]},"areas":{"type":"array","items":{"type":"string","enum":["transactions","revenue","rates","treasury","merchant_balances","client_intelligence","compliance","retail","pipeline","partners","ops","admin"]}},"client_names":{"type":"boolean","description":"false = client names are pseudonyms"}}},"Me":{"type":"object","properties":{"email":{"type":["string","null"]},"ip_seen":{"type":["string","null"]},"access":{"$ref":"#/components/schemas/Access"},"override":{"type":["object","null"],"description":"The owner's override for you, if any"},"areas":{"type":"array","items":{"type":"object","properties":{"area":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"pages":{"type":"string"}}}},"keys":{"type":"array","items":{"$ref":"#/components/schemas/Key"}},"connections":{"type":"array","items":{"$ref":"#/components/schemas/Connection"}},"ip_presets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"label":{"type":"string"},"ranges":{"type":"integer"},"source_url":{"type":["string","null"]},"refreshed_at":{"type":["string","null"]}}}},"endpoints":{"type":"object","properties":{"mcp":{"type":"string","description":"Public MCP URL (e.g. https://mcp.overchain-live.co.uk/mcp)"},"rest":{"type":"string"},"openapi":{"type":"string"},"docs":{"type":"string"},"readme":{"type":"string"},"direct":{"type":"object","description":"The Supabase function URLs (same API; fallback)","properties":{"mcp":{"type":"string"},"rest":{"type":"string"},"openapi":{"type":"string"}}}}}}},"AccountDatasets":{"type":"object","properties":{"access":{"type":"object","properties":{"allowed":{"type":"boolean"},"level":{"type":"string"},"areas":{"type":"array","items":{"type":"string"}},"client_names":{"type":"boolean"}}},"areas":{"type":"array","items":{"type":"object","properties":{"area":{"type":"string"},"label":{"type":"string"},"readable":{"type":"boolean"}}}},"datasets":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"area":{"type":"string"},"area_label":{"type":"string"},"summary":{"type":"string"},"readable":{"type":"boolean"}}}}}}}}}