curl --request POST \
--url https://api-public.skipcall.app/v1/sequences/{id}/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contacts": [
{
"contactId": "123e4567-e89b-12d3-a456-426614174000",
"assignedToWorkspaceMembershipId": "987e6543-e21b-45d3-b678-426614174001"
}
]
}
'import requests
url = "https://api-public.skipcall.app/v1/sequences/{id}/contacts"
payload = { "contacts": [
{
"contactId": "123e4567-e89b-12d3-a456-426614174000",
"assignedToWorkspaceMembershipId": "987e6543-e21b-45d3-b678-426614174001"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contacts: [
{
contactId: '123e4567-e89b-12d3-a456-426614174000',
assignedToWorkspaceMembershipId: '987e6543-e21b-45d3-b678-426614174001'
}
]
})
};
fetch('https://api-public.skipcall.app/v1/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://api-public.skipcall.app/v1/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([
'contacts' => [
[
'contactId' => '123e4567-e89b-12d3-a456-426614174000',
'assignedToWorkspaceMembershipId' => '987e6543-e21b-45d3-b678-426614174001'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api-public.skipcall.app/v1/sequences/{id}/contacts"
payload := strings.NewReader("{\n \"contacts\": [\n {\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"assignedToWorkspaceMembershipId\": \"987e6543-e21b-45d3-b678-426614174001\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api-public.skipcall.app/v1/sequences/{id}/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contacts\": [\n {\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"assignedToWorkspaceMembershipId\": \"987e6543-e21b-45d3-b678-426614174001\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-public.skipcall.app/v1/sequences/{id}/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"contacts\": [\n {\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"assignedToWorkspaceMembershipId\": \"987e6543-e21b-45d3-b678-426614174001\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or revoked API key",
"status": 401
}
}{
"error": {
"code": "PLAN_NOT_ELIGIBLE",
"message": "API access requires INTERMÉDIAIRE or EXPERT plan",
"status": 403
}
}Add contacts to a sequence
Adds contacts to an existing sequence. Each item may optionally specify an assignedToWorkspaceMembershipId (a workspace membership id obtained via GET /v1/workspaces/:id/members). Items without assignedToWorkspaceMembershipId are auto-assigned via round-robin among the sequence assignees (least loaded first). Idempotent: duplicates, contacts already in the sequence, and contacts outside the sequence scope are silently ignored. Soft-deleted sequence-contacts are resurrected (their original assignee is preserved; an assignedToWorkspaceMembershipId in the body is ignored for resurrected rows). Returns 404 if the sequence is outside the API key scope. On concurrent requests for the same contact, the winner among competing assignedToWorkspaceMembershipId values is undefined; verify with GET /v1/sequences/:id/contacts.
curl --request POST \
--url https://api-public.skipcall.app/v1/sequences/{id}/contacts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contacts": [
{
"contactId": "123e4567-e89b-12d3-a456-426614174000",
"assignedToWorkspaceMembershipId": "987e6543-e21b-45d3-b678-426614174001"
}
]
}
'import requests
url = "https://api-public.skipcall.app/v1/sequences/{id}/contacts"
payload = { "contacts": [
{
"contactId": "123e4567-e89b-12d3-a456-426614174000",
"assignedToWorkspaceMembershipId": "987e6543-e21b-45d3-b678-426614174001"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
contacts: [
{
contactId: '123e4567-e89b-12d3-a456-426614174000',
assignedToWorkspaceMembershipId: '987e6543-e21b-45d3-b678-426614174001'
}
]
})
};
fetch('https://api-public.skipcall.app/v1/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://api-public.skipcall.app/v1/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([
'contacts' => [
[
'contactId' => '123e4567-e89b-12d3-a456-426614174000',
'assignedToWorkspaceMembershipId' => '987e6543-e21b-45d3-b678-426614174001'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api-public.skipcall.app/v1/sequences/{id}/contacts"
payload := strings.NewReader("{\n \"contacts\": [\n {\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"assignedToWorkspaceMembershipId\": \"987e6543-e21b-45d3-b678-426614174001\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api-public.skipcall.app/v1/sequences/{id}/contacts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contacts\": [\n {\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"assignedToWorkspaceMembershipId\": \"987e6543-e21b-45d3-b678-426614174001\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-public.skipcall.app/v1/sequences/{id}/contacts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"contacts\": [\n {\n \"contactId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"assignedToWorkspaceMembershipId\": \"987e6543-e21b-45d3-b678-426614174001\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or revoked API key",
"status": 401
}
}{
"error": {
"code": "PLAN_NOT_ELIGIBLE",
"message": "API access requires INTERMÉDIAIRE or EXPERT plan",
"status": 403
}
}Authorizations
Enter your API Key (sk_live_xxx or sk_test_xxx)
Path Parameters
Body
Array of 1–100 contact assignment entries. Per item: contactId is required; assignedToWorkspaceMembershipId optional. Duplicates, contacts already in the sequence, and out-of-scope contacts are silently ignored.
1 - 100 elementsShow child attributes
Show child attributes
Response
Contacts added