Snapshot Scraper
Pricing
from $1.00 / 1,000 records
Snapshot Scraper
Extract DAO governance proposals from Snapshot: title, body, state, the voting window, the choices on the ballot, votes cast and total voting power, for one space or many at once. Export data, run via API, schedule and monitor runs, or integrate with other tools.
Pricing
from $1.00 / 1,000 records
Rating
5.0
(1)
Developer
Public Money
Maintained by ApifyActor stats
1
Bookmarked
4
Total users
3
Monthly active users
21 hours ago
Last modified
Categories
Share
Governance decides what a protocol does next, and it happens in public on Snapshot, but reading it means one GraphQL query per space and a lot of pagination. This Actor takes a list of spaces and returns one structured record per proposal: title, body, state, the voting window, the choices on the ballot, votes cast and the total voting power behind them.
What it does
- Returns one record per proposal, across as many spaces as you pass, so a portfolio of DAOs is one run rather than one per space.
- Filters by state:
activefor what is open now,pendingfor what is queued,closedfor the record, orall. - Carries the full proposal body, not just the title, so a record is enough to classify or summarise without a second fetch.
- Reports the choices on the ballot with the votes and voting power behind them, which is how you see whether a vote was close or a formality.
- Gives you the voting window in
startsAtandendsAt, so an alert can fire before a vote closes rather than after. - Caps work per space with Proposals per space, so one busy DAO cannot consume the whole run.
Use cases
| You need to | How this Actor does it |
|---|---|
| Never miss a vote you can cast | Filter state to active and alert on endsAt inside your window |
| Watch governance across a portfolio | Pass every space you hold a token in and schedule the run |
| Tell a close vote from a formality | Compare the vote counts across choices and read scoresTotal |
| Track voter turnout over time | Accumulate closed proposals and chart votes per space |
| Summarise governance for a report | Feed title and body to a model over MCP |
| Catch a proposal early | Filter state to pending and see what is queued before it opens |
Quick start
- Click Try for free.
- Add Snapshot spaces, one per line, in their ENS form:
aave.eth,ens.eth,uniswapgovernance.eth. The space id is in its Snapshot URL. - Set State to
activefor open votes,pending,closed, orall. - Set Proposals per space to control how deep the history goes.
- Click Start. Rows appear within seconds.
- Export as JSON, CSV, Excel or XML, or read the dataset over the API.
Input
| Field | Type | Default | What it controls |
|---|---|---|---|
spaces | array | aave.eth, ens.eth | Snapshot space ids to read, usually an ENS name |
state | string | all | Restricts to active, pending or closed proposals |
proposalsPerSpace | integer | 20 | Caps proposals per space, newest first |
maxItems | integer | 0 | Caps how many records are written. 0 writes them all |
{"spaces": ["aave.eth","ens.eth"],"state": "active","proposalsPerSpace": 20}
Output
One dataset item per proposal. A space that does not resolve comes back as a single failure row with the space in requested, so an empty space is distinguishable from a wrong id.
| Field group | Fields |
|---|---|
| Identity | status, space, proposalId, title, author, url |
| Content | body, choices, type |
| State | proposalState, startsAt, endsAt, snapshotBlock |
| Result | votes, scores, scoresTotal, quorum |
| Timing | validFrom, scrapedAt |
{"status": "ok","space": "aave.eth","proposalId": "0x9f2c\u20268ab1","title": "Onboard wstETH as collateral on Aave V3 Base","author": "0x8ba1f109551bD432803012645Ac136ddd64DBA72","body": "This proposal asks the DAO to list wstETH as collateral with a 75 percent LTV\u2026","choices": ["For","Against","Abstain"],"proposalState": "active","startsAt": "2026-09-04T12:00:00.000Z","endsAt": "2026-09-07T12:00:00.000Z","votes": 218,"scores": [412881.4,1204.8,88.2],"scoresTotal": 414174.4,"validFrom": "2026-09-06T05:30:00.000Z","url": "https://snapshot.org/#/aave.eth/proposal/0x9f2c8ab1"}
Integrations
Run it over the API and get the rows back in one call:
curl -X POST "https://api.apify.com/v2/acts/publicmoney~snapshot-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"spaces": ["aave.eth", "ens.eth"], "state": "active", "proposalsPerSpace": 20}'
From Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("publicmoney/snapshot-scraper").call(run_input={"spaces": ["aave.eth", "ens.eth"], "state": "active", "proposalsPerSpace": 20})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["validFrom"])
Give an AI agent the Actor over MCP:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?actors=publicmoney/snapshot-scraper"}}}
Schedules run it on any cron, webhooks fire when a run finishes, and platform integrations push the dataset to Google Sheets, Slack, Airtable, Zapier or your own endpoint.
Cost
Pay per event, so you pay for records rather than compute time.
| Event | Free tier | Top volume tier |
|---|---|---|
| Record with data | $0.002 | $0.0007 |
| Actor start | $0.00005 per GB | Same |
A record that returned no data is published as a failure row and is never charged. Six volume tiers apply, so the per-record price falls with monthly volume.
Troubleshooting
| Issue | Solution |
|---|---|
A space returns failed | The space id is wrong. Most are ENS names ending in .eth and the exact id is in the space's Snapshot URL. |
State active returns nothing | No vote is open in those spaces right now. Try pending to see what is queued, or all. |
quorum is missing | That space sets no quorum, which is common. Read scoresTotal against the space's own rules instead. |
scores looks huge next to votes | They measure different things. votes counts voters and scores sums voting power, which is token-weighted. |
| Fewer proposals than the space has | Proposals per space caps it, newest first, and the default is 20. Raise it for a fuller history. |
FAQ
Does Snapshot have a public API?
Yes, a public GraphQL API. This Actor is not selling you access. It gives you one flat record per proposal with the same field names as the other 29 Actors in this fleet, several spaces in one run, pagination handled, and the platform's scheduling and integrations around it. For one query against one space, use the GraphQL API directly.
What is a Snapshot space?
A DAO's governance area, identified usually by an ENS name such as aave.eth or ens.eth. The exact id is in the space's Snapshot URL.
What is the difference between votes and scores?
votes is the number of addresses that voted. scores is the voting power behind each choice, which is token-weighted, so a handful of large holders can outweigh hundreds of voters.
Can I see who voted?
No. This Actor returns proposals and their aggregate results, not the individual ballots.
Can it read off-chain and on-chain votes?
Snapshot is off-chain signalling by design, so what you get is what Snapshot records. Execution on-chain afterwards is a separate transaction this Actor does not follow.
Do I need a Snapshot API key?
No. You need an Apify token to call the Actor over the API. No Snapshot credential is involved anywhere.
Can I get this data in Python?
Yes, with the apify-client package as shown above. It returns parsed JSON, so there is no HTML or response handling on your side.
Can I get the data into Excel or Google Sheets?
Yes. Export the dataset as XLSX or CSV, or connect the Google Sheets integration so each run appends to a sheet.
Can an AI agent call this Actor?
Yes. Add it to an MCP client with the config above and the model can request what it needs on its own. Every record is flat JSON with named fields, so no post-processing is needed.
Is it legal to scrape Snapshot?
DAO governance on Snapshot is public by design and this Actor reads it as published. Proposal authors and voters are pseudonymous addresses rather than named people, so if you link one to an identity you are handling personal data and your own privacy obligations apply. Take your own legal advice for your use case.
Changelog
- 0.0.2 Added the state filter, the choices and score breakdown, and the voting window.
- 0.0.1 First release. Proposals per space with vote counts.
Feedback
Found a field Snapshot publishes that this Actor misses, or an input it rejects? Open an issue on the Issues tab with the input and what you expected. A daily test runs every Actor in the fleet against live sources, so parser fixes ship fast.