Skip to content
Norbelys
Esc
↑↓navigate↵open⌘Jpreview

Change a thread's status (open, snooze or archive it) or mark it read.

PATCH/v1/threads/{id}
Authorization
AuthorizationBearer token · headerrequired

An API key (nb_live_…, nb_test_…), a workspace token (nbs_…) or a CLI token (nbc_…).

Path parameters
idId_Threadrequired

The thread id (thr_…).

matches ^thr_[0-9a-f]{32}$
Header parameters
If-Matchstring

The version the change applies to, quoted as the ETag that carried it ("1790000000000000"), or *. A version that is no longer current answers 412 precondition_failed and changes nothing; without the header the change applies to whatever version is current.

Idempotency-Keystring

A stable key for this logical request; reuse it when retrying.

min length 1 · max length 128 · matches ^[!-~]+$
Request body
requiredapplication/json
snoozed_untilTimestamp | null
Show properties
One of:
Timestamp
string<date-time>
null
null
statusThreadStatus | null
Show properties
One of:
ThreadStatus
string
null
null
unreadboolean | null

false marks it read.

Responses
200

The thread.

campaign_idId_Campaign | null
Show properties
One of:
Id_Campaign
string
null
null
connection_idId_Connectionrequired
matches ^con_[0-9a-f]{32}$
created_atTimestamprequired
idId_Threadrequired
matches ^thr_[0-9a-f]{32}$
last_activity_atTimestamprequired
last_messageThreadMessage | null
Show properties
One of:
ThreadMessage
atTimestamprequired

When it was sent (or created, while it waits) or received.

classificationInboundClassification | null
Show properties
One of:
InboundClassification
string
null
null
directionDirectionrequired

Which way a thread's message went.

Allowed:outboundinbound
fromstring | null
idstringrequired

A message id (msg_…) for outbound mail, an inbound message id (inb_…) for inbound.

statestring | null

An outbound message's state.

subjectstring | null
textstring | null

The start of its text, when it has one of its own.

tostring[]required

The addresses an outbound message went to; empty for inbound mail.

null
null
messagesThreadMessages | null
Show properties
One of:
ThreadMessages
dataThreadMessage[]required

Oldest first.

max items 50
Show properties
Array of ThreadMessage
atTimestamprequired

When it was sent (or created, while it waits) or received.

classificationInboundClassification | null
Show properties
One of:
InboundClassification
InboundClassification
null
null
directionDirectionrequired

Which way a thread's message went.

Allowed:outboundinbound
fromstring | null
idstringrequired

A message id (msg_…) for outbound mail, an inbound message id (inb_…) for inbound.

statestring | null

An outbound message's state.

subjectstring | null
textstring | null

The start of its text, when it has one of its own.

tostring[]required

The addresses an outbound message went to; empty for inbound mail.

has_morebooleanrequired

Older messages exist.

null
null
participantsstring[]required

The addresses taking part.

person_idId_Person | null
Show properties
One of:
Id_Person
string
null
null
sender_identity_idId_SenderIdentityrequired
matches ^sid_[0-9a-f]{32}$
snoozed_untilTimestamp | null
Show properties
One of:
Timestamp
string<date-time>
null
null
statusThreadStatusrequired

A thread's status as shown: snoozed turns open once its time passes.

Allowed:opensnoozedarchived
subjectstring | null
unreadbooleanrequired

Something arrived that nobody marked read.

updated_atTimestamprequired
versioninteger<int64>required
400

The body is not JSON, or If-Match is malformed (invalid_request).

codestringrequired

The code from the closed registry; programs branch on it, never on the text. New codes may be added.

detailstringrequired

What went wrong, for a person; never an internal cause.

errorsFieldError[]

With validation_failed only: every invalid field.

Show properties
Array of FieldError
codestringrequired

What is wrong (required, range, length, format, invalid, …).

detailstringrequired

A safe, human-readable explanation.

pointerstringrequired

RFC 6901 pointer into the body, or ?name for a query parameter.

instancestringrequired

The request's path.

request_idstringrequired

The request's id, also in X-Request-Id: what support needs to find the request.

retry_afterinteger<int64> | null

With 429 and 503: the seconds to wait, as in Retry-After.

min 0
statusinteger<int32>required

The HTTP status.

min 0
titlestringrequired

Fixed per code.

typestringrequired

https://docs.norbelys.com/errors/<code>, a page that explains the code.

401

No valid credential.

codestringrequired

The code from the closed registry; programs branch on it, never on the text. New codes may be added.

detailstringrequired

What went wrong, for a person; never an internal cause.

errorsFieldError[]

With validation_failed only: every invalid field.

Show properties
Array of FieldError
codestringrequired

What is wrong (required, range, length, format, invalid, …).

detailstringrequired

A safe, human-readable explanation.

pointerstringrequired

RFC 6901 pointer into the body, or ?name for a query parameter.

instancestringrequired

The request's path.

request_idstringrequired

The request's id, also in X-Request-Id: what support needs to find the request.

retry_afterinteger<int64> | null

With 429 and 503: the seconds to wait, as in Retry-After.

min 0
statusinteger<int32>required

The HTTP status.

min 0
titlestringrequired

Fixed per code.

typestringrequired

https://docs.norbelys.com/errors/<code>, a page that explains the code.

403

The credential lacks inbox:write.

codestringrequired

The code from the closed registry; programs branch on it, never on the text. New codes may be added.

detailstringrequired

What went wrong, for a person; never an internal cause.

errorsFieldError[]

With validation_failed only: every invalid field.

Show properties
Array of FieldError
codestringrequired

What is wrong (required, range, length, format, invalid, …).

detailstringrequired

A safe, human-readable explanation.

pointerstringrequired

RFC 6901 pointer into the body, or ?name for a query parameter.

instancestringrequired

The request's path.

request_idstringrequired

The request's id, also in X-Request-Id: what support needs to find the request.

retry_afterinteger<int64> | null

With 429 and 503: the seconds to wait, as in Retry-After.

min 0
statusinteger<int32>required

The HTTP status.

min 0
titlestringrequired

Fixed per code.

typestringrequired

https://docs.norbelys.com/errors/<code>, a page that explains the code.

404

No such thread in this workspace.

codestringrequired

The code from the closed registry; programs branch on it, never on the text. New codes may be added.

detailstringrequired

What went wrong, for a person; never an internal cause.

errorsFieldError[]

With validation_failed only: every invalid field.

Show properties
Array of FieldError
codestringrequired

What is wrong (required, range, length, format, invalid, …).

detailstringrequired

A safe, human-readable explanation.

pointerstringrequired

RFC 6901 pointer into the body, or ?name for a query parameter.

instancestringrequired

The request's path.

request_idstringrequired

The request's id, also in X-Request-Id: what support needs to find the request.

retry_afterinteger<int64> | null

With 429 and 503: the seconds to wait, as in Retry-After.

min 0
statusinteger<int32>required

The HTTP status.

min 0
titlestringrequired

Fixed per code.

typestringrequired

https://docs.norbelys.com/errors/<code>, a page that explains the code.

412

If-Match names a version that is no longer current (precondition_failed); nothing changed.

codestringrequired

The code from the closed registry; programs branch on it, never on the text. New codes may be added.

detailstringrequired

What went wrong, for a person; never an internal cause.

errorsFieldError[]

With validation_failed only: every invalid field.

Show properties
Array of FieldError
codestringrequired

What is wrong (required, range, length, format, invalid, …).

detailstringrequired

A safe, human-readable explanation.

pointerstringrequired

RFC 6901 pointer into the body, or ?name for a query parameter.

instancestringrequired

The request's path.

request_idstringrequired

The request's id, also in X-Request-Id: what support needs to find the request.

retry_afterinteger<int64> | null

With 429 and 503: the seconds to wait, as in Retry-After.

min 0
statusinteger<int32>required

The HTTP status.

min 0
titlestringrequired

Fixed per code.

typestringrequired

https://docs.norbelys.com/errors/<code>, a page that explains the code.

422

The body is invalid: snoozed without a future snoozed_until, or snoozed_until without snoozed.

codestringrequired

The code from the closed registry; programs branch on it, never on the text. New codes may be added.

detailstringrequired

What went wrong, for a person; never an internal cause.

errorsFieldError[]

With validation_failed only: every invalid field.

Show properties
Array of FieldError
codestringrequired

What is wrong (required, range, length, format, invalid, …).

detailstringrequired

A safe, human-readable explanation.

pointerstringrequired

RFC 6901 pointer into the body, or ?name for a query parameter.

instancestringrequired

The request's path.

request_idstringrequired

The request's id, also in X-Request-Id: what support needs to find the request.

retry_afterinteger<int64> | null

With 429 and 503: the seconds to wait, as in Retry-After.

min 0
statusinteger<int32>required

The HTTP status.

min 0
titlestringrequired

Fixed per code.

typestringrequired

https://docs.norbelys.com/errors/<code>, a page that explains the code.

Try it
Server
Authorization
Parameters
Bodyapplication/json
Request
curl -X PATCH 'https://api.norbelys.com/v1/threads/thr_0190f8a2b4c87a10b6d2e4f6a8c0e2f4' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
  "snoozed_until": "2026-10-09T08:00:00Z",
  "status": "snoozed"
}'
Response
{
  "campaign_id": "cmp_0190f8a2b4c87a10b6d2e4f6a8c0e2f4",
  "connection_id": "con_0190f8a2b4c87a10b6d2e4f6a8c0e2f4",
  "created_at": "2019-08-24T14:15:22Z",
  "id": "thr_0190f8a2b4c87a10b6d2e4f6a8c0e2f4",
  "last_activity_at": "2019-08-24T14:15:22Z",
  "last_message": {
    "at": "2019-08-24T14:15:22Z",
    "classification": "human_reply",
    "direction": "outbound",
    "from": "string",
    "id": "string",
    "state": "string",
    "subject": "string",
    "text": "string",
    "to": [
      "string"
    ]
  },
  "messages": {
    "data": [
      {
        "at": "2019-08-24T14:15:22Z",
        "classification": "human_reply",
        "direction": "outbound",
        "from": "string",
        "id": "string",
        "state": "string",
        "subject": "string",
        "text": "string",
        "to": [
          "string"
        ]
      }
    ],
    "has_more": true
  },
  "participants": [
    "string"
  ],
  "person_id": "per_0190f8a2b4c87a10b6d2e4f6a8c0e2f4",
  "sender_identity_id": "sid_0190f8a2b4c87a10b6d2e4f6a8c0e2f4",
  "snoozed_until": "2019-08-24T14:15:22Z",
  "status": "open",
  "subject": "string",
  "unread": true,
  "updated_at": "2019-08-24T14:15:22Z",
  "version": 0
}