1
static
URL in. HTML, markdown, or JSON out. Batch with a webhook.
$ curl -s https://fetchflat.dev/v1/fetch \
-H "Authorization: Bearer ff_live_…" \
-d '{"url":"https://example.com","format":"markdown"}'
{
"ok": true,
"credits": 1,
"data": { "title": "Example Domain", "markdown": "…" }
}
$ curl -s https://fetchflat.dev/v1/extract \
-H "Authorization: Bearer ff_live_…" \
-d '{"url":"https://example.com",
"schema":{"type":"object",
"properties":{"title":{"type":"string"}},
"required":["title"]}}'
{
"ok": true,
"credits": 5,
"data": { "json": { "title": "Example Domain" } }
}
$ curl -s https://fetchflat.dev/v1/batch \
-H "Authorization: Bearer ff_live_…" \
-d '{"webhook":"https://you.example/hooks/ff",
"items":[{"id":"sku-1","url":"https://example.com"},
{"id":"sku-2","url":"https://example.org"}]}'
{ "ok": true, "job_id": "5c1d…", "total": 2 }
# each item → POST {"job_id","item_id","ok","credits","data","error"}
HTML or markdown. Script, style, nav, footer stripped. Main content preferred.
{"url":"…","format":"markdown"}Fetch, then a model fills your schema. Invalid output is an error, not a guess.
{"url":"…","schema":{"type":"object"}}One request, one job id, one POST per item to your endpoint. 3 retries.
{"webhook":"https://…","items":[…]}| Fetchflat | ScrapingBee | Firecrawl | |
|---|---|---|---|
| Single URL fetch | Yes | Yes | Yes |
| JS render | 8 credits | Multiplier | Yes |
| Residential proxy | 25 credits | Multiplier | Their proxy options |
| Schema extract | fetch + 4 | Not the core | Yes |
| Batch + your webhook | Yes | Not the pitch | Not the pitch |
| Crawl / map | — | — | Yes |
| Screenshots / SERP | — | Yes | — |
| Credit math | Flat 1 / 8 / 25 | Multipliers | Their units |
Details: Fetchflat vs ScrapingBee · Fetchflat vs Firecrawl
USD before tax. Creem adds VAT/GST at checkout. Top-up: $20 for 15,000 credits, never expires.