Back to Brand Kit Extractor API

API documentation

Brand Kit Extractor API

Send a POST request with a public HTTP or HTTPS URL. The extractor follows at most five validated redirects, downloads up to 3 MB of HTML, and analyzes no more than the requested number of directly linked CSS files. Name and logo results are ranked from JSON-LD, Open Graph, manifest metadata, semantic markup, filenames, layout position, dimensions, and repetition. Colors favor explicit brand variables and interactive UI rules over neutral-frequency counts. Missing or weakly supported values are returned as null or empty arrays. Only ports 80 and 443 are accepted; localhost, private, reserved, link-local, metadata, and non-HTTP destinations are blocked at every redirect. Network, TLS, content-type, HTTP, and response-size failures use a stable JSON error object with code and message.

Current planFree100 requests per month

Quota

Free usage

Used0
Remaining100
Limit100
Resets at 2026-09-30 23:59:59.

Authentication

Bearer token

Authorization: Bearer {serviceTokenHere}

For compatibility with simple image tags and legacy clients, ?token=... and the X-API-Token header are also accepted.

POST

Extract Brand Kit

https://ai.mihajlo.mk/api/brand-kit-extractor/v1/extract-brand-kit

Analyze one public webpage and its directly referenced brand resources.

ParameterTypeRequiredDescription
urlstringYesPublic HTTP or HTTPS webpage URL to analyze.
max_css_filesintegerNoMaximum number of directly linked stylesheets to download and inspect.
include_css_variablesbooleanNoInclude brand-related CSS custom properties in the response.

cURL example

curl --request POST \
  --header "Authorization: Bearer {serviceTokenHere}" \
  --header "Content-Type: application/json" \
  --data '{"url":"https://example.com","max_css_files":10,"include_css_variables":true}' \
  "https://ai.mihajlo.mk/api/brand-kit-extractor/v1/extract-brand-kit"

Example response

{
    "url": "https://example.com/",
    "final_url": "https://www.example.com/",
    "brand": {
        "name": "Example",
        "logo": {
            "url": "https://www.example.com/assets/logo.svg",
            "confidence": 96
        },
        "alternative_logos": [
            "https://www.example.com/assets/logo-white.svg"
        ],
        "favicon": "https://www.example.com/favicon.ico",
        "apple_touch_icon": "https://www.example.com/apple-touch-icon.png"
    },
    "colors": {
        "primary": "#0D9488",
        "secondary": "#0F172A",
        "accent": "#F59E0B",
        "background": "#FFFFFF",
        "palette": [
            "#0D9488",
            "#0F172A",
            "#F59E0B",
            "#FFFFFF"
        ]
    },
    "fonts": [
        {
            "family": "Inter",
            "source": "Google Fonts",
            "urls": []
        }
    ],
    "images": {
        "og_image": "https://www.example.com/og-image.jpg",
        "hero_images": [
            "https://www.example.com/assets/hero.webp"
        ],
        "branding_images": []
    },
    "social": {
        "facebook": null,
        "instagram": "https://www.instagram.com/example/",
        "linkedin": "https://www.linkedin.com/company/example/",
        "youtube": null,
        "x": null,
        "tiktok": null,
        "pinterest": null
    },
    "theme": {
        "theme_color": "#0D9488",
        "css_variables": {
            "--brand-color": "#0D9488"
        }
    }
}

Live tester

Login to run live requests. All endpoint documentation remains public.

Login to test

Errors

Standard error envelope

{
  "ok": false,
  "error": "invalid_request",
  "message": "Human-readable explanation"
}

Common statuses: 401 invalid token, 422 invalid parameters, 429 quota used, and 502 upstream or capture failure.