Create an IP pool

Create an IP pool owned by your account with the wemail API to group dedicated IPs and route selected traffic through them, separately from the shared pools.

Creates a pool owned by your account. The pool is immediately visible in GET /v3/pools and its IPs join the GET /v3/ips inventory.

POST /v3/pools

Body parameters

ParameterTypeRequiredDescription
namestringRequiredDisplay name (max 255 chars).
providerstringRequiredDelivery backend the pool's IPs belong to: cloud-relay or apifon-postal. Immutable after creation.
regionstringOptionalSending region label (max 50 chars), e.g. europe-west.
typestringOptionaldedicated, shared or warming. Default shared.
ipsarray of stringsOptionalIPs assigned to the pool — each must be a valid IPv4 or IPv6 literal, up to 256 per pool. Default empty.

Responses

StatusDescription
201Created. The full pool object, including its generated id.
400Validation error — missing name, provider isn't one of the supported backends, or ips contains a value that isn't a valid IP literal / exceeds 256 entries.
401Missing or invalid API key.
403Plan limit. Dedicated IP pools aren't available on your plan — upgrade to a plan that includes dedicated IPs to create pools.

Code examples

cURL
curl -X POST https://api.wemail.io/v3/pools \
  -H "Authorization: Bearer afn_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "transactional-eu",
    "provider": "apifon-postal",
    "region": "europe-west",
    "type": "dedicated",
    "ips": ["203.0.113.10"]
  }'

# List pools visible to your account (own + platform-shared)
curl https://api.wemail.io/v3/pools -H "Authorization: Bearer afn_live_…"

# Flattened IP inventory, optionally filtered by pool
curl "https://api.wemail.io/v3/ips?pool_id=<uuid>" -H "Authorization: Bearer afn_live_…"
Node.js
const pool = await wemail.pools.create({
  name: "transactional-eu",
  provider: "apifon-postal",
  region: "europe-west",
  type: "dedicated",
  ips: ["203.0.113.10"],
});

const { items } = await wemail.ips.list({ pool_id: pool.id });
Python
pool = wemail.pools.create(
    name="transactional-eu",
    provider="apifon-postal",
    region="europe-west",
    type="dedicated",
    ips=["203.0.113.10"],
)

ips = wemail.ips.list(pool_id=pool.id)
PHP
$pool = $wemail->pools->create([
    'name'     => 'transactional-eu',
    'provider' => 'apifon-postal',
    'region'   => 'europe-west',
    'type'     => 'dedicated',
    'ips'      => ['203.0.113.10'],
]);
$ips = $wemail->ips->list(['pool_id' => $pool->id]);
Ruby
pool = wemail.pools.create(
  name: "transactional-eu",
  provider: "apifon-postal",
  region: "europe-west",
  type: "dedicated",
  ips: ["203.0.113.10"]
)
ips = wemail.ips.list(pool_id: pool.id)
Go
pool, err := client.Pools.Create(ctx, &wemail.PoolParams{
    Name:     "transactional-eu",
    Provider: "apifon-postal",
    Region:   "europe-west",
    Type:     "dedicated",
    IPs:      []string{"203.0.113.10"},
})
ips, _ := client.IPs.List(ctx, &wemail.IPListParams{PoolID: pool.ID})
Java
Pool pool = wemail.pools().create(
  PoolParams.builder()
    .name("transactional-eu")
    .provider("apifon-postal")
    .region("europe-west")
    .type("dedicated")
    .ip("203.0.113.10")
    .build());
IpPage ips = wemail.ips().list(IpListParams.builder().poolId(pool.getId()).build());
.NET
var pool = await wemail.Pools.CreateAsync(new PoolParams {
  Name = "transactional-eu",
  Provider = "apifon-postal",
  Region = "europe-west",
  Type = "dedicated",
  Ips = new[] { "203.0.113.10" },
});
var ips = await wemail.Ips.ListAsync(new IpListParams { PoolId = pool.Id });
ResponseExample response
{
  "items": [
    {
      "id": "5f2d8a1e-3b7c-4c1d-9e2f-8a1b2c3d4e5f",
      "name": "transactional-eu",
      "provider": "apifon-postal",
      "region": "europe-west",
      "type": "dedicated",
      "ips": ["203.0.113.10"],
      "reputation": 98,
      "created_at": "2026-05-10T09:42:18Z"
    }
  ],
  "pagination": { "page": 1, "per_page": 25, "total_count": 1, "total_pages": 1 }
}