Enrich company mapping
Resolve a company and start asynchronous Account Mapping enrichment.
Resolves a company by domain, LinkedIn URL, LinkedIn handle, or company ID, then starts asynchronous enrichment for the company mapping.
The endpoint returns 202 Accepted immediately. Enrichment continues in the background.
If a recent enrichment already exists for the same company and workspace, the response reflects the existing request instead of creating a duplicate.
Route
Personas
Your workspace can define several personas (ideal customer profile targeting criteria), each with its own locations and job titles. By default this call enriches the personas linked to the lists this company belongs to — every active persona when none of those lists names one, or when the company is on no list. Pass persona_ids to enrich specific personas instead; they run even if the company is not on their lists. Either way, the response launches array reports one entry per persona considered: launched (a new request was created and charged), already_requested (already enriched today for this company, at no extra cost), or skipped because the persona is missing a location or job titles (skipped_no_location, skipped_no_job_titles).
Credit usage
Charges one credit for each persona actually launched. A persona already requested today for this company costs nothing. If your balance cannot cover every persona this call would launch, the whole call is refused and nothing is created or charged — a partial launch never happens. Additional credits are charged for each employee profile whose content is analyzed as enrichment continues.
Returns 402 if your balance is insufficient (see Errors), 422 if none of your personas can be mapped, or 422 if persona_ids names an id that isn't one of your active personas. If a persona's own mapping later fails, its credit is refunded automatically.
Access modes
Use a workspace API key. The workspace is inferred from the key.
Authorization: Bearer sk_live_...Request body
Send exactly one company identifier: domain, linkedin_url, linkedin_handle, or company_id. Unknown extra fields in the body are ignored.
| Field | Type | Required | Description |
|---|---|---|---|
| domain | string | Conditional | Company domain, for example acme.com. |
| linkedin_url | string | Conditional | LinkedIn company URL. |
| linkedin_handle | string | Conditional | LinkedIn company slug after /company/, for example acme. |
| company_id | integer | Conditional | The company's ID in Sillage, if you already have it (e.g. from the company list or another v2 endpoint). This ID is specific to your environment. Cannot be combined with any other identifier. |
| persona_ids | integer[] | Optional | Specific personas to enrich, at least one id. Omit to enrich the personas linked to the lists this company belongs to (every active persona when none of those lists names one, or when the company is on no list). An id that isn't one of your active personas returns 422 and nothing is launched. |
Valid body examples:
{
"domain": "acme.com"
}When you identify the company with company_id, the lookup is unambiguous — the 409 conflict response described below cannot happen for this field. It only applies when resolving by domain or LinkedIn. A company_id that does not exist, or belongs to a different workspace, returns a 404.
Example request
curl "https://api.getsillage.com/api/v2/enrich-company-mapping" \
-X POST \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{"domain":"acme.com"}'Success response
Status: 202 Accepted
Two personas, both newly launched:
{
"status": "accepted",
"request_id": 12345,
"stage": "account_mapping_in_progress",
"launches": [
{ "persona_id": 501, "request_id": 12345, "status": "launched", "credits": 1 },
{ "persona_id": 502, "request_id": 12346, "status": "launched", "credits": 1 }
]
}Same-day relaunch — both personas were already requested today for this company, so nothing is charged:
{
"status": "accepted",
"request_id": 12345,
"stage": "account_mapping_in_progress",
"launches": [
{
"persona_id": 501,
"request_id": 12345,
"status": "already_requested",
"credits": 0
},
{
"persona_id": 502,
"request_id": 12346,
"status": "already_requested",
"credits": 0
}
]
}Polling enrichment stage
Each entry in launches is the content-request ID for that persona; poll GET /api/v2/account-mapping/{request_id}/stage for any of them until its stage field reaches a terminal value.
Terminal stages: completed (success) and account_mapping_failed (failure). See Account Mapping — Polling enrichment stage for the full response shape.
Response headers
| Header | Description |
|---|---|
| X-Request-Id | Request UUID for debugging and support. |
| X-Response-Time | Server response time. |
Response fields
| Field | Type | Description |
|---|---|---|
| status | string | Acceptance status. |
| request_id | integer | Deprecated. Id of the first launched (or, if none launched, first considered) persona's content request. Use launches[].request_id instead, which reports every persona individually. Will be removed in a future major version. |
| stage | string | Current enrichment stage. |
| launches | array | One entry per persona this call considered for your workspace. |
| launches[].persona_id | integer | Id of the persona. |
| launches[].request_id | integer or null | Id of this persona's own content request. null when the persona was skipped, since no request was created for it. |
| launches[].status | string | launched (a new request was created and charged), already_requested (already enriched today for this company, at no extra cost), skipped_no_location, or skipped_no_job_titles. |
| launches[].credits | integer | Credits charged for this persona by this call — 1 when launched, 0 otherwise. |
Errors
| Status | Meaning |
|---|---|
| 400 | The request input is invalid. |
| 401 | The API key is missing or invalid. |
| 402 | Insufficient credits to launch every persona this call would map. |
| 403 | Account Mapping is not enabled for the workspace. |
| 404 | No company found for the given identifier, or the given company_id does not belong to your workspace. |
| 409 | A conflicting enrichment request already exists. |
| 422 | Either none of your personas can be mapped for this company — every persona is either missing or is missing a location or job titles — or persona_ids names an id that isn't one of your active personas. Nothing is launched either way. See the two examples below. |
| 500 | An unexpected server error occurred. |
A 422 for "no persona can be mapped":
{
"type": "https://docs.getsillage.com/errors/no-persona-launchable",
"title": "No persona can be mapped",
"status": 422,
"detail": "No persona in this workspace can be mapped — add a persona, or complete an existing persona location and job titles, then try again.",
"instance": "/api/v2/enrich-company-mapping",
"launches": [
{
"persona_id": 501,
"request_id": null,
"status": "skipped_no_location",
"credits": 0
}
]
}A 422 for an invalid persona_ids entry:
{
"type": "https://docs.getsillage.com/errors/unprocessable-entity",
"title": "Unprocessable Entity",
"status": 422,
"detail": "persona_ids includes an id that is not one of your workspace's active personas.",
"instance": "/api/v2/enrich-company-mapping",
"errors": {
"persona_ids": ["Unknown persona id: 999"]
}
}Error responses use RFC 9457 problem documents with Content-Type: application/problem+json:
{
"type": "https://docs.getsillage.com/errors/forbidden",
"title": "Forbidden",
"status": 403,
"detail": "Account Mapping is not enabled for this workspace.",
"instance": "/api/v2/enrich-company-mapping"
}