# Tally (Cactus) DAO Governance Scraper (`crawlerbros/tally-dao-governance-scraper`) Actor

Scrape DAO governance data from tally.xyz (mid-rebrand to "Cactus") - browse DAOs, list proposals by status, get full proposal detail with votes/quorum, and look up top delegates/voters. No login, no API key required.

- **URL**: https://apify.com/crawlerbros/tally-dao-governance-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Developer tools, Integrations, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Tally (Cactus) DAO Governance Scraper

Scrape DAO governance data from **tally.xyz** — the leading on-chain governance platform for DAOs like Uniswap, ENS, Arbitrum, Optimism, Compound, Aave, and 1,700+ others. Note: the platform is mid-rebrand from "Tally" to "**Cactus**" (new name, same product, same `tally.xyz` URLs) — this actor works either way.

Browse DAOs, list proposals with their status, pull full proposal detail (votes, quorum, description), or look up a DAO's top delegates/voters. No login, no API key, no cookies required.

### What this actor does

- **`daos`** — browse the current top DAOs by delegate count, or look up specific DAOs by slug (name, description, token, treasury value, delegate/proposal counts)
- **`proposals`** — list a DAO's most recent proposals, optionally filtered by status (active, pending, succeeded, queued, executed, defeated, canceled, cross-chain executed)
- **`proposalDetail`** — full detail for specific proposal IDs: markdown description, quorum, for/against/abstain votes and voter counts, proposer, on-chain transaction hash
- **`delegates`** — a DAO's top delegates/voters ranked by voting power, with ENS name, Twitter, and delegator counts
- Empty fields are always omitted — every returned field has real data

### Output fields

#### DAO record (`mode=daos`)
`daoId`, `daoSlug`, `daoName`, `description`, `iconUrl`, `websiteUrl`, `discourseUrl`, `twitterUrl`, `chainIds[]`, `isArchived`, `proposalsCount`, `hasActiveProposals`, `delegatesCount`, `tokenOwnersCount`, `primaryGovernorType`, `tokenSymbol`, `tokenName`, `delegatesVotesCount`, `treasuryValueUsd`, `sourceUrl`

#### Proposal record (`mode=proposals`)
`daoSlug`, `daoName`, `proposalId`, `title`, `description`, `status`, `quorum`, `votesFor`, `votesForVoters`, `votesAgainst`, `votesAgainstVoters`, `votesAbstain`, `votesAbstainVoters`, `createdAt`, `startDate`, `endDate`, `transactionHash`, `sourceUrl`

#### Proposal detail record (`mode=proposalDetail`)
`daoSlug`, `daoName`, `proposalId`, `title`, `description` (full markdown), `discourseUrl`, `snapshotUrl`, `status`, `governorType`, `timelockId`, `tokenSymbol`, `quorum`, `votesFor/Against/Abstain` (+ voter counts), `createdAt`, `startDate`, `endDate`, `proposerAddress`, `creatorAddress`, `executableCallsCount`, `targetContracts[]`, `transactionHash`, `sourceUrl`

#### Delegate record (`mode=delegates`)
`daoSlug`, `daoName`, `address`, `ens`, `name`, `bio`, `twitterUrl`, `pictureUrl`, `votesCount`, `tokenSymbol`, `delegatorsCount`, `isPrioritized`, `sourceUrl`

Every record also carries `recordType` and `scrapedAt`.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string (select) | `daos` | `daos` / `proposals` / `proposalDetail` / `delegates` |
| `daoSlugs` | array | – | Specific DAO slugs to look up (mode=daos). Empty = browse top DAOs |
| `daoSlug` | string | `uniswap` | DAO slug, required for `proposals` / `proposalDetail` / `delegates` |
| `statusFilter` | string (select) | `any` | Filter proposals by status (mode=proposals) |
| `proposalIds` | array | `["93"]` | On-chain proposal IDs to fetch detail for (mode=proposalDetail) |
| `maxItems` | integer | `20` | Hard cap on emitted records (1–100) |
| `proxyConfiguration` | object | off | Optional Apify proxy, used only as an automatic fallback on 403/429 |

A DAO's slug is the last path segment of its `tally.xyz/gov/<slug>` URL, e.g. `uniswap`, `ens`, `arbitrum`, `gitcoin`, `compound`, `aave`, `optimism`, `zksync`.

#### Example: recent active proposals for ENS

```json
{
  "mode": "proposals",
  "daoSlug": "ens",
  "statusFilter": "active",
  "maxItems": 10
}
````

#### Example: top delegates for Uniswap

```json
{
  "mode": "delegates",
  "daoSlug": "uniswap",
  "maxItems": 20
}
```

#### Example: full detail for a specific proposal

```json
{
  "mode": "proposalDetail",
  "daoSlug": "arbitrum",
  "proposalIds": ["5"]
}
```

#### Example: browse the top DAOs by delegate count

```json
{
  "mode": "daos",
  "maxItems": 15
}
```

### Use cases

- **Governance dashboards** — track proposal status and outcomes across one or many DAOs
- **DAO research** — compare quorum, treasury value, and voter turnout between DAOs
- **Delegate discovery** — find and rank top delegates/voters by voting power for a DAO
- **Historical proposal audits** — pull full detail (description, votes, transaction hash) for any past proposal by ID
- **Ecosystem monitoring** — browse the current top DAOs by delegate count and treasury value
- **Alerting** — poll `statusFilter=active` proposals to notify token holders before voting closes

### FAQ

**Is this the same as Tally?** Yes — tally.xyz recently began rebranding its UI to "Cactus," but the product, URLs, and DAO data are unchanged.

**Do I need a wallet or login?** No. Everything scraped here is publicly visible governance data.

**Which DAOs are supported?** Any DAO with a page at `tally.xyz/gov/<slug>` — over 1,700 at last count, including Uniswap, ENS, Arbitrum, Optimism, Compound, Aave, Gitcoin, GMX, Lisk, and many more.

**What does `quorum`/`votesFor`/`votesCount` mean?** These are governance-token amounts, scaled to human-readable units (e.g. `40000000.0` UNI), not raw on-chain wei values.

**Does `proposals` mode return a DAO's full proposal history?** No — it returns each DAO's ~10 most recent proposals, since full historical pagination requires an authenticated Tally API key (which this actor deliberately avoids, to stay free/zero-config). Use `proposalDetail` with a specific on-chain proposal ID to fetch any individual historical proposal directly — those never expire.

**How many delegates does `delegates` mode return per DAO?** Up to ~20 top delegates by voting power, for the same no-auth-API reason as above.

**Can `daos` mode return more than ~20 DAOs?** Without `daoSlugs`, it browses the current top ~20 DAOs shown on tally.xyz's own directory page (not paginable without an authenticated API key, regardless of `maxItems`). To pull more DAOs — or any DAO outside that top set — pass their slugs explicitly via `daoSlugs`; each one resolves independently up to `maxItems`.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `daoSlugs` (type: `array`):

Specific DAO slugs to look up (from a tally.xyz/gov/<slug> URL), e.g. `uniswap`, `ens`, `arbitrum`. Leave empty to browse the current top DAOs by delegate count.

## `daoSlug` (type: `string`):

The DAO slug from its tally.xyz/gov/<slug> URL. Required for modes `proposals`, `proposalDetail`, `delegates`.

## `statusFilter` (type: `string`):

Only return proposals in this state. `any` returns all recent proposals regardless of state.

## `proposalIds` (type: `array`):

On-chain proposal IDs (the number in a tally.xyz/gov/<slug>/proposal/<id> URL) to fetch full detail for.

## `maxItems` (type: `integer`):

Hard cap on emitted records. Note: Tally's public pages expose only the most recent ~10 proposals and top ~20 delegates per DAO without an authenticated API key.

## `proxyConfiguration` (type: `object`):

Optional. Only used as an automatic fallback if tally.xyz starts returning 403/429 responses. Leave default for normal operation (no proxy cost).

## Actor input object example

```json
{
  "mode": "daos",
  "daoSlugs": [],
  "daoSlug": "uniswap",
  "statusFilter": "any",
  "proposalIds": [
    "93"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `governanceRecords` (type: `string`):

Dataset containing all scraped DAOs, proposals, proposal detail, and delegate records.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "daos",
    "daoSlugs": [],
    "daoSlug": "uniswap",
    "statusFilter": "any",
    "proposalIds": [
        "93"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/tally-dao-governance-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "daos",
    "daoSlugs": [],
    "daoSlug": "uniswap",
    "statusFilter": "any",
    "proposalIds": ["93"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/tally-dao-governance-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "daos",
  "daoSlugs": [],
  "daoSlug": "uniswap",
  "statusFilter": "any",
  "proposalIds": [
    "93"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call crawlerbros/tally-dao-governance-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/tally-dao-governance-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tally (Cactus) DAO Governance Scraper",
        "description": "Scrape DAO governance data from tally.xyz (mid-rebrand to \"Cactus\") - browse DAOs, list proposals by status, get full proposal detail with votes/quorum, and look up top delegates/voters. No login, no API key required.",
        "version": "1.0",
        "x-build-id": "OSgunWydGNwqzVWjI"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~tally-dao-governance-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-tally-dao-governance-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crawlerbros~tally-dao-governance-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-tally-dao-governance-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crawlerbros~tally-dao-governance-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-tally-dao-governance-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "daos",
                            "proposals",
                            "proposalDetail",
                            "delegates"
                        ],
                        "type": "string",
                        "description": "What to fetch.",
                        "default": "daos"
                    },
                    "daoSlugs": {
                        "title": "DAO slugs (mode=daos)",
                        "type": "array",
                        "description": "Specific DAO slugs to look up (from a tally.xyz/gov/<slug> URL), e.g. `uniswap`, `ens`, `arbitrum`. Leave empty to browse the current top DAOs by delegate count.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "daoSlug": {
                        "title": "DAO slug",
                        "type": "string",
                        "description": "The DAO slug from its tally.xyz/gov/<slug> URL. Required for modes `proposals`, `proposalDetail`, `delegates`.",
                        "default": "uniswap"
                    },
                    "statusFilter": {
                        "title": "Proposal status filter (mode=proposals)",
                        "enum": [
                            "any",
                            "active",
                            "pending",
                            "succeeded",
                            "queued",
                            "executed",
                            "defeated",
                            "canceled",
                            "crosschainexecuted"
                        ],
                        "type": "string",
                        "description": "Only return proposals in this state. `any` returns all recent proposals regardless of state.",
                        "default": "any"
                    },
                    "proposalIds": {
                        "title": "Proposal IDs (mode=proposalDetail)",
                        "type": "array",
                        "description": "On-chain proposal IDs (the number in a tally.xyz/gov/<slug>/proposal/<id> URL) to fetch full detail for.",
                        "default": [
                            "93"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Hard cap on emitted records. Note: Tally's public pages expose only the most recent ~10 proposals and top ~20 delegates per DAO without an authenticated API key.",
                        "default": 20
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. Only used as an automatic fallback if tally.xyz starts returning 403/429 responses. Leave default for normal operation (no proxy cost).",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
