# nv.createList

Create a Sales Navigator lead or account list, with a name you do not already use for that type.

> The API Reference is also the SDK and CLI reference. Consecutive code fences marked `tab=HTTP`, `tab=Node`, `tab=Python` and `tab=CLI` are the same call on each surface (a fence marked `tab=HTTP,CLI` is the same text for both), and a block between `:::surface <names>` and `:::` applies only to the surfaces it names. Identifiers in the text are written as in Node and in HTTP JSON (camelCase); the Python SDK spells methods, parameters and result attributes in snake_case (`sendMessage` → `send_message`, `reconnectionLink` → `reconnection_link`), while names inside HTTP JSON stay camelCase.

Create a lead list or an account list in Sales Navigator. For example, create one list per region, then save search results into each with [`nv.saveLead`](/docs/action-nv-save-lead) or [`nv.saveAccount`](/docs/action-nv-save-account), passing the new list's `id` as `listId`.

An active Sales Navigator subscription is required. To see the lists you already have, call [`nv.retrieveLists`](/docs/action-nv-retrieve-lists).

:::surface node,python
In the SDK this is the `nvCreateList` method. It takes the parameters below except `label`, which exists only in workflow JSON. The result below is returned in `data`.
:::

:::surface cli
The command is `linkedin navigator lists create`. Its flags are listed below.
:::

## Constraints

> ⏺️ **Root Start:** allowed.

> ⬆️ **Parent Actions:** N/A.

> ⬇️ **Child Actions:** N/A.

## Parameters

```json tab=HTTP
{
  "actionType": "nv.createList",
  "label": "emeaLeads",
  "type": "lead",
  "name": "EMEA leads",
  "description": "Heads of Sales in EMEA to follow up with"
}
```

```typescript tab=Node
const workflow = await linkedapi.nvCreateList.execute({
  type: "lead",
  name: "EMEA leads",
  description: "Heads of Sales in EMEA to follow up with"
});

const { data, errors } = await linkedapi.nvCreateList.result(workflow.workflowId);
```

```python tab=Python
from linkedapi import NvCreateListParams

workflow = linkedapi.nv_create_list.execute(
    NvCreateListParams(
        type="lead",
        name="EMEA leads",
        description="Heads of Sales in EMEA to follow up with",
    )
)

result = linkedapi.nv_create_list.result(workflow.workflow_id)
```

```bash tab=CLI
linkedin navigator lists create \
  --type lead \
  --name "EMEA leads" \
  --description "Heads of Sales in EMEA to follow up with" \
  --json
```

In AI assistants, the MCP tool is `nv_create_list`. The n8n action is **Create list in Sales Navigator**; the Make module is **Create List in Sales Navigator**.

| Parameter | Description |
| --- | --- |
| `label` | Optional label included in workflow completion. |
| `type` | Required. `lead` to create a lead list or `account` to create an account list. |
| `name` | Required. List name on a single line, from 1 to 75 characters after spaces at the start and end are removed (an emoji counts as two). No list of the same type that you own may already have this name (see [List names](#list-names)). |
| `description` | Optional. List description, up to 350 characters after spaces at the start and end are removed, as Sales Navigator stores it (an emoji counts as two). Line breaks are allowed, but a carriage return (`\r`) is rejected. A description that is blank after removing them is treated as omitted. Omit it for a list without a description; `null` is rejected. |

A `name` or `description` outside these limits is rejected with `invalidWorkflow` before the workflow starts. Nothing is ever shortened.

:::surface python
In Python, `NvCreateListParams` also checks the lengths itself, counting each character once: a name outside 1–75 characters or a description over 350 raises pydantic's `ValidationError` when the params object is built, before any request is sent. Line breaks and emoji are checked by the API.
:::

:::surface cli
| Flag | Description |
| --- | --- |
| `--type` | Required. `lead` or `account`. |
| `--name` | Required. List name, 1 to 75 characters. |
| `--description` | Optional. List description, up to 350 characters. |
:::

## List names

Sales Navigator itself lets several of your lists share a name. This action never creates such a duplicate, because the save menu used by [`nv.saveLead`](/docs/action-nv-save-lead) and [`nv.saveAccount`](/docs/action-nv-save-account) shows lists by name only, so lists that share a name cannot be told apart there.

- **One name per type.** Before creating anything, the action reads all lists of the requested type that you own, Sales Navigator's system lists included. If one of them already has this name, the call fails with `listAlreadyExists` and no list is created.
- **What counts as the same name.** Names are compared after removing spaces at the start and end, and letter case counts. `EMEA leads` is the same name with or without spaces around it; `EMEA Leads` is a different name.
- **System lists count.** Sales Navigator's own lists, such as Recommended Leads and My Current Accounts, are among the lists you own. So a lead list cannot be named `Recommended Leads`, and an account list cannot be named `My Current Accounts`.
- **Lead and account lists are separate.** A lead list and an account list can have the same name.

## Creating behaviour

- **One call creates one list.** The result describes the list this call created, including its `id`.
- **Repeating the call does not create a second list.** Calling again with the same `type` and `name` fails with `listAlreadyExists`, because the first call's list now has that name. If you lost the first call's result, find the list's `id` with [`nv.retrieveLists`](/docs/action-nv-retrieve-lists).
- **A custom list.** The new list appears in [`nv.retrieveLists`](/docs/action-nv-retrieve-lists) with `source` set to `MANUAL`, and can be used as `listId` when saving leads (for a lead list) or accounts (for an account list).
- **English interface only, for now.** This is a current limitation: creating and deleting lists work only with an English Sales Navigator interface. On a German, Spanish, French or Portuguese interface, the call fails with `interfaceLanguageNotSupported`.

To delete a list, use [`nv.deleteList`](/docs/action-nv-delete-list).

## Result options

```json
{
  "actionType": "nv.createList",
  "label": "emeaLeads",
  "success": true,
  "data": {
    "id": "7420000000000000004",
    "name": "EMEA leads",
    "type": "lead",
    "url": "https://www.linkedin.com/sales/lists/people/7420000000000000004"
  }
}
```

| Field | Meaning |
| --- | --- |
| `id` | ID of the new list, as a string. Pass it as `listId` to save into this list or to delete it. |
| `name` | List name as Sales Navigator stored it, without spaces at the start and end. |
| `type` | `lead` or `account`, matching the requested `type`. |
| `url` | Opens the list in Sales Navigator, in the same form as `url` in [`nv.retrieveLists`](/docs/action-nv-retrieve-lists). |

List IDs are long numeric strings, often 19 digits – beyond what a JavaScript number holds exactly. Keep them as strings; converting one to a number can change it.

`label` is included only if specified in the action parameters.

## Error result

An unsuccessful action returns `success: false` with an `error` object:

```json
{
  "actionType": "nv.createList",
  "label": "emeaLeads",
  "success": false,
  "error": {
    "type": "listAlreadyExists",
    "message": "A Sales Navigator list of this type with this name already exists."
  }
}
```

Possible `error.type` values:

- `noSalesNavigator` — the account does not have an active Sales Navigator subscription.
- `listAlreadyExists` — you already own a list of this type with this name (see [List names](#list-names)). No list is created.
- `interfaceLanguageNotSupported` — the account's Sales Navigator interface is German, Spanish, French or Portuguese rather than English. No list is created; this is a current limitation (see above).
- `unexpectedError` — the list could not be created, or Linked API could not read all of your lists of this type to check the name; in that case no list is created. It is safe to call again: if the failed call did create the list, the new call fails with `listAlreadyExists` instead of creating a second one.
