Pricing and eligibility
- Pricing: $14 per IP per month, charged as a monthly recurring charge (MRC) that starts at purchase.
- Billing: the charge continues while the IP is
provisioning,warming_up,active, orsuspended. It stops only when you release the IP. Thebillingobject on the IP reports the charge state. - Eligibility: purchases require a verified or enterprise account.
Other accounts receive
403. - Selection: the optional
region(supported value:ewr-nj1) andip_version(supported value:ipv4) fields onPOST /email/dedicated_ipseach restrict which stock IP is allocated; they never change the allocated IP’s metadata. An omitted field applies no restriction for that field.
Lifecycle
A dedicated IP moves through these statuses:Provisioning and reverse DNS
Dedicated IPs ship with a Telnyx-managed reverse DNS (PTR) record,mta-<a-b-c-d>.msgtelnyx.com — for example, mta-64-16-239-165.msgtelnyx.com
for 64.16.239.165. The hostname already resolves forward to the IP, and
Telnyx uses it as the EHLO hostname when sending from the IP. There is no
customer step to request or author the PTR record, and the hostname cannot be
changed: a PATCH /email/dedicated_ips/{id} request that includes
ptr_hostname (including null) returns 422 (code 10015), and the IP’s
hostname and DNS confirmation are unchanged. When the same request carries
pool_id or a warm-up pause field, that change applies and ptr_hostname is
ignored.
A purchased IP stays provisioning until you call
POST /email/dedicated_ips/{id}/actions/start_warmup. That call requires the
IP to be in provisioning status; warming_up, active, and released IPs
return 422. A suspended IP returns 409 (code 40901): only Telnyx can
lift a suspension. The call does not check DNS or pool membership.
The provisioning object is read-only status information:
An IP sends only while
dns_confirmed_at is set. Without it, the IP is
excluded from sending, and mail that depends on it is held — it never spills
over to the shared pool.
DNS for your sending domains
Dedicated IPs need no SPF change for domains whose SPF record already usesinclude:spf.telnyx.com, the record Telnyx asks you to publish for every
sending domain. Telnyx lists its dedicated sending IPs in spf.telnyx.com. See
Domains for the required records.
Warm-up
Every dedicated IP follows an automated warm-up ramp before reaching its full daily volume — the same principle as sender-domain graduation, applied per-IP. One warm-up engine per IP: per-IP and per-domain scopes never stack.- Start: the ramp starts only when you call
POST /email/dedicated_ips/{id}/actions/start_warmup. It never starts automatically, including after DNS is confirmed. - Progression: the ramp advances one stage for each UTC day on which the IP sent mail. Days without sends do not count, so an idle IP holds its stage.
- Completion: after 28 send-days, the IP moves to
activeautomatically. - Pause/resume:
POST /email/dedicated_ips/{id}/actions/pause_warmupand.../resume_warmuphold the ramp at its current stage and continue it. You can also PATCH the resource withwarmup_paused: true|falseorwarmup.paused; a Booleanwarmup_pausedtakes precedence. Pausing stops sending, not just progression: while paused, the IP releases no first-attempt sends from hold (see below) until you resume. Pause and resume apply only towarming_upIPs; other statuses return409. - Manual completion:
POST /email/dedicated_ips/{id}/actions/complete_warmupmoves awarming_upIP toactiveimmediately, bypassing the schedule — use only when you have independently warmed the IP elsewhere. Suspended IPs return409; other statuses return422. Completion setswarmup.progressto100, clearswarmup.daily_cap, and applies the ramp-complete allowance to the current UTC day:today.capbecomes100000000,today.grantedkeeps the sends already released today, andtoday.remainingbecomescap − granted. Once completion applies this allowance, an exhausted stage allowance does not block the next eligible first-attempt send. On anactiveIP,warmup.progressandwarmup.daily_capare informational: they can keep earlier values after a suspension is lifted and do not limit sending.
An IP under warm-up sends only up to its current stage cap. Do not attempt to
send around the cap: once the day’s allowance is spent, further first-attempt
sends are held in queue, not rejected, and retried about once a minute
until allowance is available — normally when the next UTC day arms a new
allowance. A held message waits at most 7 days: if it is still held after
7 days, it expires and is not delivered. Once released from hold, a message
gets the standard 72-hour delivery-retry window.
Checking today’s allowance
Thewarmup object on every dedicated IP carries a today block — the
live report card for the current UTC day (caps reset at UTC midnight):
today is null outside the warm-up window: before start_warmup, and after
release or suspension. A spent day reports the cap with remaining: 0 — that
combination is the deliberate “your mail is held for today” signal, distinct
from day-0’s cap: null (ramp not yet opened). The exception is an active
IP whose cap is below 100000000: that is a stored allowance awaiting
refresh, and it does not block the next eligible first-attempt send.
Failure semantics
- Unsupported purchase selector (422): a
regionorip_versionvalue other than the supported one — includingipv6, an empty string, ornull— returns422(code10015).source.pointernames the field anddetaillists the supported values. Nothing is allocated or waitlisted. - Out of stock / over capacity (429): when no dedicated IPs are available
for purchase (including none matching your
regionandip_version), or your account’s holding capacity is exceeded, the API returns429with ametaobject carryingretry_after_seconds(andwaitlist: truewhen your request was recorded on the waitlist). Nothing was allocated — retry after the indicated interval. - Billing unavailable (503): if billing could not be verified at purchase
time — or its admission decision could not be read — the API returns
503and nothing is allocated. A release returns503when billing is unavailable, and the IP is not released. Retry shortly. - No sendable IP holds traffic (no spillover): mail routed to a dedicated
pool is held when no IP in that pool can send — for example, when every
member is
provisioning,suspended, or not DNS-confirmed, or the pool is empty. Held mail never spills over to the shared pool, and it expires undelivered if it is still held after the 7-day limit described in Warm-up.
IP pools
Group dedicated IPs into pools to control which addresses carry your traffic:- Pools are account-scoped; optionally scope one to a specific email domain
(
domain_id). An account has at most one default pool (is_default: true). - Add/remove members with
POST /email/ip_pools/{id}/ipsandDELETE /email/ip_pools/{id}/ips/{ip_id}; each membership carries aweight(positive integer, default100) for traffic distribution. - An IP belongs to at most one pool; moving it (
PATCH /email/dedicated_ips/{id}withpool_id) removes it from the previous pool’s memberships. - Last-member protection: removing a pool’s last IP, moving it to another
pool, releasing it, or deleting a pool that still has IPs returns
409(code40901) unless you pass bothforce=trueanddrain=true. A routed pool left without a sendable IP holds its mail.
Pool routing
A dedicated IP carries mail only through a pool. For each message, Telnyx selects one of the sending account’s pools:- The pool scoped to the message’s sending domain (
domain_id). - Otherwise, the account’s default pool (
is_default: true). - Otherwise, no dedicated pool: the account sends on the shared Telnyx pool.
domain_id, which one is used is not
defined. Deleting a pool changes routing for subsequently resolved messages.
It does not reroute messages already assigned to the deleted pool.
To send from dedicated IPs:
- Call
start_warmupfor each IP. - Create a pool with
is_default: true(all sending domains) or withdomain_id(one domain), or set either field on an existing pool. - Add the IPs to that pool.
provisioning, that pool’s mail is held.
Releasing an IP
DELETE /email/dedicated_ips/{id} releases the IP:
- The IP stops sending immediately and leaves its pool.
statusbecomesreleased;released_atis set, andquarantine_untilis set to 30 days later. The address is not reassigned before then.- Release requests that the MRC stop asynchronously. Check
billing:stoppingmeans the stop is pending,stoppedmeans it completed, andstop_failedmeans the charge remains. If the charge was never created or its creation has not completed,billingkeeps showing the creation status (not_started,pending,in_progress, orfailed). - Any status except
releasedcan be released, includingsuspended. Releasing a released IP returns422. A released IP cannot be restarted.
Releasing a pool’s last IP without both
force=true and drain=true returns
409 (code 40901).