Generate a favicon
Upload a single source image and our favicon generator API renders the entire set your site actually needs — the tiny 16x16 for browser tabs, the larger sizes for Android home screens, the Apple touch icon, and an ICO bundle for older browsers. It exists because 'just make a favicon' is really a dozen small, easy-to-forget image jobs.
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.
One image, a dozen requirements
Modern browsers, phone home screens, PWA manifests, and Windows tiles each expect a favicon in a slightly different size and sometimes a different container format. Get one wrong and the icon looks blurry in a tab or is simply missing on an Android home screen. POST /image/favicon takes the tedium out of that checklist by generating the whole set from a single source image in one call.
How the request flows
You submit your source image, the task is queued and a task_id comes back immediately, and once processing finishes you receive the generated set through a signed webhook or a signed link that stays valid for 24 hours. Because it runs asynchronously, it drops neatly into a build pipeline or CMS plugin without holding up a page render.
A little history behind the favicon zoo
The favicon started in the late 1990s as a single 16x16 ICO file referenced in a page's head, back when browser tabs did not even exist yet. As mobile home screens, retina displays, and installable web apps arrived, that one icon multiplied into a family of sizes and formats, each platform adding its own convention rather than converging on one. The result is that a correctly configured site today ships far more icon variants than most developers realize.
Built for automated pipelines
Because every favicon set starts from the same source logo, this is a natural fit for CI: regenerate the full icon set whenever the brand logo changes, and let the webhook drop the new files straight into your asset pipeline or static site build. No manual export from a design tool, no missed size in the batch.
What quality to expect
Each output is generated directly from your source image at the resolution each target requires, so a crisp source produces crisp icons across the whole set — the endpoint does not upscale a low-resolution logo into something it was never rendered at. A square logo with a simple mark tends to survive the trip down to 16x16 far better than a wide, detail-heavy wordmark, since the smallest sizes leave almost no room for fine strokes to stay legible.
What you can do with it
Website launch checklist
Generate the full favicon set the moment a new site's logo is finalized, instead of manually exporting each size.
CMS or theme plugin
Let site owners upload a logo once and have your plugin call the API to produce every icon file the theme references.
Brand refresh automation
Regenerate every icon size across dozens of client sites automatically whenever a shared brand logo is updated.
PWA and home-screen readiness
Produce the larger icon sizes a progressive web app manifest needs alongside the standard browser favicon.
FAQ
How do I generate a favicon set with the API?
Send your source image to POST /image/favicon; you get a task_id right away and the complete icon set arrives afterward via webhook or a 24-hour signed link.
Is this favicon generator free?
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.
What does generating a favicon set cost?
Each request costs $0.002 plus $0.005 per icon set produced, charged only when generation succeeds.
What sizes and formats are included?
The set covers the standard range sites need in practice, from the small browser-tab size through Apple touch icon dimensions to an ICO bundle, generated together in one call.
What image should I upload as the source?
A clean, square, high-resolution image works best, since every smaller icon is rendered down from it and a low-resolution source limits sharpness across the set.
Am I charged if favicon generation fails?
No. A failed task is retried automatically up to three times and is never billed if it ultimately fails; you pay only for a completed set.
Can I automate favicon generation across many sites?
Yes, since each call is independent and asynchronous, it's straightforward to loop it into a build system or multi-tenant CMS that regenerates icons whenever a logo changes.
How is this different from a manual favicon generator tool?
It is the same output a browser-based generator produces, but callable directly from your automation with signed, time-limited delivery instead of a manual download step.
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/image/favicon \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/image/favicon", {
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/image/favicon",
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/image/favicon", 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/image/favicon", 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": "image.favicon",
"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_mb | 15 |
max_megapixels | 12 |
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. |