API reference · Networking / Public IPs
Public IPs
Public addresses for VPC instances, with static NAT or port forwarding.
A public IP belongs to a VPC. With purpose static_nat every port of the address maps to one instance. With port_forwarding the address carries rules, each forwarding a port or range to an instance in the VPC. With load_balancer it carries load balancers, one per public port.
The public IP object
Fields
idstringrequirede.g.
pip_....network_idstringrequirednetwork_namestring or nullThe VPC's name.
purposestringrequiredstatic_natmaps every port to one instance;port_forwardingcarries per-port rules.One of
static_nat,port_forwarding,load_balancer.addressstring or nullThe public IPv4 address; null until allocated.
instance_idstring or nullstatic_nat: the instance it maps to; null while it is detached (still yours, and billed once).
instance_namestring or nullThe mapped instance's name; null when none.
regionstring or nullzonestring or nulldesired_statestringrequiredWhat you asked for:
present, ordeletedonce you deleted it.One of
present,deleted.observed_statestringrequiredWhat the platform last observed:
pendingandprovisioningwhile it is being created,activeonce ready,deleting/deletedon the way out,failedif it could not be made,unknownwhen it could not be checked.One of
pending,provisioning,active,deleting,deleted,failed,unknown.in_syncbooleanrequiredFalse while an attach or detach has not reached the address yet.
created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
The port forwarding rule object
Fields
idstringrequirede.g.
pfr_....public_ip_idstringrequiredinstance_idstringrequiredinstance_namestring or nullThe target instance's name; null when it is gone.
protocolstringrequiredtcporudp.One of
tcp,udp.public_port_startintegerrequiredpublic_port_endintegerrequiredprivate_port_startintegerrequiredprivate_port_endintegerrequireddesired_statestringrequiredWhat you asked for:
present, ordeletedonce you deleted it.One of
present,deleted.observed_statestringrequiredWhat the platform last observed:
pendingandprovisioningwhile it is being created,activeonce ready,deleting/deletedon the way out,failedif it could not be made,unknownwhen it could not be checked.One of
pending,provisioning,active,deleting,deleted,failed,unknown.created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
List public IPs
Your VPC public IPs, or one VPC's with network_id.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Query parameters
network_idstring
Response 200
Public IPs.dataarray of PublicIPrequiredShow 14 child fieldsHide child fields
idstringrequirede.g.
pip_....network_idstringrequirednetwork_namestring or nullThe VPC's name.
purposestringrequiredstatic_natmaps every port to one instance;port_forwardingcarries per-port rules.One of
static_nat,port_forwarding,load_balancer.addressstring or nullThe public IPv4 address; null until allocated.
instance_idstring or nullstatic_nat: the instance it maps to; null while it is detached (still yours, and billed once).
instance_namestring or nullThe mapped instance's name; null when none.
regionstring or nullzonestring or nulldesired_statestringrequiredWhat you asked for:
present, ordeletedonce you deleted it.One of
present,deleted.observed_statestringrequiredWhat the platform last observed:
pendingandprovisioningwhile it is being created,activeonce ready,deleting/deletedon the way out,failedif it could not be made,unknownwhen it could not be checked.One of
pending,provisioning,active,deleting,deleted,failed,unknown.in_syncbooleanrequiredFalse while an attach or detach has not reached the address yet.
created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
next_cursorstring or nullrequiredAlways null: this list is returned whole.
Errors
- 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
NOT_FOUND: public IPs are not offered on this platform yet. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/public-ips" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"id": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
"network_id": "net_06gk3x9tq7m2v8r4y1c5d0zp8w",
"network_name": "prod",
"purpose": "static_nat",
"address": "102.211.122.80",
"instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"instance_name": "web-1",
"region": "af-abj",
"zone": "af-abj-1",
"desired_state": "present",
"observed_state": "active",
"in_sync": true,
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}
],
"next_cursor": null
}Allocate a public IP
Allocates a public IPv4 address for a VPC. static_nat (the default) maps every port of the address to one instance in network_id, sent as instance_id; port_forwarding, where offered, carries per-port rules instead (add them with Add a port forwarding rule). The network must be active. A public IP is billed monthly: see Price a public IP.
Returns 202 Accepted with an operation_id (also in the Location header). The change happens in the background: poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed; a failed operation carries a stable failure.code and a readable failure.reason. The address is in the public IP's address once it succeeds.
Send an Idempotency-Key. A retry with the same key returns the original operation instead of making the change twice.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Body
application/jsonnetwork_idstringrequiredThe VPC network to allocate the address in. It must be active.
purposestringstatic_natmaps every port to one instance (instance_id).port_forwardingcarries per-port rules instead, andload_balancercarries load balancers. Defaults tostatic_nat.One of
static_nat,port_forwarding,load_balancer. Defaults tostatic_nat.instance_idstringFor
static_natonly: an instance innetwork_idwithout a public IP. Leave it out to reserve the address now and attach it later (POST /public/v1/public-ips/{public_ip_id}/attach). Leave out forport_forwardingandload_balancer.
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value.INVALID_REQUEST_BODY: the body is not a single valid JSON object. Send one JSON object with the fields documented for this endpoint. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: this API key has only thereadscope. Use a key withwriteaccess.FORBIDDEN: the member who created this key may not do this in the organization, or has left it. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server. An owner can turn it on in the console under Organization › AI apps.STATIC_NAT_LIMIT_EXCEEDED: your organization has reached its limit of static NAT public IPs. Release one you no longer need, or contact support for a higher limit.PUBLIC_IP_LIMIT_EXCEEDED: your organization has reached its limit of public IPs of any purpose (20 by default). Release one you no longer need, or contact support for a higher limit. - 404
NOT_FOUND: public IPs are not offered on this platform yet.RESOURCE_NOT_FOUND:network_idis not one of your VPC networks. - 409
NETWORK_NOT_READY: public IPs can only be added to an active VPC network. Wait for the network to be active.INSTANCE_ALREADY_HAS_PUBLIC_IP: the instance already has a public IP. Release it before adding another.ACCOUNT_SUSPENDED: an invoice is overdue, or the organization was suspended for non-payment. Pay the outstanding invoice in the console, then retry.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 413
REQUEST_TOO_LARGE: the body is larger than 64 KiB. Send a smaller request. - 422
VALIDATION_FAILED: a field is invalid. Each entry oferrorsnames thefieldand itscode:network_idREQUIRED: send the VPC network.purposePURPOSE_NOT_AVAILABLE: usestatic_nat,port_forwardingorload_balancer.instance_idINSTANCE_NOT_IN_NETWORK: the instance is not innetwork_id.instance_idNOT_ALLOWED: aport_forwardingaddress takes no instance; each rule names its own.UNKNOWN_FIELD: the body has a field this endpoint does not take (named infield). Remove it or fix its spelling. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/public-ips" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"network_id": "net_06gk3x9tq7m2v8r4y1c5d0zp8w",
"instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w"
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Price a public IP
What one more public IP costs per month, in your organization's currency.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Response 200
The price.currencystringrequiredNGNorUSD.monthly_minorintegerrequiredPrice for a full month in minor units of
currency.nominal_month_hoursintegerrequiredHours in the month the price assumes: 730.
Errors
- 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
NOT_FOUND: cost quotes are not available on this platform yet. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/public-ips/quote" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"currency": "NGN",
"monthly_minor": 1700000,
"nominal_month_hours": 730
}Get a public IP
One public IP, with the instance it maps to.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
public_ip_idstringrequiredThe resource's id.
Response 200
The public IP.idstringrequirede.g.
pip_....network_idstringrequirednetwork_namestring or nullThe VPC's name.
purposestringrequiredstatic_natmaps every port to one instance;port_forwardingcarries per-port rules.One of
static_nat,port_forwarding,load_balancer.addressstring or nullThe public IPv4 address; null until allocated.
instance_idstring or nullstatic_nat: the instance it maps to; null while it is detached (still yours, and billed once).
instance_namestring or nullThe mapped instance's name; null when none.
regionstring or nullzonestring or nulldesired_statestringrequiredWhat you asked for:
present, ordeletedonce you deleted it.One of
present,deleted.observed_statestringrequiredWhat the platform last observed:
pendingandprovisioningwhile it is being created,activeonce ready,deleting/deletedon the way out,failedif it could not be made,unknownwhen it could not be checked.One of
pending,provisioning,active,deleting,deleted,failed,unknown.in_syncbooleanrequiredFalse while an attach or detach has not reached the address yet.
created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
Errors
- 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no public IP with this id in your organization, or the id is not a public IP id (pip_…). Check the id.NOT_FOUND: public IPs are not offered on this platform yet. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/public-ips/pip_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"id": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
"network_id": "net_06gk3x9tq7m2v8r4y1c5d0zp8w",
"network_name": "prod",
"purpose": "static_nat",
"address": "102.211.122.80",
"instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"instance_name": "web-1",
"region": "af-abj",
"zone": "af-abj-1",
"desired_state": "present",
"observed_state": "active",
"in_sync": true,
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}Release a public IP
Releases a public IP. The address is returned to the pool and may be given to someone else; billing stops when the operation succeeds. Delete its port forwarding rules first.
Returns 202 Accepted with an operation_id (also in the Location header). The change happens in the background: poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed; a failed operation carries a stable failure.code and a readable failure.reason.
Send an Idempotency-Key. A retry with the same key returns the original operation instead of making the change twice.
Scope: write. Destructive: an AI app's key also needs delete.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Path parameters
public_ip_idstringrequiredThe resource's id.
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no public IP with this id in your organization, or the id is not a public IP id (pip_…). Check the id.NOT_FOUND: public IPs are not offered on this platform yet. - 409
PUBLIC_IP_HAS_PORT_FORWARDS: delete this address's port forwarding rules first.PUBLIC_IP_HAS_LOAD_BALANCERS: delete this address's load balancers first.INVALID_RESOURCE_STATE: the public IP cannot do this in its current state, for example while it is being created or deleted. Wait for its current operation to finish, then retry.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 422
VALIDATION_FAILEDwith noerrorsentry: the platform refused the request, for example because the resource has already been deleted. Read the resource to check its state. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X DELETE "https://api.pantechdynamics.com/public/v1/public-ips/pip_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Attach a public IP to an instance
Points a static NAT public IP at an instance in the same private network (VPC), keeping the address. Use it to move an address from one instance to another without releasing it: you keep the same IP and pay for it once. If the address is attached elsewhere it moves; the instance must not already have a static NAT address of its own.
Returns 202 Accepted with an operation_id (also in the Location header). Poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed. While it runs the address shows in_sync: false. Send an Idempotency-Key; a change that changes nothing returns an empty operation_id.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Path parameters
public_ip_idstringrequiredThe resource's id.
Body
application/jsoninstance_idstringrequiredAn instance in the address's private network.
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no public IP with this id in your organization, or the id is not a public IP id (pip_…). Check the id.NOT_FOUND: public IPs are not offered on this platform yet. - 409
PUBLIC_IP_NOT_STATIC_NAT: only a static NAT address can be attached or detached; port forwarding and load balancer addresses use their rules.INSTANCE_ALREADY_HAS_PUBLIC_IP: the instance already has a static NAT address. Detach or release that one first.INVALID_RESOURCE_STATE: the public IP cannot do this in its current state, for example while it is being created or deleted. Wait for its current operation to finish, then retry.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 422
VALIDATION_FAILED:instance_idREQUIRED, orINSTANCE_NOT_IN_NETWORK(the instance must be in the address's private network). With noerrorsentry: the platform refused the request, for example because the instance is deleted. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/public-ips/pip_06gk3x9tq7m2v8r4y1c5d0zp8w/attach" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w"
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}List port forwarding rules
The address's port forwarding rules.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
public_ip_idstringrequiredThe resource's id.
Response 200
The rules.dataarray of PortForwardingRulerequiredShow 13 child fieldsHide child fields
idstringrequirede.g.
pfr_....public_ip_idstringrequiredinstance_idstringrequiredinstance_namestring or nullThe target instance's name; null when it is gone.
protocolstringrequiredtcporudp.One of
tcp,udp.public_port_startintegerrequiredpublic_port_endintegerrequiredprivate_port_startintegerrequiredprivate_port_endintegerrequireddesired_statestringrequiredWhat you asked for:
present, ordeletedonce you deleted it.One of
present,deleted.observed_statestringrequiredWhat the platform last observed:
pendingandprovisioningwhile it is being created,activeonce ready,deleting/deletedon the way out,failedif it could not be made,unknownwhen it could not be checked.One of
pending,provisioning,active,deleting,deleted,failed,unknown.created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
next_cursorstring or nullrequiredAlways null: this list is returned whole.
Errors
- 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no public IP with this id in your organization, or the id is not a public IP id (pip_…). Check the id.NOT_FOUND: port forwarding is not offered on this platform yet. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/public-ips/pip_06gk3x9tq7m2v8r4y1c5d0zp8w/port-forwarding-rules" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"id": "pfr_06gk3x9tq7m2v8r4y1c5d0zp8w",
"public_ip_id": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
"instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"instance_name": "web-1",
"protocol": "tcp",
"public_port_start": 443,
"public_port_end": 443,
"private_port_start": 8443,
"private_port_end": 8443,
"desired_state": "present",
"observed_state": "active",
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}
],
"next_cursor": null
}Detach a public IP from its instance
Unmaps a static NAT public IP from its instance. The address stays yours (and is billed once, as before) until you attach it to another instance or release it. The instance keeps running and can then be deleted.
Returns 202 Accepted with an operation_id (also in the Location header). Poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed. While it runs the address shows in_sync: false. Send an Idempotency-Key; a change that changes nothing returns an empty operation_id.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Path parameters
public_ip_idstringrequiredThe resource's id.
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no public IP with this id in your organization, or the id is not a public IP id (pip_…). Check the id.NOT_FOUND: public IPs are not offered on this platform yet. - 409
PUBLIC_IP_NOT_STATIC_NAT: only a static NAT address can be attached or detached; port forwarding and load balancer addresses use their rules.INVALID_RESOURCE_STATE: the public IP cannot do this in its current state, for example while it is being created or deleted. Wait for its current operation to finish, then retry.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 422
VALIDATION_FAILEDwith noerrorsentry: the platform refused the request, for example because the resource has already been deleted. Read the resource to check its state. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/public-ips/pip_06gk3x9tq7m2v8r4y1c5d0zp8w/detach" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Add a port forwarding rule
Forwards a port or range of a port_forwarding public IP to an instance in its VPC. Defaults: public_port_end equals public_port_start, and the private range equals the public one (or starts at private_port_start with the same width).
Returns 202 Accepted with an operation_id (also in the Location header). The change happens in the background: poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed; a failed operation carries a stable failure.code and a readable failure.reason. The rule's id is the operation's resource_id.
Send an Idempotency-Key. A retry with the same key returns the original operation instead of making the change twice.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Path parameters
public_ip_idstringrequiredThe resource's id.
Body
application/jsoninstance_idstringrequiredAn instance in the public IP's VPC.
protocolstringrequiredtcporudp.One of
tcp,udp.public_port_startintegerrequiredFirst public port, 1 to 65535.
public_port_endintegerLast public port. Defaults to
public_port_start(one port).private_port_startintegerFirst port on the instance. Defaults to
public_port_start.private_port_endintegerLast port on the instance; the private range must be as wide as the public one. Defaults to match it.
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value.INVALID_REQUEST_BODY: the body is not a single valid JSON object. Send one JSON object with the fields documented for this endpoint. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no public IP with this id in your organization, or the id is not a public IP id (pip_…). Check the id.NOT_FOUND: port forwarding is not offered on this platform yet. - 409
PUBLIC_IP_NOT_FOR_PORT_FORWARDING: use an active public IP withpurposeport_forwarding.PORTS_IN_USE: another rule on this address already forwards some of these ports for this protocol. Choose other ports, or delete that rule.INVALID_RESOURCE_STATE: the public IP cannot do this in its current state, for example while it is being created or deleted. Wait for its current operation to finish, then retry.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 413
REQUEST_TOO_LARGE: the body is larger than 64 KiB. Send a smaller request. - 422
VALIDATION_FAILED: a field is invalid. Each entry oferrorsnames thefieldand itscode:instance_idorprotocolREQUIRED: send both.instance_idINSTANCE_NOT_IN_NETWORK: the instance is not in the address's VPC.public_port_startINVALID_PORTS: usetcporudp, ports 1 to 65535, and public and private ranges of the same width.UNKNOWN_FIELD: the body has a field this endpoint does not take (named infield). Remove it or fix its spelling. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/public-ips/pip_06gk3x9tq7m2v8r4y1c5d0zp8w/port-forwarding-rules" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"protocol": "tcp",
"public_port_start": 443
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "pfr_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Get a port forwarding rule
One port forwarding rule on the address.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
public_ip_idstringrequiredThe resource's id.
rule_idstringrequiredThe rule's id (
aclr_...for a firewall rule,pfr_...for a port forwarding rule).
Response 200
The rule.idstringrequirede.g.
pfr_....public_ip_idstringrequiredinstance_idstringrequiredinstance_namestring or nullThe target instance's name; null when it is gone.
protocolstringrequiredtcporudp.One of
tcp,udp.public_port_startintegerrequiredpublic_port_endintegerrequiredprivate_port_startintegerrequiredprivate_port_endintegerrequireddesired_statestringrequiredWhat you asked for:
present, ordeletedonce you deleted it.One of
present,deleted.observed_statestringrequiredWhat the platform last observed:
pendingandprovisioningwhile it is being created,activeonce ready,deleting/deletedon the way out,failedif it could not be made,unknownwhen it could not be checked.One of
pending,provisioning,active,deleting,deleted,failed,unknown.created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
Errors
- 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no rule with this id on this address, or no such address in your organization. Check both ids.NOT_FOUND: port forwarding is not offered on this platform yet. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/public-ips/pip_06gk3x9tq7m2v8r4y1c5d0zp8w/port-forwarding-rules/pfr_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"id": "pfr_06gk3x9tq7m2v8r4y1c5d0zp8w",
"public_ip_id": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
"instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"instance_name": "web-1",
"protocol": "tcp",
"public_port_start": 443,
"public_port_end": 443,
"private_port_start": 8443,
"private_port_end": 8443,
"desired_state": "present",
"observed_state": "active",
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}Delete a port forwarding rule
Deletes one port forwarding rule. Traffic to those ports stops once the operation succeeds.
Returns 202 Accepted with an operation_id (also in the Location header). The change happens in the background: poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed; a failed operation carries a stable failure.code and a readable failure.reason.
Send an Idempotency-Key. A retry with the same key returns the original operation instead of making the change twice.
Scope: write. Destructive: an AI app's key also needs delete.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Path parameters
rule_idstringrequiredThe rule's id (
aclr_...for a firewall rule,pfr_...for a port forwarding rule).
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no port forwarding rule with this id in your organization, or the id is not a port forwarding rule id (pfr_…). Check the id.NOT_FOUND: port forwarding is not offered on this platform yet. - 409
INVALID_RESOURCE_STATE: the port forwarding rule cannot do this in its current state, for example while it is being created or deleted. Wait for its current operation to finish, then retry.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 422
VALIDATION_FAILEDwith noerrorsentry: the platform refused the request, for example because the resource has already been deleted. Read the resource to check its state. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X DELETE "https://api.pantechdynamics.com/public/v1/port-forwarding-rules/pfr_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "pfr_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}