Everything an AI agent can do with the Dropbox API.

A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.

Endpoints27
API version2
Last updated23 June 2026
Orientation

How the Dropbox API works.

The Dropbox API is how an app or AI agent works with a Dropbox account: listing a folder, uploading or downloading a file, moving and deleting content, searching, sharing files through links, and reading the account's profile and storage. Access is granted through an OAuth 2.0 access token, and the scopes on that token, like files.content.read or sharing.write, decide which actions it can take. Dropbox notifies an app of file changes through webhooks, so an integration learns about new or edited files without polling.

27Endpoints
5Capability groups
13Read
14Write
10Permissions
Authentication
Dropbox uses OAuth 2.0. A user authorizes the app and the app receives a short-lived Bearer access token; requesting offline access also returns a long-lived refresh token to mint new access tokens later. Long-lived access tokens are deprecated. Every call sends the token as a Bearer token, and the scopes granted at authorization decide what it can reach.
Permissions
Access has two layers. The app's access type sets the boundary: app-folder apps reach only a single dedicated folder, full-Dropbox apps reach the whole account. Within that, individual scopes, like files.content.read, files.content.write, sharing.read, sharing.write, file_requests.write, and account_info.read, decide which actions the token allows. Permanently deleting needs its own files.permanent_delete scope.
Versioning
The HTTP API is version 2, baked into the path under /2, with no dated version to pin. Methods that change behaviour ship as a new suffixed route, like move_v2 alongside the original move, so existing calls keep working until an app adopts the newer form.
Data model
Every endpoint is a POST. Calls split into three styles: RPC, with JSON in and JSON out, on api.dropboxapi.com; upload, with file bytes in the body and JSON in the Dropbox-API-Arg header; and download, with JSON in the header and file bytes in the response, on content.dropboxapi.com. Files and folders are addressed by path or id, lists page with a cursor, and a stored cursor doubles as a change-tracking marker.
Connect & authenticate

Connection & authentication methods.

How an app or AI agent connects to Dropbox determines what it can reach. There is the HTTP API for making calls, a webhook channel for being told when files change, and a hosted server that exposes Dropbox tools to agents, and each is governed by the access token behind it and the scopes that token carries.

Ways to connect

HTTP API

The Dropbox HTTP API is version 2, served from api.dropboxapi.com for calls and content.dropboxapi.com for file bytes. Every endpoint is a POST. Calls come in three styles: RPC, with JSON request and response bodies; upload, with the file bytes in the body and JSON arguments in the Dropbox-API-Arg header; and download, with JSON arguments in the header and the file bytes in the response. A call authenticates with a Bearer access token, and the scopes on that token decide what it can reach.

Best forConnecting an app or AI agent to Dropbox.
Governed byThe access token and the scopes it carries.
Docs ↗

Webhooks

Dropbox sends an HTTP POST to a webhook URL registered in the App Console when files change in a connected account. The URL is first verified with a GET request carrying a challenge parameter that the app echoes back. A notification names which accounts changed, not what changed, so the app calls list_folder/continue with a stored cursor to read the actual changes. The app must respond within 10 seconds, and the files.metadata.read scope is required.

Best forBeing told when files change without polling.
Governed byThe files.metadata.read scope and the registered webhook URL.
Docs ↗

MCP server

A hosted Model Context Protocol server at https://mcp.dropbox.com/mcp exposes Dropbox tools to AI agents and MCP clients, in beta. It authenticates with Dropbox OAuth and exposes 23 tools covering file operations like ListFolder, GetFileContent, CreateFile, and Delete, metadata like GetFileMetadata and GetUsageAndQuota, sharing like CreateSharedLink and ListSharedLinks, plus search, versioning and restore, and job-status tracking. Supported clients include Claude Code, Claude Web, ChatGPT Codex, ChatGPT Web, and Cursor.

Best forConnecting an AI agent to Dropbox through MCP.
Governed byThe Dropbox OAuth grant and the scopes it carries.
Docs ↗
Authentication

OAuth 2.0 (short-lived token)

Dropbox uses the OAuth 2.0 authorization-code flow. A user is redirected to Dropbox to authorize the app, and the returned code is exchanged at /oauth2/token for a short-lived access token that expires after a few hours. The token is sent as a Bearer token, and the scopes granted at authorization decide what it can reach. Long-lived tokens are deprecated.

TokenBearer access token (short-lived)
Best forApps acting on a user's Dropbox during an active session.
Docs ↗

OAuth 2.0 (refresh token)

Requesting offline access with token_access_type=offline returns a long-lived refresh token alongside the short-lived access token. The app exchanges the refresh token at /oauth2/token for a new access token when the old one expires, so it can keep acting without the user present. The flow uses PKCE for desktop, mobile, and single-page apps.

TokenRefresh token plus short-lived Bearer access token
Best forBackground or long-running access that outlives a session.
Docs ↗

Scoped access (app folder vs full Dropbox)

An app is created as either app-folder, scoped to a single dedicated folder Dropbox creates for it, or full-Dropbox, able to reach the whole account. On top of that, the app selects individual scopes, like files.content.read or sharing.write, that the access token then carries. The access type sets the boundary of what is reachable; the scopes set which actions are allowed within it.

TokenBearer access token carrying selected scopes
Best forLimiting an app to a single folder or to specific actions.
Docs ↗
Endpoint reference

Every Dropbox API method.

Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.

MethodEndpointWhat it doesAccessPermissionVersion

Files & folders

List, read, upload, move, copy, delete, and search files and folders, and restore earlier versions.16

Returns a cursor used by list_folder/continue and by webhook handlers.

Acts onfolder
Permission (capability)files.metadata.read
VersionAvailable since the API’s base version
Webhook eventfile_change
Rate limitStandard limits apply

The endpoint a webhook handler calls to read what actually changed.

Acts onfolder
Permission (capability)files.metadata.read
VersionAvailable since the API’s base version
Webhook eventfile_change
Rate limitStandard limits apply

Read-only; returns metadata, not file contents.

Acts onfile
Permission (capability)files.metadata.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Paginate further results with search/continue_v2.

Acts onsearch
Permission (capability)files.metadata.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

A content read; reaches the actual file bytes, not just metadata.

Acts onfile
Permission (capability)files.content.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

The link is unauthenticated and expires; anyone with it can download until it does.

Acts onfile
Permission (capability)files.content.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

A single request should not exceed 150 MB; use an upload session for larger files.

Acts onfile
Permission (capability)files.content.write
VersionAvailable since the API’s base version
Webhook eventfile_change
Rate limitOver-frequent writes to one namespace return 429 too_many_write_operations.

An upload session supports files up to 350 GB across many append calls.

Acts onfile
Permission (capability)files.content.write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Writes the assembled file to the account.

Acts onfile
Permission (capability)files.content.write
VersionAvailable since the API’s base version
Webhook eventfile_change
Rate limitStandard limits apply

Changes where content lives; the original path no longer holds it.

Acts onfile
Permission (capability)files.content.write
VersionAvailable since the API’s base version
Webhook eventfile_change
Rate limitStandard limits apply

Creates a new copy; the original is left in place.

Acts onfile
Permission (capability)files.content.write
VersionAvailable since the API’s base version
Webhook eventfile_change
Rate limitStandard limits apply

A core write.

Acts onfolder
Permission (capability)files.content.write
VersionAvailable since the API’s base version
Webhook eventfile_change
Rate limitStandard limits apply

Recoverable from deleted items; permanently_delete removes it for good.

Acts onfile
Permission (capability)files.content.write
VersionAvailable since the API’s base version
Webhook eventfile_change
Rate limitStandard limits apply

Irreversible, and needs the separate files.permanent_delete scope rather than files.content.write.

Acts onfile
Permission (capability)files.permanent_delete
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Overwrites the current contents with the chosen revision.

Acts onfile
Permission (capability)files.content.write
VersionAvailable since the API’s base version
Webhook eventfile_change
Rate limitStandard limits apply

Read-only; returns revision metadata used by restore.

Acts onfile
Permission (capability)files.metadata.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Sharing

Create and revoke shared links, share folders, and add or list the members of a shared file or folder.5

Read-only; returns existing links and their settings.

Acts onshared_link
Permission (capability)sharing.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Anyone with the resulting link can reach the content within its settings.

Acts onshared_link
Permission (capability)sharing.write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

The link stops working immediately.

Acts onshared_link
Permission (capability)sharing.write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Grants the named people access to the folder's contents.

Acts onshared_folder
Permission (capability)sharing.write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only; returns who can reach the folder.

Acts onshared_folder
Permission (capability)sharing.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

File requests

Create and manage file requests, the links that let people upload files into a chosen folder.2

Opens a route for outsiders to upload into the account's chosen folder.

Acts onfile_request
Permission (capability)file_requests.write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only; paginate further results with list/continue.

Acts onfile_request
Permission (capability)file_requests.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Users

Read the signed-in account, look up other accounts, and read how much storage space is used.3

Read-only; returns the signed-in user's profile.

Acts onaccount
Permission (capability)account_info.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only; returns used and allocated bytes.

Acts onaccount
Permission (capability)account_info.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only; uses the sharing.read scope to read a basic public profile of another account.

Acts onaccount
Permission (capability)sharing.read
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Account

Update account-level settings, like the profile photo.1

Changes account-level profile settings.

Acts onaccount
Permission (capability)account_info.write
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply
No endpoints match those filters.
Webhooks

Webhook events.

Dropbox can notify an app when files change in a connected account, instead of the app repeatedly asking. A notification says which accounts changed, not what changed, so the app then calls list_folder/continue with a stored cursor to read the actual changes.

EventWhat it signalsTriggered by
list_folder (account changed)Files were added, removed, or changed in a connected account. The notification names the account ids that changed, not the specific files, so the app calls list_folder/continue with a stored cursor to read what changed./2/files/upload
/2/files/upload_session/finish
/2/files/move_v2
/2/files/copy_v2
/2/files/create_folder_v2
/2/files/delete_v2
/2/files/restore
No events match that search.
Rate limits & pagination

Rate limits, pagination & request size.

Dropbox limits how fast and how much an app can call, by a per-authorization request rate and by separate caps on upload size, with a single upload request held to 150 MB.

Request rate

Dropbox enforces rate limits per authorization, that is per linked user for a user app, or per team for a team app calling Business Endpoints. The exact numbers are not published and are set so as not to inhibit normal apps. Going over returns HTTP 429: too_many_requests for the general rate limit, or too_many_write_operations when too many writes land on one namespace at once. A 429 response carries a Retry-After header giving the seconds to wait before retrying; if it is absent, the app should back off exponentially. Rate-limited requests still count toward the limit, so tight retry loops make it worse.

Pagination

List endpoints return a cursor and a has_more flag. The app pages by calling the matching continue endpoint with the cursor, like list_folder/continue after list_folder, or search/continue_v2 after search_v2. A stored list_folder cursor also serves as a change-tracking marker, returning only what changed since it was issued, which is how webhook handlers read updates.

Request size

A single /2/files/upload request should not exceed 150 MB; larger files use an upload session, which supports files up to 350 GB across many append calls, ideally in multiples of 4 MB. An upload-session batch can commit up to 1,000 files to a namespace at once to reduce write contention.

Errors

Status codes & error handling.

The status codes an agent should handle, and what to do about each.

StatusCodeMeaningWhat to do
400bad_requestSomething is wrong with the request itself, like malformed JSON, a failed validation, or calling an endpoint the app's access type can't use.Read the plaintext error message, fix the request, and resend. It won't succeed on retry as-is.
401invalid_access_token / expired_access_tokenThe Bearer token is invalid, expired, lacks the required scope, or the user revoked access or was suspended.Refresh the access token, or prompt the user to re-authenticate, and confirm the token carries the scope the call needs.
403access_deniedThe user or team lacks access to the operation, often from a plan downgrade or an account limit like a monthly upload cap.It may succeed later, but only after the account is changed. Back off for background work.
409endpoint-specific errorAn endpoint-specific error described by the error JSON, like path/not_found when content was moved or deleted. The error object carries a .tag naming the case.Branch on the error .tag for that endpoint and handle the named case; the endpoint docs list the possibilities.
429too_many_requests / too_many_write_operationsA rate limit was hit. too_many_requests is the general per-authorization rate limit; too_many_write_operations means too many writes are landing on the same namespace at once.Wait the number of seconds in the Retry-After header before retrying; if there is none, back off exponentially. For write contention, reduce parallel writes to the namespace.
500internal_errorAn error on Dropbox's side, expected to be temporary.Retry with exponential backoff; check status.dropbox.com or contact support if it persists.
Versioning & freshness

Version history.

Dropbox runs one stable version of its HTTP API, version 2, with no dated version to pin. New methods ship as suffixed versions of a route, like move_v2 alongside the original move, so older calls keep working.

Version history

What changed, and when

Latest version2
2Current version
HTTP API v2 (current)

Version 2 is the current Dropbox HTTP API, served under /2, replacing the retired v1. It has no dated version to pin; behavioural changes to a method ship as a new suffixed route, like move_v2 or search_v2, so older calls keep working until an app moves to the newer form.

What changed
  • Every endpoint is a POST, in RPC, upload, or download style.
  • OAuth scopes added so a token carries only the access it needs.
  • Newer method behaviour shipped as _v2 routes alongside the originals.
Earlier
API v1 retired

The original Dropbox API v1 was deprecated and shut down, with v2 as its replacement. New integrations use v2 only.

What changed
  • v1 endpoints were retired in favour of the v2 HTTP API.

Move to the _v2 form of a method when adopting its newer behaviour.

Dropbox API changelog ↗
Questions

Dropbox API, answered.

How does the Dropbox API handle errors?+
Dropbox returns standard HTTP status codes: 400 for a bad request, 401 for an invalid or expired token, 403 for an account-level denial, 409 for an endpoint-specific error, 429 for a rate limit, and 5xx for a server error. A 409 carries a JSON error object with a .tag naming the specific case, like path/not_found, plus an error_summary string. Match on the .tag rather than the summary, since the summary can have extra detail appended.
Why is every Dropbox endpoint a POST, even for reads?+
The Dropbox HTTP API is RPC-style, not REST. Each method is called by POSTing to its named route, like /2/files/list_folder, so even reads use POST. Reading a file's bytes uses a download-style call where the JSON arguments go in the Dropbox-API-Arg header and the bytes come back in the response body; uploading reverses that.
What's the difference between an app-folder app and a full-Dropbox app?+
An app-folder app is scoped to a single dedicated folder that Dropbox creates for it, and it can't see anything else in the account. A full-Dropbox app can reach the whole account. The choice is made when the app is created and sets the outer boundary; scopes then decide which actions are allowed within that boundary.
How do I upload files larger than 150 MB?+
A single /2/files/upload request should stay under 150 MB. For larger files, start an upload session with upload_session/start, send chunks with upload_session/append_v2 (ideally in multiples of 4 MB), and commit with upload_session/finish. An upload session supports files up to 350 GB.
How do webhooks tell me what changed?+
They don't, directly. A webhook notification names which accounts had changes, not which files. The app reacts by calling list_folder/continue with the cursor it stored for that account, which returns only what changed since the cursor was issued. The webhook URL must first be verified by echoing back a challenge parameter, and the files.metadata.read scope is required.
How do I delete a file so it can be recovered, versus permanently?+
delete_v2 sends a file to the account's deleted items, where it can be restored, and needs files.content.write. permanently_delete removes it for good and can't be undone, and needs the separate files.permanent_delete scope, so an app without that scope can't permanently erase content.
Related

More storage API guides for agents

What is Bollard AI?

Control what every AI agent can do in Dropbox.

Bollard AI sits between a team's AI agents and Dropbox. Grant each agent exactly the access it needs, read or write, area by area, and every call is checked and logged.

  • Set read, write, or full access per agent, never a shared Dropbox token.
  • Denied by default, so an agent reaches only what has been explicitly allowed.
  • Every call recorded in plain English: who, what, where, and the decision.
Dropbox
Filing Agent
Read files and folders ResourceOffReadFull use
Upload and file documents ActionOffReadFull use
Create shared links ActionOffReadFull use
Per-agent access, set in Bollard AI, not in Dropbox