AutessaDB Drive API
Programmatic access to an AutessaDB Drive: list and find files, grep their text and run ranked search over it (meaning-based when semantic search is on), read exact pages and lines, upload whole folders, and share files and folders with people, teams, your company, or a link.
Every request is a POST with a JSON body to https://api.autessa.com/clients/autessadb-drive/<operation>, with the Drive's ID in the resourceId query parameter and your API key in the Authorization header (no Bearer prefix). The body's tableId must match resourceId.
Permissions
Two layers apply to every call:
- The API key's permission on the Drive, as for any table: READ for browsing, searching, reading, and downloading; WRITE for uploads, folders, moves, trash and restore, versions, sharing, and links; DELETE for permanent deletion.
- Sharing inside the Drive. Requests run under the key's acting identity and only reach the files and folders that identity can open, with the role it has on each (Owner, Editor, or Viewer). Items it cannot open behave as if they do not exist. See Sharing.
Paths
Paths are absolute and start with /, for example /Shared/Legal/Contracts/acme-msa.pdf. Backslashes are treated as /, repeated slashes are collapsed, and . and .. segments are rejected. Names are compared without regard to case, are at most 255 bytes, and paths are at most 64 levels deep. The Drive's root is /; a new Drive is empty, and every folder in it is one someone created.
Calls that take an item accept either path or nodeId; calls that take several items accept paths or nodeIds. An item's nodeId never changes, even when it is moved or renamed.
The item object
Listings, searches, and most write calls return items in this shape:
- Name
nodeId- Type
- string
- Description
The item's ID (a decimal string).
- Name
path- Type
- string
- Description
Current absolute path.
- Name
name- Type
- string
- Description
The last segment of the path.
- Name
nodeType- Type
- string
- Description
FILEorFOLDER.
- Name
parentId- Type
- string
- Description
ID of the containing folder, or
nullat the top level.
- Name
sizeBytes- Type
- integer
- Description
File size. Files only.
- Name
mimeType- Type
- string
- Description
File type. Files only.
- Name
version- Type
- integer
- Description
Current version number, starting at 1. Files only.
- Name
contentUpdatedAt- Type
- string
- Description
When the file's content last changed (ISO-8601 UTC). Files only.
- Name
updatedAt- Type
- string
- Description
When the item last changed, including renames and moves.
- Name
ownerUserId- Type
- string
- Description
The owner's user ID.
- Name
ownerName- Type
- string
- Description
The owner's name.
- Name
extractionStatus- Type
- string
- Description
Files only:
PENDINGorEXTRACTINGwhile text is being extracted,EXTRACTEDwhen it is searchable,FAILED,UNSUPPORTED(no extractable text), orTOO_LARGE(only the first part is searchable).
- Name
trashedAt- Type
- string
- Description
When the item was trashed. Present only when listing with
includeTrashed.
- Name
customColumns- Type
- object
- Description
Values of any custom columns you added to the Drive, as a map of column name to typed column value (the same shape as AutessaDB rows).
Paging and truncation
Nothing is dropped silently. Every listing and search response says whether it is complete:
truncatedisfalsewhen you have everything, or a string naming the cap that stopped it:"limit"(page full),"max_entries"(tree size),"max_matches_per_file"(grep per-file cap), or"timeout"(grep time budget).nextCursorcontinues from where the response stopped. Send it back ascursorwith the same other arguments; a cursor replayed with different arguments is rejected withINVALID_CURSOR.
Uploading files
Uploads take three steps, so file bytes go straight to storage and large files can be sent in parallel parts:
- Start uploads with the paths and sizes. Storage is reserved and each file gets an upload link.
PUTeach file's bytes to itsurlwith the returnedheaders, or for multipart uploads,PUTeach part to its part link and then complete it.- Commit the finished uploads. Files appear in the Drive and processing starts.
The CLI wraps all three steps in autessa autessadb drive push and upload.
List a folder
/lsLists the direct children of a folder: folders first, then files, each group sorted by the chosen order. Only items the caller can open are returned. Omit both path and nodeId to list the top level of the Drive (or of the folder an agent tool is scoped to).
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the item, e.g.
/Contracts/acme-msa.pdf. SendpathornodeId.
- Name
nodeId- Type
- string
- Description
The item's ID. Takes precedence over
pathwhen both are sent.
- Name
sort- Type
- string
- Description
name(default),modified, orsize. Folders always come first.
- Name
includeTrashed- Type
- boolean
- Description
Include items in the trash. Default
false.
- Name
limit- Type
- integer
- Description
Maximum entries to return. Default 200, maximum 1000.
- Name
cursor- Type
- string
- Description
The
nextCursorfrom the previous page. Send the same other arguments as the first call.
Response
- Name
driveRole- Type
- string
- Description
Your Drive membership:
OWNER(the Drive's owner or a Drive admin),EDITORorVIEWER(a member: the Drive itself is shared with you), orNONE(only items inside it are shared with you). Membership does not show any item by itself: members see what they own and what is shared with them.OWNERandEDITORcan add items at the top level.
- Name
folder- Type
- object
- Description
The folder being listed, or
nullfor the top level.
- Name
items- Type
- array<object>
- Description
The folder's children. See The item object.
- Name
nextCursor- Type
- string
- Description
Cursor for the next page, or
nullwhen there is nothing more.
- Name
truncated- Type
- boolean | string
- Description
falsewhen the response is complete; otherwise the reason it stopped early. See Paging and truncation.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/ls?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"path": "/Shared/Legal/Contracts",
"limit": 2
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/ls?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
path: '/Shared/Legal/Contracts',
limit: 2
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/ls?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'path': '/Shared/Legal/Contracts',
'limit': 2
}
)
data = response.json()
{
"folder": {
"nodeId": "4170",
"path": "/Shared/Legal/Contracts",
"name": "Contracts",
"nodeType": "FOLDER",
"parentId": "4101",
"updatedAt": "2026-09-21T09:12:40Z",
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
}
},
"items": [
{
"nodeId": "4190",
"path": "/Shared/Legal/Contracts/Archive",
"name": "Archive",
"nodeType": "FOLDER",
"parentId": "4170",
"updatedAt": "2026-09-21T09:12:40Z",
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
}
},
{
"nodeId": "4182",
"path": "/Shared/Legal/Contracts/acme-msa.pdf",
"name": "acme-msa.pdf",
"nodeType": "FILE",
"parentId": "4170",
"sizeBytes": 482113,
"mimeType": "application/pdf",
"version": 2,
"contentUpdatedAt": "2026-09-28T17:04:11Z",
"updatedAt": "2026-09-28T17:04:11Z",
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
},
"extractionStatus": "EXTRACTED"
}
],
"nextCursor": "eyJrIjpbImFjbWUtbXNhLnBkZiIsNDE4Ml19",
"truncated": "limit"
}
Get a folder tree
/treeReturns a folder and its descendants down to a depth, as a flat list in path order. Useful for getting an overview of a folder in one call.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Folder to start from. Defaults to the top level.
- Name
maxDepth- Type
- integer
- Description
Levels below
pathto include. Default 3, maximum 20.
- Name
maxEntries- Type
- integer
- Description
Maximum entries to return. Default 500, maximum 5000.
Response
- Name
root- Type
- string
- Description
The starting path.
- Name
entries- Type
- array<object>
- Description
One entry per item:
nodeId,path,nodeType,depth(relative toroot), and for filessizeBytes.
- Name
truncated- Type
- boolean | string
- Description
"max_entries"if more items exist than were returned.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/tree?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"path": "/Shared/Legal",
"maxDepth": 2
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/tree?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
path: '/Shared/Legal',
maxDepth: 2
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/tree?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'path': '/Shared/Legal',
'maxDepth': 2
}
)
data = response.json()
{
"root": "/Shared/Legal",
"entries": [
{
"nodeId": "4170",
"path": "/Shared/Legal/Contracts",
"nodeType": "FOLDER",
"depth": 1
},
{
"nodeId": "4182",
"path": "/Shared/Legal/Contracts/acme-msa.pdf",
"nodeType": "FILE",
"depth": 2,
"sizeBytes": 482113
},
{
"nodeId": "4175",
"path": "/Shared/Legal/Policies",
"nodeType": "FOLDER",
"depth": 1
}
],
"truncated": false
}
Find items
/findFinds files and folders by name, pattern, type, date, or size anywhere under a folder. Glob patterns support *, ** (any number of folders), ?, character classes like [0-9], and alternatives like {pdf,docx}. A pattern with no / (such as *.pdf) matches the name at any depth.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Folder to search under. Defaults to everything the caller can see.
- Name
glob- Type
- string
- Description
Glob pattern matched against paths, e.g.
**/2026/*.pdforinvoice-*.
- Name
nameRegex- Type
- string
- Description
Regular expression matched against names.
- Name
type- Type
- string
- Description
FILEorFOLDER.
- Name
mime- Type
- string
- Description
Exact MIME type, or a prefix ending in
/, e.g.image/.
- Name
modifiedAfter- Type
- string
- Description
ISO-8601 UTC timestamp. Only items modified at or after it.
- Name
modifiedBefore- Type
- string
- Description
ISO-8601 UTC timestamp. Only items modified before it.
- Name
sizeGt- Type
- integer
- Description
Minimum file size in bytes.
- Name
sizeLt- Type
- integer
- Description
Maximum file size in bytes.
- Name
limit- Type
- integer
- Description
Maximum entries to return. Default 200, maximum 1000.
- Name
cursor- Type
- string
- Description
The
nextCursorfrom the previous page. Send the same other arguments as the first call.
Response
- Name
items- Type
- array<object>
- Description
Matching items in path order. See The item object.
- Name
nextCursor- Type
- string
- Description
Cursor for the next page, or
nullwhen there is nothing more.
- Name
truncated- Type
- boolean | string
- Description
falsewhen the response is complete; otherwise the reason it stopped early. See Paging and truncation.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/find?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"path": "/Shared/Legal",
"glob": "*.pdf",
"modifiedAfter": "2026-09-01T00:00:00Z"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/find?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
path: '/Shared/Legal',
glob: '*.pdf',
modifiedAfter: '2026-09-01T00:00:00Z'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/find?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'path': '/Shared/Legal',
'glob': '*.pdf',
'modifiedAfter': '2026-09-01T00:00:00Z'
}
)
data = response.json()
{
"items": [
{
"nodeId": "4182",
"path": "/Shared/Legal/Contracts/acme-msa.pdf",
"name": "acme-msa.pdf",
"nodeType": "FILE",
"parentId": "4170",
"sizeBytes": 482113,
"mimeType": "application/pdf",
"version": 2,
"contentUpdatedAt": "2026-09-28T17:04:11Z",
"updatedAt": "2026-09-28T17:04:11Z",
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
},
"extractionStatus": "EXTRACTED"
}
],
"nextCursor": null,
"truncated": false
}
Get item details
/statReturns one item with its processing status, page and line counts, recent versions, and the caller's role on it. Callers who can manage sharing on the item also get its shares.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the item, e.g.
/Contracts/acme-msa.pdf. SendpathornodeId.
- Name
nodeId- Type
- string
- Description
The item's ID. Takes precedence over
pathwhen both are sent.
Response
The item's own fields (nodeId, path, name, nodeType, sizeBytes, version, …) at the top level, as in The item object, plus:
- Name
effectiveRole- Type
- string
- Description
The caller's effective role:
OWNER,EDITOR, orVIEWER.
- Name
extraction- Type
- object
- Description
For files:
status,indexStatus,textKind(NATIVEfor text files with real line numbers,PAGEDfor documents extracted page by page),pageCount,lineCount,ocrNeededPages(scanned pages OCR was unsure of),ocrStatus(DONEwhen scanned pages were read by OCR, otherwiseNONE), andocr:engine,pagesOcr(pages read by OCR),pagesLowConfidenceandlowConfidencePages(pages read with low confidence; their text is kept as read and is searchable), andpagesUnreadableandunreadablePages(pages with no searchable text).
- Name
versionsCount- Type
- integer
- Description
How many previous versions the file has. List them with List versions.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/stat?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"path": "/Shared/Legal/Contracts/acme-msa.pdf"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/stat?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
path: '/Shared/Legal/Contracts/acme-msa.pdf'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/stat?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'path': '/Shared/Legal/Contracts/acme-msa.pdf'
}
)
data = response.json()
{
"nodeId": "4182",
"path": "/Shared/Legal/Contracts/acme-msa.pdf",
"name": "acme-msa.pdf",
"parentId": "4170",
"nodeType": "FILE",
"depth": 4,
"sizeBytes": 482113,
"mimeType": "application/pdf",
"version": 2,
"contentUpdatedAt": "2026-09-28T17:04:11Z",
"ownerUserId": "u8Kd2LmQ4x",
"ownerName": "Dana Ortiz",
"updatedAt": "2026-09-28T17:04:11Z",
"extractionStatus": "EXTRACTED",
"extraction": {
"status": "EXTRACTED",
"indexStatus": "NONE",
"textKind": "PAGED",
"pageCount": 14,
"lineCount": 612,
"ocrNeededPages": [9],
"ocrStatus": "DONE",
"ocr": {
"engine": "tesseract",
"pagesOcr": 3,
"pagesLowConfidence": 1,
"pagesUnreadable": 0,
"lowConfidencePages": [9],
"unreadablePages": []
}
},
"versionsCount": 1,
"effectiveRole": "EDITOR"
}
Search exact text
/grepFinds lines that contain a string or match a regular expression, across every searchable file under a folder. Matching is per line. Each match carries its page and line, so you can read around it or cite it. Files that are not searchable yet are counted in stats.filesUnsearchable rather than silently skipped.
Regular expressions support character classes, \d, \w, \s, alternation, anchors, and quantifiers. A regular expression must contain at least 3 literal characters unless the search is scoped to 2,000 files or fewer.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
pattern- Type
- string
- Description
Text or regular expression to find. Up to 1,000 characters.
- Name
regex- Type
- boolean
- Description
Treat
patternas a regular expression. Defaultfalse(literal text).
- Name
caseInsensitive- Type
- boolean
- Description
Ignore case. Default
false.
- Name
path- Type
- string
- Description
Folder or file to search. Defaults to everything the caller can see.
- Name
glob- Type
- string
- Description
Only search files whose path matches this glob, e.g.
*.pdf.
- Name
outputMode- Type
- string
- Description
matches(default) returns each matching line;filesreturns only the files with a match;countreturns the match count per file.
- Name
context- Type
- integer
- Description
Lines of context before and after each match, 0 to 10. Default 0.
- Name
maxMatchesPerFile- Type
- integer
- Description
Maximum matches returned per file. Default 20.
- Name
timeoutMs- Type
- integer
- Description
Time budget in milliseconds. Default 5000, maximum 15000.
- Name
limit- Type
- integer
- Description
Maximum entries to return. Default 100, maximum 1000.
- Name
cursor- Type
- string
- Description
The
nextCursorfrom the previous page. Send the same other arguments as the first call.
Response
- Name
matches- Type
- array<object>
- Description
In
matchesmode:nodeId,path,version,pageandpageLine(for paged documents),line,text,submatches(characterstart/endof each hit intext), andbefore/aftercontext lines.
- Name
files- Type
- array<object>
- Description
In
filesmode:files, each withnodeId,pathandmatchCount; incountmode:countwithfilesandmatches.
- Name
stats- Type
- object
- Description
filesUnsearchable: counts of files in scope that could not be searched, by reason (pending,failed,unsupported,tooLarge), withsamplePaths.
- Name
nextCursor- Type
- string
- Description
Cursor for the next page, or
nullwhen there is nothing more.
- Name
truncated- Type
- boolean | string
- Description
falsewhen the response is complete; otherwise the reason it stopped early. See Paging and truncation.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/grep?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"pattern": "termination for convenience",
"caseInsensitive": true,
"path": "/Shared/Legal",
"context": 1
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/grep?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
pattern: 'termination for convenience',
caseInsensitive: true,
path: '/Shared/Legal',
context: 1
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/grep?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'pattern': 'termination for convenience',
'caseInsensitive': True,
'path': '/Shared/Legal',
'context': 1
}
)
data = response.json()
{
"matches": [
{
"nodeId": "4182",
"path": "/Shared/Legal/Contracts/acme-msa.pdf",
"version": 2,
"page": 4,
"pageLine": 12,
"line": 171,
"text": "12.2 Termination for Convenience. Either party may terminate this Agreement",
"submatches": [
{
"start": 5,
"end": 32
}
],
"before": [
"12.1 Term. This Agreement begins on the Effective Date."
],
"after": [
"upon sixty (60) days written notice to the other party."
]
}
],
"stats": {
"filesUnsearchable": {
"pending": 1,
"failed": 0,
"unsupported": 0,
"tooLarge": 0,
"samplePaths": [
"/Shared/Legal/Contracts/globex-sow.docx"
]
}
},
"nextCursor": null,
"truncated": false
}
Read a file
/readReturns a file's extracted text for a page range or a line range. Use it to read around a match before quoting. A single call returns at most 20 pages or 2,000 lines, and at most maxChars characters; when the range is cut short, nextRange tells you where to continue.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the item, e.g.
/Contracts/acme-msa.pdf. SendpathornodeId.
- Name
nodeId- Type
- string
- Description
The item's ID. Takes precedence over
pathwhen both are sent.
- Name
pages- Type
- string
- Description
Page range for paged documents, e.g.
"4"or"3-5".
- Name
lines- Type
- string
- Description
Line range, e.g.
"100-250". Sendpagesorlines; with neither, reading starts at the beginning.
- Name
maxChars- Type
- integer
- Description
Maximum characters to return. Default 20,000, maximum 100,000.
Response
- Name
path- Type
- string
- Description
The file's current path.
- Name
version- Type
- integer
- Description
The version that was read.
- Name
kind- Type
- string
- Description
NATIVEorPAGED.
- Name
lines- Type
- array<object>
- Description
The lines read:
line,text, and for paged documentspageandpageLine. Empty lines are included with emptytext.
- Name
nextRange- Type
- string
- Description
The range to request next, or
nullat the end of the file.
- Name
truncated- Type
- boolean | string
- Description
"limit"when the range was cut short bymaxCharsor the per-call caps.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/read?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"path": "/Shared/Legal/Contracts/acme-msa.pdf",
"pages": "4"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/read?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
path: '/Shared/Legal/Contracts/acme-msa.pdf',
pages: '4'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/read?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'path': '/Shared/Legal/Contracts/acme-msa.pdf',
'pages': '4'
}
)
data = response.json()
{
"path": "/Shared/Legal/Contracts/acme-msa.pdf",
"version": 2,
"kind": "PAGED",
"lines": [
{
"line": 160,
"page": 4,
"pageLine": 1,
"text": "12. TERM AND TERMINATION"
},
{
"line": 171,
"page": 4,
"pageLine": 12,
"text": "12.2 Termination for Convenience. Either party may terminate this Agreement"
}
],
"nextRange": "5",
"truncated": false
}
Search file contents
/searchRanked keyword search over file contents; meaning-based when the Drive's Semantic search setting is on. Each result is a passage with its page and line range and a snippet.
- Semantic search off (the default): files that contain more of the query's words rank first, then files with more matches, earlier pages, and matching names. Common words are ignored. Snippets mark the matched words as
**word**, results havesource: "keyword", andstats.modeiskeyword. Everymodebehaves this way. - Semantic search on:
hybrid(the default) combines meaning-based and keyword ranking, which works well for both questions and specific terms. Semantic search usage counts toward your company's search limits.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
query- Type
- string
- Description
What to look for, in plain language or keywords.
- Name
mode- Type
- string
- Description
hybrid(default),semantic(meaning only),lexical(keywords only), orkeyword. Applies when semantic search is on; otherwise every mode is a ranked keyword search.
- Name
path- Type
- string
- Description
Folder or file to search. Defaults to everything the caller can see.
- Name
glob- Type
- string
- Description
Only search files whose path matches this glob.
- Name
topK- Type
- integer
- Description
Number of results. Default 10, maximum 50.
Response
- Name
results- Type
- array<object>
- Description
Best passages first:
nodeId,path,score,page(for paged documents),lineStart,lineEnd,snippet, andsource(keyword, or with semantic search onhybrid,dense, orbm25).
- Name
stats- Type
- object
- Description
How the search ran, including
mode(keywordwhen semantic search is off).
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/search?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"query": "can either side end the contract early?",
"path": "/Shared/Legal/Contracts",
"topK": 3
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/search?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
query: 'can either side end the contract early?',
path: '/Shared/Legal/Contracts',
topK: 3
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/search?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'query': 'can either side end the contract early?',
'path': '/Shared/Legal/Contracts',
'topK': 3
}
)
data = response.json()
{
"results": [
{
"nodeId": "4182",
"path": "/Shared/Legal/Contracts/acme-msa.pdf",
"score": 0.83,
"page": 4,
"lineStart": 168,
"lineEnd": 179,
"snippet": "12.2 Termination for Convenience. Either party may terminate this Agreement upon sixty (60) days written notice...",
"source": "hybrid"
}
],
"stats": {
"mode": "hybrid"
}
}
Get a download link
/download-urlReturns a short-lived link to download a file's content, or one of its previous versions.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the item, e.g.
/Contracts/acme-msa.pdf. SendpathornodeId.
- Name
nodeId- Type
- string
- Description
The item's ID. Takes precedence over
pathwhen both are sent.
- Name
version- Type
- integer
- Description
A previous version to download. Defaults to the current version.
Response
- Name
url- Type
- string
- Description
The download link.
- Name
expiresAt- Type
- string
- Description
When the link stops working (ISO-8601 UTC).
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/download-url?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"nodeId": "4182"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/download-url?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
nodeId: '4182'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/download-url?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'nodeId': '4182'
}
)
data = response.json()
{
"url": "https://files.autessa.com/d/9f3c1a7e...",
"expiresAt": "2026-10-02T15:10:00Z"
}
Fetch a file
/fetchReturns a 10-minute download link for a file, or one of its previous versions, together with the file's name, type, size and version. Same as /download-url, which stays available, plus the file's details.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the file, e.g.
/Reports/q1.pdf. SendpathornodeId.
- Name
nodeId- Type
- string
- Description
The file's ID.
- Name
version- Type
- integer
- Description
A previous version. Defaults to the current version.
Response
- Name
url- Type
- string
- Description
The download link, valid for 10 minutes.
- Name
expiresAt- Type
- string
- Description
When the link stops working (ISO-8601 UTC).
- Name
nodeId- Type
- string
- Description
The file's ID.
- Name
path- Type
- string
- Description
The file's path.
- Name
name- Type
- string
- Description
The file's name.
- Name
mime- Type
- string
- Description
MIME type of the version served.
- Name
sizeBytes- Type
- integer
- Description
Size of the version served.
- Name
version- Type
- integer
- Description
The version served.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/fetch?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"tableId": "V1StGXR8Z5", "path": "/Reports/q1.pdf"}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/fetch?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({'tableId': 'V1StGXR8Z5', 'path': '/Reports/q1.pdf'})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/fetch?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={'tableId': 'V1StGXR8Z5', 'path': '/Reports/q1.pdf'}
)
data = response.json()
{
"url": "https://files.autessa.com/d/9f3c1a7e...",
"expiresAt": "2026-10-03T15:10:00Z",
"nodeId": "4182",
"path": "/Reports/q1.pdf",
"name": "q1.pdf",
"mime": "application/pdf",
"sizeBytes": 248112,
"version": 2
}
Get processing status
/statusSummarizes how many files in the Drive are searchable, still processing, or not searchable. Use it after a large upload to wait until everything is searchable.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
Response
- Name
extraction- Type
- object
- Description
File counts by text status (
PENDING,EXTRACTING,EXTRACTED,FAILED,UNSUPPORTED,TOO_LARGE).
- Name
index- Type
- object
- Description
File counts by semantic-search index status (used only while the Drive's semantic search is on).
- Name
files- Type
- integer
- Description
Files in the Drive.
- Name
folders- Type
- integer
- Description
Folders in the Drive.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/status?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/status?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/status?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5'
}
)
data = response.json()
{
"extraction": {
"PENDING": 0,
"EXTRACTING": 2,
"EXTRACTED": 318,
"FAILED": 1,
"UNSUPPORTED": 4,
"TOO_LARGE": 0
},
"index": {
"NONE": 325
},
"files": 325,
"folders": 41
}
Get storage usage
/usageReturns your company's Drive storage and processing usage against its limits.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
Response
- Name
bytesUsed- Type
- integer
- Description
Bytes stored, including previous versions and trash.
- Name
bytesLimit- Type
- integer
- Description
Storage allowance in bytes.
- Name
filesCount- Type
- integer
- Description
Files in the Drive.
- Name
maxFileBytes- Type
- integer
- Description
Largest file you can upload, in bytes.
- Name
extractedPagesThisMonth- Type
- integer
- Description
Pages extracted this calendar month.
- Name
extractedPagesLimit- Type
- integer
- Description
Monthly page allowance, or
nullif unlimited.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/usage?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/usage?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/usage?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5'
}
)
data = response.json()
{
"bytesUsed": 18253611008,
"bytesLimit": 53687091200,
"filesCount": 12408,
"maxFileBytes": 5368709120,
"extractedPagesThisMonth": 4120,
"extractedPagesLimit": 50000
}
Write a file
/writeWrites text to a file: creates it, replaces its content, or appends to its end. Missing folders are created. A replaced file keeps its previous content in its version history, and the new text is searchable with grep as soon as the call returns. Text files only (by extension or MIME type), up to 5 MB; upload anything else with uploads.
Permission: WRITE, and Editor on the file (or on its folder for a new file)
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the file, e.g.
/Shared/notes/memory.md.
- Name
content- Type
- string
- Description
The text, UTF-8. Absent or empty writes an empty file.
- Name
mode- Type
- string
- Description
overwrite(default) replaces the file, creating it when missing.createfails withNAME_CONFLICTwhen the file exists.appendaddscontentto the end, starting a new line when the file does not end with one, and creates the file when missing.
- Name
mime- Type
- string
- Description
MIME type. Default: the existing file's, else inferred from the extension (
.mdtext/markdown,.jsonapplication/json,.csvtext/csv), else text/plain.
- Name
expectedVersion- Type
- integer
- Description
Only write when the file is still at this version (
0: it must not exist yet). Otherwise the call fails withVERSION_CONFLICT, anderror.details.currentVersionholds the current version.
Response
- Name
node- Type
- object
- Description
The file after the write (see The item object).
- Name
version- Type
- integer
- Description
The file's version after the write (
1for a new file).
- Name
bytes- Type
- integer
- Description
Size of the file after the write.
- Name
created- Type
- boolean
- Description
truewhen the write created the file.
- Name
mode- Type
- string
- Description
The mode applied.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/write?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"tableId": "V1StGXR8Z5", "path": "/Shared/notes/memory.md", "content": "- Acme prefers Net 45", "mode": "append"}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/write?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({'tableId': 'V1StGXR8Z5', 'path': '/Shared/notes/memory.md', 'content': '- Acme prefers Net 45', 'mode': 'append'})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/write?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={'tableId': 'V1StGXR8Z5', 'path': '/Shared/notes/memory.md', 'content': '- Acme prefers Net 45', 'mode': 'append'}
)
data = response.json()
{
"node": { "nodeId": "5120", "path": "/Shared/notes/memory.md", "version": 4, "mimeType": "text/markdown" },
"version": 4,
"bytes": 112,
"created": false,
"mode": "append"
}
Edit a file
/editReplaces an exact piece of text in a text file, like an editor's find-and-replace. oldText must occur exactly once unless replaceAll is true. The change is saved as a new version. Files with Windows line endings also match an oldText written with plain line breaks. Text files up to 5 MB.
Permission: WRITE, and Editor on the file
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the file. Send
pathornodeId.
- Name
nodeId- Type
- string
- Description
The file's ID.
- Name
oldText- Type
- string
- Description
The exact text to replace, including spaces and line breaks.
- Name
newText- Type
- string
- Description
The replacement. An empty string deletes
oldText.
- Name
replaceAll- Type
- boolean
- Description
Replace every occurrence instead of requiring exactly one. Default
false.
- Name
expectedVersion- Type
- integer
- Description
Only edit when the file is still at this version; otherwise
VERSION_CONFLICT.
Response
- Name
node- Type
- object
- Description
The file after the edit.
- Name
version- Type
- integer
- Description
The file's new version.
- Name
replacements- Type
- integer
- Description
How many places were changed.
- Name
bytes- Type
- integer
- Description
Size of the file after the edit.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/edit?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"tableId": "V1StGXR8Z5", "path": "/Shared/notes/plan.md", "oldText": "Status: draft", "newText": "Status: approved"}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/edit?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({'tableId': 'V1StGXR8Z5', 'path': '/Shared/notes/plan.md', 'oldText': 'Status: draft', 'newText': 'Status: approved'})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/edit?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={'tableId': 'V1StGXR8Z5', 'path': '/Shared/notes/plan.md', 'oldText': 'Status: draft', 'newText': 'Status: approved'}
)
data = response.json()
{
"node": { "nodeId": "5121", "path": "/Shared/notes/plan.md", "version": 3 },
"version": 3,
"replacements": 1,
"bytes": 2048
}
Create folders
/mkdirCreates one or more folders, along with any missing parent folders. Existing folders are left as they are, so the call is safe to repeat.
Permission: WRITE, and Editor on the parent folder
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
paths- Type
- array<string>
- Description
Folders to create (up to 1,000), e.g.
["/Shared/Reports/2026"].
- Name
parents- Type
- boolean
- Description
Create missing parent folders too. Default
true.
Response
- Name
folders- Type
- array<object>
- Description
Every requested folder, existing or new. See The item object.
- Name
created- Type
- array<object>
- Description
The folders this call created.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/mkdir?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"paths": [
"/Shared/Legal/Contracts/2026/Q4",
"/Shared/Legal/Contracts/2026/Q3"
]
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/mkdir?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
paths: ['/Shared/Legal/Contracts/2026/Q4', '/Shared/Legal/Contracts/2026/Q3']
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/mkdir?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'paths': ['/Shared/Legal/Contracts/2026/Q4', '/Shared/Legal/Contracts/2026/Q3']
}
)
data = response.json()
{
"created": [
{
"nodeId": "4201",
"paths": ["/Shared/Legal/Contracts/2026"],
"name": "2026",
"nodeType": "FOLDER",
"parentId": "4101",
"updatedAt": "2026-09-21T09:12:40Z",
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
}
},
{
"nodeId": "4202",
"paths": ["/Shared/Legal/Contracts/2026/Q4"],
"name": "Q4",
"nodeType": "FOLDER",
"parentId": "4201",
"updatedAt": "2026-09-21T09:12:40Z",
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
}
},
{
"nodeId": "4203",
"paths": ["/Shared/Legal/Contracts/2026/Q3"],
"name": "Q3",
"nodeType": "FOLDER",
"parentId": "4201",
"updatedAt": "2026-09-21T09:12:40Z",
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
}
}
]
}
Move or rename
/moveMoves an item into another folder, renames it, or both. Moving a folder moves everything inside it.
Because access follows folders, a move can change who sees the item. If it would, and confirm is not true, nothing moves and the response lists who would gain and lose access; repeat the call with confirm: true to go ahead. A folder that contains items the caller cannot see cannot be moved by that caller.
Permission: WRITE, Editor on the item, and Editor on the destination folder
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
paths- Type
- array<string>
- Description
Paths of the items to move, e.g.
["/Inbox/acme-msa.pdf"]. Sendpaths,nodeIds, or both. With one item named by path and adestinationPaththat does not exist yet (inside an existing folder), the item is moved there under that name, likemv a b.
- Name
nodeIds- Type
- array<string>
- Description
IDs of the items to move.
- Name
destinationPath- Type
- string
- Description
The folder to move into.
- Name
newName- Type
- string
- Description
New name, when moving a single item.
- Name
confirm- Type
- boolean
- Description
Proceed even if the move changes who has access. Default
false.
Response
- Name
moved- Type
- array<object>
- Description
The moved items at their new paths, when the move happened.
- Name
requiresConfirmation- Type
- boolean
- Description
truewhen nothing moved because access would change.
- Name
accessChanges- Type
- object
- Description
gainingandlosing: the people, teams, and company-wide shares that would gain or lose access, each with theirroleand the folder it comes from.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/move?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"paths": ["/Drafts/globex-sow.docx"],
"destinationPath": "/Shared/Legal/Contracts"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/move?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
paths: ['/Drafts/globex-sow.docx'],
destinationPath: '/Shared/Legal/Contracts'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/move?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'paths': ['/Drafts/globex-sow.docx'],
'destinationPath': '/Shared/Legal/Contracts'
}
)
data = response.json()
{
"requiresConfirmation": true,
"accessChanges": {
"gaining": [
{
"principal": {
"type": "TEAM",
"teamId": "3b1f6a2e-7c41-4d55-9a0e-58c2b7f1d903",
"name": "Legal"
},
"role": "EDITOR"
}
],
"losing": []
}
}
Move to trash
/trashMoves items to the trash. A trashed folder takes everything inside it along. Trashed items keep their shares, are hidden from listings and search, and can be restored until the trash retention period ends.
Permission: WRITE, and Editor on each item
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
paths- Type
- array<string>
- Description
Paths of the items to trash. Send
paths,nodeIds, or both.
- Name
nodeIds- Type
- array<string>
- Description
IDs of the items to trash.
- Name
permanent- Type
- boolean
- Description
Delete the items for good right after trashing them; they cannot be restored. Needs the key's DELETE permission. Default
false.
Response
- Name
trashed- Type
- integer
- Description
How many items were trashed.
- Name
items- Type
- array<object>
- Description
The trashed items.
- Name
purged- Type
- integer
- Description
With
permanent: rows deleted for good, including everything inside folders.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/trash?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"nodeIds": [
"4182",
"4190"
]
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/trash?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
nodeIds: ['4182', '4190']
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/trash?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'nodeIds': ['4182', '4190']
}
)
data = response.json()
{
"trashed": 2,
"items": [
{ "nodeId": "4182", "path": "/Shared/Legal/Contracts/acme-msa.pdf", "nodeType": "FILE" },
{ "nodeId": "4190", "path": "/Shared/Legal/Contracts/Archive", "nodeType": "FOLDER" }
]
}
Restore from trash
/restoreRestores trashed items to their original paths. If something now occupies a path, the restored item gets a numbered name. Missing parent folders are recreated.
Permission: WRITE, and Editor on each item
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
nodeIds- Type
- array<string>
- Description
Trashed items to restore.
Response
- Name
restored- Type
- array<object>
- Description
One entry per item:
nodeIdandpath(the final path, which differs from the original if it was renamed).
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/restore?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"nodeIds": [
"4190"
]
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/restore?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
nodeIds: ['4190']
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/restore?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'nodeIds': ['4190']
}
)
data = response.json()
{
"restored": [
{
"nodeId": "4190",
"path": "/Shared/Legal/Contracts/Archive"
}
]
}
Delete permanently
/purgePermanently deletes trashed items, their versions, and their shares and links. This cannot be undone. To empty the trash, call /empty-trash (no other arguments).
Permission: DELETE, and Owner on each item (or Drive manager)
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
nodeIds- Type
- array<string>
- Description
Trashed items to delete.
Response
- Name
purged- Type
- integer
- Description
Items permanently deleted, including folder contents.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/purge?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"nodeIds": [
"4182"
]
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/purge?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
nodeIds: ['4182']
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/purge?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'nodeIds': ['4182']
}
)
data = response.json()
{
"purgedCount": 1,
"bytesFreed": 962033
}
Start uploads
/uploads/createRegisters up to 1,000 files to upload and returns where to send each one. Paths, permissions, file size, and storage are checked up front, and storage is reserved, so a file that cannot be stored is refused before you send it. Files up to 100 MB use one PUT to url; larger files use multipart upload with part links. Then commit the finished uploads.
Permission: WRITE, and Editor on each destination folder
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
basePath- Type
- string
- Description
Folder that relative
files[].pathvalues are resolved against. Missing folders are created on commit.
- Name
conflict- Type
- string
- Description
What to do when a file already exists at a path:
FAIL(default),RENAME(keep both, adding a number), orNEW_VERSION(replace, keeping the old content as a version).
- Name
files- Type
- array<object>
- Description
Files to upload:
path(absolute, or relative tobasePath),sizein bytes, and optionallymimeTypeandsha256(hex). Whensha256is sent, the upload is rejected if the content does not match.
Response
- Name
uploads- Type
- array<object>
- Description
One entry per accepted file:
uploadId,path,method(SINGLEorMULTIPART), andexpiresAt.SINGLEentries carryurlandheadersto send with thePUT;MULTIPARTentries carrypartSizeandpartCount.
- Name
errors- Type
- array<object>
- Description
Files that were refused:
path,errorCode, andmessage.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/uploads/create?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"basePath": "/Shared/Legal/Contracts/2026/Q4",
"conflict": "RENAME",
"files": [
{
"path": "initech-msa.pdf",
"size": 913442,
"mimeType": "application/pdf"
}
]
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/uploads/create?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
basePath: '/Shared/Legal/Contracts/2026/Q4',
conflict: 'RENAME',
files: [
{
path: 'initech-msa.pdf',
size: 913442,
mimeType: 'application/pdf'
}
]
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/uploads/create?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'basePath': '/Shared/Legal/Contracts/2026/Q4',
'conflict': 'RENAME',
'files': [
{
'path': 'initech-msa.pdf',
'size': 913442,
'mimeType': 'application/pdf'
}
]
}
)
data = response.json()
{
"uploads": [
{
"uploadId": "5d0a7c2e-1b9f-4e3a-8f61-0c2d9b7a4e15",
"path": "/Shared/Legal/Contracts/2026/Q4/initech-msa.pdf",
"method": "SINGLE",
"url": "https://uploads.autessa.com/u/5d0a7c2e...",
"headers": {
"Content-Type": "application/pdf"
},
"expiresAt": "2026-10-02T16:00:00Z"
}
],
"errors": []
}
Get part links
/uploads/part-urlsFor a multipart upload, returns links to PUT each part to. Every part except the last must be exactly partSize bytes. Keep the ETag response header from each part for completion.
Permission: WRITE
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
uploadId- Type
- string
- Description
The multipart upload.
- Name
partNumbers- Type
- array<integer>
- Description
Part numbers to get links for, starting at 1.
Response
- Name
partUrls- Type
- object
- Description
Map of part number to upload link.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/uploads/part-urls?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"uploadId": "8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64",
"partNumbers": [
1,
2,
3
]
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/uploads/part-urls?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
uploadId: '8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64',
partNumbers: [1, 2, 3]
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/uploads/part-urls?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'uploadId': '8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64',
'partNumbers': [1, 2, 3]
}
)
data = response.json()
{
"partUrls": {
"1": "https://uploads.autessa.com/u/8e4b2f10.../1",
"2": "https://uploads.autessa.com/u/8e4b2f10.../2",
"3": "https://uploads.autessa.com/u/8e4b2f10.../3"
}
}
Complete a multipart upload
/uploads/complete-multipartAssembles the uploaded parts of a multipart upload. Then commit it like any other upload.
Permission: WRITE
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
uploadId- Type
- string
- Description
The multipart upload.
- Name
parts- Type
- array<object>
- Description
Every part:
partNumberand theetagreturned when it was uploaded.
Response
- Name
uploadId- Type
- string
- Description
The upload, now ready to commit.
- Name
status- Type
- string
- Description
UPLOADED.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/uploads/complete-multipart?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"uploadId": "8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64",
"parts": [
{
"partNumber": 1,
"etag": "\"a54357aff0632cce46d942af68356b38\""
},
{
"partNumber": 2,
"etag": "\"0c78aef83f66abc1fa1e8477f296d394\""
},
{
"partNumber": 3,
"etag": "\"acbd18db4cc2f85cedef654fccc4a4d8\""
}
]
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/uploads/complete-multipart?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
uploadId: '8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64',
parts: [
{
partNumber: 1,
etag: '"a54357aff0632cce46d942af68356b38"'
},
{
partNumber: 2,
etag: '"0c78aef83f66abc1fa1e8477f296d394"'
},
{
partNumber: 3,
etag: '"acbd18db4cc2f85cedef654fccc4a4d8"'
}
]
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/uploads/complete-multipart?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'uploadId': '8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64',
'parts': [
{
'partNumber': 1,
'etag': '"a54357aff0632cce46d942af68356b38"'
},
{
'partNumber': 2,
'etag': '"0c78aef83f66abc1fa1e8477f296d394"'
},
{
'partNumber': 3,
'etag': '"acbd18db4cc2f85cedef654fccc4a4d8"'
}
]
}
)
data = response.json()
{
"uploadId": "8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64",
"status": "UPLOADED"
}
Commit uploads
/uploads/commitTurns finished uploads into Drive files, creating missing folders and applying the conflict rule chosen at start. Up to 100 uploads per call; each succeeds or fails on its own. Committed files appear immediately and become searchable once processing finishes. Insert or update triggers on the Drive fire for each file.
Permission: WRITE
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
uploadIds- Type
- array<string>
- Description
Uploads to commit, up to 100.
Response
- Name
results- Type
- array<object>
- Description
One entry per upload:
uploadId,status(COMMITTEDorFAILED),nodewhen committed, anderrorCode/messagewhen not.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/uploads/commit?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"uploadIds": [
"5d0a7c2e-1b9f-4e3a-8f61-0c2d9b7a4e15"
]
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/uploads/commit?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
uploadIds: ['5d0a7c2e-1b9f-4e3a-8f61-0c2d9b7a4e15']
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/uploads/commit?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'uploadIds': ['5d0a7c2e-1b9f-4e3a-8f61-0c2d9b7a4e15']
}
)
data = response.json()
{
"results": [
{
"uploadId": "5d0a7c2e-1b9f-4e3a-8f61-0c2d9b7a4e15",
"status": "COMMITTED",
"node": {
"nodeId": "4210",
"path": "/Shared/Legal/Contracts/2026/Q4/initech-msa.pdf",
"name": "initech-msa.pdf",
"nodeType": "FILE",
"parentId": "4202",
"sizeBytes": 913442,
"mimeType": "application/pdf",
"version": 1,
"contentUpdatedAt": "2026-09-28T17:04:11Z",
"updatedAt": "2026-09-28T17:04:11Z",
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
},
"extractionStatus": "PENDING"
}
}
]
}
Cancel uploads
/uploads/abortCancels uploads that have not been committed and releases their reserved storage. Uploads that are never committed expire on their own.
Permission: WRITE
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
uploadIds- Type
- array<string>
- Description
Uploads to cancel.
Response
- Name
aborted- Type
- array<string>
- Description
The uploads that were cancelled.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/uploads/abort?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"uploadIds": [
"8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64"
]
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/uploads/abort?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
uploadIds: ['8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64']
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/uploads/abort?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'uploadIds': ['8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64']
}
)
data = response.json()
{
"aborted": [
"8e4b2f10-6a3d-4c7e-b5a9-2f1e0d8c7b64"
]
}
List versions
/versions/listLists a file's versions, newest first. The current content is the highest version.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the item, e.g.
/Contracts/acme-msa.pdf. SendpathornodeId.
- Name
nodeId- Type
- string
- Description
The item's ID. Takes precedence over
pathwhen both are sent.
Response
- Name
versions- Type
- array<object>
- Description
version,sizeBytes,sha256,createdAt,createdBy, andcurrent(truefor the current content).
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/versions/list?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"nodeId": "4182"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/versions/list?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
nodeId: '4182'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/versions/list?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'nodeId': '4182'
}
)
data = response.json()
{
"versions": [
{
"version": 2,
"sizeBytes": 482113,
"sha256": "9b74c9897bac770ffc029102a200c5de...",
"createdAt": "2026-09-28T17:04:11Z",
"createdBy": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
},
"current": true
},
{
"version": 1,
"sizeBytes": 479920,
"sha256": "3f786850e387550fdab836ed7e6dc881...",
"createdAt": "2026-09-02T11:30:05Z",
"createdBy": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
},
"current": false
}
]
}
Restore a version
/versions/restoreMakes a previous version current again. The restore itself creates a new version, so nothing is lost.
Permission: WRITE, and Editor on the file
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
nodeId- Type
- string
- Description
The file's ID.
- Name
version- Type
- integer
- Description
The version to restore.
Response
- Name
node- Type
- object
- Description
The file with its new
version.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/versions/restore?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"nodeId": "4182",
"version": 1
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/versions/restore?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
nodeId: '4182',
version: 1
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/versions/restore?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'nodeId': '4182',
'version': 1
}
)
data = response.json()
{
"node": {
"nodeId": "4182",
"name": "acme-msa.pdf",
"nodeType": "FILE",
"parentId": "4170",
"sizeBytes": 479920,
"mimeType": "application/pdf",
"version": 3,
"contentUpdatedAt": "2026-09-28T17:04:11Z",
"updatedAt": "2026-09-28T17:04:11Z",
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
},
"extractionStatus": "EXTRACTED"
}
}
Who has access
/shares/listLists everyone who can reach an item: its owner, Drive managers, direct shares, shares inherited from parent folders (deepest folder first, with the folder they come from), and active links. Drive members are listed separately in members, because membership doesn't give access to an item. Send path: "/" to list the Drive's members.
Permission: READ, and the ability to see the item
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the item, e.g.
/Contracts/acme-msa.pdf. SendpathornodeId.
- Name
nodeId- Type
- string
- Description
The item's ID. Takes precedence over
pathwhen both are sent.
Response
- Name
owner- Type
- object
- Description
The item's owner:
userIdandname.
- Name
managers- Type
- array<object>
- Description
Drive managers, who can see and manage everything.
- Name
shares- Type
- array<object>
- Description
One entry per person, team, or company-wide share that gives access to this item:
principal(typeofUSER,TEAM, orCOMPANY, withuserIdorteamIdandname),role,direct(trueif shared on this item),inheritedFrom(nodeIdandpathof the folder it comes from;nullwhen direct),expiresAt, andalsoVia(other folders that grant the same principal a weaker or equal role). Withpath: "/", the Drive's members.
- Name
links- Type
- array<object>
- Description
Active links on this item or a parent folder. Same shape as List links.
- Name
members- Type
- array<object>
- Description
The Drive's members, in the same shape as
shares, with each member's Drive role. Members see the Drive in their list but only the items shared with them. Returned to members and Drive managers; absent for callers who only have items shared with them.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/shares/list?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"nodeId": "4182"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/shares/list?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
nodeId: '4182'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/shares/list?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'nodeId': '4182'
}
)
data = response.json()
{
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
},
"managers": [
{
"userId": "k3Jd8sLq2W",
"name": "Priya Natarajan"
}
],
"shares": [
{
"principal": {
"type": "USER",
"userId": "pQ7wR2tY9z",
"name": "Sam Lee"
},
"role": "EDITOR",
"direct": true,
"inheritedFrom": null,
"expiresAt": null,
"alsoVia": []
},
{
"principal": {
"type": "TEAM",
"teamId": "3b1f6a2e-7c41-4d55-9a0e-58c2b7f1d903",
"name": "Legal"
},
"role": "VIEWER",
"direct": false,
"inheritedFrom": {
"nodeId": "4101",
"path": "/Shared/Legal"
},
"expiresAt": null,
"alsoVia": []
},
{
"principal": {
"type": "COMPANY",
"name": "Anyone at Acme Corp"
},
"role": "VIEWER",
"direct": false,
"inheritedFrom": {
"nodeId": "4175",
"path": "/Shared/Legal/Policies"
},
"expiresAt": null,
"alsoVia": []
}
],
"links": [],
"members": [
{
"principal": {
"type": "TEAM",
"teamId": "3b1f6a2e-7c41-4d55-9a0e-58c2b7f1d903",
"name": "Legal"
},
"role": "VIEWER",
"direct": true,
"inheritedFrom": null,
"expiresAt": null,
"alsoVia": []
}
]
}
Share an item
/shares/upsertShares a folder or a file with people, teams, or everyone at your company, adds members to the Drive, or changes the role of an existing share. Sharing a folder shares everything inside it, including items added later. Sharing the Drive itself (path: "/", or scope: "drive") adds members: the Drive appears in their list of Drives and an EDITOR member can add items at the top level, but members see no folder or file until it is shared with them. To share a folder or file with every current member, send "principals": "members"; each member gets their own share on the item. You can grant up to your own role.
Permission: WRITE, and Owner on the item, Drive manager, or Editor when Editors can share is on
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the item, e.g.
/Contracts/acme-msa.pdf. SendpathornodeId.
- Name
nodeId- Type
- string
- Description
The item's ID. Takes precedence over
pathwhen both are sent.
- Name
scope- Type
- string
- Description
driveto add members to the Drive. Same as sendingpath: "/".
- Name
principals- Type
- array<object> | string
- Description
Who to share with. Each entry is
{"type": "USER", "userId": ...},{"type": "TEAM", "teamId": ...}, or{"type": "COMPANY"}. Users and teams must belong to your company. Send the string"members"(or an entry{"type": "MEMBERS"}) to share a folder or file with every current member of the Drive; not allowed withpath: "/".
- Name
role- Type
- string
- Description
VIEWERorEDITOR.
- Name
expiresAt- Type
- string
- Description
ISO-8601 UTC time when the share ends.
Response
- Name
shares- Type
- array<object>
- Description
The resulting shares, same shape as Who has access.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/shares/upsert?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"path": "/Shared/Legal/Contracts",
"principals": [
{
"type": "TEAM",
"teamId": "3b1f6a2e-7c41-4d55-9a0e-58c2b7f1d903"
},
{
"type": "USER",
"userId": "pQ7wR2tY9z"
}
],
"role": "EDITOR"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/shares/upsert?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
path: '/Shared/Legal/Contracts',
principals: [
{
type: 'TEAM',
teamId: '3b1f6a2e-7c41-4d55-9a0e-58c2b7f1d903'
},
{
type: 'USER',
userId: 'pQ7wR2tY9z'
}
],
role: 'EDITOR'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/shares/upsert?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'path': '/Shared/Legal/Contracts',
'principals': [
{
'type': 'TEAM',
'teamId': '3b1f6a2e-7c41-4d55-9a0e-58c2b7f1d903'
},
{
'type': 'USER',
'userId': 'pQ7wR2tY9z'
}
],
'role': 'EDITOR'
}
)
data = response.json()
{
"shares": [
{
"principal": {
"type": "TEAM",
"teamId": "3b1f6a2e-7c41-4d55-9a0e-58c2b7f1d903",
"name": "Legal"
},
"role": "EDITOR",
"direct": true,
"inheritedFrom": null,
"expiresAt": null,
"alsoVia": []
},
{
"principal": {
"type": "USER",
"userId": "pQ7wR2tY9z",
"name": "Sam Lee"
},
"role": "EDITOR",
"direct": true,
"inheritedFrom": null,
"expiresAt": null,
"alsoVia": []
}
]
}
Stop sharing
/shares/removeRemoves one direct share, by its grantId (from Who has access). Access ends immediately. To remove inherited access, remove the share on the folder it comes from.
Permission: WRITE, and the same rights as sharing
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
grantId- Type
- string
- Description
The share to remove: a
grantIdfrom Who has access.
Response
- Name
ok- Type
- boolean
- Description
truewhen the share was removed.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/shares/remove?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"grantId": "6f1c2b9e-4d7a-4f0e-9b2a-1c3d5e7f9a0b"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/shares/remove?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
grantId: '6f1c2b9e-4d7a-4f0e-9b2a-1c3d5e7f9a0b'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/shares/remove?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'grantId': '6f1c2b9e-4d7a-4f0e-9b2a-1c3d5e7f9a0b'
}
)
data = response.json()
{
"ok": true
}
Shared with me
/shared-with-meLists items other people have shared with the caller, directly, through one of their teams, or with everyone at the company. Only the shared item itself is listed, not its contents; browse into a shared folder with List a folder. When the caller is a member of the Drive, the Drive is listed as one entry whose node is the Drive itself (path /, named after the Drive) and whose role is the caller's Drive role. Membership shows only the Drive, not its contents.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
limit- Type
- integer
- Description
Maximum entries to return. Default 200, maximum 1000.
- Name
cursor- Type
- string
- Description
The
nextCursorfrom the previous page. Send the same other arguments as the first call.
Response
- Name
items- Type
- array<object>
- Description
One entry per shared item:
node(see The item object),role(your role),grantedByandcreatedAt.
- Name
nextCursor- Type
- string
- Description
Cursor for the next page; absent on the last page.
- Name
hasMore- Type
- boolean
- Description
truewhen another page exists.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/shared-with-me?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/shared-with-me?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/shared-with-me?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5'
}
)
data = response.json()
{
"items": [
{
"node": {
"nodeId": "4101",
"path": "/Shared/Legal",
"name": "Legal",
"nodeType": "FOLDER",
"parentId": "4001",
"updatedAt": "2026-09-21T09:12:40Z",
"owner": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
}
},
"role": "VIEWER",
"sharedBy": {
"userId": "k3Jd8sLq2W",
"name": "Priya Natarajan"
},
"sharedAt": "2026-08-14T10:02:00Z",
"via": {
"type": "TEAM",
"name": "Legal"
}
}
],
"nextCursor": null,
"truncated": false
}
Check access
/accessReturns the caller's effective role on an item and their Drive membership. To see every share on an item, use Who has access.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the item, e.g.
/Contracts/acme-msa.pdf. SendpathornodeId.
- Name
nodeId- Type
- string
- Description
The item's ID. Takes precedence over
pathwhen both are sent.
Response
- Name
effectiveRole- Type
- string
- Description
OWNER,EDITOR,VIEWER, orNONE.
- Name
driveRole- Type
- string
- Description
The caller's Drive membership:
OWNER(owner or Drive admin),EDITORorVIEWER(a member), orNONE. Membership alone gives no access to files and folders.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/access?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"nodeId": "4182"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/access?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
nodeId: '4182'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/access?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'nodeId': '4182'
}
)
data = response.json()
{
"effectiveRole": "EDITOR",
"driveRole": "VIEWER"
}
Transfer ownership
/transfer-ownerMakes another person in your company the owner of an item. The previous owner keeps Editor access.
Permission: WRITE, and Owner on the item or Drive manager
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
nodeId- Type
- string
- Description
The item's ID.
- Name
newOwnerUserId- Type
- string
- Description
The new owner: a member of your company.
Response
- Name
node- Type
- object
- Description
The item with its new owner.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/transfer-owner?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"nodeId": "4182",
"newOwnerUserId": "pQ7wR2tY9z"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/transfer-owner?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
nodeId: '4182',
newOwnerUserId: 'pQ7wR2tY9z'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/transfer-owner?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'nodeId': '4182',
'newOwnerUserId': 'pQ7wR2tY9z'
}
)
data = response.json()
{
"node": {
"nodeId": "4182",
"name": "acme-msa.pdf",
"nodeType": "FILE",
"parentId": "4170",
"sizeBytes": 482113,
"mimeType": "application/pdf",
"version": 2,
"contentUpdatedAt": "2026-09-28T17:04:11Z",
"updatedAt": "2026-09-28T17:04:11Z",
"owner": {
"newOwnerUserId": "pQ7wR2tY9z",
"name": "Sam Lee"
},
"extractionStatus": "EXTRACTED"
}
}
Create a link
/links/createCreates a link to a file, a folder, or the whole Drive (path: "/"). A folder or Drive link opens a read-only view of everything inside it. Links keep working when the item is moved or renamed and stop working when it is trashed.
The link url is returned only by this call. Autessa does not store it in readable form, so save it if you need it again; otherwise revoke the link and create a new one.
Permission: WRITE, and the same rights as sharing
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Absolute path of the item, e.g.
/Contracts/acme-msa.pdf. SendpathornodeId.
- Name
nodeId- Type
- string
- Description
The item's ID. Takes precedence over
pathwhen both are sent.
- Name
scope- Type
- string
- Description
driveto link the whole Drive. Same as sendingpath: "/".
- Name
audience- Type
- string
- Description
COMPANY(default): only signed-in people at your company.ANYONE: anyone with the link, no sign-in.
- Name
role- Type
- string
- Description
VIEWER(default).
- Name
allowDownload- Type
- boolean
- Description
Let link visitors download files. Default
false(preview only).
- Name
allowSearch- Type
- boolean
- Description
Let link visitors search inside the shared folder. Default
true.
- Name
expiresAt- Type
- string
- Description
ISO-8601 UTC time when the link stops working.
Response
- Name
url- Type
- string
- Description
The link. Shown only once.
- Name
link- Type
- object
- Description
The link's settings, same shape as List links.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/links/create?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"path": "/Shared/Legal/Contracts",
"audience": "ANYONE",
"allowDownload": false,
"expiresAt": "2026-12-31T23:59:59Z"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/links/create?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
path: '/Shared/Legal/Contracts',
audience: 'ANYONE',
allowDownload: false,
expiresAt: '2026-12-31T23:59:59Z'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/links/create?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'path': '/Shared/Legal/Contracts',
'audience': 'ANYONE',
'allowDownload': False,
'expiresAt': '2026-12-31T23:59:59Z'
}
)
data = response.json()
{
"url": "https://app.autessa.com/public/drive/Xk9vQ2...",
"link": {
"linkId": "c6e2d9a4-0f3b-4a71-9e58-7d1b2c4f6a80",
"target": {
"nodeId": "4170",
"path": "/Shared/Legal/Contracts"
},
"role": "VIEWER",
"audience": "ANYONE",
"allowDownload": false,
"allowSearch": true,
"expiresAt": "2026-12-31T23:59:59Z",
"createdBy": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
},
"createdAt": "2026-10-02T14:58:00Z",
"accessCount": 0,
"lastAccessedAt": null
}
}
List links
/links/listLists active links, for one item or for everything the caller can manage. Link URLs are not included.
Permission: READ
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
path- Type
- string
- Description
Only links on this item.
- Name
nodeId- Type
- string
- Description
Only links on this item.
Response
- Name
links- Type
- array<object>
- Description
Each link:
linkId,target(nodeIdandpath),role,audience,allowDownload,allowSearch,expiresAt,createdBy,createdAt,accessCount, andlastAccessedAt.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/links/list?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"path": "/Shared/Legal/Contracts"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/links/list?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
path: '/Shared/Legal/Contracts'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/links/list?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'path': '/Shared/Legal/Contracts'
}
)
data = response.json()
{
"links": [
{
"linkId": "c6e2d9a4-0f3b-4a71-9e58-7d1b2c4f6a80",
"target": {
"nodeId": "4170",
"path": "/Shared/Legal/Contracts"
},
"role": "VIEWER",
"audience": "ANYONE",
"allowDownload": false,
"allowSearch": true,
"expiresAt": "2026-12-31T23:59:59Z",
"createdBy": {
"userId": "u8Kd2LmQ4x",
"name": "Dana Ortiz"
},
"createdAt": "2026-10-02T14:58:00Z",
"accessCount": 14,
"lastAccessedAt": "2026-10-02T13:20:44Z"
}
]
}
Revoke a link
/links/revokeRevokes a link. It stops working immediately, including for anyone who already has it open.
Permission: WRITE, and the same rights as sharing
Request parameters
- Name
tableId- Type
- string
- Description
The Drive's ID. Must match the
resourceIdquery parameter.
- Name
linkId- Type
- string
- Description
The link to revoke.
Response
- Name
revoked- Type
- boolean
- Description
truewhen the link was revoked.
- cURL
- JavaScript
- Python
curl -X POST 'https://api.autessa.com/clients/autessadb-drive/links/revoke?resourceId=V1StGXR8Z5' \
-H "Authorization: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tableId": "V1StGXR8Z5",
"linkId": "c6e2d9a4-0f3b-4a71-9e58-7d1b2c4f6a80"
}'
const response = await fetch(
'https://api.autessa.com/clients/autessadb-drive/links/revoke?resourceId=V1StGXR8Z5',
{
method: 'POST',
headers: {
'Authorization': process.env.API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tableId: 'V1StGXR8Z5',
linkId: 'c6e2d9a4-0f3b-4a71-9e58-7d1b2c4f6a80'
})
}
);
const data = await response.json();
import os
import requests
response = requests.post(
'https://api.autessa.com/clients/autessadb-drive/links/revoke?resourceId=V1StGXR8Z5',
headers={'Authorization': os.environ['API_KEY']},
json={
'tableId': 'V1StGXR8Z5',
'linkId': 'c6e2d9a4-0f3b-4a71-9e58-7d1b2c4f6a80'
}
)
data = response.json()
{
"revoked": true
}
Comments
Comments live under /comments/* and need the Commenter role or higher on the item (owners and Drive managers always qualify). All calls take tableId and identify the item by nodeId or path.
POST /comments/listwithincludeResolvedandcursor: threads with their replies, each with the author's display name, time, body,anchor, andresolved.POST /comments/addwithbody, optionalanchor, and optionalparentIdto reply.POST /comments/editwithcommentIdandbody(authors only).POST /comments/resolvewithcommentIdandresolved(Editors, owners, and managers).POST /comments/deletewithcommentId(authors; Drive managers for any comment).
An anchor is one of { "kind": "page", "page": 3, "quote": "..." }, { "kind": "text", "from": 120, "to": 164, "quote": "..." } (offsets into the file's extracted text), { "kind": "cell", "sheet": "Q1", "range": "B2:D9" }, { "kind": "slide", "slide": 2 }, or omitted for the whole file. Anchors carry the version they were made on; a text anchor whose quote no longer matches a newer version is returned with stale: true. stat includes commentCount and openCommentCount.
Live co-editing uses a WebSocket at /ws/autessadb/drive/collab with the same session parameters as other sockets; only Editors and above may send changes.
Errors
Failed calls return an error code, a plain-language message and a hint with the next step. Some errors add details:
{
"errorCode": "VERSION_CONFLICT",
"errors": ["/Shared/notes/plan.md is now at version 5"],
"hint": "Read the file again, then retry with expectedVersion=5.",
"error": {
"code": "VERSION_CONFLICT",
"message": "/Shared/notes/plan.md is now at version 5",
"hint": "Read the file again, then retry with expectedVersion=5.",
"details": { "path": "/Shared/notes/plan.md", "currentVersion": 5 }
}
}
| Status | Error code | When |
|---|---|---|
400 | INVALID_PATH | The path is malformed, contains . or .., or exceeds the length or depth limits. |
400 | INVALID_PATTERN | A glob or regular expression is invalid, too broad (fewer than 3 literal characters over a large scope), or longer than 1,000 characters. |
400 | INVALID_CURSOR | The cursor is malformed, expired, or was sent with different arguments than the call that produced it. |
400 | INVALID_MOVE | A folder was moved into itself or one of its own subfolders. |
401 | — | Missing or invalid API key. |
403 | FORBIDDEN | The key lacks the table permission for the operation, the body's tableId does not match resourceId, the caller's role on the item is too low, or a folder contains items the caller cannot see. |
404 | NOT_FOUND | The item does not exist or the caller cannot open it. |
409 | NAME_CONFLICT | The name is already taken in the folder and the conflict rule is FAIL, or a write with mode: create found the file. |
409 | VERSION_CONFLICT | A write or edit named an expectedVersion the file is no longer at. error.details.currentVersion holds the current version. |
409 | EDIT_NO_MATCH | An edit's oldText does not occur in the file. |
409 | EDIT_AMBIGUOUS | An edit's oldText occurs more than once and replaceAll is not set. error.details.matches holds the count. |
413 | FILE_TOO_LARGE | A write or edit would make the file larger than 5 MB. Upload large files instead. |
413 | QUOTA_EXCEEDED | The upload would exceed your storage allowance, the per-file size limit, or the file-count limit. |
413 | TOO_MANY_ITEMS | A move or trash would touch more than 100,000 items at once. |
415 | UNSUPPORTED_TYPE | The file type is not allowed in a Drive. |
429 | RATE_LIMITED | Too many search, grep, or read calls; retry after a short wait. Semantic search also counts toward your company's search limits. |
Related
- AutessaDB Drive guide
- AutessaDB API — row operations for regular tables
- Analytics API
- Drive tool type
- Drive commands in the CLI
autessa.autessadbSDK