curl --request POST \
--url https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"user_id": "507f1f77bcf86cd799439011",
"prospects": [
{
"contact": "<string>",
"email": "<string>",
"linkedin_username": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"account": "<string>",
"title": "<string>",
"timezone": "<string>",
"phone_number": "<string>",
"phone_type": "mobile",
"custom_fields": [
{
"label": "<string>",
"value": {}
}
]
}
],
"owner_id": "<string>"
}
'import requests
url = "https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts"
payload = {
"user_id": "507f1f77bcf86cd799439011",
"prospects": [
{
"contact": "<string>",
"email": "<string>",
"linkedin_username": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"account": "<string>",
"title": "<string>",
"timezone": "<string>",
"phone_number": "<string>",
"phone_type": "mobile",
"custom_fields": [
{
"label": "<string>",
"value": {}
}
]
}
],
"owner_id": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
user_id: '507f1f77bcf86cd799439011',
prospects: [
{
contact: '<string>',
email: '<string>',
linkedin_username: '<string>',
first_name: '<string>',
last_name: '<string>',
account: '<string>',
title: '<string>',
timezone: '<string>',
phone_number: '<string>',
phone_type: 'mobile',
custom_fields: [{label: '<string>', value: {}}]
}
],
owner_id: '<string>'
})
};
fetch('https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'user_id' => '507f1f77bcf86cd799439011',
'prospects' => [
[
'contact' => '<string>',
'email' => '<string>',
'linkedin_username' => '<string>',
'first_name' => '<string>',
'last_name' => '<string>',
'account' => '<string>',
'title' => '<string>',
'timezone' => '<string>',
'phone_number' => '<string>',
'phone_type' => 'mobile',
'custom_fields' => [
[
'label' => '<string>',
'value' => [
]
]
]
]
],
'owner_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts"
payload := strings.NewReader("{\n \"user_id\": \"507f1f77bcf86cd799439011\",\n \"prospects\": [\n {\n \"contact\": \"<string>\",\n \"email\": \"<string>\",\n \"linkedin_username\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account\": \"<string>\",\n \"title\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"phone_type\": \"mobile\",\n \"custom_fields\": [\n {\n \"label\": \"<string>\",\n \"value\": {}\n }\n ]\n }\n ],\n \"owner_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"user_id\": \"507f1f77bcf86cd799439011\",\n \"prospects\": [\n {\n \"contact\": \"<string>\",\n \"email\": \"<string>\",\n \"linkedin_username\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account\": \"<string>\",\n \"title\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"phone_type\": \"mobile\",\n \"custom_fields\": [\n {\n \"label\": \"<string>\",\n \"value\": {}\n }\n ]\n }\n ],\n \"owner_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"user_id\": \"507f1f77bcf86cd799439011\",\n \"prospects\": [\n {\n \"contact\": \"<string>\",\n \"email\": \"<string>\",\n \"linkedin_username\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account\": \"<string>\",\n \"title\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"phone_type\": \"mobile\",\n \"custom_fields\": [\n {\n \"label\": \"<string>\",\n \"value\": {}\n }\n ]\n }\n ],\n \"owner_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"enrolled": 123,
"skipped": [
{
"prospect": "<string>",
"reason": "policy",
"rule": "<string>"
}
],
"held": [
{}
],
"warnings": [
{}
]
}{
"message": [
"limit must not be greater than 100"
],
"error": "Bad Request",
"statusCode": 400
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403
}{
"message": "Not found",
"error": "Not Found",
"statusCode": 404
}{
"message": "Too many requests",
"error": "Too Many Requests",
"statusCode": 429
}{
"message": "Internal server error",
"error": "Internal Server Error",
"statusCode": 500
}Add contacts to a sequence
Enrols up to 500 prospects synchronously. Identify each by an existing contact id, or by email or linkedin_username — an unknown person is created as a contact on the way in.
Partial-tolerant, and it always reports the whole outcome rather than a bare success: enrolled is a count, skipped lists everyone refused and why, held lists anyone a rule is holding for approval, and warnings lists rules that fired without blocking. A 200 does not mean everyone went in — read skipped.
A contact can hold only one live enrollment per sequence, so re-sending the same person is reported as already_enrolled rather than creating a duplicate. For more than 500, start an enrolment run instead.
curl --request POST \
--url https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"user_id": "507f1f77bcf86cd799439011",
"prospects": [
{
"contact": "<string>",
"email": "<string>",
"linkedin_username": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"account": "<string>",
"title": "<string>",
"timezone": "<string>",
"phone_number": "<string>",
"phone_type": "mobile",
"custom_fields": [
{
"label": "<string>",
"value": {}
}
]
}
],
"owner_id": "<string>"
}
'import requests
url = "https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts"
payload = {
"user_id": "507f1f77bcf86cd799439011",
"prospects": [
{
"contact": "<string>",
"email": "<string>",
"linkedin_username": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"account": "<string>",
"title": "<string>",
"timezone": "<string>",
"phone_number": "<string>",
"phone_type": "mobile",
"custom_fields": [
{
"label": "<string>",
"value": {}
}
]
}
],
"owner_id": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
user_id: '507f1f77bcf86cd799439011',
prospects: [
{
contact: '<string>',
email: '<string>',
linkedin_username: '<string>',
first_name: '<string>',
last_name: '<string>',
account: '<string>',
title: '<string>',
timezone: '<string>',
phone_number: '<string>',
phone_type: 'mobile',
custom_fields: [{label: '<string>', value: {}}]
}
],
owner_id: '<string>'
})
};
fetch('https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'user_id' => '507f1f77bcf86cd799439011',
'prospects' => [
[
'contact' => '<string>',
'email' => '<string>',
'linkedin_username' => '<string>',
'first_name' => '<string>',
'last_name' => '<string>',
'account' => '<string>',
'title' => '<string>',
'timezone' => '<string>',
'phone_number' => '<string>',
'phone_type' => 'mobile',
'custom_fields' => [
[
'label' => '<string>',
'value' => [
]
]
]
]
],
'owner_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts"
payload := strings.NewReader("{\n \"user_id\": \"507f1f77bcf86cd799439011\",\n \"prospects\": [\n {\n \"contact\": \"<string>\",\n \"email\": \"<string>\",\n \"linkedin_username\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account\": \"<string>\",\n \"title\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"phone_type\": \"mobile\",\n \"custom_fields\": [\n {\n \"label\": \"<string>\",\n \"value\": {}\n }\n ]\n }\n ],\n \"owner_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"user_id\": \"507f1f77bcf86cd799439011\",\n \"prospects\": [\n {\n \"contact\": \"<string>\",\n \"email\": \"<string>\",\n \"linkedin_username\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account\": \"<string>\",\n \"title\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"phone_type\": \"mobile\",\n \"custom_fields\": [\n {\n \"label\": \"<string>\",\n \"value\": {}\n }\n ]\n }\n ],\n \"owner_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://client-api.salesfinity.co/v2/sequencer/sequences/{id}/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"user_id\": \"507f1f77bcf86cd799439011\",\n \"prospects\": [\n {\n \"contact\": \"<string>\",\n \"email\": \"<string>\",\n \"linkedin_username\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account\": \"<string>\",\n \"title\": \"<string>\",\n \"timezone\": \"<string>\",\n \"phone_number\": \"<string>\",\n \"phone_type\": \"mobile\",\n \"custom_fields\": [\n {\n \"label\": \"<string>\",\n \"value\": {}\n }\n ]\n }\n ],\n \"owner_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"enrolled": 123,
"skipped": [
{
"prospect": "<string>",
"reason": "policy",
"rule": "<string>"
}
],
"held": [
{}
],
"warnings": [
{}
]
}{
"message": [
"limit must not be greater than 100"
],
"error": "Bad Request",
"statusCode": 400
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403
}{
"message": "Not found",
"error": "Not Found",
"statusCode": 404
}{
"message": "Too many requests",
"error": "Too Many Requests",
"statusCode": 429
}{
"message": "Internal server error",
"error": "Internal Server Error",
"statusCode": 500
}contact id, or by email or linkedin_username — an unknown person is created as a contact on the way in.
Partial-tolerant, and it always reports the whole outcome rather than a bare success: enrolled is a count, skipped lists everyone refused and why, held lists anyone a rule is holding for approval, and warnings lists rules that fired without blocking. A 200 does not mean everyone went in — read skipped.
A contact can hold only one live enrollment per sequence, so re-sending the same person is reported as already_enrolled rather than creating a duplicate. For more than 500, start an enrolment run instead.Authorizations
Team-scoped API key generated in the Salesfinity dashboard under Settings -> Connections & API. A missing or invalid key returns HTTP 403.
Path Parameters
24-character sequence id.
Body
The team member this call acts as. Must be an active member of the team the API key belongs to.
"507f1f77bcf86cd799439011"
At most 500 per request. Use an enrolment run for more.
Show child attributes
Show child attributes
Who owns the resulting enrollments, and therefore whose queue the tasks land in. Defaults to user_id. Must be an active team member.
Response
Success.