curl --request PATCH \
--url https://api.reply.io/v3/email-accounts/{id}/procurement \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"firstName": "Jane",
"lastName": "O'Neil"
}
EOFimport requests
url = "https://api.reply.io/v3/email-accounts/{id}/procurement"
payload = {
"firstName": "Jane",
"lastName": "O'Neil"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({firstName: 'Jane', lastName: 'O\'Neil'})
};
fetch('https://api.reply.io/v3/email-accounts/{id}/procurement', 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/{id}/procurement",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'firstName' => 'Jane',
'lastName' => 'O\'Neil'
]),
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/{id}/procurement"
payload := strings.NewReader("{\n \"firstName\": \"Jane\",\n \"lastName\": \"O'Neil\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.reply.io/v3/email-accounts/{id}/procurement")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"Jane\",\n \"lastName\": \"O'Neil\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/email-accounts/{id}/procurement")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"firstName\": \"Jane\",\n \"lastName\": \"O'Neil\"\n}"
response = http.request(request)
puts response.read_body{
"jobId": "3f6c2a1e-8b4d-4c1f-9a7e-5d2b0c6e9f14"
}Update a purchased mailbox's profile
Coming soon. This endpoint will be available by mid December 2026.
channels:write scope (or a broader one that includes it).
Changes the first name, last name or profile picture of a mailbox your team bought through mailbox procurement. Send only the fields to change; a field left out stays as it is. null and an empty string are rejected, because the provider cannot clear a value.
Only an active mailbox can be updated, one update at a time. Each mailbox allows 2 updates per day, and the limit resets at midnight UTC. Updates made in the app count toward the same limit; an update the provider rejects does not. Requires access to the team’s settings.
Returns a jobId — poll GET /v3/background-jobs/ for the outcome. The job stays Processing until the provider confirms the update, which can take up to 60 minutes. When it ends as Done, its jsonDataResult carries emailAccountId, firstName, lastName and avatarUrl as the provider applied them; avatarUrl is the URL the provider reports, which can differ from the one you sent.
When the job ends as Failed, its jsonDataResult carries an errorCode and a failureMessage:
errorCode | Meaning |
|---|---|
emailAccountProcurement.notFound | The mailbox no longer exists. Nothing was sent to the provider. |
emailAccountProcurement.mailboxNotActive | The mailbox stopped being active before the update was sent. Nothing was sent to the provider. |
emailAccountProcurement.temporarilyUnavailable | A temporary error stopped the update before it was sent to the provider. Retry. |
emailAccountProcurement.updateRejected | The provider rejected the update, so nothing was changed and the attempt does not count toward the daily limit. Check the requested values, then retry. |
emailAccountProcurement.updateNotConfirmed | The provider did not confirm the update within 60 minutes. It may still be applied, and the attempt counts toward the daily limit. Check the mailbox before retrying. |
If the job ends as Cancelled, the update was not sent to the provider; retry. If it ends as Expired, the outcome is unknown: check the mailbox before retrying.
curl --request PATCH \
--url https://api.reply.io/v3/email-accounts/{id}/procurement \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"firstName": "Jane",
"lastName": "O'Neil"
}
EOFimport requests
url = "https://api.reply.io/v3/email-accounts/{id}/procurement"
payload = {
"firstName": "Jane",
"lastName": "O'Neil"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({firstName: 'Jane', lastName: 'O\'Neil'})
};
fetch('https://api.reply.io/v3/email-accounts/{id}/procurement', 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/{id}/procurement",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'firstName' => 'Jane',
'lastName' => 'O\'Neil'
]),
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/{id}/procurement"
payload := strings.NewReader("{\n \"firstName\": \"Jane\",\n \"lastName\": \"O'Neil\"\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.reply.io/v3/email-accounts/{id}/procurement")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"Jane\",\n \"lastName\": \"O'Neil\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/email-accounts/{id}/procurement")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"firstName\": \"Jane\",\n \"lastName\": \"O'Neil\"\n}"
response = http.request(request)
puts response.read_body{
"jobId": "3f6c2a1e-8b4d-4c1f-9a7e-5d2b0c6e9f14"
}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
Email account ID of the purchased mailbox
x >= 1Body
The profile values to set on a purchased mailbox. Send at least one field. A field left out is not changed; null and an empty string are rejected, because the provider cannot clear a value.
Latin letters, digits, spaces and the punctuation . , - ' & / ( ) # ", with no leading or trailing space, up to 127 characters.
1 - 127^(?! )[A-Za-z0-9 .,'&/()#"-]{1,127}(?<! )$Latin letters, digits, spaces and the punctuation . , - ' & / ( ) # ", with no leading or trailing space, up to 127 characters.
1 - 127^(?! )[A-Za-z0-9 .,'&/()#"-]{1,127}(?<! )$HTTP or HTTPS URL of the mailbox profile picture, up to 500 characters
500Response
The update was scheduled; poll the returned job for the outcome
Poll GET /v3/background-jobs/{jobId} for the outcome