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

Resource link

A resource link is a thread's reference to something that lives outside Solvio — an asset in an inventory system, an invoice, a directory entry. It is a pointer, not a copy: Solvio stores what to show and where to go, and never fetches the thing itself.

Links are flat and per-thread. The same external thing referenced from two threads is two independent rows, the way an attachment behaves; there is no shared registry row and no uniqueness constraint, so a thread may reference the same thing more than once.

A link carries a displayName and usually a deepLink — an http/https URL opened in a new tab, which requires the viewer's own login in the foreign system. It may additionally carry the identifying triple source + resourceType + externalId, which names the thing in its own system and makes the reverse lookup ("which threads reference this?") possible. The triple is set as a whole or not at all: a caller that cannot supply all three reliably supplies none, because a half-filled identity is findable by nobody.

A link is visible to everyone who can read its thread, not scoped to the external resource's own permissions. Keep displayName to low-entropy context; it does not belong to sensitive figures or state.

Reading them is part of reading the thread — select resourceLinks on a thread or a ticket's thread, there is no separate list endpoint.

Link resources to a thread

post

Adds links to the thread in the path. Each entry needs a displayName and then either a deepLink or the complete source + resourceType + externalId triple — an entry with neither points at nothing and is answered with 400, as is a partial triple.

deepLink must be an absolute http or https URL. Other schemes are rejected: the value is rendered as a plain link, so anything else would run in the viewer's browser.

Duplicates are allowed — the same thing may be linked to a thread more than once. Requires WriteAction on the thread, the same right that attaching a file needs.

Authorizations
AuthorizationstringRequired

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

Path parameters
threadIdintegerRequired

Thread id

Example: 8801
Body
objectOptional
or
Responses
201

Created

application/json
post/v1/threads/{threadId}/resource-links
POST /api/v1/threads/{threadId}/resource-links HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 2

{}
{
  "data": [
    {
      "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,
      "deepLink": "text",
      "displayName": "text",
      "externalId": "text",
      "id": 1,
      "provider": {
        "id": 1,
        "key": "text"
      },
      "providerId": 1,
      "resourceType": "text",
      "source": "text",
      "threadId": 1
    }
  ]
}
delete

Removes the given links from the thread in the path. Answers with 204 and no body.

All ids must belong to this thread; if any does not, nothing is removed and the answer is 404. Requires WriteAction on the thread.

Authorizations
AuthorizationstringRequired

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

Path parameters
threadIdintegerRequired

Thread id

Example: 8801
Body
objectOptional
or
Responses
204

No Content

No content

delete/v1/threads/{threadId}/resource-links
DELETE /api/v1/threads/{threadId}/resource-links HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 2

{}

No content

patch

Changes a link's descriptive fields. Only displayName and deepLink can be patched; source, resourceType and externalId are immutable, so a value an external caller already looked up by cannot silently go stale — fix a wrong one by unlinking and relinking.

The invariants are re-checked against the result, not the request: clearing the deepLink of a link that carries no identifying triple is answered with 400, as is an empty displayName. A link that belongs to another thread is answered with 404. Requires WriteAction on the thread.

Authorizations
AuthorizationstringRequired

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

Path parameters
threadIdintegerRequired

Thread id

Example: 8801
linkIdintegerRequired

Resource link id

Example: 4410
Body
objectOptional
or
Responses
200

OK

application/json
patch/v1/threads/{threadId}/resource-links/{linkId}
PATCH /api/v1/threads/{threadId}/resource-links/{linkId} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 2

{}
{
  "data": {
    "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,
    "deepLink": "text",
    "displayName": "text",
    "externalId": "text",
    "id": 1,
    "provider": {
      "id": 1,
      "key": "text"
    },
    "providerId": 1,
    "resourceType": "text",
    "source": "text",
    "threadId": 1
  }
}

Last updated

Was this helpful?