Merkl DeFi Rewards Scraper avatar

Merkl DeFi Rewards Scraper

Pricing

from $1.20 / 1,000 opportunity results

Go to Apify Store
Merkl DeFi Rewards Scraper

Merkl DeFi Rewards Scraper

Scrape every Merkl reward opportunity across all chains: reward APR, TVL, daily rewards in USD, days of campaign left, rewards per $1M deposited (crowding) and a 0-100 opportunity score. HTTP-only, no API key, no login.

Pricing

from $1.20 / 1,000 opportunity results

Rating

0.0

(0)

Developer

Mr Zack

Mr Zack

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

Merkl DeFi Rewards Scraper — APR, TVL, Runway & Crowding

Merkl is where a large share of on-chain incentive budgets are actually distributed: ~740 live reward opportunities across every major chain, paying out roughly $470,000 per day at the time of writing. The app shows you a pretty grid. It does not tell you the two things that decide whether a position is worth taking: how long the rewards last, and how crowded the pool already is.

This Actor returns every Merkl opportunity as one clean row — reward APR, TVL, daily rewards in USD, days of campaign left, rewards paid per $1M already deposited, and a 0-100 opportunity score you can sort by.

No API key, no login, no browser, no residential proxy. HTTP-only, so a full pull takes seconds.

Who is this for?

  • Yield farmers & DeFi power users — stop refreshing the Merkl app. Sort by score, filter to the chains you actually bridge to, and see which campaigns die this week before you commit capital.
  • Treasuries & DAO contributors — benchmark your own incentive program: what APR do comparable pools advertise, and what does it cost per day to hold that TVL?
  • Quant & research desks — the on-chain incentive market as a dataset: APR, budget and TVL per protocol per chain, pullable on a schedule for time series.
  • AI agents (MCP) — pay-per-event Actors are callable as tools. "Which live stablecoin pool on Base pays over 15% and runs for at least two more weeks?" becomes a single tool call.

What one row looks like

FieldExampleNotes
name, protocol, chain, actionDeposit USDe as collateral…, Morpho, Base, LENDaction is what you must actually do: POOL / LEND / BORROW / HOLD / STAKE / DROP
rewardAprPct4.16reward APR as published. null when Merkl publishes none — never a fabricated 0
tvlUsd351099481.95depth: a deep pool means your deposit will not move the APR
dailyRewardsUsd40056.84USD of rewards flowing per day — proof the budget is real
rewardsPerMillionUsd114.09the crowding signal: daily rewards ÷ TVL in millions. Two pools can advertise the same APR while one is 100× more contested
daysLeft, campaignEndsAt, endingWithin7Days6.9, ISO date, truerunway. A 200% APR that ends tomorrow is not an opportunity
daysUntilStart, campaignStartsAt1.3, ISO datefor SOON campaigns — get in on day one
tokens, rewardTokens["USDe"], ["MORPHO"]what you deposit vs what you get paid in
depositUrl, merklUrldirect linksstraight to the position, or to Merkl's page
opportunityScore72.4see below

Any value Merkl does not publish comes back null — never a fabricated zero. Dust-sized campaigns (a pool paying $0.0035/day) keep their precision instead of being flattened to 0.

How the opportunity score works

Deliberately simple, documented, reproducible — so you can argue with it:

  • 45% reward APR, saturating at 30%. Above that, the number is usually a thin pool or a short burst, not a durable yield.
  • 25% runway — 7+ days left is full marks; a campaign ending within a day scores almost nothing.
  • 20% pool depth — TVL log-scaled $10k → $10M. A tiny pool's advertised APR is fragile; it collapses the moment real money arrives.
  • 10% rewards actually flowing — a published budget that pays out beats one that does not.

PAST campaigns and opportunities with no published APR score null rather than a misleading number.

Input examples

The default board — everything live, best first:

{ "statuses": ["LIVE"], "sortBy": "opportunity" }

Serious money only, with runway (stablecoin farmer):

{
"statuses": ["LIVE"],
"minRewardAprPct": 10,
"minTvlUsd": 500000,
"minDaysLeft": 7,
"searchText": "USDC",
"sortBy": "apr"
}

Least-crowded pools on one chain:

{ "chains": ["Base"], "minDailyRewardsUsd": 100, "sortBy": "rewardsPerMillion" }

Get in on day one:

{ "statuses": ["SOON"], "sortBy": "startingSoon" }

Exiting before the music stops:

{ "statuses": ["LIVE"], "sortBy": "endingSoon", "maxItems": 50 }

Reward campaigns rotate constantly: APRs move as TVL arrives, budgets run dry, and new campaigns land daily. A scheduled run is how you find out before your APR quietly halves.

  1. Run the Actor once with your input and check the results.
  2. On the Actor page open the menu and choose Schedule Actor (or go to SchedulesCreate new).
  3. Set the cron expression:
    • 0 */6 * * * — every 6 hours. Good default: catches new campaigns and APR drops the same day.
    • 0 8 * * * — once each morning. Cheapest useful cadence.
    • 0 * * * * — hourly, when you are actively rotating capital between campaigns.
  4. Attach a tight saved input (minTvlUsd, minDaysLeft, a chain filter, maxItems: 50) — a filtered run costs a fraction of a cent.
  5. Add an integration so the board comes to you: Integrations → Slack / Discord webhook / Google Sheets / Zapier / Make, triggered on Run succeeded.

Catching launches: schedule { "statuses": ["SOON"], "sortBy": "startingSoon" } daily — anything new at the top is a campaign that has not been farmed yet.

Watching for the exit: schedule { "sortBy": "endingSoon", "maxItems": 30 } and you get a standing list of positions to unwind this week.

Why this Actor

  • The only Merkl dataset on the Store (checked Aug 2026) — everywhere else you get the app's grid, not a queryable table.
  • Signals the API does not give you — runway, crowding and score are computed here, from a single run. No snapshot, no second run, no extra charge.
  • HTTP-only — a full 737-row pull finishes in seconds, and no proxy cost is baked into the price.
  • Honest nulls — placeholder zeros from the upstream API are reported as null, so a filter like "APR ≥ 5%" does not silently include unknowns.
  • Pay per event — a tiny start fee plus a per-row fee. A filtered daily run costs well under a cent; the full live board is about $0.89.
  • No free-plan cap — free-plan users get the same board as everyone else.

Also hunting security payouts? Same treatment for two other money boards: Immunefi bug bounties and Web3 audit contests across Code4rena, Sherlock, CodeHawks & Cantina.

FAQ

Is this legal? The Actor reads Merkl's public API — the same data the public app shows without logging in. No login, no private data, no bypassing access controls. Review Merkl's terms for your specific use case.

Why is rewardAprPct null on some rows? Merkl publishes 0 for opportunities where no APR is computed yet. A live campaign with a genuine 0% reward APR does not exist, so reporting 0 would be a lie — we report null and leave those rows out of APR filters.

Is opportunityScore financial advice? No. It is an arithmetic ranking of four published numbers, fully documented above so you can disagree with it. Nothing here is investment advice; verify every position yourself before committing capital.

Does this claim rewards for me? No. It is read-only data. Claiming happens in your own wallet on Merkl.

Why does APR here differ from another dashboard? Merkl's APR counts the incentive rewards it distributes, not the underlying protocol yield. Total return on a position is usually the base yield plus this reward APR.

Found a bug, or want another field (per-campaign breakdown, historical APR)? Open a ticket on the Issues tab.

Changelog

  • 0.1 — Initial release: every Merkl opportunity across all chains, honest nulls, campaign runway, crowding metric (rewardsPerMillionUsd), opportunity score, seven sort orders, pay-per-event.

Was this Actor useful?

If it saved you from parking capital in a campaign that ended two days later, a short review on the Store page helps other farmers decide whether to try it. Reviews are the only signal buyers have before they spend anything.

If something is wrong instead, please open a ticket on the Issues tab rather than leaving it broken — API drift and field requests get fixed.