Crawlora Docs
A single, unauthenticated image URL that returns a domain's best-ranked logo. Built for <img> tags — CRM records, 'trusted by' strips, marketplace listings — anywhere you'd otherwise need to source and host a logo yourself.
Logo Link sits on top of the same brand-extraction pipeline as the /brand/retrieve endpoint, fetching a domain's homepage and Web App Manifest and ranking logos and icons best-first by format and size. It serves that top-ranked image when available, or a generated monogram so your image never breaks.
GET https://logos.crawlora.net/logo?clientId=YOUR_CLIENT_ID&domain=example.com
Logo Link is meant to be embedded directly in an <img src> on a public web page, so it can't use an x-api-key the way the rest of the Crawlora API does — a secret placed in an <img> tag isn't a secret anymore. Instead it uses a clientId: a public, non-secret identifier (like a Stripe publishable key or a Google Maps API key) scoped by a referrer allowlist you configure in the dashboard.
Open Logo Link in the dashboardand create a clientId. Add the domains that will embed the <img> tag to the referrer allowlist — for example *.example.com to match any subdomain, or localhost:3000while developing locally. A request whose Referer/Origin doesn't match any pattern gets a 403.
Use the URL directly as an <img> src, a CSS background-image, or from a component — no client library required.
<img src="https://logos.crawlora.net/logo?clientId=YOUR_CLIENT_ID&domain=example.com" alt="example.com logo" width="48" height="48" />
.logo {
background-image: url("https://logos.crawlora.net/logo?clientId=YOUR_CLIENT_ID&domain=example.com");
background-size: contain;
background-repeat: no-repeat;
width: 48px;
height: 48px;
}function CompanyLogo({ domain }: { domain: string }) {
const src = `https://logos.crawlora.net/logo?clientId=${process.env.NEXT_PUBLIC_LOGO_LINK_CLIENT_ID}&domain=${domain}&size=48&format=webp&theme=auto`;
return <img src={src} alt={`${domain} logo`} width={48} height={48} loading="lazy" />;
}If no logo can be discovered, Logo Link returns a cached 200 SVG monogram using the first character of the domain's registrable name, so a production image never shows as broken. Add fallback=404 when you need to detect a missing logo and supply your own placeholder.
GET https://logos.crawlora.net/logo?clientId=YOUR_CLIENT_ID&domain=example.com&fallback=404
With no image parameters Logo Link streams the discovered source bytes unchanged. Request a variant only when your UI needs a stable canvas or a specific raster format.
| Parameter | Behavior |
|---|---|
| size=48 | Returns a 48 × 48 raster canvas, preserving aspect ratio with transparent letterboxing. Maximum: 512. |
| w=120&h=80 | Returns exactly 120 × 80 px and contains the logo without distortion. w and h must be provided together; maximum 512 each. |
| format=png | jpg | webp | Converts to the requested raster format. SVG sources are rasterized when an image parameter is present. |
| theme=auto | light | dark | Prefers a candidate classified for that background, then falls back to the top-ranked mark. |
| greyscale=true | Converts the output to greyscale, preserving transparency. Combine with any size, format, or theme parameter. |
| retina=true | Doubles the rendered canvas (e.g. size=48 → a 96 × 96 image) for high-DPI displays, matching the resolution's logical size at 2x pixel density. |
GET https://logos.crawlora.net/logo?clientId=YOUR_CLIENT_ID&domain=example.com&size=64&format=webp&theme=dark&retina=true
| Pattern | Matches |
|---|---|
| example.com | example.com on any port — but not subdomains |
| *.example.com | Any subdomain (app.example.com, docs.example.com) — not the bare apex; add both to allow both |
| localhost:3000 | localhost on port 3000 only |
The referrer allowlist deters casual reuse, but it is not a hard security boundary — Referer and Origin are ordinary HTTP headers, and a server-side script can set them to anything. A clientId is only ever visible on the page it's embedded in, so anyone who copies it from your HTML already knows a Referer value that will pass your own allowlist. This is a known limitation of every publishable-key-style pattern (Stripe, Google Maps, and every comparable logo API work the same way) — the fix is not a stronger header check, it's bounding and detecting the damage.
Generate a signing secret in the dashboard and store it only in your backend. Mint a short-lived signature for domain.exp; never expose the secret in browser code. Valid signatures bypass referrer matching but retain the same clientId burst and monthly limits.
const exp = Math.floor(Date.now() / 1000) + 300;
const sig = createHmac("sha256", process.env.LOGO_LINK_SIGNING_SECRET)
.update(`example.com.${exp}`).digest("hex");
const url = `https://logos.crawlora.net/logo?clientId=YOUR_CLIENT_ID&domain=example.com&sig=${sig}&exp=${exp}`;A given domain's logo rarely changes, so responses are cached aggressively at the edge (Cloudflare) and at Crawlora's origin. Don't add cache-busting query parameters — they only reduce your cache hit rate.
| Status | Meaning |
|---|---|
| 200 | A discovered logo or generated monogram served, with Cache-Control: public, max-age=604800. |
| 403 | clientId is unknown, or the caller's Referer/Origin doesn't match the allowlist. |
| 404 | No logo could be extracted and fallback=404 was requested. |
| 429 | The clientId's short-term burst limit or its monthly request quota is exhausted. |
Logo Link is intentionally focused on domain-to-logo embeds.
No. It's public by design, like a Stripe publishable key — safe to ship in frontend code. The referrer allowlist is what actually gates requests.
Yes. size= sets a square 1–512 px canvas with aspect-preserving letterboxing; w= and h= set an exact canvas together. format=png, jpg, or webp returns a raster variant. greyscale=true converts to greyscale (alpha preserved) and retina=true doubles the rendered canvas for high-DPI displays.
Yes. theme=auto (default), light, or dark prefers a classified candidate when the source publishes one and otherwise falls back to the top-ranked logo.
By default, the endpoint returns a 200 SVG monogram based on the domain, so your image does not break. Add fallback=404 if you prefer the previous missing-logo response and want to supply your own placeholder.
No. Logo Link has its own monthly request quota per clientId, separate from the core credit system. Your current plan determines that quota.
Generate a per-client signing secret in the dashboard, then have your backend sign domain.exp with HMAC-SHA256. sig and a short-lived exp bypass the referrer check but never the burst or monthly quotas. The secret is shown only when created or rotated.
Create a clientId and configure your referrer allowlist in the dashboard, then embed your first logo.