Pull quotes
Every long article has three or four lines that could stand alone on a magazine page. This endpoint finds them: it reads the text, isolates the sentences with the most rhetorical weight, and returns them ranked with their surrounding context. Feed it a draft and get back the pull quotes a good editor would circle in pen.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
The blank-page problem of pull quotes
Editors and social media managers spend real time re-reading their own copy just to find one good line for a graphic or a tweet. It is a small task that interrupts a bigger one, and doing it well requires a different kind of reading than writing does. text.extract_quotes does that second pass for you, scanning the full body once and surfacing the sentences that carry the most standalone punch, so the human only has to choose, not hunt.
What the endpoint actually returns
Send plain text or HTML-stripped copy to POST /text/extract-quotes and you get back a ranked array of candidate quotes, each with the exact wording, its position in the source, and a short reason it was picked — a claim, a turn of phrase, a number, a contrast. Nothing is paraphrased; every quote is a verbatim substring of your input, because a pull quote that does not match the source is a correction waiting to happen.
Why 'the best line' is a real signal, not a guess
Pull quotes have existed since print magazines needed a way to stop a reader's eye mid-page, and the instinct behind a good one has not changed: it should work with almost no context. What has changed is volume — a newsroom or content team publishing dozens of pieces a day cannot manually mark every candidate line. The task automates the editorial instinct of 'would this sentence survive alone in 40-point type,' applied consistently across everything you publish.
Where it slots into a publishing pipeline
Most teams call this endpoint right after a draft is finalized and before it goes to layout or to a social scheduler, chaining the returned quotes into a design template or an image-generation step. Because it is asynchronous, you can fire it the moment an article is saved and have the pull quotes waiting by the time a human opens the layout tool — no one stares at a spinner for this.
What it will not do
It will not invent a punchier version of a mediocre sentence, and it will not quote something the article does not actually say. If your draft has no strong lines, the response will be honest about that rather than manufacturing drama, because a fabricated quote is worse than none.
What you can do with it
Magazine-style web layouts
Auto-populate the big pull-quote block in a CMS template the moment an article is published, instead of an editor combing the text by hand.
Social card generation
Feed the top-ranked quote straight into a quote-card image generator so every article gets a shareable graphic without extra editorial work.
Newsletter highlights
Pull the two or three strongest lines from each linked article to build the 'what people are saying' teaser section of a weekly digest.
Interview and transcript recaps
Surface the most quotable moments from a long transcript so a producer can build a highlight reel or a short-form clip script quickly.
FAQ
How does the extract quotes from article API decide what's a good quote?
It scores sentences on standalone clarity, rhetorical strength, and how well they represent the article's core claims, then returns them ranked with a brief reason for each pick.
Are the quotes rewritten or exactly as written?
Always verbatim. The endpoint returns exact substrings of your source text with their position, never a paraphrase, so what you publish always matches the original.
Is there a free tier to test this endpoint?
There's no free tier — free tiers get abused and slow everyone down. Access runs on a prepaid ForHosting KIT balance: top up from $10.00 (it never expires) and each request is charged at its published price, so a call with no balance returns HTTP 402. No subscription, no tokens, no invented credits, and a failed task is never charged.
What input formats does it accept?
Plain text or pre-cleaned article body copy works best. Strip navigation, captions, and boilerplate before sending so the model scores actual prose, not layout noise.
How is this priced?
$0.003 per request plus $0.0135 per 1,000 words processed. A failed task is never charged; the system retries automatically up to three times before returning a clear error.
Can I run this on hundreds of articles at once?
Yes, the endpoint is built for bulk use — queue as many async requests as you need and collect results by webhook as each one completes.
How do I get the results back?
Via a signed webhook, which we recommend for pipelines, or a signed link that stays valid for 24 hours if you'd rather poll manually.
Will it quote something offensive or out of context if the article contains it?
It extracts what is actually in the text without editorial filtering or softening, so review candidate quotes before publishing exactly as you would review any human-picked pull quote.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/text/extract-quotes \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"…"}'const res = await fetch("https://api.kit.forhosting.com/text/extract-quotes", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/extract-quotes",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/extract-quotes", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/extract-quotes", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "…"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.extract_quotes",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_tokens | 20000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |