curl --request GET \
--url https://api.openmail.sh/v1/limits/cold \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.openmail.sh/v1/limits/cold"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.openmail.sh/v1/limits/cold', 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.openmail.sh/v1/limits/cold",
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://api.openmail.sh/v1/limits/cold"
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://api.openmail.sh/v1/limits/cold")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.openmail.sh/v1/limits/cold")
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{
"mode": "reputation",
"unit": "new_recipients",
"resetsAt": "2023-11-07T05:31:56Z",
"reputationState": "good",
"account": {
"limit": 123,
"usedToday": 123,
"remaining": 123,
"floor": 123,
"ceiling": 123,
"coldStart": true,
"trustedVolume": true,
"avgNewPerDay7d": 123,
"lifetimeFirstContacts": 123,
"replyRate": 123,
"replySampleThreads": 123,
"growthMultiplier": 123,
"sustainPerDayToGrow": 123
},
"inbox": {
"id": "<string>",
"limit": 123,
"usedToday": 123,
"remaining": 123
},
"domains": [
{
"domain": "<string>",
"tier": 123,
"limit": 123,
"usedToday": 123,
"remaining": 123,
"ageDays": 123,
"lifetimeFirstContacts": 123,
"nextTier": {
"tier": 123,
"limit": 123,
"minAgeDays": 123,
"minLifetimeFirstContacts": 123,
"daysToGo": 123,
"contactsToGo": 123
},
"health": {
"state": "good",
"volume7d": 123,
"bounceRate7d": 123,
"complaintRate7d": 123
}
}
],
"internalDomains": [
{
"domain": "<string>",
"source": "sending",
"via": "<string>"
}
],
"nextStep": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Get cold outreach limits
Today’s caps on emailing new recipients — people who have never written to the inbox — and how much of each you have used. Returns the account cap, every verified custom domain’s warm-up tier and what unlocks the next one, and a nextStep sentence you can act on. Replies and follow-ups never count. Check this before a batch instead of discovering the cap through a 429.
An inbox-scoped key sees the account cap plus its own inbox and domain. An account-wide key sees everything; pass inboxId to include that inbox’s per-inbox cap and only its domain.
curl --request GET \
--url https://api.openmail.sh/v1/limits/cold \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.openmail.sh/v1/limits/cold"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.openmail.sh/v1/limits/cold', 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.openmail.sh/v1/limits/cold",
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://api.openmail.sh/v1/limits/cold"
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://api.openmail.sh/v1/limits/cold")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.openmail.sh/v1/limits/cold")
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{
"mode": "reputation",
"unit": "new_recipients",
"resetsAt": "2023-11-07T05:31:56Z",
"reputationState": "good",
"account": {
"limit": 123,
"usedToday": 123,
"remaining": 123,
"floor": 123,
"ceiling": 123,
"coldStart": true,
"trustedVolume": true,
"avgNewPerDay7d": 123,
"lifetimeFirstContacts": 123,
"replyRate": 123,
"replySampleThreads": 123,
"growthMultiplier": 123,
"sustainPerDayToGrow": 123
},
"inbox": {
"id": "<string>",
"limit": 123,
"usedToday": 123,
"remaining": 123
},
"domains": [
{
"domain": "<string>",
"tier": 123,
"limit": 123,
"usedToday": 123,
"remaining": 123,
"ageDays": 123,
"lifetimeFirstContacts": 123,
"nextTier": {
"tier": 123,
"limit": 123,
"minAgeDays": 123,
"minLifetimeFirstContacts": 123,
"daysToGo": 123,
"contactsToGo": 123
},
"health": {
"state": "good",
"volume7d": 123,
"bounceRate7d": 123,
"complaintRate7d": 123
}
}
],
"internalDomains": [
{
"domain": "<string>",
"source": "sending",
"via": "<string>"
}
],
"nextStep": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Include the per-inbox cap for this inbox and narrow domains to the one it sends from.
Response
Current cold outreach limits
Current cold outreach limits
reputation: caps count unique first-contacts and grow with your sending history. legacy: caps count every send to a never-inbound address and grow with account age.
reputation, legacy new_recipients, never_inbound_sends When today's counters reset (midnight UTC).
good, watch, throttled, suspended Show child attributes
Show child attributes
Per-inbox cap, when one applies to the inbox this key is scoped to (or inboxId was passed).
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Domains whose addresses never count as new recipients: your organisation's own. Subdomains are covered. source says what proved it — sending: the registrable domain of a verified custom domain; team: a member signed in with an address on it; txt: verified via POST /v1/owned-domains.
Show child attributes
Show child attributes
Plain-language summary: where you stand and what raises the cap.
Was this page helpful?