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

# Get a contact source's metadata

> The source's metadata — sheet ref, connection, column mapping — not the sheet's contacts. Campaign launches re-read the live sheet, so an old registration still dials today's rows. To see the rows the source produces right now, preview it.



## OpenAPI

````yaml /voice-agents/api-reference/openapi.yaml get /contact-sources/{sourceId}
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:
  /contact-sources/{sourceId}:
    get:
      tags:
        - Google Sheet sources
      summary: Get a contact source's metadata
      description: >-
        The source's metadata — sheet ref, connection, column mapping — not the
        sheet's contacts. Campaign launches re-read the live sheet, so an old
        registration still dials today's rows. To see the rows the source
        produces right now, preview it.
      operationId: getContactSource
      parameters:
        - name: sourceId
          in: path
          required: true
          schema:
            type: string
            format: uuid
          example: 8420468d-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      responses:
        '200':
          description: The source's registration record.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactSource'
              example:
                sourceId: 8420468d-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                organizationId: a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                projectId: c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                name: Zameen leads (Lahore)
                kind: google_sheets
                ref: 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms!Leads
                mapping:
                  nameColumn: Full Name
                  phoneColumn: Mobile
                  attributeColumns:
                    - City
                    - Property Type
                createdAt: '2026-08-18T05:17:53.388Z'
                updatedAt: '2026-08-18T05:17:53.388Z'
                version: 1
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: >-
            No such source in the API key's project. Ids are not format-checked,
            so a malformed one lands here too.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                message: 'Contact source not found: 00000000-0000-4000-8000-000000000000'
                error: Not Found
                statusCode: 404
components:
  schemas:
    ContactSource:
      type: object
      properties:
        sourceId:
          type: string
          format: uuid
        organizationId:
          type: string
          format: uuid
        projectId:
          type: string
          format: uuid
        name:
          type: string
        kind:
          type: string
          enum:
            - google_sheets
        ref:
          type: string
        connectionId:
          type: string
          format: uuid
        mapping:
          $ref: '#/components/schemas/ContactColumnMapping'
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        version:
          type: integer
          description: Sources cannot be edited, so this stays `1`.
      required:
        - sourceId
        - organizationId
        - projectId
        - name
        - kind
        - ref
        - createdAt
        - updatedAt
        - version
    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
    ContactColumnMapping:
      type: object
      description: >-
        Column overrides. Whatever you leave out is auto-detected from the
        headers.
      properties:
        nameColumn:
          type: string
          description: >-
            Header name (case-insensitive) or A1 column letter. An explicit
            value never falls back to auto-detection — if it matches no column,
            names read as empty and the preview reports it in `mappingIssues`.
          example: Name
        phoneColumn:
          type: string
          description: Header name or A1 column letter, resolved like `nameColumn`.
          example: B
        attributeColumns:
          type: array
          items:
            type: string
          description: >-
            Columns to carry as per-contact attributes, usable as
            personalization variables. Exact header names only — no A1 letters.
            Omit to keep every column that is not the name or phone column; send
            `[]` to keep none.
          example:
            - City
            - Appointment
  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_…`).

````