Keyword extraction API
The keywords of any URL, ranked
The terms someone would tag the page with or search for to find it — not the most frequent words — for tagging, clustering and SEO research at scale.
By Roger Campos · Last updated: October 2026
TL;DR
POST a URL to /keywords and get a JSON array of 5–15 keywords and key phrases, most relevant first: the page's subject, then its distinct topics, in the page's own words and language. The page is rendered in a real browser and its main content is read, without navigation, cookie notices or the site's name. 15 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/keywords \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/blog/branch-prediction", "sync": true}'import requests
res = requests.post(
"https://urlpipe.dev/keywords",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"url": "https://example.com/blog/branch-prediction", "sync": True},
)const res = await fetch("https://urlpipe.dev/keywords", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com/blog/branch-prediction", sync: true }),
})$ch = curl_init("https://urlpipe.dev/keywords");
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/branch-prediction", "sync" => true]),
]);
$response = curl_exec($ch);[
"branch prediction",
"pipeline stalls",
"branch target buffer",
"speculative execution",
"loop unrolling"
]The keywords
What comes back
- The subject first. The first keyword is what the whole page is about, in the most specific term that still covers all of it. The rest follow by relevance.
- As many as the page has topics. Between 5 and 15: a short page, or a page about one thing, has 5 to 8. The list is not padded to 15.
- Terms, not sentences. One to three words each, taken from the page's own text, each about something different from the others.
- In the page's language. A Spanish page gets Spanish keywords.
- Without the noise. No author names, cookie notices, prices, dates or identifiers, and not the site's own name unless the page is about the site.
A page that is a list — a front page, a feed, an index — gets the keywords of the list as a whole: the section it belongs to, the kind of items it lists and the themes they share, not one keyword per story.
How it works
Not a word count
Frequency-based extractors return the words a page repeats. /keywords renders the page in a real browser, reduces it to its readable content — the article or the product, without navigation and sidebars — and has a language model rank the terms that best represent it. A page about running shoes returns running shoes, not the and shoe. A link to a PDF or text file is read from its text (documents & files).
The guide to getting keywords from a URL walks through it with code, and the /keywords reference has the parameters.
Use cases
What people build with it
- Competitor and SEO research. The topics a competitor's pages are written around, page by page, to seed a brief or find gaps.
- Auto-tagging. Tags for articles, bookmarks and knowledge-base entries as they are added.
- Clustering URLs. Group a list of pages by what each is about, with labels to keep each batch apart.
- Related content and search. Keywords as index terms for internal search or "more like this" links.
const res = await fetch("https://urlpipe.dev/keywords", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com/blog/post", sync: true }),
})
const tags = await res.json() // ["branch prediction", "pipeline stalls", …]Pricing
What it costs
Keywords cost 15 credits per page: a language model reads it. A page you already asked about is answered for free while the stored result is fresher than max_age, and a failed request costs nothing. For many URLs, drop sync and collect results at your webhook. /scrape returns the keywords together with the Markdown or the summary from one visit.
Limits
What it does not do
- No search volumes or rankings. It tells you what a page is about, not how often anyone searches for it.
- No scores. The keywords come back in order of relevance, without a number on each.
- One page per request. For a whole site, send each page you care about.
- 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) |
|---|---|---|---|---|---|
| /keywords | 15 credits | 66 | 1,333 | 3,666 | 11,666 |
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.
FAQ
Frequently asked questions
Between 5 and 15, as many as the page has distinct topics, most relevant first. A short page gets 5 to 8.
No. A language model ranks the terms that best represent what the page is about, taken from its own text, so you get phrases like "running shoes" rather than common words.
Any language the page is written in. The keywords come back in the page's own language.
No. It extracts what a page is about; pair it with your keyword research tool for volumes.
15 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.