API reference · Databases / Databases
Databases
Managed PostgreSQL, MySQL and MariaDB: create, power, secure, grow, snapshot and delete databases.
A database is a single-node PostgreSQL, MySQL or MariaDB server that the platform runs and patches for you, on its own VM sized by a plan. It never has a public address: connect to its hostname from your own network, through the CIDRs its access rules allow. See Managed databases for the guide.
Creating one places an order, paid for like an instance. Every other change returns an operation to follow. The admin password is never stored or returned, except once: in the response that generated it.
The data disk starts at the plan's size, or storage_gb, and grows later without a restart. Snapshots of it are crash-consistent copies, listed under the database and in the account's snapshots. Database error codes explains every refusal.
The database object
Fields
admin_usernamestringrequiredThe admin login to connect as: the one chosen at create, or
dbadmin.pantech_adminfor a database created before the login could be chosen.security_group_idsarray of stringrequiredYour security groups attached to the database, in the order attached (at most 5).
[]when none.effective_access_rulesarray of DatabaseEffectiveAccessRulerequiredThe allow-list as the database applies it: its own
access_rulesplus the ranges its security groups add, each range once under its first source. In effect onceobserved_generationequalsgeneration.Show 4 child fieldsHide child fields
cidrstringrequiredAn allowed IPv4 range, in canonical form.
protocolstringrequiredAlways
tcp.One of
tcp.portintegerrequiredThe engine's port: 5432 or 3306.
sourcestringrequiredWhere the range comes from:
access_rule, orsecurity_group:followed by the group's id (e.g.security_group:sg_…).
ignored_security_group_rulesarray of DatabaseIgnoredSecurityGroupRulerequiredRules of the attached security groups that add nothing to the database, and why.
[]when none.Show 6 child fieldsHide child fields
security_group_idstringrequiredThe attached group the rule belongs to.
directionstringrequiredThe rule's direction.
One of
ingress,egress.protocolstringrequiredThe rule's protocol.
One of
tcp,udp,icmp,all.port_rangestring or nullrequired80,3000-4000, or null for all ports.cidrstringrequiredThe rule's CIDR.
reasonstringrequiredWhy it adds nothing:
egress_rule,protocol_not_tcp(udp or icmp),port_not_covered(its ports exclude the engine's),cidr_too_wide(wider than /8, including0.0.0.0/0) orcidr_not_ipv4.One of
egress_rule,protocol_not_tcp,port_not_covered,cidr_too_wide,cidr_not_ipv4.
idstringrequiredThe database's id,
db_followed by 26 characters.namestringrequiredIts name, unique among your databases.
enginestringrequiredpostgresql,mysqlormariadb.One of
postgresql,mysql,mariadb.versionstringrequiredThe engine's version line, e.g.
18or8.4. Minor updates within the line are applied by the platform.portintegerrequiredThe TCP port to connect to: 5432 for PostgreSQL, 3306 for MySQL and MariaDB.
plan_idstringrequiredThe plan setting its vCPU and memory.
data_volume_size_gbintegerrequiredThe data disk's size in GB, as in place and billed.
pending_data_volume_size_gbinteger or nullrequiredThe size a storage resize in flight is growing the data disk to; null when none.
zone_idstringrequiredThe zone it runs in, e.g.
af-abj-2.subnet_idstring or nullrequiredIts VPC subnet in a VPC zone; null in a standard zone.
hostnamestring or nullrequiredThe name to connect to, e.g.
db-7k2q9x4m1a.af-abj-2.db.pantechdynamics.com. It resolves toprivate_ipand works only from where that address is reachable. Null until assigned.private_ipstring or nullrequiredThe database's private address, never public. Null until assigned.
desired_statestringrequiredWhat you asked for:
running,stoppedordeleted.One of
running,stopped,deleted.observed_statestringrequiredWhat the platform last observed. A change is complete when it matches
desired_state;failedmeans the last change could not be made (see the failure fields), andunknownmeans the platform could not check.One of
pending,provisioning,running,stopping,stopped,deleting,deleted,failed,unknown.generationintegerrequiredIncreases by one with every change you request.
observed_generationintegerrequiredThe
generationlast applied: equal togenerationonce the last change (access rules, security groups, password) is in effect.access_rulesarray of DatabaseAccessRulerequiredThe database's own allow-list, as set at create or with *Replace access rules*.
Show 3 child fieldsHide child fields
cidrstringrequiredAn allowed IPv4 range, in canonical form.
protocolstringrequiredAlways
tcp.One of
tcp.portintegerrequiredThe engine's port: 5432 or 3306.
failure_codestring or nullrequiredA stable code for why the last change failed; null when nothing failed. The failed operation's
failure.reasonexplains it.created_atstring or nullrequiredWhen it was created (RFC 3339, UTC).
updated_atstring or nullrequiredWhen it last changed (RFC 3339, UTC).
The database engine object
Fields
enginestringrequiredThe value
enginetakes in *Create a database*:postgresql,mysqlormariadb.display_namestringrequiredThe engine's name for display.
portintegerrequiredThe port its databases listen on: 5432 or 3306.
versionsarray of objectrequiredVersion lines offered for new databases, long-term-support lines only. Empty when none is offered right now.
Show 3 child fieldsHide child fields
versionstringrequiredeol_datestring or nullrequiredzonesarray of stringrequired
storagearray of objectrequiredThe data disk sizes a new database of this engine may have, per zone: use them for
storage_gbin *Create a database* and *Grow a database's storage*. One entry per zone where a version of this engine can be created and database storage is available. Read the allowed sizes from here rather than hard-coding them.Show 7 child fieldsHide child fields
zone_idstringrequiredThe zone, e.g.
af-abj-2.min_gbintegerrequiredThe zone's minimum data disk in GB. 0 means the plan's
disk_gbis the minimum; otherwise the minimum is the larger of the plan'sdisk_gband this value.At least 0.
min_is_plan_diskbooleanrequiredTrue when
min_gbis 0, so the chosen plan'sdisk_gbis the minimum.max_gbintegerrequiredThe largest data disk in GB.
step_gbintegerrequiredAbove the base size (the minimum),
storage_gbmust be a multiple of this.price_per_gb_month_minorinteger or nullrequiredPrice of one GB of data disk for a 730-hour month, in minor units of
currency; null when it could not be priced.currencystring or nullrequiredNGNorUSD; null when not priced.
List database engines
The engines and version lines you can create a managed database with: PostgreSQL, MySQL and MariaDB, long-term-support lines only. A version appears only while it is offered for new databases, and zones lists the zones it can be created in. An engine with no offered version has an empty versions list.
Use engine and a version from here, and a zone from that version's zones, in Create a database.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Response 200
The engines.dataarray of DatabaseEnginerequiredShow 5 child fieldsHide child fields
enginestringrequiredThe value
enginetakes in *Create a database*:postgresql,mysqlormariadb.display_namestringrequiredThe engine's name for display.
portintegerrequiredThe port its databases listen on: 5432 or 3306.
versionsarray of objectrequiredVersion lines offered for new databases, long-term-support lines only. Empty when none is offered right now.
Show 3 child fieldsHide child fields
versionstringrequiredeol_datestring or nullrequiredzonesarray of stringrequired
storagearray of objectrequiredThe data disk sizes a new database of this engine may have, per zone: use them for
storage_gbin *Create a database* and *Grow a database's storage*. One entry per zone where a version of this engine can be created and database storage is available. Read the allowed sizes from here rather than hard-coding them.Show 7 child fieldsHide child fields
zone_idstringrequiredThe zone, e.g.
af-abj-2.min_gbintegerrequiredThe zone's minimum data disk in GB. 0 means the plan's
disk_gbis the minimum; otherwise the minimum is the larger of the plan'sdisk_gband this value.At least 0.
min_is_plan_diskbooleanrequiredTrue when
min_gbis 0, so the chosen plan'sdisk_gbis the minimum.max_gbintegerrequiredThe largest data disk in GB.
step_gbintegerrequiredAbove the base size (the minimum),
storage_gbmust be a multiple of this.price_per_gb_month_minorinteger or nullrequiredPrice of one GB of data disk for a 730-hour month, in minor units of
currency; null when it could not be priced.currencystring or nullrequiredNGNorUSD; null when not priced.
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. - 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/database-engines" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"engine": "postgresql",
"display_name": "PostgreSQL",
"port": 5432,
"versions": [
{
"version": "18",
"eol_date": "2030-11-14",
"zones": [
"af-abj-2"
]
}
],
"storage": [
{
"zone_id": "af-abj-2",
"min_gb": 0,
"min_is_plan_disk": true,
"max_gb": 2000,
"step_gb": 10,
"price_per_gb_month_minor": 15000,
"currency": "NGN"
}
]
}
],
"next_cursor": null
}List databases
Your managed databases, oldest first, with each one's hostname, state and access rules. Filter by name with q, or by state. Never includes a password.
Databases whose create failed are hidden by default; list them with observed_state=failed (their failure is in failure_code), and delete them to clean up.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Query parameters
limitintegerItems per page, 1 to 100. Defaults to 50.
From 1 to 100. Defaults to
50.cursorstringThe previous page's
next_cursor, to get the next page. Leave out for the first page; keep the other parameters the same.qstringOnly items whose name contains this text (case-insensitive), at most 255 characters.
At most 255 characters.
desired_statestringOnly items with this
desired_state:running,stoppedordeleted.One of
running,stopped,deleted.observed_statestringOnly items with this
observed_state.One of
pending,provisioning,running,stopping,stopped,deleting,deleted,failed,unknown.
Response 200
A page of databases.dataarray of DatabaserequiredShow 24 child fieldsHide child fields
admin_usernamestringrequiredThe admin login to connect as: the one chosen at create, or
dbadmin.pantech_adminfor a database created before the login could be chosen.security_group_idsarray of stringrequiredYour security groups attached to the database, in the order attached (at most 5).
[]when none.effective_access_rulesarray of DatabaseEffectiveAccessRulerequiredThe allow-list as the database applies it: its own
access_rulesplus the ranges its security groups add, each range once under its first source. In effect onceobserved_generationequalsgeneration.Show 4 child fieldsHide child fields
cidrstringrequiredAn allowed IPv4 range, in canonical form.
protocolstringrequiredAlways
tcp.One of
tcp.portintegerrequiredThe engine's port: 5432 or 3306.
sourcestringrequiredWhere the range comes from:
access_rule, orsecurity_group:followed by the group's id (e.g.security_group:sg_…).
ignored_security_group_rulesarray of DatabaseIgnoredSecurityGroupRulerequiredRules of the attached security groups that add nothing to the database, and why.
[]when none.Show 6 child fieldsHide child fields
security_group_idstringrequiredThe attached group the rule belongs to.
directionstringrequiredThe rule's direction.
One of
ingress,egress.protocolstringrequiredThe rule's protocol.
One of
tcp,udp,icmp,all.port_rangestring or nullrequired80,3000-4000, or null for all ports.cidrstringrequiredThe rule's CIDR.
reasonstringrequiredWhy it adds nothing:
egress_rule,protocol_not_tcp(udp or icmp),port_not_covered(its ports exclude the engine's),cidr_too_wide(wider than /8, including0.0.0.0/0) orcidr_not_ipv4.One of
egress_rule,protocol_not_tcp,port_not_covered,cidr_too_wide,cidr_not_ipv4.
idstringrequiredThe database's id,
db_followed by 26 characters.namestringrequiredIts name, unique among your databases.
enginestringrequiredpostgresql,mysqlormariadb.One of
postgresql,mysql,mariadb.versionstringrequiredThe engine's version line, e.g.
18or8.4. Minor updates within the line are applied by the platform.portintegerrequiredThe TCP port to connect to: 5432 for PostgreSQL, 3306 for MySQL and MariaDB.
plan_idstringrequiredThe plan setting its vCPU and memory.
data_volume_size_gbintegerrequiredThe data disk's size in GB, as in place and billed.
pending_data_volume_size_gbinteger or nullrequiredThe size a storage resize in flight is growing the data disk to; null when none.
zone_idstringrequiredThe zone it runs in, e.g.
af-abj-2.subnet_idstring or nullrequiredIts VPC subnet in a VPC zone; null in a standard zone.
hostnamestring or nullrequiredThe name to connect to, e.g.
db-7k2q9x4m1a.af-abj-2.db.pantechdynamics.com. It resolves toprivate_ipand works only from where that address is reachable. Null until assigned.private_ipstring or nullrequiredThe database's private address, never public. Null until assigned.
desired_statestringrequiredWhat you asked for:
running,stoppedordeleted.One of
running,stopped,deleted.observed_statestringrequiredWhat the platform last observed. A change is complete when it matches
desired_state;failedmeans the last change could not be made (see the failure fields), andunknownmeans the platform could not check.One of
pending,provisioning,running,stopping,stopped,deleting,deleted,failed,unknown.generationintegerrequiredIncreases by one with every change you request.
observed_generationintegerrequiredThe
generationlast applied: equal togenerationonce the last change (access rules, security groups, password) is in effect.access_rulesarray of DatabaseAccessRulerequiredThe database's own allow-list, as set at create or with *Replace access rules*.
Show 3 child fieldsHide child fields
cidrstringrequiredAn allowed IPv4 range, in canonical form.
protocolstringrequiredAlways
tcp.One of
tcp.portintegerrequiredThe engine's port: 5432 or 3306.
failure_codestring or nullrequiredA stable code for why the last change failed; null when nothing failed. The failed operation's
failure.reasonexplains it.created_atstring or nullrequiredWhen it was created (RFC 3339, UTC).
updated_atstring or nullrequiredWhen it last changed (RFC 3339, UTC).
next_cursorstring or nullrequiredPass as
cursorfor the next page; null on the last page.
Errors
- 400
INVALID_PAGE:limitis not a whole number from 1 to 100. Send a value in that range, or leave it out for 50.INVALID_CURSOR:cursordoes not belong to this list with these filters. Start again without a cursor.INVALID_FILTER:qis longer than 255 characters, ordesired_stateorobserved_stateis not one of its listed values. Fix the parameter named indetail. - 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. - 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/databases" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"admin_username": "dbadmin",
"security_group_ids": [],
"effective_access_rules": [
{
"cidr": "10.0.1.0/24",
"protocol": "tcp",
"port": 5432,
"source": "access_rule"
}
],
"ignored_security_group_rules": [],
"id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "orders-db",
"engine": "postgresql",
"version": "18",
"port": 5432,
"plan_id": "starter",
"data_volume_size_gb": 80,
"pending_data_volume_size_gb": null,
"zone_id": "af-abj-2",
"subnet_id": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w",
"hostname": "db-7k2q9x4m1a.af-abj-2.db.pantechdynamics.com",
"private_ip": "10.0.1.12",
"desired_state": "running",
"observed_state": "running",
"generation": 1,
"observed_generation": 1,
"access_rules": [
{
"cidr": "10.0.1.0/24",
"protocol": "tcp",
"port": 5432
}
],
"failure_code": null,
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}
],
"next_cursor": "eyJhdCI6IjIwMjYtMTAtMDNUMDk6MzA6MDBaIiwiaWQiOiJ2bV8wNmdrIn0"
}Create a database
Creates a single-node PostgreSQL, MySQL or MariaDB database on its own server, sized by a plan (vCPU and memory), with its own data disk, and never on a public address. You connect to it by its hostname from your own network.
Placement. Pick a zone where your engine version is offered (GET /public/v1/database-engines). In a VPC zone (af-abj-2) subnet_id is required, and unless you send access_rules the database starts allowing the subnet's VPC CIDR. In a standard zone (af-abj-1) leave out subnet_id; the database starts allowing nobody until you add access rules or attach security groups, and your instances reach it after Add a private database network interface.
Paid first, like an instance. The request records an order and returns 202 Accepted with it (order_id, also the Location header). The initial payment is then taken from credit, or else from the organization's default card, and the database is provisioned. It costs exactly what an instance of the same plan with no public address costs, with storage_gb as its disk (amount_minor is the upfront payment). Follow GET /public/v1/database-orders/{order_id} until status is provisioned, then read the database; payment_failed and failed are final, and any payment taken is returned to your credit.
Admin login. Send admin_username to name the database's admin login, or leave it out for dbadmin. It is not a superuser: on PostgreSQL and MySQL it can create further users and databases; on MariaDB it is the only login.
Admin password. Send password to choose it (16 to 128 printable ASCII characters, with no spaces, quotes or backslashes); it is never returned. Leave it out and a 32-character password is generated and returned once, in this response (password). Until provisioning starts the password is held only encrypted, then erased: it cannot be read again (use Reset the password for a new one). Every response is Cache-Control: no-store. Infrastructure-as-code tools should keep the password out of state (for Terraform, a write-only attribute).
Storage. Leave out storage_gb for the plan's disk_gb, or ask for more: at most 2000 GB, and above the plan's size a multiple of 10 GB. Read each zone's allowed sizes and price from storage in GET /public/v1/database-engines rather than hard-coding them. It can be grown later with Grow a database's storage, never shrunk.
Idempotency. Send an Idempotency-Key. A retry with the same key returns the original order with password_returned: false and a null password: a generated password is shown only on the first response.
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/jsonnamestringrequired1 to 255 characters, unique among your databases.
At most 255 characters.
enginestringrequiredpostgresql,mysqlormariadb; seeGET /public/v1/database-engines.One of
postgresql,mysql,mariadb.versionstringrequiredA version line offered for
engineinzone_id, fromGET /public/v1/database-engines, e.g.18for PostgreSQL or8.4for MySQL.plan_slugstringrequiredThe size, from
GET /public/v1/plans: its vCPU and memory, and itsdisk_gbas the smallest data disk.zone_idstringrequiredWhere to create it: a zone from the version's
zones, e.g.af-abj-1(standard) oraf-abj-2(VPC).subnet_idstringRequired in a VPC zone (
af-abj-2): one of your subnets there, which the database joins. Leave out in a standard zone.access_rulesarray of stringThe initial allow-list: IPv4 CIDRs with a prefix of
/8or longer, never0.0.0.0/0, at most 50, no range twice. Leave out for the zone's default (the subnet's VPC CIDR in a VPC zone, nobody in a standard zone); send[]for nobody.At most 50 items.
admin_usernamestringThe admin login's name: 3 to 32 characters, lowercase letters, digits and underscores, starting with a letter. Reserved, and refused with
INVALID_DATABASE_ADMIN_USERNAME:root,postgres,public,none,all,user,sys,system,replication,current_user,current_role,session_user, and any name starting withpg_,mysql,mariadborpantech. Not secret. Defaults todbadmin.From 3 to 32 characters. Defaults to
dbadmin.passwordstringOptional admin password: 16 to 128 printable ASCII characters, with no spaces, single quotes (
'), double quotes (") or backslashes (\). Write-only: never stored in plain text, never returned, never logged. Leave it out to have a 32-character password generated and returned once in the response.From 16 to 128 characters.
storage_gbintegerData disk size in GB. Leave out for the plan's
disk_gb. Otherwise at least the plan'sdisk_gb(or the zone'smin_gbwhen larger), at most the zone'smax_gb(2000 today), and above that base a multiple of the zone'sstep_gb(10 today); the base itself is always allowed. Read the zone's limits and price fromstorageinGET /public/v1/database-enginesrather than hard-coding them. The upfront payment and the hourly storage price use this size. It can be grown later, never shrunk.At least 1.
Response 202
Ordered. Followorder_id (also the Location header) until provisioning starts.admin_usernamestringrequiredThe admin login the database is created with: the one you sent, or
dbadmin.order_idstringrequiredFollow it at
GET /public/v1/database-orders/{order_id}(also theLocationheader).database_idstringrequiredThe id the database will have.
resource_idstringrequiredSame as
database_id.statusstringrequiredThe order's status now, usually
awaiting_payment. SeeDatabaseOrder.status.One of
awaiting_payment,paid,provisioning,provisioned,payment_failed,failed.operation_idstring or nullrequiredSet once provisioning starts.
failure_codestring or nullrequiredNull for a new order; on a retry, the order's
failure_codeif it has failed since.amount_minorintegerrequiredThe initial payment, in minor units (kobo or cents): the price of an instance of the same plan with no public address.
currencystringrequiredNGNorUSD: your organization's billing currency.One of
NGN,USD.password_returnedbooleanrequiredTrue only when the password was generated for you and this request created the order. Otherwise
passwordis null: you chose the password, or this is a retry.passwordstring or nullrequiredThe generated admin password (32 letters and digits), in this response only. Store it securely now: it is never readable again. Null when you chose the password or on a retry.
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. - 402
INSUFFICIENT_CREDIT: the initial payment is more than your available credit and the organization has no default card;detailgives both amounts. Buy credit (POST /public/v1/billing/credit/purchases) or add a card in the console, then retry. - 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. - 409
ACCOUNT_SUSPENDED: an invoice is overdue, or the organization was suspended for non-payment. Pay the outstanding invoice in the console, then retry.ACCOUNT_NOT_ACTIVE: the organization's billing account is not active yet. Finish billing setup in the console (verify the organization and add a payment method), then retry.DATABASE_NAME_TAKEN: you already have a database with this name. Choose a different name.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:nameINVALID_DATABASE_NAME: the name is empty or longer than 255 characters.engineINVALID_DATABASE_ENGINE: usepostgresql,mysqlormariadb.versionINVALID_DATABASE_VERSION: the version line is not offered for new databases. Pick one fromGET /public/v1/database-engines.zone_idINVALID_DATABASE_ZONE: the zone is missing or not one your organization can use. Pick one fromGET /public/v1/regions.zone_idDATABASE_VERSION_NOT_AVAILABLE_IN_ZONE: this version is not offered in this zone yet. Pick a zone from the version'szones.plan_slugPLAN_NOT_FOUND: no active plan has this slug. Pick one fromGET /public/v1/plans.subnet_idDATABASE_SUBNET_REQUIRED: a VPC zone needs a subnet. Send thesubnet_idof one of your subnets in that zone.subnet_idDATABASE_SUBNET_NOT_ALLOWED: a standard zone takes no subnet. Leave outsubnet_id.subnet_idDATABASE_SUBNET_NOT_FOUND: no subnet with this id in your organization. Check the id.subnet_idDATABASE_SUBNET_WRONG_ZONE: the subnet is in another zone. Use a subnet inzone_id.subnet_idDATABASE_SUBNET_NOT_USABLE: the subnet is being deleted or has failed. Use another subnet.access_rulesINVALID_ACCESS_RULE: each rule must be an IPv4 CIDR with a prefix of /8 or longer, such as10.0.1.0/24or10.250.3.17/32;0.0.0.0/0is refused.access_rulesTOO_MANY_ACCESS_RULES: at most 50 rules. Merge neighbouring ranges, or attach a security group.access_rulesDUPLICATE_ACCESS_RULE: the same range appears twice (after masking host bits). Remove the repeat.admin_usernameINVALID_DATABASE_ADMIN_USERNAME: use 3 to 32 lowercase letters, digits or underscores, starting with a letter, and not a reserved name (root,postgres,public,none,all,user,sys,system,replication,current_user,current_role,session_user, or a name starting withpg_,mysql,mariadborpantech).passwordINVALID_DATABASE_PASSWORD: use 16 to 128 printable ASCII characters with no spaces, single or double quotes, or backslashes; or leave it out to have one generated.storage_gbINVALID_DATABASE_STORAGE: use at least the plan'sdisk_gb, at most 2000, and above the plan's size a multiple of 10. Leave it out for the plan's size.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.DATABASES_UNAVAILABLE: managed databases are not available on this platform yet. Try again later, or contact support.DATABASE_STORAGE_UNAVAILABLE: database storage is not offered in this zone yet. Choose another zone, or try again later.DATABASE_HOSTNAME_UNAVAILABLE: a hostname could not be reserved for the database. Retry with a newIdempotency-Key.BILLING_UNAVAILABLE: billing is not answering right now. 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/databases" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "orders-db",
"engine": "postgresql",
"version": "18",
"plan_slug": "starter",
"zone_id": "af-abj-2",
"subnet_id": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w"
}'{
"order_id": "ord_06gk3x9tq7m2v8r4y1c5d0zp8w",
"database_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "awaiting_payment",
"operation_id": null,
"failure_code": null,
"amount_minor": 1504000,
"currency": "NGN",
"password_returned": true,
"password": "q8Vn3TzK1mXw7RbLc4Hs9JdP2fYa6GeU",
"admin_username": "dbadmin"
}Get a database
One database: its connection hostname and port, admin_username, state, data disk size, access rules, attached security groups and the allow-list it applies (effective_access_rules). Never includes a password.
A change you requested is in effect once observed_generation equals generation. Connect as admin_username to hostname:port from an address its allow-list includes.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
database_idstringrequiredThe database's id, e.g.
db_....
Response 200
The database.admin_usernamestringrequiredThe admin login to connect as: the one chosen at create, or
dbadmin.pantech_adminfor a database created before the login could be chosen.security_group_idsarray of stringrequiredYour security groups attached to the database, in the order attached (at most 5).
[]when none.effective_access_rulesarray of DatabaseEffectiveAccessRulerequiredThe allow-list as the database applies it: its own
access_rulesplus the ranges its security groups add, each range once under its first source. In effect onceobserved_generationequalsgeneration.Show 4 child fieldsHide child fields
cidrstringrequiredAn allowed IPv4 range, in canonical form.
protocolstringrequiredAlways
tcp.One of
tcp.portintegerrequiredThe engine's port: 5432 or 3306.
sourcestringrequiredWhere the range comes from:
access_rule, orsecurity_group:followed by the group's id (e.g.security_group:sg_…).
ignored_security_group_rulesarray of DatabaseIgnoredSecurityGroupRulerequiredRules of the attached security groups that add nothing to the database, and why.
[]when none.Show 6 child fieldsHide child fields
security_group_idstringrequiredThe attached group the rule belongs to.
directionstringrequiredThe rule's direction.
One of
ingress,egress.protocolstringrequiredThe rule's protocol.
One of
tcp,udp,icmp,all.port_rangestring or nullrequired80,3000-4000, or null for all ports.cidrstringrequiredThe rule's CIDR.
reasonstringrequiredWhy it adds nothing:
egress_rule,protocol_not_tcp(udp or icmp),port_not_covered(its ports exclude the engine's),cidr_too_wide(wider than /8, including0.0.0.0/0) orcidr_not_ipv4.One of
egress_rule,protocol_not_tcp,port_not_covered,cidr_too_wide,cidr_not_ipv4.
idstringrequiredThe database's id,
db_followed by 26 characters.namestringrequiredIts name, unique among your databases.
enginestringrequiredpostgresql,mysqlormariadb.One of
postgresql,mysql,mariadb.versionstringrequiredThe engine's version line, e.g.
18or8.4. Minor updates within the line are applied by the platform.portintegerrequiredThe TCP port to connect to: 5432 for PostgreSQL, 3306 for MySQL and MariaDB.
plan_idstringrequiredThe plan setting its vCPU and memory.
data_volume_size_gbintegerrequiredThe data disk's size in GB, as in place and billed.
pending_data_volume_size_gbinteger or nullrequiredThe size a storage resize in flight is growing the data disk to; null when none.
zone_idstringrequiredThe zone it runs in, e.g.
af-abj-2.subnet_idstring or nullrequiredIts VPC subnet in a VPC zone; null in a standard zone.
hostnamestring or nullrequiredThe name to connect to, e.g.
db-7k2q9x4m1a.af-abj-2.db.pantechdynamics.com. It resolves toprivate_ipand works only from where that address is reachable. Null until assigned.private_ipstring or nullrequiredThe database's private address, never public. Null until assigned.
desired_statestringrequiredWhat you asked for:
running,stoppedordeleted.One of
running,stopped,deleted.observed_statestringrequiredWhat the platform last observed. A change is complete when it matches
desired_state;failedmeans the last change could not be made (see the failure fields), andunknownmeans the platform could not check.One of
pending,provisioning,running,stopping,stopped,deleting,deleted,failed,unknown.generationintegerrequiredIncreases by one with every change you request.
observed_generationintegerrequiredThe
generationlast applied: equal togenerationonce the last change (access rules, security groups, password) is in effect.access_rulesarray of DatabaseAccessRulerequiredThe database's own allow-list, as set at create or with *Replace access rules*.
Show 3 child fieldsHide child fields
cidrstringrequiredAn allowed IPv4 range, in canonical form.
protocolstringrequiredAlways
tcp.One of
tcp.portintegerrequiredThe engine's port: 5432 or 3306.
failure_codestring or nullrequiredA stable code for why the last change failed; null when nothing failed. The failed operation's
failure.reasonexplains it.created_atstring or nullrequiredWhen it was created (RFC 3339, UTC).
updated_atstring or nullrequiredWhen 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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 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/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"admin_username": "dbadmin",
"security_group_ids": [],
"effective_access_rules": [
{
"cidr": "10.0.1.0/24",
"protocol": "tcp",
"port": 5432,
"source": "access_rule"
}
],
"ignored_security_group_rules": [],
"id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "orders-db",
"engine": "postgresql",
"version": "18",
"port": 5432,
"plan_id": "starter",
"data_volume_size_gb": 80,
"pending_data_volume_size_gb": null,
"zone_id": "af-abj-2",
"subnet_id": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w",
"hostname": "db-7k2q9x4m1a.af-abj-2.db.pantechdynamics.com",
"private_ip": "10.0.1.12",
"desired_state": "running",
"observed_state": "running",
"generation": 1,
"observed_generation": 1,
"access_rules": [
{
"cidr": "10.0.1.0/24",
"protocol": "tcp",
"port": 5432
}
],
"failure_code": null,
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}Delete a database
Deletes the database. Its hostname is removed first, then its server is retired. Its data disk and a safety snapshot of it are kept for a short retention period (12 and 24 hours) and then destroyed; nothing is billed for them during retention. Snapshots you took yourself are kept and stay billed until you delete them.
Once the delete succeeds, the part of the database's upfront payment that no invoice has drawn yet goes back to your organization's credit balance, never to the card. Usage up to the delete is invoiced as usual. A delete that fails returns nothing.
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
database_idstringrequiredThe database's id, e.g.
db_....
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 409
INVALID_RESOURCE_STATE: the database is being deleted or has been deleted. Nothing more can be changed on it.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 a value, for example a malformed CIDR or a name longer than 255 characters. Check the request against this page. - 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/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Start a database
Starts a stopped database. Its hostname, data and access rules are unchanged. A running database is billed for its plan again.
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.
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
database_idstringrequiredThe database's id, e.g.
db_....
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 409
ACCOUNT_SUSPENDED: an invoice is overdue, or the organization was suspended for non-payment. Pay the outstanding invoice in the console, then retry.INVALID_RESOURCE_STATE: the database is being deleted or has been deleted. Nothing more can be changed on it.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/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/start" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Stop a database
Shuts the database down cleanly. A stopped database keeps its data, hostname and access rules, refuses connections, and is billed for its storage only. Start it again with Start a database.
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.
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
database_idstringrequiredThe database's id, e.g.
db_....
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 409
INVALID_RESOURCE_STATE: the database is being deleted or has been deleted. Nothing more can be changed on it.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/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/stop" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Replace access rules
Replaces the database's whole allow-list. Each rule allows TCP to the engine's port (5432 for PostgreSQL, 3306 for MySQL and MariaDB) from one IPv4 CIDR. Send [] to remove every rule. To let one instance in, allow its address as a /32: in a standard zone, use the instance's private_network_ip after Add a private database network interface.
Limits: an IPv4 CIDR with a prefix of /8 or longer (host bits are masked, so 10.0.1.7/24 becomes 10.0.1.0/24); never 0.0.0.0/0; at most 50 rules; no range twice. These rules plus the ranges added by attached security groups may total at most 1024.
Removing a rule also ends connections already open from that range. 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 new list is in effect once the database's observed_generation equals its generation.
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
database_idstringrequiredThe database's id, e.g.
db_....
Body
application/jsonrulesarray of objectrequiredThe complete new allow-list, at most 50 rules with no range twice.
[]removes every rule.At most 50 items.
Show 1 child fieldsHide child fields
cidrstringrequiredOne IPv4 CIDR to allow, with a prefix of
/8to/32; never0.0.0.0/0. Host bits are masked (10.0.1.7/24is stored as10.0.1.0/24). Use/32for one address, such as an instance'sprivate_network_ip.
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 409
INVALID_RESOURCE_STATE: the database is being deleted or has been deleted. Nothing more can be changed on it.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:rulesREQUIRED: send the complete list;[]removes every rule.rulesINVALID_ACCESS_RULE: eachcidrmust be an IPv4 CIDR with a prefix of /8 or longer, such as10.0.1.0/24;0.0.0.0/0is refused.rulesTOO_MANY_ACCESS_RULES: at most 50 rules. Merge neighbouring ranges, or attach a security group instead.rulesDUPLICATE_ACCESS_RULE: the same range appears twice (after masking host bits). Remove the repeat.UNKNOWN_FIELD: the body has a field this endpoint does not take (named infield). Remove it or fix its spelling.DATABASE_ACCESS_RANGE_LIMIT_EXCEEDED: the database's own access rules plus the address ranges its security groups add would exceed 1024. Remove access rules, detach a security group, or narrow the groups' rules, then retry. - 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 PUT "https://api.pantechdynamics.com/public/v1/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/access-rules" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"rules": [
{
"cidr": "10.0.1.0/24"
},
{
"cidr": "10.250.3.17/32"
}
]
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Set the password
Sets the admin login's password to one you choose: 16 to 128 printable ASCII characters, with no spaces, single or double quotes, or backslashes. It is applied inside the database and never stored or returned. The database must be running. Existing connections stay open; new ones need the new password once the operation succeeds.
Use this from infrastructure-as-code to rotate a password you manage; use Reset the password to have one generated instead. The response is Cache-Control: no-store.
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.
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
database_idstringrequiredThe database's id, e.g.
db_....
Body
application/jsonpasswordstringrequiredThe new admin password: 16 to 128 printable ASCII characters, with no spaces, single quotes (
'), double quotes (") or backslashes (\). Write-only: never stored in plain text, never returned, never logged.From 16 to 128 characters.
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 409
DATABASE_NOT_RUNNING: the database must be running for this change. Start it (POST /public/v1/databases/{database_id}/start), wait for the operation to succeed, then retry.INVALID_RESOURCE_STATE: the database is being deleted or has been deleted. Nothing more can be changed on it.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:passwordREQUIRED: send the new password.passwordINVALID_DATABASE_PASSWORD: use 16 to 128 printable ASCII characters with no spaces, single or double quotes, or backslashes.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 PUT "https://api.pantechdynamics.com/public/v1/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/password" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"password": "c0rrect-H0rse-battery-St4ple"
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Reset the password
Replaces the admin login's password with a generated one (32 letters and digits), returned once in this response (password) with Cache-Control: no-store, and never stored. The database must be running. Use this when the password is lost: support cannot recover it.
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 new password works once the operation succeeds.
Idempotency. Send an Idempotency-Key. A retry with the same key returns the original operation with password_returned: false and a null password: if the first response was lost, reset again with a new key.
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
database_idstringrequiredThe database's id, e.g.
db_....
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 database.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting.password_returnedbooleanrequiredFalse on a retry with the same Idempotency-Key;
passwordis then null.passwordstring or nullrequiredThe generated admin password (32 letters and digits), in this response only. Store it securely now: it is never stored and cannot be read again. Null on a retry.
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 409
DATABASE_NOT_RUNNING: the database must be running for this change. Start it (POST /public/v1/databases/{database_id}/start), wait for the operation to succeed, then retry.INVALID_RESOURCE_STATE: the database is being deleted or has been deleted. Nothing more can be changed on it.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/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/reset-password" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting",
"password_returned": true,
"password": "q8Vn3TzK1mXw7RbLc4Hs9JdP2fYa6GeU"
}Attach security groups
Replaces the set of your security groups attached to the database; [] detaches every group. At most 5, each one of your own security groups in the database's zone that is not being deleted or failed. Another organization's group is reported as not found.
A group is only a source of address ranges for the database: each of its ingress rules whose protocol is tcp or all, whose ports include the engine's port (5432 or 3306; a range such as 3000-4000, or all ports, counts) and whose CIDR is IPv4 with a prefix of /8 or longer adds its CIDR to the database's allow-list, beside its own access rules. Every other rule (other ports, egress, udp, icmp, 0.0.0.0/0 and anything wider than /8, IPv6) is ignored for the database and listed in ignored_security_group_rules with the reason. The group itself is never applied to the database server, and SSH to it is never opened. The database's access rules plus the ranges its groups add may total at most 1024.
When an attached group's rules change, the database is updated automatically. A group cannot be deleted while a database uses it (409 SECURITY_GROUP_ATTACHED_TO_DATABASE); detach it here 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.
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
database_idstringrequiredThe database's id, e.g.
db_....
Body
application/jsonsecurity_group_idsarray of stringrequiredThe complete set to attach: at most 5 distinct ids of your own security groups in the database's zone, e.g.
sg_….[]detaches every group.At most 5 items.
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 409
INVALID_RESOURCE_STATE: the database is being deleted or has been deleted. Nothing more can be changed on it.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:security_group_idsREQUIRED: send the complete set;[]detaches every group.security_group_idsINVALID_DATABASE_SECURITY_GROUPS: more than 5 ids, or an id repeated. Send at most 5 distinct ids.security_group_idsDATABASE_SECURITY_GROUP_NOT_FOUND: an id is not one of your security groups. Check the ids withGET /public/v1/security-groups.security_group_idsDATABASE_SECURITY_GROUP_NOT_USABLE: a group is being deleted or has failed. Remove it from the list.security_group_idsDATABASE_SECURITY_GROUP_WRONG_ZONE: a group is in another zone than the database. Use groups in the database's zone.UNKNOWN_FIELD: the body has a field this endpoint does not take (named infield). Remove it or fix its spelling.DATABASE_ACCESS_RANGE_LIMIT_EXCEEDED: the database's own access rules plus the address ranges its security groups add would exceed 1024. Remove access rules, detach a security group, or narrow the groups' rules, then retry. - 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 PUT "https://api.pantechdynamics.com/public/v1/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/security-groups" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"security_group_ids": [
"sg_06gk3x9tq7m2v8r4y1c5d0zp8w"
]
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Grow a database's storage
Grows the database's data disk to storage_gb. vCPU and memory stay the plan's. The disk only grows: storage_gb must be larger than the current data_volume_size_gb, at most 2000 GB and a multiple of 10 GB (read the zone's limits from storage in GET /public/v1/database-engines rather than hard-coding them). The database must be running; the filesystem grows online, without a restart. One resize at a time.
No upfront charge, as for an instance resize: storage is billed hourly, at the new size only once the resize has completed. While it runs, pending_data_volume_size_gb shows the size in flight; data_volume_size_gb changes when it succeeds. A failed resize leaves the size and the bill unchanged.
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.
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
database_idstringrequiredThe database's id, e.g.
db_....
Body
application/jsonstorage_gbintegerrequiredThe new data disk size in GB: larger than the current
data_volume_size_gb, at most the zone'smax_gb(2000 today) and a multiple of itsstep_gb(10 today); seestorageinGET /public/v1/database-engines. It only grows.At least 1.
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 409
ACCOUNT_SUSPENDED: an invoice is overdue, or the organization was suspended for non-payment. Pay the outstanding invoice in the console, then retry.DATABASE_NOT_RUNNING: the database must be running for this change. Start it (POST /public/v1/databases/{database_id}/start), wait for the operation to succeed, then retry.DATABASE_STORAGE_RESIZE_IN_PROGRESS: a storage resize of this database is still running. Wait for its operation to finish, then retry.INVALID_RESOURCE_STATE: the database is being deleted or has been deleted. Nothing more can be changed on it.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:storage_gbREQUIRED: send the new size in GB.storage_gbINVALID_DATABASE_STORAGE: the size must be larger than the currentdata_volume_size_gb, at most 2000, and a multiple of 10.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.DATABASE_STORAGE_UNAVAILABLE: database storage is not offered in this database's zone right now. Try again later.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/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/resize-storage" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"storage_gb": 200
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}List a database's snapshots
Snapshots of the database's data disk, oldest first. Each is also listed in GET /public/v1/snapshots, with database_id set.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
database_idstringrequiredThe database's id, e.g.
db_....
Query parameters
limitintegerItems per page, 1 to 100. Defaults to 50.
From 1 to 100. Defaults to
50.cursorstringThe previous page's
next_cursor, to get the next page. Leave out for the first page; keep the other parameters the same.qstringOnly items whose name contains this text (case-insensitive), at most 255 characters.
At most 255 characters.
desired_statestringOnly items with this
desired_state:presentordeleted.One of
present,deleted.observed_statestringOnly items with this
observed_state.One of
pending,provisioning,active,deleting,deleted,failed,unknown.
Response 200
A page of snapshots.dataarray of SnapshotrequiredShow 15 child fieldsHide child fields
idstringrequirede.g.
snap_....namestringrequiredIts name, unique among its source's snapshots.
instance_idstring or nullSet for a snapshot of an instance's root disk.
source_instance_namestring or nullThe source instance's name; null when it is gone or not an instance snapshot.
volume_idstring or nullSet for a snapshot of a volume. Exactly one of instance_id, volume_id and database_id is set.
volume_namestring or nullThe source volume's name; null when it is gone or not a volume snapshot.
database_idstring or nullSet for a snapshot of a managed database's data disk. Exactly one of
instance_id,volume_idanddatabase_idis set.regionstring or nullThe source's region, e.g.
af-abj.triggerstringrequiredautomaticwhen taken by a snapshot schedule.One of
manual,automatic.size_bytesintegerrequiredStorage used; 0 until complete.
desired_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.completed_atstring or nullWhen the snapshot finished; null until then.
created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
next_cursorstring or nullrequiredPass as
cursorfor the next page; null on the last page.
Errors
- 400
INVALID_PAGE:limitis not a whole number from 1 to 100. Send a value in that range, or leave it out for 50.INVALID_CURSOR:cursordoes not belong to this list with these filters. Start again without a cursor.INVALID_FILTER:qis longer than 255 characters, ordesired_stateorobserved_stateis not one of its listed values. Fix the parameter named indetail. - 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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 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/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/snapshots" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"id": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "pre-upgrade",
"instance_id": null,
"source_instance_name": null,
"volume_id": null,
"volume_name": null,
"database_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"region": "af-abj",
"trigger": "manual",
"size_bytes": 1610612736,
"desired_state": "present",
"observed_state": "active",
"completed_at": "2026-10-03T09:31:12Z",
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:31:12Z"
}
],
"next_cursor": null
}Snapshot a database
Takes a snapshot of the database's data disk. The engine keeps running, so the snapshot is crash-consistent only: what the disk held at that instant, as after a power cut, which the engine recovers from on start. It is not an engine-level backup; stop the database first for a quiesced copy. The database must be running or stopped.
Billed like every snapshot: the storage rate on its physical size, for every started hour until it is deleted. A snapshot outlives its database and stays billed until you delete it. Restoring a database from a snapshot is not available yet.
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 new snapshot'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
database_idstringrequiredThe database's id, e.g.
db_....
Body
application/jsonnamestringrequired1 to 255 characters, unique among this resource's snapshots, e.g.
pre-upgrade.At most 255 characters.
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path. - 409
ACCOUNT_SUSPENDED: an invoice is overdue, or the organization was suspended for non-payment. Pay the outstanding invoice in the console, then retry.DATABASE_SNAPSHOT_NOT_READY: the database is not running or stopped (it is starting, stopping, being created or deleted). Wait until it is running or stopped, then retry.DATABASE_SNAPSHOT_NAME_TAKEN: this database already has a snapshot with that name. Choose a different name.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:nameINVALID_DATABASE_SNAPSHOT_NAME: the name is empty or longer than 255 characters.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.DATABASES_UNAVAILABLE: managed databases are not available on this platform yet. Try again later, or contact support.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/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/snapshots" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "pre-upgrade"
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Get a database's snapshot
One snapshot of the database's data disk.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
database_idstringrequiredThe database's id, e.g.
db_....snapshot_idstringrequiredThe snapshot's id, e.g.
snap_....
Response 200
The snapshot.idstringrequirede.g.
snap_....namestringrequiredIts name, unique among its source's snapshots.
instance_idstring or nullSet for a snapshot of an instance's root disk.
source_instance_namestring or nullThe source instance's name; null when it is gone or not an instance snapshot.
volume_idstring or nullSet for a snapshot of a volume. Exactly one of instance_id, volume_id and database_id is set.
volume_namestring or nullThe source volume's name; null when it is gone or not a volume snapshot.
database_idstring or nullSet for a snapshot of a managed database's data disk. Exactly one of
instance_id,volume_idanddatabase_idis set.regionstring or nullThe source's region, e.g.
af-abj.triggerstringrequiredautomaticwhen taken by a snapshot schedule.One of
manual,automatic.size_bytesintegerrequiredStorage used; 0 until complete.
desired_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.completed_atstring or nullWhen the snapshot finished; null until then.
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path.DATABASE_SNAPSHOT_NOT_FOUND: this database has no snapshot with this id (a snapshot of an instance or volume is reported the same way). Check the id, or useGET /public/v1/snapshots/{snapshot_id}. - 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/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/snapshots/snap_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"id": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "before-migration",
"instance_id": null,
"source_instance_name": null,
"volume_id": null,
"volume_name": null,
"database_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
"region": "af-abj",
"trigger": "manual",
"size_bytes": 1610612736,
"desired_state": "present",
"observed_state": "active",
"completed_at": "2026-10-03T09:30:00Z",
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}Delete a database's snapshot
Deletes one snapshot of the database's data disk. It is billed until the deletion completes.
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
database_idstringrequiredThe database's id, e.g.
db_....snapshot_idstringrequiredThe snapshot's id, e.g.
snap_....
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
DATABASE_NOT_FOUND: no database with this id in your organization. Check the id: a database of another organization is reported the same way.RESOURCE_NOT_FOUND: the id is not a database id (db_…). Check the path.DATABASE_SNAPSHOT_NOT_FOUND: this database has no snapshot with this id. Check the id. - 409
INVALID_RESOURCE_STATE: the snapshot 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. - 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/databases/db_06gk3x9tq7m2v8r4y1c5d0zp8w/snapshots/snap_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}