Skip to content

Replace the bytes of a file with base64 content

POST
/drives/{drive}/nodes/{node}/content/base64
curl --request POST \
--url https://work.optidata.cloud/api/drives/1/nodes/300754/content/base64 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "content": "SGVsbG8sIE9wdGl3b3JrIQ==" }'

Writes a new version of the file from a base64 payload — the counterpart of the multipart upload, for clients that post JSON. Requires permission to update the node’s content.

Set is_base64_content_url_encoded when the decoded payload is additionally URL encoded.

drive
required
integer format: int64

Numeric id of the drive. Read it from GET /drives/config.json.

node
required
integer format: int64

Numeric id of the node (file or folder).

Media typeapplication/json
object
content
required

The new content, base64 encoded.

string
is_base64_content_url_encoded

true when the decoded payload must also be URL decoded.

boolean | null
base_content_hash

The hash_sha256 of the content the caller edited, as the server returned it. Optional. When sent, the write is accepted only if it is equal to the hash stored on the node’s current content, and is stored on the new version as base_content_hash; otherwise the answer is 409 and nothing is written. A node with no stored hash matches no base. Omit it for an unconditional write; on a chunked replacement, omit it at both prepare and finish, since a base sent at prepare is checked at finish.

string | null
<= 128 characters
Examples
Exampletext
{
"content": "SGVsbG8sIE9wdGl3b3JrIQ=="
}

The node with its new content.

Media typeapplication/json
object
node
required

A file or a folder. type is 1 for a folder and 2 for a file; the booleans is_folder / is_file are derived from it. Content attributes (content_*) are null on folders and on files that have no bytes yet.

object
id
required
integer format: int64
parent_id

Parent folder id. null marks a company folder (top level).

integer | null format: int64
drive_id
required
integer format: int64
user_id

Owner of the node.

integer format: int64
uuid
string
cuid
string
type
required

1 = folder, 2 = file.

integer
Allowed values: 1 2
name
required
string
is_folder
boolean
is_file
boolean
is_coeditable

Whether the file can be co-edited in the online editor.

boolean
is_cold

Whether the node lives in cold storage. Present only on detail reads.

boolean
is_delete_target

true when this node was the explicit target of a delete; null when it was removed only because an ancestor was deleted.

boolean | null
ltree_path

Materialised ancestor path, dot separated ids.

string | null
group_id
integer | null format: int64
node_content_id

Current content version of the file.

integer | null format: int64
oldest_node_content_id
integer | null format: int64
guest_data_id
integer | null format: int64
content_path
string | null
content_mime_type
string | null
content_size_bytes
integer | null format: int64
content_thumbnail_url
string | null format: uri
content
One of:

One stored version of a file’s bytes.

object
id
integer format: int64
node_id
integer format: int64
path

Opaque storage path of this content version.

string
mime_type
string
size_bytes
integer format: int64
hash_sha256

SHA-256 of this version, the value a caller sends back as base_content_hash.

string | null
base_content_hash

The hash_sha256 of the version this one was written from, as sent in base_content_hash and accepted by the server. null when the write carried no base. Equal to the hash a sync client last committed: the other side edited that version. Different, or null: the client cannot tell, and should keep a conflict copy.

string | null
created_at
string format: date-time
updated_at
string format: date-time
actions

The caller’s effective permission level on this node. Present on listings derived from shares.

string
Allowed values: none view edit share owner manage
user
One of:

A user of the tenant.

object
id
integer format: int64
uuid
string format: uuid
cuid

Identifier of the company (tenant) the user belongs to.

string
username
string
email
string format: email
name
string
full_name
string
company_name
string
role

Role of the user inside the tenant.

string
status
string
Allowed values: active inactive blocked
avatar_url
string | null format: uri
created_at
string format: date-time
updated_at
string format: date-time
deleted_at
string | null format: date-time
profile

Profile extras (avatar, job title). Loaded only where noted.

object | null
groups

Groups the user belongs to. Loaded only where noted.

Array<object>

A group of users inside the tenant.

object
id
integer format: int64
guid

Tenant-wide identifier of the group; used in paths.

string format: uuid
name
string
description
string | null
email
string | null format: email
cuid
string
memberships

Members of the group, each with its embedded user.

Array<object>
object
key
additional properties
any
userStatus

Presence status of the user. Loaded only where noted.

object | null
status_details

Rendered presence details (type, icon, message). Present on dashboard listings.

object | null
customization

Per-node presentation settings (colour, shared flag).

object | null
markers
Array<object>

A per-user flag on a node.

object
id
integer format: int64
node_id
integer format: int64
user_id
integer format: int64
type

Kind of marker.

string
Allowed values: favorite important
created_at
string format: date-time
tags
Array<object>
object
key
additional properties
any
lock
One of:

An advisory lock held on a file while it is being edited. Take one before replacing the content of a file another user could be working on.

object
id
integer format: int64
node_id
integer format: int64
user_id
integer format: int64
note

Free-text reason shown to other users.

string | null
origin

Free-text label naming the client that took the lock.

string | null
user_hash

Opaque per-installation identifier of the lock holder.

string | null
expires_at
string | null format: date-time
created_at
string format: date-time
updated_at
string format: date-time
user
One of:

A user of the tenant.

object
id
integer format: int64
uuid
string format: uuid
cuid

Identifier of the company (tenant) the user belongs to.

string
username
string
email
string format: email
name
string
full_name
string
company_name
string
role

Role of the user inside the tenant.

string
status
string
Allowed values: active inactive blocked
avatar_url
string | null format: uri
created_at
string format: date-time
updated_at
string format: date-time
deleted_at
string | null format: date-time
profile

Profile extras (avatar, job title). Loaded only where noted.

object | null
groups

Groups the user belongs to. Loaded only where noted.

Array<object>

A group of users inside the tenant.

object
id
integer format: int64
guid

Tenant-wide identifier of the group; used in paths.

string format: uuid
name
string
description
string | null
email
string | null format: email
cuid
string
memberships

Members of the group, each with its embedded user.

Array<object>
object
key
additional properties
any
userStatus

Presence status of the user. Loaded only where noted.

object | null
status_details

Rendered presence details (type, icon, message). Present on dashboard listings.

object | null
locks
Array<object>

An advisory lock held on a file while it is being edited. Take one before replacing the content of a file another user could be working on.

object
id
integer format: int64
node_id
integer format: int64
user_id
integer format: int64
note

Free-text reason shown to other users.

string | null
origin

Free-text label naming the client that took the lock.

string | null
user_hash

Opaque per-installation identifier of the lock holder.

string | null
expires_at
string | null format: date-time
created_at
string format: date-time
updated_at
string format: date-time
user
One of:

A user of the tenant.

object
id
integer format: int64
uuid
string format: uuid
cuid

Identifier of the company (tenant) the user belongs to.

string
username
string
email
string format: email
name
string
full_name
string
company_name
string
role

Role of the user inside the tenant.

string
status
string
Allowed values: active inactive blocked
avatar_url
string | null format: uri
created_at
string format: date-time
updated_at
string format: date-time
deleted_at
string | null format: date-time
profile

Profile extras (avatar, job title). Loaded only where noted.

object | null
groups

Groups the user belongs to. Loaded only where noted.

Array<object>

A group of users inside the tenant.

object
id
integer format: int64
guid

Tenant-wide identifier of the group; used in paths.

string format: uuid
name
string
description
string | null
email
string | null format: email
cuid
string
memberships

Members of the group, each with its embedded user.

Array<object>
object
key
additional properties
any
userStatus

Presence status of the user. Loaded only where noted.

object | null
status_details

Rendered presence details (type, icon, message). Present on dashboard listings.

object | null
created_at
string format: date-time
updated_at
string format: date-time
deleted_at

Non-null while the node is in the trash.

string | null format: date-time
Example
{
"node": {
"id": 300754,
"drive_id": 1,
"type": 1,
"name": "Contracts",
"ltree_path": "300754.665198",
"content_mime_type": "application/pdf",
"content_size_bytes": 148213,
"content": {
"id": 613488,
"mime_type": "application/pdf",
"size_bytes": 148213
},
"actions": "none",
"user": {
"id": 15,
"uuid": "9c1f0e2a-4d31-4d8a-8c1a-1f0b6b1f9a10",
"cuid": "a1b2c3d4-2226-46c1-91b2-a9e9ba4c2d5b",
"username": "jane.doe@acme.example",
"email": "jane.doe@acme.example",
"name": "Jane Doe",
"full_name": "Jane Doe",
"company_name": "Acme",
"role": "super-admin",
"status": "active",
"groups": [
{
"id": 560,
"guid": "a19d5670-335d-4285-8ee4-fcb54cb70faf",
"name": "Finance"
}
]
},
"markers": [
{
"type": "favorite"
}
],
"lock": {
"user": {
"id": 15,
"uuid": "9c1f0e2a-4d31-4d8a-8c1a-1f0b6b1f9a10",
"cuid": "a1b2c3d4-2226-46c1-91b2-a9e9ba4c2d5b",
"username": "jane.doe@acme.example",
"email": "jane.doe@acme.example",
"name": "Jane Doe",
"full_name": "Jane Doe",
"company_name": "Acme",
"role": "super-admin",
"status": "active",
"groups": [
{
"id": 560,
"guid": "a19d5670-335d-4285-8ee4-fcb54cb70faf",
"name": "Finance"
}
]
}
},
"locks": [
{
"user": {
"id": 15,
"uuid": "9c1f0e2a-4d31-4d8a-8c1a-1f0b6b1f9a10",
"cuid": "a1b2c3d4-2226-46c1-91b2-a9e9ba4c2d5b",
"username": "jane.doe@acme.example",
"email": "jane.doe@acme.example",
"name": "Jane Doe",
"full_name": "Jane Doe",
"company_name": "Acme",
"role": "super-admin",
"status": "active",
"groups": [
{
"id": 560,
"guid": "a19d5670-335d-4285-8ee4-fcb54cb70faf",
"name": "Finance"
}
]
}
}
]
}
}

Missing, malformed or expired authentication key.

Media typeapplication/json

Authentication failures use an error key rather than message.

object
error
required
string
Examples
Examplemissing

No bearer token sent

{
"error": "JWT passport exception: Missing bearer token in request"
}

The caller lacks the permission level the operation requires.

Media typeapplication/json

Generic error envelope used by policy, binding and framework failures.

object
message
required

Human-readable description of the failure.

string
Examples
Exampledenied
{
"message": "This action is unauthorized."
}

The resource does not exist, or does not belong to the given drive.

Media typeapplication/json

Generic error envelope used by policy, binding and framework failures.

object
message
required

Human-readable description of the failure.

string
Examples
Examplemissing
{
"message": "No query results for model [App\\Models\\Node] 99999999"
}

base_content_hash is not the hash_sha256 stored on the node’s current content — someone else saved a version since the caller read it, or the node has no stored hash to match. Nothing was written.

Media typeapplication/json

Envelope of the domain errors the Drive services raise.

object
error
required

Human-readable description of the failure, in the caller’s language.

string
status
required

The HTTP status, repeated in the body.

integer
help
required

Extra detail, often empty.

string
Examples
ExamplestaleBase
{
"error": "The file was changed by someone else since you opened it. Your version was not saved over it.",
"status": 409,
"help": ""
}

The request body or query string failed validation.

Media typeapplication/json
object
message
required

The first validation message.

string
errors
required

Validation messages keyed by field name.

object
key
additional properties
Array<string>
Examples
Exampleinvalid
{
"message": "The name field is required.",
"errors": {
"name": [
"The name field is required."
]
}
}

Another write of the same file held it for longer than this write waits (30 seconds by default), or the write could not keep its turn (the server lost its hold on the file before writing). Writes that wait for a turn are the ones carrying a base_content_hash and every chunk finish. The base, if any, was not checked and nothing was written: retry the same request after the number of seconds in Retry-After; read the header rather than assume a fixed delay.

Media typeapplication/json

Envelope of the domain errors the Drive services raise.

object
error
required

Human-readable description of the failure, in the caller’s language.

string
status
required

The HTTP status, repeated in the body.

integer
help
required

Extra detail, often empty.

string
Examples
ExamplesaveInProgress
{
"error": "Another save of this file is in progress. Try again in a moment.",
"status": 423,
"help": ""
}
Retry-After
integer
Example
5

Seconds to wait before retrying the request (configurable on the server).

Rate limit exceeded. Retry after the window resets.

Media typeapplication/json

Generic error envelope used by policy, binding and framework failures.

object
message
required

Human-readable description of the failure.

string
Examples
Examplethrottled
{
"message": "Too Many Attempts."
}