API REST · v1

Documentazione dell'API di MakeFav

Genera pacchetti di favicon completi dal tuo codice, dagli script di build e dalle pipeline CI. Una sola richiesta trasforma qualsiasi immagine in favicon.ico, Apple touch icon, icone Android e PWA, un web manifest e HTML pronto da incollare.

In questa pagina

Guida rapida

L'API di MakeFav è una semplice API REST HTTPS + JSON. Tutti gli endpoint si trovano sotto un unico URL di base:

https://makefav.com/api/v1
  1. Crea un account gratuito
    Registrati, conferma il tuo indirizzo email e mantieni attiva l'iscrizione alla newsletter di MakeFav: è l'unica condizione del piano gratuito.
  2. Crea una chiave API
    Apri la pagina delle chiavi API nel tuo account e crea una chiave personale. Inizia con mf_ e viene mostrata una sola volta, quindi conservala in modo sicuro. Gestisci le chiavi API
  3. Invia la tua prima richiesta
    Carica un'immagine sull'endpoint generate e salva il file ZIP restituito:
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.

Autenticazione

Ogni richiesta a un endpoint protetto deve includere una chiave API personale. Puoi creare, rinominare e revocare le chiavi in qualsiasi momento dalla pagina del tuo account: Chiavi 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
Le chiavi appartengono a un utente con indirizzo email confermato e iscrizione alla newsletter attiva (condizione del piano gratuito). Se l'email non è confermata, la newsletter è disattivata o l'account è bloccato, ogni richiesta restituisce 403 Forbidden.
Tratta le chiavi API come password: conservale sul server o nei secret della CI, mai nel codice del browser, nelle app mobili o nei repository pubblici. Revoca subito una chiave se viene divulgata.

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

Limiti di frequenza

Per impostazione predefinita ogni chiave API può effettuare 100 richieste all'ora. Ogni risposta autenticata indica a che punto sei:

HeaderDescrizione
X-RateLimit-LimitNumero massimo di richieste consentite nella finestra corrente.
X-RateLimit-RemainingRichieste rimanenti nella finestra corrente.
X-RateLimit-ResetTimestamp Unix (secondi, UTC) del reset della finestra.
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.

Endpoint

EndpointAutenticazioneDescrizione
POST /generateChiave APICrea un pacchetto di favicon completo.
GET /meChiave APIIl tuo account e lo stato attuale del limite di frequenza.
GET /sizesNessunaElenco di tutti i file icona e le dimensioni prodotti dal generatore.
GET /openapi.jsonNessunaSpecifica OpenAPI 3.1 leggibile dalle macchine.

Genera un pacchetto di favicon

POST/generate

Crea un pacchetto di favicon completo a partire da un'unica immagine di origine. Puoi inviare l'immagine in tre modi:

Content typeCampo dell'immagineDescrizione
multipart/form-dataimageCaricamento del file. Consigliato: è l'opzione più efficiente.
application/jsonimage_base64Base64-encoded image, either raw base64 or a data URL such as data:image/png;base64,iVBOR….
application/jsonimage_urlURL http o https pubblico dell'immagine. Il server la scarica (max. 10 MB).

Formati di input supportati: PNG, JPG, WebP, AVIF, GIF, BMP, SVG e ICO. Dimensione massima del file: 10 MB.

Parametri

Tutti i parametri sono facoltativi. Inviali come campi del modulo (multipart) o come proprietà JSON. I valori non validi tornano al valore predefinito.

NomeTipo / intervalloPredefinitoDescrizione
app_namestringa, max. 60 caratteriMy WebsiteNome del tuo sito web o della tua app, usato in manifest.json e nella pagina di esempio.
short_namestringa, max. 24 caratteriprimi 12 caratteri di app_nameNome breve mostrato sotto l'icona nelle schermate Home di Android.
theme_color#rrggbb#ffffffColore dell'interfaccia del browser (meta tag theme-color e manifest).
tile_color#rrggbbuguale a theme_colorColore di sfondo dei riquadri Start di Windows.
backgroundtransparent | #rrggbbtransparentSfondo delle icone per browser, Android e Windows.
apple_background#rrggbb#ffffffSfondo delle Apple touch icon e dell'icona maskable (iOS non supporta la trasparenza). Ignorato se background è un colore: in tal caso viene usato quel colore.
paddingintero, 0–40 (%)0Spazio vuoto attorno all'immagine, in percentuale rispetto alla dimensione dell'icona.
radiusintero, 0–50 (%)0Angoli arrotondati. 50 crea un cerchio. Non si applica alle icone Apple, che iOS arrotonda da sé.
zoomintero, 50–400 (%)100Scala dell'immagine all'interno dell'icona. Valori superiori a 100 ritagliano l'immagine.
offset_x, offset_ynumero, da -1 a 10Sposta l'immagine in orizzontale / verticale, come frazione della dimensione dell'icona.
pathstringa/Cartella sul tuo server in cui si troveranno le icone. Usata nello snippet HTML, nel manifest e in browserconfig.
displaystandalone | fullscreen | minimal-ui | browserstandaloneModalità di visualizzazione PWA scritta nel manifest.
pixelatedauto | 1 | 0autoScalatura nearest-neighbour nitida per la pixel art. auto la attiva per sorgenti di 64 px o meno.
maskable1 | 01Crea anche maskable-icon-512x512.png con un padding nella zona sicura per le icone adattive di Android.
ico_sizeselenco separato da virgole di 16, 24, 32, 48, 64, 128, 25616,32,48Dimensioni incorporate in favicon.ico.
groupselenco separato da virgole di favicon, apple, android, msfavicon,apple,android,msSet di icone da generare: favicon per browser, icone Apple touch, icone Android / PWA e tile Windows.
formatzip | jsonzipFormato della risposta – vedi sotto.

Risposta

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.

Esempio di richiesta – multipart, risposta 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>

Esempio di richiesta – JSON con URL dell'immagine, risposta 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…"}
  ]
}

Ottieni il tuo account

GET/me

Restituisce l'utente a cui appartiene la chiave API e lo stato attuale del limite di richieste. Utile per verificare una chiave. Richiede autenticazione; nessun parametro.

Esempio di richiesta

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

Esempio di risposta

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

Elenco delle dimensioni delle icone

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.

Esempio di richiesta

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

Esempio di risposta

{
  "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"}
  ]
}

Specifica OpenAPI

GET/openapi.json

Restituisce la descrizione OpenAPI 3.1 di questa API. Nessuna autenticazione. Importala in Postman, Insomnia o Swagger UI, oppure usala per generare un client tipizzato per il tuo linguaggio.

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

Errori

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."
  }
}
Stato HTTPCodice di erroreSignificato
400bad_requestLa richiesta non è valida, ad esempio non è stata inviata alcuna immagine o il corpo JSON non è valido.
401unauthorizedLa chiave API è mancante o non valida.
403forbiddenL'email del proprietario della chiave non è confermata, l'iscrizione alla newsletter è disattivata o l'account è stato bloccato.
413file_too_largeL'immagine supera i 10 MB.
415unsupported_typeIl tipo di file o il content type della richiesta non è supportato.
422invalid_imageNon è stato possibile decodificare il file come immagine oppure scaricare l'URL dell'immagine.
429rate_limitedTroppe richieste. Attendi fino a X-RateLimit-Reset.
500server_errorSi è verificato un problema da parte nostra. Riprova più tardi; contatta il supporto se persiste.

File di output

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

FileDimensioneGruppo
favicon.ico16, 32, 48 (configurabile)sempre
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

File aggiuntivi

FileInclusoDescrizione
favicon.svgSolo per input SVG senza ritaglio, zoom, margine, angoli o sfondoCopia ripulita del tuo SVG per i browser che supportano le favicon vettoriali.
manifest.json, site.webmanifestandroidWeb app manifest per Android e PWA installabili (due copie identiche).
browserconfig.xmlmsConfigurazione del tile Windows con il colore del tuo tile.
readme-makefav.txtsempreIstruzioni di installazione con il codice HTML da inserire nel tuo <head> alla fine.

Esempi di codice

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.

Caricamento 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; }

Corpo JSON con immagine codificata in base64 (richiede 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; }

Utilizzo in 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>

Dopo la pubblicazione, svuota la cache del browser o apri il sito in una finestra privata: i browser mettono in cache le favicon in modo molto aggressivo.

Changelog

v1

  • Prima versione pubblica dell'API REST di MakeFav.
  • Endpoints POST /generate, GET /me, GET /sizes and GET /openapi.json.
  • Formati di risposta ZIP e JSON, input immagine multipart, base64 e URL.
  • Chiavi API personali con 100 richieste all'ora.

La versione 1 è stabile: aggiungiamo solo parametri e campi opzionali. Le modifiche incompatibili verranno rilasciate come nuova versione con preavviso.

Supporto

Domande, segnalazioni di bug o serve un limite di richieste più alto? Siamo felici di aiutarti. Includi nel messaggio l'ora della richiesta e il codice di errore, mai la tua chiave API.