web.extract API
One page in, dated records out: a leadership page, an official bio, an org chart, a press release or a job listing extracted against a template (or your own JSON schema), each record with the sentence on the page that supports it, the page date and the source URL. Watch-friendly: records key on the person or posting, so a weekly refresh reports who joined, left or changed title.
Firecrawl:
all inputs ✓
✓ marks a combination proven with a real provider call. Others are wired and unit-tested; their first live run verifies them.
| Provider | Status |
|---|---|
Firecrawl |
live |
Unit: per_page · unmatched results billed: no
Priced per page at the extraction rate, about five times a plain scrape. A page that yields no records is a miss and releases the hold. Every record carries source_url, source_date (the page date when stated) and evidence_text, the line on the page behind it.
The exact quote is returned by /v1/inspect before every call and held with headroom on execution. The quote is the price floor: if the provider's actual cost overruns it, the run bills the overrun at the same rate, never above the hold. The unused part of every hold is released.
curl https://api.routergrowth.com/v1/run \ -H "Authorization: Bearer $ROUTERGROWTH_API_KEY" \ -d '{ "capability": "web.extract", "input": { "url": "..." }, "routing": {"provider": "auto"} }'
{
"properties": {
"prompt": {
"description": "Extra guidance for the extractor; the template carries a default",
"type": "string"
},
"schema": {
"description": "Your own JSON schema (type: object) instead of a template; put the list under a `records` array so watches can diff it",
"type": "object"
},
"template": {
"description": "What kind of page it is; decides the record shape",
"enum": [
"leadership_page",
"official_bio",
"org_chart",
"press_release",
"job_posting"
],
"type": "string"
},
"url": {
"description": "Absolute URL of the page",
"type": "string"
}
},
"required": [
"url"
],
"type": "object"
}
url · title · template · page_date · records · markdown