---
title: "Company B2B social"
description: "POST /v1/company/b2b-social — domain in, one LinkedIn company page URL out (or null)."
canonical: "https://kingminos.com/docs/api/company-b2b-social/"
sourceKind: "source-mdx"
---

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

`POST https://api.kingminos.com/v1/company/b2b-social`

<TryItLink method="POST" path="/v1/company/b2b-social" />

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/b2b-social' \
  -H 'Authorization: Bearer <your-key>' \
  -H 'Content-Type: application/json' \
  -d '{
    "domain": "faktor3.de",
    "name": "Faktor 3",
    "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.linkedin_url` is the write field: a Serper-confirmed company page at `https://www.linkedin.com/company/{slug}` (slug lowercased), or `null`. Person `/in/` profiles, school/showcase pages, unverified title/snippet misses, and parent-brand pages for a distinct unit are rejected. Additive `result.verification` carries `status` (`confirmed` | `unverified` | `rejected`), `reason`, and the normalized `url` when structural checks pass.

Optional `linkedin_url` on the request is an agree-check hint only — it must already be a normalized `/company/{slug}` URL; person `/in/` is `400`. It is not authority to invent a page.

**Stamp rule:** write `result.linkedin_url` when `answer.confidence` meets your floor. LinkedIn company URLs that pass structural checks typically need `high` confidence. Path defaults and `min_confidence` behave like other capabilities — see [`GET /v1/recipes/guidance`](https://api.kingminos.com/v1/recipes/guidance).

Business misses stay HTTP `200`.

## Routing

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

| `path` | What it does |
| --- | --- |
| `speed` | House websearch company-page query. Reservation cap `1`. |
| `balance` | Default. Websearch, then house AI Ark even after a search candidate. Reservation cap `2`. |
| `accuracy` | Adds LeadMagic, house AI Ark, then Wiza. Reservation cap `5`. |
| `coverage` | Adds Findymail. Reservation cap `6`. |

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 (`auto` → `balance` on this capability). `confidence` is not a path.

Default stacks use house keys only (websearch, AI Ark, LeadMagic, Wiza, Findymail). BYOK vendors (ZoomInfo, Apollo, Prospeo, Company URL Finder) run only with `routing.only` or an explicit `routing.order`. `routing.only: ["aiark"]` is allowlisted for `km_` and session keys.

## House key vs vendor keys

LeadMagic, Wiza, Findymail, and AI Ark are house-key vendors on the default paths. See [Vendor keys](/docs/api/credentials/). ZoomInfo, Apollo, Prospeo, and Company URL Finder are BYOK — without stored keys, forced hops return `400` with the matching `*_credentials_required` code.

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

## Input

The body accepts nullable `name`, `domain`, `website`, `email`, and `linkedin_url`, 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.

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