REST API · v1

MakeFav API documentation

Generate complete favicon packages from your own code, build scripts and CI pipelines. One request turns any image into favicon.ico, Apple touch icons, Android and PWA icons, a web manifest and ready-to-paste HTML.

On this page

Quick start

The MakeFav API is a simple HTTPS + JSON REST API. All endpoints live under one base URL:

https://makefav.com/api/v1
  1. Create a free account
    Sign up, confirm your email address and keep the MakeFav newsletter subscription active – that is the only condition of the free plan.
  2. Create an API key
    Open the API keys page in your account and create a personal key. It starts with mf_ and is shown only once, so store it securely. Manage API keys
  3. Send your first request
    Upload an image to the generate endpoint and save the returned ZIP file:
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.

Authentication

Every request to a protected endpoint must include a personal API key. You can create, name and revoke keys at any time on your account page: API keys

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
Keys belong to a user whose email address is confirmed and whose newsletter subscription is active (free plan condition). If the email is not confirmed, the newsletter is disabled or the account is banned, every request returns 403 Forbidden.
Treat API keys like passwords: keep them on the server or in CI secrets, never in browser code, mobile apps or public repositories. Revoke a key immediately if it leaks.

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

Rate limits

By default each API key may make 100 requests per hour. Every authenticated response tells you where you stand:

HeaderDescription
X-RateLimit-LimitMaximum number of requests allowed in the current window.
X-RateLimit-RemainingRequests left in the current window.
X-RateLimit-ResetUnix timestamp (seconds, UTC) when the window resets.
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

EndpointAuthDescription
POST /generateAPI keyCreate a complete favicon package.
GET /meAPI keyYour account and current rate-limit status.
GET /sizesNoneList of all icon files and sizes the generator produces.
GET /openapi.jsonNoneMachine-readable OpenAPI 3.1 specification.

Generate a favicon package

POST/generate

Creates a complete favicon package from one source image. Send the image in one of three ways:

Content typeImage fieldDescription
multipart/form-dataimageFile upload. Recommended – the most efficient option.
application/jsonimage_base64Base64-encoded image, either raw base64 or a data URL such as data:image/png;base64,iVBOR….
application/jsonimage_urlPublic http or https URL of the image. The server downloads it (max. 10 MB).

Supported input formats: PNG, JPG, WebP, AVIF, GIF, BMP, SVG and ICO. Maximum file size: 10 MB.

Parameters

All parameters are optional. Send them as form fields (multipart) or as JSON properties. Invalid values fall back to the default.

NameType / rangeDefaultDescription
app_namestring, max. 60 charactersMy WebsiteName of your website or app, used in manifest.json and the example page.
short_namestring, max. 24 charactersfirst 12 characters of app_nameShort name shown under the icon on Android home screens.
theme_color#rrggbb#ffffffBrowser UI colour (theme-color meta tag and manifest).
tile_color#rrggbbsame as theme_colorBackground colour of Windows Start tiles.
backgroundtransparent | #rrggbbtransparentBackground of the browser, Android and Windows icons.
apple_background#rrggbb#ffffffBackground of Apple touch icons and the maskable icon (iOS does not support transparency). Ignored when background is a colour – that colour is used instead.
paddinginteger, 0–40 (%)0Empty space around the image, as a percentage of the icon size.
radiusinteger, 0–50 (%)0Rounded corners. 50 makes a circle. Not applied to Apple icons, which iOS rounds itself.
zoominteger, 50–400 (%)100Scale of the image inside the icon. Values above 100 crop the image.
offset_x, offset_ynumber, -1 to 10Moves the image horizontally / vertically, as a fraction of the icon size.
pathstring/Folder on your server where the icons will live. Used in the HTML snippet, manifest and browserconfig.
displaystandalone | fullscreen | minimal-ui | browserstandalonePWA display mode written to the manifest.
pixelatedauto | 1 | 0autoSharp nearest-neighbour scaling for pixel art. auto enables it for sources of 64 px or smaller.
maskable1 | 01Also create maskable-icon-512x512.png with a safe-zone padding for Android adaptive icons.
ico_sizescomma-separated list of 16, 24, 32, 48, 64, 128, 25616,32,48Sizes embedded in favicon.ico.
groupscomma-separated list of favicon, apple, android, msfavicon,apple,android,msIcon sets to generate: browser favicons, Apple touch icons, Android / PWA icons and Windows tiles.
formatzip | jsonzipResponse format – see below.

Response

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.

Example request – multipart, ZIP response

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>

Example request – JSON with image URL, JSON response

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

Get your account

GET/me

Returns the user the API key belongs to and the current rate-limit status. Useful to verify a key. Requires authentication; no parameters.

Example request

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

Example response

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

List icon sizes

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.

Example request

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

Example response

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

OpenAPI specification

GET/openapi.json

Returns the OpenAPI 3.1 description of this API. No authentication. Import it into Postman, Insomnia or Swagger UI, or use it to generate a typed client for your language.

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

Errors

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."
  }
}
HTTP statusError codeMeaning
400bad_requestThe request is malformed, for example no image was sent or the JSON body is invalid.
401unauthorizedThe API key is missing or invalid.
403forbiddenThe key owner's email is not confirmed, the newsletter subscription is disabled, or the account is banned.
413file_too_largeThe image is larger than 10 MB.
415unsupported_typeThe file type or request content type is not supported.
422invalid_imageThe file could not be decoded as an image, or the image URL could not be downloaded.
429rate_limitedToo many requests. Wait until X-RateLimit-Reset.
500server_errorSomething went wrong on our side. Retry later; contact support if it persists.

Output files

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

FileSizeGroup
favicon.ico16, 32, 48 (configurable)always
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

Additional files

FileIncludedDescription
favicon.svgOnly for SVG input without crop, zoom, padding, corners or backgroundSanitised copy of your SVG for browsers that support vector favicons.
manifest.json, site.webmanifestandroidWeb app manifest for Android and installable PWAs (two identical copies).
browserconfig.xmlmsWindows tile configuration with your tile colour.
readme-makefav.txtalwaysInstallation instructions with the HTML code for your <head> at the end.

Code examples

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.

Multipart upload:

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

JSON body with a base64-encoded image (requires 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; }

HTML usage

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>

After deploying, clear your browser cache or open the site in a private window – browsers cache favicons aggressively.

Changelog

v1

  • Initial public release of the MakeFav REST API.
  • Endpoints POST /generate, GET /me, GET /sizes and GET /openapi.json.
  • ZIP and JSON response formats, multipart, base64 and URL image input.
  • Personal API keys with 100 requests per hour.

Version 1 is stable: we only add optional parameters and fields. Breaking changes will be released as a new version with advance notice.

Support

Questions, bug reports or need a higher rate limit? We are happy to help. Please include the request time and the error code in your message – never your API key.