# Database orders

Follow a new database from payment to provisioning.

Source: https://docs.pantechdynamics.com/api/database-orders

Creating a database places an order. The order takes the initial payment, from credit or else the organization's default card, and then provisions the database. Poll the order until its `status` is `provisioned` (the database is ready to read), `failed` or `payment_failed`. An order never includes the password.

Endpoints:

- `GET /public/v1/database-orders`: List database orders
- `GET /public/v1/database-orders/{order_id}`: Get a database order

## The database order object

How a new database is paid for and provisioned. Never includes a password. The console API returns the same order, naming the id `order_id`.

- `admin_username` (string, required): The admin login the database is created with.
- `id` (string, required): The order's id, `ord_…`.
- `order_id` (string, required): The same value as `id`.
- `attempt_id` (string or null, required): The card payment attempt; null when the order was paid from credit or not charged yet.
- `database_id` (string, required): The id the database has, or will have once provisioned.
- `status` (string, required): `awaiting_payment`, then `paid`, `provisioning` and `provisioned` (final: the database exists). `payment_failed` (no payment could be taken; nothing charged, or it was returned) and `failed` (provisioning could not start; any payment taken is returned to your credit) are final too. One of `awaiting_payment`, `paid`, `provisioning`, `provisioned`, `payment_failed`, `failed`.
- `operation_id` (string or null, required): The database's create operation, set once provisioning starts; null before.
- `failure_code` (string or null, required): Why the order failed, when it did: e.g. `insufficient_credit`, `card_declined`, `payment_expired` (not paid within an hour), `database_name_taken`, `provisioning_failed`. Null otherwise. `organization_deleted`: the order was cancelled because its organization was deleted; any payment taken is returned to credit.
- `amount_minor` (integer, required): The initial payment in minor units of `currency` (kobo or cents).
- `currency` (string, required): `NGN` or `USD`: your organization's billing currency. One of `NGN`, `USD`.
- `created_at` (string or null, required): When it was created (RFC 3339, UTC).
- `updated_at` (string or null, required): When it last changed (RFC 3339, UTC).
## List database orders

```http
GET /public/v1/database-orders
```

Your database orders, newest first, one per *Create a database* call. An order shows whether the initial payment was taken and whether provisioning started. Never includes a password.

Scope: `read`.

Query parameters:

- `limit` (integer): Items per page, 1 to 100. Defaults to 50. From 1 to 100. Defaults to `50`.
- `cursor` (string): The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.

Example:

```sh
curl "https://api.pantechdynamics.com/public/v1/database-orders" \
  -H "Authorization: Bearer $PANTECH_API_KEY"
```

Response `200`:

```json
{
  "data": [
    {
      "admin_username": "dbadmin",
      "id": "ord_06gk3x9tq7m2v8r4y1c5d0zp8w",
      "order_id": "ord_06gk3x9tq7m2v8r4y1c5d0zp8w",
      "attempt_id": "attempt-id",
      "database_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
      "status": "provisioned",
      "operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
      "failure_code": null,
      "amount_minor": 1059200,
      "currency": "NGN",
      "created_at": "2026-10-03T09:30:00Z",
      "updated_at": "2026-10-03T09:30:00Z"
    }
  ],
  "next_cursor": "eyJhdCI6IjIwMjYtMTAtMDNUMDk6MzA6MDBaIiwiaWQiOiJ2bV8wNmdrIn0"
}
```

Errors:

- `400`: `INVALID_PAGE`: `limit` is not a whole number from 1 to 100. Send a value in that range, or leave it out for 50.
`INVALID_CURSOR`: `cursor` does not belong to this list with these filters. Start again without a cursor.
- `401`: `UNAUTHENTICATED`: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. Send `Authorization: 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 (`read` for GET, `write` for changes; an AI app's key also needs `delete` for 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. Wait `Retry-After` seconds, then retry. For authenticated quota denials, `RateLimit-Scope` identifies the denying quota and `RateLimit-Reset` reports its remaining window in seconds.
- `503`: `SERVICE_UNAVAILABLE`: request quota storage is unavailable. Wait a few seconds, then retry.
## Get a database order

```http
GET /public/v1/database-orders/{order_id}
```

Payment and provisioning progress for one new database. Poll it after *Create a database* until `status` is `provisioned` (then read the database at `GET /public/v1/databases/{database_id}`), or `payment_failed` or `failed` (final: any payment taken is returned to your credit, and `failure_code` says why). Once `operation_id` is set you can also follow that operation. Never includes a password.

Scope: `read`.

Path parameters:

- `order_id`: The resource's id.

Example:

```sh
curl "https://api.pantechdynamics.com/public/v1/database-orders/ord_06gk3x9tq7m2v8r4y1c5d0zp8w" \
  -H "Authorization: Bearer $PANTECH_API_KEY"
```

Response `200`:

```json
{
  "admin_username": "dbadmin",
  "id": "ord_06gk3x9tq7m2v8r4y1c5d0zp8w",
  "order_id": "ord_06gk3x9tq7m2v8r4y1c5d0zp8w",
  "attempt_id": "attempt-id",
  "database_id": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
  "status": "provisioned",
  "operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
  "failure_code": null,
  "amount_minor": 1059200,
  "currency": "NGN",
  "created_at": "2026-10-03T09:30:00Z",
  "updated_at": "2026-10-03T09:30:00Z"
}
```

Errors:

- `401`: `UNAUTHENTICATED`: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. Send `Authorization: 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 (`read` for GET, `write` for changes; an AI app's key also needs `delete` for 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_ORDER_NOT_FOUND`: no database order with this id in your organization. Check the id; an order of another organization is reported the same way.
`RESOURCE_NOT_FOUND`: the id is not an order id (`ord_…`). 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. Wait `Retry-After` seconds, then retry. For authenticated quota denials, `RateLimit-Scope` identifies the denying quota and `RateLimit-Reset` reports its remaining window in seconds.
- `503`: `SERVICE_UNAVAILABLE`: request quota storage is unavailable. Wait a few seconds, then retry.
