API REST · v1

Documentação da API MakeFav

Gere pacotes de favicons completos a partir do seu próprio código, scripts de build e pipelines de CI. Um único pedido transforma qualquer imagem em favicon.ico, Apple touch icons, ícones Android e PWA, um web manifest e HTML pronto a colar.

Nesta página

Início rápido

A API MakeFav é uma API REST simples com HTTPS + JSON. Todos os endpoints estão sob um único URL base:

https://makefav.com/api/v1
  1. Crie uma conta gratuita
    Registe-se, confirme o seu endereço de e-mail e mantenha ativa a subscrição da newsletter MakeFav – é a única condição do plano gratuito.
  2. Crie uma chave de API
    Abra a página de chaves de API na sua conta e crie uma chave pessoal. Começa por mf_ e só é mostrada uma vez, por isso guarde-a em segurança. Gerir chaves de API
  3. Envie o seu primeiro pedido
    Carregue uma imagem para o endpoint generate e guarde o ficheiro ZIP devolvido:
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.

Autenticação

Todos os pedidos a um endpoint protegido têm de incluir uma chave de API pessoal. Pode criar, nomear e revogar chaves a qualquer momento na página da sua conta: Chaves 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
As chaves pertencem a um utilizador cujo endereço de e-mail está confirmado e cuja subscrição da newsletter está ativa (condição do plano gratuito). Se o e-mail não estiver confirmado, a newsletter estiver desativada ou a conta estiver banida, todos os pedidos devolvem 403 Forbidden.
Trate as chaves de API como palavras-passe: mantenha-as no servidor ou em segredos de CI, nunca em código de navegador, apps móveis ou repositórios públicos. Revogue uma chave imediatamente se ela for exposta.

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

Limites de pedidos

Por predefinição, cada chave de API pode fazer 100 pedidos por hora. Cada resposta autenticada indica a sua situação atual:

CabeçalhoDescrição
X-RateLimit-LimitNúmero máximo de pedidos permitidos na janela atual.
X-RateLimit-RemainingPedidos restantes na janela atual.
X-RateLimit-ResetTimestamp Unix (segundos, UTC) em que a janela é reposta.
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

EndpointAutenticaçãoDescrição
POST /generateChave de APICriar um pacote de favicons completo.
GET /meChave de APIA sua conta e o estado atual do limite de pedidos.
GET /sizesNenhumaLista de todos os ficheiros de ícones e tamanhos que o gerador produz.
GET /openapi.jsonNenhumaEspecificação OpenAPI 3.1 legível por máquina.

Gerar um pacote de favicons

POST/generate

Cria um pacote de favicons completo a partir de uma imagem de origem. Envie a imagem de uma de três formas:

Tipo de conteúdoCampo da imagemDescrição
multipart/form-dataimageCarregamento de ficheiro. Recomendado – a opção mais eficiente.
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 público da imagem. O servidor transfere-a (máx. 10 MB).

Formatos de entrada suportados: PNG, JPG, WebP, AVIF, GIF, BMP, SVG e ICO. Tamanho máximo do ficheiro: 10 MB.

Parâmetros

Todos os parâmetros são opcionais. Envie-os como campos de formulário (multipart) ou como propriedades JSON. Valores inválidos voltam ao valor predefinido.

NomeTipo / intervaloPredefiniçãoDescrição
app_namestring, máx. 60 caracteresMy WebsiteNome do seu website ou app, usado no manifest.json e na página de exemplo.
short_namestring, máx. 24 caracteresprimeiros 12 caracteres de app_nameNome curto apresentado por baixo do ícone nos ecrãs principais do Android.
theme_color#rrggbb#ffffffCor da interface do navegador (meta tag theme-color e manifest).
tile_color#rrggbbigual a theme_colorCor de fundo dos mosaicos do menu Iniciar do Windows.
backgroundtransparent | #rrggbbtransparentFundo dos ícones do navegador, Android e Windows.
apple_background#rrggbb#ffffffFundo dos Apple touch icons e do ícone maskable (o iOS não suporta transparência). Ignorado quando o fundo é uma cor – nesse caso, é usada essa cor.
paddinginteiro, 0–40 (%)0Espaço vazio à volta da imagem, como percentagem do tamanho do ícone.
radiusinteiro, 0–50 (%)0Cantos arredondados. 50 cria um círculo. Não é aplicado aos ícones Apple, que o iOS arredonda por si.
zoominteiro, 50–400 (%)100Escala da imagem dentro do ícone. Valores acima de 100 cortam a imagem.
offset_x, offset_ynúmero, -1 a 10Move a imagem na horizontal / vertical, como fração do tamanho do ícone.
pathstring/Pasta no seu servidor onde os ícones ficarão. Usada no excerto HTML, no manifest e no browserconfig.
displaystandalone | fullscreen | minimal-ui | browserstandaloneModo de apresentação PWA escrito no manifest.
pixelatedauto | 1 | 0autoEscala nearest-neighbour nítida para pixel art. O modo auto ativa-a para origens de 64 px ou menos.
maskable1 | 01Cria também maskable-icon-512x512.png com margem de zona segura para ícones adaptáveis do Android.
ico_sizeslista separada por vírgulas de 16, 24, 32, 48, 64, 128, 25616,32,48Tamanhos incluídos no favicon.ico.
groupslista separada por vírgulas de favicon, apple, android, msfavicon,apple,android,msConjuntos de ícones a gerar: favicons para navegadores, Apple touch icons, ícones Android / PWA e mosaicos do Windows.
formatzip | jsonzipFormato da resposta – veja abaixo.

Resposta

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.

Exemplo de pedido – multipart, resposta em 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>

Exemplo de pedido – JSON com URL da imagem, resposta em 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…"}
  ]
}

Obtenha a sua conta

GET/me

Devolve o utilizador a quem pertence a chave de API e o estado atual do limite de pedidos. Útil para verificar uma chave. Requer autenticação; sem parâmetros.

Exemplo de pedido

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

Exemplo de resposta

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

Listar tamanhos de ícones

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.

Exemplo de pedido

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

Exemplo de resposta

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

Especificação OpenAPI

GET/openapi.json

Devolve a descrição OpenAPI 3.1 desta API. Sem autenticação. Importe-a no Postman, Insomnia ou Swagger UI, ou use-a para gerar um cliente tipado para a sua linguagem.

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

Erros

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 erroSignificado
400bad_requestO pedido está malformado, por exemplo, nenhuma imagem foi enviada ou o corpo JSON é inválido.
401unauthorizedA chave de API está em falta ou é inválida.
403forbiddenO e-mail do proprietário da chave não está confirmado, a subscrição da newsletter está desativada ou a conta foi banida.
413file_too_largeA imagem é maior que 10 MB.
415unsupported_typeO tipo de ficheiro ou o tipo de conteúdo do pedido não é suportado.
422invalid_imageNão foi possível descodificar o ficheiro como imagem ou não foi possível transferir o URL da imagem.
429rate_limitedDemasiados pedidos. Aguarde até X-RateLimit-Reset.
500server_errorOcorreu um problema do nosso lado. Tente novamente mais tarde; contacte o suporte se persistir.

Ficheiros gerados

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

FicheiroTamanhoGrupo
favicon.ico16, 32, 48 (configurável)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

Ficheiros adicionais

FicheiroIncluídoDescrição
favicon.svgApenas para SVG de entrada sem recorte, zoom, margem, cantos ou fundoCópia sanitizada do seu SVG para navegadores que suportam favicons vetoriais.
manifest.json, site.webmanifestandroidManifesto de aplicação web para Android e PWAs instaláveis (duas cópias idênticas).
browserconfig.xmlmsConfiguração do mosaico do Windows com a cor do seu mosaico.
readme-makefav.txtsempreInstruções de instalação com o código HTML para o seu <head> no final.

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

Envio 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 com imagem codificada em base64 (requer 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; }

Utilização em 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>

Após a publicação, limpe a cache do navegador ou abra o site numa janela privada – os navegadores guardam os favicons em cache de forma agressiva.

Registo de alterações

v1

  • Lançamento público inicial da API REST do MakeFav.
  • Endpoints POST /generate, GET /me, GET /sizes and GET /openapi.json.
  • Formatos de resposta ZIP e JSON, entrada de imagem por multipart, base64 e URL.
  • Chaves de API pessoais com 100 pedidos por hora.

A versão 1 é estável: só adicionamos parâmetros e campos opcionais. Alterações incompatíveis serão lançadas como uma nova versão, com aviso prévio.

Suporte

Dúvidas, relatórios de erros ou precisa de um limite mais alto? Teremos todo o gosto em ajudar. Inclua na mensagem a hora do pedido e o código de erro – nunca a sua chave de API.