curl --request GET \
--url https://api.getoneprofile.ai/outreach-tasks/ \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.getoneprofile.ai/outreach-tasks/"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.getoneprofile.ai/outreach-tasks/', 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/outreach-tasks/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.getoneprofile.ai/outreach-tasks/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.getoneprofile.ai/outreach-tasks/")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/outreach-tasks/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"approved_at": "2023-11-07T05:31:56Z",
"approved_by_display_name": "<string>",
"ask_reason": "low_confidence",
"body": "<string>",
"channel": "linkedin",
"confidence": "<string>",
"confidence_score": 123,
"contact_label": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"due_at": "2023-11-07T05:31:56Z",
"editable": true,
"enrolment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"flagged": true,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "<string>",
"linkedin_action_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"note": "<string>",
"outbound_message_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"outcome": "<string>",
"reasoning": "<string>",
"record_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rejected_at": "2023-11-07T05:31:56Z",
"rejected_by_display_name": "<string>",
"resolved_at": "2023-11-07T05:31:56Z",
"sender_profile_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sender_profile_name": "<string>",
"sequence_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence_name": "<string>",
"status": "pending",
"step_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"step_name": "<string>",
"step_position": 123,
"subject": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"words_edited": true,
"contact_company": "<string>",
"contact_fields": [
{
"name": "<string>",
"value": "<string>"
}
],
"contact_identity": "<string>",
"contact_title": "<string>",
"progress": {
"error_code": "<string>",
"error_message": "<string>",
"hold_reason": "window",
"linkedin_queue": "running",
"may_have_sent": true,
"resets_at": "2023-11-07T05:31:56Z",
"retryable": true,
"starts_at": "2023-11-07T05:31:56Z",
"state": "queued",
"steps_ahead": 123,
"hold": "sequence_paused",
"pause_reason": "<string>"
},
"proposed_learning_event_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"proposed_learning_redo_state": "none",
"reply_subject": "<string>",
"sender_browser_online": true,
"sequence_paused": false
}
],
"next_page_cursor": "<string>",
"previous_page_cursor": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}List the approval queue
One list across every channel: LinkedIn steps and emails, each waiting on a person, waiting on its channel, or settled. Newest first by default, the order the Tasks page opens in; order by created_at or contact_label, which sorts by the contact as the Tasks page’s Contact column shows them (a LinkedIn profile address by its slug, letters in any case together, a task about nobody as the empty name). Waiting on a person (pending, the Tasks page’s Open tab) by default; pass status (repeatable) for approved work still on its channel (scheduled, its Pending tab) or settled tasks, and narrow by channel, task kind, sender, sequence, how it ended (outcome; the failed steps are status=cancelled&outcome=failed), why it waits for a person (ask_reason), words in the contact or the subject (search) or how long it has been waiting. Our own LinkedIn reads of the account (the inbox, sent connection requests, new connections, one conversation) are left out unless background_checks asks for them. rewrites=include keeps a task the agent is writing again in its place until it comes back with the new words, and rewrites=only lists those alone. GET /outreach-tasks/length/ counts the same filters. Every name the row shows (the sequence, the step, the sender, who decided) is resolved here, and every approved, finished or cancelled task says where its work stands (progress: queued with its expected start, running, held by the sending window, sent, failed and whether it can be retried).
curl --request GET \
--url https://api.getoneprofile.ai/outreach-tasks/ \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.getoneprofile.ai/outreach-tasks/"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.getoneprofile.ai/outreach-tasks/', 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/outreach-tasks/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"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"
"net/http"
"io"
)
func main() {
url := "https://api.getoneprofile.ai/outreach-tasks/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.getoneprofile.ai/outreach-tasks/")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/outreach-tasks/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"approved_at": "2023-11-07T05:31:56Z",
"approved_by_display_name": "<string>",
"ask_reason": "low_confidence",
"body": "<string>",
"channel": "linkedin",
"confidence": "<string>",
"confidence_score": 123,
"contact_label": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"due_at": "2023-11-07T05:31:56Z",
"editable": true,
"enrolment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"flagged": true,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "<string>",
"linkedin_action_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"note": "<string>",
"outbound_message_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"outcome": "<string>",
"reasoning": "<string>",
"record_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rejected_at": "2023-11-07T05:31:56Z",
"rejected_by_display_name": "<string>",
"resolved_at": "2023-11-07T05:31:56Z",
"sender_profile_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sender_profile_name": "<string>",
"sequence_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sequence_name": "<string>",
"status": "pending",
"step_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"step_name": "<string>",
"step_position": 123,
"subject": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"words_edited": true,
"contact_company": "<string>",
"contact_fields": [
{
"name": "<string>",
"value": "<string>"
}
],
"contact_identity": "<string>",
"contact_title": "<string>",
"progress": {
"error_code": "<string>",
"error_message": "<string>",
"hold_reason": "window",
"linkedin_queue": "running",
"may_have_sent": true,
"resets_at": "2023-11-07T05:31:56Z",
"retryable": true,
"starts_at": "2023-11-07T05:31:56Z",
"state": "queued",
"steps_ahead": 123,
"hold": "sequence_paused",
"pause_reason": "<string>"
},
"proposed_learning_event_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"proposed_learning_redo_state": "none",
"reply_subject": "<string>",
"sender_browser_online": true,
"sequence_paused": false
}
],
"next_page_cursor": "<string>",
"previous_page_cursor": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Query Parameters
Only tasks held for a person for one of these reasons (repeatable): the Tasks page's Why it needs approval. Omit for every reason.
Why a message that could have sent unattended was put in front of a person.
One vocabulary for every gate between an agent writing a message and the
message leaving: what the agent itself said about the draft
(LOW_CONFIDENCE, FINDINGS, INSUFFICIENT_DATA, POLICY), what
the sender or the cadence asked for (ALWAYS_ASK, SEQUENCE_MANUAL,
STEP_REQUIRES_APPROVAL), what the pacing rules refused
(DAILY_CAP, CONSECUTIVE_CAP, THREAD_CAP, HOURLY_CAP,
ORG_DAILY_CAP), what the mailbox or the thread made unsafe
(UNVERIFIED_SENDER, DIFFERENT_SENDER, LABEL, QUESTION,
STALE_INBOUND, SEQUENCE_GONE), and what the counterparty turned out to be
(BOT_QUESTION, AUTOMATED_COUNTERPARTY, AUTHENTICATION,
LANGUAGE, LINKEDIN_ONLY). KILL_SWITCH is the platform switch
that stops unattended sending outright, and SEND_INTERRUPTED an
unattended reply whose send never got as far as a provider.
SENDER_SWITCHED_TO_MANUAL is a LinkedIn step queued unasked that went
back to a person because its sender switched to manual before it ran.
Stored on the task so the queue can say why each row is there, and so "why did nothing send" is answerable by counting rows rather than by reading logs.
low_confidence, findings, insufficient_data, policy, always_ask, sequence_manual, step_requires_approval, daily_cap, unverified_sender, suppressed, different_sender, label, question, consecutive_cap, thread_cap, hourly_cap, org_daily_cap, stale_inbound, sequence_gone, bot_question, automated_counterparty, kill_switch, authentication, language, linkedin_only, send_interrupted, sender_switched_to_manual Our own LinkedIn reads of the sender's account (the inbox, sent connection requests, new connections, one conversation): approved by nobody, acting on nobody, so left out by default (hide); include lists them with the rest, only alone. Activity lists the ones that ran.
hide, include, only Only these channels; omit for every channel.
Which channel performs the task once it is allowed to run.
linkedin, email Only the tasks of these contacts, by their enrolment in a sequence; omit for everyone.
Only these kinds: a LinkedIn action slug (profile_view, connection_request, …) or email. Omit for every kind.
Only tasks that ended with one of these words (repeatable): failed, skipped, stopped, succeeded and the like. The tasks that failed are status=cancelled with outcome=failed. Omit for however they ended.
1 - 32The tasks the agent is writing again after a Needs work, or another version. Meanwhile each reads status cancelled, outcome regenerated, and progress.state writing (or why the write waits), and the same task comes back pending with the new words. By default (hide) they are listed only where status asks for cancelled; include lists them in their place among the statuses asked for, only alone, whatever status says. Every other filter still applies. A task whose rewrite ended, its contact stopped or moved on, is not one of them, nor is one nobody can act on: paused, held (the sending window, a sender with no mailbox or LinkedIn account) or failed past a retry. It comes back when the engine asks again with the new words.
hide, include, only Words that must each appear in the contact's name, address or LinkedIn profile, or in the subject.
255Only these senders; omit for everyone.
Only these sequences; omit for all of them.
Only these statuses; repeat the parameter for several. Defaults to pending.
Where one task stands.
PENDING is waiting on a person. SCHEDULED is approved, or never needed approval, and is waiting on the channel to execute it: the browser to run the LinkedIn step, the engine to send the email. The task is where a LinkedIn step's approval lives: while it is PENDING no step exists, and the step is queued only once it is SCHEDULED. A LinkedIn task nobody is asked about (a sender on automatic, a housekeeping read, a Try click) is BORN scheduled, pointing at the step it queued. Who approved it is a stamp on the row, not a status of its own.
DONE, REJECTED and CANCELLED are terminal. DONE is the channel executed it; REJECTED is a person refused it; CANCELLED is the channel gave up on it (failed, skipped, expired), or the contact was stopped underneath it.
pending, scheduled, done, rejected, cancelled Only tasks that entered the queue before this instant, which is 'waiting longer than'. Read off when the task was created, not when its channel would run it. Omit for however long they have been here.
The number of items to return.
1 <= x <= 100created_at, contact_label asc, desc Set the cursor to the next or previous page. You can get the cursor from the previous page's response.
Response
Successful Response
Was this page helpful?