Appearance
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"
}| Field | Meaning |
|---|---|
resourceType | pod or email. Only pod backups are restorable here. |
podId | Source pod (present for pod backups; may point at a pod you've since deleted). |
emailAddress | Source mailbox (present for email backups). |
type | manual or auto. |
status | pending, running, completed, or failed. |
sizeBytes | Size of the export. |
Back up a pod
http
POST /api/pods/:id/backupsNo 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/backupsPlain array of that pod's backups, newest first.
Set the auto backup schedule
http
PUT /api/pods/:id/backup-schedulejson
{ "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/cloneCopies 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/backupsPlain 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/restoreOptional 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"andstatus: "completed", otherwise400. - 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/:backupIdResponse 200 ({"message":"Backup deleted"}). If the backup is still running, you get 400 - let it finish first.
See also
- Backups concept
- Snapshots API - the in-place cousin
- Snapshots & backups guide