English
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.
| Field | Type | Required |
|---|---|---|
linked | boolean | yes |
threads | object[] | yes |
unreadCount | integer | yes |
syncedAt | string | null | yes |
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
| Name | In | Type | Required |
|---|---|---|---|
id | path | string | yes |
Responses
200 — The thread and its messages.
| Field | Type | Required |
|---|---|---|
id | string | yes |
kind | "request" | "conversation" | yes |
subject | string | yes |
status | "received" | "in_study" | "quoted" | "in_progress" | "delivered" | "rejected" | "open" | "closed" | yes |
assigneeName | string | null | yes |
authorName | string | yes |
authorMemberId | string | null | yes |
createdAt | string | yes |
updatedAt | string | yes |
lastMessageAt | string | yes |
messageCount | integer | yes |
unread | boolean | yes |
pending | boolean | yes |
messages | object[] | 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
| Name | In | Type | Required |
|---|---|---|---|
id | path | string | yes |
Responses
200 — The thread, read.
| Field | Type | Required |
|---|---|---|
id | string | yes |
kind | "request" | "conversation" | yes |
subject | string | yes |
status | "received" | "in_study" | "quoted" | "in_progress" | "delivered" | "rejected" | "open" | "closed" | yes |
assigneeName | string | null | yes |
authorName | string | yes |
authorMemberId | string | null | yes |
createdAt | string | yes |
updatedAt | string | yes |
lastMessageAt | string | yes |
messageCount | integer | yes |
unread | boolean | yes |
pending | boolean | yes |
messages | object[] | 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)
| Field | Type | Required |
|---|---|---|
title | string | yes |
need | string | yes |
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.
| Field | Type | Required |
|---|---|---|
id | string | yes |
kind | "request" | "conversation" | yes |
subject | string | yes |
status | "received" | "in_study" | "quoted" | "in_progress" | "delivered" | "rejected" | "open" | "closed" | yes |
assigneeName | string | null | yes |
authorName | string | yes |
authorMemberId | string | null | yes |
createdAt | string | yes |
updatedAt | string | yes |
lastMessageAt | string | yes |
messageCount | integer | yes |
unread | boolean | yes |
pending | boolean | yes |
messages | object[] | 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)
| Field | Type | Required |
|---|---|---|
subject | string | yes |
body | string | yes |
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.
| Field | Type | Required |
|---|---|---|
id | string | yes |
kind | "request" | "conversation" | yes |
subject | string | yes |
status | "received" | "in_study" | "quoted" | "in_progress" | "delivered" | "rejected" | "open" | "closed" | yes |
assigneeName | string | null | yes |
authorName | string | yes |
authorMemberId | string | null | yes |
createdAt | string | yes |
updatedAt | string | yes |
lastMessageAt | string | yes |
messageCount | integer | yes |
unread | boolean | yes |
pending | boolean | yes |
messages | object[] | 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
| Name | In | Type | Required |
|---|---|---|---|
id | path | string | yes |
Request body (application/json)
| Field | Type | Required |
|---|---|---|
body | string | yes |
JSON Schema
json
{
"type": "object",
"properties": { "body": { "type": "string", "minLength": 1, "maxLength": 5000 } },
"required": [ "body" ]
}Responses
201 — The thread, with the message.
| Field | Type | Required |
|---|---|---|
id | string | yes |
kind | "request" | "conversation" | yes |
subject | string | yes |
status | "received" | "in_study" | "quoted" | "in_progress" | "delivered" | "rejected" | "open" | "closed" | yes |
assigneeName | string | null | yes |
authorName | string | yes |
authorMemberId | string | null | yes |
createdAt | string | yes |
updatedAt | string | yes |
lastMessageAt | string | yes |
messageCount | integer | yes |
unread | boolean | yes |
pending | boolean | yes |
messages | object[] | 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.