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

# Add a note to a callback

> Adds a note to the callback's `timeline`, for example what your team tried. Notes are kept in order and cannot be edited or deleted. Returns the whole callback.



## OpenAPI

````yaml /voice-agents/api-reference/openapi.yaml post /campaigns/callbacks/{callbackId}/notes
openapi: 3.1.0
info:
  title: UpliftAI Voice Agents API
  version: '1.0'
  description: >-
    Build voice assistants, start conversations on the web or the phone, run
    calling campaigns, and receive outcomes by webhook. All endpoints take a
    bearer API key unless noted otherwise.
servers:
  - url: https://api.upliftai.org/v1
security:
  - apiKey: []
tags:
  - name: Assistants
  - name: Authoring an assistant
  - name: Starting a conversation
  - name: Sessions & call records
  - name: Campaigns
  - name: Campaign outcomes
  - name: Contacts
  - name: Google Sheet sources
  - name: Integrations & delivery health
paths:
  /campaigns/callbacks/{callbackId}/notes:
    post:
      tags:
        - Campaign outcomes
      summary: Add a note to a callback
      description: >-
        Adds a note to the callback's `timeline`, for example what your team
        tried. Notes are kept in order and cannot be edited or deleted. Returns
        the whole callback.
      operationId: addCallbackNote
      parameters:
        - name: callbackId
          in: path
          required: true
          description: The `callbackId` from the callbacks list or a callback webhook.
          schema:
            type: string
          example: >-
            callback_N2Q0MWM5ZTIteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4Iys5MjMwMDQ1Njc4OTAjYTEjY2I
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddCallbackNoteRequest'
            example:
              text: Statement pulled, calling after 11.
      responses:
        '200':
          description: The callback, with the note at the end of its `timeline`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Callback'
        '400':
          description: '`text` is missing, blank, or over 2,000 bytes.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message:
                  - text must not be blank
                error: Bad Request
                statusCode: 400
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: No callback with that id in the API key's project.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: >-
                  Callback not found:
                  7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923004567890#a1#cb
                error: Not Found
                statusCode: 404
        '409':
          description: The callback's `timeline` already holds 100 events.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: >-
                  Callback timeline is full:
                  7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923004567890#a1#cb
                error: Conflict
                statusCode: 409
components:
  schemas:
    AddCallbackNoteRequest:
      type: object
      properties:
        text:
          type: string
          description: >-
            The note. Not blank, at most 2,000 bytes in UTF-8 (about 1,000 Urdu
            characters).
      required:
        - text
    Callback:
      type: object
      description: One contact's request to be called again.
      properties:
        callbackId:
          type: string
          description: The callback's id.
        organizationId:
          type: string
          format: uuid
        projectId:
          type: string
          format: uuid
        assistantId:
          type: string
          format: uuid
          description: The assistant that was on the call.
        campaignId:
          type: string
          format: uuid
          description: Always the campaign in the path.
        sessionId:
          type: string
          description: >-
            The call that asked for it. Pass it to the [session
            detail](/api-reference/sessions-%26-call-records/get-a-calls-transcript-and-outcomes)
            for the transcript.
        kind:
          $ref: '#/components/schemas/CallbackKind'
        reason:
          type: string
          description: One line on why.
        requestedText:
          type: string
          description: The contact's words that asked for the callback.
        callbackAfter:
          $ref: '#/components/schemas/CallbackAfter'
        timezone:
          type: string
          description: The IANA zone `callbackAfter` was resolved in.
          example: Asia/Karachi
        status:
          $ref: '#/components/schemas/CallbackStatus'
        redial:
          $ref: '#/components/schemas/CallbackRedial'
        timeline:
          type: array
          description: >-
            What happened to the callback, oldest first. Absent on older
            callbacks, whose history was not recorded.
          items:
            $ref: '#/components/schemas/CallbackEvent'
        createdAt:
          type: string
          format: date-time
          description: When the call was analysed, not when it was placed.
        updatedAt:
          type: string
          format: date-time
          description: Last change; equal to `createdAt` until one happens.
    Error:
      type: object
      properties:
        message:
          description: >-
            One message per failed field for validation errors, a single string
            otherwise.
          oneOf:
            - type: string
            - type: array
              items:
                type: string
        error:
          type: string
        statusCode:
          type: integer
    CallbackKind:
      type: string
      enum:
        - human
        - later
      description: >-
        `human`: a person must call back. `later`: call again, and the assistant
        may do it. On a campaign, a `later` callback requeues the contact for
        `callbackAfter`. Callbacks from before kinds existed have no `kind` and
        are all for a person.
    CallbackAfter:
      type: string
      format: date-time
      description: >-
        When to call, as ISO-8601 with the offset of `timezone`, like
        `2026-10-29T15:00:00+05:00`. Both kinds get the time the contact named.
        When no time was said, a `later` callback gets two hours after the call,
        and a `human` callback has none. Absent when the time is tied to an
        event or more than 30 days away. Older callbacks can hold free text
        here.
    CallbackStatus:
      type: string
      enum:
        - open
        - scheduled
        - done
        - failed
      description: >-
        `open`: a person must act. `scheduled`: the assistant calls at
        `callbackAfter`. `done`: a redial reached the contact, or a person
        closed it. `failed`: the redial cycle ended without reaching the
        contact. You can set `open` or `done` with [`PATCH
        /campaigns/callbacks/{callbackId}`](/api-reference/campaign-outcomes/update-a-callbacks-status).
    CallbackRedial:
      type: object
      description: >-
        `later` callbacks on campaign calls only. What became of the assistant's
        redial.
      properties:
        status:
          type: string
          enum:
            - scheduled
            - disabled
            - limit_reached
            - time_unresolved
            - campaign_inactive
            - not_released
            - exhausted
            - skipped
            - campaign_closed
          description: >-
            `scheduled`: the contact is requeued for `at`. `disabled`: the
            campaign has `dialing.redialCallbacks: false`. `limit_reached`: the
            contact already had 3 dial cycles. `time_unresolved`: no time could
            be held. `campaign_inactive`: the campaign had stopped.
            `not_released`: the contact could not be requeued. `exhausted`,
            `skipped`: the redial cycle ended without reaching the contact, and
            the callback is `failed`. `campaign_closed`: the campaign closed
            before the redial, and the callback is `open` again for a person.
        at:
          type: string
          format: date-time
          description: When the redial is due. Only with `scheduled`.
    CallbackEvent:
      type: object
      description: One entry in a callback's timeline.
      properties:
        type:
          type: string
          enum:
            - created
            - redial
            - reached
            - failed
            - returned
            - status
            - note
          description: >-
            `created`: the call asked for it. `redial`: what became of the
            assistant's redial. `reached`: a redial reached the contact.
            `failed`: the redial cycle ran out. `returned`: the campaign closed
            first, so it is `open` again. `status`: someone set the status.
            `note`: someone wrote a note.
        at:
          type: string
          format: date-time
        by:
          type: string
          description: >-
            The identity that made a `status` change or `note`. Absent when the
            system did it.
        status:
          $ref: '#/components/schemas/CallbackStatus'
        redial:
          $ref: '#/components/schemas/CallbackRedial'
        text:
          type: string
          description: The note, on `note` events.
      required:
        - type
        - at
  responses:
    Unauthorized:
      description: A bearer key was sent but is not recognized.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: invalid authorization
            error: Unauthorized
            statusCode: 401
    Forbidden:
      description: No API key sent, or the key lacks permission for this resource.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            message: Forbidden resource
            error: Forbidden
            statusCode: 403
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: Project API key (`sk_api_…`).

````

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