Extract keywords
Send an article, a product page or a transcript and get the phrases that carry its meaning, ranked by relevance, such as commercial real estate financing instead of the bare word financing. You choose where to cut the list. You pay per use, with no subscription.
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.
Most 'keyword tools' just count word frequency and call it a day.
Meaning, not repetition
Most keyword tools just count how often a word appears and call it a day. The first generation of search optimization software in the 1990s worked that way, assuming that frequency equaled importance, and it reliably pushed stopwords, brand boilerplate and repeated legal disclaimers to the top, which is why so many automatic tag clouds look useless. This tool reads a passage the way an editor would and surfaces the phrases that carry its meaning. It prefers multi-word phrases over single generic nouns when they say more: commercial real estate financing is a far more useful tag than financing alone.
A ranked list you can cut where you need
Each keyword comes with a relevance score, so you decide the cutoff: the top 5 for a meta tag, the top 20 for an internal search index. A shop might take 10 to 15 keywords per product description to improve its on-site search. A team holding thousands of scraped articles can group them by their keyword sets to spot near-duplicates before indexing. A person can pick good keywords for one article in thirty seconds; the point here is doing it consistently across ten thousand.
What the model actually returns
The response is a ranked array of keyword strings, each attached to a relevance score, so you can decide your own cutoff — top 5 for a meta tag, top 20 for an internal search index. The extraction favors multi-word phrases over single generic nouns whenever the phrase carries more specific meaning, because 'commercial real estate financing' is a far more useful tag than the word 'financing' on its own.
Why frequency counting was never enough
Early keyword tools, going back to the first generation of SEO software in the 1990s, worked by counting how often a word appeared and assuming frequency equaled importance. That approach reliably surfaced stopwords, brand boilerplate and repeated legal disclaimers as 'top keywords', which is why so many auto-generated tag clouds look useless.
What you can do with it
Search index enrichment
Extract 10-15 keywords per product description and feed them into a search engine's synonym or boost fields to improve on-site search relevance.
Editorial QA before publishing
Check that a draft's extracted keywords actually match the target keyword you briefed the writer for, catching topic drift before it goes live.
Deduplicating a scraped dataset
Cluster thousands of scraped articles by their extracted keyword sets to spot near-duplicate content before it's indexed.
FAQ
Is there a free tier?
There's no free tier — free tiers get abused and slow everyone down. No subscription, no tokens, no invented credits, and a failed task is never charged.
How many keywords does it return?
The response includes a ranked list with relevance scores rather than a fixed count, so you choose your own cutoff depending on whether you need a tight meta-tag set or a broader index.
How long are results kept?
Results sit behind a signed link for 24 hours and are deleted after the retention window; your text is never stored for training.
Can it tell me whether a draft stayed on topic?
Yes. Compare the extracted keywords with the target keyword you briefed the writer for. If they don't match, the draft has drifted away from its topic, and you catch it before it goes live.
Is the text I send kept or used for training?
No. The source text is not kept past the retention window and is never used to train anything, so drafts and articles that are not yet published can go through it too.
Related tools
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, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/text/extract-keywords \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"El informe trimestral cerró con 1,2 M€ de ingresos."}'const res = await fetch("https://api.kit.forhosting.com/text/extract-keywords", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "El informe trimestral cerró con 1,2 M€ de ingresos."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/extract-keywords",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "El informe trimestral cerró con 1,2 M€ de ingresos."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/extract-keywords", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"El informe trimestral cerró con 1,2 M€ de ingresos."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"El informe trimestral cerró con 1,2 M€ de ingresos."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/extract-keywords", 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": "El informe trimestral cerró con 1,2 M€ de ingresos."
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.extract_keywords",
"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. |
Technical notes
This keyword extraction API reads a passage the way an editor would, surfacing the phrases that carry the meaning of the text rather than the ones that simply repeat the most. Send an article, a product page or a transcript to POST /text/extract-keywords and get back a ranked list you can drop straight into a CMS field, a search index or a tagging pipeline.
Built for people who tag content at volume
Content teams, SEO managers and marketplace catalogs all hit the same wall: a human can read one article and pick good keywords in thirty seconds, but nobody has thirty seconds times ten thousand articles. This endpoint exists for exactly that gap — bulk, unattended tagging of blog posts, product descriptions, support articles or scraped web pages, where consistency across thousands of documents matters more than any single perfect keyword list.
Why frequency counting was never enough
Reading for salience instead of frequency is the whole point of this endpoint.
What happens after you submit a request
Nothing about the shape of your source text is stored past the retention window, and it is never used to train anything. Because extraction runs on a queue, the call returns a task_id immediately and the actual keyword list arrives afterward — either pushed to your signed webhook the moment it's ready, or held behind a signed link valid for 24 hours if you'd rather poll.
Where it slots into a pipeline
Because the endpoint is a single stateless call, it drops cleanly into ingestion pipelines: a CMS webhook that fires on publish, a nightly batch job over a product catalog, or a queue worker that tags scraped articles before they hit a search index. You pay per request plus a small per-word rate, so a one-line product blurb costs a fraction of what a five-thousand-word report costs — there's no flat per-document tax.
Integration use cases
Auto-tagging a blog archive
Run every published post through the endpoint once to backfill a tags field that was never populated consistently by different authors.
Technical questions
How do I call the keyword extraction API?
Send a POST request to /text/extract-keywords with your text in the body; the call returns a task_id immediately and the ranked keyword list arrives by webhook or a signed link once processing finishes.
How much does keyword extraction cost?
Pricing is $0.003 per request plus $0.0135 per 1,000 words of input, billed only on tasks that actually complete — a failed task is never charged.
What languages does it support?
The endpoint processes text regardless of language and returns keywords in the language of the source, so a Spanish article yields Spanish keywords.
Can I extract keywords in bulk?
Yes — each call is a single independent task, so you queue as many documents as you need in parallel and collect the results as each webhook fires.
How is this different from a frequency-based keyword tool?
Frequency counters flag whatever word repeats most, including stopwords and boilerplate; this endpoint ranks phrases by how much meaning they carry in context, which is why generic filler rarely surfaces at the top.