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

> ## Agent Instructions
> Use the public API base URL: https://api.teamfollowup.ai/api.
> Authenticate public API requests with Authorization: Bearer YOUR_API_KEY.
> Use product-owned terms: agents, campaigns, projects (GoHighLevel sub-accounts), contacts, calls, outcomes, skills, cadences, phone numbers.
> Scope requests by locationId rather than projectName.
> Read the guide linked from each API reference group before recommending an endpoint.

# Stop calling several native contacts

> Stops the calls for up to 100 contacts at once, each one the way the single endpoint does: the switch goes on the contact and its pending Queue rows are parked, so nothing is left scheduled against a contact nobody may call.

**It only ever stops.** There is no bulk resume, and sending anything else in the body will not make one. Clearing the block asks whether the PERSON asked not to be called, which the single endpoint refuses to answer without `acknowledgeRequest`; answering it a hundred times in one request is how somebody who asked us to stop gets called again. Reopen leads one at a time.

This records the decision as OURS, never as the contact's own request, because a selection in a list is not somebody asking.

**Partial on purpose.** A contact that has since been deleted is named in `failed` and the rest still go, because "some of them failed" is not something anyone can act on. Re-marking a contact who is already stopped is not a failure.

Cookie-auth callers must send the `x-csrf-token` header.

Required API key scope: `contacts:write`.



## OpenAPI

````yaml /openapi.yaml post /api/native-contacts/bulk-do-not-call
openapi: 3.1.0
info:
  title: TFUAI Server API
  version: 1.0.0
  description: >-
    API reference for the TFUAI SaaS server.


    All published endpoints are mounted under `/api`. Responses use a standard
    envelope: `{ "success": true, ... }` on success and `{ "success": false,
    "error": "..." }` on failure.


    Product API modules are being launched module by module. This spec currently
    exposes only contracted public modules.


    Authenticate public API requests with an API key in the `Authorization`
    header: `Authorization: Bearer YOUR_API_KEY`.
servers:
  - url: https://api.teamfollowup.ai
    description: Production API origin. Public API paths are under /api.
security: []
tags:
  - name: Agents
    description: >-
      Build the conversation: identity and settings, script, lead context and
      split testing.
  - name: Analytics
    description: >-
      Understand call volume, pickup, booking and transfer metrics within the
      selected reporting scope.
  - name: Billing
    description: >-
      Balances, spend, purchases and sub-account rebilling. Reference and guides
      only; the builder chatbot has no billing playbook.
  - name: Calls
    description: >-
      Review completed calls, recordings, transcripts and campaign run history;
      distinguish observation from placing a new call.
  - name: Campaigns
    description: >-
      Configure what starts calls, who is eligible, calling windows, caller IDs,
      activation and the actions that follow each outcome.


      What runs after a call lands: for each outcome (booked, opted out, asked
      for a callback…), an ordered chain of actions — tag the contact, move a
      pipeline stage, send an SMS, book an appointment. Stored as a graph:
      `nodes` are the actions, `edges` say what follows what, and
      `dispositionEntries` maps each outcome to the node its chain starts at.


      **Pick the narrowest endpoint that does the job.**


      | To | Call | |

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

      | See what fires per outcome | `GET .../workflow?view=summary` | Reads as
      plain text, no graph walking |

      | Add steps to an outcome | `POST .../outcomes/{outcome}/nodes` | Server
      derives node ids, edge ids, handles, layout |

      | Change a message, tag or setting | `PATCH .../workflow` | Merges;
      carries no graph, so it cannot damage one |

      | Remove one step | `DELETE .../nodes/{nodeId}` | Also re-links the chain
      around it |

      | Author or replace the whole graph | `PUT .../workflow` | Replaces
      everything you send |


      `PUT` is the only one that can re-wire, position nodes, build an `if`,
      save an unconfigured draft, or copy a whole workflow — and the only one
      that can overwrite a change someone else made after you read it. Use it
      when you are genuinely authoring the graph, and send `expectedVersion`
      when you do. For everything else the narrower endpoints are both easier
      and safer.
  - name: Contacts
    description: >-
      Find contacts and their calls, manage do-not-call status and identify
      internal contacts excluded from reporting.
  - name: In-call Capabilities
    description: >-
      Configure actions and instructions the agent uses during a live call:
      booking, transfers, lookups and custom skills.
  - name: Master agent
    description: >-
      Run a shared agent and campaign across linked projects; manage
      inheritance, local bindings, synchronization and rollout readiness.
  - name: Native Calendar
    description: >-
      The diary of a sub-account with no CRM: its bookable calendars, the free
      slots they offer, and the appointments on them. Availability is computed
      per request against live bookings and is never cached, because a cached
      slot is one somebody else has already taken.
  - name: Native Contacts
    description: >-
      The people a sub-account with no CRM calls, and the fields it keeps on
      them. This is the system of record for those contacts: there is nowhere
      else they exist. A sub-account with a CRM keeps its contacts there and
      every operation here answers 400 for it.
  - name: Phone Numbers
    description: >-
      Find and manage caller IDs, assign numbers to campaigns and understand
      connected Twilio numbers.
  - name: Projects
    description: >-
      Understand project ownership, inspect configuration and validate the local
      resources used by a campaign.
  - name: TFU Live
    description: >-
      Build one TFU Live agent with its Brain, Voice and equipped actions;
      connect it through shared Campaigns.
  - name: Voices
    description: >-
      Browse the voice catalogue and select a voice; configure speech and
      listening behavior in Agents.
paths:
  /api/native-contacts/bulk-do-not-call:
    post:
      tags:
        - Native Contacts
      summary: Stop calling several native contacts
      description: >-
        Stops the calls for up to 100 contacts at once, each one the way the
        single endpoint does: the switch goes on the contact and its pending
        Queue rows are parked, so nothing is left scheduled against a contact
        nobody may call.


        **It only ever stops.** There is no bulk resume, and sending anything
        else in the body will not make one. Clearing the block asks whether the
        PERSON asked not to be called, which the single endpoint refuses to
        answer without `acknowledgeRequest`; answering it a hundred times in one
        request is how somebody who asked us to stop gets called again. Reopen
        leads one at a time.


        This records the decision as OURS, never as the contact's own request,
        because a selection in a list is not somebody asking.


        **Partial on purpose.** A contact that has since been deleted is named
        in `failed` and the rest still go, because "some of them failed" is not
        something anyone can act on. Re-marking a contact who is already stopped
        is not a failure.


        Cookie-auth callers must send the `x-csrf-token` header.


        Required API key scope: `contacts:write`.
      operationId: bulk-set-native-contacts-do-not-call
      parameters:
        - name: locationId
          in: query
          required: true
          schema:
            type: string
          description: >-
            The sub-account. It is the only thing that identifies the tenant on
            these routes, and it is re-checked against your access on every
            call. A sub-account that keeps its contacts in a CRM answers 400.
          example: nat_fd9e2a8dd4be4396b604
      requestBody:
        required: true
        description: The contacts to stop calling, and why.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NativeContactsBulkDoNotCallRequest'
            examples:
              default:
                value:
                  contactIds:
                    - nct_0123456789abcdef0123
                    - nct_9f1c77b3a0de4412bb70
                  reason: Wrong list.
      responses:
        '200':
          description: How many stopped, and which ones could not.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NativeContactsBulkDoNotCallResponse'
              examples:
                default:
                  value:
                    success: true
                    data:
                      stopped: 1
                      failed:
                        - contactId: nct_9f1c77b3a0de4412bb70
                          error: Contact not found.
        '400':
          description: >-
            The request is malformed, or this sub-account keeps its contacts in
            a CRM.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NativeContactsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: A phone number is required.
        '401':
          description: Missing or invalid authentication.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NativeContactsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: Unauthorized
        '403':
          description: Authenticated, but without access to this sub-account.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NativeContactsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: You do not have access to this sub-account.
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NativeContactsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: TooManyRequests
        '500':
          description: Unexpected server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NativeContactsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: Contacts request failed.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: bash
          label: cURL
          source: |-
            curl --request POST \
              --url https://api.teamfollowup.ai/api/native-contacts/bulk-do-not-call \
              --header 'Authorization: Bearer YOUR_API_KEY' \
              --header 'Content-Type: application/json' \
              --data '{
              "contactIds": [
                "nct_0123456789abcdef0123",
                "nct_9f1c77b3a0de4412bb70"
              ],
              "reason": "Wrong list."
            }'
components:
  schemas:
    NativeContactsBulkDoNotCallRequest:
      type: object
      additionalProperties: {}
      required:
        - contactIds
      properties:
        contactIds:
          type: array
          items:
            type: string
          minItems: 1
          maxItems: 100
          description: The contacts to stop calling. Up to 100 per request.
        reason:
          type: string
          maxLength: 500
          description: >-
            Kept with the decision on every contact named. Worth sending: it is
            what tells the next person why.
    NativeContactsBulkDoNotCallResponse:
      type: object
      additionalProperties: {}
      required:
        - success
        - data
      properties:
        success:
          type: boolean
        data:
          type: object
          additionalProperties: {}
          properties:
            stopped:
              type: integer
              description: How many contacts are now on do-not-call.
            failed:
              type: array
              description: >-
                Named, not counted, so you know which contacts are still being
                called.
              items:
                type: object
                additionalProperties: {}
    NativeContactsErrorResponse:
      type: object
      additionalProperties: {}
      required:
        - success
        - error
      properties:
        success:
          type: boolean
        error:
          type: string
          example: A phone number is required.
        errors:
          type: array
          description: Every reason the write was refused, when there is more than one.
          items:
            type: string
        failed:
          type: array
          description: >-
            On a refused delete: the bookings that would not cancel, which is
            why the contact is still here.
          items:
            type: object
            additionalProperties: {}
        cancelled:
          type: array
          description: >-
            On a refused delete: the bookings that HAD already been cancelled
            before it stopped. They do not come back.
          items:
            type: object
            additionalProperties: {}
        contactKept:
          type: boolean
          description: True when the contact is still here, whatever else failed.
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: 'Send your API key as `Authorization: Bearer YOUR_API_KEY`.'

````