Files.fm Document Management System (DMS) API
Files.fm provides a Document Management System (DMS) for organizing business documents with metadata, workflows, reminders, e-signatures, and access control integrated with cloud file storage.
The DMS API currently covers tasks (create, read, update, comment), projects (read-only: fields, users, and document lists), contact persons (create, read, update), and clients / parties (read-only: fields, users, and document lists). Other DMS registers are not available through this API yet. Data created or updated here is the same data shown in the DMS web interface.
Note: Only
dvs_section=task,dvs_section=project_2,dvs_section=contact_person, anddvs_section=clientare supported. Additional registers and actions are planned.
Base URL
https://api.files.fm/api_dvs/{dvs_section}/{action}
Example:
POST https://api.files.fm/api_dvs/task/create_document
Authentication
Authenticate every request with user and user_access_token. Always use HTTPS.
| Field | Description |
|---|---|
user |
Files.fm username or email |
user_access_token |
API access token. Generate/revoke at https://files.fm/account#api_keys. |
Send both in a JSON body (Content-Type: application/json) next to the action parameters. Do not put credentials in the URL. Do not send pass. A website login cookie by itself is not accepted.
curl -X POST 'https://api.files.fm/api_dvs/task/get_fields' \
-H 'Content-Type: application/json' \
-d '{"user":"YOUR_USER","user_access_token":"YOUR_API_TOKEN"}'
Organization and DMS requirements
Beyond authentication, the DMS API has two additional requirements:
- Organization membership: the authenticated user must belong to an organization that has DMS enabled.
- Section write permission: the user's user-group must have
writepermission on the target DMS register (dvs_section). Read-only users cannot currently reach the DMS API.
Missing section access or an unavailable section returns HTTP 405. If authentication does not establish a session organization, the API returns HTTP 401.
Request format
The URL names the register and the action. Send action-specific parameters in a JSON body (Content-Type: application/json). user and user_access_token in that JSON are used for authentication and are not treated as document fields.
https://api.files.fm/api_dvs/{dvs_section}/{action}
| Path segment | Description |
|---|---|
{dvs_section} |
Register name: task, project_2, contact_person, or client (see Supported registers) |
{action} |
Operation name (see Endpoint summary) |
For actions with no extra parameters (for example get_fields), the JSON body only needs user and user_access_token. Prefer the URL path for action and dvs_section; do not rely on overriding them from the body.
HTTP status codes
| Status | Meaning | Action |
|---|---|---|
200 OK |
Request succeeded. | Process the returned JSON. |
400 Bad Request |
Invalid or incomplete parameters. | Check required parameters and formats. |
401 Unauthorized |
Authorization failed or is missing. | Check user and user_access_token. |
405 Method Not Allowed |
Operation not permitted (missing section write permission, section not enabled for the org, or wrong HTTP method). | Check permissions, dvs_section, and method. |
500 Internal Server Error |
Backend/API service error. | Retry later or contact Files.fm support. |
On error, the response body is empty. Use the HTTP status code (and status text) to determine the failure; there is no JSON error payload.
Supported registers
The {dvs_section} path segment must be one of the values below. Any other section returns HTTP 400 (Invalid DVS section).
dvs_section |
Register | Supported actions |
|---|---|---|
task |
Tasks (project tasks) | get_fields, get_users, get_document, get_documents, create_document, update_document, add_comment |
project_2 |
Projects (parent container for tasks) | get_fields, get_users, get_document, get_documents |
contact_person |
Contact persons (external notification receivers on tasks) | get_fields, get_document, get_documents, create_document, update_document |
client |
Clients / parties (companies and partners) | get_fields, get_users, get_document, get_documents |
create_document and update_document are available for tasks and contact persons. add_comment is tasks only. Projects and clients are read-only through this API.
Use contact_person get_documents / get_document to look up contact IDs, then pass those IDs as ext_notif_receiver when creating or updating a task. You can also create or update contact persons through this API.
Use client get_documents / get_document to look up client document IDs for contact company (and other relation fields that reference client).
Endpoint summary
| Action | Method | Endpoint | Purpose |
|---|---|---|---|
get_fields |
POST |
/api_dvs/{dvs_section}/get_fields |
Field schema and dropdown options for create/update/filter. |
get_users |
POST |
/api_dvs/{dvs_section}/get_users |
Assignable users (for tasks: scoped to a project). |
get_document |
POST |
/api_dvs/{dvs_section}/get_document |
Read one document by ID. |
get_documents |
POST |
/api_dvs/{dvs_section}/get_documents |
List/filter documents with pagination. |
create_document |
POST |
/api_dvs/{dvs_section}/create_document |
Create a document (task, contact_person). |
update_document |
POST |
/api_dvs/{dvs_section}/update_document |
Partially update a document (task, contact_person). |
add_comment |
POST |
/api_dvs/task/add_comment |
Add a comment on a task (same as the web UI). Use @[USER:user_id] in the text to mention a user. |
{dvs_section} is task, project_2, contact_person, or client for the read actions (get_users is task, project_2, and client only). Write actions are task and contact_person (add_comment is task only).
Actions
get_fields
Returns the field schema for a register: field names, labels, types, whether the field is required, and the available options for dropdown fields. Use this to discover what fields to pass to create_document / update_document and which fields support filtering in get_documents.
POST https://api.files.fm/api_dvs/task/get_fields
Request body: authorization only.
Response:
{
"fields": [
{
"name": "dvs_project_id",
"label": "Project",
"type": "relation",
"required": true,
"filter": true,
"section": "project_2",
"list_action": "get_documents"
},
{
"name": "name",
"label": "Name",
"type": "text",
"required": true,
"filter": false
},
{
"name": "dropdown_status",
"label": "Status",
"type": "dropdown",
"required": false,
"filter": true,
"options": [
{ "id": 12, "display_name": "Open" },
{ "id": 13, "display_name": "In progress" },
{ "id": 14, "display_name": "Done" }
]
},
{
"name": "responsible",
"label": "Responsible",
"type": "user_id",
"required": false,
"filter": false,
"depends_on": "dvs_project_id",
"list_action": "get_users"
},
{
"name": "followers",
"label": "Followers",
"type": "user_ids",
"required": false,
"filter": false,
"depends_on": "dvs_project_id",
"list_action": "get_users"
},
{
"name": "ext_notif_receiver",
"label": "External followers",
"type": "relation_ids",
"required": false,
"filter": false,
"section": "contact_person",
"list_action": "get_documents"
}
]
}
Field types
| Type | Description | Input format (create/update) | Output format (get_document/get_documents) |
|---|---|---|---|
text |
Plain text or numeric string | string | "value" or null |
date |
Calendar date | "YYYY-MM-DD" string |
"YYYY-MM-DD" or null |
html |
Rich text (HTML markup) | HTML string | Full HTML string (only in get_document; omitted in get_documents) |
dropdown |
Org-specific enum value | integer id from options |
{ "id": N, "display_name": "..." } or null |
dropdown_ids |
Multiple org-specific enum values | array of integer ids from options |
array of { "id", "display_name" } objects |
relation |
Link to a document in another register | integer document id | { "id": N, "display_name": "..." } or null |
relation_ids |
Multiple links to documents in another register | array of integer document ids | array of { "id", "display_name" } objects |
user_id |
Single assignable user | integer user id from get_users |
{ "id": N, "display_name": "Full Name" } or null |
user_ids |
Multiple assignable users | array of integer user ids | array of { "id", "display_name" } objects |
Fields with "filter": true can be used as filters in get_documents. Fields with "depends_on" require the named field's value to be supplied when calling get_users.
Fields with "list_action": "get_users" contain user references; call get_users with the relevant context parameters to get the allowed values. Fields with "list_action": "get_documents" contain references to documents in another register; call get_documents on that register (see "section") to list possible values.
get_users
Returns assignable platform user IDs for user_id and user_ids fields in the current register. Only available on registers that expose those field types (task, project_2, client); not on contact_person (use get_documents there for contact document IDs). For tasks, the list is scoped to workers of the specified project.
POST https://api.files.fm/api_dvs/task/get_users
Content-Type: application/json
Request:
{
"dvs_project_id": 51
}
| Parameter | Required for | Description |
|---|---|---|
dvs_project_id |
task |
ID of the project whose workers are listed. Required for task; not needed for project_2 or client. |
Response:
{
"users": [
{ "id": 1042, "display_name": "Anna Smith" },
{ "id": 1105, "display_name": "John Doe" }
]
}
get_document
Returns a single document by its DMS document ID.
POST https://api.files.fm/api_dvs/task/get_document
Content-Type: application/json
Request:
{
"dvs_document_id": 4821
}
Response:
{
"dvs_document_id": 4821,
"full_number": "PROJ-7",
"dvs_project_id": { "id": 51, "display_name": "Website redesign" },
"dropdown_type": null,
"name": "Write API documentation",
"description": "<p>Document all DMS API endpoints.</p>",
"dropdown_priority": { "id": 17, "display_name": "High" },
"dropdown_status": { "id": 12, "display_name": "In progress" },
"responsible": { "id": 1042, "display_name": "Anna Smith" },
"followers": [
{ "id": 1105, "display_name": "John Doe" }
],
"ext_notif_receiver": [
{ "id": 901, "display_name": "Jane Client" }
],
"date_due": "2026-09-30",
"estimated_hours": "4",
"spent_hours": null,
"creator": { "id": 980, "display_name": "Maria Admin" },
"date_created": "2026-08-10 14:22:05",
"date_updated": "2026-08-24 09:45:11"
}
The html field type (description) is returned in full only for get_document. It is omitted from get_documents list results.
The creator, date_created, and date_updated fields are read-only metadata returned on get, not accepted in get_fields for create/update.
get_documents
Returns a paginated list of documents in a register, with optional filtering.
POST https://api.files.fm/api_dvs/task/get_documents
Content-Type: application/json
Request:
{
"limit": 20,
"offset": 0,
"filters": {
"dvs_project_id": 51,
"dropdown_status": [12, 13]
}
}
| Parameter | Type | Default | Maximum | Description |
|---|---|---|---|---|
limit |
integer | 50 | 200 | Number of results to return |
offset |
integer | 0 | — | Number of results to skip |
filters |
object | — | — | Only fields marked "filter": true in get_fields. Multiple values for one field are OR; multiple fields are AND. |
Response:
{
"items": [
{
"dvs_document_id": 4821,
"full_number": "PROJ-7",
"dvs_project_id": { "id": 51, "display_name": "Website redesign" },
"dropdown_type": null,
"name": "Write API documentation",
"dropdown_priority": { "id": 17, "display_name": "High" },
"dropdown_status": { "id": 12, "display_name": "In progress" },
"responsible": { "id": 1042, "display_name": "Anna Smith" },
"followers": [],
"ext_notif_receiver": [],
"date_due": "2026-09-30",
"estimated_hours": "4",
"spent_hours": null,
"creator": { "id": 980, "display_name": "Maria Admin" },
"date_created": "2026-08-10 14:22:05",
"date_updated": "2026-08-24 09:45:11"
}
],
"total": 1,
"limit": 20,
"offset": 0
}
Results are ordered by creation date descending (newest first).
Continue with offset += items.length until the offset reaches total. HTML fields are omitted from lists. Unknown filters are ignored; use only fields marked filter: true. No universal public DVS request quota is promised; infrastructure may apply additional limits.
To look up a contact ID for task ext_notif_receiver, call get_documents on contact_person. The contact list can be filtered by company and multi_dropdown_group ("filter": true in get_fields).
To look up a client ID for contact company, call get_documents on client. The client list can be filtered by dropdown fields, multi_dropdown_group, and projectmanager ("filter": true in get_fields).
create_document
Creates a new document. Only fields declared by get_fields are accepted; unknown fields are ignored. Available for task and contact_person.
POST https://api.files.fm/api_dvs/task/create_document
Content-Type: application/json
Auth: user and user_access_token in this JSON.
Request:
{
"user": "YOUR_USER",
"user_access_token": "YOUR_API_TOKEN",
"create_params": {
"dvs_project_id": 51,
"name": "Review pull request",
"dropdown_priority": 17,
"dropdown_status": 12,
"responsible": 1042,
"followers": [1105],
"ext_notif_receiver": [901],
"date_due": "2026-09-15",
"estimated_hours": "2"
}
}
| Parameter | Type | Required | Description |
|---|---|---|---|
create_params |
object | Yes | Document field values keyed by field name |
All fields declared as "required": true by get_fields must be present and non-empty. Fields marked "required": false may be omitted; the register sets sensible defaults.
User fields (user_id, user_ids) must contain IDs returned by get_users. Dropdown fields (dropdown, dropdown_ids) must contain option IDs returned by get_fields. Relation fields (relation, relation_ids) must contain document IDs from the register named in "section" (for task ext_notif_receiver: contact_person; for contact company: client). Invalid IDs return 400. Look up client IDs with client get_documents / get_document.
Response:
{
"dvs_document_id": 4822
}
Use the returned dvs_document_id with get_document to retrieve the full record including auto-generated fields such as full_number.
Creation and updates can send notifications. There is no documented idempotency key. Reconcile an uncertain write with reads before retrying; invalid relation IDs can fail after part of a write has occurred. A failure does not guarantee rollback.
update_document
Updates an existing document. Only the fields provided in update_params are changed; all other fields keep their current values. Available for task and contact_person.
POST https://api.files.fm/api_dvs/task/update_document
Content-Type: application/json
Auth: user and user_access_token in this JSON.
Request:
{
"user": "YOUR_USER",
"user_access_token": "YOUR_API_TOKEN",
"dvs_document_id": 4822,
"update_params": {
"dropdown_status": 14,
"spent_hours": "2.5"
}
}
| Parameter | Type | Required | Description |
|---|---|---|---|
dvs_document_id |
integer | Yes | ID of the document to update |
update_params |
object | Yes | Fields to change, keyed by field name |
The same field-level validation rules as create_document apply. The project (dvs_project_id) of a task cannot be changed through the API.
Omitted fields keep their current values. Supplied array fields replace that field's selected values; read the record first when preserving followers or relations. See the tasks quickstart for complete curl, PHP and JavaScript workflows.
Response:
{
"dvs_document_id": 4822
}
add_comment
Adds a comment on a task. Same storage and notifications as the DMS web interface (htmlspecialchars on save; HTML is shown in comment emails like task descriptions). Available for task only.
To mention a user, put @[USER:user_id] in the comment at the position you want (USER is the type prefix; user_id is the same integer id as in get_users / get_document). You can mention several users, including in the middle of a sentence. Plain @name, email addresses, and @[1042] without USER: stay as normal text. A mention id must belong to a user in the same organization. Mentions are not limited to project workers — the same as mentioning someone in the DMS web interface (they get the mention email even if they cannot open the task).
POST https://api.files.fm/api_dvs/task/add_comment
Content-Type: application/json
Auth: user and user_access_token in this JSON.
Request:
{
"user": "YOUR_USER",
"user_access_token": "YOUR_API_TOKEN",
"dvs_document_id": 4821,
"comment": "Please ask @[USER:1042] to review the draft before Friday."
}
| Parameter | Type | Required | Description |
|---|---|---|---|
dvs_document_id |
integer | Yes | ID of the task to comment on |
comment |
string | Yes | Comment body (same as the web editor). Must be non-empty after trimming. Insert @[USER:user_id] where a mention should appear. |
Response:
{
"dvs_document_id": 4821
}