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

# Add up to 100 people

> The same as adding one person, for 1 to 100 people. Each person gets their own result, so one bad row does not fail the others. A `workflow_id` on a person wins over the top-level one.



## OpenAPI

````yaml /api/openapi.json post /intake/people/bulk
openapi: 3.1.0
info:
  title: B2B Signals API
  version: '1.0'
  description: >-
    Add people, run campaigns and read results from your own tools. Every
    request needs your API key in the `X-API-Key` header.
servers:
  - url: https://api.b2bsignals.ai/api/v1
security:
  - apiKey: []
tags:
  - name: Add people
    description: >-
      Send people in from your own tools, one at a time or up to 100 per
      request.
  - name: People
    description: >-
      Read and change the people in your workspace. In API paths and fields, a
      person is a `lead`.
  - name: Notes and tasks
    description: Notes on a person, and follow-up tasks.
  - name: Lists
    description: >-
      Named groups of people you can add to a campaign. In API paths, a list is
      a `lead-list`.
  - name: Campaigns
    description: >-
      Read, start, pause and report on campaigns. In API paths and fields, a
      campaign is a `workflow`.
  - name: Campaign people
    description: >-
      One person's place in one campaign. In API paths and fields, that is a
      `workflow-run`.
  - name: Approvals
    description: Messages waiting for a yes or no before they go out.
  - name: Inbox
    description: Read conversations and keep them organized.
  - name: Do not contact
    description: People and companies that must never be contacted.
  - name: Senders
    description: >-
      The LinkedIn accounts that send for your workspace. In API paths, a sender
      is a `connected-account`.
  - name: Webhooks
    description: Send events to your own tools.
  - name: Integrations
    description: See which outside tools are connected, and send people to them.
  - name: Reports
    description: The numbers behind Reports, and exports.
  - name: Watchlists
    description: Read the companies and people you watch.
  - name: Search
    description: Search across people, campaigns, lists and watchlists.
paths:
  /intake/people/bulk:
    post:
      tags:
        - Add people
      summary: Add up to 100 people
      description: >-
        The same as adding one person, for 1 to 100 people. Each person gets
        their own result, so one bad row does not fail the others. A
        `workflow_id` on a person wins over the top-level one.
      operationId: post_intake_people_bulk
      parameters:
        - name: test
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: '`true` checks the row and saves nothing.'
        - name: source
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
          description: >-
            `clay` marks rows sent from a Clay table. They count as tests until
            you turn Clay on. Leave it out for other tools.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkLeadIntakeRequest'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkLeadIntakeResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          description: The request did not pass validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: >-
            Too many lookups by name. Wait for the time in the `Retry-After`
            header.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: The lookup is not available right now. Try again.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    BulkLeadIntakeRequest:
      properties:
        leads:
          items:
            $ref: '#/components/schemas/LeadIntakeItem'
          type: array
          maxItems: 100
          minItems: 1
          description: 1 to 100 people. Each takes the same fields as adding one person.
        workflow_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          description: A campaign id for every person who does not name their own.
        force:
          type: boolean
          default: false
          description: Applies to everyone in the request.
        test:
          type: boolean
          default: false
          description: '`true` checks every row and saves nothing.'
      type: object
      required:
        - leads
    BulkLeadIntakeResponse:
      properties:
        results:
          items:
            $ref: '#/components/schemas/BulkLeadResult'
          type: array
        summary:
          additionalProperties:
            type: integer
          type: object
      type: object
      required:
        - results
        - summary
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
      type: object
    Error:
      type: object
      required:
        - detail
      properties:
        detail:
          description: A message, or an object with a `code` and a `message`.
          anyOf:
            - type: string
            - type: object
              properties:
                code:
                  type: string
                message:
                  type: string
    LeadIntakeItem:
      properties:
        linkedin_url:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            The person's LinkedIn profile URL. It must be a profile link, with
            `/in/`.
        name:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Full name. Needed, with a company name or domain, when there is no
            LinkedIn URL.
        title:
          anyOf:
            - type: string
            - type: 'null'
          description: Job title.
        company_name:
          anyOf:
            - type: string
            - type: 'null'
          description: Company name.
        company_domain:
          anyOf:
            - type: string
            - type: 'null'
          description: Company website domain.
        reason:
          anyOf:
            - type: string
              maxLength: 500
            - type: 'null'
          description: >-
            Why you picked this person. It shows as their reason. Up to 500
            characters.
        signal:
          anyOf:
            - type: string
              maxLength: 120
            - type: 'null'
          description: >-
            A short label for the event, such as `Website visit`. Up to 120
            characters.
        evidence_url:
          anyOf:
            - type: string
              maxLength: 1000
            - type: 'null'
          description: A link that backs up the reason. Up to 1000 characters.
        custom:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          description: Your own fields. Use them in messages as `{{custom.name}}`.
        workflow_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          description: A campaign id to start this person in.
        force:
          type: boolean
          default: false
          description: >-
            Start them even if they are active in another campaign. Do not
            contact still applies.
        test:
          type: boolean
          default: false
          description: '`true` checks the row and saves nothing.'
      type: object
    BulkLeadResult:
      properties:
        index:
          type: integer
        linkedin_url:
          anyOf:
            - type: string
            - type: 'null'
        lead_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
        action:
          anyOf:
            - type: string
            - type: 'null'
        enrolled:
          type: boolean
          default: false
        enroll_status:
          anyOf:
            - type: string
            - type: 'null'
        error:
          anyOf:
            - type: string
            - type: 'null'
        reason_code:
          anyOf:
            - type: string
            - type: 'null'
        would:
          anyOf:
            - type: string
            - type: 'null'
        do_not_contact:
          anyOf:
            - type: boolean
            - type: 'null'
        person:
          anyOf:
            - $ref: '#/components/schemas/IntakePersonOut'
            - type: 'null'
      type: object
      required:
        - index
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
        msg:
          type: string
        type:
          type: string
        input: {}
        ctx:
          type: object
      type: object
      required:
        - loc
        - msg
        - type
    IntakePersonOut:
      properties:
        name:
          anyOf:
            - type: string
            - type: 'null'
        title:
          anyOf:
            - type: string
            - type: 'null'
        company:
          anyOf:
            - type: string
            - type: 'null'
        linkedin_url:
          anyOf:
            - type: string
            - type: 'null'
        found_by:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            How we identified the person: `linkedin_url`, `lead` (already
            yours), or a lookup by name and company.
      type: object
  responses:
    Unauthorized:
      description: The key is missing or not valid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: >-
        The key cannot do this, or your plan does not include it. `detail` says
        which.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: Your workspace's API key. It starts with `b2b_sk_`.

````

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