Dedicated IPs
Send from your own dedicated IP addresses for maximum deliverability control and reputation isolation.
Why Dedicated IPs?
By default, emails are sent from shared IP addresses. Dedicated IPs give you full control over your sending reputation:
- Reputation isolation - Your deliverability is not affected by other senders
- Predictable delivery - Consistent inbox placement based on your own sending behavior
- Full control - Manage warming, volume, and pool assignments
Request a Dedicated IP
Provision a new dedicated IP address for your organization. New IPs start with a provisioning status and must be warmed before sending at full volume.
POST /v1/dedicated-ipsconst ip = await client.dedicatedIps.create();
console.log(ip.ipAddress); // '10.123.45.67'
console.log(ip.status); // 'provisioning'IP Status
| Status | Description |
|---|---|
provisioning | IP is being allocated and configured |
warming | IP is going through the warming schedule |
active | IP is fully warmed and ready for full volume |
cooldown | IP is in cooldown period before release |
released | IP has been returned to the pool |
IP Warming
New dedicated IPs must be warmed before sending at full volume. The warming process gradually increases your sending volume over 14 days to build a positive reputation with mailbox providers.
Do Not Skip Warming
Sending high volumes from a cold IP address will result in emails being rejected or placed in spam. Always follow the warming schedule.
POST /v1/dedicated-ips/:id/warmupconst ip = await client.dedicatedIps.startWarmup('ip_xxxxx');
console.log(ip.status); // 'warming'
console.log(ip.warmingSchedule);
// {
// totalDays: 14,
// days: [
// { day: 1, dailyLimit: 50, cumulativeProgress: 0.07 },
// { day: 2, dailyLimit: 100, cumulativeProgress: 0.14 },
// ...
// { day: 14, dailyLimit: -1, cumulativeProgress: 1.0 }
// ]
// }Warming Schedule
The 14-day warming plan gradually increases your daily sending limit:
| Day | Daily Limit | Progress |
|---|---|---|
| 1 | 50 | 7% |
| 3 | 250 | 21% |
| 7 | 5,000 | 50% |
| 10 | 40,000 | 71% |
| 14 | Unlimited | 100% |
Check Warming Progress
GET /v1/dedicated-ips/:idconst ip = await client.dedicatedIps.get('ip_xxxxx');
console.log(ip.warmup.progress); // 0.5 (50%)
console.log(ip.warmup.currentDailyLimit); // 5000
console.log(ip.warmup.startedAt); // '2025-01-10T10:00:00Z'IP Pools
Organize your dedicated IPs into pools to separate traffic types. For example, create separate pools for transactional and marketing emails to isolate their reputations.
Create a Pool
POST /v1/dedicated-ips/poolsconst pool = await client.dedicatedIps.createPool({
name: 'Transactional',
isDefault: true,
});
console.log(pool.id); // 'pool_xxxxx'
console.log(pool.name); // 'Transactional'Add IPs to a Pool
POST /v1/dedicated-ips/pools/:poolId/ipsconst ip = await client.dedicatedIps.addIpToPool('pool_xxxxx', {
ipId: 'ip_xxxxx',
});
console.log(ip.poolId); // 'pool_xxxxx'List Pools
GET /v1/dedicated-ips/poolsconst { data: pools } = await client.dedicatedIps.listPools();
for (const pool of pools) {
console.log(`${pool.name}: ${pool.ipCount} IPs (default: ${pool.isDefault})`);
}List Dedicated IPs
GET /v1/dedicated-ipsconst { data: ips } = await client.dedicatedIps.list();
for (const ip of ips) {
console.log(`${ip.ipAddress}: ${ip.status} (${Math.round(ip.warmup.progress * 100)}%)`);
}Release a Dedicated IP
Release a dedicated IP when you no longer need it. The IP will be removed from any pool it belongs to.
DELETE /v1/dedicated-ips/:idawait client.dedicatedIps.release('ip_xxxxx');Python SDK
# Request and warm an IP
ip = client.dedicated_ips.create()
ip = client.dedicated_ips.start_warmup(ip["id"])
# Create a pool and assign the IP
pool = client.dedicated_ips.create_pool(name="Transactional", is_default=True)
client.dedicated_ips.add_ip_to_pool(pool["id"], ip_id=ip["id"])
# Check warming progress
ip = client.dedicated_ips.get(ip["id"])
print(f"Progress: {ip['warmup']['progress'] * 100}%")