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

# Delete contacts

> Deletes one or multiple contacts



## OpenAPI

````yaml /developers/openapi.yaml post /v1/contacts/delete
openapi: 3.0.3
info:
  title: TalkToHumans Public API
  version: 1.0.0
  license:
    name: Proprietary
  description: >
    Read and organize the LinkedIn organization data your team already manages
    in TalkToHumans: accounts, contacts, tags, notes, custom fields, sequence
    state, conversations, templates, and views.
servers:
  - url: https://api.talktohumans.app
    description: TalkToHumans API
security:
  - bearerAuth: []
tags:
  - name: Organization
    description: Organization details for the current API key.
  - name: LinkedIn
    description: LinkedIn accounts, contacts, companies, and conversations.
  - name: Activity
    description: Activity for organization reporting.
  - name: Enrich
    description: Profile enrichment for LinkedIn contacts and companies.
  - name: Views
    description: Saved TalkToHumans views.
  - name: Sequences
    description: Sequences of contacts and conversations.
  - name: Templates
    description: Message and sequence templates.
  - name: Custom fields
    description: Custom fields for contacts and companies.
  - name: Tags
    description: Tags for contacts and companies.
  - name: Agents
    description: Playbooks and feedback for AI agents, shared with the MCP.
paths:
  /v1/contacts/delete:
    post:
      tags:
        - LinkedIn
      summary: Delete contacts
      description: Deletes one or multiple contacts
      operationId: deleteContacts
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeleteContactsRequest'
            example:
              account_id: '42'
              contact_ids:
                - '1201'
                - '1202'
      responses:
        '200':
          description: >-
            Contacts deleted. Contacts that can't be deleted are listed in
            `skipped`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteContactsEnvelope'
              example:
                data:
                  deleted:
                    - '1201'
                  skipped:
                    - contact_id: '1202'
                      reason: connected
                      message: Connected on LinkedIn
                  deleted_sequences: 0
                  deleted_drafts: 0
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/AccountScopedForbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    DeleteContactsRequest:
      type: object
      additionalProperties: false
      required:
        - account_id
        - contact_ids
      properties:
        account_id:
          type: string
          description: LinkedIn account ID returned by `GET /v1/accounts`.
          pattern: ^[1-9][0-9]*$
        contact_ids:
          type: array
          minItems: 1
          maxItems: 500
          description: >-
            Contact IDs returned by `GET /v1/contacts`. Duplicates are deleted
            once.
          items:
            type: string
            pattern: ^[1-9][0-9]*$
    DeleteContactsEnvelope:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          type: object
          additionalProperties: false
          required:
            - deleted
            - skipped
            - deleted_sequences
            - deleted_drafts
          properties:
            deleted:
              type: array
              description: IDs of the deleted contacts.
              items:
                type: string
            skipped:
              type: array
              description: Contacts that were not deleted, in request order.
              items:
                $ref: '#/components/schemas/SkippedContact'
            deleted_sequences:
              type: integer
              description: Sequences deleted with their contacts.
            deleted_drafts:
              type: integer
              description: Drafts deleted with their contacts.
    SkippedContact:
      type: object
      additionalProperties: false
      required:
        - contact_id
        - reason
        - message
      properties:
        contact_id:
          type: string
        reason:
          type: string
          enum:
            - connected
            - invitation_pending
            - in_conversation
            - sending_now
            - not_found
          description: >
            Why the contact was kept. LinkedIn would add back a contact that is
            `connected`, has a pending invitation (`invitation_pending`), or is
            `in_conversation`.

            `sending_now` means a sequence message is being sent; retry in a
            minute. `not_found` means the ID isn't a contact of this account.
        message:
          type: string
          description: The reason in plain words, as shown in the app.
    Error:
      type: object
      additionalProperties: false
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: Machine-readable error code.
          enum:
            - unauthorized
            - forbidden
            - not_found
            - bad_request
            - internal_error
            - conflict
            - rate_limit_exceeded
            - account_shared_access_required
            - linkedin_not_connected
            - workspace_setup_required
            - billing_payment_failed
            - billing_subscription_incomplete
            - billing_subscription_expired
            - billing_grace_period
            - billing_feature_not_available
            - billing_insufficient_credits
            - billing_invalid
            - enrichment_failed
            - enrichment_in_progress
            - linkedin_profile_not_found
        message:
          type: string
          description: Human-readable error message.
        debug:
          type: string
          description: Development-only debug details.
  responses:
    BadRequest:
      description: Invalid request. `message` explains what to fix.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: bad_request
            message: >-
              field "account_id" must be a string, got number; IDs are strings,
              e.g. "42"
    Unauthorized:
      description: >-
        Missing, malformed, invalid, or retired API key, or an invalid or
        expired login access token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            missingAuthorization:
              value:
                code: unauthorized
                message: Authorization header is required
            invalidAuthorizationFormat:
              value:
                code: unauthorized
                message: Authorization header must use Bearer scheme
            invalidAPIKey:
              value:
                code: unauthorized
                message: Invalid API key
            invalidAccessToken:
              value:
                code: unauthorized
                message: Invalid or expired access token
    AccountScopedForbidden:
      description: >-
        API access is not enabled for the organization, the API key cannot
        resolve to an active organization user, the login has no workspace yet,
        or the credential cannot access the requested LinkedIn account.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            accountSharedAccessRequired:
              summary: Requested account is not accessible to this credential
              value:
                code: account_shared_access_required
                message: >-
                  This account is not shared-access enabled for API or MCP. Ask
                  an admin to enable shared access before using this account
                  from this credential.
            forbidden:
              value:
                code: forbidden
                message: you don't have access to this organization
            featureUnavailable:
              value:
                code: billing_feature_not_available
                message: >-
                  Feature 'TalkToHumansAPI' is not available in your current
                  plan
            insufficientCredits:
              value:
                code: billing_insufficient_credits
                message: Insufficient credits
            apiKeyPrincipalInvalid:
              value:
                code: forbidden
                message: >-
                  This API key is no longer linked to an active organization
                  user. Ask an organization admin to regenerate it
            workspaceSetupRequired:
              value:
                code: workspace_setup_required
                message: >-
                  This TalkToHumans sign-in has no workspace yet. Open
                  https://app.talktohumans.app, sign in with the same email to
                  finish setting up TalkToHumans, then run `tth auth login`
                  again.
    RateLimited:
      description: >-
        Rate limit exceeded. Public routes allow 50 requests per 10 seconds per
        IP and endpoint.
      headers:
        Retry-After:
          description: Seconds to wait before retrying the request.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: rate_limit_exceeded
            message: Rate limit exceeded
    InternalServerError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: internal_error
            message: An internal error occurred
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Pass `Authorization: Bearer <credential>`, where the credential is
        either:

        - an API key (`sk_…`), generated by an organization admin in Settings,
        for scripts and automation;

        - an access token from `tth auth login` (the TalkToHumans CLI), which
        any member of the workspace can use.


        Both resolve to the same organization and user. A login token whose
        sign-in has no workspace yet returns `403 workspace_setup_required`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.