curl --request GET \
--url https://api.getoneprofile.ai/mailboxes/ \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.getoneprofile.ai/mailboxes/"
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/mailboxes/', 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/mailboxes/",
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/mailboxes/"
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/mailboxes/")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/mailboxes/")
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{
"items": [
{
"connection_status": "connected",
"created_at": "2023-11-07T05:31:56Z",
"daily_send_limit": 123,
"disconnected_at": "2023-11-07T05:31:56Z",
"disconnected_reason": "<string>",
"email_address": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"provider": "google_workspace",
"sender_profile_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"updated_at": "2023-11-07T05:31:56Z",
"bounce_rate": 123,
"last_verified_at": "2023-11-07T05:31:56Z",
"reply_rate": 123,
"usage": {
"sent_today": 123,
"sent_yesterday": 123
}
}
],
"total": 123
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}List mailboxes
The ops list and the profile editor’s picker share this endpoint. Two status filters, and they read differently on purpose: connection_status is the stored grant state, where connected means anything that is not broken; health is the three-way split the Status column draws, where verified is a grant that passed its latest check (one runs every hour) and connected narrows to one that has not passed a check yet, or whose latest check got a definite error back that was not a refusal.
curl --request GET \
--url https://api.getoneprofile.ai/mailboxes/ \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.getoneprofile.ai/mailboxes/"
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/mailboxes/', 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/mailboxes/",
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/mailboxes/"
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/mailboxes/")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getoneprofile.ai/mailboxes/")
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{
"items": [
{
"connection_status": "connected",
"created_at": "2023-11-07T05:31:56Z",
"daily_send_limit": 123,
"disconnected_at": "2023-11-07T05:31:56Z",
"disconnected_reason": "<string>",
"email_address": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"provider": "google_workspace",
"sender_profile_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"updated_at": "2023-11-07T05:31:56Z",
"bounce_rate": 123,
"last_verified_at": "2023-11-07T05:31:56Z",
"reply_rate": 123,
"usage": {
"sent_today": 123,
"sent_yesterday": 123
}
}
],
"total": 123
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>",
"issues": [
{
"input": "<string>",
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"detail": "<string>"
}{
"detail": "<string>"
}{
"detail": "<string>"
}Authorizations
Query Parameters
320Whether the mailbox's grant currently authenticates.
connected, disconnected The three states the Status column draws, as one filterable value.
DERIVED, never stored: it folds connection_status together with whether
last_verified_at holds a stamp. A mailbox nobody has checked since it
connected and one checked this morning are different answers to "is this
grant still good?", and the ops screen has to be able to ask for either.
Deliberately NOT members of :class:MailboxConnectionStatus. That enum is
the stored column type and the value on every mailbox response, and eleven
places in the domain compare against CONNECTED by identity. A third
member there would put a value on the wire that no row can hold and would
silently weaken every one of those checks. Two callers also already send
connection_status=connected meaning "not broken" (the send-a-test picker
and the notification settings page), and they must keep that meaning.
verified, connected, disconnected Which email provider a mailbox connects through.
Only Google Workspace ships so far; every provider is implemented behind
providers.EmailProviderBase so Office 365 and IMAP/SMTP can be added
later without touching callers.
GOOGLE_WORKSPACE holds a per-mailbox OAuth grant (consent screen,
refresh token). GOOGLE_WORKSPACE_DWD holds no grant at all: tokens are
minted on demand via domain-wide delegation as the platform service
account, so its rows carry an empty refresh_token forever. It is the path
imported fleets (e.g. InboxKit) connect through.
google_workspace, google_workspace_dwd Which of a mailbox's days the Mailboxes grid narrows to: its sender's today or yesterday.
today, yesterday ^(email_address|display_name|provider|connection_status|sender_profile_id)$^(asc|desc)$1 <= x <= 200x >= 0Was this page helpful?