Generate hashtags
A post tagged only with #love and #instagood joins millions of others under the same two words and is never found again. This endpoint reads the actual content of a post and suggests tags a real, interested audience is likely to search or follow.
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 problem with the obvious tags
The tags with the largest follower counts are, almost by definition, the most crowded — a huge tag buries a post within minutes, while a tag nobody uses reaches nobody at all, and the useful middle ground between those two extremes isn't obvious from a follower count alone. Picking tags by hand usually means reaching for whatever feels familiar rather than what an interested viewer is actually searching, which is a different question entirely. text.hashtags reads the post's actual content to answer that second question.
How a set of tags gets suggested
POST /text/hashtags with your post text or topic, get a task_id back right away, and the suggested tags arrive by signed webhook or a signed link valid for 24 hours once the async task completes. The suggestions mix broader tags for reach with narrower, topic-specific ones for relevance, rather than returning one flavor of tag and leaving the balancing to you.
Why hashtags work the way they do
The hashtag started as a way to group a scattered conversation around one searchable term, and it still functions closest to that original purpose when it's specific enough to describe what a post is actually about rather than a generic mood or aesthetic. A tag that names the actual subject connects a post to people already searching for that subject, while a purely popular tag mostly connects a post to other posts using the same popular tag — a much less useful audience.
Fitting it into a posting workflow
Most teams call this endpoint right alongside a post-drafting step, generating tags for the same content in one pass rather than treating hashtag research as a separate manual task done after the copy is already written. Individual creators use it the same way to keep a consistent, relevant tag set without maintaining a personal spreadsheet of favorites that slowly goes stale as a niche or audience shifts over time. Priced per request plus per post, cost stays proportional to how much you actually publish, and a failed task is never charged.
What you can do with it
Tag generation alongside post drafting
A team generates hashtags in the same workflow step as the post copy itself, so publishing never waits on separate tag research.
Niche accounts reaching the right audience over a huge one
A small creator uses specific, relevant tags instead of oversaturated ones to reach viewers actually interested in the topic.
Refreshing a stale, repetitive tag set
A brand account replaces the same five tags reused on every post with ones matched to each post's actual content.
Bulk tagging for a content calendar
A marketing team generates tags for a week's scheduled posts in one batch alongside the copy for each.
FAQ
How do I generate hashtags for a post with the API?
POST your post text or topic to /text/hashtags, keep the returned task_id, and collect the suggested tags by webhook or a signed link valid for 24 hours.
Is the hashtag generator API free?
No, there's no free tier or trial; it costs $0.003 per request plus $0.0135 per post, and a failed task is never charged.
Does it just return the most popular hashtags?
No, it mixes broader, high-reach tags with narrower, topic-specific ones matched to the actual content, rather than defaulting to whatever is most searched overall.
How many hashtags does it return per request?
A set sized for typical platform norms; check the endpoint reference for the current count and any platform-specific limits.
Does it support multiple languages?
It can generate tags based on post text in various languages; check the endpoint reference for current language coverage.
Can I generate tags for many posts at once?
Yes, each post is submitted as its own async request, so tagging a batch of posts is a batch of requests.
Is this endpoint live yet?
Yes, it's live and accepting requests now.
Is my post content kept after tags are generated?
No, submitted text and generated tags are deleted after the retention window and are never used for training.
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/hashtags \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/text/hashtags", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/hashtags",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/hashtags", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/hashtags", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"input": "…"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.hashtags",
"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. |