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

# Create or update a sequence.

> By default (``partial`` omitted or true) only the fields present in the body
are updated and every omitted field is left untouched -- this is the
recommended behavior for AI agents so a targeted edit never resets unrelated
settings. Send ``partial: false`` to do a full replace where omitted fields
fall back to their defaults (the frontend does this). Including ``steps``
replaces the full step list; to change a single step, prefer the
/sequences/<id>/steps endpoints. A ``steps`` array that drops every existing
step is rejected unless ``confirmDeleteAllSteps: true`` is also sent.



## OpenAPI

````yaml https://api.parallellabs.app/docs/openapi.json post /api/v0/sequences
openapi: 3.0.3
info:
  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.


    ---


    ## 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 |
  title: API Documentation
  version: 1.0.0
servers:
  - url: https://api.parallellabs.app
security:
  - CompanyApiKey: []
  - BearerAuth: []
    CompanyId: []
tags:
  - description: >-
      Create, manage, and interact with AI agents that handle customer
      interactions across multiple channels including website chat, email, SMS,
      and voice.
    name: Agents
  - description: Generate text-to-speech audio using ElevenLabs.
    name: Audio
  - description: Execute browser automation tasks with natural language.
    name: Browser
  - description: OpenAI-compatible chat completions API.
    name: Chat
  - description: >-
      Manage companies and workspaces. Each company has its own agents, lists,
      sequences, and other resources.
    name: Companies
  - description: Manage team members and their access to companies.
    name: Company Users
  - description: >-
      AI content engine for generating and scheduling social media posts,
      articles, and marketing content.
    name: Content
  - description: >-
      SEO/AEO opportunity engine. Analyzes a domain against its competitors,
      search results, and AI assistant answers (ChatGPT, Google AI) to surface
      scored content opportunities, each with search volumes and a
      ready-to-generate brief. Workflow: 1) Create a project per ideal customer
      profile with content_research_createResearchProject — each project
      researches one domain against one ICP, so separate audiences stay
      separated rather than being blended into one result set. 2) Start a run
      with content_research_runResearchProject (charges credits up front, not
      refunded on failure; only one run per project can be active at a time). 3)
      Poll content_research_listResearchRuns until the newest run reports
      completed or failed. 4) Read results with
      content_research_listOpportunities, scoped by projectId. 5) Act on one
      with content_research_generateFromOpportunity to write the piece,
      content_research_trackOpportunity to monitor its keywords, or
      content_research_dismissOpportunity to hide it.
    name: Content Research
  - description: Organize employees into departments for better team structure.
    name: Departments
  - description: >-
      Browse and search platform documentation. Workflow: 1) Call
      documentation_listDocumentationCategories to see the top-level categories.
      2) Drill into one with documentation_listDocumentationPages?parentId={id}
      to see its child pages. 3) Call documentation_getDocumentationPage with a
      page id to read the full Markdown content. 4) Use
      documentation_searchDocumentation for keyword search across pages — it
      returns short snippets so you can decide which page to open in full.
      IMPORTANT: If the documentation you need does not exist or is incomplete
      after you browse and search, call documentation_submitDocumentationRequest
      to file a request so the docs team can add it.
    name: Documentation
  - description: Manage your knowledge base documents for AI training and reference.
    name: Documents
  - description: >-
      AI employees are customizable personas you can chat with. To chat with an
      employee: 1) Use platform_list_companies to find your company ID, 2) List
      employees with employees_listEmployeesApi or employees_getEmployees, 3)
      Chat using employees_chatEmployee with the employeeId and your message.
    name: Employees
  - description: Generate AI images using DALL-E, Leonardo, and other providers.
    name: Images
  - description: Manage incoming messages and communications across channels.
    name: Inbox
  - name: Integrations
  - description: Manage API keys for programmatic access to the platform.
    name: Keys
  - description: Create and manage landing pages for lead capture and campaigns.
    name: Landing Pages
  - description: >-
      Lead generation and contact enrichment. Generate leads from
      demographic/firmographic filters, premade intent segments, and
      buyer-intent keywords, and enrich a person or company from any identifiers
      (name, email, company, domain, LinkedIn URL). Workflow: 1) Call
      leads_listFieldOptions with describe=true to learn the filter surface,
      then re-call with field= or group= for valid enum values — never guess
      enum strings. 2) Call leads_searchSegments to find premade segment
      externalIds (e.g. "b2b_12636") for interest/intent targeting. 3) Call
      leads_generateLeads with filters, segment ids, and/or audience
      buyer-intent keywords to fetch leads. 4) Call leads_enrichContact to get
      full contact details (emails, phones, ~75 fields) for a specific person or
      company — prefer it over web search for contact lookups. 5) To keep the
      leads, call leads_importLeadsToList with the same criteria plus a
      destination listId: it builds the full audience and writes every matching
      contact into that smart list as rows. The list must already exist (create
      one with lists_saveList first), and the import runs in the background — it
      returns a taskId immediately. Generating leads costs 1 data credit per
      call and a matched enrichment costs 2; importing costs 1 per contact
      imported and is gated on the FULL match count (the whole audience is built
      regardless of how many rows you import), so check totalAvailable with
      leads_generateLeads before importing; the field-options and segments
      endpoints are free.
    name: Leads
  - description: Manage smart lists for organizing contacts and data.
    name: Lists
  - description: >-
      Create, schedule, and send one-shot marketing email campaigns to a smart
      list, and track open/click performance.
    name: Marketing Campaigns
  - description: >-
      Model Context Protocol (MCP) server for AI assistants like Claude Desktop,
      Cursor, and Windsurf. Provides tools for full platform API access.
    name: Mcp
  - description: >-
      Store and retrieve conversation context and user preferences for AI
      personalization.
    name: Memories
  - description: List available AI models.
    name: Models
  - description: >-
      Track keywords across social media platforms (Reddit, Hacker News,
      LinkedIn, X, Quora) and discover relevant conversations. Create monitors
      to track specific keywords, receive notifications when mentions are found,
      and generate AI-powered reply suggestions to engage with your audience.
    name: Monitors
  - name: Organizations
  - name: People
  - description: Organize work into projects for better task management.
    name: Projects
  - description: >-
      Manage automated outreach sequences for email, SMS, and multi-channel
      campaigns.
    name: Sequences
  - description: >-
      Create and manage support tickets, post follow-up messages on tickets, and
      track their status.
    name: Support
  - description: Organize and categorize resources with custom tags.
    name: Tags
  - description: Track API usage, credits, and billing information.
    name: Usage
  - description: Generate AI videos using fal.ai models.
    name: Video
  - description: Manage voice clones and text-to-speech voice options.
    name: Voices
paths:
  /api/v0/sequences:
    post:
      tags:
        - Sequences
      summary: Create or update a sequence.
      description: >-
        By default (``partial`` omitted or true) only the fields present in the
        body

        are updated and every omitted field is left untouched -- this is the

        recommended behavior for AI agents so a targeted edit never resets
        unrelated

        settings. Send ``partial: false`` to do a full replace where omitted
        fields

        fall back to their defaults (the frontend does this). Including
        ``steps``

        replaces the full step list; to change a single step, prefer the

        /sequences/<id>/steps endpoints. A ``steps`` array that drops every
        existing

        step is rejected unless ``confirmDeleteAllSteps: true`` is also sent.
      operationId: sequences_saveSequence
      parameters: []
      requestBody:
        content:
          application/json:
            schema:
              description: Request body for creating or updating a sequence
              properties:
                confirmDeleteAllSteps:
                  description: >-
                    Safety flag. Required to be true if "steps" is provided but
                    keeps none of the existing steps (e.g. an empty array);
                    otherwise the request is rejected to prevent accidentally
                    wiping every step.
                  type: boolean
                crmIntegrationId:
                  description: >-
                    CRM integration ID to sync to (used only when crmSyncEnabled
                    is true). To find valid IDs, call crm_getCrmIntegrations.
                  type: string
                crmSyncEnabled:
                  description: >-
                    Enable syncing replies/outcomes to a CRM. When true, also
                    set crmIntegrationId.
                  type: boolean
                description:
                  description: Sequence description
                  type: string
                id:
                  description: >-
                    Sequence ID. Provide to update an existing sequence; omit to
                    create a new one.
                  type: string
                includeUnsubscribeText:
                  description: >-
                    Append a custom opt-out line to the end of each email, where
                    the unsubscribe link goes. Independent of
                    includeUnsubscribeLink — use it in place of or in addition
                    to the link, and it is also included on text-only emails
                    (which have no link). When true and unsubscribeText is
                    blank, the default line is used. Defaults to false.
                  type: boolean
                linkedinIntegrationIds:
                  description: >-
                    FALLBACK ONLY. LinkedIn account integration IDs used for a
                    member whose selected sender profile has no
                    linkedinIntegrationId of its own. If your sender profiles
                    already have LinkedIn attached, leave this empty. To find
                    valid IDs, call integrations_getIntegrationsByType with path
                    integration_type=browser_session and query
                    type=linkedin_login.
                  items:
                    type: string
                  type: array
                name:
                  description: >-
                    Sequence name. Required when creating (no id); optional on
                    update.
                  type: string
                notificationUserIds:
                  description: >-
                    Company user IDs (uids) who should receive sequence
                    notifications. To find valid IDs, call
                    company_users_getCompanyUsers.
                  items:
                    type: string
                  type: array
                partial:
                  description: >-
                    Update only the fields present in this body and leave all
                    omitted fields untouched. Recommended for AI agents making
                    targeted edits so they never reset unrelated settings.
                    Ignored when creating a new sequence. Defaults to false
                    (full replace).
                  type: boolean
                phoneIntegrationIds:
                  description: >-
                    FALLBACK ONLY. Twilio/phone integration IDs for SMS/voice
                    steps, used when the selected sender profile has no
                    phoneIntegrationId. If your sender profiles already have
                    phone attached, leave this empty. To find valid IDs, call
                    integrations_getIntegrationsByType with path
                    integration_type=sms.
                  items:
                    type: string
                  type: array
                phoneNumbers:
                  description: >-
                    FALLBACK ONLY. Sending phone numbers (E.164) paired with the
                    fallback phoneIntegrationIds, used when the sender profile
                    has no phone number. To find available numbers for a phone
                    integration, call integrations_getTwilioPhoneNumbers with
                    that integration_id.
                  items:
                    type: string
                  type: array
                senderProfileId:
                  description: >-
                    Deprecated single sender profile ID; prefer
                    senderProfileIds. To find valid IDs, call
                    sequences_listProfiles.
                  type: string
                senderProfileIds:
                  description: >-
                    PRIMARY channel configuration. Sender profile IDs to send
                    as; each profile already carries its own email account,
                    LinkedIn account, phone integration + number, voice, and
                    agent, so usually this is the only channel field you need to
                    set. To find valid IDs (and to see which channels each
                    profile already has), call sequences_listProfiles. To attach
                    a missing channel, edit the sender profile via
                    sequences_updateProfile rather than setting the
                    sequence-level fallbacks below.
                  items:
                    type: string
                  type: array
                steps:
                  description: >-
                    Array of sequence step configurations. WARNING: this
                    REPLACES the full step list — any existing step not included
                    here is removed. Omit this key entirely to leave steps
                    unchanged. To edit, add, or delete a single step, prefer the
                    /sequences/<id>/steps endpoints instead.
                  items:
                    type: object
                  type: array
                unsubscribeText:
                  description: >-
                    The custom opt-out text shown when includeUnsubscribeText is
                    true. Leave blank to use the default: 'If this is not
                    relevant, simply reply "stop".' Has no effect unless
                    includeUnsubscribeText is true.
                  type: string
                voiceId:
                  description: >-
                    FALLBACK ONLY. Voice ID for voice-message steps, used when
                    the selected sender profile has no voiceId. To find valid
                    IDs, call voices_listVoices.
                  type: string
              type: object
        description: Sequence data
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                description: Sequence response
                properties:
                  sequence:
                    description: Sequence object
                    properties:
                      created:
                        description: Creation timestamp
                        type: string
                      description:
                        description: Sequence description
                        type: string
                      id:
                        description: Sequence ID
                        type: string
                      includeUnsubscribeText:
                        description: >-
                          Whether a custom opt-out line is appended to the end
                          of each email (independent of the unsubscribe link,
                          and included on text-only emails). When true and
                          unsubscribeText is empty, the default line is used.
                        type: boolean
                      memberCount:
                        description: Number of members
                        type: integer
                      name:
                        description: Sequence name
                        type: string
                      status:
                        description: Sequence status (active, paused, archived)
                        type: string
                      steps:
                        description: Ordered list of steps in this sequence
                        items:
                          description: Sequence step object
                          properties:
                            abTestEnabled:
                              description: Whether A/B testing is enabled for this step
                              type: boolean
                            abTestName:
                              description: A/B test display name
                              type: string
                            actionParameters:
                              description: >-
                                Platform-specific action parameters. For
                                actionType=auto_agent, see
                                SequenceStepAutoAgentParametersSchema.
                              type: object
                            actionType:
                              description: >-
                                Action type. One of: email, sms, voice_message,
                                browser_task, prosp_campaign, heyreach_campaign,
                                salesforge_campaign, http_request,
                                agent_conversation, linkedin_profile_visit,
                                linkedin_connection_request, linkedin_message,
                                thanksio, meta_ads_audience, auto_agent,
                                add_to_sequence, add_to_list
                              type: string
                            aiPersonalized:
                              description: Whether content is AI-personalized
                              type: boolean
                            aiPersonalizedInstructions:
                              description: AI personalization instructions
                              type: string
                            autoAgentParameters:
                              description: >-
                                Typed view of actionParameters when
                                actionType=auto_agent. Documentation-only — the
                                canonical store is actionParameters.
                              properties:
                                abilities:
                                  description: >-
                                    Channels the agent may use. Allowed values:
                                    email, sms, voice. Defaults to [email].
                                  items:
                                    type: string
                                  type: array
                                agentId:
                                  description: >-
                                    Agent ID to drive the conversation (used
                                    when useSenderProfileAgent is False or
                                    sender profile has no agent).
                                  type: string
                                autoAgentChannel:
                                  description: >-
                                    Initial outbound channel for the first
                                    message. One of: email, sms, voice.
                                  type: string
                                goal:
                                  description: >-
                                    Required. Goal the auto-agent should achieve
                                    for the member.
                                  type: string
                                maxResponseDelayMinutes:
                                  description: >-
                                    Maximum delay (minutes) before the agent
                                    responds (jitter range). Defaults to 45.
                                  type: integer
                                maxSteps:
                                  description: >-
                                    Maximum number of agent turns before
                                    stopping. Defaults to 5.
                                  type: integer
                                minResponseDelayMinutes:
                                  description: >-
                                    Minimum delay (minutes) before the agent
                                    responds, for human-like timing. Defaults to
                                    15.
                                  type: integer
                                useSenderProfileAgent:
                                  description: >-
                                    Prefer the sender profile's agent over
                                    agentId. Defaults to True.
                                  type: boolean
                              type: object
                            content:
                              description: >-
                                Step content/message body. For auto_agent steps,
                                this is the messaging guidance.
                              type: string
                            created_date:
                              description: Creation timestamp
                              type: string
                            daysAfterPrevious:
                              description: Delay in days after the previous step
                              type: integer
                            id:
                              description: Step ID
                              type: string
                            order:
                              description: Step order within the sequence (0-based)
                              type: integer
                            platform:
                              description: >-
                                Platform (linkedin, twitter, facebook,
                                instagram, etc.)
                              type: string
                            schedulingIntegrationId:
                              description: >-
                                Scheduling integration ID for calendar booking.
                                To find valid IDs, call
                                integrations_getIntegrationsByType with path
                                integration_type=scheduling.
                              type: string
                            senderProfile:
                              description: Sender profile ID override for this step
                              type: string
                            sequenceId:
                              description: Parent sequence ID
                              type: string
                            stepName:
                              description: Display name for the step
                              type: string
                            subject:
                              description: Email subject (email actions only)
                              type: string
                            trackCalendarBooking:
                              description: >-
                                Whether to track calendar booking via unique
                                schedule links
                              type: boolean
                            updated_date:
                              description: Last update timestamp
                              type: string
                            variants:
                              description: A/B test variants array
                              items:
                                type: object
                              type: array
                          type: object
                        type: array
                      unsubscribeText:
                        description: >-
                          Custom opt-out line shown when includeUnsubscribeText
                          is true. Empty/null means the default line is used:
                          'If this is not relevant, simply reply "stop".'
                        type: string
                      updated:
                        description: Last update timestamp
                        type: string
                    type: object
                type: object
          description: Created sequence
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Invalid credentials
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Server error
components:
  schemas:
    Error:
      properties:
        error:
          description: Error message
          type: string
      type: object
  securitySchemes:
    CompanyApiKey:
      description: >-
        Company API key - scoped to a specific company. Generate from the
        Integrations page in your dashboard.
      in: header
      name: X-API-Key
      type: apiKey
    BearerAuth:
      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.
      scheme: bearer
      type: http
    CompanyId:
      description: >-
        Required when using Personal Access Keys. Specifies which company to
        access.
      in: header
      name: X-Company-ID
      type: apiKey

````