Web page text extraction API
Send a URL, get the article back: title, author, clean text and positioned sections. One request — the content is already in the response.
curl https://api.techtuel.com/v1/extract \
-H "Authorization: Bearer txl_your_key" \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com/article" }'{
"id": "job_4a1e…",
"sourceType": "webpage",
"url": "https://example.com/article",
"title": "Article title",
"siteName": "Example",
"text": "Article standfirst…",
"charCount": 6820,
"segments": [
{ "text": "Article standfirst…", "charOffset": 0, "charLength": 19 },
{ "text": "First paragraph…", "sectionTitle": "Background",
"charOffset": 20, "charLength": 16 }
],
"cached": false,
"creditsCharged": 1
}Pulling the text out of a page is easy until you have to do it at scale. Raw HTML mixes the article with navigation, sidebars, consent banners and footers, and a hand-written CSS selector survives exactly until the site is redesigned.
POST /v1/extract takes the URL and returns the editorial content, stripped of everything that is not the article. You get flat text to feed a model, and the same passages split into sections carrying their position within that text — enough to quote a passage without re-splitting it yourself.
The call is synchronous: one request, one response, no job id and no polling loop. A page already extracted is served from cache and costs nothing.
Why this API
Sections, not one blob
Every passage carries its section heading and its position (charOffset, charLength) in the text. Slicing by those offsets reproduces the segment exactly — which truncating at N characters, cutting mid-word, cannot.
Nothing is truncated
The full text comes back, however long. Chunking depends on your model and your context window: that is your call, not ours.
A page extracted once serves everyone
The cache is global: a URL another account already read comes back with no new request to the site, and at no cost. You pay for the extraction, not for re-reading.
Failures that tell you what to do
422 when the page holds no readable text — paywall, JavaScript-only app, no prose: retrying is pointless. 503 when the site is rate limiting us: come back later. Two situations, two reactions, two distinct codes.
Pricing you can read
Frequently asked questions
How does this differ from POST /v1/transcribe?+
By what you want out of the URL. /v1/transcribe looks for media and returns its audio as text. /v1/extract reads the page and returns its article. The same address can qualify for both — an episode page carries audio AND show notes — so your call decides, rather than a guess on our side.
What happens on a paywalled page?+
You get a 422: the page was reached and parsed, but holds no usable text. That is terminal — retrying changes nothing. We do not work around any access control.
Do JavaScript-rendered pages work?+
No. Extraction reads the HTML the site serves, without executing JavaScript. A single-page app whose content only appears after execution returns a 422.
What are charOffset and charLength for?+
Locating a passage inside the text field. text.slice(charOffset, charOffset + charLength) reproduces the segment verbatim. That is what lets you cite a precise source in a generated answer instead of pointing at the whole page.
Does an extraction show up in the history?+
Yes. It is recorded under the returned id and read back via GET /v1/transcriptions/{id}, like a transcription. Subtitle formats (SRT, VTT) do not apply: a page has no timeline.
Can I extract a page behind authentication?+
No. Only publicly reachable pages. No cookie and no authentication header is forwarded to the target site.
Other ways to use the API
Free trial, no credit card
Generate an API key and transcribe your first source in under a minute. A free monthly quota lets you test under real conditions.
Start with the API