Generate meta tags
Templated meta tags tend to be either generic boilerplate or the wrong length, and both cost clicks.
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.
This API reads a page's actual content and writes a title and meta description kept within the conventional character limits — about 60 characters for the title, 155 for the description — with the target keyword near the front. It's built for teams generating meta tags at catalog scale, where hand-writing each one isn't realistic.
Sized to the limits that keep snippets whole
Titles longer than roughly 60 characters and descriptions past about 155 tend to get clipped in search results, cutting a sentence off mid-thought right where it should be closing the sale. The generator writes to those character limits so the copy you publish reads as a complete thought in the snippet. The limits are the widely used practical guide; search engines ultimately trim by how wide the text renders, so treat the character targets as a safe margin rather than a pixel-exact guarantee.
How the generator builds each tag
Send a page's content, or the URL itself, to POST /seo/meta-generate and it extracts the substance of the page, drafts a descriptive title and meta description within the character limits, and leads with the target keyword. The output favors specific, page-relevant phrasing over generic filler, since a title stuffed with keywords but disconnected from the content tends to hurt click-through rather than help it.
Why generic tags underperform
A title and description copied from one template across a whole site read as boilerplate to both people and search engines, and a snippet that doesn't describe the specific page gives no reason to click. Writing each tag from the page's own content — its real subject, the terms it actually uses — is what makes the snippet match the page, which is the part a length rule alone can never fix.
Built for the scale a person can't manually cover
A ten-page marketing site can get its meta tags handwritten. A ten-thousand-SKU catalog, a multi-language blog, or a directory of location pages cannot, and generic auto-generated tags copied from a template usually read as spammy and hurt trust. The endpoint is asynchronous: submit content, get a task_id back immediately, and receive the generated tags by signed webhook or a 24-hour signed link, so you can batch an entire sitemap without holding a connection open.
Fitting it into your content pipeline
Plug this in right after a CMS publish hook, a product feed sync, or a translation step, so every new or updated page gets a properly sized title and description without anyone touching a spreadsheet. Nothing submitted is stored past the retention window or used to train anything.
What you can do with it
Auto-tagging a product catalog
Generate a fitted title and description for every SKU as it's added, instead of relying on a single boilerplate template across thousands of products.
Rewriting meta tags after a content refresh
Rerun the generator whenever a blog post is substantially edited, so the snippet in results still matches what the page actually says.
Localizing meta tags per language
Because the right length and phrasing differ by language, regenerate titles and descriptions per locale from each version's own content instead of reusing English-length assumptions.
Fixing a site-wide truncation audit
Feed a list of URLs with clipped or weak snippets straight into the generator to rewrite them in one batch.
FAQ
How long are the titles and descriptions it writes?
Titles are kept to about 60 characters and descriptions to about 155 — the conventional limits that keep a snippet from being clipped — with the target keyword near the start. The counts are a practical guide, not a pixel-exact measurement.
Can it generate tags for pages in other languages?
Yes, it works from the page's own content and language, writing each tag in that language rather than translating one template across locales.
Is there a free trial?
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.
How do I retrieve the generated tags?
The call is asynchronous — POST /seo/meta-generate returns a task_id immediately, and the finished title and description arrive via signed webhook or a signed link valid 24 hours.
What if the page has thin or missing content?
The generator works from whatever content is present; extremely thin pages produce more generic output, and improving the source content is the real fix.
How much does it cost to run on a large catalog?
It's $0.003 per request plus $0.0135 per page, so the cost of a full catalog run is calculable in advance from your page count.
Will it overwrite my manually written meta tags?
No, it only returns suggested title and description text; applying it to your site is a step you control.
What happens if generation fails?
It retries automatically up to three times before returning a clear error, and a failed task is never billed.
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/seo/meta-generate \
-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/seo/meta-generate", {
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/seo/meta-generate",
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/seo/meta-generate", 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/seo/meta-generate", 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": "seo.meta_generate",
"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.
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. |
413 | input_too_large | The file exceeds the size limit. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |