Skip to content

Company resolve

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

Try it in the console

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.

Terminal window
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"
}'

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.

Business misses stay HTTP 200.

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:

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

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.

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

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 @).

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.