Add Members
Add companies or people to a list by LinkedIn identity or company domain.
Adds members to a list. Identify each member by its linkedin_url or linkedin_handle (preferred). For company lists, a domain (e.g. stripe.com) is also accepted as a fallback when no LinkedIn identifier is available. Providing a domain on a people list is reported as a row error.
The identifier has to match the list kind. A personal LinkedIn URL sent to a company list, a company LinkedIn URL sent to a profile list, a domain on a profile list, or a bare handle we already know to be the wrong sort is reported as a wrong_entity_type row in errors, one row per mismatching member. A value that is not a usable identifier, such as a domain without a dot or a LinkedIn URL with no handle, is reported as invalid_identifier. The other members of the request are still added.
For champion lists, each member can also carry a company — the company where you know this contact today. Add the champion now, and once their profile shows a different company, Sillage reports it as a job change. Providing company on any other list returns 422.
New members start with no tracking override, so they follow the list's default_tracking_status and default_signal_bucket. Give one member a value of its own with Set member tracking status.
A list can be set inside Sillage to fill itself from your CRM. Such a list decides its own members, so adding one by hand is refused with 409 and nothing is added.
The call is partial-success: members that were added appear in data, and any per-member failures appear in errors. A 200 response means the request was accepted, always inspect errors for any that were not added. Re-adding members that are already present is safe and returns 200 with an empty data array. If no members could be added because every one failed, the response is 422 with data: [] and errors populated.
Add members
Path parameters
| Parameter | Type | Description |
|---|---|---|
| kind | string | List kind: company or profile (matches the list type). |
| list_id | integer | Identifier of the list. Specific to your environment. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| members | array | Yes | 1 to 100 members to add. |
| members[].linkedin_url | string | One of | LinkedIn URL, with or without https:// (e.g. linkedin.com/company/openai). Preferred identifier. |
| members[].linkedin_handle | string | One of | LinkedIn handle. Preferred identifier. |
| members[].domain | string | One of | Company domain (e.g. stripe.com). Company lists only, accepted as a fallback when no LinkedIn identifier is available. Not accepted on people lists. |
| members[].company | object | No | The company where you know this contact today. Champion lists only — not accepted on other lists. |
| members[].company.name | string | One of | Company name. At least one of company.name or company.domain is required when company is provided. |
| members[].company.domain | string | One of | Company domain (e.g. stripe.com). |
Example request
curl -X POST "https://api.getsillage.com/api/v2/lists/company/128/members" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "members": [
{ "linkedin_url": "https://www.linkedin.com/company/openai" },
{ "linkedin_handle": "anthropic" }
] }'Example request — champion with company context
Adding a champion whose current company you know today. Once their profile shows a different company, this becomes a job-change signal.
curl -X POST "https://api.getsillage.com/api/v2/lists/profile/204/members" \
-H "Authorization: Bearer $SILLAGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "members": [
{
"linkedin_url": "https://www.linkedin.com/in/jane-doe",
"company": { "name": "OpenAI", "domain": "openai.com" }
}
] }'Example response
Each member's id identifies the company or person on this list — pass it to Remove member. The shape follows the list kind: company lists return name and logo_url, people lists return first_name / last_name. tracking_status and signal_bucket come back null on a freshly added member, meaning it follows the list defaults.
The response always includes both data (added members) and errors (per-member failures). A 200 means the request was accepted. Inspect errors to identify any members that could not be added.
{
"data": [
{
"id": 901,
"name": "OpenAI",
"linkedin_handle": "openai",
"linkedin_url": "https://www.linkedin.com/company/openai",
"logo_url": "https://media.licdn.com/dms/image/openai-logo.png",
"tracking_status": null,
"signal_bucket": null
},
{
"id": 902,
"name": "Stripe",
"linkedin_handle": null,
"linkedin_url": null,
"tracking_status": null,
"signal_bucket": null
}
],
"errors": [
{
"input": { "domain": "acme.com" },
"code": "multiple_domain_matches",
"message": "The domain matched more than one company. Provide a LinkedIn URL or handle to identify the exact company."
}
]
}Per-member error codes
When a member cannot be added, its failure is reported in errors rather than failing the whole request.
| Code | Meaning |
|---|---|
multiple_domain_matches | The domain matched more than one company. Use a LinkedIn URL or handle instead. |
apollo_failed | The company could not be found or created from the domain provided. |
resolution_failed | An unexpected error occurred while resolving the member. |
wrong_entity_type | The identifier does not match the list kind: a person URL on a company list, a company URL on a people list, a domain on a people list, or a handle already known as the other kind. |
invalid_identifier | The value is not usable as an identifier, such as a domain without a dot or a LinkedIn URL with no handle. |
Status codes
| Status | Description |
|---|---|
| 200 | Request accepted. data contains newly-added members (empty if all were already present). Check errors for any per-member failures. |
| 401 | The API key is missing or invalid. |
| 404 | The list does not exist in your workspace. |
| 409 | This list fills itself from your CRM, so its members cannot be added by hand. Change that in Sillage to take it over. |
| 422 | Every member failed to be added (see errors), the body is invalid, or company was provided on a non-champion list. Re-adding already-present members returns 200, not 422. |
| 429 | Too many requests. |
| 500 | An unexpected server error occurred. |