HTTP interface for Hot Backups
The HTTP API for Hot Backups lets you manage incremental, zero-downtime data backups
Hot Backups are near instantaneous consistent snapshots of an entire ArangoDB deployment. This includes all databases, collections, indexes, Views, graphs, and users at any given time.
For creations a label may be specified, which if omitted is replaced with a generated UUID. This label is then combined with a timestamp to generate an identifier for the created hot backup. Subsequently, all other APIs operate on these identifiers.
The permissions required to use the /_admin/backup/* endpoints depends on the
setting of the --backup.options-api startup option.
Create a backup
force boolean (default:
false)If this flag is set to
trueand no global transaction lock can be acquired within the given timeout, all running transactions are forcefully aborted to ensure that a consistent backup can be created. This does not include JavaScript transactions. It waits for the transactions to be aborted at mosttimeoutseconds. Thus usingforcethe request timeout is doubled. To abort transactions is almost certainly not what you want for your application. In the presence of intermediate commits it can even destroy the atomicity of your transactions. Use at your own risk, and only if you need a consistent backup at all costs. The default and recommended value isfalse. If bothallowInconsistentandforceare set totrue, then the latter takes precedence and transactions are aborted. This is only available in the cluster.
Examples
curl -X POST --header 'accept: application/json' --data-binary @- --dump - 'http://localhost:8529/_admin/backup/create' <<'EOF'
{
"label": "foo"
}
EOFShow output
HTTP/1.1 201 Created
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 186
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
{
"error" : false,
"code" : 201,
"result" : {
"id" : "2025-10-27T12.40.47Z_foo",
"potentiallyInconsistent" : false,
"sizeInBytes" : 8590505,
"datetime" : "2025-10-27T12:40:47Z",
"nrDBServers" : 1,
"nrFiles" : 44
}
}Restore a backup
200 OK
Is returned if the backup could be restored. Note that there is an inevitable discrepancy between the single server and the cluster. In a single server, the request returns successfully, but the restore is only executed afterwards. In the cluster, the request only returns when the restore operation has been completed successfully. The cluster behavior is obviously the desired one, but in a single instance, one cannot keep a connection open across a restart.
Examples
curl -X POST --header 'accept: application/json' --data-binary @- --dump - 'http://localhost:8529/_admin/backup/restore' <<'EOF'
{
"id": "2025-10-27T12.40.47Z_a3370d64-952b-40aa-b327-2a886ac5a6ac"
}
EOFShow output
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 97
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
{
"error" : false,
"code" : 200,
"result" : {
"previous" : "/var/lib/arangodb3/backups/DIRECTORY_TO_DELETE"
}
}Delete a backup
id.Examples
curl -X POST --header 'accept: application/json' --data-binary @- --dump - 'http://localhost:8529/_admin/backup/delete' <<'EOF'
{
"id": "2025-10-27T12.40.57Z_f92fd09b-6062-4b8e-9421-7b454c4df592"
}
EOFShow output
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 38
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
{
"error" : false,
"code" : 200,
"result" : {
}
}List all backups
Examples
curl -X POST --header 'accept: application/json' --data-binary @- --dump - 'http://localhost:8529/_admin/backup/list' <<'EOF'
{}
EOFShow output
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 1393
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
{
"error" : false,
"code" : 200,
"result" : {
"server" : "SNGL-b4aa17e6-773b-4942-ba3a-70f6d68e4691",
"list" : {
"2025-10-27T12.40.47Z_a3370d64-952b-40aa-b327-2a886ac5a6ac" : {
"id" : "2025-10-27T12.40.47Z_a3370d64-952b-40aa-b327-2a886ac5a6ac",
"version" : "3.12.6",
"datetime" : "2025-10-27T12:40:47Z",
"keys" : [ ],
"sizeInBytes" : 8596858,
"nrFiles" : 47,
"nrDBServers" : 1,
"available" : true,
"nrPiecesPresent" : 1,
"potentiallyInconsistent" : false,
"countIncludesFilesOnly" : true
},
"2025-10-27T12.40.57Z_cc4c77ba-3b3c-4e18-a53e-80469252b009" : {
"id" : "2025-10-27T12.40.57Z_cc4c77ba-3b3c-4e18-a53e-80469252b009",
"version" : "3.12.6",
"datetime" : "2025-10-27T12:40:57Z",
"keys" : [ ],
"sizeInBytes" : 8585574,
"nrFiles" : 43,
"nrDBServers" : 1,
"available" : true,
"nrPiecesPresent" : 1,
"potentiallyInconsistent" : false,
"countIncludesFilesOnly" : true
},
"2025-10-27T12.40.47Z_foo" : {
"id" : "2025-10-27T12.40.47Z_foo",
"version" : "3.12.6",
"datetime" : "2025-10-27T12:40:47Z",
"keys" : [ ],
"sizeInBytes" : 8590505,
"nrFiles" : 44,
"nrDBServers" : 1,
"available" : true,
"nrPiecesPresent" : 1,
"potentiallyInconsistent" : false,
"countIncludesFilesOnly" : true
},
"2025-10-27T12.40.57Z_64092380-8573-45c7-8cd9-d417372eda9d" : {
"id" : "2025-10-27T12.40.57Z_64092380-8573-45c7-8cd9-d417372eda9d",
"version" : "3.12.6",
"datetime" : "2025-10-27T12:40:57Z",
"keys" : [ ],
"sizeInBytes" : 8578247,
"nrFiles" : 40,
"nrDBServers" : 1,
"available" : true,
"nrPiecesPresent" : 1,
"potentiallyInconsistent" : false,
"countIncludesFilesOnly" : true
}
}
}
}Upload a backup to a remote repository
config object
Configuration of remote repository. This is required when an upload operation is scheduled. In this case leave out the
uploadIdattribute. See Rclone Configuration for a description of theconfigobject.remoteRepository string
URL of remote repository. This is required when an upload operation is scheduled. In this case leave out the
uploadIdattribute. Provided repository URLs are normalized and validated as follows: One single colon must appear separating the configuration section name and the path. The URL prefix up to the colon must exist as a key in the config object below. No slashes must appear before the colon. Multiple back to back slashes are collapsed to one, as..and.are applied accordingly. Local repositories must be absolute paths and must begin with a/. Trailing/are removed.
Examples
curl -X POST --header 'accept: application/json' --data-binary @- --dump - 'http://localhost:8529/_admin/backup/upload' <<'EOF'
{
"id": "2025-10-27T12.40.57Z_4709e619-c2e1-48d9-89ca-53f1950ca0a1",
"remoteRepository": "local://tmp/backups",
"config": {
"local": {
"type": "local"
}
}
}
EOFShow output
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 56
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
{
"error" : false,
"code" : 202,
"result" : {
"uploadId" : "73690"
}
}The result object of the body holds the uploadId string attribute which can
be used to follow the upload process.
curl -X POST --header 'accept: application/json' --data-binary @- --dump - 'http://localhost:8529/_admin/backup/upload' <<'EOF'
{
"uploadId": "73691"
}
EOFShow output
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 222
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
{
"error" : false,
"code" : 200,
"result" : {
"Timestamp" : "2025-10-27T12:40:57Z",
"UploadId" : "73691",
"Cancelled" : false,
"BackupId" : "2025-10-27T12.40.57Z_8a4a0c1b-c010-4fcd-b277-8835468427a7",
"DBServers" : {
"SNGL" : {
"Status" : "STARTED"
}
}
}
}Download a backup from a remote repository
config* object
Configuration of remote repository. This is required when a download operation is scheduled. In this case leave out the
downloadIdattribute. See Rclone Configuration for a description of theconfigobject.remoteRepository* string
URL of remote repository. This is required when a download operation is scheduled. In this case leave out the
downloadIdattribute. Provided repository URLs are normalized and validated as follows: One single colon must appear separating the configuration section name and the path. The URL prefix up to the colon must exist as a key in the config object below. No slashes must appear before the colon. Multiple back to back slashes are collapsed to one, as..and.are applied accordingly. Local repositories must be absolute paths and must begin with a/. Trailing/are removed.
Examples
curl -X POST --header 'accept: application/json' --data-binary @- --dump - 'http://localhost:8529/_admin/backup/download' <<'EOF'
{
"id": "2025-10-27T12.40.57Z_f8df5d19-c91f-43a9-b641-4c5cb7b0a085",
"remoteRepository": "local://tmp/backups",
"config": {
"local": {
"type": "local"
}
}
}
EOFShow output
HTTP/1.1 202 Accepted
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 58
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
{
"error" : false,
"code" : 202,
"result" : {
"downloadId" : "73701"
}
}The result object of the body holds the downloadId string attribute which
can be used to follow the download process.
curl -X POST --header 'accept: application/json' --data-binary @- --dump - 'http://localhost:8529/_admin/backup/download' <<'EOF'
{
"downloadId": "73711"
}
EOFShow output
HTTP/1.1 200 OK
content-type: application/json
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0
connection: Keep-Alive
content-length: 374
content-security-policy: frame-ancestors 'self'; form-action 'self';
expires: 0
pragma: no-cache
server: ArangoDB
strict-transport-security: max-age=31536000 ; includeSubDomains
x-arango-queue-time-seconds: 0.000000
x-content-type-options: nosniff
{
"error" : false,
"code" : 200,
"result" : {
"Timestamp" : "2025-10-27T12:41:28Z",
"DownloadId" : "73711",
"Cancelled" : false,
"BackupId" : "2025-10-27T12.41.12Z_32195ea7-2d41-4cc6-96f7-c67f1b11a52d",
"DBServers" : {
"SNGL" : {
"Status" : "FAILED",
"Error" : 1,
"ErrorMessage" : "Failed to list source directory `local://tmp/backups/2025-10-27T12.41.12Z_32195ea7-2d41-4cc6-96f7-c67f1b11a52d`: , errors: "
}
}
}
}