> ## Documentation Index
> Fetch the complete documentation index at: https://docs.parallellabs.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Duplicate a smart list and all its active row data.

> Copies every active row, column definition, cell value, cell research and
timestamp, and table action configuration/results. New list, header, and
row IDs make the copy independent. Deleted rows/columns are excluded.
The caller owns the copy; sharing and department restrictions are retained.
Copied automations start disabled. Running jobs, execution history, campaign
recipients, and sequence memberships remain attached to the original list.
Computed lookup columns recalculate for the new list. The entire copy is
committed atomically; an error leaves no partial list.



## OpenAPI

````yaml /openapi.json post /api/v0/lists/{listId}/duplicate
openapi: 3.0.3
info:
  title: API Documentation
  version: 1.0.0
  description: >

    # Introduction


    Welcome to the API. This API provides programmatic access to all platform
    features including AI agents, smart lists, documents, sequences, and media
    generation.


    ## Authentication


    The API supports two types of authentication:


    1. **Company API Keys** - Scoped to a specific company

    2. **Personal Access Keys** - User-level keys that work across all your
    companies


    ---


    ### Option 1: Company API Key


    Company API keys are tied to a specific company. Use this when you only need
    to access one company.


    **Getting a Company API Key:**


    1. Log in to your dashboard

    2. Navigate to **Integrations** page

    3. Find the **API Keys** section and click **Generate New Key**

    4. Copy and securely store your API key (it won't be shown again)


    **Usage:**


    Include your API key in the `X-API-Key` header:


    ```bash

    curl -X GET "https://api.example.com/api/v0/agents" \
      -H "X-API-Key: YOUR_COMPANY_API_KEY" \
      -H "Content-Type: application/json"
    ```


    Or use the `Authorization` header (OpenAI-compatible):


    ```bash

    curl -X GET "https://api.example.com/api/v0/agents" \
      -H "Authorization: Bearer YOUR_COMPANY_API_KEY" \
      -H "Content-Type: application/json"
    ```


    ---


    ### Option 2: Personal Access Key


    Personal access keys are tied to your user account and can access any
    company you belong to. Use this when you need to access multiple companies
    or build integrations that work across companies.


    **Getting a Personal Access Key:**


    1. Log in to your dashboard

    2. Click on your avatar/profile icon and go to **Profile**

    3. Find the **Personal Access Keys** section

    4. Click **Create New Key**

    5. Give it a name and optionally set an expiration date

    6. Copy and securely store your key (it won't be shown again)


    **Usage:**


    Personal access keys start with `pak_` and **require** you to specify which
    company to access using the `X-Company-ID` header:


    ```bash

    curl -X GET "https://api.example.com/api/v0/agents" \
      -H "Authorization: Bearer pak_your_personal_access_key" \
      -H "X-Company-ID: your_company_id" \
      -H "Content-Type: application/json"
    ```


    Or using the `X-API-Key` header:


    ```bash

    curl -X GET "https://api.example.com/api/v0/agents" \
      -H "X-API-Key: pak_your_personal_access_key" \
      -H "X-Company-ID: your_company_id" \
      -H "Content-Type: application/json"
    ```


    You can also pass the company ID as a query parameter:


    ```bash

    curl -X GET
    "https://api.example.com/api/v0/agents?companyId=your_company_id" \
      -H "Authorization: Bearer pak_your_personal_access_key" \
      -H "Content-Type: application/json"
    ```


    **Finding Your Company ID:**


    Your company ID can be found in the dashboard URL when viewing a company, or
    via the Settings page.


    ---


    ### Which Key Type Should I Use?


    | Use Case | Recommended Key Type |

    |----------|---------------------|

    | Single company integration | Company API Key |

    | Multi-company dashboard | Personal Access Key |

    | CI/CD pipelines | Company API Key |

    | Personal automation scripts | Personal Access Key |

    | Third-party app integration | Company API Key |


    ---


    ## Response Format


    All responses are returned in JSON format. Successful responses include the
    requested data:


    ```json

    {
      "id": "abc123",
      "name": "My Agent",
      "created": "2024-01-15T10:30:00Z"
    }

    ```


    Error responses follow a consistent structure:


    ```json

    {
      "error": "Description of what went wrong"
    }

    ```


    ## HTTP Status Codes


    | Code | Description |

    |------|-------------|

    | 200 | Success |

    | 201 | Created |

    | 400 | Bad Request - Invalid parameters |

    | 401 | Unauthorized - Invalid or missing API key |

    | 403 | Forbidden - Insufficient permissions |

    | 404 | Not Found - Resource doesn't exist |

    | 429 | Too Many Requests - Rate limit exceeded |

    | 500 | Internal Server Error |


    ## Pagination


    List endpoints support pagination using `page` and `pageSize` parameters:


    ```

    GET /api/v0/agents?page=1&pageSize=20

    ```


    Paginated responses include:

    - `items`: Array of results

    - `total`: Total number of items

    - `pages`: Total number of pages

    - `hasNext`: Whether more pages exist


    ## OpenAI Compatibility


    The Chat API (`/api/v0/chat/completions`) is fully compatible with the
    OpenAI API specification.


    ---


    ## Anthropic Compatibility & Claude Code


    The platform also exposes an **Anthropic Messages API-compatible** endpoint,
    so any Anthropic SDK — including **Claude Code** — can use the platform as
    its LLM provider. Requests are billed against your platform credits like any
    other API usage.


    ### Endpoints


    | Endpoint | Description |

    |----------|-------------|

    | `POST /api/v0/claude/v1/messages` | Create a message (streaming and
    non-streaming, tool use supported) |

    | `POST /api/v0/claude/v1/messages/count_tokens` | Estimate token count for
    a request |

    | `GET /api/v0/claude/v1/models` | List available models |


    Authentication works exactly like the rest of the API: send your API key as
    `Authorization: Bearer <key>` or `x-api-key: <key>`. Personal access keys
    (`pak_...`) also work but require the `X-Company-ID` header, which Claude
    Code cannot send by default — use a **Company API Key** for Claude Code.


    ### Setting up Claude Code


    1. **Install Claude Code** (skip if already installed):


    ```bash

    # macOS / Linux / WSL — native installer

    curl -fsSL https://claude.ai/install.sh | bash


    # Or via npm (requires Node.js 18+)

    npm install -g @anthropic-ai/claude-code

    ```


    On Windows (PowerShell):


    ```powershell

    irm https://claude.ai/install.ps1 | iex

    ```


    Verify the install with `claude --version`. See the official docs at
    https://code.claude.com/docs for more install options.


    2. **Get a Company API Key**: Dashboard → **Integrations** → **API Keys** →
    **Generate New Key**.


    3. **Configure Claude Code.** Either export environment variables in your
    shell:


    ```bash

    export ANTHROPIC_BASE_URL="https://api.example.com/api/v0/claude"

    export ANTHROPIC_AUTH_TOKEN="YOUR_COMPANY_API_KEY"

    claude

    ```


    Or persist the settings in `~/.claude/settings.json` (applies to all
    projects) or `.claude/settings.local.json` in a project. Set the model
    variables to any platform model names — for example:


    ```json

    {
      "env": {
        "ANTHROPIC_BASE_URL": "https://api.example.com/api/v0/claude",
        "ANTHROPIC_AUTH_TOKEN": "YOUR_COMPANY_API_KEY",
        "ANTHROPIC_MODEL": "qwen3.8-max",
        "ANTHROPIC_DEFAULT_OPUS_MODEL": "kimi-k3",
        "ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3.8-max",
        "ANTHROPIC_DEFAULT_HAIKU_MODEL": "glm-5.3-flash"
      }
    }

    ```


    4. **Verify** with `/status` inside Claude Code — it should show your custom
    base URL — or test the endpoint directly:


    ```bash

    curl -X POST "https://api.example.com/api/v0/claude/v1/messages" \
      -H "Authorization: Bearer YOUR_COMPANY_API_KEY" \
      -H "anthropic-version: 2023-06-01" \
      -H "Content-Type: application/json" \
      -d '{"model": "qwen3.8-max", "max_tokens": 64, "messages": [{"role": "user", "content": "Hello"}]}'
    ```


    ### Model names


    The `model` field accepts any model name from `GET /api/v0/models` — any
    provider, not just Anthropic — so you can run Claude Code on any model the
    platform offers. When Claude Code sends its default Anthropic model ids
    (e.g. `claude-sonnet-4-5-20250929`), they are routed by tier to platform
    models: opus-class requests run on the platform's highest-capability model,
    sonnet-class on the balanced default, and haiku-class (background tasks) on
    the fastest low-cost model. Set `ANTHROPIC_MODEL` and the
    `ANTHROPIC_DEFAULT_*_MODEL` variables to exact platform model names for full
    control over routing.


    Optionally set `CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1` so Claude Code
    lists the platform's models in its `/model` picker.


    ### Notes and limitations


    - **Streaming** is fully supported (Anthropic SSE event format with
    keep-alive pings).

    - **Tool use** is supported: Claude Code's client-side tools (file edits,
    bash, etc.) are forwarded to the model and executed locally by Claude Code —
    never on the platform's servers.

    - Server-side Anthropic tools (web search, code execution), extended
    thinking blocks, and prompt caching directives are accepted but ignored.

    - Usage is billed per request based on real token counts and appears in your
    usage dashboard under the chat feature.


    ### Using the Anthropic SDK directly


    ```python

    import anthropic


    client = anthropic.Anthropic(
        base_url="https://api.example.com/api/v0/claude",
        auth_token="YOUR_COMPANY_API_KEY",
    )


    response = client.messages.create(
        model="kimi-k3",
        max_tokens=1024,
        messages=[{"role": "user", "content": "Hello"}],
    )

    print(response.content[0].text)

    ```


    ---


    ## MCP (Model Context Protocol) Integration


    The platform provides an MCP server that allows AI assistants like Claude
    Desktop, Cursor, Windsurf, and other MCP-compatible tools to interact with
    the full platform API.


    ### What is MCP?


    Model Context Protocol (MCP) is an open standard that allows AI assistants
    to securely connect to external tools and data sources. With MCP, your AI
    assistant can:


    - Browse and manage your AI agents

    - Create and monitor outreach sequences

    - Search your knowledge base documents

    - Generate AI content, images, audio, and video

    - Execute browser automation tasks

    - And access every other platform feature


    ### MCP Server URL


    ```

    https://api.example.com/api/v0/mcp

    ```


    This endpoint implements the **MCP Streamable HTTP Transport** (JSON-RPC
    2.0) and is compatible with `mcp-remote` and other MCP clients.


    ### Available Tools


    The MCP server provides 3 tools that give access to the entire platform API:


    | Tool | Description |

    |------|-------------|

    | `platform_list_capabilities` | Browse available API endpoints by category
    (Agents, Sequences, Lists, Documents, etc.) |

    | `platform_get_action_details` | Get the full specification for an endpoint
    including required parameters |

    | `platform_execute_action` | Execute any API endpoint with automatic
    authentication |


    ### Connecting Claude Desktop


    1. Open your Claude Desktop configuration file:
       - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
       - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`

    2. Add the MCP server configuration:


    ```json

    {
      "mcpServers": {
        "platform": {
          "command": "npx",
          "args": ["-y", "mcp-remote", "https://api.example.com/api/v0/mcp"],
          "env": {
            "API_KEY": "your_api_key_here"
          }
        }
      }
    }

    ```


    3. Restart Claude Desktop


    4. You can now ask Claude to interact with your platform data, for example:
       - "List my AI agents"
       - "Show me my active sequences"
       - "Create a new email sequence for cold outreach"
       - "Search my documents for pricing information"

    ### Connecting Cursor / Windsurf


    1. Open Settings and navigate to the MCP section


    2. Add a new MCP server with:
       - **URL**: `https://api.example.com/api/v0/mcp`
       - **Authentication**: Bearer token with your API key

    3. The platform tools will now be available in your AI assistant


    ### Connecting via mcp-remote (Generic)


    For any MCP-compatible client, you can use the `mcp-remote` package:


    ```bash

    npx mcp-remote https://api.example.com/api/v0/mcp --header "Authorization:
    Bearer YOUR_API_KEY"

    ```


    ### Authentication for MCP


    MCP requests use the same authentication as the REST API:


    **Using Company API Key:**

    ```

    Authorization: Bearer YOUR_COMPANY_API_KEY

    ```


    **Using Personal Access Key:**

    ```

    Authorization: Bearer pak_your_personal_access_key

    X-Company-ID: your_company_id

    ```


    ### Example MCP Interactions


    **List available capabilities:**

    ```json

    {
      "name": "platform_list_capabilities",
      "arguments": {
        "category": "Sequences"
      }
    }

    ```


    **Get action details:**

    ```json

    {
      "name": "platform_get_action_details",
      "arguments": {
        "operationId": "post_sequences.create_sequence"
      }
    }

    ```


    **Execute an action:**

    ```json

    {
      "name": "platform_execute_action",
      "arguments": {
        "operationId": "get_agents.list_agents"
      }
    }

    ```


    ### MCP Endpoints


    | Endpoint | Method | Description |

    |----------|--------|-------------|

    | `/api/v0/mcp/info` | GET | Get MCP server information and capabilities |

    | `/api/v0/mcp/tools/list` | GET | List all available MCP tools |

    | `/api/v0/mcp/tools/call` | POST | Execute an MCP tool call |
servers:
  - url: https://api.parallellabs.app
security:
  - CompanyApiKey: []
  - BearerAuth: []
    CompanyId: []
tags:
  - name: Agents
    description: >-
      Create, manage, and interact with AI agents that handle customer
      interactions across multiple channels including website chat, email, SMS,
      and voice.
  - name: Audio
    description: Generate text-to-speech audio using ElevenLabs.
  - name: Brand Kit
    description: >-
      One brand kit per company drives both content-engine visuals and
      landing-page/website rendering: logos and reusable images, an AI image
      style prompt, canvas config and PNG templates, plus favicon/logo, injected
      CSS/head scripts and brand guidelines. Build a full kit automatically from
      a website or an uploaded image.
  - name: Browser
    description: Execute browser automation tasks with natural language.
  - name: Canvas
    description: >-
      Render a standalone HTML canvas into shareable art — a still PNG or a
      looping MP4 — and return a permanent public URL.
  - name: Chat
    description: OpenAI-compatible chat completions API.
  - name: Companies
    description: >-
      Manage companies and workspaces. Each company has its own agents, lists,
      sequences, and other resources.
  - name: Company Users
    description: Manage team members and their access to companies.
  - name: Content
    description: >-
      AI content engine for generating and scheduling social media posts,
      articles, and marketing content.
  - name: Content Research
    description: >-
      SEO/AEO opportunity engine: score a domain against competitors and AI
      answers, then generate/track scored content opportunities.
  - name: Departments
    description: Organize employees into departments for better team structure.
  - name: Documentation
    description: >-
      Browse and search platform documentation, and request docs that are
      missing.
  - name: Documents
    description: Manage your knowledge base documents for AI training and reference.
  - name: Employees
    description: Customizable AI personas you can list and chat with.
  - name: Images
    description: Generate AI images using DALL-E, Leonardo, and other providers.
  - name: Inbox
    description: Manage incoming messages and communications across channels.
  - name: Integrations
    description: >-
      Discovery endpoints that resolve IDs from connected third-party accounts
      (HeyReach, Salesforge, Twilio, Meta Ads, CRMs) for other actions to use.
  - name: Keys
    description: Manage API keys for programmatic access to the platform.
  - name: Landing Pages
    description: Create and manage landing pages for lead capture and campaigns.
  - name: Leads
    description: >-
      Generate leads from filters, intent segments and buyer-intent keywords,
      enrich contacts, and import them into a smart list.
  - name: Lists
    description: Manage smart lists for organizing contacts and data.
  - name: Marketing Campaigns
    description: >-
      Create, schedule, and send one-shot marketing email campaigns to a smart
      list, and track open/click performance.
  - name: Mcp
    description: >-
      Model Context Protocol (MCP) server for AI assistants like Claude Desktop,
      Cursor, and Windsurf. Provides tools for full platform API access.
  - name: Memories
    description: >-
      Store and retrieve conversation context and user preferences for AI
      personalization.
  - name: Models
    description: List available AI models.
  - name: Monitors
    description: >-
      Track keywords across social platforms (Reddit, Hacker News, LinkedIn, X,
      Quora) to discover relevant conversations and get AI reply suggestions.
  - name: Organizations
    description: >-
      List the organizations the authenticated user belongs to — the top-level
      grouping above companies.
  - name: People
    description: >-
      Identity graph: search and browse one resolved profile per person (merged
      across sequences, lists, conversations and campaigns) with their activity
      timeline.
  - name: Projects
    description: Organize work into projects for better task management.
  - name: SEO
    description: >-
      SEO toolkit: keyword and domain lookups, site audits, scheduled per-domain
      monitoring (rank, backlinks, competitors, AI visibility), Search Console,
      and a raw DataForSEO passthrough.
  - name: Scheduled Tasks
    description: >-
      Schedule AI employee runs — one-time, recurring, or heartbeat — and manage
      their history, status, and grading.
  - name: Sequences
    description: >-
      Manage automated outreach sequences for email, SMS, and multi-channel
      campaigns.
  - name: Skills
  - name: Support
    description: >-
      Create and manage support tickets, post follow-up messages on tickets, and
      track their status.
  - name: Tags
    description: Organize and categorize resources with custom tags.
  - name: Usage
    description: Track API usage, credits, and billing information.
  - name: Video
    description: Generate AI videos using fal.ai models.
  - name: Voices
    description: Manage voice clones and text-to-speech voice options.
  - name: Web
    description: >-
      Real-time web tools: search the web and news, read/screenshot any page,
      and pull jobs, local-business and trending-topic data.
  - name: Websites
    description: >-
      Read, audit and edit the company's multi-page Jinja/HTML websites, staging
      edits on a review branch for the owner to approve.
    x-relatedSkills:
      - website-editing
paths:
  /api/v0/lists/{listId}/duplicate:
    post:
      tags:
        - Lists
      summary: Duplicate a smart list and all its active row data.
      description: >-
        Copies every active row, column definition, cell value, cell research
        and

        timestamp, and table action configuration/results. New list, header, and

        row IDs make the copy independent. Deleted rows/columns are excluded.

        The caller owns the copy; sharing and department restrictions are
        retained.

        Copied automations start disabled. Running jobs, execution history,
        campaign

        recipients, and sequence memberships remain attached to the original
        list.

        Computed lookup columns recalculate for the new list. The entire copy is

        committed atomically; an error leaves no partial list.
      operationId: lists_duplicateList
      parameters:
        - name: listId
          in: path
          required: true
          schema:
            type: string
        - name: companyId
          in: query
          required: false
          schema:
            type: string
            description: >-
              Company ID that owns the list. Required when authenticating with a
              personal access key (pak_…) — the key is not tied to a specific
              company so the server cannot infer it. Required when
              authenticating with a company API key only if the key belongs to a
              user who has access to multiple companies; otherwise it defaults
              to the key's company. Optional for JWT (dashboard) auth — defaults
              to the user's active company.
          description: >-
            Company ID that owns the list. Required when authenticating with a
            personal access key (pak_…) — the key is not tied to a specific
            company so the server cannot infer it. Required when authenticating
            with a company API key only if the key belongs to a user who has
            access to multiple companies; otherwise it defaults to the key's
            company. Optional for JWT (dashboard) auth — defaults to the user's
            active company.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: >-
                    Name of the copy (1–100 characters). Defaults to the source
                    name followed by " (copy)".
                companyId:
                  type: string
                  description: >-
                    Company ID that owns the list. Required when authenticating
                    with a personal access key (pak_…) — the key is not tied to
                    a specific company so the server cannot infer it. Required
                    when authenticating with a company API key only if the key
                    belongs to a user who has access to multiple companies;
                    otherwise it defaults to the key's company. Optional for JWT
                    (dashboard) auth — defaults to the user's active company.
        description: Optional copy name; send {} to use the default
      responses:
        '201':
          description: Independent list copy with headers and copied row count
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    description: ID (UUID) of the newly created list
                  name:
                    type: string
                    description: Name of the newly created list
                  type:
                    type: string
                    description: 'List type: "leads", "companies", or "custom"'
                  headers:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: Column ID (UUID)
                        listId:
                          type: string
                          description: Parent list ID (UUID)
                        name:
                          type: string
                          description: Column name
                        type:
                          type: string
                          description: >-
                            Column type. Data types: text, long_text, url,
                            image, email, phone, linkedin_url. Action types
                            (server-managed): action, lookup, etc.
                        dataType:
                          type: string
                          description: >-
                            Underlying data type used for storage and validation
                            (e.g., string, number, boolean, json)
                        order:
                          type: number
                          description: >-
                            Display order within the list (smaller values appear
                            first)
                        actionParameters:
                          type: object
                          description: >-
                            Parameters for action/lookup columns. Null for plain
                            data columns.
                        autoRunEnabled:
                          type: boolean
                          description: >-
                            For action/lookup columns: whether the action runs
                            automatically on new rows.
                        autoRunEnabledDate:
                          type: string
                          description: >-
                            Timestamp (ISO 8601) when autoRun was last enabled.
                            Null if autoRun has never been enabled.
                        conditions:
                          type: object
                          description: >-
                            Optional run conditions for action/lookup columns
                            (free-form JSON). Null when no conditions are
                            configured.
                        loading:
                          type: boolean
                          description: >-
                            True while a column-wide action is currently
                            executing for this column.
                        created_date:
                          type: string
                          description: Creation timestamp (ISO 8601)
                        updated_date:
                          type: string
                          description: Last update timestamp (ISO 8601)
                        deleted_date:
                          type: string
                          description: >-
                            Soft-delete timestamp (ISO 8601). Null for active
                            columns.
                      description: Column (header) on a list
                    description: >-
                      Ordered column definitions created for the list. Use these
                      column names when adding or updating rows.
                  count:
                    type: integer
                    description: >-
                      Number of active rows copied, including rows with empty
                      cells.
                  sharing:
                    type: string
                    description: Sharing visibility retained from the source list.
                  departmentIds:
                    type: array
                    items:
                      type: string
                    description: Department restrictions retained from the source list.
                description: >-
                  Response returned after creating a list. Includes the list's
                  column headers so callers know the exact column names/types to
                  read or write rows against — no follow-up request is needed.
        '400':
          description: Invalid list ID or name
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Invalid credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: List access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: List not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error message
  securitySchemes:
    CompanyApiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Company API key - scoped to a specific company. Generate from the
        Integrations page in your dashboard.
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Bearer token authentication. Can use either a Company API Key or a
        Personal Access Key (starting with pak_). Personal Access Keys require
        X-Company-ID header.
    CompanyId:
      type: apiKey
      in: header
      name: X-Company-ID
      description: >-
        Required when using Personal Access Keys. Specifies which company to
        access.

````