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

# Add leads

> Adds one lead (body = a single lead object; `data` in the response is the created lead) or many (body = an array of lead objects, max 1000; `data` is the array of created leads and `meta` reports `created`, `dnc_flagged` and `invalid` rows). Phone numbers are normalized to E.164. Numbers on your Do-Not-Call list are created with status `do_not_call` — the dialer never calls them. **Required scope:** `leads:write` (keys without scope restrictions have full access).



## OpenAPI

````yaml /api-reference/openapi.json post /campaigns/{id}/leads
openapi: 3.1.0
info:
  title: OurAiCalling API
  version: 1.0.0
  description: >-
    REST API for OurAiCalling. Authenticate with an API key (`fam_...`, created
    under **Settings → API Keys**) or an OAuth 2.0 access token (`fam_at_...`)
    as a Bearer token.


    Every response uses a consistent envelope: `{ "data": ... , "meta": { ... }
    }` on success and `{ "error": { "code", "message" } }` on failure. List
    endpoints paginate with `?limit=` (default 50, max 200) and `?offset=`;
    `meta.pagination.total` carries the total match count.


    Everything documented here is also exposed as MCP tools at
    `https://app.famulor.io/mcp` (Model Context Protocol, streamable HTTP) using
    the same credentials and permission model.
servers:
  - url: https://app.famulor.io/api/v1
    description: Hosted platform.
  - url: https://{domain}/api/v1
    description: White-label tenant domain — same paths, tenant branding.
    variables:
      domain:
        default: app.famulor.io
        description: Your white-label tenant domain.
security:
  - bearerAuth: []
tags:
  - name: Account
    description: Self-inspection of the calling credential.
  - name: Migrations
    description: Preview and import data from supported legacy platforms.
  - name: Assistants
    description: Create and manage voice assistants.
  - name: Tools
    description: >-
      Reusable tools (HTTP APIs and external MCP servers) assistants can call
      mid-conversation.
  - name: Voices
    description: Browse the text-to-speech voice library.
  - name: Calls
    description: Start outbound calls and read call history, transcripts and recordings.
  - name: History
    description: Unified conversation history across calls, messaging and assistant emails.
  - name: Campaigns
    description: Outbound calling campaigns with a compliant power dialer.
  - name: Leads
    description: Manage Audience contacts across campaigns, channels and Call QA metrics.
  - name: Segments
    description: >-
      Saved, dynamic lead filters — reusable audience definitions used for
      Audience search and campaign lead assignment.
  - name: Suppression
    description: Cross-channel marketing opt-outs and active workspace suppression records.
  - name: Callbacks
    description: >-
      Scheduled callbacks booked by the Schedule callback tool across voice,
      chat, and email.
  - name: Phone Numbers
    description: Marketplace numbers and customer-provided numbers.
  - name: SIP Trunks
    description: Bring your own SIP provider and numbers.
  - name: Carrier Connections
    description: Connect a supported carrier account and import its existing phone numbers.
  - name: Knowledge Bases
    description: RAG knowledge bases and documents for assistants.
  - name: Settings
    description: Workspace-level settings such as caller-memory defaults.
  - name: Billing
    description: Balance and minutes ledger of the key owner.
  - name: Automations
    description: >-
      Native workspace automations — list, create, update, trigger. Plan gate:
      automation_platform.
  - name: Integrations
    description: >-
      Calendar integrations (Cal.com, Calendly, Acuity Scheduling, Google
      Calendar, Outlook, native booking engine). Assign them to assistants to
      provide availability and booking tools, plus provider-supported
      appointment lookup, cancellation, and rescheduling.
  - name: Bookings
    description: >-
      Native booking engine — event types with weekly availability, public
      booking pages at /book/{workspace}/{slug}, and the bookings they produce.
  - name: Dashboards
    description: >-
      Custom analytics dashboards, reusable widgets, and tenant-scoped
      performance analytics. Requires the custom_dashboards plan feature.
  - name: Catalog
    description: >-
      Read-only platform catalogs — available models, supported assistant
      languages, and prompt templates.
  - name: Simulations
    description: Assistant simulation tests (plan-gated).
  - name: Versions
    description: Assistant configuration version history.
  - name: Caller IDs
    description: Outbound caller ID verification.
  - name: Widgets
    description: Web widget connectors.
  - name: Messaging
    description: >-
      Telegram, Slack, and Messenger text bots linked to assistants (Chat SDK).
      Includes conversation delay, inactivity end, and conversation-ended
      webhooks.
  - name: QA
    description: Cohort AI Quality Assurance runs over call transcripts.
  - name: White Label
    description: >-
      Manage the customers of your white-label workspace on their behalf — list,
      register, mint access tokens, log in, log out, and transfer credits.
      Available to reseller workspaces with white-label access, and to platform
      admins (scoped to direct platform customers). Requires `platform:read` /
      `platform:write`.
  - name: API Keys
    description: >-
      Self-service API keys for the calling workspace. A key can only mint
      further keys with a scope subset of its own.
  - name: SMS
    description: Outbound SMS from workspace phone numbers.
paths:
  /campaigns/{id}/leads:
    parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Campaign ID.
    post:
      tags:
        - Leads
      summary: Add leads
      description: >-
        Adds one lead (body = a single lead object; `data` in the response is
        the created lead) or many (body = an array of lead objects, max 1000;
        `data` is the array of created leads and `meta` reports `created`,
        `dnc_flagged` and `invalid` rows). Phone numbers are normalized to
        E.164. Numbers on your Do-Not-Call list are created with status
        `do_not_call` — the dialer never calls them. **Required scope:**
        `leads:write` (keys without scope restrictions have full access).
      operationId: addLeads
      requestBody:
        required: true
        content:
          application/json:
            schema:
              oneOf:
                - $ref: '#/components/schemas/LeadInput'
                - type: array
                  items:
                    $ref: '#/components/schemas/LeadInput'
                  maxItems: 1000
            examples:
              single:
                summary: Single lead
                value:
                  phone: '+4915123456789'
                  name: Jane Doe
                  custom_fields:
                    company: Acme Corp
              bulk:
                summary: Bulk import
                value:
                  - phone: '+4915123456789'
                    name: Jane Doe
                  - phone: '+14155551234'
                    name: John Smith
                    custom_fields:
                      plan: pro
      responses:
        '201':
          description: >-
            Created lead(s). Single body → `data` is the lead object; array body
            → `data` is an array plus `meta.created` / `meta.dnc_flagged` /
            `meta.invalid`.
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    required:
                      - data
                    properties:
                      data:
                        $ref: '#/components/schemas/Lead'
                  - type: object
                    required:
                      - data
                    properties:
                      data:
                        type: array
                        items:
                          $ref: '#/components/schemas/Lead'
                      meta:
                        type: object
                        properties:
                          created:
                            type: integer
                          dnc_flagged:
                            type: integer
                            description: >-
                              Created leads whose number is on the DNC list
                              (status `do_not_call`).
                          invalid:
                            type: array
                            description: Rejected input rows (invalid number/structure).
                            items:
                              type: object
                              properties:
                                index:
                                  type: integer
                                phone:
                                  type:
                                    - string
                                    - 'null'
                                error:
                                  type: string
              examples:
                single:
                  summary: Single lead
                  value:
                    data:
                      id: le1b2c3d-0000-4000-8000-000000000040
                      campaign_id: ca1b2c3d-0000-4000-8000-000000000030
                      phone: '+4915123456789'
                      name: Jane Doe
                      custom_fields:
                        company: Acme Corp
                      status: pending
                      attempts: 0
                      next_attempt_at: null
                      last_amd_result: null
                      last_call_id: null
                      created_at: '2026-07-01T08:05:00Z'
                      updated_at: '2026-07-01T08:05:00Z'
                bulk:
                  summary: Bulk import
                  value:
                    data:
                      - id: le1b2c3d-0000-4000-8000-000000000040
                        campaign_id: ca1b2c3d-0000-4000-8000-000000000030
                        phone: '+4915123456789'
                        name: Jane Doe
                        custom_fields:
                          company: Acme Corp
                        status: pending
                        attempts: 0
                        next_attempt_at: null
                        last_amd_result: null
                        last_call_id: null
                        created_at: '2026-07-01T08:05:00Z'
                        updated_at: '2026-07-01T08:05:00Z'
                    meta:
                      created: 1
                      dnc_flagged: 0
                      invalid:
                        - index: 1
                          phone: '12345'
                          error: >-
                            phone must be a valid E.164 number (e.g.
                            +4915123456789).
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    LeadInput:
      type: object
      required:
        - phone
      properties:
        phone:
          type: string
          description: Phone number; normalized to E.164 (e.g. `+4915123456789`).
        name:
          type:
            - string
            - 'null'
        custom_fields:
          type: object
          additionalProperties: true
          description: Arbitrary key/value data available to the assistant during the call.
    Lead:
      type: object
      properties:
        id:
          type: string
          format: uuid
        campaign_id:
          type:
            - string
            - 'null'
          format: uuid
        phone:
          type:
            - string
            - 'null'
          description: E.164 normalized.
        name:
          type:
            - string
            - 'null'
        email:
          type:
            - string
            - 'null'
          format: email
        tags:
          type: array
          items:
            type: string
            maxLength: 40
          maxItems: 32
        source:
          type:
            - string
            - 'null'
        sources:
          type: array
          items:
            type: string
        custom_fields:
          type: object
          additionalProperties: true
        status:
          type: string
          enum:
            - pending
            - queued
            - calling
            - completed
            - failed
            - no_answer
            - busy
            - do_not_call
        attempts:
          type: integer
        next_attempt_at:
          type:
            - string
            - 'null'
          format: date-time
        last_amd_result:
          type:
            - string
            - 'null'
          description: >-
            Last answering-machine-detection result: `human`, `machine-ivr`,
            `machine-vm`, `machine-unavailable`, `uncertain`.
        last_call_id:
          type:
            - string
            - 'null'
          format: uuid
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        display_status:
          type: string
          enum:
            - created
            - processing
            - rescheduled
            - max_retries
            - completed
            - dnc
          description: Derived display status (grouped from `status` + `next_attempt_at`).
        call_qa:
          oneOf:
            - $ref: '#/components/schemas/AudienceCallQaMetrics'
            - type: 'null'
          description: >-
            Per-contact metrics for the requested QA window. Null means no
            scored calls or the feature is unavailable.
      required:
        - id
        - status
        - created_at
        - updated_at
    AudienceCallQaMetrics:
      type: object
      required:
        - lead_id
        - average_score
        - scored_calls
        - passed_calls
        - pass_rate
        - latest_score
        - latest_scored_at
      properties:
        lead_id:
          type: string
          format: uuid
        average_score:
          type: number
        scored_calls:
          type: integer
        passed_calls:
          type: integer
        pass_rate:
          type: number
          description: Percentage from 0 to 100.
        latest_score:
          type: number
        latest_scored_at:
          type: string
          format: date-time
    ErrorEnvelope:
      type: object
      description: Error envelope returned by every /api/v1 endpoint on failure.
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              enum:
                - unauthorized
                - forbidden
                - not_found
                - invalid_request
                - rate_limited
                - conflict
                - telephony_configuration_error
                - telephony_unavailable
                - internal_error
              description: Stable, machine-readable error code.
            message:
              type: string
              description: Human-readable description of the error.
  responses:
    BadRequest:
      description: Invalid request body or parameters.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: invalid_request
              message: '"to_number" is required (E.164 format, e.g. +4930123456).'
    Unauthorized:
      description: Missing, invalid, expired or revoked API key / access token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: unauthorized
              message: Invalid API key.
    Forbidden:
      description: >-
        The API key lacks the required scope, or the plan does not allow this
        action.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: forbidden
              message: This API key is missing the required scope "assistants:write".
    NotFound:
      description: Resource not found (or it belongs to another workspace).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: not_found
              message: Assistant not found
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: >-
        API key (`fam_...`, created under **Settings → API Keys**) or an OAuth
        2.0 access token (`fam_at_...`). Keys can be restricted to scopes such
        as `assistants:read`, `calls:write`, `campaigns:write`,
        `automations:read`, `dashboards:read`, `dashboards:write`,
        `leads:write`, `segments:write`, `phone_numbers:write`,
        `sip_trunks:write`, `knowledge:write`, `voices:read`, `billing:read`,
        `settings:write`, `platform:read`, `platform:write`; a `*:write` scope
        implies the matching `*:read`. Automation and dashboard endpoints also
        accept the legacy `calls:*` scope. Keys without scope restrictions have
        full access.

````