Skip to content

Requests to the team ​

Routes are relative to <PUBLIC_BASE_URL>; request and response bodies are JSON unless stated otherwise. Authentication, scopes, pagination and the error format are described in the REST API guides.

GET /api/v1/support ​

My requests and conversations

Workflow requests and conversations with the team, most recently active first (the whole organisation for an administrator). A session only: writing to the team is a person’s act.

Access — Member session only: API keys are refused (api_key.session_required).

Responses

200 — The threads.

FieldTypeRequired
linkedbooleanyes
threadsobject[]yes
unreadCountintegeryes
syncedAtstring | nullyes
JSON Schema
json
{
  "type": "object",
  "properties": {
    "linked": { "type": "boolean" },
    "threads": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": { "type": "string" },
          "kind": { "type": "string", "enum": [ "request", "conversation" ] },
          "subject": { "type": "string" },
          "status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "received",
                  "in_study",
                  "quoted",
                  "in_progress",
                  "delivered",
                  "rejected"
                ]
              },
              { "type": "string", "enum": [ "open", "closed" ] }
            ]
          },
          "assigneeName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
          "authorName": { "type": "string" },
          "authorMemberId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
          "createdAt": { "type": "string" },
          "updatedAt": { "type": "string" },
          "lastMessageAt": { "type": "string" },
          "messageCount": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
          "unread": { "type": "boolean" },
          "pending": { "type": "boolean" }
        },
        "required": [
          "id",
          "kind",
          "subject",
          "status",
          "assigneeName",
          "authorName",
          "authorMemberId",
          "createdAt",
          "updatedAt",
          "lastMessageAt",
          "messageCount",
          "unread",
          "pending"
        ],
        "additionalProperties": false
      }
    },
    "unreadCount": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
    "syncedAt": { "anyOf": [ { "type": "string" }, { "type": "null" } ] }
  },
  "required": [ "linked", "threads", "unreadCount", "syncedAt" ],
  "additionalProperties": false
}

401 — No valid session or API key (auth.unauthenticated).

403 — Refused: insufficient role (auth.forbidden), missing scope (api_key.scope_missing, details.required names it) or a route closed to API keys (api_key.session_required).

429 — The API key exceeded its rate limit (api_key.rate_limited); Retry-After says when to retry.

GET /api/v1/support/threads/{id} ​

Read a thread

Access — Member session only: API keys are refused (api_key.session_required).

Parameters

NameInTypeRequired
idpathstringyes

Responses

200 — The thread and its messages.

FieldTypeRequired
idstringyes
kind"request" | "conversation"yes
subjectstringyes
status"received" | "in_study" | "quoted" | "in_progress" | "delivered" | "rejected" | "open" | "closed"yes
assigneeNamestring | nullyes
authorNamestringyes
authorMemberIdstring | nullyes
createdAtstringyes
updatedAtstringyes
lastMessageAtstringyes
messageCountintegeryes
unreadbooleanyes
pendingbooleanyes
messagesobject[]yes
JSON Schema
json
{
  "type": "object",
  "properties": {
    "id": { "type": "string" },
    "kind": { "type": "string", "enum": [ "request", "conversation" ] },
    "subject": { "type": "string" },
    "status": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "received",
            "in_study",
            "quoted",
            "in_progress",
            "delivered",
            "rejected"
          ]
        },
        { "type": "string", "enum": [ "open", "closed" ] }
      ]
    },
    "assigneeName": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
    "authorName": { "type": "string" },
    "authorMemberId": { "anyOf": [ { "type": "string" }, { "type": "null" } ] },
    "createdAt": { "type": "string" },
    "updatedAt": { "type": "string" },
    "lastMessageAt": { "type": "string" },
    "messageCount": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
    "unread": { "type": "boolean" },
    "pending": { "type": "boolean" },
    "messages": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": { "type": "string" },
          "direction": { "type": "string", "enum": [ "member", "team" ] },
          "authorName": { "type": "string" },
          "body": { "type": "string" },
          "createdAt": { "type": "string" },
          "pending": { "type": "boolean" }
        },
        "required": [ "id", "direction", "authorName", "body", "createdAt", "pending" ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "id",
    "kind",
    "subject",
    "status",
    "assigneeName",
    "authorName",
    "authorMemberId",
    "createdAt",
    "updatedAt",
    "lastMessageAt",
    "messageCount",
    "unread",
    "pending",
    "messages"
  ],
  "additionalProperties": false
}

401 — No valid session or API key (auth.unauthenticated).

403 — Refused: insufficient role (auth.forbidden), missing scope (api_key.scope_missing, details.required names it) or a route closed to API keys (api_key.session_required).

429 — The API key exceeded its rate limit (api_key.rate_limited); Retry-After says when to retry.

Error codes — support.not_found. The common codes (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) apply to every route; see Errors.

POST /api/v1/support/threads/{id}/read ​

Mark a thread as read

Access — Member session only: API keys are refused (api_key.session_required).

Parameters

NameInTypeRequired
idpathstringyes

Responses

200 — The thread, read.

FieldTypeRequired
idstringyes
kind"request" | "conversation"yes
subjectstringyes
status"received" | "in_study" | "quoted" | "in_progress" | "delivered" | "rejected" | "open" | "closed"yes
assigneeNamestring | nullyes
authorNamestringyes
authorMemberIdstring | nullyes
createdAtstringyes
updatedAtstringyes
lastMessageAtstringyes
messageCountintegeryes
unreadbooleanyes
pendingbooleanyes
messagesobject[]yes

Same schema as GET /api/v1/support/threads/{id}.

401 — No valid session or API key (auth.unauthenticated).

403 — Refused: insufficient role (auth.forbidden), missing scope (api_key.scope_missing, details.required names it) or a route closed to API keys (api_key.session_required).

429 — The API key exceeded its rate limit (api_key.rate_limited); Retry-After says when to retry.

Error codes — support.not_found. The common codes (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) apply to every route; see Errors.

POST /api/v1/support/requests ​

Request a new workflow

Recorded at once, then sent to the team (the status comes back from it). 409 support.not_linked on an instance without a control plane.

Access — Member session only: API keys are refused (api_key.session_required).

Request body (application/json)

FieldTypeRequired
titlestringyes
needstringyes
JSON Schema
json
{
  "type": "object",
  "properties": {
    "title": { "type": "string", "minLength": 1, "maxLength": 160 },
    "need": { "type": "string", "minLength": 1, "maxLength": 5000 }
  },
  "required": [ "title", "need" ]
}

Responses

201 — The request.

FieldTypeRequired
idstringyes
kind"request" | "conversation"yes
subjectstringyes
status"received" | "in_study" | "quoted" | "in_progress" | "delivered" | "rejected" | "open" | "closed"yes
assigneeNamestring | nullyes
authorNamestringyes
authorMemberIdstring | nullyes
createdAtstringyes
updatedAtstringyes
lastMessageAtstringyes
messageCountintegeryes
unreadbooleanyes
pendingbooleanyes
messagesobject[]yes

Same schema as GET /api/v1/support/threads/{id}.

400 — The request does not match its schema.

401 — No valid session or API key (auth.unauthenticated).

403 — Refused: insufficient role (auth.forbidden), missing scope (api_key.scope_missing, details.required names it) or a route closed to API keys (api_key.session_required).

429 — The API key exceeded its rate limit (api_key.rate_limited); Retry-After says when to retry.

Error codes — support.bad_request, support.not_linked. The common codes (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) apply to every route; see Errors.

POST /api/v1/support/threads ​

Contact the team

Access — Member session only: API keys are refused (api_key.session_required).

Request body (application/json)

FieldTypeRequired
subjectstringyes
bodystringyes
JSON Schema
json
{
  "type": "object",
  "properties": {
    "subject": { "type": "string", "minLength": 1, "maxLength": 160 },
    "body": { "type": "string", "minLength": 1, "maxLength": 5000 }
  },
  "required": [ "subject", "body" ]
}

Responses

201 — The conversation.

FieldTypeRequired
idstringyes
kind"request" | "conversation"yes
subjectstringyes
status"received" | "in_study" | "quoted" | "in_progress" | "delivered" | "rejected" | "open" | "closed"yes
assigneeNamestring | nullyes
authorNamestringyes
authorMemberIdstring | nullyes
createdAtstringyes
updatedAtstringyes
lastMessageAtstringyes
messageCountintegeryes
unreadbooleanyes
pendingbooleanyes
messagesobject[]yes

Same schema as GET /api/v1/support/threads/{id}.

400 — The request does not match its schema.

401 — No valid session or API key (auth.unauthenticated).

403 — Refused: insufficient role (auth.forbidden), missing scope (api_key.scope_missing, details.required names it) or a route closed to API keys (api_key.session_required).

429 — The API key exceeded its rate limit (api_key.rate_limited); Retry-After says when to retry.

Error codes — support.bad_request, support.not_linked. The common codes (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) apply to every route; see Errors.

POST /api/v1/support/threads/{id}/messages ​

Reply in a thread

Access — Member session only: API keys are refused (api_key.session_required).

Parameters

NameInTypeRequired
idpathstringyes

Request body (application/json)

FieldTypeRequired
bodystringyes
JSON Schema
json
{
  "type": "object",
  "properties": { "body": { "type": "string", "minLength": 1, "maxLength": 5000 } },
  "required": [ "body" ]
}

Responses

201 — The thread, with the message.

FieldTypeRequired
idstringyes
kind"request" | "conversation"yes
subjectstringyes
status"received" | "in_study" | "quoted" | "in_progress" | "delivered" | "rejected" | "open" | "closed"yes
assigneeNamestring | nullyes
authorNamestringyes
authorMemberIdstring | nullyes
createdAtstringyes
updatedAtstringyes
lastMessageAtstringyes
messageCountintegeryes
unreadbooleanyes
pendingbooleanyes
messagesobject[]yes

Same schema as GET /api/v1/support/threads/{id}.

400 — The request does not match its schema.

401 — No valid session or API key (auth.unauthenticated).

403 — Refused: insufficient role (auth.forbidden), missing scope (api_key.scope_missing, details.required names it) or a route closed to API keys (api_key.session_required).

429 — The API key exceeded its rate limit (api_key.rate_limited); Retry-After says when to retry.

Error codes — support.bad_request, support.not_found, support.not_linked. The common codes (request.bad_request, auth.unauthenticated, api_key.scope_missing, api_key.rate_limited…) apply to every route; see Errors.

Loop & Roll — the workflow builder for email.