On this page
If you are picking a scraping stack in 2026, three names show up on every shortlist. Firecrawl is the five-verb API that ate most of the "just give me markdown" market since 2024. Apify is the ten-year-old actor marketplace with a catalog of pre-built scrapers and a full orchestration layer. Stekpad is the API-plus-datasets-plus-MCP pivot we shipped in 2026 to answer a different question: what if the storage, the enrichment, and the agent layer were all first-party?
This post compares all three. Not a marketing comparison — a technical one. The contract each product exposes, the verb coverage, the pricing models, the authentication story, the MCP support, the enrichment story, the storage story, and an honest "when each one wins" section. Same curl across all three APIs at the end, so you can see the ergonomic differences without reading three sets of docs.
If you are already deep into one of them, stay where you are — switching costs are real. If you are starting fresh, this post is the map.
What each product actually is
The three products overlap in name ("scraping API") and in surface shape ("I send a URL, I get data"), but the contract underneath is different in each case.
Firecrawl
Firecrawl's contract is sync-first scraping returns markdown by value. You call POST /v1/scrape with a URL, you get back a JSON response with a markdown field, a metadata object, and optional structured extract. You call POST /v1/crawl with a URL and include/exclude rules, you get back a job id you poll until it completes, and then you page through the results. Five verbs on the API: scrape, crawl, map, extract, search. The Firecrawl team shipped a community MCP server in 2024 that wraps the same API. They ship an open-source self-host version.
What Firecrawl does not ship, by design: a persistent database of your scrapes, native enrichers, a cookie bridge. Their story is "we return the content, you store it". That is a valid story and it keeps the product lean.
Apify
Apify's contract is general-purpose actor marketplace. An actor is a containerized scraper (Node, Python, or anything in a Docker image). You run an actor against a target, the actor returns a dataset, and you pay per actor run and per compute minute. The marketplace has over 5,000 actors — a Google Maps scraper, a LinkedIn profile scraper, a generic crawler called web-scraper, dozens more per category. Apify runs the compute, provides the storage, and handles the rate-limiting and proxying.
Apify is not really a five-verb API — it is a platform you build on top of. If you want the "just scrape this URL" experience, you call the apify/cheerio-scraper or apify/web-scraper actor. If you want something specific, you find the actor or write one. The contract is per-actor.
Stekpad
Stekpad's contract is five verbs plus dataset storage plus 19 native enrichers plus MCP. You call POST /v1/scrape and the response is both the content and a row id in a persistent dataset you can re-query. You call POST /v1/crawl and every page lands in the same dataset. You attach an enrichment pipeline to the dataset, new rows are enriched automatically, and the whole thing is also exposed as an MCP server with eight tools. The homepage and the vs/firecrawl page walk the full surface.
The difference is not in the verbs — the verbs are the same shape across Firecrawl and Stekpad. The difference is in what happens after the verb returns.
The 5 verbs — coverage and shape
How each product covers the standard five-verb API.
scrape
- Firecrawl: native, sync, markdown / HTML / JSON / screenshot. 1 credit per page on most plans.
- Apify: via an actor (for example
apify/cheerio-scraperfor a static page orapify/puppeteer-scraperfor rendered pages). Not a single verb, a choice of actors. - Stekpad: native, sync, markdown / HTML / JSON / screenshot. 1 credit. Result also stored in a dataset.
crawl
- Firecrawl: native, async, returns job id, dedupe by canonical URL, webhook support. 1 credit per page.
- Apify: the
apify/web-scraperactor covers this, with include/exclude rules and a queue. Billed per compute minute plus a per-result surcharge. - Stekpad: native, async, webhook or polling, canonical dedupe, include/exclude paths. 1 credit per page. Every page lands in the dataset.
map
- Firecrawl: native, sitemap + robots + shallow walk, returns a list of URLs.
- Apify: no first-class verb — you build a sitemap fetch into your actor or use a generic sitemap actor.
- Stekpad: native, 1 credit per 1,000 URLs, same shape as Firecrawl.
extract
- Firecrawl: native, LLM-backed, JSON schema input, single-model pipeline.
- Apify: via
apify/ai-web-agentor a custom actor. Pricing depends on the actor. - Stekpad: native, LLM cascade Gemma to Haiku to Sonnet through Vercel AI Gateway, two automatic retries on schema failure, 5 credits per URL.
search
- Firecrawl: native, optional in-call scrape of the top results.
- Apify: via search-specific actors (Google SERP, Bing SERP, etc.), billed per actor run.
- Stekpad: native, Brave Search by default, optional in-call scrape, 5 credits plus 1 per scraped result.
The takeaway: Firecrawl and Stekpad have the same verb surface. Apify does not really have verbs — it has actors, which is either a feature (flexibility) or a friction (you have to know which actor to call).
The same scrape, three ways
Concrete is better than abstract. Here is the same scrape — fetch https://example.com and get back markdown — in all three APIs.
Firecrawl
curl -X POST https://api.firecrawl.dev/v1/scrape \ -H "Authorization: Bearer fc-..." \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com", "formats": ["markdown"] }'Response is a JSON object with data.markdown, data.metadata, and a success flag. You get the content by value. You store it yourself.
Apify
curl -X POST "https://api.apify.com/v2/acts/apify~cheerio-scraper/run-sync-get-dataset-items?token=apify_api_..." \ -H "Content-Type: application/json" \ -d '{ "startUrls": [{ "url": "https://example.com" }], "pageFunction": "async function pageFunction(context) { return { markdown: context.request.loadedUrl + \"\\n\" + context.$(\"body\").text() }; }" }'Response is an array of dataset items produced by the actor. You pick an actor, you pass a start URL, and you write a pageFunction in JavaScript that runs inside the actor and extracts what you want. For a simple markdown scrape this is a lot of ceremony — but for a custom job you could not have expressed as a simple verb, it is powerful.
Stekpad
curl -X POST https://api.stekpad.com/v1/scrape \ -H "Authorization: Bearer stkpd_live_..." \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com", "formats": ["markdown"], "dataset": "scraped-pages" }'Response is a JSON object with run_id, credits_charged: 1, markdown, metadata, and dataset_row_id. The content is returned by value and stored in the scraped-pages dataset you can query later for free.
The line count tells a story. Firecrawl and Stekpad are equally short. Apify is longer because you are describing a custom program, not calling a verb.
Pricing model
Firecrawl
- Shape: subscription, monthly reset. Free trial, then ~$16–$333 per month depending on tier.
- Credits: 1 per page for
scrapeandcrawl, more forextract. Overage is capped at the plan limit. - Expiry: monthly reset on credits.
- No subscription option: limited free trial, not a true PAYG path.
Apify
- Shape: platform credit model, monthly subscription plus per-compute-minute billing on top. Starter around $49/month, scales to hundreds.
- Credits: not uniform — each actor has its own pricing. Compute minutes and storage are billed separately.
- Expiry: monthly reset on platform credits, rollover varies by tier.
- No subscription option: there is a "free tier" with limited platform credits, but real usage requires a paid plan.
Stekpad
- Shape: PAYG packs, no subscription required. 9 € for 2,000 credits, 99 € for 50,000 credits, 249 € for 200,000 credits. Optional Cloud plans on top for scheduling and webhooks.
- Credits: 1 per scrape, 1 per crawl page, 5 per extract, 5+1 per search result, 1 per enricher per row.
- Expiry: 12 months from purchase, 24 months on Bulk pack.
- Credit cost per 1,000 crawled pages on Pro pack: ~2 € (1 credit/page × 1,000 / 50,000 × 99 €).
The pricing story matters more than it looks. Firecrawl's monthly reset means unused credits evaporate. Apify's per-actor-plus-compute model means a simple scrape and a complex scrape look the same in the invoice, but a complex scrape can be 10× more expensive in compute minutes. Stekpad's one-time packs with 12-month expiry mean a quarterly project can buy once and spend over time.
Authenticated scraping
This is where the three products diverge the most.
- Firecrawl — accepts custom headers and cookies on the request. You pass a
Cookieheader or raw headers as part of the scrape call. The cookies pass through Firecrawl's infrastructure in cleartext during the request. They do not persist long-term, but they are in the request pipeline. - Apify — actors can accept cookies and sessions through input fields. Some actors use a Session Pool feature where cookies are stored in Apify's dataset for reuse across runs. That dataset sits on Apify's infrastructure.
- Stekpad — the cookie bridge. Cookies never touch Stekpad servers. The Chrome extension fetches the page in the user's own browser, attaches the user's own cookies locally, and posts back the rendered HTML. Architecturally, not as a policy.
For a public-web scrape, the three options are equivalent. For an authenticated scrape of a site you care about (Stripe, LinkedIn, your own admin panel), the three options are very different. The cookie bridge deep dive explains the full wiring.
MCP support
- Firecrawl — community MCP server, not first-party. Wraps the public API. No read tools for persistent state (because there is no persistent state).
- Apify — community MCP server, not first-party. Wraps the actor-run API. Can call actors as tools.
- Stekpad — first-party MCP server, eight tools, day-one launch. Reads are free (
list_datasets,get_dataset,query_dataset), writes are billed. Credits reported on every call so the agent can budget. Hosted HTTP MCP athttps://mcp.stekpad.com.
For teams building agents, this is the single biggest difference. Stekpad's MCP server is not an afterthought — every verb is an MCP tool from day one, and the free-read dataset tools are specifically designed so an agent can use the product as working memory without burning credits. The MCP guide for builders walks the full setup for Claude Desktop, Cursor, and Claude Code.
Enrichment
- Firecrawl — none. Bring your own enrichment stack. Common pairings: Clay, Hunter, Apollo, Clearbit.
- Apify — some actors act as enrichers (email finders, company lookups), each billed separately. Not a unified enrichment layer.
- Stekpad — 19 native enrichers in the box, 1 credit per row. Chained in dataset pipelines that run automatically on every new row. Zero third-party vendors except the opt-in premium
linkedin_enrich(Proxycurl). We wrote the long form at 19 native enrichers vs third-party vendors.
Storage
- Firecrawl — returns data by value. No persistent storage. You store it in your own database.
- Apify — every actor run produces a dataset on Apify's infrastructure. Datasets are retained per plan (7 to 30 days on lower tiers, longer on higher tiers). Actor-scoped, not unified.
- Stekpad — every scrape lands in a workspace-scoped persistent dataset that is re-queryable via REST, SDK, or MCP. Retention is 7 days on Free, 30 days on PAYG, 90 days on Cloud Starter, 1 year on Growth, unlimited on Scale.
The honest verdicts
When Firecrawl wins
- You need the content for a single agent call and you do not want to think about storage at all.
- You already have a dataset, a data warehouse, a Postgres — somewhere real to land the markdown — and you want a clean API to fetch it.
- You need an open-source self-hostable crawler today. Firecrawl ships one.
- You want Go or Rust SDKs in production right now. Firecrawl has them first-party. Stekpad's are community until v1.5.
- You want the simplest possible mental model: verb in, content out. Firecrawl is the tightest expression of that.
When Apify wins
- You need a specific pre-built scraper that already exists in their actor marketplace — Google Maps places, Airbnb listings, TikTok profiles. Rebuilding any of those is expensive.
- Your workload is dominated by long-running, stateful crawls where the per-compute-minute billing model is cheaper than a per-page credit model.
- You need to write custom scraper code that you cannot express as a verb — complex login flows, complex pagination, complex anti-bot evasion.
- You want to charge for your own scraper as an actor on their marketplace.
When Stekpad wins
- You want storage and enrichment as first-class parts of the product.
- You want a first-class MCP server for an AI agent on Claude, Cursor, or Claude Code.
- You need authenticated scraping without storing cookies on a third-party server.
- You prefer PAYG credits with 12-month expiry over a monthly subscription that resets.
- You are European and you care about data residency — your scraped data never leaves our stack.
- You want 19 enrichers in the same product, billed from the same wallet, running in the same worker pool.
Next steps
- Read the full 20-point Stekpad vs Firecrawl comparison.
- Read the Apify comparison for the actor-model side of the story.
- Try the same scrape across all three APIs — three
curls, 15 minutes, honest results. - Read The 5 API verbs that replaced my scraping stack for the narrative version of the Stekpad verb surface.
- If you are migrating off Firecrawl or Apify, talk to us — we will help you map the API shapes one-to-one.