Skip to content

Go Logo API

Get the logo behind any URL with one HTTP request in Go — markup, BIMI and favicon detection merged, with format, dimensions and brand palette.

Get a logo in Go

No module and no scraping — the Microlink REST API detects the best logo for any URL and returns it with a single HTTP GET. Here it is with net/http and encoding/json from the Go standard library.
Step 01 · Extract any URL
A few lines with the standard library — no module to add. Point it at a domain and read the logo from the JSON response.
main.go
package main

import (
  "encoding/json"
  "fmt"
  "net/http"
  "net/url"
)

type Logo struct {
  URL        string `json:"url"`
  Type       string `json:"type"`
  Width      int    `json:"width"`
  SizePretty string `json:"size_pretty"`
}

func main() {
  params := url.Values{"url": {"https://stripe.com"}}

  res, _ := http.Get("https://api.microlink.io?" + params.Encode())
  defer res.Body.Close()

  var payload struct {
    Data struct {
      Logo Logo `json:"logo"`
    } `json:"data"`
  }
  json.NewDecoder(res.Body).Decode(&payload)

  fmt.Println(payload.Data.Logo.URL)        // absolute, hotlink-ready
  fmt.Println(payload.Data.Logo.SizePretty) // '3.14 kB'
}
Step 02 · Read the logo fields
URL, format, dimensions and byte size come back in one call — everything an img tag or an avatar component needs.
palette.go
package main

import (
  "encoding/json"
  "fmt"
  "net/http"
  "net/url"
)

func main() {
  params := url.Values{
    "url":     {"https://stripe.com"},
    "palette": {"true"}, // add the brand palette to every detected image
  }

  res, _ := http.Get("https://api.microlink.io?" + params.Encode())
  defer res.Body.Close()

  var payload struct {
    Data struct {
      Logo struct {
        URL     string   `json:"url"`
        Palette []string `json:"palette"`
      } `json:"logo"`
    } `json:"data"`
  }
  json.NewDecoder(res.Body).Decode(&payload)

  // Ordered from most dominant color to least
  fmt.Println(payload.Data.Logo.Palette) // [#543CFC #DEDAFC ...]
}
Step 03 · Render JavaScript pages
Icons injected by client-side JavaScript only exist after the page renders — prerender in a real browser and they are detected too, still one request.
spa.go
package main

import (
  "encoding/json"
  "fmt"
  "net/http"
  "net/url"
)

func main() {
  params := url.Values{
    "url":             {"https://app.example.com"},
    "prerender":       {"true"}, // render JS in a real browser first
    "waitForSelector": {"h1"},   // detect only when the content exists
  }

  res, _ := http.Get("https://api.microlink.io?" + params.Encode())
  defer res.Body.Close()

  var payload struct {
    Data struct {
      Logo struct {
        URL string `json:"url"`
      } `json:"logo"`
    } `json:"data"`
  }
  json.NewDecoder(res.Body).Decode(&payload)

  // Icons injected by client-side JavaScript are found too
  fmt.Println(payload.Data.Logo.URL)
}
Step 04 · Hotlink the image directly
Add embed=logo.url and the API URL becomes the image itself — drop it into an img tag or a CSS background with no JSON parsing.
embed.go
package main

import (
  "fmt"
  "net/url"
)

func main() {
  params := url.Values{
    "url":   {"https://stripe.com"},
    "embed": {"logo.url"}, // the API URL becomes the image itself
  }

  logoURL := "https://api.microlink.io?" + params.Encode()

  // Drop it straight into an <img> tag — no JSON parsing
  fmt.Printf(`<img src="%s" alt="stripe logo" />`, logoURL)
}

Drop it into your framework

A Gin redirect, an Echo proxy, or an avatar worker — the same request becomes your own logo endpoint.
  • Gin
  • Echo
  • Avatar Worker
  • Plain Go
package main

import (
  "io"
  "net/http"
  "net/url"

  "github.com/labstack/echo/v4"
)

func main() {
  e := echo.New()

  // GET /logo?url=https://stripe.com — proxy the image bytes
  e.GET("/logo", func(c echo.Context) error {
    params := url.Values{
      "url":   {c.QueryParam("url")},
      "embed": {"logo.url"},
    }

    res, err := http.Get("https://api.microlink.io?" + params.Encode())
    if err != nil {
      return err
    }
    defer res.Body.Close()

    return c.Stream(http.StatusOK, res.Header.Get("Content-Type"), res.Body.(io.Reader))
  })

  e.Logger.Fatal(e.Start(":1323"))
}

Skip the icon-hunting scrapers

Rolling your own means parsing apple-touch-icon, og:logo and JSON-LD per site, checking BIMI DNS records, probing image formats and building a palette pipeline. The API returns the best logo for any page without any of the moving parts.

DIY logo detection

  • Parse apple-touch-icon, og:logo and JSON-LD per site
  • Check BIMI DNS records and favicon fallbacks yourself
  • Probe image formats and dimensions with extra requests
  • JavaScript-injected icons need a headless browser
  • Extract brand palettes with your own image pipeline
  • You build the caching, retries and autoscaling

Microlink for Go

  • One HTTP request — net/http, no module to add
  • Markup, BIMI and favicon detection merged for you
  • Format, dimensions and byte size included
  • Brand palette with WCAG-friendly color pairs
  • Hotlink-ready with embed=logo.url
  • Autoscaled fleet with a 99.95% uptime SLA

Built for the way you write Go.

A REST API that feels native in Go — one call, JSON back, and at home in anything from a CLI to a logo proxy. Read the API overview to go deeper.

  • Three Detection Sources

    Page markup, the BIMI DNS record and the favicon as fallback — the best available asset wins, every time.
  • Standard Library Only

    net/http and encoding/json ship with Go — the examples compile with zero external dependencies.
  • Complete Image Metadata

    Format, byte size and exact dimensions come with every logo — no HEAD requests or image probing on your side.
  • Hotlink-Ready

    The logo comes back as an absolute URL — hotlink it directly, or use embed=logo.url and the API URL is the image.
  • Real Browser Detection

    Icons injected by client-side JavaScript are detected too, with prerender=true and waitForSelector.
  • Brand Palette

    Enable palette=true and every detected image gains a dominant-color palette with WCAG-friendly pairs — theme your UI straight from the response.
  • Framework Friendly

    Drop it into Gin, Echo, or an avatar worker as a handler in a few lines.
  • Zero Infrastructure

    Managed Headless Chrome, autoscaled and load-balanced. No browser pool, no servers, no patching to maintain.
  • Generous Free Tier

    Start with 25 requests per day — no account, no credit card. Add an API key when you are ready to scale.
  • Three Detection Sources

    Page markup, the BIMI DNS record and the favicon as fallback — the best available asset wins, every time.
  • Standard Library Only

    net/http and encoding/json ship with Go — the examples compile with zero external dependencies.
  • Complete Image Metadata

    Format, byte size and exact dimensions come with every logo — no HEAD requests or image probing on your side.
  • Hotlink-Ready

    The logo comes back as an absolute URL — hotlink it directly, or use embed=logo.url and the API URL is the image.
  • Real Browser Detection

    Icons injected by client-side JavaScript are detected too, with prerender=true and waitForSelector.
  • Brand Palette

    Enable palette=true and every detected image gains a dominant-color palette with WCAG-friendly pairs — theme your UI straight from the response.
  • Framework Friendly

    Drop it into Gin, Echo, or an avatar worker as a handler in a few lines.
  • Zero Infrastructure

    Managed Headless Chrome, autoscaled and load-balanced. No browser pool, no servers, no patching to maintain.
  • Generous Free Tier

    Start with 25 requests per day — no account, no credit card. Add an API key when you are ready to scale.

Try it live in the playground

Paste a URL and see the detected logo before you write a line of Go.

Go Logo API FAQ

Everything Go developers ask before integrating the Microlink logo API.

Where does the logo come from?

Microlink walks the page markup — apple-touch-icon, Open Graph and JSON-LD — checks the BIMI record in DNS, and falls back to the favicon. The best available asset wins, with its format and dimensions included.

Do I need to install a module?

No. The examples use net/http and encoding/json from the Go standard library — they compile with zero external dependencies.

What about icons injected by JavaScript?

Pass prerender=true and the page is rendered in a real browser before detection, so icons injected by React, Vue or any client-side framework are found too. Combine it with waitForSelector to wait for specific content.
Yes. Add embed=logo.url and the API URL becomes the image itself — use it in an img tag or a CSS background with no JSON parsing and nothing to store on your side.

Is there a free tier or do I need an API key?

The free tier gives you 25 requests per day with no account, no credit card, and no API key. Just call the endpoint and start extracting.
When you need more throughput or caching control, add an apiKey header and requests route to the Pro tier. See pricing for the limits.
Responses are cached at the edge with a sane default TTL, and you control freshness per request — see the API overview for cache parameters.

Start extracting in Go

Get 25 requests/day with zero commitment — no account and no credit card. Send your first request and get logos back in minutes.
No login needed
25 reqs/day free
No credit card