Scheduled crawls
Scheduled crawls with a ceiling on every single request
A crawl is a loop you leave alone. Backfire gives that loop a fixed request shape, a hard ceiling on each response, and a balance you can predict before scheduling the next run.
Where it goes wrong
Crawl code drifts: one script follows redirects, another has no timeout, a third writes a 40 MB page into memory. Cost is discovered at the end of the month instead of at the top of the run.
What Backfire handles
- Every page is one trip, so a 4,000-page run costs 4,000 trips and nothing else.
- Request and response sizes are bounded per call, so one huge page cannot blow up a worker.
- Redirects are returned rather than followed, which keeps the crawl graph explicit.
- The exact URLs fetched sit in the activity log, exportable as CSV or JSON for reconciliation.
The request
example
for (const page of pages) {
const res = await fetch('https://backfireapi.base44.app/functions/forward', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.BACKFIRE_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ url: page, method: 'GET', timeout_ms: 10000 }),
});
const envelope = await res.json();
if (!envelope.ok) { skipped.push([page, envelope.error.code]); continue; }
if (envelope.upstream.status === 200) save(page, envelope.body.text);
if (envelope.quota.remaining < 100) break; // stop cleanly before the balance runs out
}All use cases
Questions about this
Keep reading
Try it with 5,000 free trips.
No card, no subscription, and the balance never expires.

