For the complete documentation index, see llms.txt. This page is also available as Markdown.

Attachment

An attachment is a file that belongs to a thread — uploaded first, then referenced when a message is posted. Uploads and messages are separate steps so that a file can be transferred while a message is still being written.

An attachment that is uploaded while composing carries composing: true and belongs to no message yet; posting a message with its id is what binds the two together.

List the attachments of a thread

get

Returns the attachments of a thread. threadId is required — attachments are never listed across threads.

Filterableid, threadId, messageId, creatorId, name, contentType, size, inline, composing, createdAt.

Sortableid, name, size, createdAt.

Searchable — nothing yet; use filter with contains on name.

Authorizations
AuthorizationstringRequired

Token issued by the central equipme authentication, sent as Bearer <token>.

Query parameters
threadIdintegerRequired

Thread id

Example: 8801
filterstringOptional

JSON filter expression

searchstringOptional

Free-text term — no effect here

sortstringOptional

Comma-separated field:direction terms

fieldsstringOptional

Selection of fields and relations

Example: name,size,contentType
offsetintegerOptional

Number of entries to skip

Default: 0
limitintegerOptional

Page size, 1 to 100

Default: 100
Responses
200

OK

application/json
countintegerOptional
get/v1/attachments
GET /api/v1/attachments?threadId=1 HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "count": 1,
  "data": [
    {
      "composing": true,
      "contentId": "text",
      "contentType": "text",
      "createdAt": "text",
      "creator": {
        "assignmentContext": "text",
        "autoAssign": true,
        "createdAt": "2026-01-01T00:00:00.000Z",
        "description": "text",
        "email": "ada.lovelace@example.com",
        "firstName": "Ada",
        "id": 17,
        "kind": "",
        "lastName": "Lovelace",
        "mobile": "text",
        "phone": "text",
        "tenant": {
          "id": 1,
          "name": "text"
        },
        "tenantId": 1,
        "title": "text",
        "updatedAt": "2026-01-01T00:00:00.000Z"
      },
      "creatorId": 1,
      "id": 1,
      "inline": true,
      "link": "text",
      "messageId": 1,
      "name": "text",
      "size": 1,
      "threadId": 1
    }
  ]
}

Upload attachments

post

Uploads one or more files as multipart/form-data under the field name files.

Either threadId names the thread the files belong to, or composing=true marks them as not yet bound to a thread — in that case tenantId says where they live. Without one of the two the request is answered with 400.

Because several files travel in one request, the answer distinguishes three outcomes:

Status
Meaning

201

every file was stored; data holds them

207

some were stored, some were not; errors names the failures per file

422

none could be stored

An entry in errors carries the filename and what went wrong, so a client can retry exactly those.

Authorizations
AuthorizationstringRequired

Token issued by the central equipme authentication, sent as Bearer <token>.

Body
fileOptional
or
integerOptionalExample: 8801
or
integerOptional
or
booleanOptional
Responses
201

Created

application/json
post/v1/attachments
POST /api/v1/attachments HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/x-www-form-urlencoded
Accept: */*
{
  "data": [
    {
      "composing": true,
      "contentId": "text",
      "contentType": "text",
      "createdAt": "text",
      "creator": {
        "assignmentContext": "text",
        "autoAssign": true,
        "createdAt": "2026-01-01T00:00:00.000Z",
        "description": "text",
        "email": "ada.lovelace@example.com",
        "firstName": "Ada",
        "id": 17,
        "kind": "",
        "lastName": "Lovelace",
        "mobile": "text",
        "phone": "text",
        "tenant": {
          "id": 1,
          "name": "text"
        },
        "tenantId": 1,
        "title": "text",
        "updatedAt": "2026-01-01T00:00:00.000Z"
      },
      "creatorId": 1,
      "id": 1,
      "inline": true,
      "link": "text",
      "messageId": 1,
      "name": "text",
      "size": 1,
      "threadId": 1
    }
  ],
  "errors": [
    {
      "error": "text",
      "filename": "text"
    }
  ]
}

Delete an attachment

delete

Deletes an attachment and its stored file. A file that a message already refers to disappears from that message. Answers with 204 and no body.

Authorizations
AuthorizationstringRequired

Token issued by the central equipme authentication, sent as Bearer <token>.

Path parameters
idintegerRequired

Attachment id

Example: 4501
Responses
204

No Content

No content

delete/v1/attachments/{id}
DELETE /api/v1/attachments/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*

No content

Download an attachment

get

Streams the file. The response is the file itself, not JSON — Content-Type is what the attachment was stored as, and Content-Disposition carries its name.

The same file is also served under /v1/attachments/{id}/download/{filename}, where the trailing segment is cosmetic: it lets a browser save the file under a readable name without a further round trip. Any name works, the file is chosen by its id. Attachment bodies are never cached by intermediaries.

Authorizations
AuthorizationstringRequired

Token issued by the central equipme authentication, sent as Bearer <token>.

Path parameters
idintegerRequired

Attachment id

Example: 4501
filenamestringOptional

Name to save the file under

Responses
200

OK

application/octet-stream
fileOptional
get/v1/attachments/{id}/download
GET /api/v1/attachments/{id}/download HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*

No content

Last updated

Was this helpful?