-
Keep a note next to each address for the VM, customer or usage you assign it to.
Send your API key as a bearer token on every request. Create a key on the API keys page.
Authorization: Bearer tt_live_...
https://taipantransit.com/api/v1
120 requests/minute total, 12 write requests/minute (anything other than GET), per key + IP. Exceeding either returns 429 with a Retry-After header.
Errors are returned as {"error": "message"} with a non-2xx status. Common codes: 401 invalid or missing key, 403 missing scope or account suspended, 404 not found, 422 invalid input, 402 insufficient wallet balance, 429 rate limited.
orders:readList your tunnels and their detailsendpoints:readList active tunnel endpointsrdns:readList your assigned IPv4 addressesnotes:writeEdit the label attached to each assigned IPv4abuse:readList abuse reports on your IPsservices:createCreate a new tunnel, debited from your walletservices:upgradeUpgrade a tunnel (debited from your wallet), or request a downgradeGET /orders · scope orders:read
curl https://taipantransit.com/api/v1/orders \ -H "Authorization: Bearer tt_live_..."
{
"orders": [
{
"id": "abc123",
"serviceType": "gre",
"status": "paid",
"tunnelId": "tun_xyz",
"endpoint": { "customer": "203.0.113.10", "taipan": "195.123.189.2" },
"routedIps": ["195.123.189.55"],
"ipNotes": { "195.123.189.55": "prod VM" },
"ipQuantity": 1,
"gbQuantity": 1000,
"termMonths": 1,
"monthlySubtotal": 2.7,
"total": 2.7,
"currency": "EUR",
"trafficUsedGb": 0,
"transitStatus": "active",
"createdAt": 1735689600000,
"updatedAt": 1735689600000
}
]
}
GET /endpoints · scope endpoints:read
{
"endpoints": [
{ "orderId": "abc123", "serviceType": "gre", "tunnelId": "tun_xyz", "customerEndpoint": "203.0.113.10", "taipanEndpoint": "195.123.189.2", "status": "active" }
]
}
GET /rdns · scope rdns:read
{
"ips": [
{ "ipAddress": "195.123.189.55", "serviceType": "gre", "serviceName": "GRE service", "orderId": "abc123" }
]
}
GET /abuse-reports · scope abuse:read
{ "reports": [] }
PATCH /orders/{type}/{id}/notes · scope notes:write
{type} is gre, ipsec or wireguard. Unlisted IPs keep no note; only IPs assigned to this order are accepted.
curl -X PATCH https://taipantransit.com/api/v1/orders/gre/abc123/notes \
-H "Authorization: Bearer tt_live_..." \
-H "Content-Type: application/json" \
-d '{"notes": {"195.123.189.55": "prod VM"}}'
POST /orders/{type} · scope services:create. Debited from your wallet immediately, fails with 402 if the balance is insufficient.
| Field | Type | Notes |
|---|---|---|
ipQuantity | integer | ≥ 1 |
gbQuantity | integer | ≥ 1000 (1000 GB is included free) |
termMonths | integer | 1, 3, 6 or 12. Sets the renewal cadence |
customerEndpoint | string | Your public IPv4. Required for gre/ipsec, and for wireguard unless dynamicEndpoint is true |
wireguardPublicKey | string | wireguard only, required |
ownerPop | string | wireguard only, required: paris or kansas |
dynamicEndpoint | boolean | wireguard only, optional. For CGNAT/no fixed IP |
curl -X POST https://taipantransit.com/api/v1/orders/gre \
-H "Authorization: Bearer tt_live_..." \
-H "Content-Type: application/json" \
-d '{"ipQuantity": 1, "gbQuantity": 1000, "termMonths": 1, "customerEndpoint": "203.0.113.10"}'
Returns 201 with { "order": {...} } (same shape as above), or 402 with {"error": "Insufficient wallet balance."}.
POST /orders/{type}/{id}/upgrade · scope services:upgrade. Same body fields as create (except termMonths, which stays the order's current term). Only accepted when the new configuration costs more per month than the current one; the prorated difference is debited immediately.
curl -X POST https://taipantransit.com/api/v1/orders/gre/abc123/upgrade \
-H "Authorization: Bearer tt_live_..." \
-H "Content-Type: application/json" \
-d '{"ipQuantity": 2, "gbQuantity": 1000, "customerEndpoint": "203.0.113.10"}'
{ "order": {...}, "charged": 0.7, "currency": "EUR" }
POST /orders/{type}/{id}/downgrade · scope services:upgrade. Same body as upgrade. Downgrades are never applied instantly: this opens a support ticket for our team to action, and returns it immediately.
{ "ok": true, "type": "downgrade", "ticket": {...}, "change": {...} }