API REST · v1

Documentación de la API de MakeFav

Genera paquetes de favicons completos desde tu propio código, scripts de compilación y pipelines de CI. Una sola solicitud convierte cualquier imagen en favicon.ico, Apple touch icons, iconos para Android y PWA, un web manifest y HTML listo para pegar.

En esta página

Inicio rápido

La API de MakeFav es una API REST sencilla con HTTPS y JSON. Todos los endpoints están bajo una única URL base:

https://makefav.com/api/v1
  1. Crea una cuenta gratuita
    Regístrate, confirma tu dirección de correo electrónico y mantén activa la suscripción al boletín de MakeFav: es la única condición del plan gratuito.
  2. Crea una clave de API
    Abre la página de claves de API en tu cuenta y crea una clave personal. Empieza por mf_ y se muestra solo una vez, así que guárdala de forma segura. Gestionar claves de API
  3. Envía tu primera solicitud
    Sube una imagen al endpoint de generación y guarda el archivo ZIP devuelto:
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.

Autenticación

Toda solicitud a un endpoint protegido debe incluir una clave de API personal. Puedes crear, nombrar y revocar claves en cualquier momento desde la página de tu cuenta: Claves de 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
Las claves pertenecen a un usuario cuya dirección de correo electrónico está confirmada y cuya suscripción al boletín está activa (condición del plan gratuito). Si el correo no está confirmado, el boletín está desactivado o la cuenta está bloqueada, todas las solicitudes devuelven 403 Forbidden.
Trata las claves de API como contraseñas: guárdalas en el servidor o en secretos de CI, nunca en código de navegador, aplicaciones móviles o repositorios públicos. Revoca una clave de inmediato si se filtra.

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

Límites de uso

De forma predeterminada, cada clave de API puede hacer 100 solicitudes por hora. Cada respuesta autenticada te indica cuál es tu situación:

EncabezadoDescripción
X-RateLimit-LimitNúmero máximo de solicitudes permitidas en la ventana actual.
X-RateLimit-RemainingSolicitudes restantes en la ventana actual.
X-RateLimit-ResetMarca de tiempo Unix (segundos, UTC) en la que se reinicia la ventana.
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

EndpointAutenticaciónDescripción
POST /generateClave de APICrea un paquete de favicons completo.
GET /meClave de APITu cuenta y el estado actual del límite de uso.
GET /sizesNingunaLista de todos los archivos de iconos y tamaños que genera el generador.
GET /openapi.jsonNingunaEspecificación OpenAPI 3.1 legible por máquinas.

Generar un paquete de favicons

POST/generate

Crea un paquete de favicons completo a partir de una imagen de origen. Envía la imagen de una de estas tres formas:

Tipo de contenidoCampo de imagenDescripción
multipart/form-dataimageSubida de archivo. Recomendado: es la opción más eficiente.
application/jsonimage_base64Base64-encoded image, either raw base64 or a data URL such as data:image/png;base64,iVBOR….
application/jsonimage_urlURL pública http o https de la imagen. El servidor la descarga (máx. 10 MB).

Formatos de entrada admitidos: PNG, JPG, WebP, AVIF, GIF, BMP, SVG e ICO. Tamaño máximo de archivo: 10 MB.

Parámetros

Todos los parámetros son opcionales. Envíalos como campos de formulario (multipart) o como propiedades JSON. Los valores no válidos vuelven al valor predeterminado.

NombreTipo / rangoPredeterminadoDescripción
app_namecadena, máx. 60 caracteresMy WebsiteNombre de tu sitio web o aplicación, usado en manifest.json y en la página de ejemplo.
short_namecadena, máx. 24 caracteresprimeros 12 caracteres de app_nameNombre corto que se muestra bajo el icono en la pantalla de inicio de Android.
theme_color#rrggbb#ffffffColor de la interfaz del navegador (etiqueta meta theme-color y manifest).
tile_color#rrggbbigual que theme_colorColor de fondo de los mosaicos del menú Inicio de Windows.
backgroundtransparent | #rrggbbtransparentFondo de los iconos del navegador, Android y Windows.
apple_background#rrggbb#ffffffFondo de los Apple touch icons y del icono maskable (iOS no admite transparencia). Se ignora cuando background es un color; en ese caso se usa dicho color.
paddingentero, 0–40 (%)0Espacio vacío alrededor de la imagen, como porcentaje del tamaño del icono.
radiusentero, 0–50 (%)0Esquinas redondeadas. 50 crea un círculo. No se aplica a los iconos de Apple, que iOS redondea por sí mismo.
zoomentero, 50–400 (%)100Escala de la imagen dentro del icono. Los valores superiores a 100 recortan la imagen.
offset_x, offset_ynúmero, de -1 a 10Desplaza la imagen horizontal / verticalmente, como fracción del tamaño del icono.
pathcadena/Carpeta de tu servidor donde estarán los iconos. Se usa en el fragmento HTML, el manifest y browserconfig.
displaystandalone | fullscreen | minimal-ui | browserstandaloneModo de visualización de la PWA escrito en el manifest.
pixelatedauto | 1 | 0autoEscalado nítido por vecino más cercano para pixel art. auto lo activa para imágenes de origen de 64 px o menos.
maskable1 | 01Crea también maskable-icon-512x512.png con un margen de zona segura para los iconos adaptativos de Android.
ico_sizeslista separada por comas de 16, 24, 32, 48, 64, 128, 25616,32,48Tamaños incluidos en favicon.ico.
groupslista separada por comas de favicon, apple, android, msfavicon,apple,android,msConjuntos de iconos que se generarán: favicons para navegador, iconos Apple touch, iconos Android / PWA y mosaicos de Windows.
formatzip | jsonzipFormato de respuesta – ver más abajo.

Respuesta

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.

Ejemplo de solicitud – multipart, respuesta 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>

Ejemplo de solicitud – JSON con URL de imagen, respuesta 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…"}
  ]
}

Obtener tu cuenta

GET/me

Devuelve el usuario al que pertenece la clave de API y el estado actual del límite de solicitudes. Útil para verificar una clave. Requiere autenticación; sin parámetros.

Ejemplo de solicitud

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

Ejemplo de respuesta

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

Listar tamaños de icono

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.

Ejemplo de solicitud

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

Ejemplo de respuesta

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

Especificación OpenAPI

GET/openapi.json

Devuelve la descripción OpenAPI 3.1 de esta API. Sin autenticación. Impórtala en Postman, Insomnia o Swagger UI, o úsala para generar un cliente tipado para tu lenguaje.

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

Errores

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."
  }
}
Estado HTTPCódigo de errorSignificado
400bad_requestLa solicitud está mal formada, por ejemplo, no se envió ninguna imagen o el cuerpo JSON no es válido.
401unauthorizedFalta la clave de API o no es válida.
403forbiddenEl correo del propietario de la clave no está confirmado, la suscripción al boletín está desactivada o la cuenta está bloqueada.
413file_too_largeLa imagen supera los 10 MB.
415unsupported_typeEl tipo de archivo o el tipo de contenido de la solicitud no es compatible.
422invalid_imageNo se pudo decodificar el archivo como imagen o no se pudo descargar la URL de la imagen.
429rate_limitedDemasiadas solicitudes. Espera hasta X-RateLimit-Reset.
500server_errorAlgo salió mal por nuestra parte. Inténtalo de nuevo más tarde; contacta con soporte si persiste.

Archivos de salida

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

ArchivoTamañoGrupo
favicon.ico16, 32, 48 (configurable)siempre
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

Archivos adicionales

ArchivoIncluidoDescripción
favicon.svgSolo para imágenes SVG sin recorte, zoom, relleno, esquinas ni fondoCopia depurada de tu SVG para navegadores compatibles con favicons vectoriales.
manifest.json, site.webmanifestandroidManifiesto de aplicación web para Android y PWA instalables (dos copias idénticas).
browserconfig.xmlmsConfiguración de mosaicos de Windows con el color de tu mosaico.
readme-makefav.txtsiempreInstrucciones de instalación con el código HTML para tu <head> al final.

Ejemplos de código

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.

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

Cuerpo JSON con una imagen codificada en base64 (requiere 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; }

Uso 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>

Tras el despliegue, borra la caché del navegador o abre el sitio en una ventana privada: los navegadores almacenan los favicons en caché de forma agresiva.

Registro de cambios

v1

  • Lanzamiento público inicial de la API REST de MakeFav.
  • Endpoints POST /generate, GET /me, GET /sizes and GET /openapi.json.
  • Formatos de respuesta ZIP y JSON; imagen de entrada por multipart, base64 y URL.
  • Claves de API personales con 100 solicitudes por hora.

La versión 1 es estable: solo añadimos parámetros y campos opcionales. Los cambios incompatibles se publicarán como una nueva versión con previo aviso.

Soporte

¿Preguntas, informes de errores o necesitas un límite mayor? Estaremos encantados de ayudarte. Incluye en tu mensaje la hora de la solicitud y el código de error, nunca tu clave de API.