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

# Get caller ID status

> Every business and calling number you can register, where each one stands, and the form a registration needs.

A number with `supported: true` can be registered for the business in its `locations`. When it is `false`, `reason` says why in words. `registrationState` is the state of the registration that covers it, or `null`.

Pass `locationId` to read one business. `fields` lists every detail a registration takes, with its allowed values in `options`, and `termsVersion` is the value a registration must echo.

When caller ID is switched off for your account, the answer is `{ "success": true, "enabled": false }` and nothing else.

Required API key scope: `phone_numbers:read`.



## OpenAPI

````yaml /openapi.yaml get /api/phone-trust/summary
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": "<code>", "message": "..." }` on failure. Branch on the `error`
    code; `message` is for people and its wording can change.


    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: Caller ID
    description: >-
      Register the businesses behind your calling numbers with Twilio, so
      carriers know who is calling and label the calls less often as spam. Read
      where every number stands, then register one business per call, naming the
      person who confirmed its details.
  - 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: >-
      Configure instructions, conversation style, workflows, Chat and call
      handling, then test and go live.
  - name: Voices
    description: >-
      Browse the voice catalogue and select a voice; configure speech and
      listening behavior in Agents.
paths:
  /api/phone-trust/summary:
    get:
      tags:
        - Caller ID
      summary: Get caller ID status
      description: >-
        Every business and calling number you can register, where each one
        stands, and the form a registration needs.


        A number with `supported: true` can be registered for the business in
        its `locations`. When it is `false`, `reason` says why in words.
        `registrationState` is the state of the registration that covers it, or
        `null`.


        Pass `locationId` to read one business. `fields` lists every detail a
        registration takes, with its allowed values in `options`, and
        `termsVersion` is the value a registration must echo.


        When caller ID is switched off for your account, the answer is `{
        "success": true, "enabled": false }` and nothing else.


        Required API key scope: `phone_numbers:read`.
      operationId: get-caller-id-summary
      parameters:
        - name: locationId
          in: query
          required: false
          schema:
            type: string
            minLength: 1
          description: Read only this business (sub-account).
          example: Cc6UY6Z5DiCwMgnwF0av
      responses:
        '200':
          description: Where every number stands.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallerIdSummaryResponse'
              examples:
                default:
                  value:
                    success: true
                    enabled: true
                    available: true
                    termsVersion: caller-trust-2026-10-10
                    fields:
                      - key: legalName
                        step: 1
                        max: 150
                        label: Legal business name
                    projects:
                      - locationId: Cc6UY6Z5DiCwMgnwF0av
                        name: Forge Personal Training
                    numbers:
                      - number: '+16093551813'
                        locations:
                          - Cc6UY6Z5DiCwMgnwF0av
                        projectNames:
                          - Forge Personal Training
                        inCampaign: true
                        supported: true
                        reason: null
                        registrationId: null
                        registrationState: null
                        spam:
                          status: unknown
                          checkedAt: null
                          labels: []
                    registrations: []
                    pollAfterMs: 30000
                    problem: null
        '401':
          description: No valid credential.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallerIdErrorResponse'
              examples:
                unauthorized:
                  value:
                    success: false
                    error: Unauthorized
                    message: Please sign in to continue.
        '403':
          description: The key lacks `phone_numbers:read`, or the business is not yours.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallerIdErrorResponse'
              examples:
                scope:
                  value:
                    success: false
                    error: InsufficientScope
                    message: >-
                      This access key does not allow this action. Please ask
                      your account admin to change its permissions.
                    requiredScope: phone_numbers:read
                forbidden:
                  value:
                    success: false
                    error: forbidden
                    message: >-
                      You don't have access to this business. Please ask your
                      agency if you need it.
        '429':
          description: Too many requests from this key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallerIdErrorResponse'
              examples:
                rateLimited:
                  value:
                    success: false
                    error: rate_limited
                    message: Please wait a moment before trying again.
        '503':
          description: >-
            Twilio could not be reached while reading which account holds a
            number.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallerIdErrorResponse'
              examples:
                unavailable:
                  value:
                    success: false
                    error: provider_unavailable
                    message: >-
                      The service that reviews business registrations isn't
                      answering right now. Please try again in a moment.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: bash
          label: cURL
          source: |-
            curl --request GET \
              --url https://api.teamfollowup.ai/api/phone-trust/summary \
              --header 'Authorization: Bearer YOUR_API_KEY'
components:
  schemas:
    CallerIdSummaryResponse:
      type: object
      additionalProperties: {}
      required:
        - success
        - enabled
      properties:
        success:
          type: boolean
        enabled:
          type: boolean
        available:
          type: boolean
        termsVersion:
          type: string
        fields:
          type: array
          items:
            type: object
            additionalProperties: {}
          description: >-
            Each detail a registration takes: `key`, `label`, `max`, and
            `options` where the value is a choice.
        projects:
          type: array
          items:
            type: object
            additionalProperties: {}
            properties:
              locationId:
                type: string
              name:
                type: string
        numbers:
          type: array
          items:
            type: object
            additionalProperties: {}
            properties:
              number:
                type: string
              locations:
                type: array
                items:
                  type: string
              supported:
                type: boolean
              reason:
                type:
                  - string
                  - 'null'
              registrationId:
                type:
                  - string
                  - 'null'
              registrationState:
                type:
                  - string
                  - 'null'
        registrations:
          type: array
          items:
            $ref: '#/components/schemas/CallerIdRegistration'
        pollAfterMs:
          type: integer
        problem:
          type:
            - object
            - 'null'
          additionalProperties: {}
    CallerIdErrorResponse:
      type: object
      description: >-
        The error envelope every endpoint answers with. Branch on `error`, show
        `message` to people. Some modules add fields of their own, listed on
        that module's error schema.
      required:
        - success
        - error
        - message
      properties:
        success:
          type: boolean
          example: false
        error:
          type: string
          description: >-
            A stable code for what went wrong. Branch on this: the same failure
            always answers with the same code.
          example: NotFound
        message:
          type: string
          description: >-
            One plain sentence for a person: what happened and what to do next.
            Show it, never parse it: the wording can change, and browser users
            get it in their own language. API keys and OAuth apps always get
            English.
          example: We couldn't find that. It may have been moved or deleted.
        errors:
          type: array
          description: >-
            Sent when specific fields were refused: one entry for each field to
            fix.
          items:
            type: object
            additionalProperties: false
            required:
              - field
              - code
              - message
            properties:
              field:
                type: string
                description: Where the value sits in the request, as a dotted path.
                example: name
              code:
                type: string
                description: A stable code for what is wrong with the value.
                example: FieldRequired
              message:
                type: string
                description: One plain sentence for a person.
                example: Please fill this in.
        details:
          type: object
          additionalProperties: {}
          description: >-
            Data your code may need to act on the failure, such as ids or
            limits. Never text for people.
        ref:
          type: string
          description: >-
            Sent only when the failure was on our side. Quote it to support so
            they can find the request. It matches the `x-request-id` response
            header.
          example: 3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b
        requiredScope:
          type: string
          description: The scope the key needs, on `InsufficientScope`.
        references:
          type: object
          additionalProperties: {}
          properties:
            fields:
              type: array
              items:
                type: object
                additionalProperties: {}
                properties:
                  field:
                    type: string
                  code:
                    type: string
    CallerIdRegistration:
      type: object
      additionalProperties: {}
      description: One business registration as it stands.
      properties:
        id:
          type: string
        locationId:
          type:
            - string
            - 'null'
        ownerType:
          type: string
          description: '`business` for a registration made here.'
        businessName:
          type: string
        state:
          type: string
          description: >-
            Where the registration stands: `draft`, `queued`, `under_review`,
            `complete`, `partial` or `needs_attention`.
        version:
          type: integer
        profile:
          type:
            - object
            - 'null'
          additionalProperties: {}
        products:
          type: object
          additionalProperties: {}
          description: >-
            Each Twilio product (`shakenStir`, `cnam`, `voiceIntegrity`) with
            its own `status`, `checkedAt` and `reason`.
        futureNumbersEnabled:
          type: boolean
        numbers:
          type: array
          items:
            type: string
        linkedLocations:
          type: array
          items:
            type: string
          description: >-
            Other businesses (location IDs) with the same EIN whose numbers this
            registration covers.
        clientNames:
          type: object
          additionalProperties:
            type: string
          description: >-
            In Get caller ID status: the name of each business this registration
            serves (its own and the linked ones), by location ID. A client's own
            key gets only its own name.
        submittedAt:
          type:
            - string
            - 'null'
        nextCheckAt:
          type:
            - string
            - 'null'
        problem:
          type:
            - object
            - 'null'
          additionalProperties: {}
          description: 'Why it needs attention: `code`, `message` and `fields`.'
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: 'Send your API key as `Authorization: Bearer YOUR_API_KEY`.'

````

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