curl --request POST \
--url https://api.getoneprofile.ai/sender-profiles/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"first_name": "<string>",
"last_name": "",
"signature_text": ""
}
'import requests
url = "https://api.getoneprofile.ai/sender-profiles/"
payload = {
"first_name": "<string>",
"last_name": "",
"signature_text": ""
}
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({first_name: '<string>', last_name: '', signature_text: ''})
};
fetch('https://api.getoneprofile.ai/sender-profiles/', 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/sender-profiles/",
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([
'first_name' => '<string>',
'last_name' => '',
'signature_text' => ''
]),
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/sender-profiles/"
payload := strings.NewReader("{\n \"first_name\": \"<string>\",\n \"last_name\": \"\",\n \"signature_text\": \"\"\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/sender-profiles/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"first_name\": \"<string>\",\n \"last_name\": \"\",\n \"signature_text\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/sender-profiles/")
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 \"first_name\": \"<string>\",\n \"last_name\": \"\",\n \"signature_text\": \"\"\n}"
response = http.request(request)
puts response.read_body{
"booking_url": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mailbox_count": 123,
"name": "<string>",
"send_mode": "always_send",
"status": "draft",
"title": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"daily_limit": 0,
"email_approval_mode": "manual",
"first_name": "",
"last_name": "",
"linkedin_connection_request_cap": 0,
"linkedin_connection_requests_today": 0,
"linkedin_identity": "<string>",
"linkedin_photo_url": "<string>",
"linkedin_presence": "active",
"sent_today": 0,
"signature_text": ""
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Add a sender
Creates a draft sender; it activates once a mailbox is attached.
curl --request POST \
--url https://api.getoneprofile.ai/sender-profiles/ \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"first_name": "<string>",
"last_name": "",
"signature_text": ""
}
'import requests
url = "https://api.getoneprofile.ai/sender-profiles/"
payload = {
"first_name": "<string>",
"last_name": "",
"signature_text": ""
}
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({first_name: '<string>', last_name: '', signature_text: ''})
};
fetch('https://api.getoneprofile.ai/sender-profiles/', 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/sender-profiles/",
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([
'first_name' => '<string>',
'last_name' => '',
'signature_text' => ''
]),
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/sender-profiles/"
payload := strings.NewReader("{\n \"first_name\": \"<string>\",\n \"last_name\": \"\",\n \"signature_text\": \"\"\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/sender-profiles/")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"first_name\": \"<string>\",\n \"last_name\": \"\",\n \"signature_text\": \"\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/sender-profiles/")
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 \"first_name\": \"<string>\",\n \"last_name\": \"\",\n \"signature_text\": \"\"\n}"
response = http.request(request)
puts response.read_body{
"booking_url": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"mailbox_count": 123,
"name": "<string>",
"send_mode": "always_send",
"status": "draft",
"title": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"daily_limit": 0,
"email_approval_mode": "manual",
"first_name": "",
"last_name": "",
"linkedin_connection_request_cap": 0,
"linkedin_connection_requests_today": 0,
"linkedin_identity": "<string>",
"linkedin_photo_url": "<string>",
"linkedin_presence": "active",
"sent_today": 0,
"signature_text": ""
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Body
A sender is a person, so a person's name is all it takes to create one.
The workspace-unique display name is derived from these two — there is no separate name to type, and therefore no way for it to disagree with the first and last name the messages themselves are signed with.
Response
Successful Response
The link people use to book a meeting with this sender, such as a Calendly or Cal.com page. It is what the {{Sender booking link}} variable is replaced with. Null when none is set.
Whether the messages the agent writes for this sender go out on their own or wait for a person, replies included. Always send (always_send): the agent's messages go out on their own unless something is wrong with the words. Send when confident (send_when_confident, the default): they go out when the agent was confident and nothing is wrong, and wait for a person otherwise. Always ask (always_ask): a person approves every one. A sequence set to ask first still asks, whichever mode its senders are on.
always_send, send_when_confident, always_ask Lifecycle of a sender.
A sender is DRAFT from the moment it is created and becomes ACTIVE once at least one mailbox is attached. The status is derived from attachment, never stored — it cannot drift.
draft, active The sender's job title, as their messages introduce them. It is what the {{Sender title}} variable is replaced with. Empty when none is set.
manual | auto; null inherits the workspace's email approval mode.
manual, auto How recently ANY browser connected to this sender checked in.
Three states, not two, because two different questions are asked of a
connection. ACTIVE answers "can a step run right now" — a browser is
open and heartbeating. IDLE answers "is this still set up" — the laptop
was closed for the evening. NOT_SEEN is the one that needs a person:
nothing has checked in for a day, and queued work is silently waiting.
active, idle, not_seen Was this page helpful?