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

> Returns the sender pool of a campaign, as the campaign editor shows it.

# Get Campaign Senders

<Note>
  The sender pool requires at least the **Email Pro** plan.
</Note>

<Tip>
  To pin the sender of one step, outside the pool, see
  [Set Step Sender](/api-reference/endpoints/sequences/set-step-sender) in the
  Sequences group.
</Tip>

The sender pool is the list of senders and channels that a campaign enables.
The campaign gives each lead one sender of the pool.

* `readOnly: true` means that the campaign uses a dynamic sender strategy
  (`contactOwner`, `leadImporter` or `customField:<field>`): the leads
  select the senders, and the write endpoints answer `409`.
* A sender forced on a step shows in the pool with its forced channel, even
  when the sender is not in the pool.
* `senders[].channels[]` without `label`, `esp` and `diagnostics` is a
  valid `channels` list for the write endpoints.

## Diagnostics

Each sender, each channel and the pool carry `diagnostics`. An `error` blocks
the sending. A `warning` or an `info` does not.

| `code` | `scope` | `type` | Meaning |
| - | - | - | - |
| `channel_missing` | channel | error | A step needs a channel type that the sender does not have. |
| `channel_disconnected` | channel | error | The account is disconnected. |
| `channel_linked_elsewhere` | channel | error | The LinkedIn profile is active on another lemlist account. |
| `channel_issue` | channel | error | The mailbox has an error. `message` gives the error. |
| `channel_not_required` | channel | info | No step uses this channel type. The channel sends nothing. |
| `no_required_channel_active` | user | error | The sender has no enabled channel of a channel type that a step uses. |
| `license_missing` | user | warning | The user has no active seat. |
| `sender_paused` | user | info | The user paused their sending for a date range. The sending starts again after. |
| `no_account_connected` | global | info | Nobody in the team has an account of a channel type that a step uses. |
| `no_sender_enabled` | global | error | The pool is empty, and a step needs a sender. |


## OpenAPI

````yaml get /campaigns/{campaignId}/senders
openapi: 3.0.0
info:
  title: lemlist API
  version: 1.0.0
  description: >-
    Welcome to the lemlist Developer Documentation.


    lemlist is very customizable and open. You'll find on this page all the API
    and integration you can do with lemlist.


    # Rate Limit


    lemlist's API rate limits requests in order to prevent abuse and overload of
    our services.  

    Rate limits are applied on all routes and per API key performing the
    request.  

    The rate limits are **20** requests per **2** seconds.  

    The response provides any information you may need about it:


    | Header | Description |

    | --- | --- |

    | Retry-After | The number of seconds in which you can retry |

    | X-RateLimit-Limit | The maximum requests in that time |

    | X-RateLimit-Remaining | The number of remaining requests you can make |

    | X-RateLimit-Reset | The date when the rate limit will reset |


    _Example of values for the rate limit headers_


    ``` json

    {
        "Retry-After": 2,
        "X-RateLimit-Limit": 20,
        "X-RateLimit-Remaining": 7,
        "X-RateLimit-Reset" : "Tue Feb 16 2021 09:02:42 GMT+0100 (Central European Standard Time)"
    }

     ```

    # Definitions


    ## Team


    A team is the entity of lemlist that can handle users and billing.


    ## Credits


    Credits are the coins a team uses to enrich emails, LinkedIn URLs, etc. via
    the enrich route. Each enrichment feature needs a certain amount of credits
    to run.


    ## User


    You use a user account to connect to lemlist and send messages via the
    connected emails or LinkedIn account.


    ## Campaign


    A campaign is the entity to automate outreach. A campaign has multiple
    sequences composed of steps.


    ## Lead


    A lead is a person that you try to contact via a campaign.


    ## Activity


    An activity is the history of all the steps.


    ## Unsubscribe


    An unsubscribe occurs when a person decides they don't want to receive
    emails from you anymore.


    # Authentication


    All API routes use the dedicated subdomain `api.lemlist.com`.


    lemlist uses API keys to allow access to the API. You can get your lemlist
    API key at our [integration
    page](https://app.lemlist.com/settings/integrations).


    You need to add the `Authorization` header using the `Basic` authentication
    type. `login:password` **where the login is always empty and the password is
    the API key**.


    ⚠️ **Don't forget to add the semicolon (**`:`**) before your API key in curl
    command.**


    > To authorize, use this code: 
      

    ``` shell

    curl https://api.lemlist.com/api/team \
      --user ":YourApiKey"

     ```

    **Make sure to replace** **`YourApiKey`** **with your API key.**


    # Give feedback


    If you want to report a bug, ask for data, or share with us a use case,
    please fill this [form](https://lemlist.typeform.com/to/mfVlkyGf). It will
    help us centralize your needs!
servers:
  - url: https://api.lemlist.com/api
security:
  - basicAuth: []
tags:
  - name: Enrichment Providers
    description: >-
      The data providers lemlist can call to find an email or a phone.


      Internal providers are paid with lemlist credits and always available.
      External providers run on your own account: connect one by saving its API
      key, and it becomes available to your waterfalls. `GET
      /enrichments/providers` is the catalog of provider ids accepted by the
      waterfall endpoints.
  - name: Enrichment Waterfalls
    description: >-
      Control which data providers lemlist calls when enriching a contact, and
      in which order.


      A waterfall is an ordered list of providers for one enrichment `type`
      (`email` or `phone`). Providers are tried one after the other until one
      returns a result.


      Every team has exactly one default waterfall per type (`isDefault: true`).
      While its `editor` is `lemlist` it follows the lemlist behaviour:
      providers you connected with your own API key are tried first, then
      internal providers in a random order. Once a team member edits its
      provider list, `editor` becomes that user's id and the list is followed as
      is; resetting it hands it back to `lemlist`.


      Custom waterfalls (`isDefault: false`) carry `conditions` on the contact
      being enriched, keyed by contact property; every key present must match.
      When a contact is enriched, lemlist runs a single waterfall: the custom
      waterfall of the requested type whose conditions match the contact, or the
      default waterfall when none does. If several match, the one with the most
      condition keys wins, then the most recently updated. Only that waterfall
      runs; when it finds nothing, the enrichment ends without falling back to
      another one.
paths:
  /campaigns/{campaignId}/senders:
    parameters:
      - name: campaignId
        in: path
        required: true
        description: The unique identifier of the campaign
        example: cam_A1b2C3d4E5f6G7h8M
        schema:
          type: string
    get:
      tags:
        - Senders
      summary: Get Campaign Senders
      description: >-
        Returns the sender pool of a campaign, as the campaign editor shows it:
        each sender with its enabled channels and their diagnostics. Requires
        the Email Pro plan.
      parameters: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/SenderPool'
              example:
                data:
                  campaignId: cam_A1b2C3d4E5f6G7h8M
                  senderStrategy: random
                  espMatching: false
                  readOnly: false
                  senders:
                    - userId: usr_A1b2C3d4E5f6G7h8K
                      name: John Doe
                      email: john@example.com
                      channels:
                        - type: email
                          id: usm_A1b2C3d4E5f6G7h8L
                          label: john@example.com
                          alias: john@example.com
                          esp: google
                          diagnostics: []
                      diagnostics:
                        - scope: user
                          type: warning
                          code: license_missing
                  diagnostics: []
        '400':
          description: Malformed campaign id
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: Human-readable error message
                  code:
                    type: string
                    description: Machine-readable error code
              example:
                error: Wrong param campaign id
                code: WRONG_PARAM_CAMPAIGN_ID
        '401':
          description: The authentication you supplied is incorrect
          content:
            text/plain:
              example: The authentication you supplied is incorrect
        '402':
          description: The sender pool requires at least the Email Pro plan
          content:
            text/plain:
              example: route is available starting emailPro plan
        '404':
          description: Campaign not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: Human-readable error message
                  code:
                    type: string
                    description: Machine-readable error code
              example:
                error: Campaign not found
                code: SENDER_CAMPAIGN_NOT_FOUND
        '405':
          description: Method not allowed
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: Human-readable error message
                  code:
                    type: string
                    description: Machine-readable error code
              example:
                error: Route bad method
                code: ROUTE_BAD_METHOD
components:
  schemas:
    SenderPool:
      type: object
      description: The sender pool of a campaign, as the campaign editor shows it.
      properties:
        campaignId:
          type: string
        senderStrategy:
          type: string
          description: >-
            `random`, or a dynamic strategy: `contactOwner`, `leadImporter` or
            `customField:<field>`.
        espMatching:
          type: boolean
          description: >-
            `true` when a lead gets a mailbox of the same provider as its
            address, when the pool has one.
        readOnly:
          type: boolean
          description: '`true` for a dynamic sender strategy: the leads select the senders.'
        senders:
          type: array
          items:
            type: object
            properties:
              userId:
                type: string
              name:
                type: string
              email:
                type: string
              channels:
                type: array
                description: >-
                  The enabled channels. Remove `label`, `esp` and `diagnostics`
                  to get a valid `channels` entry of the request bodies.
                items:
                  type: object
                  properties:
                    type:
                      type: string
                      enum:
                        - email
                        - linkedin
                        - whatsapp
                        - phone
                    id:
                      type: string
                      description: >-
                        The mailbox id, the WhatsApp account id, the phone
                        number, or the user id for LinkedIn.
                    label:
                      type: string
                    alias:
                      type: string
                      description: 'Email only: the address the mailbox sends as.'
                    esp:
                      type: string
                      enum:
                        - google
                        - microsoft
                        - smtp
                      description: 'Email only: the provider of the mailbox.'
                    diagnostics:
                      type: array
                      description: >-
                        The problems that block or limit the sending. See [Get
                        Campaign
                        Senders](/api-reference/endpoints/senders/get-campaign-senders#diagnostics).
                      items:
                        $ref: '#/components/schemas/SenderDiagnostic'
              diagnostics:
                type: array
                description: >-
                  The problems that block or limit the sending. See [Get
                  Campaign
                  Senders](/api-reference/endpoints/senders/get-campaign-senders#diagnostics).
                items:
                  $ref: '#/components/schemas/SenderDiagnostic'
        diagnostics:
          type: array
          description: >-
            The problems of the whole pool, for example no account of a required
            channel type in the team.
          items:
            $ref: '#/components/schemas/SenderDiagnostic'
    SenderDiagnostic:
      type: object
      description: One health problem of a sender, a channel or the whole pool.
      properties:
        scope:
          type: string
          enum:
            - channel
            - user
            - step
            - global
          description: >-
            What the problem is about: one channel, one sender, one step or the
            whole pool.
        type:
          type: string
          enum:
            - error
            - warning
            - info
          description: '`error` blocks the sending. `warning` and `info` do not.'
        code:
          type: string
          enum:
            - channel_missing
            - channel_disconnected
            - channel_linked_elsewhere
            - channel_issue
            - channel_not_required
            - license_missing
            - no_required_channel_active
            - no_account_connected
            - no_sender_enabled
            - sender_paused
        message:
          type: string
          description: More details, for example the error of a mailbox.
        channelType:
          type: string
          enum:
            - email
            - linkedin
            - whatsapp
            - phone
          description: >-
            The channel type of the problem. Absent when the problem is not
            about one channel type.
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic

````

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