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

# Add contacts to a sequence

> Adds contacts to an existing sequence. Each item may optionally specify an `assignedToWorkspaceMembershipId` (a workspace membership id obtained via `GET /v1/workspaces/:id/members`). Items without `assignedToWorkspaceMembershipId` are auto-assigned via round-robin among the sequence assignees (least loaded first). Idempotent: duplicates, contacts already in the sequence, and contacts outside the sequence scope are silently ignored. Soft-deleted sequence-contacts are resurrected (their original assignee is preserved; an `assignedToWorkspaceMembershipId` in the body is ignored for resurrected rows). Returns 404 if the sequence is outside the API key scope. On concurrent requests for the same contact, the winner among competing `assignedToWorkspaceMembershipId` values is undefined; verify with GET /v1/sequences/:id/contacts.



## OpenAPI

````yaml https://api-public.skipcall.app/docs-json post /v1/sequences/{id}/contacts
openapi: 3.0.0
info:
  title: Skipcall Public API
  description: >-
    ## Overview

    The Skipcall Public API allows you to integrate Skipcall with your
    applications, CRM, or automation tools.


    ## Plan Requirements

    API access is available for **STARTER**, **INTERMÉDIAIRE** and **EXPERT**
    plans.


    ## Authentication

    All API requests require authentication using an API Key. Include your API
    key in the `Authorization` header:


    ```

    Authorization: Bearer sk_live_your_api_key_here

    ```


    You can generate API keys from your Skipcall dashboard under Settings > API
    Keys.


    ## Rate Limiting

    Rate limits vary by subscription plan:


    | Plan | Rate Limit |

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

    | STARTER | 100 requests/minute |

    | INTERMÉDIAIRE | 100 requests/minute |

    | EXPERT | 1000 requests/minute |


    Rate limit headers are included in every response:

    - `X-RateLimit-Limit`: Maximum requests per minute for your plan

    - `X-RateLimit-Remaining`: Remaining requests in the current window

    - `X-RateLimit-Reset`: Unix timestamp when the rate limit resets


    ## Errors

    The API uses standard HTTP status codes:

    - `200` - Success

    - `400` - Bad Request (invalid parameters)

    - `401` - Unauthorized (invalid or missing API key)

    - `403` - Forbidden (subscription required or plan not eligible)

    - `404` - Not Found

    - `429` - Too Many Requests (rate limit exceeded)

    - `500` - Internal Server Error


    ### Subscription Errors

    | Code | Description |

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

    | `SUBSCRIPTION_REQUIRED` | An active subscription is required to access the
    API |

    | `PLAN_NOT_ELIGIBLE` | API access requires STARTER, INTERMÉDIAIRE or EXPERT
    plan |
  version: '1.0'
  contact: {}
servers:
  - url: https://api-public.skipcall.app
    description: Production
security: []
tags:
  - name: Contacts
    description: Manage your contacts
  - name: Calls
    description: Access call history and recordings
paths:
  /v1/sequences/{id}/contacts:
    post:
      tags:
        - Sequences
      summary: Add contacts to a sequence
      description: >-
        Adds contacts to an existing sequence. Each item may optionally specify
        an `assignedToWorkspaceMembershipId` (a workspace membership id obtained
        via `GET /v1/workspaces/:id/members`). Items without
        `assignedToWorkspaceMembershipId` are auto-assigned via round-robin
        among the sequence assignees (least loaded first). Idempotent:
        duplicates, contacts already in the sequence, and contacts outside the
        sequence scope are silently ignored. Soft-deleted sequence-contacts are
        resurrected (their original assignee is preserved; an
        `assignedToWorkspaceMembershipId` in the body is ignored for resurrected
        rows). Returns 404 if the sequence is outside the API key scope. On
        concurrent requests for the same contact, the winner among competing
        `assignedToWorkspaceMembershipId` values is undefined; verify with GET
        /v1/sequences/:id/contacts.
      operationId: SequenceController_addContacts
      parameters:
        - name: id
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContactAssignmentBatchDto'
      responses:
        '201':
          description: Contacts added
          content:
            application/json:
              schema:
                example:
                  added: 3
        '400':
          description: >-
            Validation error, or an explicit `assignedToWorkspaceMembershipId`
            is not in the sequence assignees / not in the sequence workspace.
        '401':
          description: Invalid or missing API key
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: UNAUTHORIZED
                      message:
                        type: string
                        example: Invalid or revoked API key
                      status:
                        type: number
                        example: 401
        '403':
          description: Subscription required or plan not eligible
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: PLAN_NOT_ELIGIBLE
                      message:
                        type: string
                        example: API access requires INTERMÉDIAIRE or EXPERT plan
                      status:
                        type: number
                        example: 403
        '404':
          description: Sequence not found or outside API key scope
      security:
        - ApiKey: []
components:
  schemas:
    ContactAssignmentBatchDto:
      type: object
      properties:
        contacts:
          minItems: 1
          maxItems: 100
          description: >-
            Array of 1–100 contact assignment entries. Per item: `contactId` is
            required; `assignedToWorkspaceMembershipId` optional. Duplicates,
            contacts already in the sequence, and out-of-scope contacts are
            silently ignored.
          type: array
          items:
            $ref: '#/components/schemas/ContactAssignmentDto'
      required:
        - contacts
    ContactAssignmentDto:
      type: object
      properties:
        contactId:
          type: string
          format: uuid
          example: 123e4567-e89b-12d3-a456-426614174000
          description: The contact UUID (v4).
        assignedToWorkspaceMembershipId:
          type: string
          format: uuid
          example: 987e6543-e21b-45d3-b678-426614174001
          description: >-
            Optional workspace-membership UUID identifying the assignee (the
            user within the workspace). Obtain via GET
            /v1/workspaces/:id/members. If omitted, the contact is auto-assigned
            via round-robin among the sequence assignees. If provided, must
            belong to the sequence workspace AND be one of the sequence
            assignees, otherwise 400.
      required:
        - contactId
  securitySchemes:
    ApiKey:
      scheme: bearer
      bearerFormat: API Key
      type: http
      description: Enter your API Key (sk_live_xxx or sk_test_xxx)

````