Favicon API
Mach aus einem einzigen Bild ein komplettes Favicon-Paket – alle Größen, alle Plattformen, ein fertiges HTML-Snippet und ein einsatzbereites ZIP, mit nur einer POST-Anfrage.
Lade ein Bild hoch und erhalte ein komplettes Favicon-Paket: alle Größen, die moderne Browser verlangen, dazu eine site.webmanifest, das HTML-Snippet zum Einfügen in <head> und eine Download-URL für das ZIP.
# Generate a favicon package
curl -X POST https://jinero.online/api/v1/favicon/generate \
-F "[email protected]" \
-F "app_name=My App" \
-F "theme_color=#0ea5e9"
const form = new FormData();
form.append("image", file);
form.append("app_name", "My App");
form.append("theme_color", "#0ea5e9");
const r = await fetch("https://jinero.online/api/v1/favicon/generate", { method: "POST", body: form });
const { download_url, html_snippet } = await r.json();
Alle Endpunkte sind öffentlich – kein API-Schlüssel nötig. Die Favicon-Erzeugung startet für jede angeforderte Größe eine Node-Toolchain (sharp), daher ist das Limit streng.
# Anonymous limits (per IP):
# POST /favicon/generate 3 req/min
# GET /favicon/download/{id} 10 req/min
# Max source image: 10 MB
# Session TTL after generation: 60 minutes
Sende ein Quellbild und Flags pro Plattform. Zurück kommen eine Sitzungs-ID, Vorschaubilder, ein HTML-Snippet und eine Download-URL für das ZIP. Apple-, Android- und Standard-Favicons werden standardmäßig erzeugt; Windows und Yandex musst du explizit aktivieren.
https://jinero.online/api/v1/favicon/generate
| Parameter | Typ | Beschreibung |
|---|---|---|
image |
Datei (multipart) | Quellbild – png, jpg, jpeg, svg oder webp. Max. 10 MB. Quadratische Bilder liefern die besten Ergebnisse. |
app_name |
string | App-Name, der in site.webmanifest geschrieben wird. Max. 100 Zeichen. |
theme_color |
string | CSS-Farbe (hex oder rgb) für die Adressleiste / das theme-color-Meta-Tag. |
background |
string | Hintergrundfarbe für deckende PNG-Kacheln, wo keine Transparenz unterstützt wird. |
display |
string | Anzeigemodus im Manifest: standalone (Standard), browser, fullscreen oder minimal-ui. |
orientation |
string | Ausrichtung im Manifest: any (Standard), portrait oder landscape. |
apple_icon |
boolean | apple-touch-icon-*.png erzeugen. Standard: true. |
android |
boolean | android-chrome-*.png erzeugen. Standard: true. |
windows |
boolean | mstile-*.png + browserconfig.xml erzeugen. Standard: false. |
yandex |
boolean | yandex-browser-50x50.png + yandex-browser-manifest.json erzeugen. Standard: false. |
curl -X POST https://jinero.online/api/v1/favicon/generate \
-F "[email protected]" \
-F "app_name=Jinero" \
-F "theme_color=#0ea5e9" \
-F "background=#ffffff" \
-F "apple_icon=true" \
-F "android=true" \
-F "windows=true"
const form = new FormData();
form.append("image", logoFile);
form.append("app_name", "Jinero");
form.append("theme_color", "#0ea5e9");
form.append("background", "#ffffff");
form.append("apple_icon", "true");
form.append("android", "true");
const r = await fetch("https://jinero.online/api/v1/favicon/generate", { method: "POST", body: form });
const data = await r.json();
document.querySelector("head").insertAdjacentHTML("beforeend", data.html_snippet);
window.location = data.download_url;
$response = Http::attach(
"image",
file_get_contents("logo.png"),
"logo.png"
)->post("https://jinero.online/api/v1/favicon/generate", [
"app_name" => "Jinero",
"theme_color" => "#0ea5e9",
"apple_icon" => true,
"android" => true,
]);
$package = $response->json();
{
"success": true,
"session_id": "8c1f2e7a-4b5d-4dca-9c3e-1d6f7a0b2c5e",
"file_count": 27,
"html_snippet": "<link rel=\"icon\" type=\"image/x-icon\" href=\"/favicon.ico\">\n<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/favicon-32x32.png\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon.png\">\n<link rel=\"manifest\" href=\"/site.webmanifest\">\n<meta name=\"theme-color\" content=\"#0ea5e9\">",
"preview": [
{"label": "favicon-16x16", "url": "..."},
{"label": "favicon-32x32", "url": "..."},
{"label": "apple-touch-icon", "url": "..."},
{"label": "android-chrome-192", "url": "..."}
],
"download_url": "https://jinero.online/api/v1/favicon/download/8c1f2e7a-…",
"expires_in_minutes": 60
}
Streamt die erzeugte favicon-package.zip. Sitzungen sind 60 Minuten gültig, danach wird die Datei aus dem temporären Speicher gelöscht.
https://jinero.online/api/v1/favicon/download/{session}
curl -L -o favicon-package.zip https://jinero.online/api/v1/favicon/download/8c1f2e7a-…
// Trigger a browser download
window.location.href = data.download_url;
Ein typisches Paket mit Standardeinstellungen (apple + android an, windows + yandex aus) enthält 16–18 Dateien; mit allem aktiviert ~27.
favicon.ico # classic multi-resolution ICO
favicon-16x16.png # browser tabs
favicon-32x32.png # browser tabs (retina)
favicon-48x48.png # taskbar
favicon-96x96.png # Chrome desktop shortcut
favicon-192x192.png # PWA / android
favicon-512x512.png # PWA splash
apple-touch-icon.png # iOS home screen (180×180)
apple-touch-icon-152x152.png # iPad
apple-touch-icon-120x120.png # iPhone retina
apple-touch-icon-precomposed.png
android-chrome-192x192.png
android-chrome-512x512.png
android-chrome-maskable-512x512.png
mstile-150x150.png # Windows Start tile (windows=true)
browserconfig.xml # Windows config (windows=true)
yandex-browser-50x50.png # Yandex.Browser (yandex=true)
yandex-browser-manifest.json # Yandex meta (yandex=true)
site.webmanifest # PWA manifest
snippet.html # paste-into-<head> markup
Standard-HTTP-Semantik. Fehler liefern JSON mit dem Feld "message", das den Fehler beschreibt.
// 400 — malformed session id on /download
{ "message": "Invalid session id" }
// 404 — session expired or unknown
{ "message": "Result not found or expired" }
// 422 — validation (unsupported file type, oversize image, invalid color)
{ "message": "The image field must be a file of type: png, jpg, jpeg, svg, webp." }
// 429 — rate limit exceeded (/generate = 3 req/min)
{ "message": "Too Many Attempts." }
// 422 — generator crashed (rare; original error is forwarded)
{ "message": "Failed to load source image (corrupt input?)" }
Über die Favicon API von jinero.online
Kostenlose REST-API, die aus einem einzigen Quellbild ein einsatzfertiges Favicon-Paket macht – alle Icon-Größen, das PWA-Manifest und ein fertiges HTML-Snippet, mit nur einem Aufruf.
Ein Bild rein, komplettes Paket raus
Lade PNG/JPG/SVG/WebP hoch und erhalte alle Größen, die Browser verlangen – klassisches favicon.ico, Apple Touch, Android Chrome, PWA, Windows-Kacheln, Yandex.
Fertiges HTML-Snippet
Die Antwort enthält genau die <link>- und <meta>-Tags, die du direkt in den <head> deines Dokuments einfügen kannst – ohne Rätselraten.
PWA-fähiges Manifest
site.webmanifest wird mit deinem App-Namen, Theme-Farbe, Hintergrund, Anzeigemodus und Ausrichtung erzeugt – die Installation als App funktioniert vom ersten Tag an.
Kein Schlüssel nötig
Öffentlicher Endpunkt, 3 Generierungen/Minute pro IP. Für höhere Limits hol dir ein API-Token.
Häufig gestellte Fragen
Nein. Die Favicon API ist öffentlich. /generate ist auf 3 Anfragen/Minute pro IP begrenzt, weil jeder Aufruf die sharp-Toolchain für jede angeforderte Größe startet. Wenn du mehr brauchst, registriere dich und hol dir ein API-Token.
Ein quadratisches PNG oder SVG ab 512×512 liefert in allen Größen die besten Ergebnisse. Alles unter 192×192 wirkt auf Android-Startbildschirmen unscharf. Wir akzeptieren png, jpg, jpeg, svg und webp bis 10 MB.
Klassisches Favicon (ico + 6 PNG-Größen), Apple Touch Icon (180/152/120 + precomposed) und Android Chrome (192/512 + maskable). Windows-Kacheln und Yandex.Browser-Icons aktivierst du über die Flags windows=true und yandex=true – die meisten modernen Stacks brauchen sie nicht.
60 Minuten ab der Erzeugung. Danach werden ZIP und Vorschaubilder aus dem temporären Speicher gelöscht. Wenn du das Paket später brauchst, erzeuge es einfach erneut.
Das Snippet in html_snippet ist bewusst minimal gehalten – genau die Tags, die moderne Browser auswerten. Braucht dein CMS zusätzliche Meta-Tags (Open-Graph-Icons usw.), füge sie selbst hinzu; die Icon-Pfade im ZIP stimmen mit denen im Snippet überein.