Docs
Get API key

Leads

Add leads to a list

POST/lists/{listId}/leads

Adds up to 1,000 people to a list, with the same body and results as adding to a campaign: leads to import by LinkedIn link, or people already saved by leadId or email. Campaigns that use the list take them on their next run.

Try itSend a real request with your API key

This changes your workspace, as the same change in the app would. Your key stays in this page and goes only to Salesteam.

Path

  • listIdstringRequired

    The list.

Headers

  • Idempotency-Keystring

    Any unique value up to 255 characters, like a UUID. The request runs once; repeats within 24 hours get the first answer, with Idempotent-Replayed: true. Up to 255 characters.

Body

  • leadsarray of objectsRequired

    Up to 1,000.

    Each item

    One of these shapes:

    Option 1

    • linkedinUrlstringRequired

      The person’s LinkedIn profile link. People are matched by it, so sending someone twice never adds them twice. Up to 1,000 characters.

    • emailstring · email or null

      Their email. It fills in an email Salesteam doesn’t have yet; a found or verified one stays. Up to 254 characters.

    • firstNamestring or null

      Up to 100 characters.

    • lastNamestring or null

      Up to 100 characters.

    • titlestring or null

      Up to 200 characters.

    • companystring or null

      Up to 200 characters.

    • locationstring or null

      Up to 200 characters.

    • industrystring or null

      Up to 100 characters.

    • headlinestring or null

      Up to 300 characters.

    • customFieldsobject or null

      Values for the workspace's custom fields, by field key or name (service_word or Service word; see GET /custom-fields). A name the workspace doesn't have yet becomes a new field: a number makes a Number field, a list a Multi-select, anything else Text. Values are checked against the field's type: a URL needs a web address, a Number a number, a Date a date (saved as YYYY-MM-DD), and a choice that isn't an option yet is added. null removes a value; an empty string or an empty list leaves it as it is. Up to 50 per lead.

    Option 2: Someone already in Salesteam, named by leadId (or id) or email alone: they join as they are, as the app’s Add to list does

    • leadIdstring or null

      Up to 180 characters.

    • idstring or null

      The same as leadId. Up to 180 characters.

    • emailstring · email or null

      Up to 254 characters.

Answer

200 OK One result per lead.

  • dataAddLeadsResultRequired
    Inside it
    • campaignobject
      Inside it
      • idstringRequired
      • namestringRequired
      • statusstringRequired

        draft: not launched. active: running. paused: stopped by the owner. completed: finished. One of draft, active, paused, completed.

    • listobject
      Inside it
      • idstringRequired

        The list's ID.

      • namestringRequired

        The list's name.

    • addedintegerRequired
    • updatedintegerRequired
    • skippedintegerRequired
    • resultsarray of LeadResultRequired
      Each item
      • indexintegerRequired

        Position of this lead in the request.

      • linkedinUrlstring or nullRequired
      • statusstringRequired

        One of added, updated, skipped.

      • leadIdstring

        The lead’s ID. A person skipped because they’re already in Salesteam (already in the campaign or list, in another campaign, replied, suppressed) has theirs too. Missing only for rows that couldn’t be read or found.

      • reasonstring

        Why it was skipped. One of duplicate_in_request, already_in_campaign, already_in_list, in_another_campaign, replied, suppressed, blacklisted, not_found, ambiguous_email, invalid_linkedin_url, invalid_lead, invalid_custom_fields, not_available.

      • messagestring

        Why it was skipped, in words.

      • enrolledboolean

        Campaign only: the person is in the campaign now.

      • notestring

        Campaign only: when the person will join, if not yet.

      • skipobject

        Campaign only: why the campaign’s skip rules leave them out for now, as its launch review shows it. They stay in its list and join once the rule lets them.

        Inside it
        • rulestringRequired

          One of do_not_contact, excluded_list, in_campaign, conversation, not_interested, contacted, inmailed, cant_inmail.

        • reasonstringRequired

          In words, like “Contacted 12 days ago”.

Errors

  • 400 Bad requestinvalid_request invalid_json duplicate_in_request
  • 401 Unauthorizedunauthorized
  • 402 Payment requiredbilling_hold
  • 404 Not foundnot_found not_in_campaign
  • 413 Too largetoo_large
  • 415 Wrong content typeunsupported_media_type
  • 422 Can’t processidempotency_key_reused
  • 429 Too many requestsrate_limited
  • 500 Server errorserver_error

Every error has the same shape. See Errors.

POST /lists/{listId}/leads
curl -X POST "https://app.salesteam.dev/api/v1/lists/LIST_ID/leads" \
  -H "Authorization: Bearer $SALESTEAM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "leads": [
    {
      "linkedinUrl": "https://www.linkedin.com/in/jamie-lee-example",
      "email": "jamie@example.co"
    }
  ]
}'
200 answer
{
  "data": {
    "campaign": {
      "id": "cmp_7Qm2xT9a",
      "name": "Founders Q4",
      "status": "draft"
    },
    "list": {
      "id": "list_7Qm2xT9a",
      "name": "Founders Q4"
    },
    "added": 1,
    "updated": 1,
    "skipped": 1,
    "results": [
      {
        "index": 1,
        "linkedinUrl": "https://www.linkedin.com/in/jamie-lee-example",
        "status": "added",
        "leadId": "lead_7Qm2xT9a",
        "reason": "duplicate_in_request",
        "message": "This campaign wasn’t found in this workspace.",
        "enrolled": true,
        "note": "note",
        "skip": {
          "rule": "do_not_contact",
          "reason": "reason"
        }
      }
    ]
  }
}