# Anticapture API Docs > Anticapture DAO governance analytics: REST API reference, MCP server, and webhook notifications - [Anticapture API Docs](/index.md) ## search - [Search the documentation](/search.md) ## api-reference - [Get account balance](/api-reference/account-balance-by-account-id.md): Returns account balance information for a specific address - [Get variations in account balances for a given period](/api-reference/account-balance-variations.md): Returns the largest account balance variations, keyed by account address - [Get changes in balance for a given period for a single account](/api-reference/account-balance-variations-by-account-id.md): Returns the changes to balance by period and account ID - [Get account balance records](/api-reference/account-balances.md): Returns sorted and paginated account balance records - [Get top interactions between accounts for a given period](/api-reference/account-interactions.md): Returns a mapping of the largest interactions between accounts. - [Anticapture REST API](/api-reference/anticapture-rest-api.md): REST API for Anticapture's DAO governance analytics: proposals, votes, voting power, delegations, token and treasury data, indexed from onchain and offchain sources. - [Average delegation percentage across all DAOs](/api-reference/average-delegation-percentage.md): Returns the delegated-supply percentage averaged across all configured DAOs, bucketed by day over the requested period. - [Compare active token supply between time periods](/api-reference/compare-active-supply.md): Returns the active token supply (supply held by accounts that participated in governance) for the given period. - [Compare average turnout between time periods](/api-reference/compare-average-turnout.md): Returns the average proposal turnout in the current period versus the previous one, with the change rate and raw delta. - [Compare cex supply between periods](/api-reference/compare-cex-supply.md): Returns the cex supply for the current period versus the previous one, with the change rate and raw delta. - [Compare circulating supply between periods](/api-reference/compare-circulating-supply.md): Returns the circulating supply for the current period versus the previous one, with the change rate and raw delta. - [Compare delegated supply between periods](/api-reference/compare-delegated-supply.md): Returns the delegated supply for the current period versus the previous one, with the change rate and raw delta. - [Compare dex supply between periods](/api-reference/compare-dex-supply.md): Returns the dex supply for the current period versus the previous one, with the change rate and raw delta. - [Compare lending supply between periods](/api-reference/compare-lending-supply.md): Returns the lending supply for the current period versus the previous one, with the change rate and raw delta. - [Compare number of proposals between time periods](/api-reference/compare-proposals.md): Returns the number of proposals launched in the current period versus the previous one, with the change rate and raw delta. - [Compare total supply between periods](/api-reference/compare-total-supply.md): Returns the total supply for the current period versus the previous one, with the change rate and raw delta. - [Compare treasury between periods](/api-reference/compare-treasury.md): Returns the treasury for the current period versus the previous one, with the change rate and raw delta. - [Compare number of votes between time periods](/api-reference/compare-votes.md): Returns the number of votes cast in the current period versus the previous one, with the change rate and raw delta. - [Create a draft proposal](/api-reference/create-draft-proposal.md): Create a draft proposal - [Get DAO governance parameters](/api-reference/dao.md): Returns current governance parameters for this DAO - [List of all configured DAOs](/api-reference/daos.md): Returns every DAO configured on the gateway along with its governance parameters and supported capabilities. - [Get delegation percentage day buckets with forward-fill](/api-reference/delegation-percentage-by-day.md): Returns the delegated-supply percentage bucketed by day, forward-filling days without new data with the last known value. - [Get delegations](/api-reference/delegations.md): Get current delegations for an account - [Get delegators](/api-reference/delegators.md): Get current delegators of an account with voting power - [Delete a draft proposal](/api-reference/delete-draft-proposal.md): Only the original author (matched by address) can delete a draft. - [Get feed events](/api-reference/feed-events.md): Returns a paginated list of governance feed events, optionally filtered by type and relevance. - [Gateway health and upstream dependency states](/api-reference/gateway-health.md): Returns 200 only when every configured DAO API, relayer, address enrichment, and token service upstream responds to /health. - [Get enriched data for an address](/api-reference/get-address.md): Returns label information from Arkham, ENS data, and whether the address is an EOA or contract. Arkham data is stored permanently. ENS data is cached with a configurable TTL. - [Get enriched data for multiple addresses](/api-reference/get-addresses.md): Returns label information from Arkham, ENS data, and address type for multiple addresses. Maximum 100 addresses per request. Arkham data is stored permanently. ENS data is cached with a configurable TTL. - [Get DAO token treasury data](/api-reference/get-dao-token-treasury.md): Get historical DAO Token Treasury value (governance token quantity × token price) - [Get a draft proposal by ID](/api-reference/get-draft-proposal.md): Public endpoint — anyone with the ID can view the draft, enabling sharing. - [List draft proposals for an address](/api-reference/get-draft-proposals.md): List draft proposals for an address - [Get event relevance threshold](/api-reference/get-event-relevance-threshold.md): Returns the minimum value at which a feed event of the given type qualifies for the requested relevance level. - [GET /{dao}/health](/api-reference/get-health.md): GET /{dao}/health - [Get liquid treasury data](/api-reference/get-liquid-treasury.md): Get historical Liquid Treasury (treasury without DAO tokens) from external providers (DefiLlama/Dune) - [Get monthly ENS action counts by category](/api-reference/get-revenue-actions.md): Monthly action counts by category (Registration, Renewal, Premium). - [Get monthly net change and cumulative active .eth names](/api-reference/get-revenue-active-names.md): Monthly net change and cumulative count of active .eth names. - [Get monthly ENS revenue split by category (Steakhouse ledger)](/api-reference/get-revenue-by-category.md): Monthly ENS revenue split by category (Registration vs Renewal) in USD and ETH, sourced from the Steakhouse accounting ledger. - [Get monthly new-wallet counts and cumulative wallet total](/api-reference/get-revenue-new-wallets.md): Monthly new-wallet counts and the cumulative wallet total for ENS. - [Get monthly renewal funnel keyed by expiry month](/api-reference/get-revenue-renewal-funnel.md): Renewal funnel per expiry month: terms expiring, renewed, churned, and renewal rate. - [Get monthly renewal tenure distribution per expiry month](/api-reference/get-revenue-renewal-tenure.md): Per expiry month, count of names in each tenure bucket (0/1/2/3+ renewals) and the total renewals in that bucket. - [Get monthly ENS revenue totals in USD and ETH](/api-reference/get-revenue-totals.md): Monthly ENS revenue totals split into registration, premium, and renewal, in both USD and ETH. - [Get total treasury data](/api-reference/get-total-treasury.md): Get historical Total Treasury (liquid treasury + DAO token treasury) - [Get historical token balances](/api-reference/historical-balances.md): Returns historical balance deltas for one account, enriched with the transfer that caused each change. - [Get historical delegations](/api-reference/historical-delegations.md): Get historical delegations for an account, with optional filtering and sorting - [Get historical token data](/api-reference/historical-token-data.md): Get historical market data for a specific token - [Get voting power changes](/api-reference/historical-voting-power.md): Returns a list of voting power changes. - [Get voting power changes by account](/api-reference/historical-voting-power-by-account-id.md): Returns a list of voting power changes for a specific account - [Get the last update time](/api-reference/last-update.md): Returns the timestamp of the most recent data update for the requested chart. - [Get an offchain proposal by ID](/api-reference/offchain-proposal-by-id.md): Returns a single offchain (Snapshot) proposal by its ID. Pass `lean=true` to omit the `body`. - [Get offchain proposal non-voters](/api-reference/offchain-proposal-non-voters.md): Returns the active delegates that did not vote on a given offchain proposal - [Get offchain proposals](/api-reference/offchain-proposals.md): Returns a list of offchain (Snapshot) proposals. Pass `lean=true` to omit the markdown `body` and reduce payload size. - [Search offchain proposals](/api-reference/offchain-search-proposals.md): Returns offchain proposals whose title or identifier partially matches the query. Pass `lean=true` to omit the `body`. - [Get a proposal by ID](/api-reference/proposal.md): Returns a single proposal by its ID. Pass `lean=true` to omit calldatas/values/targets and the proposal description. - [Get a proposal non-voters](/api-reference/proposal-non-voters.md): Returns the active delegates that did not vote on a given proposal - [Get proposals](/api-reference/proposals.md): Returns a list of proposals. Pass `lean=true` to omit calldatas/values/targets and the proposal description, reducing payload size. - [Get proposals activity for delegate](/api-reference/proposals-activity.md): Returns proposal activity data including voting history, win rates, and detailed proposal information for the specified delegate within the given time window - [Search proposals](/api-reference/search-proposals.md): Returns proposals whose title or identifier partially matches the query. Pass `lean=true` to omit calldatas/values/targets and the proposal description. - [Get token properties](/api-reference/token.md): Get property data for a specific token - [Get token related metrics](/api-reference/token-metrics.md): Returns token related metrics for a single metric type. - [Get transfers](/api-reference/transfers.md): Get transfers of a given address - [Update a draft proposal](/api-reference/update-draft-proposal.md): Only the original author (matched by address) can update a draft. - [Get all votes](/api-reference/votes.md): Get all votes ordered by timestamp or voting power - [List of votes for a given proposal](/api-reference/votes-by-proposal-id.md): Returns a paginated list of votes cast on a specific proposal - [Get offchain votes](/api-reference/votes-offchain.md): Returns a list of offchain (Snapshot) votes - [Get offchain votes for a proposal](/api-reference/votes-offchain-by-proposal-id.md): Returns a paginated list of offchain (Snapshot) votes for a specific proposal - [Get account powers](/api-reference/voting-power-by-account-id.md): Returns voting power information for a specific address (account) - [Get voting power changes within a time frame for the given addresses](/api-reference/voting-power-variations.md): Returns a mapping of the voting power changes within a time frame for the given addresses - [Get top changes in voting power for a given period for a single account](/api-reference/voting-power-variations-by-account-id.md): Returns the changes to voting power by period and account ID - [Get voting powers](/api-reference/voting-powers.md): Returns sorted and paginated account voting power records ## getting-started - [Getting started](/getting-started.md): The Anticapture REST API serves DAO governance analytics over HTTPS with JSON ## mcp - [MCP server](/mcp.md): Anticapture ships a hosted Model Context Protocol ## webhooks - [Webhooks](/webhooks.md): Instead of polling the REST API, register an HTTPS endpoint with the Webhook - [Deactivate a webhook](/webhooks/reference/delete-webhooks.md): Deactivates a previously registered webhook URL, stopping further deliveries. - [Register a webhook](/webhooks/reference/post-webhooks.md): Registers a webhook URL to receive notifications for all DAOs. On first registration, returns a one-time HMAC secret used to verify delivery signatures — it is never shown again, so store it immediately. Re-registering an already-active webhook returns success without a secret. - [Webhook Notification API](/webhooks/reference/webhook-notification-api.md): API for registering and managing webhook notification subscriptions --- # Full Documentation Content [Skip to main content](#__docusaurus_skipToContent_fallback) [![Anticapture](/img/logo.svg)![Anticapture](/img/logo.svg)](/index.md) [LLM Docs](#) * [Copy entire docs (Markdown)](/llms-full.txt) * [View as Markdown (llms-full.txt)](/llms-full.txt) * [View index (llms.txt)](/llms.txt) * [Open in ChatGPT](https://chatgpt.com/?q=Read%20the%20Anticapture%20MCP%20documentation%20at%20%2Fllms-full.txt%20and%20help%20me%20use%20it.) * [Open in Claude](https://claude.ai/new?q=Read%20the%20Anticapture%20MCP%20documentation%20at%20%2Fllms-full.txt%20and%20help%20me%20use%20it.) [Dashboard](https://app.anticapture.com)[GitHub](https://github.com/blockful-io/anticapture) Search # Search the documentation © 2026 Anticapture, built by [blockful](https://blockful.io) --- # Get account balance ``` GET /:dao/accounts/:address/balances ``` Returns account balance information for a specific address ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 404 Successfully retrieved account balance Account not found --- # Get variations in account balances for a given period ``` GET /:dao/balances/variations ``` Returns the largest account balance variations, keyed by account address ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved account balance variations --- # Get changes in balance for a given period for a single account ``` GET /:dao/accounts/:address/balances/variations ``` Returns the changes to balance by period and account ID ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved account balance variations --- # Get account balance records ``` GET /:dao/balances ``` Returns sorted and paginated account balance records ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved account balances --- # Get top interactions between accounts for a given period ``` GET /:dao/balances/:address/interactions ``` Returns a mapping of the largest interactions between accounts. Positive amounts signify net token transfers FROM `
`, whilst negative amounts refer to net transfers TO `
` ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved account interactions --- Version: 1.0.0 # Anticapture REST API REST API for Anticapture's DAO governance analytics: proposals, votes, voting power, delegations, token and treasury data, indexed from onchain and offchain sources. All endpoints are served from `https://gateful.up.railway.app` and require a bearer token; see [Getting started](/getting-started.md). ## Authentication[​](#authentication "Direct link to Authentication") * HTTP: Bearer Auth | Security Scheme Type: | http | | -------------------------- | ------ | | HTTP Authorization Scheme: | bearer | --- # Average delegation percentage across all DAOs ``` GET /aggregations/average-delegation-percentage ``` Returns the delegated-supply percentage averaged across all configured DAOs, bucketed by day over the requested period. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Average delegation percentage across all DAOs --- # Compare active token supply between time periods ``` GET /:dao/active-supply/compare ``` Returns the active token supply (supply held by accounts that participated in governance) for the given period. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Active supply value --- # Compare average turnout between time periods ``` GET /:dao/average-turnout/compare ``` Returns the average proposal turnout in the current period versus the previous one, with the change rate and raw delta. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Average turnout comparison --- # Compare cex supply between periods ``` GET /:dao/cex-supply/compare ``` Returns the cex supply for the current period versus the previous one, with the change rate and raw delta. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 cex supply comparison --- # Compare circulating supply between periods ``` GET /:dao/circulating-supply/compare ``` Returns the circulating supply for the current period versus the previous one, with the change rate and raw delta. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 circulating supply comparison --- # Compare delegated supply between periods ``` GET /:dao/delegated-supply/compare ``` Returns the delegated supply for the current period versus the previous one, with the change rate and raw delta. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 delegated supply comparison --- # Compare dex supply between periods ``` GET /:dao/dex-supply/compare ``` Returns the dex supply for the current period versus the previous one, with the change rate and raw delta. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 dex supply comparison --- # Compare lending supply between periods ``` GET /:dao/lending-supply/compare ``` Returns the lending supply for the current period versus the previous one, with the change rate and raw delta. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 lending supply comparison --- # Compare number of proposals between time periods ``` GET /:dao/proposals/compare ``` Returns the number of proposals launched in the current period versus the previous one, with the change rate and raw delta. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Proposal comparison --- # Compare total supply between periods ``` GET /:dao/total-supply/compare ``` Returns the total supply for the current period versus the previous one, with the change rate and raw delta. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 total supply comparison --- # Compare treasury between periods ``` GET /:dao/treasury/compare ``` Returns the treasury for the current period versus the previous one, with the change rate and raw delta. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 treasury comparison --- # Compare number of votes between time periods ``` GET /:dao/votes/compare ``` Returns the number of votes cast in the current period versus the previous one, with the change rate and raw delta. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Vote comparison --- # Create a draft proposal ``` POST /:dao/proposal/drafts ``` Create a draft proposal ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 201 The created draft proposal --- # Get DAO governance parameters ``` GET /:dao/dao ``` Returns current governance parameters for this DAO ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 DAO governance parameters --- # List of all configured DAOs ``` GET /daos ``` Returns every DAO configured on the gateway along with its governance parameters and supported capabilities. ## Responses[​](#responses "Direct link to Responses") * 200 List of all configured DAOs --- # Get delegation percentage day buckets with forward-fill ``` GET /:dao/delegation-percentage ``` Returns the delegated-supply percentage bucketed by day, forward-filling days without new data with the last known value. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Delegation percentage data with pagination --- # Get delegations ``` GET /:dao/accounts/:address/delegations ``` Get current delegations for an account ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Returns delegations for an account --- # Get delegators ``` GET /:dao/accounts/:address/delegators ``` Get current delegators of an account with voting power ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Returns current delegators for an account --- # Delete a draft proposal ``` DELETE /:dao/proposal/drafts/:id ``` Only the original author (matched by address) can delete a draft. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 204 * 404 Draft deleted Draft not found or address does not match author --- # Get feed events ``` GET /:dao/feed/events ``` Returns a paginated list of governance feed events, optionally filtered by type and relevance. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved feed events --- # Gateway health and upstream dependency states ``` GET /health ``` Returns 200 only when every configured DAO API, relayer, address enrichment, and token service upstream responds to /health. ## Responses[​](#responses "Direct link to Responses") * 200 * 503 Gateway and every configured upstream are healthy. At least one configured upstream is unavailable. --- # Get enriched data for an address ``` GET /address-enrichment/address/:address ``` Returns label information from Arkham, ENS data, and whether the address is an EOA or contract. Arkham data is stored permanently. ENS data is cached with a configurable TTL. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 502 Successfully retrieved address enrichment data Upstream enrichment provider failed --- # Get enriched data for multiple addresses ``` GET /address-enrichment/addresses ``` Returns label information from Arkham, ENS data, and address type for multiple addresses. Maximum 100 addresses per request. Arkham data is stored permanently. ENS data is cached with a configurable TTL. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved batch enrichment data --- # Get DAO token treasury data ``` GET /:dao/treasury/dao-token ``` Get historical DAO Token Treasury value (governance token quantity × token price) ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Returns DAO token treasury history --- # Get a draft proposal by ID ``` GET /:dao/proposal/drafts/:id ``` Public endpoint — anyone with the ID can view the draft, enabling sharing. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 404 The requested draft proposal Draft not found --- # List draft proposals for an address ``` GET /:dao/proposal/drafts ``` List draft proposals for an address ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Draft proposals owned by the given address --- # Get event relevance threshold ``` GET /:dao/event-relevance/threshold ``` Returns the minimum value at which a feed event of the given type qualifies for the requested relevance level. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved threshold --- # GET /{dao}/health ``` GET /:dao/health ``` GET /{dao}/health ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 404 * 503 Per-DAO health snapshot — database, chain head, indexer freshness, and gateway circuit-breaker state. DAO not configured. Upstream DAO API unavailable. --- # Get liquid treasury data ``` GET /:dao/treasury/liquid ``` Get historical Liquid Treasury (treasury without DAO tokens) from external providers (DefiLlama/Dune) ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Returns liquid treasury history --- # Get monthly ENS action counts by category ``` GET /:dao/revenue/actions ``` Monthly action counts by category (Registration, Renewal, Premium). ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Monthly action counts by category --- # Get monthly net change and cumulative active .eth names ``` GET /:dao/revenue/active-names ``` Monthly net change and cumulative count of active .eth names. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Monthly net change and cumulative count of active .eth names --- # Get monthly ENS revenue split by category (Steakhouse ledger) ``` GET /:dao/revenue/by-category ``` Monthly ENS revenue split by category (Registration vs Renewal) in USD and ETH, sourced from the Steakhouse accounting ledger. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Monthly ENS revenue split by category in USD and ETH --- # Get monthly new-wallet counts and cumulative wallet total ``` GET /:dao/revenue/new-wallets ``` Monthly new-wallet counts and the cumulative wallet total for ENS. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Monthly new-wallet counts and the cumulative wallet total --- # Get monthly renewal funnel keyed by expiry month ``` GET /:dao/revenue/renewal-funnel ``` Renewal funnel per expiry month: terms expiring, renewed, churned, and renewal rate. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Renewal funnel per expiry month: terms expiring, renewed, churned, and renewal rate. --- # Get monthly renewal tenure distribution per expiry month ``` GET /:dao/revenue/renewal-tenure ``` Per expiry month, count of names in each tenure bucket (0/1/2/3+ renewals) and the total renewals in that bucket. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Per expiry month, count of names in each tenure bucket and total renewals in that bucket --- # Get monthly ENS revenue totals in USD and ETH ``` GET /:dao/revenue/totals ``` Monthly ENS revenue totals split into registration, premium, and renewal, in both USD and ETH. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Monthly ENS revenue totals in USD and ETH --- # Get total treasury data ``` GET /:dao/treasury/total ``` Get historical Total Treasury (liquid treasury + DAO token treasury) ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Returns total treasury history --- # Get historical token balances ``` GET /:dao/accounts/:address/balances/historical ``` Returns historical balance deltas for one account, enriched with the transfer that caused each change. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved historical balances --- # Get historical delegations ``` GET /:dao/accounts/:address/delegations/historical ``` Get historical delegations for an account, with optional filtering and sorting ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Returns historical delegations for an account --- # Get historical token data ``` GET /:dao/token/historical-data ``` Get historical market data for a specific token ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Returns the historical market data for the token --- # Get voting power changes ``` GET /:dao/voting-powers/historical ``` Returns a list of voting power changes. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved voting power changes --- # Get voting power changes by account ``` GET /:dao/accounts/:address/voting-powers/historical ``` Returns a list of voting power changes for a specific account ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved voting power changes --- # Get the last update time ``` GET /:dao/last-update ``` Returns the timestamp of the most recent data update for the requested chart. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Last update time --- # Get an offchain proposal by ID ``` GET /:dao/offchain/proposals/:id ``` Returns a single offchain (Snapshot) proposal by its ID. Pass `lean=true` to omit the `body`. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 400 * 404 Successfully retrieved offchain proposal Offchain data not supported Proposal not found --- # Get offchain proposal non-voters ``` GET /:dao/offchain/proposals/:id/non-voters ``` Returns the active delegates that did not vote on a given offchain proposal ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 400 * 404 Successfully retrieved non-voters Offchain data not supported Proposal not found --- # Get offchain proposals ``` GET /:dao/offchain/proposals ``` Returns a list of offchain (Snapshot) proposals. Pass `lean=true` to omit the markdown `body` and reduce payload size. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 400 Successfully retrieved offchain proposals Offchain data not supported --- # Search offchain proposals ``` GET /:dao/offchain/proposals/search ``` Returns offchain proposals whose title or identifier partially matches the query. Pass `lean=true` to omit the `body`. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 400 Successfully retrieved matching offchain proposals Offchain data not supported --- # Get a proposal by ID ``` GET /:dao/proposals/:id ``` Returns a single proposal by its ID. Pass `lean=true` to omit calldatas/values/targets and the proposal description. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 404 Successfully retrieved proposal Proposal not found --- # Get a proposal non-voters ``` GET /:dao/proposals/:id/non-voters ``` Returns the active delegates that did not vote on a given proposal ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved proposal --- # Get proposals ``` GET /:dao/proposals ``` Returns a list of proposals. Pass `lean=true` to omit calldatas/values/targets and the proposal description, reducing payload size. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved proposals --- # Get proposals activity for delegate ``` GET /:dao/proposals-activity ``` Returns proposal activity data including voting history, win rates, and detailed proposal information for the specified delegate within the given time window ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved proposals activity --- # Search proposals ``` GET /:dao/proposals/search ``` Returns proposals whose title or identifier partially matches the query. Pass `lean=true` to omit calldatas/values/targets and the proposal description. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved matching proposals --- # Get token properties ``` GET /:dao/token ``` Get property data for a specific token ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 404 Returns data concerning token-specific values and attributes Token not found --- # Get token related metrics ``` GET /:dao/token-metrics ``` Returns token related metrics for a single metric type. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Token metrics data keyed by metric type --- # Get transfers ``` GET /:dao/accounts/:address/transfers ``` Get transfers of a given address ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Returns transfers --- # Update a draft proposal ``` PUT /:dao/proposal/drafts/:id ``` Only the original author (matched by address) can update a draft. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 404 The updated draft proposal Draft not found or address does not match author --- # Get all votes ``` GET /:dao/votes ``` Get all votes ordered by timestamp or voting power ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Returns votes --- # List of votes for a given proposal ``` GET /:dao/proposals/:id/votes ``` Returns a paginated list of votes cast on a specific proposal ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved votes --- # Get offchain votes ``` GET /:dao/offchain/votes ``` Returns a list of offchain (Snapshot) votes ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 400 Successfully retrieved offchain votes Offchain data not supported --- # Get offchain votes for a proposal ``` GET /:dao/offchain/proposals/:id/votes ``` Returns a paginated list of offchain (Snapshot) votes for a specific proposal ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 400 Successfully retrieved offchain votes Offchain data not supported --- # Get account powers ``` GET /:dao/voting-powers/:address ``` Returns voting power information for a specific address (account) ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved voting power changes --- # Get voting power changes within a time frame for the given addresses ``` GET /:dao/accounts/voting-powers/variations ``` Returns a mapping of the voting power changes within a time frame for the given addresses ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved voting power changes --- # Get top changes in voting power for a given period for a single account ``` GET /:dao/accounts/:address/voting-powers/variations ``` Returns the changes to voting power by period and account ID ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved voting power changes --- # Get voting powers ``` GET /:dao/voting-powers ``` Returns sorted and paginated account voting power records ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 Successfully retrieved voting power changes --- # Getting started The Anticapture REST API serves DAO governance analytics over HTTPS with JSON responses. This page covers everything you need for a first request. ## Base URL[​](#base-url "Direct link to Base URL") ``` https://gateful.up.railway.app ``` The interactive OpenAPI spec is served at [`/docs/json`](https://gateful.up.railway.app/docs/json), the same spec this documentation is generated from. ## Authentication[​](#authentication "Direct link to Authentication") All endpoints require a bearer token (contact the Anticapture team for an API key): ``` Authorization: Bearer ``` ## DAO scoping[​](#dao-scoping "Direct link to DAO scoping") Most endpoints are scoped to a single DAO via a **path parameter**: lowercase identifiers such as `ens`, `uni`, or `arb`: ``` GET /{dao}/proposals GET /{dao}/treasury/total GET /{dao}/accounts/{address}/delegations ``` List the supported DAOs (and their identifiers) with [`GET /daos`](/api-reference/daos.md). ## Your first request[​](#your-first-request "Direct link to Your first request") Fetch the three most recent ENS proposals: ``` curl -H "Authorization: Bearer $ANTICAPTURE_TOKEN" \ "https://gateful.up.railway.app/ens/proposals?limit=3&orderDirection=desc" ``` ## Pagination[​](#pagination "Direct link to Pagination") List endpoints paginate with `skip` and `limit` query parameters: ``` # Second page of 20 proposals curl -H "Authorization: Bearer $ANTICAPTURE_TOKEN" \ "https://gateful.up.railway.app/ens/proposals?skip=20&limit=20" ``` Each endpoint's reference page documents its exact parameters, defaults, and maximums. ## Conventions[​](#conventions "Direct link to Conventions") * **Token amounts** are returned as raw values in the token's native decimals (18 for most governance tokens); divide accordingly for display. * **Addresses** are hex-encoded Ethereum addresses. * **Timestamps** are Unix epoch values unless a field says otherwise. ## Where to go next[​](#where-to-go-next "Direct link to Where to go next") * **[API Reference](/api-reference/anticapture-rest-api.md)**: every endpoint, generated from the live OpenAPI spec. * **[MCP server](/mcp/.md)**: query the same API from LLM agents in natural language. * **[Webhooks](/webhooks/.md)**: push notifications instead of polling. --- # MCP server Anticapture ships a hosted [Model Context Protocol](https://modelcontextprotocol.io) server so agentic clients (Claude Desktop, Claude Code, Cursor, deployed assistants) can query DAO governance analytics in natural language. ## Connecting[​](#connecting "Direct link to Connecting") Add the server to your MCP client configuration (the bearer token is the same API key used for the [REST API](/getting-started.md#authentication)): ``` { "mcpServers": { "anticapture": { "type": "http", "url": "https://mcp.anticapture.com/mcp", "headers": { "Authorization": "Bearer " } } } } ``` This connects to the public MCP HTTP transport instance. ## How tools map to the API[​](#how-tools-map-to-the-api "Direct link to How tools map to the API") The MCP tools are generated from the same OpenAPI spec as the [API Reference](/api-reference/anticapture-rest-api.md): * **Tool name** = the operation's `operationId` (e.g. the `proposals` tool calls `GET /{dao}/proposals`). * **Tool group** = the operation's tag (e.g. `governance`, `treasury`, `voting-power`). * **Tool inputs** = the operation's path, query, and body parameters; the `dao` path parameter becomes a required tool argument. Every tool's parameters, defaults, and response shape are documented on the corresponding endpoint page in the API Reference. Relayer endpoints are not exposed through the MCP. ## Example session[​](#example-session "Direct link to Example session") Once connected, describe what you want in plain language: ``` ❯ Query the most recent UNI proposals with anticapture ⏺ I'll query the most recent UNI proposals. Called anticapture proposals tool ⏺ Here are the 5 most recent UNI (Uniswap) proposals (97 total on-chain): #97 Return 12.5M Delegated Tokens to the Governance Timelock - EXECUTED #96 Protocol Fee Expansion: Vote 3 - EXECUTED #95 Protocol Fee Expansion: Vote 2 - EXECUTED #94 Protocol Fee Expansion: Vote 1 - EXECUTED #93 UNIfication - EXECUTED All five passed comfortably (quorum is 40M UNI) and have been executed. ``` --- # Webhooks Instead of polling the REST API, register an HTTPS endpoint with the Webhook Notification API and Anticapture pushes signed governance notifications for all DAOs to it. The webhook service is hosted separately from the REST API: ``` https://webhook.anticapture.com ``` ## Registering an endpoint[​](#registering-an-endpoint "Direct link to Registering an endpoint") Register your receiver URL with a single request: ``` curl -X POST https://webhook.anticapture.com/webhooks \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/anticapture-webhook"}' ``` On **first registration** the response includes a one-time HMAC secret used to verify delivery signatures: ``` { "success": true, "secret": "whsec_...", "note": "Store this secret now; it is never shown again." } ``` Store the secret immediately The secret is returned **only once**. Re-registering an already-active webhook returns `{ "success": true }` without a secret. To stop deliveries, deactivate the endpoint with `DELETE /webhooks` and the same payload; see the [reference](#reference) below for both operations. ## Verifying deliveries[​](#verifying-deliveries "Direct link to Verifying deliveries") Every delivery is signed with **HMAC-SHA256** so you can prove it came from Anticapture: | Header | Content | | ------------------------ | ------------------------------------------------------------------ | | `X-Webhook-Timestamp` | Delivery time, Unix seconds | | `X-Webhook-Signature-V2` | `HMAC-SHA256("{timestamp}.{rawBody}", secret)` as a raw hex digest | To verify, recompute the signature over `"{timestamp}.{rawBody}"` with your stored secret and compare using a **timing-safe comparison**. Reject deliveries whose timestamp is more than **5 minutes** old to prevent replay attacks. ### Example receiver (Node.js)[​](#example-receiver-nodejs "Direct link to Example receiver (Node.js)") ``` import { createHmac, timingSafeEqual } from "node:crypto"; import express from "express"; const SECRET = process.env.ANTICAPTURE_WEBHOOK_SECRET; const MAX_AGE_SECONDS = 5 * 60; const app = express(); // The signature covers the RAW body; parse it only after verifying. app.post( "/anticapture-webhook", express.raw({ type: "application/json" }), (req, res) => { const timestamp = req.header("X-Webhook-Timestamp"); const signature = req.header("X-Webhook-Signature-V2"); if (!timestamp || !signature) return res.status(400).end(); const ageSeconds = Math.abs(Date.now() / 1000 - Number(timestamp)); if (!Number.isFinite(ageSeconds) || ageSeconds > MAX_AGE_SECONDS) { return res.status(400).end(); // replay protection } const expected = createHmac("sha256", SECRET) .update(`${timestamp}.${req.body}`) .digest("hex"); const a = Buffer.from(signature, "hex"); const b = Buffer.from(expected, "hex"); if (a.length !== b.length || !timingSafeEqual(a, b)) { return res.status(401).end(); } const event = JSON.parse(req.body); // ...handle the notification... res.status(200).end(); }, ); app.listen(3000); ``` Respond with a `2xx` status quickly; do any heavy processing asynchronously. ## Reference[​](#reference "Direct link to Reference") The pages below are generated from the live [Webhook Notification API spec](https://webhook.anticapture.com/docs/json). --- # Deactivate a webhook ``` DELETE /webhooks ``` Deactivates a previously registered webhook URL, stopping further deliveries. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 200 * 404 Default Response Default Response --- # Register a webhook ``` POST /webhooks ``` Registers a webhook URL to receive notifications for all DAOs. On first registration, returns a one-time HMAC secret used to verify delivery signatures — it is never shown again, so store it immediately. Re-registering an already-active webhook returns success without a secret. Deliveries are signed with HMAC-SHA256: HMAC-SHA256(`${timestamp}.${rawBody}`, secret), sent as the `X-Webhook-Timestamp` header (unix seconds) and the `X-Webhook-Signature-V2` header (raw hex digest). Receivers should recompute the signature and compare it using a timing-safe comparison (`crypto.timingSafeEqual`), and reject requests where the timestamp is more than 5 minutes old to prevent replay attacks. ## Request[​](#request "Direct link to request") ## Responses[​](#responses "Direct link to Responses") * 201 Default Response --- Version: 1.0.0 # Webhook Notification API API for registering and managing webhook notification subscriptions ---