---
title: "Company icon"
description: "POST /v1/company/icon — domain in, one hosted 256×256 PNG on logos.kingminos.com (or null)."
canonical: "https://kingminos.com/docs/api/company-icon/"
sourceKind: "source-mdx"
---

import TryItLink from '../../../../components/docs/TryItLink.astro';

`POST https://api.kingminos.com/v1/company/icon`

<TryItLink method="POST" path="/v1/company/icon" />

Send a company subject: `domain`, `website`, or `email` (hygiene-normalized to the same registrable domain). Optional `name` corroborates the unit. Name-only input (no domain, website, or email) is `400` `name_only_unsupported`.

```bash
curl 'https://api.kingminos.com/v1/company/icon' \
  -H 'Authorization: Bearer <your-key>' \
  -H 'Content-Type: application/json' \
  -d '{
    "domain": "stripe.com",
    "name": "Stripe",
    "external_ref": "account-demo-1"
  }'
```

## What comes back

The envelope is schema version `2`. Automations branch on these layers:

| Layer | Fields | Use |
| --- | --- | --- |
| Control | `answer.outcome`, `es_decision`, `answer.confidence` | Whether to stamp. |
| Explain | `answer.summary`, `sources` | Humans and logs. Not control flow. |
| Audit | `trace` when `X-Router-Explain: full` | Debug only. |

`answer.outcome` on this capability is `hit` or `no_decision`.

`result.icon_url` on a hit is always `https://logos.kingminos.com/i/<sha256>.png`. That URL is a square 256×256 PNG KingMinos stored. It is never a third-party, site, Brandfetch, or ZoomInfo URL. A miss is `icon_url: null`.

The PNG is padded to 256×256, not cropped. A source is enlarged at most 2×; the rest of the square is padding. A source whose short side is under 64px is still a hit, with `flags.low_res` and confidence `low`. Stamp `result.icon_url` when `answer.confidence` meets your acceptance floor (this capability has no path tiers; see [`GET /v1/recipes/guidance`](https://api.kingminos.com/v1/recipes/guidance)).

KingMinos keeps looking while the best stored source is under 128px on its short side, so a larger Brandfetch or ZoomInfo mark can replace a small favicon. If nothing larger is stored, the small favicon is the PNG.

Field-proof stamping: a provider hop that succeeds without a stored copy is a miss for that hop, not a `hit`. SVG is not used.

Business misses stay HTTP `200`.

`company.description` is a separate capability slice; it is not part of this route.

## Ladder

There is one ladder. Send the domain. Leftover `routing`, `path`, and `preset` fields are ignored.

house favicon-fetch (0 credits) → Brandfetch BYOK (1, soft-fail and continue) → ZoomInfo enrich logo (1).

Cap is 2. A paid hop that does not win is not charged. Brandfetch prefers a square icon over a wordmark when both exist. ZoomInfo uses scoped company enrich `logo`, not search. Enrich-CRM, AI Ark, LeadMagic, and Prospeo are not icon sources on this capability.

## House key vs vendor keys

`favicon-fetch` is house-only. You cannot PUT a favicon-fetch key.

Brandfetch and ZoomInfo are BYOK on this route. Without stored keys, those hops are skipped (`not_configured`). See [Vendor keys](/docs/api/credentials/).

## Input

The body accepts nullable `name`, `domain`, `website`, and `email`, plus:

- `external_ref` — client correlation key, echoed on the run.
- `schema_version` — pin `"2"` or omit.
- `dry_run` — accepted; writers stay skipped.

## Explain and cache

Prefer `X-Router-Explain: minimal` on CRM callouts — it is an alias of the clean envelope. Use `full` when you need `trace.attempts`.

`Idempotency-Key` replays a completed run. Rotating that header is what forces a new decision; explain flags do not.
