Skip to content

Backups API

All endpoints need a bearer token:

http
Authorization: Bearer <jwt-or-apikey>

A backup is an off-node export of a pod. Restoring one builds a brand-new pod and leaves the original completely alone. That's the whole difference from a snapshot, which restores in place. If you're deciding which you want, read Snapshots vs backups.

Because a restore or clone creates a pod, both need at least $3 of credit and count against your pod limit.

The backup object

json
{
  "id": "...",
  "name": "web-2026-07-17",
  "resourceType": "pod",
  "podId": "...",
  "type": "manual",
  "status": "completed",
  "sizeBytes": 734003200,
  "createdAt": "2026-07-17T03:00:00Z"
}
FieldMeaning
resourceTypepod or email. Only pod backups are restorable here.
podIdSource pod (present for pod backups; may point at a pod you've since deleted).
emailAddressSource mailbox (present for email backups).
typemanual or auto.
statuspending, running, completed, or failed.
sizeBytesSize of the export.

Back up a pod

http
POST /api/pods/:id/backups

No body. Needs at least $3 of account credit like other creates (402 otherwise). Response 202 with the backup in pending, running in the background.

bash
curl -X POST https://cloud-api.microapps.io/api/pods/$POD_ID/backups \
  -H "Authorization: Bearer $TOKEN"

By default you can keep 4 manual backups per pod - one slot of your per-pod allowance is always reserved for the auto schedule. Your account's actual allowance is on GET /api/user/account (maxBackupsPerPod). At the limit you get 400 - delete one first.

List a pod's backups

http
GET /api/pods/:id/backups

Plain array of that pod's backups, newest first.

Set the auto backup schedule

http
PUT /api/pods/:id/backup-schedule
json
{ "schedule": "weekly" }

schedule is "" (disabled), "daily", "weekly", or "monthly" - same cadences as snapshot schedules, all at 3:00 AM UTC.

Clone a pod

http
POST /api/pods/:id/clone

Copies a pod straight into a new pod on the same Region and network. Optional body:

json
{ "name": "web-clone" }

Blank name gets a random one. Response 202 with the new Pod in Cloning status.

bash
curl -X POST https://cloud-api.microapps.io/api/pods/$POD_ID/clone \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "name": "web-clone" }'

Clone needs pod-create permission

Cloning makes a pod, so it's gated on pods:create (not a backup permission) and consumes a slot from your pod limit.

List all backups on the account

http
GET /api/backups

Plain array of every backup on the account, across all pods.

This list also includes email backups

Entries with resourceType: "email" are mailbox backups. It can also include backups whose source pod was later deleted. Only pod backups can be restored through the endpoint below.

Restore a backup into a new pod

http
POST /api/backups/:backupId/restore

Optional body { "name": "..." } for the new pod's name. Response 202 with the new Pod in Restoring.

bash
curl -X POST https://cloud-api.microapps.io/api/backups/$BACKUP_ID/restore \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "name": "web-restored" }'

Rules:

  • The backup must be resourceType: "pod" and status: "completed", otherwise 400.
  • The restore creates a new pod, so it uses a slot from your pod limit and needs $3 credit.
  • Your original pod (if it still exists) is untouched.

Delete a backup

http
DELETE /api/backups/:backupId

Response 200 ({"message":"Backup deleted"}). If the backup is still running, you get 400 - let it finish first.

See also

Built for the long tail.