Market research doesn't arrive as a steady stream. It arrives as a question: how does this category price, who is moving upmarket, which competitor just dropped its free tier. You answer it in a week, then nothing for a month or two.
The top results for this phrase are lists of research tools priced by the month. With a market research api pay as you go, you pay for the calls a study makes and nothing in between. The lead enrichment version of this post covers how per-call billing works and when a plan beats packs. This one covers two things that matter for research: what a single question costs, and how to stop it costing more.
What does one market research question cost?
Every call has a published price, so you can cost a study before you run it:
| Call | Credits | ≈ Cost at $0.003 |
|---|---|---|
search_web, per query | 5 | $0.015 |
map_site, per domain | 2 | $0.006 |
scrape with a question, per page | 3 | $0.009 |
serp_rank, per keyword | 5 | $0.015 |
deep_research, per run | 10 | $0.03 |
Take "how do help-desk tools price: per seat, per usage or flat?". Three searches to build the vendor list (15 credits), one question against each of 30 pricing pages (90), and one deep_research run for category context (10). That comes to 115 credits, about $0.35. The free signup grant of 1,000 credits covers eight studies that size.
The estimate is a ceiling, not a guess. A search that fails is not charged, and neither is a page that fails to load. The RevOps post shows how the question format answers from the page's own sentences.
How do you cap what a study can spend?
There are two limits, one in your code and one in your account.
The one in your code is a budget per study. Every response reports credits_used, so the study can count what it has spent and refuse the next call if that call could go over:
const API = 'https://www.crawlforge.dev/api/v1/tools/'
const headers = {
'X-API-Key': process.env.CRAWLFORGE_API_KEY ?? '',
'Content-Type': 'application/json',
}
// One study, one budget in credits. Each call states its published price, and
// the guard refuses any call that could take the study past its budget.
export function study(budget: number) {
let spent = 0
return async function call(tool: string, body: object, price: number) {
if (spent + price > budget) throw new Error(`Budget reached: ${spent} of ${budget} credits`)
const res = await fetch(API + tool, { method: 'POST', headers, body: JSON.stringify(body) })
if (res.status === 402) throw new Error('Balance empty. Nothing was charged.')
if (!res.ok) return null
const json = await res.json()
spent += json.credits_used
return json
}
}
const call = study(150)
const question = 'Is this product priced per seat, per usage, or at a flat rate?'
// Search results include listicles; keep only vendors' own pricing pages in practice.
const found = await call('search_web', { query: 'help desk software pricing', limit: 30 }, 5)
for (const result of found?.data.results ?? []) {
const page = await call('scrape', { url: result.url, formats: [{ type: 'question', question }] }, 3)
console.log(result.url, page?.data.formats.answer?.text ?? '(no answer)')
}The one in your account is the balance. It is prepaid, so when it can't cover a call the API returns 402 INSUFFICIENT_CREDITS, charges nothing and sends no invoice. Auto-recharge is off by default. If you turn it on, it runs against a monthly spend cap you set. A script with a bug in its loop therefore stops at the balance, and never runs up a bill.
What doesn't this API research?
CrawlForge reads public web pages: pricing, product, careers and docs pages, plus search results. It doesn't run surveys, recruit panels, sell syndicated reports or estimate market size or traffic. For those you need a research vendor. CrawlForge covers the desk research that comes before or alongside one, and the consultants post shows what that looks like across a full engagement.
Start free with 1,000 credits and cost your first question before you run it.