curl --request POST \
--url https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"mailboxes": [
{
"username": "john.doe",
"firstName": "John",
"lastName": "Doe"
},
{
"username": "jane.roe",
"firstName": "Jane",
"lastName": "Roe"
}
]
}
'import requests
url = "https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate"
payload = { "mailboxes": [
{
"username": "john.doe",
"firstName": "John",
"lastName": "Doe"
},
{
"username": "jane.roe",
"firstName": "Jane",
"lastName": "Roe"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
mailboxes: [
{username: 'john.doe', firstName: 'John', lastName: 'Doe'},
{username: 'jane.roe', firstName: 'Jane', lastName: 'Roe'}
]
})
};
fetch('https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate', 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.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate",
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([
'mailboxes' => [
[
'username' => 'john.doe',
'firstName' => 'John',
'lastName' => 'Doe'
],
[
'username' => 'jane.roe',
'firstName' => 'Jane',
'lastName' => 'Roe'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate"
payload := strings.NewReader("{\n \"mailboxes\": [\n {\n \"username\": \"john.doe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\"\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"mailboxes\": [\n {\n \"username\": \"john.doe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\"\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"mailboxes\": [\n {\n \"username\": \"john.doe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\"\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"currency": "USD",
"mailboxSeats": {
"currentCount": 2,
"addedCount": 2,
"totalCount": 4,
"unitPrice": 400
},
"emailAccountSeats": {
"currentCount": 5,
"addedCount": 2,
"totalCount": 7,
"unitPrice": 1500
},
"subtotal": 3800,
"discount": 0,
"total": 3800
}Estimate mailbox cost
Coming soon. This endpoint will be available by late October 2026.
channels:read scope (or a broader one that includes it).
Price breakdown for adding mailboxes to a domain your team already bought — per-seat unit prices, subtotal, discount and total, all in cents. Call it before Add mailboxes to see what the order will charge.
Send mailboxes with 1 to 5 entries. A domain holds at most 5 mailboxes, existing ones included.
Take domainId from GET /v3/email-accounts/procurement/domains. The body matches Add mailboxes, so one body works for both.
curl --request POST \
--url https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"mailboxes": [
{
"username": "john.doe",
"firstName": "John",
"lastName": "Doe"
},
{
"username": "jane.roe",
"firstName": "Jane",
"lastName": "Roe"
}
]
}
'import requests
url = "https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate"
payload = { "mailboxes": [
{
"username": "john.doe",
"firstName": "John",
"lastName": "Doe"
},
{
"username": "jane.roe",
"firstName": "Jane",
"lastName": "Roe"
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
mailboxes: [
{username: 'john.doe', firstName: 'John', lastName: 'Doe'},
{username: 'jane.roe', firstName: 'Jane', lastName: 'Roe'}
]
})
};
fetch('https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate', 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.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate",
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([
'mailboxes' => [
[
'username' => 'john.doe',
'firstName' => 'John',
'lastName' => 'Doe'
],
[
'username' => 'jane.roe',
'firstName' => 'Jane',
'lastName' => 'Roe'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate"
payload := strings.NewReader("{\n \"mailboxes\": [\n {\n \"username\": \"john.doe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\"\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"mailboxes\": [\n {\n \"username\": \"john.doe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\"\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/estimate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"mailboxes\": [\n {\n \"username\": \"john.doe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\"\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"currency": "USD",
"mailboxSeats": {
"currentCount": 2,
"addedCount": 2,
"totalCount": 4,
"unitPrice": 400
},
"emailAccountSeats": {
"currentCount": 5,
"addedCount": 2,
"totalCount": 7,
"unitPrice": 1500
},
"subtotal": 3800,
"discount": 0,
"total": 3800
}Authorizations
Authenticate every request with a Bearer token. Pass your Reply API key in the
Authorization header:
Authorization: Bearer <your-api-key>
Get your API key from the Reply dashboard: Settings → API Key.
Path Parameters
ID of a domain your team bought
x >= 1Body
Same shape and rules as the Add mailboxes request body, so one body can be posted to both.
Mailboxes to price. Usernames must be unique within the request, and at most one entry may set isAdmin to true.
1 - 5 elementsShow child attributes
Show child attributes
Response
Estimated cost of adding the mailboxes
Every amount is in cents — 1299 means twelve dollars and ninety-nine cents. The domain is already owned, so it carries no price.
Currency the amounts are denominated in
Paid-seat counts and unit price for one seat type in an order estimate.
Show child attributes
Show child attributes
{
"currentCount": 3,
"addedCount": 2,
"totalCount": 5,
"unitPrice": 400
}
Paid-seat counts and unit price for one seat type in an order estimate.
Show child attributes
Show child attributes
{
"currentCount": 3,
"addedCount": 2,
"totalCount": 5,
"unitPrice": 400
}
Sum of all seat charges, in cents
Discount applied to the order. Currently always 0.
Amount charged if the mailboxes are added, in cents