curl --request PATCH \
--url https://api.getoneprofile.ai/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"expected_revision": 2
}
'import requests
url = "https://api.getoneprofile.ai/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/"
payload = { "expected_revision": 2 }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({expected_revision: 2})
};
fetch('https://api.getoneprofile.ai/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/', 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}/agent/training-sessions/{session_id}/contacts/{record_id}/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'expected_revision' => 2
]),
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}/agent/training-sessions/{session_id}/contacts/{record_id}/"
payload := strings.NewReader("{\n \"expected_revision\": 2\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.getoneprofile.ai/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"expected_revision\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"expected_revision\": 2\n}"
response = http.request(request)
puts response.read_body{
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"base_version": 123,
"contacts": [
{
"context": {},
"fields": [
{
"name": "<string>",
"value": "<string>"
}
],
"label": "<string>",
"messages": [
{
"authored": true,
"body": "<string>",
"conditional": "<string>",
"error": "<string>",
"facts_used": [
"<string>"
],
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "<string>",
"reasoning": "<string>",
"reply_to_step_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"steps": [
{
"action": "<string>",
"detail": "",
"duration_ms": 123,
"observation": "",
"outcome": "completed",
"thought": "<string>"
}
],
"subject": "<string>",
"timing": "<string>",
"title": "<string>",
"looks_good": false,
"send": {
"alone": true,
"reason": "low_confidence",
"doubt": "<string>"
}
}
],
"record_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"verdict": "good",
"profile_mismatch": "<string>",
"sender_profile_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"created_at": "2023-11-07T05:31:56Z",
"error": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"revision": 123,
"status": "running",
"reviewed_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"steps": [
{
"action": "<string>",
"detail": "",
"duration_ms": 123,
"observation": "",
"outcome": "completed",
"thought": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Review a contact's whole thread in the Preview
Looks good (good) or Skip (skipped) on a contact’s whole thread. Looks good makes the thread what sends, until the agent’s writing or the contact’s row changes, and saves no learning. Needs work is a thumbs down on the contact instead (POST /agent-learnings/thumbs-downs/, kind writing_preview): it asks what’s wrong, saves a learning and writes the thread again. bad here is refused with a 422.
curl --request PATCH \
--url https://api.getoneprofile.ai/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"expected_revision": 2
}
'import requests
url = "https://api.getoneprofile.ai/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/"
payload = { "expected_revision": 2 }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({expected_revision: 2})
};
fetch('https://api.getoneprofile.ai/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/', 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}/agent/training-sessions/{session_id}/contacts/{record_id}/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'expected_revision' => 2
]),
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}/agent/training-sessions/{session_id}/contacts/{record_id}/"
payload := strings.NewReader("{\n \"expected_revision\": 2\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.getoneprofile.ai/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"expected_revision\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/sequences/{sequence_id}/agent/training-sessions/{session_id}/contacts/{record_id}/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"expected_revision\": 2\n}"
response = http.request(request)
puts response.read_body{
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"base_version": 123,
"contacts": [
{
"context": {},
"fields": [
{
"name": "<string>",
"value": "<string>"
}
],
"label": "<string>",
"messages": [
{
"authored": true,
"body": "<string>",
"conditional": "<string>",
"error": "<string>",
"facts_used": [
"<string>"
],
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "<string>",
"reasoning": "<string>",
"reply_to_step_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"steps": [
{
"action": "<string>",
"detail": "",
"duration_ms": 123,
"observation": "",
"outcome": "completed",
"thought": "<string>"
}
],
"subject": "<string>",
"timing": "<string>",
"title": "<string>",
"looks_good": false,
"send": {
"alone": true,
"reason": "low_confidence",
"doubt": "<string>"
}
}
],
"record_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"verdict": "good",
"profile_mismatch": "<string>",
"sender_profile_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"created_at": "2023-11-07T05:31:56Z",
"error": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"revision": 123,
"status": "running",
"reviewed_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"steps": [
{
"action": "<string>",
"detail": "",
"duration_ms": 123,
"observation": "",
"outcome": "completed",
"thought": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Path Parameters
Body
x >= 1good (Looks good) or skipped. Needs work is not a verdict here: it is a thumbs down on the contact (POST /agent-learnings/thumbs-downs/, kind writing_preview), which asks what's wrong, saves a learning and writes the thread again; bad is refused.
good, bad, skipped Response
Successful Response
Show child attributes
Show child attributes
A session's phase, also used to resume its review screen.
running, reviewing, proposing, proposed, completed, abandoned Every contact given Looks good in this run, including ones that left the run to make room.
Show child attributes
Show child attributes
Was this page helpful?