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

# Update a contact

> Updates an existing contact. Only provided fields will be updated. Returns 404 if the contact is in a workspace outside the API key scope.



## OpenAPI

````yaml https://api-public.skipcall.app/docs-json patch /v1/contacts/{id}
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/contacts/{id}:
    patch:
      tags:
        - Contacts
      summary: Update a contact
      description: >-
        Updates an existing contact. Only provided fields will be updated.
        Returns 404 if the contact is in a workspace outside the API key scope.
      operationId: ContactController_update
      parameters:
        - name: id
          required: true
          in: path
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicUpdateContactDto'
      responses:
        '200':
          description: The updated contact
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicContactDto'
        '400':
          description: Invalid input data
        '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: Contact not found or outside API key scope
      security:
        - ApiKey: []
components:
  schemas:
    PublicUpdateContactDto:
      type: object
      properties:
        firstName:
          type: string
          description: First name of the contact
          example: John
          minLength: 1
          maxLength: 100
        lastName:
          type: string
          description: Last name of the contact
          example: Doe
          minLength: 1
          maxLength: 100
        email:
          type: string
          description: Email address of the contact
          example: john.doe@example.com
        company:
          type: string
          description: Company name
          example: Acme Inc.
          maxLength: 200
        city:
          type: string
          description: City
          example: Paris
          maxLength: 200
        country:
          type: string
          description: Country
          example: France
          maxLength: 200
        url:
          type: string
          description: Website URL
          example: https://example.com
        linkedinUrl:
          type: string
          description: LinkedIn profile URL
          example: https://linkedin.com/in/johndoe
        linkedinSalesUrl:
          type: string
          description: LinkedIn Sales Navigator URL
          example: https://linkedin.com/sales/people/johndoe
        role:
          type: string
          description: Role / job title
          example: CTO
          maxLength: 200
        allowPhoneCalls:
          type: boolean
          description: Whether the contact accepts phone calls
          example: true
        phoneNumbers:
          description: >-
            Phone numbers in E.164 format. If provided, replaces all existing
            phone numbers.
          example:
            - '+33612345678'
            - '+33698765432'
          minItems: 1
          maxItems: 20
          type: array
          items:
            type: string
        customFields:
          type: object
          description: >-
            Custom field values keyed by the custom field **slug** (the stable,
            immutable identifier returned by GET /custom-fields). Only provided
            keys are updated; omit to leave existing values untouched. Custom
            fields must already exist for the team. For backwards compatibility
            this endpoint also accepts keys matching the custom field **name**,
            but this fallback is deprecated and will be removed in a future
            release — migrate your integrations to use slugs.
          example:
            industry: Technology
            team_size: 50-100
          additionalProperties:
            type: string
    PublicContactDto:
      type: object
      properties:
        id:
          type: string
          example: 550e8400-e29b-41d4-a716-446655440000
        firstName:
          type: string
          example: John
        lastName:
          type: string
          example: Doe
        email:
          type: object
          example: john.doe@example.com
          nullable: true
        company:
          type: object
          example: Acme Inc.
          nullable: true
        city:
          type: object
          example: Paris
          nullable: true
        country:
          type: object
          example: France
          nullable: true
        url:
          type: object
          example: https://example.com
          nullable: true
        linkedinUrl:
          type: object
          example: https://linkedin.com/in/johndoe
          nullable: true
        linkedinSalesUrl:
          type: object
          example: https://linkedin.com/sales/people/johndoe
          nullable: true
        role:
          type: object
          example: CTO
          nullable: true
        allowPhoneCalls:
          type: boolean
          example: true
        callCount:
          type: number
          example: 5
        lastCallAt:
          format: date-time
          type: string
          nullable: true
        teamId:
          type: string
          example: 550e8400-e29b-41d4-a716-446655440000
        phoneNumbers:
          example:
            - '+33612345678'
          type: array
          items:
            type: string
        customFields:
          type: object
          example:
            Industry: Technology
            Size: 50-100
          additionalProperties:
            type: string
        createdAt:
          format: date-time
          type: string
        updatedAt:
          format: date-time
          type: string
        lastModificationSource:
          type: string
          enum:
            - SKIPCALL
            - API
      required:
        - id
        - firstName
        - lastName
        - allowPhoneCalls
        - callCount
        - teamId
        - phoneNumbers
        - customFields
        - createdAt
        - updatedAt
        - lastModificationSource
  securitySchemes:
    ApiKey:
      scheme: bearer
      bearerFormat: API Key
      type: http
      description: Enter your API Key (sk_live_xxx or sk_test_xxx)

````