curl --request POST \
--url https://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"all": false,
"created_from": "2023-11-07T05:31:56Z",
"created_to": "2023-11-07T05:31:56Z",
"exclude": false,
"excluded_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"order_by": "created_at",
"order_direction": "desc",
"search": "<string>",
"statuses": [],
"stop_reasons": []
}
'import requests
url = "https://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/"
payload = {
"all": False,
"created_from": "2023-11-07T05:31:56Z",
"created_to": "2023-11-07T05:31:56Z",
"exclude": False,
"excluded_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"order_by": "created_at",
"order_direction": "desc",
"search": "<string>",
"statuses": [],
"stop_reasons": []
}
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({
all: false,
created_from: '2023-11-07T05:31:56Z',
created_to: '2023-11-07T05:31:56Z',
exclude: false,
excluded_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
order_by: 'created_at',
order_direction: 'desc',
search: '<string>',
statuses: [],
stop_reasons: []
})
};
fetch('https://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/', 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.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/",
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([
'all' => false,
'created_from' => '2023-11-07T05:31:56Z',
'created_to' => '2023-11-07T05:31:56Z',
'exclude' => false,
'excluded_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'order_by' => 'created_at',
'order_direction' => 'desc',
'search' => '<string>',
'statuses' => [
],
'stop_reasons' => [
]
]),
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://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/"
payload := strings.NewReader("{\n \"all\": false,\n \"created_from\": \"2023-11-07T05:31:56Z\",\n \"created_to\": \"2023-11-07T05:31:56Z\",\n \"exclude\": false,\n \"excluded_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"order_by\": \"created_at\",\n \"order_direction\": \"desc\",\n \"search\": \"<string>\",\n \"statuses\": [],\n \"stop_reasons\": []\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://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"all\": false,\n \"created_from\": \"2023-11-07T05:31:56Z\",\n \"created_to\": \"2023-11-07T05:31:56Z\",\n \"exclude\": false,\n \"excluded_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"order_by\": \"created_at\",\n \"order_direction\": \"desc\",\n \"search\": \"<string>\",\n \"statuses\": [],\n \"stop_reasons\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/")
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 \"all\": false,\n \"created_from\": \"2023-11-07T05:31:56Z\",\n \"created_to\": \"2023-11-07T05:31:56Z\",\n \"exclude\": false,\n \"excluded_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"order_by\": \"created_at\",\n \"order_direction\": \"desc\",\n \"search\": \"<string>\",\n \"statuses\": [],\n \"stop_reasons\": []\n}"
response = http.request(request)
puts response.read_body{
"updated": 123,
"in_other_sequence": 0
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Retry many failed contacts
Re-queues each FAILED contact at the exact step that broke. A failure preserves its step pointer, so a retry is a re-attempt, never a restart. A failed contact another live sequence has taken since stays failed here and is counted in in_other_sequence. Idempotent: a second call retries nothing. To retry every failed contact, send all=true with statuses of failed. Takes the Audience tab’s selection: listed ids, or all=true for every contact the given filters match, less any excluded_ids. Each contact is judged on its own and one the action cannot apply to is skipped rather than failing the batch, because a selection is rarely uniform: updated reports how many actually took it.
curl --request POST \
--url https://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"all": false,
"created_from": "2023-11-07T05:31:56Z",
"created_to": "2023-11-07T05:31:56Z",
"exclude": false,
"excluded_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"order_by": "created_at",
"order_direction": "desc",
"search": "<string>",
"statuses": [],
"stop_reasons": []
}
'import requests
url = "https://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/"
payload = {
"all": False,
"created_from": "2023-11-07T05:31:56Z",
"created_to": "2023-11-07T05:31:56Z",
"exclude": False,
"excluded_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"order_by": "created_at",
"order_direction": "desc",
"search": "<string>",
"statuses": [],
"stop_reasons": []
}
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({
all: false,
created_from: '2023-11-07T05:31:56Z',
created_to: '2023-11-07T05:31:56Z',
exclude: false,
excluded_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
order_by: 'created_at',
order_direction: 'desc',
search: '<string>',
statuses: [],
stop_reasons: []
})
};
fetch('https://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/', 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.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/",
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([
'all' => false,
'created_from' => '2023-11-07T05:31:56Z',
'created_to' => '2023-11-07T05:31:56Z',
'exclude' => false,
'excluded_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'order_by' => 'created_at',
'order_direction' => 'desc',
'search' => '<string>',
'statuses' => [
],
'stop_reasons' => [
]
]),
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://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/"
payload := strings.NewReader("{\n \"all\": false,\n \"created_from\": \"2023-11-07T05:31:56Z\",\n \"created_to\": \"2023-11-07T05:31:56Z\",\n \"exclude\": false,\n \"excluded_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"order_by\": \"created_at\",\n \"order_direction\": \"desc\",\n \"search\": \"<string>\",\n \"statuses\": [],\n \"stop_reasons\": []\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://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"all\": false,\n \"created_from\": \"2023-11-07T05:31:56Z\",\n \"created_to\": \"2023-11-07T05:31:56Z\",\n \"exclude\": false,\n \"excluded_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"order_by\": \"created_at\",\n \"order_direction\": \"desc\",\n \"search\": \"<string>\",\n \"statuses\": [],\n \"stop_reasons\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/sequences/{sequence_id}/contacts/bulk/retry/")
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 \"all\": false,\n \"created_from\": \"2023-11-07T05:31:56Z\",\n \"created_to\": \"2023-11-07T05:31:56Z\",\n \"exclude\": false,\n \"excluded_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"order_by\": \"created_at\",\n \"order_direction\": \"desc\",\n \"search\": \"<string>\",\n \"statuses\": [],\n \"stop_reasons\": []\n}"
response = http.request(request)
puts response.read_body{
"updated": 123,
"in_other_sequence": 0
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Path Parameters
Query Parameters
Answer what the action would do, exactly as the real call answers it, and change nothing.
Body
Which contacts a bulk action on the Audience tab reaches.
Send ids for contacts picked one by one. Send all: true for every
contact the filters below match (every contact, with none), less any
excluded_ids, resolved on the server at the moment of the action so it
covers every match across pages. A body that names nobody is refused.
Act on every contact the filters match, or every contact when there are none. Required when ids is absent.
Only contacts added on or after this instant. The grid's date range, which an action on everything matching has to honour or it reaches past what the person was looking at.
Read 'statuses' and 'stop_reasons' as 'everything but', matching the Contacts tab's one Include/Exclude toggle.
With all, contacts to leave out: the rows unticked after ticking the header.
1000The Audience tab's tab the grid was showing. An action on everything matching reaches only the contacts under it, or Select all under one tab would act on everyone.
in_progress, needs_approval, paused, done, blocked The contacts to act on, by enrolment id.
1000The order the grid was listing in. Under a 'group', the action judges the same contacts the tab's list judged in that order.
created_at, due_at, status The direction of order_by.
asc, desc 255Where one contact stands in one sequence.
ACTIVE rows carry a due_at and are what the tick claims; CLAIMED is the
in-flight guard between claim and outcome. PAUSED is a deliberate
per-contact hold: unclaimable because the tick claims strictly on ACTIVE,
yet still LIVE. It keeps its step and its one-live-sequence slot, and a
compliance stop (reply, unsubscribe) reaches it. Everything else is
settled: COMPLETED walked off the end; STOPPED was halted (reply,
unsubscribe, bounce, manual, company pause); FAILED is terminal;
SUPPRESSED was on the do-not-contact list;
SKIPPED_DUPLICATE lost the one-live-sequence-per-contact rule, with the
reason visible in the grid.
A contact the workspace's recontact rule refuses is STOPPED with
StopReason.COOLDOWN. There is deliberately no held state: a cooldown
settles a contact rather than parking them, so nothing here waits on a date
and nothing lets itself out later.
AWAITING_ACTION is a contact parked behind a task that needs a person or a channel, modelled on PAUSED: live, keeps its step and its one-live-sequence slot, unclaimable because the tick claims strictly on ACTIVE, and a compliance stop reaches it. Unlike PAUSED nobody wakes it by hand: only the outreach-task sweep does, once the task it waits on is decided or delivered. Deliberately not "awaiting approval": an AUTO-mode LinkedIn park is waiting for a browser rather than for anyone's approval, and this value is the word the Contacts tab shows for both.
PENDING is a draft's roster: in, standing on a step, and NOT live. Binding
an audience enrols on the spot so the Contacts tab can show who is in, but
a sequence nobody has launched must not hold anybody's one-live-sequence
slot, or a second sequence written for the same people skips them all.
uq_sequence_enrolment_one_live leaves PENDING out, the tick never
claims it, and launch turns each row ACTIVE, settling the ones another
sequence took meanwhile as SKIPPED_DUPLICATE.
pending, active, claimed, paused, awaiting_action, completed, stopped, failed, suppressed, skipped_duplicate reply, unsubscribe, bounce, manual, company_reply, row_left_audience, row_left_paused, step_removed, removed, cooldown, rejected, mailbox_removed, unread_reply, declined, trashed, trashed_paused Response
Successful Response
What one bulk action on contacts did.
How many contacts actually took the action. A selection is rarely uniform, so rows the action cannot apply to are skipped, not failed.
Of the skipped, the contacts another live sequence has taken since: failed contacts a retry left failed, on the step that broke, for a retry once that sequence is done with them; and stopped contacts a resume marked skipped instead of putting back on the cadence.
Was this page helpful?