scrape_template
20 pre-built extractors: popular sites, six ATS job boards read through the platform's own documented public API, and keyless government APIs. No schema, no selectors, no LLM — pass a template name with a URL or params. 1 credit per call, however many records come back.
Use Cases
Quick E-Commerce Data
Pull Amazon product price, rating, and stock without writing a single selector.
Developer Profile Aggregation
Combine GitHub repos, npm packages, and Stack Overflow activity into one developer view.
Social Media Monitoring
Track Product Hunt launches and Hacker News with a single endpoint per source; for Reddit, read a post with reddit-thread and its comment tree with reddit_search.
Whole Job Boards in One Call
Read every published role from a company's Greenhouse, Lever, Ashby, Workable, Recruitee or Teamtailor board — exact values from the platform's own API, not parsed out of a careers page.
Endpoint
/api/v1/tools/scrape_templateParameters
list needs neither and auto always needs a url. A page template needs a url; a platform-API connector takes params, or a board URL it resolves to the API endpoint itself.| Name | Type | Required | Default | Description |
|---|---|---|---|---|
template | string | Required | - | Template name — one of the 20 supported templates. Send `"auto"` to have the template picked from the `url`; the response reports the id it chose, never the literal `"auto"`. Send `"list"` to discover them programmatically. Example: github-repo |
url | string | Optional | - | URL to scrape. Required unless `template` is `"list"`, or you are calling a connector by `params` instead. Example: https://github.com/mysleekdesigns/crawlforge-mcp |
params | object | Optional | - | Inputs for a connector that reads a platform API rather than a page — the board identifier for a job board (`company`), `store` and `collection` for `shopify-collection`, `vin` for `nhtsa-vin`, the registry's own search fields for `npi-provider`. Connector-specific extras go here too: Greenhouse `content: true`, Workable `details: true`, Lever `skip`/`limit`, Teamtailor `per_page`/`offset`. A missing required input is refused with the parameter named. Example: { "company": "stripe" } |
timeout | number | Optional | 15000 | Request timeout in milliseconds (5000–60000). Example: 15000 |
respect_robots | boolean | Optional | true | Respect the target site's robots.txt. Left at `true`, a path disallowed for `CrawlForge` is refused with 403 before anything is fetched and no credits are charged. Set it to `false` only for a target you have your own agreement with — the response then carries a `warnings` entry and the override is recorded against your API key. Example: true |
Templates: pages and products
20 templates in three groups. Each returns a normalized JSON shape tuned for its source.
amazon-productshopify-productsource: json-ld with a warning; per-variant stock, compare-at prices and option names are not in JSON-LD, so those fields are nullshopify-collectionproducts.json, with the same authoritative price and stock shopify-product returns for one item. 30 per page by default, 250 at mostgithub-repoyoutube-videoreddit-threadhacker-news-front-pageproducthunt-launchstackoverflow-questionnpm-packageTemplates: job boards
Six applicant tracking systems, each read through the endpoint that platform documents for public, unauthenticated use. All six normalize onto one job shape, so two boards union without per-source mapping — the job board APIs guide covers the shape and the reasoning.
greenhouse-jobscontent: truelever-postingsskip/limit pagingashby-jobsdescriptions: trueworkable-jobsdetails: truerecruitee-offersteamtailor-jobstt: namespace intact. 100 jobs unless per_page says otherwiseTemplates: government APIs
Free, keyless US federal APIs, documented by the agencies that publish them.
nhtsa-vinraw. Partial VINs accepted; vPIC's own error codes are surfaced rather than swallowednpi-providerList connectors return many records from one call
A connector that reads a listing endpoint returns items and count under data instead of one record. shopify-collection and all six job-board connectors work this way.
- Every job record carries the same twelve fields —
id,title,url,location,department,team,employment_type,remote,published_at,updated_at,description,source— and a field the platform does not publish isnull, never a guess. - Pass the board identifier in
params, or pass a board URL and the connector resolves the API endpoint itself. - Greenhouse, Workable and Ashby make descriptions opt-in because they dominate the payload: a large Greenhouse board goes from 349 KB to 4.2 MB with
content: true, and OpenAI's 767-job Ashby board is 5.9 MB withdescriptions: true. - Cost is a flat 1 credit per call, however many records come back.
{ "template": "list" } (no url required) to fetch the full list with each entry's mode — list for a connector that returns many records from one call, entity for one that returns a single record. Useful for keeping client SDKs in sync.Deliberately not shipped
smartrecruiters-postings is absent: SmartRecruiters documents its Posting API publicly, but api.smartrecruiters.com/robots.txt disallows everything for every agent except LinkedInBot (verified 2026-08-28), and we did not override robots.txt to reach it. Workday's wday/cxs endpoint is a careers site's own internal endpoint rather than a documented public API, so no connector reads it either. The job board APIs guide sets out what else is out of scope, and why.Request Examples
cURL — github-repo
curl -X POST https://crawlforge.dev/api/v1/tools/scrape_template \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"template": "github-repo",
"url": "https://github.com/mysleekdesigns/crawlforge-mcp"
}'TypeScript — amazon-product
const response = await fetch('https://crawlforge.dev/api/v1/tools/scrape_template', {
method: 'POST',
headers: {
'X-API-Key': process.env.CRAWLFORGE_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
template: 'amazon-product',
url: 'https://www.amazon.com/dp/B08XYZ1234',
timeout: 20000,
}),
});
const data = await response.json();
if (data.success) {
const product = data.data.extracted;
console.log(product.title, product.price, product.rating);
}cURL — discover templates
curl -X POST https://crawlforge.dev/api/v1/tools/scrape_template \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "template": "list" }'cURL — greenhouse-jobs by params
curl -X POST https://crawlforge.dev/api/v1/tools/scrape_template \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"template": "greenhouse-jobs",
"params": { "company": "stripe" }
}'Response Example
{ "success": true, "data": { "template": "greenhouse-jobs", "params": { "company": "stripe" }, "data": { "items": [ { "id": "4012345", "title": "Staff Software Engineer", "url": "https://job-boards.greenhouse.io/stripe/jobs/4012345", "location": "Seattle, Washington, United States", "department": null, "team": null, "employment_type": null, "remote": null, "published_at": "2026-08-04T17:12:03.000Z", "updated_at": "2026-08-21T09:44:51.000Z", "description": null, "source": "greenhouse-jobs", "raw_extra": { "internal_job_id": "4098765", "requisition_id": "REQ-1234", "offices": null } } ], "count": 571, "company": "Stripe" }, "template_name": "Greenhouse Job Board", "extracted_at": "2026-08-28T12:00:00.000Z", "fetched_url": "https://boards-api.greenhouse.io/v1/boards/stripe/jobs" }, "credits_used": 1, "credits_remaining": 999, "processing_time": 812}data.data.itemsOne record per published job, in the twelve-field shape every job-board connector sharesdata.data.items[0].departmentGreenhouse ships departments only with `content: true`, so a summary record reports null rather than a department guessed from the titledata.data.countRecords in this response; a source that declares a larger total also reports `total_available`data.template_nameHuman-readable name of the template that randata.fetched_urlThe endpoint actually read — present whenever it differs from what you passed, which includes every params-only callcredits_usedFlat 1 credit per call, regardless of template or record countError Handling
Connector could not build a request (400 Bad Request)
A parameter problem, refused before anything is fetched and never billed. INVALID_TEMPLATE_PARAMS carries the connector's own message naming the parameter it wanted — the board token in job-boards.greenhouse.io/<token>, the subdomain in <company>.recruitee.com. MISSING_URL means you sent params to a template that reads a page and has no params form. NO_TEMPLATE_MATCH means template: "auto" recognised nothing in the URL — name the template yourself, or check it against template: "list".
Blocked by robots.txt (403 Forbidden)
The target site's robots.txt disallows this path for CrawlForge. Set respect_robots: false to override if you have your own agreement with the target — the override is recorded against your API key. The override does not reach a host on CrawlForge's permanent opt-out list, which is refused whatever respect_robots is set to. The check runs against the URL the template actually fetches, which for shopify-product and npm-package is a machine-readable endpoint on the same host rather than the URL you passed.
Credit Cost
Tip: Need a site that isn't supported? Use scrape_structured for custom selectors (2 credits) or extract_with_llm for LLM-powered extraction.