Skip to content

CrawlForge TeamEngineering Team

4 min read

Market Research API for Agencies: One Setup, Every Client

An agency's research problem is rarely one hard question. It is the same handful of questions, for every client, every month, plus a fresh landscape whenever new business wants a pitch deck by Thursday.

A market research api for agencies has to be built for that repetition: one setup that runs the whole roster, a cost you can split by client, and a fast first pass on a prospect you have not won yet. CrawlForge is the web layer for that. It reads the public pages and search results you point it at and returns what they say. It is not a market-size or contact database.

What does the monthly client report need?

For most agencies, two things per client: where the client ranks against its competitors for the searches that matter, and what those competitors changed on their own sites. Both are public, both move monthly, and neither sits in a dataset you can license by the row.

Two calls cover them:

  • serp_rank (5 credits) returns a domain's organic Google position for one keyword, checked from the location_name, language_code and device you set per client. The response carries found, rank, the ranking url and checked_at.
  • scrape with a question format (3 credits) returns the five sentences on a competitor's page that best answer your question, verbatim, each with an offset. The RevOps post covers how that format behaves; here it is one row in a template.

How do you run one template across every client?

Keep everything client-specific in data, not in code. Each client is a small config: its domain, its market, its keywords, its competitors and the questions you ask of their pages.

Json
{
  "client": "Northwind",
  "domain": "northwind.co.uk",
  "location_name": "United Kingdom",
  "device": "mobile",
  "keywords": ["office cleaning contracts", "commercial cleaning manchester"],
  "competitors": ["rival-a.co.uk", "rival-b.co.uk", "rival-c.co.uk"],
  "pages": ["https://rival-a.co.uk/pricing", "https://rival-b.co.uk/services"],
  "questions": ["What is the minimum contract length?"]
}

One workflow then loops over the roster. For each keyword it calls serp_rank once for the client and once per competitor, since each call locates one domain. For each competitor page it runs one scrape per question.

Bash
curl -X POST https://crawlforge.dev/api/v1/tools/serp_rank \
  -H "X-API-Key: cf_live_NORTHWIND_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "keyword": "office cleaning contracts",
    "target": "northwind.co.uk",
    "location_name": "United Kingdom",
    "device": "mobile"
  }'

In n8n that loop is a node that reads the configs feeding two HTTP Request nodes (the n8n setup is in the docs); in a script it is two nested loops. Client thirteen is a new config file, not a new workflow.

Give each client its own named API key and the request log splits the month's spend by client, which the consultants post walks through. An account holds ten keys, so past ten clients, group them by retainer.

How do you research a prospect before the pitch?

Start with one deep_research run for 10 credits. Give it the prospect's category and market, and it searches, fetches up to ten sources and returns the best-matching passages verbatim with a sources list of URLs. Then run serp_rank on the prospect's three most obvious keywords for 15 more.

That is 25 credits per prospect, under a dime at pack rates, and it puts a "where you rank today" slide in the deck. That slide tends to start the conversation, and it costs almost nothing when the pitch is lost.

What does a roster cost each month?

Twelve clients, each with five keywords, three competitors, six competitor pages and two questions per page:

LineCallsCredits
Rank checks: 5 keywords × 4 domains × 12 clients2401,200
Competitor pages: 6 pages × 2 questions × 12 clients144432
Four pitch prospects16100
Monthly total1,732

That is about $5 a month at the one-time 5,000-credit pack rate ($14), with no seats and no monthly minimum. Rank checks are the expensive line, because they multiply keywords by domains, so trim competitors from the rank loop before you trim keywords.

What won't it do?

  • No market sizing. No TAM, panels or survey data. If the deck needs a market-size figure, it comes from a report.
  • No contact or firmographic data. It reads pages and search results. It is not a company database.
  • No client-facing portal. There is no white-label dashboard; the report is whatever you build from the rows.
  • robots.txt is respected by default on the pages you scrape. A disallowed page is refused before it is fetched and costs nothing.

If a client wants to hear when a competitor's page changes rather than reading about it at month end, that is a monitor per client, not a more frequent run of this.

Start free with 1,000 credits. That is enough to run this template for seven clients for a month before you wire it into the whole roster.

Try this yourself — no signup needed

Explore all 31 CrawlForge scraping and extraction tools in the playground, then start free with 1,000 credits.

1,000 free credits • One-time • No credit card required

Tags

  • agencies
  • market research
  • serp_rank
  • scrape
  • deep_research
  • b2b

About the Author

CrawlForge Team

Engineering Team

Building the most comprehensive web scraping MCP server. We create tools that help developers extract, analyze, and transform web data for AI applications.

Newsletter

Stay updated with the latest insights

Get tutorials, product updates, and web scraping tips delivered to your inbox.

No spam. Unsubscribe anytime.

FAQ

Frequently asked questions

01Is CrawlForge a market research data provider for agencies?

No. It holds no market-size estimates, panels, survey data, firmographics or contact records. It reads the public pages and Google results you point it at and returns what they say, with a URL and a timestamp. For an agency that makes it the layer that fills the recurring rank and competitor sections of a client report, alongside any syndicated data you already license.

02Can serp_rank check a client's ranking in their own country and on mobile?

Yes. Each call takes a keyword and a target domain, plus location_name (for example 'United Kingdom' or 'London,England,United Kingdom') or a numeric location_code, a language_code, and device set to desktop or mobile. It scans 10 to 200 results (100 by default) and returns found, rank, the ranking URL, every position the domain holds and checked_at. A lookup that fails upstream is not charged.

03How do I keep each client's spend separate?

Create a named API key per client and run that client's calls with it. Every call writes a request-log row with the key, the tool, the target URL and the credits charged, and the log filters by key and exports as CSV. An account holds up to ten keys, so an agency with a larger roster groups clients by retainer and filters the rest by target domain.

04Can I run the template from n8n or Make?

Yes. Every tool is a plain POST endpoint authenticated with an X-API-Key header, so an HTTP Request node in n8n, or the equivalent module in Make or Zapier, can call it inside a loop over your client configs. Nothing needs to be self-hosted for the REST path.

05Do I need a monthly plan to run this for clients?

No. The free tier is a one-time 1,000 credits, enough to run the template in this post for about seven clients for a month. After that, one-time credit packs cost $3 for 1,000 credits and $14 for 5,000, so a roster that costs 1,700 credits a month can be topped up as needed. Paid plans exist for agencies that would rather have a monthly allocation.

Keep reading

Related Articles