Skip to main content
The REST API makes the inventory in Docusnap365 available to your own applications: read, query and create assets. It is the way for everything that happens regularly and automatically—reports in your own tool, transfer to another system, your own interfaces on your own data. It returns the same data as the interface under the same rights. For questions in your own words, use the AI Assistant; to connect an AI tool, use the MCP connector. The REST API is the programmatic route.

Address and calls

All calls go to https://api.docusnap365.com/api/v1. The API works with assets only and has seven endpoints: Parameters, schemas and examples of each endpoint are in the API reference in the sidebar.
The response is one page of at most 50 assets.

Keys and permissions

Every call carries an API key in the x-api-key header. No other headers and no prior sign-in are needed. Owners and administrators create keys under Administration › Integrations › API Keys; see Manage API keys. When you create a key, you choose the access. Read is enough for the reading endpoints; POST /asset and POST /asset/bulk require Read and Write. A key without the required access receives the response 403. If the key is missing or invalid, the API responds with 401 and no content. A key belongs to a user, and that user’s rights apply: what the user does not see in the interface, the API does not return either. Missing rights do not raise an error—they yield a smaller result set. If you see less than expected, check the user’s rights first, then the query. An asset the user cannot see behaves like a nonexistent one: GET /asset/{id} and POST /assets/expand respond with 404.

Assets and types

An asset consists of its core data and, on request, its details. Every reading endpoint returns the core data: among others id, name, schemaId, objectType, parentId, the assignment to organization, location, platform and domain, as well as status, origin and the creation and modification information. Everything else is not part of the core data and comes through expands. Every asset has a type, schemaId in the API. The type determines which data the asset carries. The types with their fields are in the data model. To create an asset you need the schemaId of the matching type.

Reading and querying

GET /assets returns the first 50 assets. Pass select and search as a JSON array:
search takes entries of the form field=value and finds what contains the value, ignoring case. Several entries apply together. On this endpoint, select only determines which fields are read; the response still carries all fields, with empty values for those not selected. POST /assets/query is the way for filters, sorting and field selection. All parts of the query are optional:
Filtering and sorting work on the core data only. A path with data. in the filter of the query ends with 400 UNKNOWN_PATH. You read the captured data of a type through an expand and evaluate it in your own application.

Loading details

An expand loads part of the details for each asset. There are four, with fixed names: An expand has its own select, filter, sort and limit (default 50). select also picks individual values of the data, such as data.serialNumber. Which values a type has is in the data model. A filter on schemaId in the query speeds up the resolution of the data. paths. filter, sort and limit apply per asset for object_essentials, object_blocks and children; for object_data only select applies.
object_blocks is the expensive case: an asset carries several thousand blocks on average, over 95,000 in individual cases. Request this expand only with filter and a small limit.
An unknown name in expands is skipped by POST /assets/query and rejected with 400 by POST /assets/expand. Where the details appear in the response depends on select. With select, each expand appears under its name directly on the asset, object_data as an object, the others as a list. Without select, all expands appear together under expands, each as a list. POST /assets/expand loads one expand for a single asset. parentId and expandName are required. With a cursor from incompleteExpands or nextCursor, the call continues where the cursor was issued; select, filter, sort and limit in the body then do not apply.

Paging with the cursor

Every reading response except GET /asset/{id} has the same shape: POST /cursor/continue returns the next page with { "cursor": "<nextCursor>" }. The cursor is bound to the subscription and the user and expires after one hour; after that, start the query again. Treat it as an opaque value.
Follow-up pages always carry the full core data and only the expand object_data. A select and the other expands of the first page do not apply there. To get object_essentials, object_blocks and children on every page, call POST /assets/expand per asset.

Creating and updating

POST /asset writes one asset, POST /asset/bulk up to 100 in one transaction. Docusnap365 decides itself whether it already knows the asset: if so, it is updated, otherwise created. The API answers 201 for a newly created asset and 200 for an updated one.
Without objectData, object.id is required and the asset is updated. A more complete existing record that must not be overwritten, and a record with too few identity values, are rejected. The response names the ID of the asset (id, idPair.dbId), whether it was created (isCreate) and whether it succeeded (isSuccess, otherwise errorMessage). For POST /asset/bulk, results returns one result per entry in the order of the request, matched through idPair.fakeId, plus successCount and failedCount. An entry without object, or with a missing or too long name, aborts the whole call with 400. A protected asset, or one with too few identity values, is skipped and carries its errorMessage in results; the other entries are written.
The status 200 on POST /asset/bulk does not mean that all entries were saved. Check failedCount and results[].isSuccess.

Errors

API errors arrive as application/problem+json according to RFC 9457 with status, errorCode, detail, instance and a traceId. Evaluate errorCode in your application; detail is a technical English sentence that can change and is not shown to end users. When you contact support, include the traceId. Rejections when writing, such as a protected asset, do not arrive as a problem response but as a result with errorMessage. Tell the two forms apart by the content type: application/problem+json versus application/json. Display the messages in errorMessage at most.

Quota

Every call to one of the seven endpoints counts one request against the subscription’s quota (API & MCP Requests); the REST API and MCP share this quota. The request counts even if it fails afterwards, for example on an unknown field or an expired cursor. Requests that already fail on a missing key (401), missing access (403) or an unknown endpoint (404) are not counted. Additional requests are not reset with the period; the included ones are. When both are used up, the API responds with 429 and does not execute the request; rejected requests count as well. With a limited quota, all responses, including error responses, carry these headers: With an unlimited quota, these headers are absent.
  • The API reference (in the sidebar under API Reference)—all endpoints with parameters, schemas and examples
  • Data model—types, fields, properties
  • Manage API keys—create keys, permissions, expiry
  • AI Connections—quota usage