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.

POST https://jinero.online/api/v1/favicon/generate
ParameterTypBeschreibung
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();
Beispielantwort
{
  "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.

GET 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.