Access is invite-only during beta. Once invited, create a key to personalize these examples. Production sending requires a separate review.

Network

Available and owned sending IPs.

List available and owned sending IPs, then buy or assign a chosen IP of the cluster's class. Shared extra IPs are $15. Dedicated IPs are $50 exclusive proxies. One dedicated IP can sit on many of the owning team's same-class clusters. Shared addresses mask the last octet until assigned to one of your clusters. Dedicated addresses are full when the team owns the row. Returns 403 {error: payment_required} when Stripe billing is on and the team has no card. Same last_ip, class_mismatch, and empty_inventory errors as the Network page.

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
1 curl -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 "kind": "shared",
7 "classification": "transactional",
8 "provider": "aws",
9 "owned": false,
10 "available": true,
11 "cluster_ids": []
12 }
13 ]

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. Paid adds return 403 {error: payment_required} when Stripe billing is on and the team has no card. Returns 422 sku_unprovisioned when that SKU has no price id. Returns 422 empty_inventory, class_mismatch, cluster_required, already_claimed, or weights.

request.sh
1 curl -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 "kind": "shared",
6 "classification": "transactional",
7 "provider": "aws",
8 "owned": false,
9 "available": false,
10 "cluster_ids": [
11 "NmQpXr"
12 ]
13 }

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. Returns 422 dedicated_taken when that cluster already has a dedicated IP.

request.sh
1 curl -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": "active",
5 "kind": "dedicated",
6 "classification": "transactional",
7 "provider": "aws",
8 "owned": true,
9 "available": false,
10 "cluster_ids": [
11 "NmQpXr"
12 ]
13 }

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
1 curl -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 "kind": "shared",
6 "classification": "transactional",
7 "provider": "aws",
8 "owned": false,
9 "available": true,
10 "cluster_ids": []
11 }

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
1 curl -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 "kind": "shared",
6 "classification": "transactional",
7 "provider": "aws",
8 "owned": false,
9 "available": false,
10 "cluster_ids": [
11 "NmQpXr"
12 ]
13 }

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

Return an owned dedicated IP to inventory and stop the bill. Returns 422 last_ip when a cluster still has only that IP.

request.sh
1 curl -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": "active",
5 "kind": "dedicated",
6 "classification": "transactional",
7 "provider": "aws",
8 "owned": false,
9 "available": true,
10 "cluster_ids": []
11 }

About

PostShiba is the email platform that powers Bento behind the scenes. You can build your own products, like Bento, on top of it.

© 2026 PostShiba by Backpack Internet Pty. Ltd. All rights reserved.

The same policies that govern Bento are applied to PostShiba Privacy | Terms | Security