Update a dedicated IP
Move the IP to another pool, or pause/resume its warm-up ramp. One change applies per request. pool_id takes precedence over warm-up changes. Otherwise, use warmup_paused or warmup.paused; a Boolean warmup_paused takes precedence. Moving the last IP out of a pool requires force: true and drain: true. The PTR hostname is managed by Telnyx: a request that includes ptr_hostname returns 422 unless pool_id or a warm-up field is present, in which case ptr_hostname is ignored.
curl --request PATCH \
--url https://api.telnyx.com/v2/email/dedicated_ips/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"pool_id": "9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b",
"weight": 100
}
'import requests
url = "https://api.telnyx.com/v2/email/dedicated_ips/{id}"
payload = {
"pool_id": "9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b",
"weight": 100
}
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({pool_id: '9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b', weight: 100})
};
fetch('https://api.telnyx.com/v2/email/dedicated_ips/{id}', 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.telnyx.com/v2/email/dedicated_ips/{id}",
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([
'pool_id' => '9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b',
'weight' => 100
]),
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.telnyx.com/v2/email/dedicated_ips/{id}"
payload := strings.NewReader("{\n \"pool_id\": \"9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b\",\n \"weight\": 100\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.telnyx.com/v2/email/dedicated_ips/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"pool_id\": \"9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b\",\n \"weight\": 100\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.telnyx.com/v2/email/dedicated_ips/{id}")
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 \"pool_id\": \"9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b\",\n \"weight\": 100\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "6a7f9a30-1234-4b5c-8d9e-0f1a2b3c4d5e",
"record_type": "dedicated_ip",
"ip_address": "64.16.239.170",
"ip_version": "ipv4",
"pool_id": "9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b",
"region": "ewr-nj1",
"status": "warming_up",
"warmup": {
"started_at": "2026-10-14T20:36:50.000000Z",
"progress": 25,
"daily_cap": 32000,
"paused": false,
"paused_at": null,
"today": {
"day": "2026-10-24",
"cap": 32000,
"granted": 1250,
"remaining": 30750
}
},
"billing": {
"status": "active",
"charged": true
},
"provisioning_status": "dns_confirmed",
"provisioning": {
"dns_status": "dns_confirmed",
"ptr_request_state": "confirmed",
"ptr_request_pr_url": null,
"checklist": {
"ptr_requested": true,
"ptr_authored": false,
"ptr_merged": true,
"forward_confirmed": true
}
},
"ptr_hostname": "mta-64-16-239-170.msgtelnyx.com",
"dns_confirmed_at": "2026-10-14T20:12:41.552310Z",
"quarantine_until": null,
"released_at": null,
"suspension_reason": null,
"created_at": "2026-09-30T02:03:09.474123Z",
"updated_at": "2026-10-24T00:00:12.118402Z"
}
}Authorizations
Telnyx API key supplied as Authorization: Bearer <token>. In production, auth may be validated by the API gateway and forwarded via Telnyx auth headers.
Path Parameters
The dedicated IP identifier (UUID).
Body
Applies one change per request. pool_id takes precedence over warm-up changes: when it is present, the IP moves to that pool (with weight, force, and drain) and other fields are ignored. Otherwise, use warmup_paused or warmup.paused; a Boolean warmup_paused takes precedence. The PTR hostname is managed by Telnyx and cannot be changed: when neither pool_id nor a warm-up field is present, a body that includes ptr_hostname (including null) returns 422 and the IP is unchanged. A body with none of these fields returns the IP unchanged.
Move the IP to this pool, replacing its current membership. Use the IP's current pool to change only its weight. To take an IP out of a pool, use DELETE /email/ip_pools/{id}/ips/{ip_id}.
Routing weight in the target pool. Used only with pool_id.
x >= 1Set together with drain: true to move the last IP out of its current pool. Used only with pool_id.
Set together with force: true to move the last IP out of its current pool. Acknowledges that mail routed to the emptied pool is held. Used only with pool_id.
Pause (true) or resume (false) the warm-up ramp; equivalent to the pause_warmup and resume_warmup actions. A Boolean value takes precedence over warmup.paused. When a pause field is present and pool_id is absent, supplying neither pause field as a Boolean invokes resume.
Alias for warmup_paused.
Show child attributes
Show child attributes
Response
Updated dedicated IP
A dedicated sending IP address owned by the account.
Show child attributes
Show child attributes
Was this page helpful?
curl --request PATCH \
--url https://api.telnyx.com/v2/email/dedicated_ips/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"pool_id": "9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b",
"weight": 100
}
'import requests
url = "https://api.telnyx.com/v2/email/dedicated_ips/{id}"
payload = {
"pool_id": "9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b",
"weight": 100
}
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({pool_id: '9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b', weight: 100})
};
fetch('https://api.telnyx.com/v2/email/dedicated_ips/{id}', 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.telnyx.com/v2/email/dedicated_ips/{id}",
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([
'pool_id' => '9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b',
'weight' => 100
]),
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.telnyx.com/v2/email/dedicated_ips/{id}"
payload := strings.NewReader("{\n \"pool_id\": \"9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b\",\n \"weight\": 100\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.telnyx.com/v2/email/dedicated_ips/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"pool_id\": \"9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b\",\n \"weight\": 100\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.telnyx.com/v2/email/dedicated_ips/{id}")
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 \"pool_id\": \"9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b\",\n \"weight\": 100\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "6a7f9a30-1234-4b5c-8d9e-0f1a2b3c4d5e",
"record_type": "dedicated_ip",
"ip_address": "64.16.239.170",
"ip_version": "ipv4",
"pool_id": "9b1c4d70-abcd-4e5f-8a9b-0c1d2e3f4a5b",
"region": "ewr-nj1",
"status": "warming_up",
"warmup": {
"started_at": "2026-10-14T20:36:50.000000Z",
"progress": 25,
"daily_cap": 32000,
"paused": false,
"paused_at": null,
"today": {
"day": "2026-10-24",
"cap": 32000,
"granted": 1250,
"remaining": 30750
}
},
"billing": {
"status": "active",
"charged": true
},
"provisioning_status": "dns_confirmed",
"provisioning": {
"dns_status": "dns_confirmed",
"ptr_request_state": "confirmed",
"ptr_request_pr_url": null,
"checklist": {
"ptr_requested": true,
"ptr_authored": false,
"ptr_merged": true,
"forward_confirmed": true
}
},
"ptr_hostname": "mta-64-16-239-170.msgtelnyx.com",
"dns_confirmed_at": "2026-10-14T20:12:41.552310Z",
"quarantine_until": null,
"released_at": null,
"suspension_reason": null,
"created_at": "2026-09-30T02:03:09.474123Z",
"updated_at": "2026-10-24T00:00:12.118402Z"
}
}