curl --request POST \
--url https://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"body": "<string>",
"subject": "<string>"
}
'import requests
url = "https://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/"
payload = {
"body": "<string>",
"subject": "<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({body: JSON.stringify('<string>'), subject: '<string>'})
};
fetch('https://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/', 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/{task_id}/edit/",
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([
'body' => '<string>',
'subject' => '<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://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/"
payload := strings.NewReader("{\n \"body\": \"<string>\",\n \"subject\": \"<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://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"body\": \"<string>\",\n \"subject\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/")
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 \"body\": \"<string>\",\n \"subject\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"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>",
"quality_score": 123,
"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",
"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>"
},
"reply_subject": "<string>",
"sender_browser_online": true,
"sequence_paused": false
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Rewrite a pending task's message
Change what a pending task will send before approving it. An email’s rewrite is stored as the contact’s message override; a LinkedIn note or message is kept on the task as typed, and clipped to LinkedIn’s ceilings when the approved step is queued, the way the step’s own render would be. Only while the task is pending: once the channel has it, the text a person saw is the text that sends.
curl --request POST \
--url https://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"body": "<string>",
"subject": "<string>"
}
'import requests
url = "https://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/"
payload = {
"body": "<string>",
"subject": "<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({body: JSON.stringify('<string>'), subject: '<string>'})
};
fetch('https://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/', 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/{task_id}/edit/",
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([
'body' => '<string>',
'subject' => '<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://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/"
payload := strings.NewReader("{\n \"body\": \"<string>\",\n \"subject\": \"<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://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"body\": \"<string>\",\n \"subject\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/outreach-tasks/{task_id}/edit/")
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 \"body\": \"<string>\",\n \"subject\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"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>",
"quality_score": 123,
"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",
"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>"
},
"reply_subject": "<string>",
"sender_browser_online": true,
"sequence_paused": false
}{
"detail": "<string>"
}{
"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
Body
Rewrite what a pending task will send.
subject left out keeps the subject the task already carries; an
explicit null clears it, which for an email means the follow-up lands
in-thread. The two are told apart on the wire so a client fixing a typo
in the body cannot silently strip a first email's subject.
Response
Successful Response
One row of the approval queue, every name the page shows resolved server-side.
The task table stores ids; the page shows names. The sequence, the step, the sender and the deciding person are all resolved here rather than by the client, so no raw actor id ever crosses the wire and a sequence or sender since deleted reads as a blank rather than a broken lookup.
Who approved it, as a name. Null when nobody has, or the person could not be resolved.
Why this message or step is waiting for a person instead of running on its own. It stays on the task after it is decided, so the history still says why it was asked. Null when no reason was recorded.
About the message: low_confidence the agent was not sure of it; findings a check found a problem in it, such as a placeholder that never filled in; insufficient_data the agent knew too little about the contact to write something only they could receive; policy it breaks one of the agent's content rules, such as a link, phone number or figure that is not in the contact's data.
About the settings: always_ask the sender has a person approve every email, or every LinkedIn step; sequence_manual the sequence asks for approval of every email or LinkedIn step; step_requires_approval this step asks for approval; sender_switched_to_manual the LinkedIn step was on its way unattended when its sender switched to asking first, so it waits for a person again.
About sending limits: daily_cap the mailbox has reached its daily limit; consecutive_cap the agent sent the last reply and nobody has written since; thread_cap the conversation has had as many unattended replies as it may; hourly_cap the mailbox has reached its hourly reply limit; org_daily_cap the workspace has reached its daily reply limit.
About the conversation: stale_inbound a newer message arrived, or the one being answered is too old; unverified_sender the reply could not be confirmed as coming from the contact; different_sender someone other than the contact wrote it; authentication it failed email authentication or was marked as spam; label the reply is not one the agent answers on its own; suppressed the contact is on the do-not-contact list; sequence_gone the sequence or the agent's message no longer exists; linkedin_only the contact is known only by LinkedIn, so no unsubscribe could be honoured.
About the other side: bot_question the contact asked whether they are talking to a bot or an AI; question the contact asked something a person should answer; automated_counterparty the other side appears to be an automated system; language the message is not in the expected language.
kill_switch unattended sending is paused for the workspace or the platform.
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 The rendered message as it will send: an email body, a note, a LinkedIn message.
Which channel performs the task once it is allowed to run.
linkedin, email How sure the agent was that its message could go out unedited: high (a person could send it unread), medium (worth a glance) or low (needs work). Null when no agent wrote the message.
The number behind confidence: the agent's own score for its message, from 0 to 100. Read from the agent's message as it stands now. Null when no agent wrote the message, or the agent gave no score.
The contact as the queue names them: a name, else an address or a profile URL.
When the channel would run it if nobody were in the way.
Whether the queue may rewrite the message before approving: pending, and a kind that carries text.
Whether a check found a problem in the agent's message (any finding at warning strength), whatever ask_reason says: a task held for a setting can still carry a message with a placeholder that never filled in. False when no agent wrote the message.
The LinkedIn action kind slug or email.
What the person wrote when settling it: why they rejected it.
The message the Outbound Agent wrote for this task. Null when a person wrote the words, and on a LinkedIn step that carries no message.
How it ended: the channel's own terminal word.
A separate AI review's score for the agent's message, from 0 to 100: how likely a busy person in the recipient's role is to read it to the end and reply. Null when no agent wrote the message, or when it was not reviewed.
The agent's own note on its message: what it built the message on and what it was unsure about. Null when no agent wrote the message.
Null when nobody in particular sends it, or the sender was deleted.
Null for housekeeping work, or for a sequence since deleted.
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 The step as the builder names it; null when the step no longer exists.
The step's customer-visible ordinal, zero-based; null with the name.
The contact's company, from whichever column of the audience table holds it ('Company', 'Company Name', 'Organization' and the like). Null when the table has none or leaves it blank.
Every filled column of the contact's audience row, in the table's order. Empty for housekeeping work and for a row since deleted.
Show child attributes
Show child attributes
The address, profile slug or number behind the label, so a row can show the name and still say who that is. Equal to the label where no name was found; null for housekeeping.
The contact's job title, from whichever column of the audience table holds it ('Job Title', 'Title', 'Position' and the like). Null when the table has none or leaves it blank.
Where the work stands once the queue has let it go, read from the channel: set on approved, finished and cancelled tasks, null on a task still waiting on a person and on one a person rejected.
Show child attributes
Show child attributes
For an email that replies in the contact's existing thread, the subject it will go out with, such as 'Re: Quick question'. Null for a first email, which carries its own subject, and for anything that is not an email.
For a LinkedIn task still waiting on a person: whether a browser is checked in for its sender right now, so approving it would run it soon. False means an approved step waits until a browser is open. Null for every other task.
Its sequence is paused right now: approving the task records the approval, and the step waits for Resume sequence before it runs, on either channel.
Was this page helpful?