Sign in to fill these examples with your own keys. Sign in Start free trial

Network

Available and owned sending IPs.

List the sending IPs you can buy and the ones you own, then add one to a cluster of the same class. Extra shared IPs are $15 a month. Dedicated IPs are $50 a month and used only by your team. One dedicated IP can serve several of your clusters of the same class. Shared addresses hide the last octet until they are assigned to one of your clusters. Dedicated addresses you own show in full. Paid adds return 403 {error: payment_required} when the team has no payment method. The errors match the Network page in the dashboard.

GET /api/v1/teams/:obfuscated_team_id/network

List available and owned sending IPs. Optional classification or cluster_id filters to that class.

  • classification: transactional or bulk
  • cluster_id: Public cluster id. Filters to that cluster's class.
request.sh
1curl -sS -X GET \ 2 -H 'Authorization: Bearer YOUR_API_KEY' \ 3 https://app.postshiba.com/api/v1/teams/KjkAJW/network
response.json
1[ 2 { 3 "id": "IpQwEr", 4 "address": "203.0.113.x", 5 "status": "active", 6 "warmup_ends_at": null, 7 "kind": "shared", 8 "classification": "transactional", 9 "provider": "aws", 10 "owned": false, 11 "available": true, 12 "cluster_ids": [], 13 "ip_pool_ids": [], 14 "feedback_loops": [] 15 } 16]

POST /api/v1/teams/:obfuscated_team_id/network

Buy or assign the chosen IP. Shared IPs require cluster_id. A dedicated IP may stay unassigned. If the cluster still sends on an IP of the other class, the new IP replaces it and takes its whole share. By default the new IP takes 10% and the cluster's current IPs share 90%. To choose the split, send split custom with percents keyed by each current IP's id (from the cluster's sending_ips or this list) plus new for the added IP, for example {split: custom, percents: {ip_id: 1, new: 99}}. Percents are whole numbers of at least 1 that add up to 100. Paid adds return 403 {error: payment_required} when the team has no payment method. Returns 422 sku_unprovisioned when that IP product has no price yet, and 422 empty_inventory, class_mismatch, cluster_required, already_claimed, cooling_down, weights, or in_ip_pool when the IP is in one of your IP pools. A dedicated IP starts a 14-day warm-up the first time it joins a cluster. While warming, status is warming and warmup_ends_at says when it sends at full rate. See Errors for each.

request.sh
1curl -sS -X POST \ 2 -H 'Authorization: Bearer YOUR_API_KEY' \ 3 -H 'Content-Type: application/json' \ 4 -d '{"ip_address_id":"IpQwEr","cluster_id":"NmQpXr"}' \ 5 https://app.postshiba.com/api/v1/teams/KjkAJW/network
response.json
1{ 2 "id": "IpQwEr", 3 "address": "203.0.113.x", 4 "status": "active", 5 "warmup_ends_at": null, 6 "kind": "shared", 7 "classification": "transactional", 8 "provider": "aws", 9 "owned": false, 10 "available": false, 11 "cluster_ids": [ 12 "NmQpXr" 13 ], 14 "ip_pool_ids": [], 15 "feedback_loops": [] 16}

POST /api/v1/teams/:obfuscated_team_id/network/assign

Assign an owned dedicated IP to a same-class cluster. The IP can already sit on another of the team's same-class clusters. Takes the same split and percents as create. Returns 422 weights when percents miss a current IP, name an unknown one, or don't add up to 100. Returns 422 dedicated_taken when that cluster already has a dedicated IP, and 422 in_ip_pool when the IP is in one of your IP pools. An IP sends from a cluster's default pool or from IP pools, never both.

request.sh
1curl -sS -X POST \ 2 -H 'Authorization: Bearer YOUR_API_KEY' \ 3 -H 'Content-Type: application/json' \ 4 -d '{"ip_address_id":"IpQwEr","cluster_id":"NmQpXr"}' \ 5 https://app.postshiba.com/api/v1/teams/KjkAJW/network/assign
response.json
1{ 2 "id": "IpQwEr", 3 "address": "198.51.100.10", 4 "status": "warming", 5 "warmup_ends_at": "2026-09-25T12:00:00Z", 6 "kind": "dedicated", 7 "classification": "transactional", 8 "provider": "aws", 9 "owned": true, 10 "available": false, 11 "cluster_ids": [ 12 "NmQpXr" 13 ], 14 "ip_pool_ids": [], 15 "feedback_loops": [] 16}

POST /api/v1/teams/:obfuscated_team_id/network/unassign

Remove an IP from a cluster. Returns 422 last_ip when it is the cluster's only sending IP.

request.sh
1curl -sS -X POST \ 2 -H 'Authorization: Bearer YOUR_API_KEY' \ 3 -H 'Content-Type: application/json' \ 4 -d '{"ip_address_id":"IpQwEr","cluster_id":"NmQpXr"}' \ 5 https://app.postshiba.com/api/v1/teams/KjkAJW/network/unassign
response.json
1{ 2 "id": "IpQwEr", 3 "address": "203.0.113.x", 4 "status": "active", 5 "warmup_ends_at": null, 6 "kind": "shared", 7 "classification": "transactional", 8 "provider": "aws", 9 "owned": false, 10 "available": true, 11 "cluster_ids": [], 12 "ip_pool_ids": [], 13 "feedback_loops": [] 14}

POST /api/v1/teams/:obfuscated_team_id/network/switch

Replace the included shared IP with another same-class shared IP. Free. No card required.

request.sh
1curl -sS -X POST \ 2 -H 'Authorization: Bearer YOUR_API_KEY' \ 3 -H 'Content-Type: application/json' \ 4 -d '{"ip_address_id":"IpQwEr","cluster_id":"NmQpXr"}' \ 5 https://app.postshiba.com/api/v1/teams/KjkAJW/network/switch
response.json
1{ 2 "id": "IpQwEr", 3 "address": "203.0.113.x", 4 "status": "active", 5 "warmup_ends_at": null, 6 "kind": "shared", 7 "classification": "transactional", 8 "provider": "aws", 9 "owned": false, 10 "available": false, 11 "cluster_ids": [ 12 "NmQpXr" 13 ], 14 "ip_pool_ids": [], 15 "feedback_loops": [] 16}

POST /api/v1/teams/:obfuscated_team_id/network/release

Return an owned dedicated IP to inventory and stop the bill. The IP rests for 30 days before any team can buy it again, and the next owner warms it up from the start. Release also removes the IP from every IP pool. Returns 422 last_ip when a cluster still has only that IP.

request.sh
1curl -sS -X POST \ 2 -H 'Authorization: Bearer YOUR_API_KEY' \ 3 -H 'Content-Type: application/json' \ 4 -d '{"ip_address_id":"IpQwEr"}' \ 5 https://app.postshiba.com/api/v1/teams/KjkAJW/network/release
response.json
1{ 2 "id": "IpQwEr", 3 "address": "198.51.100.x", 4 "status": "reserved", 5 "warmup_ends_at": null, 6 "kind": "dedicated", 7 "classification": "transactional", 8 "provider": "aws", 9 "owned": false, 10 "available": false, 11 "cluster_ids": [], 12 "ip_pool_ids": [], 13 "feedback_loops": [] 14}