Summarization API
A faithful summary of any URL, in Markdown
The substance of a page, start to end, without the navigation, ads and comments — ready for a digest, a preview or a model's context window.
By Roger Campos · Last updated: October 2026
TL;DR
POST a URL to /summarize and get a Markdown summary of the page's main content: three to five paragraphs that cover every major section in the page's order, written in the page's own language, with nothing the page does not state. The page is rendered in a real browser and its navigation, ads and comments are left out. 17 credits per page.
Free plan, no credit card. 1,000 credits a month.
Try it now — no signup
Your result will appear here.
Enter a URL above, or pick one of the example pages.
The request
One POST, one bearer token
curl -X POST https://urlpipe.dev/summarize \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/blog/launch", "sync": true}'import requests
res = requests.post(
"https://urlpipe.dev/summarize",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"url": "https://example.com/blog/launch", "sync": True},
)const res = await fetch("https://urlpipe.dev/summarize", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com/blog/launch", sync: true }),
})$ch = curl_init("https://urlpipe.dev/summarize");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["url" => "https://example.com/blog/launch", "sync" => true]),
]);
$response = curl_exec($ch);The post announces version 3 of the product, which moves rendering into
the browser and drops the separate export step.
It walks through the three changes users will notice: faster previews,
**offline editing**, and a new sharing dialog. Existing projects open
unchanged; the old export command keeps working until the next release.
It ends with pricing, which stays the same, and a link to the migration notes.The summary
What the summary is held to
- The whole page, not its opening. Every major section gets at least a sentence, in the order the page takes them, through to what it ends with.
- Only what the page says. No facts, context or opinions added, and no detail the page does not state.
- The page's own content. Reader comments, reviews, ads and the other pages a site suggests alongside are left out.
- Three to five paragraphs of Markdown, with emphasis and lists where the content calls for them, and no heading, label or preamble to strip.
- In the page's language. A German article is summarized in German.
A page that is a list — a front page, a feed, search results — is summarized as one: what kind of list it is, what it shows for each item and what the items are about in general.
Pipeline
How it works
The page is rendered in a real browser, so JavaScript-built pages are complete. It is reduced to its readable content — the article, the product, the documentation — before a language model writes the summary, so the navigation and sidebars never reach it. A link to a PDF or text file is summarized from its text (documents & files). The /summarize reference has the parameters.
Use cases
What people build with it
- Digests. A newsletter, a Slack channel or a daily briefing built from a list of links.
- Link previews with substance. A paragraph about what a shared page actually says, beside the title and image from the metadata API.
- Research triage. Decide which sources deserve a full read before anyone opens them.
- Short context for a model. A summary when the whole page would crowd the context window; the Markdown API when the model needs every word.
import requests
links = ["https://example.com/a", "https://example.com/b"]
digest = []
for url in links:
res = requests.post(
"https://urlpipe.dev/summarize",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"url": url, "sync": True},
)
digest.append(f"## {url}\n\n{res.text}")
print("\n\n".join(digest))Choosing
Summary or Markdown?
A summary costs 17 credits: a language model writes it. If the next step is your own model, /markdown returns the full content for 1 credit and lets your model summarize as part of its own work. Take /summarize when the summary itself is what you deliver. A page you already summarized is answered for free while the stored result is fresher than max_age, and a failed request costs nothing.
Limits
What it does not do
- No length or style setting. Three to five paragraphs, in the page's language; there is no word count, bullet-only mode or prompt of your own.
- No pages behind a login or a hard paywall: it summarizes what the page shows a visitor.
- One page per request. It does not follow links or summarize a whole site.
- Up to 10 MB of HTML, and public pages only.
Pricing
What it costs
| Call | Credits | Free (calls/mo) | Starter (calls/mo) | Pro (calls/mo) | Scale (calls/mo) |
|---|---|---|---|---|---|
| /summarize | 17 credits | 58 | 1,176 | 3,235 | 10,294 |
Cache hits and failed requests cost nothing. Paid plans are never cut off: past the allowance, extra credits are $1.50 per 1,000 credits. See every plan.
Compared with
FAQ
Frequently asked questions
Three to five paragraphs of Markdown, depending on how much the page covers.
It is held to what the page says: no facts, context or opinions of its own, and no detail the page does not state.
The page's own. A French page is summarized in French.
No. For your own prompt, fetch the page with /markdown and send it to your model.
17 credits per page. Cache hits and failed requests are free.
Make your first request in five minutes.
Free plan, no card. Confirm your email and your API key is live — you'll be making real requests in minutes.