Matrix: M34
Open in panel — /app/ips
Configuration

Egress IP Management

PostMTA supports multiple egress IP strategies: PostMTA-owned dedicated IPs, shared IPs from a common pool, and Bring Your Own (BYO) IPs that you manage and warm up independently. This page covers pool types, IP assignment, warmup schedules, and rotation procedures.

Pool Types

Dedicated Pool

A dedicated IP is assigned exclusively to your workspace. You have full control over its warmup schedule, reputation, and rotation. Dedicated IPs are ideal for high-volume senders with distinct sending identities (e.g., different brands or product lines).

Shared Pool

Shared IPs are owned and warmed up by PostMTA. Multiple workspaces send through the same pool, sharing the warmup reputation benefit. PostMTA manages warmup schedules and IP rotation for all shared IPs.

Bring Your Own (BYO)

You can add your own IP addresses to PostMTA and manage them as a separate pool. BYO IPs are ideal for enterprises that need full IP ownership for compliance or routing requirements, or that already have warmed IPs with established reputation.

IP Assignment

Per-Domain Assignment

Assign specific IPs or pools to individual sending domains. This is useful when each sending domain has its own reputation tier or warmup state.

curl -X POST https://api.postmta.com/v1/ip-pools \
  -H "Authorization: Bearer pmta_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "pool_name": "example-com-dedicated",
    "pool_type": "dedicated",
    "ip_addresses": [
      "203.0.113.10",
      "203.0.113.11",
      "203.0.113.12"
    ],
    "default_for_domain": "mail.example.com",
    "warmup_ladder": "default_30day"
  }'

To assign this pool to a specific sending domain:

curl -X PUT https://api.postmta.com/v1/domains/mail.example.com/ip-assignment \
  -H "Authorization: Bearer pmta_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "pool_id": "pool_01HXPOOL001",
    "strategy": "round_robin"
  }'

Global Pool Assignment

Assign a default IP pool to a workspace. All sending domains that do not have an explicit per-domain assignment use the workspace default.

curl -X PUT https://api.postmta.com/v1/workspaces/ws_01HXABC123DEF456/ip-pool \
  -H "Authorization: Bearer pmta_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "pool_id": "pool_01HXPOOL001",
    "strategy": "least_used"
  }'

Assignment Strategies

StrategyDescriptionBest For
round_robinDistributes sends evenly across all IPs in the poolBalanced warmup across multiple IPs
least_usedSends to the IP with the most available daily quota remainingMaximising throughput within warmup limits
stickyAll sends to a given recipient domain always use the same source IPReputation continuity for known heavy recipients

Warmup Schedule

Each IP in a dedicated or BYO pool follows a warmup schedule independently. The warmup schedule limits the daily send volume through the IP to give recipient mail servers time to learn and trust the new source.

Warmup Phases

PhaseDaysDaily LimitBurst CapNotes
Phase 11-710050/hrSeed to known good domains (Gmail, Microsoft, Yahoo) first
Phase 28-14500200/hrExpand to broader ISP audience
Phase 315-215,0001,000/hrBroad sending. Watch bounce rate carefully.
Phase 422+20,000+4x dailyFull production volume
Shared pool warmup: PostMTA manages warmup for all shared IPs automatically. You cannot override the warmup schedule on shared IPs. If you need precise control, use a dedicated or BYO pool.

IP Rotation

Rotation Triggers

An IP should be rotated out of active service (cooled down) when:

Rotation Procedure

To rotate an IP out of service and bring a replacement into rotation:

curl -X POST https://api.postmta.com/v1/ip-pools/pool_01HXPOOL001/rotate \
  -H "Authorization: Bearer pmta_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "remove_ip": "203.0.113.10",
    "add_ip": "203.0.113.20",
    "drain_strategy": "graceful",
    "drain_window_hours": 24,
    "warmup_ladder": "default_30day"
  }'

The drain_strategy options:

StrategyBehaviour
gracefulStop routing new deliveries through the IP; allow in-flight messages to complete. The IP cools down over the drain window.
immediateStop all new and in-flight deliveries immediately. Use only in emergencies.

BYO IP Onboarding

To add your own IP addresses to PostMTA:

Step 1: Verify IP Ownership

Confirm you control the IP by responding to a Challenge-Response challenge sent by PostMTA to the IP's port 25 or via DNS:

curl -X POST https://api.postmta.com/v1/ip-pools/byo/verify \
  -H "Authorization: Bearer pmta_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "ip_address": "198.51.100.42",
    "verification_method": "dns_txt",
    "domain": "mail.example.com"
  }'

Step 2: Configure rDNS

Set a valid rDNS (PTR record) for each BYO IP, pointing to your sending domain:

42.100.51.198.in-addr.arpo.  IN  PTR  mail.example.com.

PostMTA checks rDNS on every connection. An IP without a valid rDNS is rejected at connection time.

Step 3: Add to PostMTA

curl -X POST https://api.postmta.com/v1/ip-pools \
  -H "Authorization: Bearer pmta_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "pool_name": "my-byo-pool",
    "pool_type": "byo",
    "ip_addresses": [
      "198.51.100.42",
      "198.51.100.43"
    ],
    "warmup_ladder": "default_30day"
  }'

Step 4: Begin Warmup

Once the pool is created, the warmup ladder starts automatically. Monitor warmup progress in Settings → IP Pools → BYO Pool.

IP Monitoring

View per-IP reputation scores, blocklist status, and delivery rates:

curl https://api.postmta.com/v1/ip-pools/pool_01HXPOOL001/stats \
  -H "Authorization: Bearer pmta_live_xxxxxxxxxxxxxxxx"

Response:

{
  "pool_id": "pool_01HXPOOL001",
  "pool_name": "example-com-dedicated",
  "ips": [
    {
      "ip": "203.0.113.10",
      "status": "active",
      "warmup_day": 12,
      "warmup_phase": "phase_2",
      "daily_sent_today": 347,
      "daily_limit": 500,
      "reputation_score": 94,
      "blocklist_entries": 0,
      "bounce_rate_7d": 0.4
    },
    {
      "ip": "203.0.113.11",
      "status": "warmup",
      "warmup_day": 3,
      "warmup_phase": "phase_1",
      "daily_sent_today": 82,
      "daily_limit": 100,
      "reputation_score": 88,
      "blocklist_entries": 0,
      "bounce_rate_7d": 0.1
    }
  ]
}