API REST · v1

Documentation de l'API MakeFav

Générez des packs de favicons complets depuis votre propre code, vos scripts de build et vos pipelines CI. Une seule requête transforme n'importe quelle image en favicon.ico, icônes Apple touch, icônes Android et PWA, manifeste web et HTML prêt à copier-coller.

Sur cette page

Démarrage rapide

L'API MakeFav est une API REST simple en HTTPS + JSON. Tous les endpoints sont regroupés sous une même URL de base :

https://makefav.com/api/v1
  1. Créer un compte gratuit
    Inscrivez-vous, confirmez votre adresse e-mail et gardez votre abonnement à la newsletter MakeFav actif – c'est la seule condition de l'offre gratuite.
  2. Créer une clé API
    Ouvrez la page des clés API dans votre compte et créez une clé personnelle. Elle commence par mf_ et n'est affichée qu'une seule fois : conservez-la en lieu sûr. Gérer les clés API
  3. Envoyer votre première requête
    Envoyez une image à l'endpoint de génération et enregistrez le fichier ZIP renvoyé :
curl --fail-with-body -sS https://makefav.com/api/v1/generate \
  -H "Authorization: Bearer $MAKEFAV_API_KEY" \
  -F "[email protected]" \
  -F "app_name=My App" \
  -F "theme_color=#2f9e68" \
  -F "radius=20" \
  -o favicons.zip

Unzip favicons.zip, upload the files to your website and paste the HTML code from the end of readme-makefav.txt into the <head> of every page.

Authentification

Chaque requête vers un endpoint protégé doit inclure une clé API personnelle. Vous pouvez créer, nommer et révoquer vos clés à tout moment depuis la page de votre compte : Clés API

Send the key as a bearer token in the Authorization header, or – if your HTTP client makes that awkward – in the X-API-Key header. Both are equivalent.

Authorization: Bearer mf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# or, alternatively
X-API-Key: mf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Les clés appartiennent à un utilisateur dont l'adresse e-mail est confirmée et dont l'abonnement à la newsletter est actif (condition de l'offre gratuite). Si l'e-mail n'est pas confirmé, si la newsletter est désactivée ou si le compte est banni, chaque requête renvoie 403 Forbidden.
Traitez les clés API comme des mots de passe : conservez-les sur le serveur ou dans les secrets de CI, jamais dans du code navigateur, des applications mobiles ou des dépôts publics. Révoquez immédiatement une clé en cas de fuite.

Missing or invalid keys return 401 Unauthorized. The GET /sizes and GET /openapi.json endpoints do not require a key.

Limites de requêtes

Par défaut, chaque clé API peut effectuer 100 requêtes par heure. Chaque réponse authentifiée indique où vous en êtes :

En-têteDescription
X-RateLimit-LimitNombre maximal de requêtes autorisées dans la fenêtre actuelle.
X-RateLimit-RemainingRequêtes restantes dans la fenêtre actuelle.
X-RateLimit-ResetHorodatage Unix (secondes, UTC) de la réinitialisation de la fenêtre.
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 97
X-RateLimit-Reset: 1767225600

When the limit is exceeded the API responds with HTTP 429 and the error code rate_limited. Wait until the time in X-RateLimit-Reset before retrying – do not retry in a tight loop.

HTTP/1.1 429 Too Many Requests
Content-Type: application/json
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1767225600

{"error": {"code": "rate_limited", "message": "Rate limit exceeded. Try again after the reset time."}}

You can check your current quota at any time with GET /me.

Endpoints

EndpointAuth.Description
POST /generateClé APICréer un pack de favicons complet.
GET /meClé APIVotre compte et l'état actuel de la limite de requêtes.
GET /sizesAucuneListe de tous les fichiers d'icônes et tailles produits par le générateur.
GET /openapi.jsonAucuneSpécification OpenAPI 3.1 lisible par machine.

Générer un pack de favicons

POST/generate

Crée un pack de favicons complet à partir d'une image source. Envoyez l'image de l'une des trois manières suivantes :

Type de contenuChamp imageDescription
multipart/form-dataimageEnvoi de fichier. Recommandé – l'option la plus efficace.
application/jsonimage_base64Base64-encoded image, either raw base64 or a data URL such as data:image/png;base64,iVBOR….
application/jsonimage_urlURL http ou https publique de l'image. Le serveur la télécharge (10 Mo max.).

Formats d'entrée pris en charge : PNG, JPG, WebP, AVIF, GIF, BMP, SVG et ICO. Taille maximale du fichier : 10 Mo.

Paramètres

Tous les paramètres sont facultatifs. Envoyez-les sous forme de champs de formulaire (multipart) ou de propriétés JSON. Les valeurs invalides reviennent à la valeur par défaut.

NomType / plagePar défautDescription
app_namechaîne, 60 caractères max.My WebsiteNom de votre site web ou application, utilisé dans manifest.json et la page d'exemple.
short_namechaîne, 24 caractères max.12 premiers caractères de app_nameNom court affiché sous l'icône sur l'écran d'accueil Android.
theme_color#rrggbb#ffffffCouleur de l'interface du navigateur (balise meta theme-color et manifeste).
tile_color#rrggbbidentique à theme_colorCouleur de fond des tuiles du menu Démarrer de Windows.
backgroundtransparent | #rrggbbtransparentArrière-plan des icônes pour navigateur, Android et Windows.
apple_background#rrggbb#ffffffArrière-plan des icônes Apple touch et de l'icône maskable (iOS ne gère pas la transparence). Ignoré lorsque background est une couleur – cette couleur est alors utilisée.
paddingentier, 0–40 (%)0Espace vide autour de l'image, en pourcentage de la taille de l'icône.
radiusentier, 0–50 (%)0Coins arrondis. 50 donne un cercle. Non appliqué aux icônes Apple, qu'iOS arrondit lui-même.
zoomentier, 50–400 (%)100Échelle de l'image dans l'icône. Les valeurs supérieures à 100 recadrent l'image.
offset_x, offset_ynombre, -1 à 10Déplace l'image horizontalement / verticalement, en fraction de la taille de l'icône.
pathchaîne/Dossier de votre serveur où se trouveront les icônes. Utilisé dans l'extrait HTML, le manifeste et browserconfig.
displaystandalone | fullscreen | minimal-ui | browserstandaloneMode d'affichage PWA écrit dans le manifeste.
pixelatedauto | 1 | 0autoMise à l'échelle nette au plus proche voisin pour le pixel art. auto l'active pour les sources de 64 px ou moins.
maskable1 | 01Crée aussi maskable-icon-512x512.png avec une marge de zone de sécurité pour les icônes adaptatives Android.
ico_sizesliste séparée par des virgules de 16, 24, 32, 48, 64, 128, 25616,32,48Tailles intégrées dans favicon.ico.
groupsliste séparée par des virgules de favicon, apple, android, msfavicon,apple,android,msJeux d'icônes à générer : favicons pour navigateurs, icônes Apple touch, icônes Android / PWA et tuiles Windows.
formatzip | jsonzipFormat de réponse – voir ci-dessous.

Réponse

format=zip
Binary ZIP archive with Content-Type: application/zip and Content-Disposition: attachment. Default.
format=json
JSON object with the package id (32 hex characters), the html snippet for your <head> and a files array; each file has name, mime, size (bytes) and base64 contents.

Exemple de requête – multipart, réponse ZIP

curl --fail-with-body -sS https://makefav.com/api/v1/generate \
  -H "Authorization: Bearer $MAKEFAV_API_KEY" \
  -F "[email protected]" \
  -F "app_name=My App" \
  -F "theme_color=#2f9e68" \
  -F "radius=20" \
  -o favicons.zip
HTTP/1.1 200 OK
Content-Type: application/zip
Content-Disposition: attachment
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
X-RateLimit-Reset: 1767225600

<binary ZIP data>

Exemple de requête – JSON avec URL d'image, réponse JSON

curl --fail-with-body -sS https://makefav.com/api/v1/generate \
  -H "Authorization: Bearer $MAKEFAV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image_url": "https://example.com/logo.png",
    "app_name": "My App",
    "theme_color": "#2f9e68",
    "radius": 20,
    "groups": "favicon,apple,android",
    "format": "json"
  }'
{
  "id": "9f86d081884c7d659a2feaa0c55ad015",
  "html": "<link rel=\"apple-touch-icon\" sizes=\"57x57\" href=\"/apple-icon-57x57.png\">\n…\n<meta name=\"theme-color\" content=\"#2f9e68\">",
  "files": [
    {"name": "favicon.ico", "mime": "image/x-icon", "size": 15086, "base64": "AAABAAMAEBAAAAEAIABoBAAANgAAACAg…"},
    {"name": "favicon-16x16.png", "mime": "image/png", "size": 612, "base64": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQ…"},
    {"name": "manifest.json", "mime": "application/json", "size": 1094, "base64": "ewogICAgIm5hbWUiOiAiTXkgQXBwIiwK…"}
  ]
}

Obtenir votre compte

GET/me

Renvoie l'utilisateur auquel appartient la clé API ainsi que l'état actuel de la limite de requêtes. Utile pour vérifier une clé. Nécessite une authentification ; aucun paramètre.

Exemple de requête

curl -sS https://makefav.com/api/v1/me \
  -H "Authorization: Bearer $MAKEFAV_API_KEY"

Exemple de réponse

{
  "id": 1,
  "email": "[email protected]",
  "name": "Jane Doe",
  "rate_limit": {"limit": 100, "remaining": 97, "reset": 1767225600}
}

Lister les tailles d'icônes

GET/sizes

Returns every icon file the generator can produce, with its pixel size and group. No authentication and no parameters. The group value matches the groups parameter of POST /generate.

Exemple de requête

curl -sS https://makefav.com/api/v1/sizes

Exemple de réponse

{
  "files": [
    {"name": "favicon-16x16.png", "size": 16, "group": "favicon"},
    {"name": "favicon-32x32.png", "size": 32, "group": "favicon"},
    {"name": "apple-touch-icon.png", "size": 180, "group": "apple"},
    {"name": "android-icon-192x192.png", "size": 192, "group": "android"},
    {"name": "ms-icon-144x144.png", "size": 144, "group": "ms"}
  ]
}

Spécification OpenAPI

GET/openapi.json

Renvoie la description OpenAPI 3.1 de cette API. Sans authentification. Importez-la dans Postman, Insomnia ou Swagger UI, ou utilisez-la pour générer un client typé pour votre langage.

curl -sS https://makefav.com/api/v1/openapi.json -o makefav-openapi.json

Erreurs

Successful requests return HTTP 200. Every error returns a JSON body with a stable, machine-readable code and a human-readable message. Always branch on the code, not on the message text.

HTTP/1.1 422 Unprocessable Content
Content-Type: application/json

{
  "error": {
    "code": "invalid_image",
    "message": "The uploaded file could not be decoded as an image."
  }
}
Statut HTTPCode d'erreurSignification
400bad_requestLa requête est mal formée, par exemple aucune image n'a été envoyée ou le corps JSON est invalide.
401unauthorizedLa clé API est manquante ou invalide.
403forbiddenL'e-mail du propriétaire de la clé n'est pas confirmé, l'abonnement à la newsletter est désactivé ou le compte est banni.
413file_too_largeL'image dépasse 10 Mo.
415unsupported_typeLe type de fichier ou le type de contenu de la requête n'est pas pris en charge.
422invalid_imageLe fichier n'a pas pu être décodé en tant qu'image, ou l'URL de l'image n'a pas pu être téléchargée.
429rate_limitedTrop de requêtes. Attendez jusqu'à X-RateLimit-Reset.
500server_errorUne erreur est survenue de notre côté. Réessayez plus tard ; contactez le support si le problème persiste.

Fichiers générés

With all groups enabled, a package contains the files below. Files from disabled groups are left out.

FichierTailleGroupe
favicon.ico16, 32, 48 (configurable)toujours
favicon-16x16.png16 × 16favicon
favicon-32x32.png32 × 32favicon
favicon-96x96.png96 × 96favicon
apple-icon-57x57.png57 × 57apple
apple-icon-60x60.png60 × 60apple
apple-icon-72x72.png72 × 72apple
apple-icon-76x76.png76 × 76apple
apple-icon-114x114.png114 × 114apple
apple-icon-120x120.png120 × 120apple
apple-icon-144x144.png144 × 144apple
apple-icon-152x152.png152 × 152apple
apple-icon-180x180.png180 × 180apple
apple-icon.png192 × 192apple
apple-icon-precomposed.png192 × 192apple
apple-touch-icon.png180 × 180apple
android-icon-36x36.png36 × 36android
android-icon-48x48.png48 × 48android
android-icon-72x72.png72 × 72android
android-icon-96x96.png96 × 96android
android-icon-144x144.png144 × 144android
android-icon-192x192.png192 × 192android
android-icon-512x512.png512 × 512android
web-app-manifest-192x192.png192 × 192android
web-app-manifest-512x512.png512 × 512android
maskable-icon-512x512.png512 × 512android
ms-icon-70x70.png70 × 70ms
ms-icon-144x144.png144 × 144ms
ms-icon-150x150.png150 × 150ms
ms-icon-310x310.png310 × 310ms

Fichiers supplémentaires

FichierInclusDescription
favicon.svgUniquement pour une entrée SVG sans recadrage, zoom, marge intérieure, coins arrondis ni arrière-planCopie nettoyée de votre SVG pour les navigateurs qui prennent en charge les favicons vectorielles.
manifest.json, site.webmanifestandroidManifeste d'application web pour Android et les PWA installables (deux copies identiques).
browserconfig.xmlmsConfiguration des tuiles Windows avec la couleur de votre tuile.
readme-makefav.txttoujoursInstructions d'installation avec le code HTML à placer dans votre <head> à la fin.

Exemples de code

Each example uploads logo.png with a few options and saves favicons.zip, handling API errors. Set the environment variable MAKEFAV_API_KEY to your API key first.

Envoi multipart :

# Multipart upload (recommended). --fail-with-body exits non-zero on HTTP errors
# and still saves the JSON error body, so you can inspect it.
curl --fail-with-body -sS https://makefav.com/api/v1/generate \
  -H "Authorization: Bearer $MAKEFAV_API_KEY" \
  -F "[email protected]" \
  -F "app_name=My App" \
  -F "theme_color=#2f9e68" \
  -F "radius=20" \
  -o favicons.zip \
  || { echo "Request failed:"; cat favicons.zip; rm -f favicons.zip; exit 1; }

Corps JSON avec une image encodée en base64 (nécessite jq) :

# JSON body with a base64-encoded image (built with jq to avoid argument length limits)
base64 < logo.png | tr -d '\n' > logo.b64
jq -n --rawfile img logo.b64 \
  '{image_base64: $img, app_name: "My App", theme_color: "#2f9e68", radius: 20}' \
| curl --fail-with-body -sS https://makefav.com/api/v1/generate \
    -H "Authorization: Bearer $MAKEFAV_API_KEY" \
    -H "Content-Type: application/json" \
    --data-binary @- \
    -o favicons.zip \
  || { echo "Request failed:"; cat favicons.zip; rm -f favicons.zip; exit 1; }

Utilisation en HTML

Upload all files to the folder you set with path, then paste the snippet into the <head> of every page. It is included at the end of readme-makefav.txt in the package and, with format=json, returned in the html field. Example for the options used in the code examples above:

<head>
  <meta charset="utf-8">
  <title>My App</title>

  <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
  <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
  <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
  <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
  <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
  <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
  <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
  <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
  <link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
  <link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
  <link rel="icon" href="/favicon.ico" sizes="any">
  <link rel="manifest" href="/manifest.json">
  <meta name="msapplication-TileColor" content="#2f9e68">
  <meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
  <meta name="msapplication-config" content="/browserconfig.xml">
  <meta name="theme-color" content="#2f9e68">
</head>

Après le déploiement, videz le cache de votre navigateur ou ouvrez le site dans une fenêtre privée – les navigateurs mettent les favicons en cache de façon très agressive.

Historique des modifications

v1

  • Première version publique de l'API REST MakeFav.
  • Endpoints POST /generate, GET /me, GET /sizes and GET /openapi.json.
  • Formats de réponse ZIP et JSON, entrée d'image en multipart, base64 et URL.
  • Clés API personnelles avec 100 requêtes par heure.

La version 1 est stable : nous n'ajoutons que des paramètres et des champs facultatifs. Les changements incompatibles seront publiés dans une nouvelle version, avec un préavis.

Assistance

Des questions, des bugs à signaler ou besoin d'une limite de requêtes plus élevée ? Nous serons ravis de vous aider. Indiquez l'heure de la requête et le code d'erreur dans votre message – jamais votre clé API.