Sem credencial, ou com uma que não vale mais. Mande o cookie de sessão ou o cabeçalho Authorization: Bearer.
403
A conta não é administradora. Este prefixo exige ADMIN em qualquer método, inclusive na leitura.
403
A instalação está em modo demonstração, e ali backup, armazenamento e contas ficam fora do ar.
SENT significa que o arquivo foi para o bucket, e por isso /api/backup/file recusa nesse estado.
POST/api/backup/job
Papel: Administrador
Agenda a geração de um backup.
Corpo da requisição
Campo
Tipo
Descrição
destination
enum
LOCAL grava no container; S3 manda para o bucket. Ausente usa o que estiver configurado.LOCAL · S3Ausente: o destino configurado
Requisição
curl-s-X POST http://localhost:3000/api/backup/job \-H"Authorization: Bearer $TOKEN"\-H"Content-Type: application/json"\-d'{ "destination": "S3" }'
// O backup é um JOB: o arquivo só existe quando status chega a READY.awaitfetch("http://localhost:3000/api/backup/job",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${token}`,},body: JSON.stringify({destination:"LOCAL"}),});let job;
do {awaitnewPromise((resolve)=>setTimeout(resolve,2000));const response =awaitfetch("http://localhost:3000/api/backup/job",{headers:{Authorization:`Bearer ${token}`},});
job =await response.json();}while(job.status ==="PENDING"|| job.status ==="RUNNING");
Sem credencial, ou com uma que não vale mais. Mande o cookie de sessão ou o cabeçalho Authorization: Bearer.
403
A conta não é administradora. Este prefixo exige ADMIN em qualquer método, inclusive na leitura.
403
A instalação está em modo demonstração, e ali backup, armazenamento e contas ficam fora do ar.
409
O bucket configurado não guarda backups: o escopo em vigor manda o .zip para o disco.
O name vem sem prefixo: é exatamente o que se manda de volta no campo remote da inspeção e da restauração.
POST/api/backup/inspect
Papel: Administradormultipart/form-data
Lê um backup e responde o que a restauração FARIA. Não grava byte nenhum.
Devolve a versão do formato, um bloco por espaço de trabalho com a contagem de cada escopo, os anexos que não seriam recriados e como as contas do arquivo se comparam às de hoje.
Corpo da requisição
Campo
Tipo
Descrição
file
arquivo (.zip)
O .zip enviado no multipart.
remote
string
O nome de um backup do bucket, baixado no SERVIDOR.
Requisição
# do disco…curl-s-X POST http://localhost:3000/api/backup/inspect \-H"Authorization: Bearer $TOKEN"\-F"[email protected]"# …ou de um que já está no bucket. Nunca os dois: isso é 400.curl-s-X POST http://localhost:3000/api/backup/inspect \-H"Authorization: Bearer $TOKEN"\-F"remote=notebugs-backup-2026-09-08T22-39-26.zip"
Vieram file e remote na mesma requisição. É um ou outro, nunca os dois.
401
Sem credencial, ou com uma que não vale mais. Mande o cookie de sessão ou o cabeçalho Authorization: Bearer.
403
A conta não é administradora. Este prefixo exige ADMIN em qualquer método, inclusive na leitura.
403
A instalação está em modo demonstração, e ali backup, armazenamento e contas ficam fora do ar.
422
O .zip não é um backup do NoteBugs, está corrompido ou é de uma versão que esta instalação não lê.
file e remote nunca vêm juntos: os dois é 400. Origem remota não afrouxa validação nenhuma: dali para baixo só há bytes.
POST/api/backup/import
Papel: Administradormultipart/form-data
Restaura um backup, inteiro ou recortado por espaço de trabalho.
Corpo da requisição
Campo
Tipo
Descrição
file
arquivo (.zip)
remote
string
selection
JSON
JSON com os escopos POR espaço do arquivo, mais settings e users. É o que a tela manda.
scopes
JSON (forma antiga)
A forma antiga: uma lista plana de escopos, aplicada a todos os espaços do arquivo. Continua aceita.
Requisição
# restaura tudo: sem selection nem scopescurl-s-X POST http://localhost:3000/api/backup/import \-H"Authorization: Bearer $TOKEN"\-F"[email protected]"# seleção por espaço de trabalho: é o que a tela mandacurl-s-X POST http://localhost:3000/api/backup/import \-H"Authorization: Bearer $TOKEN"\-F"remote=notebugs-backup-2026-09-08T22-39-26.zip"\-F'selection={
"tenants": {
"cmsp4djx60002p801o7ybpkv7": ["projects", "cards", "comments"]
},
"settings": false,
"users": false
}'