curl --request POST \
--url https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/purchase \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"mailboxes": [
{
"username": "john.doe",
"firstName": "John",
"lastName": "Doe",
"needToWarmUp": true
},
{
"username": "jane.roe",
"firstName": "Jane",
"lastName": "Roe",
"ownerUserId": 42
}
]
}
'import requests
url = "https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/purchase"
payload = { "mailboxes": [
{
"username": "john.doe",
"firstName": "John",
"lastName": "Doe",
"needToWarmUp": True
},
{
"username": "jane.roe",
"firstName": "Jane",
"lastName": "Roe",
"ownerUserId": 42
}
] }
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', needToWarmUp: true},
{username: 'jane.roe', firstName: 'Jane', lastName: 'Roe', ownerUserId: 42}
]
})
};
fetch('https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/purchase', 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/purchase",
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',
'needToWarmUp' => true
],
[
'username' => 'jane.roe',
'firstName' => 'Jane',
'lastName' => 'Roe',
'ownerUserId' => 42
]
]
]),
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/purchase"
payload := strings.NewReader("{\n \"mailboxes\": [\n {\n \"username\": \"john.doe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"needToWarmUp\": true\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\",\n \"ownerUserId\": 42\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/purchase")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"mailboxes\": [\n {\n \"username\": \"john.doe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"needToWarmUp\": true\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\",\n \"ownerUserId\": 42\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/purchase")
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 \"needToWarmUp\": true\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\",\n \"ownerUserId\": 42\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"jobId": "3f2b9c1e-5d47-4a8b-9f10-2c6de8a71b34"
}Add mailboxes
Coming soon. This endpoint will be available by late October 2026.
channels:write scope (or a broader one that includes it).
Adds mailboxes to a domain your team already bought. Seats your plan already covers are free; extra seats are charged to the payment card on file.
Send mailboxes with 1 to 5 entries. A domain holds at most 5 mailboxes, existing ones included. isAdmin may be true on one entry only, and only when the domain has no admin mailbox yet.
Take domainId from GET /v3/email-accounts/procurement/domains. Returns a jobId — poll GET /v3/background-jobs/ for the outcome.
When the job ends as Failed, its jsonDataResult carries an errorCode and a top-level failureMessage. Only procurementOrder.submitFailed can follow a charge.
errorCode | Meaning |
|---|---|
procurementOrder.domainNotFound | The domain was removed before the order ran. |
procurementOrder.validation | The mailbox configuration was rejected, the domain cannot take mailboxes yet, or the current plan cannot take the order. |
procurementOrder.noPaymentMethod | Extra seats must be bought and no payment card is on file. Add one in billing settings, then retry. |
procurementOrder.paymentDeclined | The payment provider declined the payment. |
procurementOrder.paymentActionRequired | The saved payment method needs interactive authentication. Complete it in the app, then retry. |
procurementOrder.temporarilyUnavailable | A transient failure. Retry — unless failureMessage says the order may have been placed; then contact support first. |
procurementOrder.unknown | The order could not be reliably priced. Retry, or contact support. |
procurementOrder.submitFailed | The order was submitted, and paid when extra seats were needed, but could not be confirmed with the provider. Contact support before ordering again. |
curl --request POST \
--url https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/purchase \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"mailboxes": [
{
"username": "john.doe",
"firstName": "John",
"lastName": "Doe",
"needToWarmUp": true
},
{
"username": "jane.roe",
"firstName": "Jane",
"lastName": "Roe",
"ownerUserId": 42
}
]
}
'import requests
url = "https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/purchase"
payload = { "mailboxes": [
{
"username": "john.doe",
"firstName": "John",
"lastName": "Doe",
"needToWarmUp": True
},
{
"username": "jane.roe",
"firstName": "Jane",
"lastName": "Roe",
"ownerUserId": 42
}
] }
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', needToWarmUp: true},
{username: 'jane.roe', firstName: 'Jane', lastName: 'Roe', ownerUserId: 42}
]
})
};
fetch('https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/purchase', 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/purchase",
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',
'needToWarmUp' => true
],
[
'username' => 'jane.roe',
'firstName' => 'Jane',
'lastName' => 'Roe',
'ownerUserId' => 42
]
]
]),
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/purchase"
payload := strings.NewReader("{\n \"mailboxes\": [\n {\n \"username\": \"john.doe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"needToWarmUp\": true\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\",\n \"ownerUserId\": 42\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/purchase")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"mailboxes\": [\n {\n \"username\": \"john.doe\",\n \"firstName\": \"John\",\n \"lastName\": \"Doe\",\n \"needToWarmUp\": true\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\",\n \"ownerUserId\": 42\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/email-accounts/procurement/domains/{domainId}/mailboxes/purchase")
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 \"needToWarmUp\": true\n },\n {\n \"username\": \"jane.roe\",\n \"firstName\": \"Jane\",\n \"lastName\": \"Roe\",\n \"ownerUserId\": 42\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"jobId": "3f2b9c1e-5d47-4a8b-9f10-2c6de8a71b34"
}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
Mailboxes to create on the domain. 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
Order accepted; poll the returned job for the outcome
Poll GET /v3/background-jobs/{jobId} for the outcome