Skip to content

Help

API reference (v1.0.0)

Every public Boita API endpoint with parameters, request and response schemas, scopes, and examples in curl, TypeScript and Python, from the OpenAPI document.

Base URL https://api.boita.io/v1 · every request carries Authorization: Bearer boita_sk_…. Keys are created on Developers → API keys in the app and are bound to one workspace. Errors are always { "error": { "code", "message", "details" } }; the rate limit is 600 requests a minute per key.

Scopes#

A key carries one or more scopes; each operation below lists which one it needs (any one is enough).

ScopeAllows
files:readList and search files, folders, versions and trash; read transfers and watch folders
files:writeCreate folders, rename, delete and restore; start transfers; manage watch folders
shares:writeCreate, extend and revoke share links and read their details
portals:writeCreate, update and revoke upload portals and review their uploads
receipts:readRead delivery receipts, verification reports, comments and share details
webhooks:manageManage webhook endpoints and REST-hook subscriptions (Zapier, Make, n8n), read deliveries, retry and test them; poll the event stream
usage:readRead storage, bandwidth, dashboard figures and the audit log

SDKs#

The examples use the official clients, generated from this same contract: @boita/sdk for TypeScript (Node 18+ or any runtime with fetch) and boita for Python 3.9+ (standard library only). Both retry 429 and 5xx with backoff, honour Retry-After, never replay a POST except on 429/503, and throw a BoitaError carrying the API envelope. Set BOITA_API_KEY and BOITA_WORKSPACE (the id in the app URL, /app/<workspaceId>/…).

npm install @boita/sdk
Transfers The API never carries file bytes. POST …/transfers returns a transfer spec for the transfer engine on the machine that holds the files (the desktop app, the Linux agent or a gateway) to run; poll transfers.get until status is completed, then share.

Operations#

  • Files

    Browse, search and organise the workspace

    19 operations

  • Transfers

    Transfer specs and progress

    4 operations

  • Shares

    Share links and recipient comments

    9 operations

  • Receipts

    Delivery receipts, verification reports and delivery notes

    4 operations

  • Portals

    Upload portals and the uploads they receive

    6 operations

  • Webhooks

    Endpoints, deliveries and the signed event stream

    12 operations

  • Events

    Polling alternative to webhooks

    1 operation

  • Usage

    Storage and bandwidth figures

    2 operations

  • Cloud

    Deliveries to connected Google Drive, Dropbox, OneDrive and Box folders

    3 operations

Files#

Browse, search and organise the workspace

GETList a folder#

/workspaces/{workspaceId}/files

SDK: files.list · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
pathquerystringmax length 4096 · default ""
skipqueryintegerminimum 0 · default 0
countqueryintegerminimum 1, maximum 1000 · default 200

Response 200 · application/json

FieldTypeNotes
pathrequiredstring
accessrequiredstring
itemsrequiredarray of FileEntry
FieldTypeNotes
namerequiredstring
pathrequiredstring
typerequired"file" | "folder" | "link"
sizerequiredintegernullable
modifiedAtrequiredstringnullable
encryptedrequiredboolean
previewboolean
totalrequiredinteger

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/files?path=&count=200" \
  -H "Authorization: Bearer $BOITA_API_KEY"

PATCHRename a file or folder#

/workspaces/{workspaceId}/files

SDK: files.rename · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
pathrequiredstringmin length 1, max length 4096
newNamerequiredstringmin length 1, max length 255

Response 200 · application/json

FieldTypeNotes
okrequiredboolean

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X PATCH "https://api.boita.io/v1/workspaces/$WORKSPACE/files" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"path":"deliveries/ep01/EP01_final.mov","newName":"EP01_final.mov"}'

DELETEMove files to the trash (or delete permanently)#

/workspaces/{workspaceId}/files

SDK: files.delete · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
pathsrequiredarray of stringmin items 1, max items 500
permanentboolean · default false

Response 200 · application/json

FieldTypeNotes
okrequiredboolean

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X DELETE "https://api.boita.io/v1/workspaces/$WORKSPACE/files" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"paths":["deliveries/ep01/EP01_final.mov"],"permanent":false}'

GETEvery file under a folder with size and modification time (for sync clients)#

/workspaces/{workspaceId}/files/manifest

SDK: files.manifest · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
pathquerystringmax length 4096 · default ""

Response 200 · application/json

FieldTypeNotes
rootrequiredstring
filesrequiredarray of object
FieldTypeNotes
pathrequiredstring
sizerequiredinteger
modifiedAtrequiredstringnullable
truncatedrequiredboolean

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/files/manifest?path=" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTCreate a folder#

/workspaces/{workspaceId}/files/folder

SDK: files.createFolder · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
pathrequiredstringmin length 1, max length 4096

Response 201 · application/json

FieldTypeNotes
okrequiredboolean

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/files/folder" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"path":"deliveries/ep01/EP01_final.mov"}'

GETList the trash#

/workspaces/{workspaceId}/files/trash

SDK: files.listTrash · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Response 200 · application/json

FieldTypeNotes
idrequiredstring
pathrequiredstring
namerequiredstring
sizeBytesrequirednumbernullable
deletedAtrequiredstring (date-time)ISO 8601 timestamp · date-time
purgeAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/files/trash" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTRestore a trashed item#

/workspaces/{workspaceId}/files/trash/{itemId}/restore

SDK: files.restoreFromTrash · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
itemIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
okrequiredboolean

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/files/trash/<itemId>/restore" \
  -H "Authorization: Bearer $BOITA_API_KEY"

DELETEPurge one trashed item now#

/workspaces/{workspaceId}/files/trash/{itemId}

SDK: files.purgeFromTrash · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
itemIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
okrequiredboolean

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X DELETE "https://api.boita.io/v1/workspaces/$WORKSPACE/files/trash/<itemId>" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETList kept versions of a file#

/workspaces/{workspaceId}/files/versions

SDK: files.listVersions · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
pathrequiredquerystringmin length 1, max length 4096

Response 200 · application/json

FieldTypeNotes
idrequiredstring
pathrequiredstring
sizeBytesrequirednumbernullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/files/versions?path=deliveries%2Fep01%2FEP01_final.mov" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTRestore a kept version#

/workspaces/{workspaceId}/files/versions/{versionId}/restore

SDK: files.restoreVersion · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
versionIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
okrequiredboolean

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/files/versions/<versionId>/restore" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETThumbnail of a file#

/workspaces/{workspaceId}/files/preview

SDK: files.preview · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
pathrequiredquerystringmin length 1, max length 4096

Response 200 · image/jpeg

string

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/files/preview?path=deliveries%2Fep01%2FEP01_final.mov" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETRendered proxies of a file#

/workspaces/{workspaceId}/files/proxies

What the proxy pipeline has rendered for a file or a kept version (720p MP4, waveform, contact sheet, PDF pages), with its media kind and frame rate.

SDK: files.proxyStatus · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
pathquerystringmax length 4096 · default ""
versionquerystring

Response 200 · application/json

FieldTypeNotes
mediarequired"video" | "audio" | "image" | "pdf"nullable
fpsrequirednumbernullable
durationMsrequiredintegernullable
proxiesrequiredarray of object
FieldTypeNotes
kindrequired"proxy720" | "waveform" | "contact_sheet" | "page"
pagerequiredinteger
statusrequiredstring
widthrequiredintegernullable
heightrequiredintegernullable
durationMsrequiredintegernullable
errorrequiredstringnullable

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/files/proxies?path=" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTRender proxies now#

/workspaces/{workspaceId}/files/proxies

Queues the proxies a file (or a kept version) needs. Video and audio queue on upload; images and PDFs render on demand.

SDK: files.renderProxies · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
pathsarray of stringmax items 50
versionsarray of stringmax items 50

Response 200 · application/json

FieldTypeNotes
queuedrequiredinteger

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/files/proxies" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"paths":["deliveries/ep01/EP01_final.mov"],"versions":["…"]}'

GETA rendered proxy (supports Range)#

/workspaces/{workspaceId}/files/proxy

SDK: files.proxy · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
pathquerystringmax length 4096 · default ""
kindrequiredquery"proxy720" | "waveform" | "contact_sheet" | "page"
pagequeryintegerminimum 0, maximum 50 · default 0
versionquerystring

Response 200 · application/octet-stream

string

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/files/proxy?path=&kind=proxy720" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTQueue a server-side move or copy#

/workspaces/{workspaceId}/files/operations

The workers copy through the transfer engine, verify size and count, and delete the originals only then (move). Conflicts are refused unless `overwrite` is true; a selected frame of a numbered set takes the whole set unless `expandSequences` is false. Caps: 200 items and 500 GB per job (250 GB on plans without the feature).

SDK: files.createOperation · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
kindrequired"move" | "copy"
pathsrequiredarray of stringmin items 1, max items 200
destinationstringmax length 4096 · default ""
overwriteboolean · default false
expandSequencesboolean · default true

Response 201 · application/json

FieldTypeNotes
idrequiredstring
kindrequired"move" | "copy"
statusrequired"queued" | "running" | "completed" | "failed" | "cancelled"
destinationrequiredstring
overwriterequiredboolean
itemsrequiredarray of object
FieldTypeNotes
pathrequiredstring
typerequired"file" | "folder"
bytesrequirednumber
filesTotalrequiredinteger
filesDonerequiredinteger
bytesTotalrequirednumber
bytesDonerequirednumber
errorrequiredstringnullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
startedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
finishedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/files/operations" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"move","paths":["deliveries/ep01/EP01_final.mov"],"destination":""}'

GETMove/copy jobs of the workspace#

/workspaces/{workspaceId}/files/operations

SDK: files.listOperations · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
activequery"1" | "true"
limitqueryintegerminimum 1, maximum 200 · default 50

Response 200 · application/json

FieldTypeNotes
idrequiredstring
kindrequired"move" | "copy"
statusrequired"queued" | "running" | "completed" | "failed" | "cancelled"
destinationrequiredstring
overwriterequiredboolean
itemsrequiredarray of object
FieldTypeNotes
pathrequiredstring
typerequired"file" | "folder"
bytesrequirednumber
filesTotalrequiredinteger
filesDonerequiredinteger
bytesTotalrequirednumber
bytesDonerequirednumber
errorrequiredstringnullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
startedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
finishedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/files/operations" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTCancel a queued or running move/copy job#

/workspaces/{workspaceId}/files/operations/{jobId}/cancel

SDK: files.cancelOperation · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
jobIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
idrequiredstring
kindrequired"move" | "copy"
statusrequired"queued" | "running" | "completed" | "failed" | "cancelled"
destinationrequiredstring
overwriterequiredboolean
itemsrequiredarray of object
FieldTypeNotes
pathrequiredstring
typerequired"file" | "folder"
bytesrequirednumber
filesTotalrequiredinteger
filesDonerequiredinteger
bytesTotalrequirednumber
bytesDonerequirednumber
errorrequiredstringnullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
startedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
finishedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/files/operations/<jobId>/cancel" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTRename many items with a pattern (preview with dryRun)#

/workspaces/{workspaceId}/files/rename-batch

Find/replace, prefix/suffix and numbering with padding. `dryRun: true` returns the plan and conflicts without touching anything; the apply runs exactly that plan.

SDK: files.renameBatch · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
pathsrequiredarray of stringmin items 1, max items 200
patternrequiredobject
FieldTypeNotes
findstringmax length 255
replacestringmax length 255
regexboolean
ignoreCaseboolean
includeExtensionboolean
prefixstringmax length 120
suffixstringmax length 120
numberingobject
FieldTypeNotes
startintegerminimum 0, maximum 999999 · default 1
stepintegerminimum 1, maximum 1000 · default 1
paddingintegerminimum 1, maximum 8 · default 3
position"prefix" | "suffix" | "replace" · default "suffix"
separatorstringmax length 8 · default "_"
dryRunboolean · default false
overwriteboolean · default false
expandSequencesboolean · default true

Response 200 · application/json

FieldTypeNotes
dryRunrequiredboolean
expandedrequiredinteger
changedrequiredinteger
stepsrequiredarray of object
FieldTypeNotes
fromrequiredstring
torequiredstring
namerequiredstring
newNamerequiredstring
changedrequiredboolean
conflictsrequiredarray of object
FieldTypeNotes
pathrequiredstring
namerequiredstring
reasonrequired"duplicate_target" | "exists" | "invalid"
appliedrequiredarray of object
FieldTypeNotes
fromrequiredstring
torequiredstring
failedrequiredobjectnullable
FieldTypeNotes
fromrequiredstring
torequiredstring
errorrequiredstring

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/files/rename-batch" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"paths":["deliveries/ep01/EP01_final.mov"],"pattern":{"find":"…","replace":"…","regex":true},"dryRun":false}'

Transfers#

Transfer specs and progress

POSTRequest a transfer spec#

/workspaces/{workspaceId}/transfers

Returns a spec the transfer engine (Boita desktop, the CLI agent or a gateway) runs; the API never moves bytes itself.

SDK: transfers.create · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
directionrequired"send" | "receive"
pathsrequiredarray of objectmin items 1, max items 10000
FieldTypeNotes
sourcerequiredstringmin length 1, max length 4096
destinationstringmin length 1, max length 4096
destinationRootany
sourceRootany
fileCountintegerminimum 0
totalBytesintegerminimum 0
streamsintegerminimum 1, maximum 128
growingFileWaitSecondsintegerminimum 1, maximum 3600
contentProtectionPasswordstringmin length 8, max length 256
priority"normal" | "deadline" | "background"
deliverToarray of stringmax items 20
rawAscpboolean
speedModeboolean
client"web" | "desktop" | "mobile" | "gateway" | "share" | "portal" | "agent" · default "agent"
deviceIdstring
shareIdstring
portalIdstring

Response 201 · application/json

FieldTypeNotes
transferIdrequiredstring
transferSpecrequiredobjectHand this to the transfer engine unchanged; it is valid for a short window.
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/transfers" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"direction":"send","paths":[{"source":"deliveries/ep01/EP01_final.mov","destination":"deliveries/ep01/EP01_final.mov"}],"destinationRoot":null}'

GETList recent transfers#

/workspaces/{workspaceId}/transfers

SDK: transfers.list · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Response 200 · application/json

FieldTypeNotes
idrequiredstring
directionrequired"send" | "receive"
clientrequiredstring
enginerequiredstring
statusrequired"queued" | "running" | "paused" | "completed" | "failed" | "cancelled"
streamsrequiredinteger
priorityrequiredstring
usageIdrequiredstring
filesTotalrequiredintegernullable
filesDonerequiredinteger
bytesTotalrequirednumbernullable
bytesDonerequirednumber
avgRateKbpsrequirednumbernullable
startedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
finishedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
errorCoderequiredstringnullable
errorMessagerequiredstringnullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/transfers" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETGet one transfer#

/workspaces/{workspaceId}/transfers/{transferId}

SDK: transfers.get · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
transferIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
idrequiredstring
directionrequired"send" | "receive"
clientrequiredstring
enginerequiredstring
statusrequired"queued" | "running" | "paused" | "completed" | "failed" | "cancelled"
streamsrequiredinteger
priorityrequiredstring
usageIdrequiredstring
filesTotalrequiredintegernullable
filesDonerequiredinteger
bytesTotalrequirednumbernullable
bytesDonerequirednumber
avgRateKbpsrequirednumbernullable
startedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
finishedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
errorCoderequiredstringnullable
errorMessagerequiredstringnullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/transfers/<transferId>" \
  -H "Authorization: Bearer $BOITA_API_KEY"

PATCHReport client-side progress#

/workspaces/{workspaceId}/transfers/{transferId}

SDK: transfers.reportProgress · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
transferIdrequiredpathstring

Request body (application/json, required)

FieldTypeNotes
statusrequired"queued" | "running" | "paused" | "completed" | "failed" | "cancelled"
bytesDonerequiredintegerminimum 0
bytesTotalintegerminimum 0
filesDonerequiredintegerminimum 0
filesTotalintegerminimum 0
rateKbpsnumberminimum 0
errorCodestring
errorMessagestringmax length 500

Response 200 · application/json

FieldTypeNotes
idrequiredstring
directionrequired"send" | "receive"
clientrequiredstring
enginerequiredstring
statusrequired"queued" | "running" | "paused" | "completed" | "failed" | "cancelled"
streamsrequiredinteger
priorityrequiredstring
usageIdrequiredstring
filesTotalrequiredintegernullable
filesDonerequiredinteger
bytesTotalrequirednumbernullable
bytesDonerequirednumber
avgRateKbpsrequirednumbernullable
startedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
finishedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
errorCoderequiredstringnullable
errorMessagerequiredstringnullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X PATCH "https://api.boita.io/v1/workspaces/$WORKSPACE/transfers/<transferId>" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"queued","bytesDone":48000000000,"bytesTotal":48000000000,"filesDone":0}'

Shares#

Share links and recipient comments

POSTCreate a share link#

/workspaces/{workspaceId}/shares

SDK: shares.create · scope: shares:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
mode"drive" | "send" · default "drive"
pathsrequiredarray of stringmin items 1, max items 500
titlestringmax length 200
messagestringmax length 4000
expiresInDaysintegerminimum 1, maximum 3650
maxDownloadsintegerminimum 1, maximum 100000
passwordstringmin length 8, max length 256
notifyOnDownloadboolean
allowPreviewboolean
allowCommentsboolean
requireEmailboolean
recipientsarray of string (email)max items 200
phonesarray of stringmax items 200
availableFromstring (date-time)date-time
viewOnlyboolean
watermarkboolean
templateIdstringmax length 64
recipientGroupsarray of stringmax items 20
reviewRolesobject
projectIdstringmax length 64, nullable
locale"en"nullable

Response 201 · application/json

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstringRelative on the app host, absolute on a custom domain
moderequired"drive" | "send"
titlerequiredstringnullable
messagerequiredstringnullable
hasPasswordrequiredboolean
statusrequiredstring
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time
maxDownloadsrequiredintegernullable
downloadCountrequiredinteger
viewCountrequiredinteger
requireEmailrequiredboolean
allowCommentsrequiredboolean
viewOnlyrequiredboolean
watermarkrequiredboolean
availableFromrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
itemsrequiredarray of ShareItem
FieldTypeNotes
pathrequiredstring
namerequiredstring
typerequired"file" | "folder"
sizeBytesrequirednumbernullable
recipientsrequiredarray of ShareRecipient
FieldTypeNotes
emailrequiredstringnullable
phonerequiredstringnullable
labelrequiredstring
urlrequiredstring
firstViewedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
verifiedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/shares" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode":"drive","paths":["deliveries/ep01/EP01_final.mov"],"title":"EP01 final"}'

GETList share links#

/workspaces/{workspaceId}/shares

SDK: shares.list · scopes: shares:writereceipts:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Response 200 · application/json

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstringRelative on the app host, absolute on a custom domain
moderequired"drive" | "send"
titlerequiredstringnullable
messagerequiredstringnullable
hasPasswordrequiredboolean
statusrequiredstring
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time
maxDownloadsrequiredintegernullable
downloadCountrequiredinteger
viewCountrequiredinteger
requireEmailrequiredboolean
allowCommentsrequiredboolean
viewOnlyrequiredboolean
watermarkrequiredboolean
availableFromrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
itemsrequiredarray of ShareItem
FieldTypeNotes
pathrequiredstring
namerequiredstring
typerequired"file" | "folder"
sizeBytesrequirednumbernullable
recipientsrequiredarray of ShareRecipient
FieldTypeNotes
emailrequiredstringnullable
phonerequiredstringnullable
labelrequiredstring
urlrequiredstring
firstViewedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
verifiedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/shares" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETGet a share link with its activity#

/workspaces/{workspaceId}/shares/{shareId}

SDK: shares.get · scopes: shares:writereceipts:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstringRelative on the app host, absolute on a custom domain
moderequired"drive" | "send"
titlerequiredstringnullable
messagerequiredstringnullable
hasPasswordrequiredboolean
statusrequiredstring
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time
maxDownloadsrequiredintegernullable
downloadCountrequiredinteger
viewCountrequiredinteger
requireEmailrequiredboolean
allowCommentsrequiredboolean
viewOnlyrequiredboolean
watermarkrequiredboolean
availableFromrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
itemsrequiredarray of ShareItem
FieldTypeNotes
pathrequiredstring
namerequiredstring
typerequired"file" | "folder"
sizeBytesrequirednumbernullable
recipientsrequiredarray of ShareRecipient
FieldTypeNotes
emailrequiredstringnullable
phonerequiredstringnullable
labelrequiredstring
urlrequiredstring
firstViewedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
verifiedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
eventsrequiredarray of object
FieldTypeNotes
typerequiredstring
atrequiredstring (date-time)ISO 8601 timestamp · date-time
iprequiredstringnullable
userAgentrequiredstringnullable
recipientrequiredstringnullable

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/<shareId>" \
  -H "Authorization: Bearer $BOITA_API_KEY"

PATCHExtend a share link#

/workspaces/{workspaceId}/shares/{shareId}

SDK: shares.extend · scope: shares:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdrequiredpathstring

Request body (application/json, required)

FieldTypeNotes
expiresInDaysintegerminimum 1, maximum 3650
projectIdstringmax length 64, nullable

Response 200 · application/json

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstringRelative on the app host, absolute on a custom domain
moderequired"drive" | "send"
titlerequiredstringnullable
messagerequiredstringnullable
hasPasswordrequiredboolean
statusrequiredstring
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time
maxDownloadsrequiredintegernullable
downloadCountrequiredinteger
viewCountrequiredinteger
requireEmailrequiredboolean
allowCommentsrequiredboolean
viewOnlyrequiredboolean
watermarkrequiredboolean
availableFromrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
itemsrequiredarray of ShareItem
FieldTypeNotes
pathrequiredstring
namerequiredstring
typerequired"file" | "folder"
sizeBytesrequirednumbernullable
recipientsrequiredarray of ShareRecipient
FieldTypeNotes
emailrequiredstringnullable
phonerequiredstringnullable
labelrequiredstring
urlrequiredstring
firstViewedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
verifiedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X PATCH "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/<shareId>" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expiresInDays":7,"projectId":"ckz7…"}'

DELETERevoke a share link#

/workspaces/{workspaceId}/shares/{shareId}

SDK: shares.revoke · scope: shares:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdrequiredpathstring

Response 204

No body.

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X DELETE "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/<shareId>" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTExtend, revoke or re-notify many links#

/workspaces/{workspaceId}/shares/bulk

SDK: shares.bulk · scope: shares:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
idsrequiredarray of stringmin items 1, max items 200
actionrequired"extend" | "revoke" | "renotify"
daysintegerminimum 1, maximum 3650

Response 200 · application/json

FieldTypeNotes
donerequiredinteger
failedarray of object
FieldTypeNotes
idrequiredstring
errorrequiredstring

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/bulk" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":["ckz7…"],"action":"extend","days":7}'

POSTAdd recipients (email or WhatsApp number) to a live link#

/workspaces/{workspaceId}/shares/{shareId}/recipients

SDK: shares.addRecipients · scope: shares:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdrequiredpathstring

Request body (application/json, required)

FieldTypeNotes
emailsarray of string (email)max items 200
phonesarray of stringmax items 200

Response 200 · application/json

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstringRelative on the app host, absolute on a custom domain
moderequired"drive" | "send"
titlerequiredstringnullable
messagerequiredstringnullable
hasPasswordrequiredboolean
statusrequiredstring
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time
maxDownloadsrequiredintegernullable
downloadCountrequiredinteger
viewCountrequiredinteger
requireEmailrequiredboolean
allowCommentsrequiredboolean
viewOnlyrequiredboolean
watermarkrequiredboolean
availableFromrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
itemsrequiredarray of ShareItem
FieldTypeNotes
pathrequiredstring
namerequiredstring
typerequired"file" | "folder"
sizeBytesrequirednumbernullable
recipientsrequiredarray of ShareRecipient
FieldTypeNotes
emailrequiredstringnullable
phonerequiredstringnullable
labelrequiredstring
urlrequiredstring
firstViewedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
verifiedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
eventsrequiredarray of object
FieldTypeNotes
typerequiredstring
atrequiredstring (date-time)ISO 8601 timestamp · date-time
iprequiredstringnullable
userAgentrequiredstringnullable
recipientrequiredstringnullable

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/<shareId>/recipients" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"emails":["post@client.tv"],"phones":["…"]}'

GETList recipient comments#

/workspaces/{workspaceId}/shares/{shareId}/comments

SDK: shares.listComments · scope: receipts:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
idrequiredstring
bodyrequiredstring
authorrequiredstringnullable
itemPathrequiredstringnullable
resolvedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/<shareId>/comments" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTReply to recipients#

/workspaces/{workspaceId}/shares/{shareId}/comments

SDK: shares.reply · scope: shares:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdrequiredpathstring

Request body (application/json, required)

FieldTypeNotes
itemPathstringmax length 4096
bodyrequiredstringmin length 1, max length 2000
parentIdstringmax length 64
timecodestringmax length 20
timecodeMsintegerminimum 0, maximum 2592000000
annotationobject
FieldTypeNotes
vrequirednumber
aspectnumberminimum 0.1, maximum 10
pageintegerminimum 1, maximum 50
strokesrequiredarray of objectmin items 1, max items 200
FieldTypeNotes
toolrequired"pen" | "arrow" | "rect"
colorrequiredstring
widthrequirednumberminimum 0.001, maximum 0.05
pointsrequiredarray of array of itemsmin items 2, max items 2000

Response 201 · application/json

FieldTypeNotes
idrequiredstring
bodyrequiredstring
authorrequiredstringnullable
itemPathrequiredstringnullable
resolvedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/<shareId>/comments" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"itemPath":"deliveries/ep01/EP01_final.mov","body":"Final grade, please confirm.","parentId":"ckz7…"}'

Receipts#

Delivery receipts, verification reports and delivery notes

GETDelivery receipt#

/workspaces/{workspaceId}/shares/{shareId}/receipt

Who viewed, who downloaded, per-file checksums and whether every download verified.

SDK: receipts.get · scope: receipts:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
receiptIdrequiredstring
sharerequiredobject
FieldTypeNotes
urlrequiredstring
titlerequiredstringnullable
statusrequiredstring
hasPasswordrequiredboolean
maxDownloadsrequiredintegernullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time
viewCountrequiredinteger
downloadCountrequiredinteger
itemsrequiredarray of ShareItem
FieldTypeNotes
pathrequiredstring
namerequiredstring
typerequired"file" | "folder"
sizeBytesrequirednumbernullable
totalBytesrequirednumbernullable
recipientsrequiredarray of object
FieldTypeNotes
emailrequiredstringnullable
phonerequiredstringnullable
labelrequiredstring
firstViewedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
verifiedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadsrequiredinteger
statusrequired"sent" | "viewed" | "downloaded"
anonymousrequiredobject
FieldTypeNotes
viewsrequiredinteger
downloadsrequiredinteger
downloadsrequiredarray of object
FieldTypeNotes
transferIdrequiredstring
recipientrequiredstringnullable
clientrequiredstring
filesrequiredinteger
bytesrequirednumber
rateMbpsrequirednumbernullable
completedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
secondsrequirednumbernullable
timelinerequiredarray of object
FieldTypeNotes
typerequiredstring
atrequiredstring (date-time)ISO 8601 timestamp · date-time
recipientrequiredstringnullable
clientrequiredstringnullable
integrityrequired"verified" | "none"
filesrequiredarray of object
FieldTypeNotes
pathrequiredstring
sizeBytesrequirednumbernullable
checksumTyperequiredstringnullable
checksumrequiredstringnullable
downloadsrequiredinteger
verifiedDownloadsrequiredinteger
verifiedrequiredboolean
checksumTyperequiredstring

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/<shareId>/receipt" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETDelivery receipt as PDF#

/workspaces/{workspaceId}/shares/{shareId}/receipt.pdf

SDK: receipts.pdf · scope: receipts:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdrequiredpathstring

Response 200 · application/pdf

string

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/<shareId>/receipt.pdf" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETVerification report as CSV#

/workspaces/{workspaceId}/shares/{shareId}/receipt.csv

SDK: receipts.verificationCsv · scope: receipts:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdrequiredpathstring

Response 200 · text/csv

string

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/<shareId>/receipt.csv" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETPrintable delivery note#

/workspaces/{workspaceId}/shares/{shareId}/delivery-note.pdf

SDK: receipts.deliveryNotePdf · scope: receipts:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdrequiredpathstring

Response 200 · application/pdf

string

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/shares/<shareId>/delivery-note.pdf" \
  -H "Authorization: Bearer $BOITA_API_KEY"

Portals#

Upload portals and the uploads they receive

POSTCreate an upload portal#

/workspaces/{workspaceId}/portals

SDK: portals.create · scope: portals:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
fieldsarray of objectmax items 20
FieldTypeNotes
keyrequiredstringmin length 1, max length 40
labelrequiredstringmin length 1, max length 80
requiredboolean · default false
type"text" | "select" · default "text"
optionsarray of stringmax items 50
hintstringmax length 200
rulesobject
FieldTypeNotes
allowedExtensionsarray of stringmax items 50
maxFilesintegerminimum 1, maximum 5000
namePatternstringmax length 200
namePatternHintstringmax length 200
minBytesintegerminimum 0
specobject
FieldTypeNotes
namestringmax length 80
containersarray of stringmax items 20
videoCodecsarray of stringmax items 20
audioCodecsarray of stringmax items 20
minWidthinteger
minHeightinteger
fpsarray of numbermax items 10
audioChannelsarray of integermax items 5
minDurationSecondsnumberminimum 0
maxDurationSecondsnumber
dueAtstring (date-time)date-time
inviteEmailsarray of string (email)max items 100
invitePhonesarray of stringmax items 100
titlerequiredstringmin length 1, max length 120
messagestringmax length 2000
targetPathstringmax length 4096 · default ""
requireEmailboolean
passwordstringmin length 8, max length 256
maxBytesPerUploadinteger
expiresInDaysintegerminimum 1, maximum 3650
notifyOnUploadboolean
projectIdstringmax length 64, nullable

Response 201 · application/json

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstring
titlerequiredstring
messagerequiredstringnullable
targetPathrequiredstring
requireEmailrequiredboolean
hasPasswordrequiredboolean
maxBytesPerUploadrequirednumbernullable
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
notifyOnUploadrequiredboolean
statusrequired"active" | "paused" | "revoked"
uploadCountrequiredinteger
bytesReceivedrequirednumber
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/portals" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fields":[{"key":"…","label":"…","required":false}],"rules":{"allowedExtensions":["…"],"maxFiles":1,"namePattern":"…"},"spec":{"name":"EP01_final.mov","containers":["…"],"videoCodecs":["…"]},"title":"EP01 final"}'

GETList upload portals#

/workspaces/{workspaceId}/portals

SDK: portals.list · scopes: portals:writereceipts:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Response 200 · application/json

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstring
titlerequiredstring
messagerequiredstringnullable
targetPathrequiredstring
requireEmailrequiredboolean
hasPasswordrequiredboolean
maxBytesPerUploadrequirednumbernullable
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
notifyOnUploadrequiredboolean
statusrequired"active" | "paused" | "revoked"
uploadCountrequiredinteger
bytesReceivedrequirednumber
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/portals" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETGet a portal with its uploads#

/workspaces/{workspaceId}/portals/{portalId}

SDK: portals.get · scopes: portals:writereceipts:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
portalIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstring
titlerequiredstring
messagerequiredstringnullable
targetPathrequiredstring
requireEmailrequiredboolean
hasPasswordrequiredboolean
maxBytesPerUploadrequirednumbernullable
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
notifyOnUploadrequiredboolean
statusrequired"active" | "paused" | "revoked"
uploadCountrequiredinteger
bytesReceivedrequirednumber
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
uploadsrequiredarray of PortalUpload
FieldTypeNotes
idrequiredstring
senderEmailrequiredstringnullable
senderNamerequiredstringnullable
messagerequiredstringnullable
folderPathrequiredstring
fileCountrequiredintegernullable
bytesTotalrequirednumbernullable
bytesDonerequirednumber
statusrequiredstring
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
completedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/portals/<portalId>" \
  -H "Authorization: Bearer $BOITA_API_KEY"

PATCHUpdate or pause a portal#

/workspaces/{workspaceId}/portals/{portalId}

SDK: portals.update · scope: portals:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
portalIdrequiredpathstring

Request body (application/json, required)

FieldTypeNotes
projectIdstringmax length 64, nullable
titlestringmin length 1, max length 120
messagestringmax length 2000, nullable
status"active" | "paused"
requireEmailboolean
passwordstringmin length 8, max length 256, nullable
maxBytesPerUploadintegernullable
expiresInDaysintegerminimum 1, maximum 3650, nullable
notifyOnUploadboolean

Response 200 · application/json

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstring
titlerequiredstring
messagerequiredstringnullable
targetPathrequiredstring
requireEmailrequiredboolean
hasPasswordrequiredboolean
maxBytesPerUploadrequirednumbernullable
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
notifyOnUploadrequiredboolean
statusrequired"active" | "paused" | "revoked"
uploadCountrequiredinteger
bytesReceivedrequirednumber
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X PATCH "https://api.boita.io/v1/workspaces/$WORKSPACE/portals/<portalId>" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"projectId":"ckz7…","title":"EP01 final","message":"Final grade, please confirm."}'

DELETERevoke a portal#

/workspaces/{workspaceId}/portals/{portalId}

SDK: portals.revoke · scope: portals:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
portalIdrequiredpathstring

Response 204

No body.

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X DELETE "https://api.boita.io/v1/workspaces/$WORKSPACE/portals/<portalId>" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTApprove or reject an upload#

/workspaces/{workspaceId}/portals/{portalId}/uploads/{uploadId}/review

SDK: portals.reviewUpload · scope: portals:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
portalIdrequiredpathstring
uploadIdrequiredpathstring

Request body (application/json, required)

FieldTypeNotes
decisionrequired"approved" | "rejected" | "pending"
notestringmax length 500

Response 200 · application/json

FieldTypeNotes
idrequiredstring
senderEmailrequiredstringnullable
senderNamerequiredstringnullable
messagerequiredstringnullable
folderPathrequiredstring
fileCountrequiredintegernullable
bytesTotalrequirednumbernullable
bytesDonerequirednumber
statusrequiredstring
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
completedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/portals/<portalId>/uploads/<uploadId>/review" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"decision":"approved","note":"Final grade, please confirm."}'

Webhooks#

Endpoints, deliveries and the signed event stream

GETEvent types an endpoint can subscribe to#

/workspaces/{workspaceId}/webhooks/events

SDK: webhooks.eventTypes · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Response 200 · application/json

FieldTypeNotes
eventsrequiredarray of string

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/webhooks/events" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTCreate a webhook endpoint#

/workspaces/{workspaceId}/webhooks

SDK: webhooks.create · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
urlrequiredstringmin length 8, max length 2048
eventsrequiredarray of stringmin items 1, max items 50
descriptionstringmax length 200

Response 201 · application/json

FieldTypeNotes
idrequiredstring
urlrequiredstring
descriptionrequiredstringnullable
eventsrequiredarray of string
statusrequired"active" | "disabled"
failureCountrequiredinteger
lastDeliveryAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
secretrequiredstringSigning secret, shown once

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/webhooks" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hook","events":["…"],"description":"…"}'

GETList webhook endpoints#

/workspaces/{workspaceId}/webhooks

SDK: webhooks.list · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Response 200 · application/json

FieldTypeNotes
idrequiredstring
urlrequiredstring
descriptionrequiredstringnullable
eventsrequiredarray of string
statusrequired"active" | "disabled"
failureCountrequiredinteger
lastDeliveryAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/webhooks" \
  -H "Authorization: Bearer $BOITA_API_KEY"

PATCHUpdate, disable or re-enable an endpoint#

/workspaces/{workspaceId}/webhooks/{webhookId}

SDK: webhooks.update · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
webhookIdrequiredpathstring

Request body (application/json, required)

FieldTypeNotes
urlstringmin length 8, max length 2048
eventsarray of stringmin items 1, max items 50
descriptionstringmax length 200, nullable
status"active" | "disabled"

Response 200 · application/json

FieldTypeNotes
idrequiredstring
urlrequiredstring
descriptionrequiredstringnullable
eventsrequiredarray of string
statusrequired"active" | "disabled"
failureCountrequiredinteger
lastDeliveryAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X PATCH "https://api.boita.io/v1/workspaces/$WORKSPACE/webhooks/<webhookId>" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hook","events":["…"],"description":"…"}'

DELETEDelete an endpoint#

/workspaces/{workspaceId}/webhooks/{webhookId}

SDK: webhooks.delete · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
webhookIdrequiredpathstring

Response 204

No body.

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X DELETE "https://api.boita.io/v1/workspaces/$WORKSPACE/webhooks/<webhookId>" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTRotate the signing secret#

/workspaces/{workspaceId}/webhooks/{webhookId}/rotate-secret

SDK: webhooks.rotateSecret · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
webhookIdrequiredpathstring

Response 201 · application/json

FieldTypeNotes
idrequiredstring
secretrequiredstring

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/webhooks/<webhookId>/rotate-secret" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTSend a webhook.test event to this endpoint#

/workspaces/{workspaceId}/webhooks/{webhookId}/test

SDK: webhooks.sendTest · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
webhookIdrequiredpathstring

Response 201 · application/json

FieldTypeNotes
eventIdrequiredstring
deliveryIdstring

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/webhooks/<webhookId>/test" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETRecent deliveries to an endpoint#

/workspaces/{workspaceId}/webhooks/{webhookId}/deliveries

SDK: webhooks.listDeliveries · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
webhookIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
idrequiredstring
eventIdrequiredstring
typerequiredstring
statusrequired"pending" | "delivered" | "failed"
attemptsrequiredinteger
nextAttemptAtrequiredstring (date-time)ISO 8601 timestamp · date-time
lastStatusCoderequiredintegernullable
lastErrorrequiredstringnullable
deliveredAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/webhooks/<webhookId>/deliveries" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTRetry a delivery now#

/workspaces/{workspaceId}/webhooks/{webhookId}/deliveries/{deliveryId}/retry

SDK: webhooks.retryDelivery · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
webhookIdrequiredpathstring
deliveryIdrequiredpathstring

Response 201 · application/json

FieldTypeNotes
idrequiredstring
statusrequiredstring

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/webhooks/<webhookId>/deliveries/<deliveryId>/retry" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTSubscribe a REST hook#

/workspaces/{workspaceId}/hooks/subscribe

Zapier-style REST hook: creates a webhook endpoint for the event(s) and returns its id. Same limits as webhook endpoints (10 per workspace).

SDK: hooks.subscribe · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
target_urlrequiredstringWhere to POST events (https) · min length 8, max length 2048
eventstringOne event type (alternative to `events`) · min length 1, max length 64
eventsarray of stringEvent types, or ["*"] · min items 1, max items 50
source"zapier" | "make" | "n8n" | "other"Shown next to the endpoint on the Developers page

Response 201 · application/json

FieldTypeNotes
idrequiredstring
urlrequiredstring
eventsrequiredarray of string
secretrequiredstringSigning secret, shown once
sourcerequiredstring
unsubscribeUrlrequiredstringRelative; DELETE it to unsubscribe

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/hooks/subscribe" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target_url":"https://example.com/hook","event":"…","events":["…"]}'

DELETEUnsubscribe a REST hook#

/workspaces/{workspaceId}/hooks/unsubscribe/{hookId}

SDK: hooks.unsubscribe · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
hookIdrequiredpathstring

Response 204

No body.

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X DELETE "https://api.boita.io/v1/workspaces/$WORKSPACE/hooks/unsubscribe/<hookId>" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETA sample delivery for an event type#

/workspaces/{workspaceId}/hooks/sample

The exact envelope the worker POSTs, with realistic data, so a trigger can be built before the first event.

SDK: hooks.sample · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
eventrequiredquerystringmin length 1, max length 64

Response 200 · application/json

FieldTypeNotes
idrequiredstring
typerequiredstring
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
workspaceIdrequiredstring
datarequiredobject
deliveryrequiredobject
FieldTypeNotes
idrequiredstring
attemptrequiredinteger

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/hooks/sample?event=%E2%80%A6" \
  -H "Authorization: Bearer $BOITA_API_KEY"

Events#

Polling alternative to webhooks

GETPoll the workspace event stream#

/workspaces/{workspaceId}/events

Pass `after` = the last id you saw to page forward; the same events webhooks deliver.

SDK: events.list · scope: webhooks:manage

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
afterquerystringmax length 64
typequerystringmax length 64
limitqueryintegerminimum 1, maximum 200

Response 200 · application/json

FieldTypeNotes
idrequiredstring
typerequiredstring
datarequiredobject
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/events" \
  -H "Authorization: Bearer $BOITA_API_KEY"

Usage#

Storage and bandwidth figures

GETStorage usage and quota state#

/workspaces/{workspaceId}/usage

SDK: usage.summary · scope: usage:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Response 200 · application/json

FieldTypeNotes
quotaBytesrequirednumber
planCoderequiredstring
percentrequirednumbernullable
levelrequiredinteger
uploadsBlockedrequiredboolean
latestrequiredany
historyrequiredarray of UsageSnapshot
FieldTypeNotes
takenAtrequiredstring (date-time)ISO 8601 timestamp · date-time
bytesStoredrequirednumber
fileCountrequiredinteger
bytesIn30drequirednumber
bytesOut30drequirednumber

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/usage" \
  -H "Authorization: Bearer $BOITA_API_KEY"

GETBandwidth over the last 30 or 90 days#

/workspaces/{workspaceId}/usage/bandwidth

SDK: usage.bandwidth · scope: usage:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
daysquery"30" | "90"

Response 200 · application/json

FieldTypeNotes
daysrequiredinteger

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/usage/bandwidth" \
  -H "Authorization: Bearer $BOITA_API_KEY"

Cloud#

Deliveries to connected Google Drive, Dropbox, OneDrive and Box folders

POSTDeliver files to a connected cloud folder#

/workspaces/{workspaceId}/cloud/deliveries

Queues a server-side copy of a share's files (or explicit workspace paths) into a folder of a cloud account connected with delivery access. `destinationPath` is the provider-native folder locator from the web picker ("" = root).

SDK: cloud.deliver · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)

Request body (application/json, required)

FieldTypeNotes
accountIdrequiredstringmax length 64
shareIdstringmax length 64
sourcePathsarray of stringmax items 500
destinationPathstringmax length 2048 · default ""
destinationLabelstringmax length 300 · default ""
overwriteboolean · default false

Response 201 · application/json

FieldTypeNotes
idrequiredstring
accountrequiredobject
FieldTypeNotes
idrequiredstring
providerrequiredstring
labelrequiredstring
shareIdrequiredstringnullable
sourcePathsrequiredarray of string
destinationPathrequiredstring
destinationLabelrequiredstring
overwriterequiredboolean
statusrequired"queued" | "running" | "completed" | "failed" | "cancelled"
filesTotalrequiredintegernullable
bytesTotalrequirednumbernullable
filesDonerequiredinteger
bytesDonerequirednumber
skippedrequiredarray of objectnullable
FieldTypeNotes
pathrequiredstring
reasonrequiredstring
errorrequiredstringnullable
startedAtrequiredstring (date-time)date-time, nullable
finishedAtrequiredstring (date-time)date-time, nullable
createdAtrequiredstring (date-time)date-time
createdByrequiredstring

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/cloud/deliveries" \
  -H "Authorization: Bearer $BOITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"accountId":"ckz7…","shareId":"ckz7…","sourcePaths":["deliveries/ep01/EP01_final.mov"]}'

GETList cloud deliveries#

/workspaces/{workspaceId}/cloud/deliveries

SDK: cloud.listDeliveries · scope: files:read

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
shareIdquerystring

Response 200 · application/json

FieldTypeNotes
idrequiredstring
accountrequiredobject
FieldTypeNotes
idrequiredstring
providerrequiredstring
labelrequiredstring
shareIdrequiredstringnullable
sourcePathsrequiredarray of string
destinationPathrequiredstring
destinationLabelrequiredstring
overwriterequiredboolean
statusrequired"queued" | "running" | "completed" | "failed" | "cancelled"
filesTotalrequiredintegernullable
bytesTotalrequirednumbernullable
filesDonerequiredinteger
bytesDonerequirednumber
skippedrequiredarray of objectnullable
FieldTypeNotes
pathrequiredstring
reasonrequiredstring
errorrequiredstringnullable
startedAtrequiredstring (date-time)date-time, nullable
finishedAtrequiredstring (date-time)date-time, nullable
createdAtrequiredstring (date-time)date-time
createdByrequiredstring

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X GET "https://api.boita.io/v1/workspaces/$WORKSPACE/cloud/deliveries" \
  -H "Authorization: Bearer $BOITA_API_KEY"

POSTCancel a cloud delivery#

/workspaces/{workspaceId}/cloud/deliveries/{deliveryId}/cancel

SDK: cloud.cancelDelivery · scope: files:write

Parameters

NameInTypeNotes
workspaceIdrequiredpathstringThe workspace id (the key is bound to one workspace)
deliveryIdrequiredpathstring

Response 200 · application/json

FieldTypeNotes
idrequiredstring
accountrequiredobject
FieldTypeNotes
idrequiredstring
providerrequiredstring
labelrequiredstring
shareIdrequiredstringnullable
sourcePathsrequiredarray of string
destinationPathrequiredstring
destinationLabelrequiredstring
overwriterequiredboolean
statusrequired"queued" | "running" | "completed" | "failed" | "cancelled"
filesTotalrequiredintegernullable
bytesTotalrequirednumbernullable
filesDonerequiredinteger
bytesDonerequirednumber
skippedrequiredarray of objectnullable
FieldTypeNotes
pathrequiredstring
reasonrequiredstring
errorrequiredstringnullable
startedAtrequiredstring (date-time)date-time, nullable
finishedAtrequiredstring (date-time)date-time, nullable
createdAtrequiredstring (date-time)date-time
createdByrequiredstring

Errors: 400 (validation_failed | path_rejected | authorization_pending | slow_down | access_denied | expired_token) · 401 (unauthenticated) · 403 (email_unverified | mfa_required | forbidden | plan_limit) · 404 (not_found) · 429 (rate_limited | node_busy)

curl -X POST "https://api.boita.io/v1/workspaces/$WORKSPACE/cloud/deliveries/<deliveryId>/cancel" \
  -H "Authorization: Bearer $BOITA_API_KEY"

Schemas#

Objects the operations above return, as named in the contract.

FileEntry#

FieldTypeNotes
namerequiredstring
pathrequiredstring
typerequired"file" | "folder" | "link"
sizerequiredintegernullable
modifiedAtrequiredstringnullable
encryptedrequiredboolean
previewboolean

FileListing#

FieldTypeNotes
pathrequiredstring
accessrequiredstring
itemsrequiredarray of FileEntry
FieldTypeNotes
namerequiredstring
pathrequiredstring
typerequired"file" | "folder" | "link"
sizerequiredintegernullable
modifiedAtrequiredstringnullable
encryptedrequiredboolean
previewboolean
totalrequiredinteger

SearchResult#

FieldTypeNotes
itemsrequiredarray of FileEntry
FieldTypeNotes
namerequiredstring
pathrequiredstring
typerequired"file" | "folder" | "link"
sizerequiredintegernullable
modifiedAtrequiredstringnullable
encryptedrequiredboolean
previewboolean

TrashItem#

FieldTypeNotes
idrequiredstring
pathrequiredstring
namerequiredstring
sizeBytesrequirednumbernullable
deletedAtrequiredstring (date-time)ISO 8601 timestamp · date-time
purgeAtrequiredstring (date-time)ISO 8601 timestamp · date-time

FileVersion#

FieldTypeNotes
idrequiredstring
pathrequiredstring
sizeBytesrequirednumbernullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Ok#

FieldTypeNotes
okrequiredboolean

Transfer#

FieldTypeNotes
idrequiredstring
directionrequired"send" | "receive"
clientrequiredstring
enginerequiredstring
statusrequired"queued" | "running" | "paused" | "completed" | "failed" | "cancelled"
streamsrequiredinteger
priorityrequiredstring
usageIdrequiredstring
filesTotalrequiredintegernullable
filesDonerequiredinteger
bytesTotalrequirednumbernullable
bytesDonerequirednumber
avgRateKbpsrequirednumbernullable
startedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
finishedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
errorCoderequiredstringnullable
errorMessagerequiredstringnullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

TransferCreated#

FieldTypeNotes
transferIdrequiredstring
transferSpecrequiredobjectHand this to the transfer engine unchanged; it is valid for a short window.
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time

ShareItem#

FieldTypeNotes
pathrequiredstring
namerequiredstring
typerequired"file" | "folder"
sizeBytesrequirednumbernullable

ShareRecipient#

FieldTypeNotes
emailrequiredstringnullable
phonerequiredstringnullable
labelrequiredstring
urlrequiredstring
firstViewedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
verifiedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable

Share#

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstringRelative on the app host, absolute on a custom domain
moderequired"drive" | "send"
titlerequiredstringnullable
messagerequiredstringnullable
hasPasswordrequiredboolean
statusrequiredstring
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time
maxDownloadsrequiredintegernullable
downloadCountrequiredinteger
viewCountrequiredinteger
requireEmailrequiredboolean
allowCommentsrequiredboolean
viewOnlyrequiredboolean
watermarkrequiredboolean
availableFromrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
itemsrequiredarray of ShareItem
FieldTypeNotes
pathrequiredstring
namerequiredstring
typerequired"file" | "folder"
sizeBytesrequirednumbernullable
recipientsrequiredarray of ShareRecipient
FieldTypeNotes
emailrequiredstringnullable
phonerequiredstringnullable
labelrequiredstring
urlrequiredstring
firstViewedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
verifiedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

ShareDetail#

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstringRelative on the app host, absolute on a custom domain
moderequired"drive" | "send"
titlerequiredstringnullable
messagerequiredstringnullable
hasPasswordrequiredboolean
statusrequiredstring
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time
maxDownloadsrequiredintegernullable
downloadCountrequiredinteger
viewCountrequiredinteger
requireEmailrequiredboolean
allowCommentsrequiredboolean
viewOnlyrequiredboolean
watermarkrequiredboolean
availableFromrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
itemsrequiredarray of ShareItem
FieldTypeNotes
pathrequiredstring
namerequiredstring
typerequired"file" | "folder"
sizeBytesrequirednumbernullable
recipientsrequiredarray of ShareRecipient
FieldTypeNotes
emailrequiredstringnullable
phonerequiredstringnullable
labelrequiredstring
urlrequiredstring
firstViewedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
verifiedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
eventsrequiredarray of object
FieldTypeNotes
typerequiredstring
atrequiredstring (date-time)ISO 8601 timestamp · date-time
iprequiredstringnullable
userAgentrequiredstringnullable
recipientrequiredstringnullable

BulkResult#

FieldTypeNotes
donerequiredinteger
failedarray of object
FieldTypeNotes
idrequiredstring
errorrequiredstring

Comment#

FieldTypeNotes
idrequiredstring
bodyrequiredstring
authorrequiredstringnullable
itemPathrequiredstringnullable
resolvedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

Receipt#

FieldTypeNotes
receiptIdrequiredstring
sharerequiredobject
FieldTypeNotes
urlrequiredstring
titlerequiredstringnullable
statusrequiredstring
hasPasswordrequiredboolean
maxDownloadsrequiredintegernullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time
viewCountrequiredinteger
downloadCountrequiredinteger
itemsrequiredarray of ShareItem
FieldTypeNotes
pathrequiredstring
namerequiredstring
typerequired"file" | "folder"
sizeBytesrequirednumbernullable
totalBytesrequirednumbernullable
recipientsrequiredarray of object
FieldTypeNotes
emailrequiredstringnullable
phonerequiredstringnullable
labelrequiredstring
firstViewedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
verifiedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
downloadsrequiredinteger
statusrequired"sent" | "viewed" | "downloaded"
anonymousrequiredobject
FieldTypeNotes
viewsrequiredinteger
downloadsrequiredinteger
downloadsrequiredarray of object
FieldTypeNotes
transferIdrequiredstring
recipientrequiredstringnullable
clientrequiredstring
filesrequiredinteger
bytesrequirednumber
rateMbpsrequirednumbernullable
completedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
secondsrequirednumbernullable
timelinerequiredarray of object
FieldTypeNotes
typerequiredstring
atrequiredstring (date-time)ISO 8601 timestamp · date-time
recipientrequiredstringnullable
clientrequiredstringnullable
integrityrequired"verified" | "none"
filesrequiredarray of object
FieldTypeNotes
pathrequiredstring
sizeBytesrequirednumbernullable
checksumTyperequiredstringnullable
checksumrequiredstringnullable
downloadsrequiredinteger
verifiedDownloadsrequiredinteger
verifiedrequiredboolean
checksumTyperequiredstring

Portal#

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstring
titlerequiredstring
messagerequiredstringnullable
targetPathrequiredstring
requireEmailrequiredboolean
hasPasswordrequiredboolean
maxBytesPerUploadrequirednumbernullable
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
notifyOnUploadrequiredboolean
statusrequired"active" | "paused" | "revoked"
uploadCountrequiredinteger
bytesReceivedrequirednumber
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

PortalUpload#

FieldTypeNotes
idrequiredstring
senderEmailrequiredstringnullable
senderNamerequiredstringnullable
messagerequiredstringnullable
folderPathrequiredstring
fileCountrequiredintegernullable
bytesTotalrequirednumbernullable
bytesDonerequirednumber
statusrequiredstring
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
completedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable

PortalDetail#

FieldTypeNotes
idrequiredstring
slugrequiredstring
urlrequiredstring
titlerequiredstring
messagerequiredstringnullable
targetPathrequiredstring
requireEmailrequiredboolean
hasPasswordrequiredboolean
maxBytesPerUploadrequirednumbernullable
expiresAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
notifyOnUploadrequiredboolean
statusrequired"active" | "paused" | "revoked"
uploadCountrequiredinteger
bytesReceivedrequirednumber
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
uploadsrequiredarray of PortalUpload
FieldTypeNotes
idrequiredstring
senderEmailrequiredstringnullable
senderNamerequiredstringnullable
messagerequiredstringnullable
folderPathrequiredstring
fileCountrequiredintegernullable
bytesTotalrequirednumbernullable
bytesDonerequirednumber
statusrequiredstring
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
completedAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable

Webhook#

FieldTypeNotes
idrequiredstring
urlrequiredstring
descriptionrequiredstringnullable
eventsrequiredarray of string
statusrequired"active" | "disabled"
failureCountrequiredinteger
lastDeliveryAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

WebhookCreated#

FieldTypeNotes
idrequiredstring
urlrequiredstring
descriptionrequiredstringnullable
eventsrequiredarray of string
statusrequired"active" | "disabled"
failureCountrequiredinteger
lastDeliveryAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time
secretrequiredstringSigning secret, shown once

WebhookSecret#

FieldTypeNotes
idrequiredstring
secretrequiredstring

WebhookDelivery#

FieldTypeNotes
idrequiredstring
eventIdrequiredstring
typerequiredstring
statusrequired"pending" | "delivered" | "failed"
attemptsrequiredinteger
nextAttemptAtrequiredstring (date-time)ISO 8601 timestamp · date-time
lastStatusCoderequiredintegernullable
lastErrorrequiredstringnullable
deliveredAtrequiredstring (date-time)ISO 8601 timestamp · date-time, nullable
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

DeliveryQueued#

FieldTypeNotes
idrequiredstring
statusrequiredstring

TestQueued#

FieldTypeNotes
eventIdrequiredstring
deliveryIdstring

EventCatalogue#

FieldTypeNotes
eventsrequiredarray of string

WorkspaceEvent#

FieldTypeNotes
idrequiredstring
typerequiredstring
datarequiredobject
createdAtrequiredstring (date-time)ISO 8601 timestamp · date-time

UsageSnapshot#

FieldTypeNotes
takenAtrequiredstring (date-time)ISO 8601 timestamp · date-time
bytesStoredrequirednumber
fileCountrequiredinteger
bytesIn30drequirednumber
bytesOut30drequirednumber

UsageSummary#

FieldTypeNotes
quotaBytesrequirednumber
planCoderequiredstring
percentrequirednumbernullable
levelrequiredinteger
uploadsBlockedrequiredboolean
latestrequiredany
historyrequiredarray of UsageSnapshot
FieldTypeNotes
takenAtrequiredstring (date-time)ISO 8601 timestamp · date-time
bytesStoredrequirednumber
fileCountrequiredinteger
bytesIn30drequirednumber
bytesOut30drequirednumber

Bandwidth#

FieldTypeNotes
daysrequiredinteger

Error#

Every error response

FieldTypeNotes
errorrequiredobject
FieldTypeNotes
coderequired"unauthenticated" | "email_unverified" | "mfa_required" | "forbidden" | "not_found" | "validation_failed" | "path_rejected" | "quota_exceeded" | "scheduled_hold" | "plan_limit" | "rate_limited" | "share_expired" | "share_locked" | "node_unavailable" | "node_busy" | "conflict" | "internal" | "authorization_pending" | "slow_down" | "access_denied" | "expired_token"
messagerequiredstring
detailsany

Error codes#

The code field of the error envelope takes one of these values; the HTTP status says which class it is.

  • access_denied
  • authorization_pending
  • email_unverified
  • expired_token
  • forbidden
  • mfa_required
  • node_busy
  • not_found
  • path_rejected
  • plan_limit
  • rate_limited
  • slow_down
  • unauthenticated
  • validation_failed
Chat on WhatsApp