Snapshot Scraper avatar

Snapshot Scraper

Pricing

from $1.00 / 1,000 records

Go to Apify Store
Snapshot Scraper

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

Public Money

Maintained by Apify

Actor 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: active for what is open now, pending for what is queued, closed for the record, or all.
  • 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 startsAt and endsAt, 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 toHow this Actor does it
Never miss a vote you can castFilter state to active and alert on endsAt inside your window
Watch governance across a portfolioPass every space you hold a token in and schedule the run
Tell a close vote from a formalityCompare the vote counts across choices and read scoresTotal
Track voter turnout over timeAccumulate closed proposals and chart votes per space
Summarise governance for a reportFeed title and body to a model over MCP
Catch a proposal earlyFilter state to pending and see what is queued before it opens

Quick start

  1. Click Try for free.
  2. Add Snapshot spaces, one per line, in their ENS form: aave.eth, ens.eth, uniswapgovernance.eth. The space id is in its Snapshot URL.
  3. Set State to active for open votes, pending, closed, or all.
  4. Set Proposals per space to control how deep the history goes.
  5. Click Start. Rows appear within seconds.
  6. Export as JSON, CSV, Excel or XML, or read the dataset over the API.

Input

FieldTypeDefaultWhat it controls
spacesarrayaave.eth, ens.ethSnapshot space ids to read, usually an ENS name
statestringallRestricts to active, pending or closed proposals
proposalsPerSpaceinteger20Caps proposals per space, newest first
maxItemsinteger0Caps 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 groupFields
Identitystatus, space, proposalId, title, author, url
Contentbody, choices, type
StateproposalState, startsAt, endsAt, snapshotBlock
Resultvotes, scores, scoresTotal, quorum
TimingvalidFrom, 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 ApifyClient
client = 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.

EventFree tierTop volume tier
Record with data$0.002$0.0007
Actor start$0.00005 per GBSame

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

IssueSolution
A space returns failedThe 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 nothingNo vote is open in those spaces right now. Try pending to see what is queued, or all.
quorum is missingThat space sets no quorum, which is common. Read scoresTotal against the space's own rules instead.
scores looks huge next to votesThey measure different things. votes counts voters and scores sums voting power, which is token-weighted.
Fewer proposals than the space hasProposals 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.

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.