---
title: "Company resolve"
description: "POST /v1/company/resolve — email or domain in, one company decision out."
canonical: "https://kingminos.com/docs/api/company-resolve/"
sourceKind: "source-mdx"
---

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

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

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

Send what you have. Typical caller input is an email. You can also send `domain` or `website`. Name-only input (no email, domain, or website) is `no_decision` / `no_domain` and does not search.

```bash
curl 'https://api.kingminos.com/v1/company/resolve' \
  -H 'Authorization: Bearer <your-key>' \
  -H 'Content-Type: application/json' \
  -d '{
    "email": "contact@outboundsync.com",
    "external_ref": "account-demo-1"
  }'
```

## What comes back

The envelope is schema version `2`. Automations that write to a CRM should branch on these layers:

| Layer | Fields | Use |
| --- | --- | --- |
| Control | `answer.outcome`, `es_decision`, `answer.confidence` | Whether to stamp (see confidence floors). |
| 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 `resolved`, `resolved_without_primary_id`, or `no_decision`.

`es_decision` is the SFDC / stamp-safe branch: `hit`, `miss`, `ambiguous`, `error`, `noop`, or `reject`.

- `resolved` → `hit` only when a safe primary ZoomInfo company id is present (`result.zoominfo_company_id`).
- `resolved_without_primary_id` → `miss`. Do not stamp an id. A LeadMagic-only or websearch-only hit lands here.
- Name-only input → `no_decision`. Do not stamp a primary id from a vendor name match.

A websearch name may arrive on `miss`. Fill Account Name from `result.company_name` when it is present and `answer.confidence` meets your acceptance floor. `result.company_domain` is optional hygiene — never clobber a good domain.

**Stamp rule:** compare `answer.confidence` (`low`, `medium`, or `high`) to the path default floor (`speed` / `coverage`: `low`; `balance`: `medium`+; `accuracy`: `high`). `min_confidence` on the request overrides the default. Below-floor answers return blank result fields; candidates stay in evidence. Even `low` is usable and close to production-grade — less independent corroboration, not junk. See [`GET /v1/recipes/guidance`](https://api.kingminos.com/v1/recipes/guidance).

Business misses stay HTTP `200`.

## Operator

Some domains are a product, not the company behind it. `fizzy.do`, `basecamp.com`, and `hey.com` are all run by 37signals. `answer.operator` and `result.operator` name that company without changing `result.company_name`:

```json
"operator": {
  "operator_name": "37signals",
  "operator_domain": "37signals.com",
  "operator_source": "copyright_footer",
  "operator_confidence": "high",
  "operator_zoominfo_company_id": "24434238"
}
```

- `null` when the site's operator is the brand itself, or no ownership claim lines up with a domain linked on the page.
- Found from the homepage: a `© 2025 X LLC` copyright line, "from X" in the title, "X, makers of …", footer links. Website-builder, hosting, and agency credits ("Powered by Shopify", "Website by …") don't count.
- `operator_zoominfo_company_id` comes from a free ZoomInfo search on `operator_domain`. It is `null` when ZoomInfo isn't part of the call.
- Costs 0 credits. It never changes `company_name`, `es_decision`, or `answer.confidence`. Use it to match the parent account, not as the Account Name.

## Routing

Omit `routing.path` to use `balance`. OutboundSync callers set `path` explicitly.

| `path` | What it does |
| --- | --- |
| `speed` | Cheap names. Default reservation `2`. No miss-only paid name hops. |
| `balance` | Default. Websearch first, then ZoomInfo, then LeadMagic. Reservation `6`. |
| `accuracy` | Gated corroboration. |
| `coverage` | Fill more empties. |

Legacy request aliases (`auto`, `value`, `name_only`, `fast`) expand to the paths above; responses echo canonical path names. `routing.preset` is a back-compat alias (`name_only` → `speed`). `{ "preset": "zi_stamp" }` is optional ZoomInfo-first. Prefer `path` on new callers. `confidence` is not a path.

Default linear order on `balance` is `[websearch, zoominfo, leadmagic]` with `allow_fallbacks` and `free_first: false`. A websearch name is not terminal while ZoomInfo remains in the effective order.

## House key vs vendor keys

LeadMagic, Wiza, and Findymail are house-key vendors. KingMinos can run their company-search hops without you storing those keys.

ZoomInfo is not a house key on this site. To stamp a ZoomInfo company id you store vendor keys — see [Vendor keys](/docs/api/credentials/). Without those keys, a good LeadMagic or websearch name is `resolved_without_primary_id`.

Websearch is house-only. You cannot PUT a websearch key.

Prospeo, Apollo, People Data Labs, HG Insights, Enrich-CRM, and Lemlist are Your Keys (BYOK) and off every default path. They never run on `speed`, `balance`, `accuracy`, or `coverage`; force them with `routing.only: ["prospeo"]` / `["apollo"]` / `["peopledatalabs"]` / `["hginsights"]` / `["enrichcrm"]` / `["lemlist"]` (or an explicit `routing.order`). Without a stored key those calls fail `400 prospeo_credentials_required` / `400 apollo_credentials_required` / `400 peopledatalabs_credentials_required` / `400 hginsights_credentials_required` / `400 enrichcrm_credentials_required` / `400 lemlist_credentials_required`. Apollo is firmographic only (`GET /organizations/enrich`); People Data Labs enriches by website (`GET /company/enrich`, `min_likelihood` 6); HG Insights enriches by domain (`POST /companies/enrich`, firmographics); Enrich-CRM enriches by domain (`GET /api/ingress/v4/firmographic`, apiId query auth); Lemlist is an opt-in `company.resolve` hop (`POST /api/database/companies` by domain). The website filter id is unverified until a live key exists.

## Input

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

- `external_ref` — client correlation key, echoed on the run.
- `routing` — `path`, optional `order`, `only`, `max_provider_credits`, `allow_fallbacks`.
- `schema_version` — pin `"2"` or omit.
- `dry_run` — accepted; writers stay skipped.

Email-shaped `domain` values are normalized (the part after `@`).

## 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.
