curl --request POST \
--url https://api.getoneprofile.ai/inbox/threads/{thread_id}/done/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '{
"done": true
}'import requests
url = "https://api.getoneprofile.ai/inbox/threads/{thread_id}/done/"
payload = { "done": True }
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({done: true})
};
fetch('https://api.getoneprofile.ai/inbox/threads/{thread_id}/done/', 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/inbox/threads/{thread_id}/done/",
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([
'done' => true
]),
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/inbox/threads/{thread_id}/done/"
payload := strings.NewReader("{\n \"done\": true\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/inbox/threads/{thread_id}/done/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"done\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/inbox/threads/{thread_id}/done/")
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 \"done\": true\n}"
response = http.request(request)
puts response.read_body{
"came_back": true,
"channel": "email",
"contact_email": "<string>",
"contact_key": "<string>",
"contact_name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"follow_up_expected": true,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"is_bounce": true,
"is_done": true,
"is_out_of_office": true,
"is_unread": true,
"label_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"last_message_at": "2023-11-07T05:31:56Z",
"last_snippet": "<string>",
"listed_at": "2023-11-07T05:31:56Z",
"mailbox_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"message_count": 123,
"sequence_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"step_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"subject": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"can_reply_on_linkedin": false,
"contact_linkedin_url": "<string>",
"contact_replied": true,
"done_at": "2023-11-07T05:31:56Z",
"enrolment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"has_pending_draft": false,
"linkedin_account_status": "pending",
"linkedin_checkpoint_status": "ok",
"linkedin_last_seen_at": "2023-11-07T05:31:56Z",
"linkedin_presence": "active",
"linkedin_queue_expiry_days": 123,
"linkedin_sender_profile_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"match_excerpt": "<string>",
"returns_at": "2023-11-07T05:31:56Z",
"snoozed_until": "2023-11-07T05:31:56Z",
"stop_reason": "reply"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Mark a conversation done, or not
Done takes the conversation out of the Inbox until a new message reaches us, theirs or ours: their reply brings it back, and so does an answer of ours that then goes three business days unanswered. An auto-reply, a bounce or a forward does not. It also cancels a reminder the conversation is waiting on. False clears the mark, and the Inbox’s own rule decides again whether it is listed.
curl --request POST \
--url https://api.getoneprofile.ai/inbox/threads/{thread_id}/done/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '{
"done": true
}'import requests
url = "https://api.getoneprofile.ai/inbox/threads/{thread_id}/done/"
payload = { "done": True }
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({done: true})
};
fetch('https://api.getoneprofile.ai/inbox/threads/{thread_id}/done/', 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/inbox/threads/{thread_id}/done/",
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([
'done' => true
]),
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/inbox/threads/{thread_id}/done/"
payload := strings.NewReader("{\n \"done\": true\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/inbox/threads/{thread_id}/done/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"done\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/inbox/threads/{thread_id}/done/")
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 \"done\": true\n}"
response = http.request(request)
puts response.read_body{
"came_back": true,
"channel": "email",
"contact_email": "<string>",
"contact_key": "<string>",
"contact_name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"follow_up_expected": true,
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"is_bounce": true,
"is_done": true,
"is_out_of_office": true,
"is_unread": true,
"label_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"last_message_at": "2023-11-07T05:31:56Z",
"last_snippet": "<string>",
"listed_at": "2023-11-07T05:31:56Z",
"mailbox_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"message_count": 123,
"sequence_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"step_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"subject": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"can_reply_on_linkedin": false,
"contact_linkedin_url": "<string>",
"contact_replied": true,
"done_at": "2023-11-07T05:31:56Z",
"enrolment_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"has_pending_draft": false,
"linkedin_account_status": "pending",
"linkedin_checkpoint_status": "ok",
"linkedin_last_seen_at": "2023-11-07T05:31:56Z",
"linkedin_presence": "active",
"linkedin_queue_expiry_days": 123,
"linkedin_sender_profile_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"match_excerpt": "<string>",
"returns_at": "2023-11-07T05:31:56Z",
"snoozed_until": "2023-11-07T05:31:56Z",
"stop_reason": "reply"
}{
"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
Whether the conversation is done.
True marks it done now; false clears the mark.
Response
Successful Response
Back in the Inbox because our answer went three business days unanswered: returns_at has passed.
Which surface a conversation happens on.
Threads are contact-scoped, not channel-scoped, so this says how a thread is REACHED rather than partitioning the inbox: a reply arrives, is classified and stops the cadence identically either way, and only the send path differs.
email, linkedin Whether an answer of ours they leave unanswered would come back to the Inbox: the contact has written, and the verdict on their latest reply, by the classifier or a label a person set, does not say the conversation is over.
Marked done, and no new message has reached us since: out of the Inbox. Their reply, or an answer of ours, arriving after the mark ends it, whatever time the message gives itself; an auto-reply, a bounce, a forward or a reply still waiting on Tasks does not.
The moment the list sorts this conversation by: its last message, or later when a reminder went off or, on the Inbox's own views, when it came back from silence. The time to show beside the row.
Whether an explicit channel='linkedin' reply can go out on this thread, because it carries a LinkedIn member identity and a paired account. The composer's channel toggle keys off this.
The contact's LinkedIn profile URL, when our own evidence (invitation ledger, dispatched actions, or the sequence's mapped column) names one. Only the SINGLE-thread read resolves it; the list leaves it null.
Whether the contact has written back in this thread: a person's reply, never an auto-reply, a bounce or a robot's acknowledgement. False on a send nobody answered, which the working views never list. Only the thread LIST populates it; single-thread reads leave it null.
When a person marked the conversation done. is_done says whether the mark still holds.
The contact's enrolment in this thread's sequence, when it has one: the id the 'Resume cadence' action targets.
An AI reply is waiting for approval on this thread: the list row's 'Action required' mark. Only the thread LIST populates it; single-thread reads leave it False and the open conversation fetches the draft itself.
The pairing state of the LinkedIn account this thread replies from. Anything but 'active' blocks queueing a LinkedIn reply: 'revoked' was disconnected and 'pending' never bound a member. Only the SINGLE-thread read resolves it; the list leaves it null, as does a thread with no LinkedIn account or one whose account row is gone.
pending, active, revoked Whether LinkedIn is currently challenging that account. Single-thread read only; the list leaves it null.
ok, checkpoint When a browser on that account last checked in; null when none ever has. Single-thread read only; the list leaves it null.
How recently a browser on that account checked in: active, idle or not seen. Carried beside the status rather than blanked for a non-active account (the senders list does that), because the composer shows the two as separate facts. Single-thread read only; the list leaves it null.
active, idle, not_seen Always null. The wait window was retired: a queued LinkedIn reply now waits for a person, or for a browser, without expiring. The field stays so older clients still find it; a null hides the composer's sentence about it.
The sender the LinkedIn account belongs to, so the composer can send a person to that sender's LinkedIn tab to reconnect. Single-thread read only; the list leaves it null.
The matched message, headlined around the match. Only set when searching.
When this conversation comes back to the Inbox if the contact stays quiet: three business days after our latest answer, at the same time of day, counted in the sender's timezone. In the past once it has come back (came_back). Null when it will not: they have the last word, the verdict on their latest reply, by the classifier or a label a person set, says the conversation is over (Negative, Meeting booked, Meeting completed, Closed or Wrong contact), or it is done.
Hidden from the working views until this instant.
Set when the cadence is stopped (reply, unsubscribe, bounce, ...). None for a live or normally-completed enrolment. Only 'reply' is resumable.
reply, unsubscribe, bounce, manual, company_reply, row_left_audience, row_left_paused, step_removed, removed, cooldown, rejected, mailbox_removed Was this page helpful?