curl --request GET \
--url https://app.pixie.ai/api/email/accounts/warmup-analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.pixie.ai/api/email/accounts/warmup-analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.pixie.ai/api/email/accounts/warmup-analytics', 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://app.pixie.ai/api/email/accounts/warmup-analytics",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://app.pixie.ai/api/email/accounts/warmup-analytics"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.pixie.ai/api/email/accounts/warmup-analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.pixie.ai/api/email/accounts/warmup-analytics")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"analytics": {},
"transitions": {}
}{
"error": "<string>"
}{
"error": "<string>"
}Get Warmup Analytics
Fetch current warmup analytics and auto-apply status transitions for every warming/warmed/active inbox.
curl --request GET \
--url https://app.pixie.ai/api/email/accounts/warmup-analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.pixie.ai/api/email/accounts/warmup-analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.pixie.ai/api/email/accounts/warmup-analytics', 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://app.pixie.ai/api/email/accounts/warmup-analytics",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://app.pixie.ai/api/email/accounts/warmup-analytics"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.pixie.ai/api/email/accounts/warmup-analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.pixie.ai/api/email/accounts/warmup-analytics")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"analytics": {},
"transitions": {}
}{
"error": "<string>"
}{
"error": "<string>"
}pixie email account warmup-analytic
Overview
Separated fromGET /api/email/accounts so the UI can render the account list immediately and lazy-load the slower warmup data without blocking the page. Two things happen in one pass:
- Analytics fetch. For every account with
warmup_status ∈ {warming, warmed, active}and a setemail_address, we pulltotal_sent,total_received,health_score,warmup_reputation(0–100), anddaily_datafrom the warmup provider. Fetches are serialised to avoid provider rate limits. - Auto-transitions. Two transitions are applied inline and reflected in the
transitionsmap:- Ban / suspend: if the provider warmup status is
-1(banned),-2(spam unknown), or-3(suspended), we set ourwarmup_statustobanned/suspendedandstatustoerror. - Graduate: if a
warmingaccount haswarmup_reputation ≥ 90ANDtotal_sent ≥ 200, we flip bothwarmup_statusandstatustoactive.
- Ban / suspend: if the provider warmup status is
AI agent notes
warmup_reputation climbs slowly and the daily counts update incrementally. Expect graduation (warming → active) in roughly 2–3 weeks for a new inbox, not hours. Polling this endpoint more than once every few minutes is wasteful.Reading the response:analyticsis keyed byaccounts.id— not by email address.- Accounts that failed their warmup analytics fetch are silently omitted from
analytics. Check the account list for which IDs you expected. transitionsis a diff, not a snapshot. It only contains entries for rows that changed status on this call — empty object{}means nothing flipped.
status: "active", not warmup_status. An active account is send-eligible; a warming account blocks campaign emails.When an account turns banned: alert the user. There is no retry path — the user must create a new email address on the same domain (or a new domain).Chains with: retryAccountWarmup for stalled pending accounts, launchCampaign once all senders are active.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Response
Per-account warmup analytics plus any status transitions applied on this call.
Map of accounts.id → analytics payload. Only accounts with warmup_status ∈ {warming, warmed, active} and a set email_address are included. Accounts that failed to fetch because of a warmup-provider error are silently omitted.
Show child attributes
Show child attributes
Map of accounts.id → the status change applied during this call. Present only when a graduation or ban/suspend actually flipped the row — empty object {} if nothing changed. Use this to refresh UI state without re-reading accounts.
Show child attributes
Show child attributes
Was this page helpful?