Messages
Private conversations.
GET /conversations
Conversations
Scope: messages:read, or the broad read. Newest first, by id.
Parameters
| Name | Where | Description |
|---|---|---|
cursor | query | meta.next_cursor from the previous page. Up to 1024 characters. |
limit | query | Page size. Above 100 is treated as 100. At least 1. Default 25. |
folder | query | With folder_id, the default is all. One of inbox, archived, unread, important, all. Default inbox. |
folder_id | query | One of your own inbox folders: the conversations in it. At least 1. |
If-None-Match | header | An ETag from an earlier response. |
Example request
curl "https://www.seoclerk.com/api/v1/conversations" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY"
Response 200
A page of these in data, with meta.limit and meta.next_cursor.
| Field | Type | Description |
|---|---|---|
id | integer | |
subject | string | |
sender_id | integer | |
recipient_id | integer | |
created_at | timestamp or null | |
last_message_at | timestamp or null | |
open | boolean | |
unread | boolean | |
archived | boolean | |
important | boolean |
{
"data": [
{
"id": 1024,
"subject": "A question",
"sender_id": 1024,
"recipient_id": 1024,
"created_at": "2026-10-10T14:03:22Z",
"last_message_at": "2026-10-10T14:03:22Z",
"open": true,
"unread": true,
"archived": true,
"important": true
}
],
"meta": {
"limit": 1,
"next_cursor": "string",
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /conversations
Start a conversation with one member, or the same message with several
Scope: messages:write, or the broad write. Idempotency-Key is required.
The website's own sending rules apply. The recipient is emailed after the message is stored. With recipient_ids the same message starts a thread with each member (MessagesCreated); every recipient is checked first, and if any cannot be messaged nothing is sent and errors.recipient_ids names the first who cannot.
Parameters
| Name | Where | Description |
|---|---|---|
Idempotency-Key required | header | Makes a retry safe. Required on every POST. Must match ^[A-Za-z0-9_.-]{1,64}$. |
Request body
| Field | Type | Description |
|---|---|---|
recipient_id | integer | A member id. Send this or recipient_ids. 1 to 4294967295. |
recipient_ids | list of integer | Up to ten member ids, each once: a thread each. Send this or recipient_id. Up to 10 items. |
subject required | string | Up to 255 characters. |
message required | string | Up to 65535 characters. |
about_id | integer | A listing the thread is about. 1 to 4294967295. |
attachment_id | integer | From POST attachments. 1 to 4294967295. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/conversations" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: createconversation-1" \
-H "Content-Type: application/json" \
-d '{"recipient_id":77,"subject":"Question about your logo service","message":"Can you deliver in two days?"}'
Response 201
| Field | Type | Description |
|---|---|---|
conversation_id | integer | |
message_id | integer | |
conversations | list of object | |
conversations[].recipient_id | integer | |
conversations[].conversation_id | integer | |
conversations[].message_id | integer |
{
"data": {
"conversation_id": 55120,
"message_id": 990134
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
GET /conversations/folders
Inbox folders
Scope: messages:read, or the broad read. Newest first, by id.
Parameters
| Name | Where | Description |
|---|---|---|
cursor | query | meta.next_cursor from the previous page. Up to 1024 characters. |
limit | query | Page size. Above 100 is treated as 100. At least 1. Default 25. |
If-None-Match | header | An ETag from an earlier response. |
Example request
curl "https://www.seoclerk.com/api/v1/conversations/folders" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY"
Response 200
A page of these in data, with meta.limit and meta.next_cursor.
| Field | Type | Description |
|---|---|---|
id | integer | |
name | string | |
color | string or null | One of the inbox's menu colours, or null when none is set. |
created_at | timestamp or null |
{
"data": [
{
"id": 1024,
"name": "Example",
"color": "blue",
"created_at": "2026-10-10T14:03:22Z"
}
],
"meta": {
"limit": 1,
"next_cursor": "string",
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
| Status | Codes |
|---|---|
| 400 | https_required key_in_query |
| 401 | account_unavailable invalid_credentials key_expired key_revoked |
| 403 | missing_scope |
| 404 | not_found |
| 405 | method_not_allowed |
| 422 | bad_cursor invalid_id invalid_parameter |
| 429 | rate_limited |
| 500 | internal_error |
POST /conversations/folders
Make an inbox folder
Scope: messages:write, or the broad write. Idempotency-Key is required.
At most 16 folders, as the website's inbox allows. Tags are removed from the name and it is stored HTML-encoded, as the website stores it; reads give it encoded.
Parameters
| Name | Where | Description |
|---|---|---|
Idempotency-Key required | header | Makes a retry safe. Required on every POST. Must match ^[A-Za-z0-9_.-]{1,64}$. |
Request body
| Field | Type | Description |
|---|---|---|
name required | string | 4 to 50 characters, not one of your folders already (any case). 4 to 50 characters. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/conversations/folders" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: createinboxfolder-1" \
-H "Content-Type: application/json" \
-d '{"name":"Example"}'
Response 201
| Field | Type | Description |
|---|---|---|
id | integer | |
name | string | |
color | string or null | One of the inbox's menu colours, or null when none is set. |
created_at | timestamp or null |
{
"data": {
"id": 1024,
"name": "Example",
"color": "blue",
"created_at": "2026-10-10T14:03:22Z"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
PATCH /conversations/folders/{id}
Colour an inbox folder
Scope: messages:write, or the broad write. Idempotency-Key is optional.
The colours the inbox's colour menu offers. The folder must be one of yours.
Parameters
| Name | Where | Description |
|---|---|---|
id required | path | At least 1. |
Idempotency-Key | header | Makes a retry safe. Must match ^[A-Za-z0-9_.-]{1,64}$. |
Request body
| Field | Type | Description |
|---|---|---|
color required | string | One of the inbox's menu colours. One of blue, light_blue, green, red, yellow, grey. |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/conversations/folders/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"color":"blue"}'
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
name | string | |
color | string or null | One of the inbox's menu colours, or null when none is set. |
created_at | timestamp or null |
{
"data": {
"id": 1024,
"name": "Example",
"color": "blue",
"created_at": "2026-10-10T14:03:22Z"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
DELETE /conversations/folders/{id}
Delete an inbox folder
Scope: messages:write, or the broad write. Idempotency-Key is optional.
As on the website: the folder is hidden; its conversations are not touched.
Parameters
| Name | Where | Description |
|---|---|---|
id required | path | At least 1. |
Idempotency-Key | header | Makes a retry safe. Must match ^[A-Za-z0-9_.-]{1,64}$. |
Example request
curl -X DELETE "https://www.seoclerk.com/api/v1/conversations/folders/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY"
Response 204
No body.
Errors
POST /conversations/folders/{id}/conversations
Put a conversation in an inbox folder
Scope: messages:write, or the broad write. Idempotency-Key is required.
The folder must be yours and the conversation one you are in. One already there is left as it is.
Parameters
| Name | Where | Description |
|---|---|---|
id required | path | At least 1. |
Idempotency-Key required | header | Makes a retry safe. Required on every POST. Must match ^[A-Za-z0-9_.-]{1,64}$. |
Request body
| Field | Type | Description |
|---|---|---|
conversation_id required | integer | A conversation you are in. 1 to 4294967295. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/conversations/folders/1024/conversations" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: addconversationtofolder-1" \
-H "Content-Type: application/json" \
-d '{"conversation_id":1024}'
Response 204
No body.
Errors
DELETE /conversations/folders/{id}/conversations/{conversation_id}
Take a conversation out of an inbox folder
Scope: messages:write, or the broad write. Idempotency-Key is optional.
Parameters
| Name | Where | Description |
|---|---|---|
id required | path | At least 1. |
conversation_id required | path | At least 1. |
Idempotency-Key | header | Makes a retry safe. Must match ^[A-Za-z0-9_.-]{1,64}$. |
Example request
curl -X DELETE "https://www.seoclerk.com/api/v1/conversations/folders/1024/conversations/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY"
Response 204
No body.
Errors
GET /conversations/{id}
A conversation
Scope: messages:read, or the broad read. A participant; anyone else gets 404.
Parameters
| Name | Where | Description |
|---|---|---|
id required | path | At least 1. |
If-None-Match | header | An ETag from an earlier response. |
Example request
curl "https://www.seoclerk.com/api/v1/conversations/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY"
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
subject | string | |
sender_id | integer | |
recipient_id | integer | |
created_at | timestamp or null | |
last_message_at | timestamp or null | |
open | boolean | |
unread | boolean | |
archived | boolean | |
important | boolean |
{
"data": {
"id": 1024,
"subject": "A question",
"sender_id": 1024,
"recipient_id": 1024,
"created_at": "2026-10-10T14:03:22Z",
"last_message_at": "2026-10-10T14:03:22Z",
"open": true,
"unread": true,
"archived": true,
"important": true
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
| Status | Codes |
|---|---|
| 400 | https_required key_in_query |
| 401 | account_unavailable invalid_credentials key_expired key_revoked |
| 403 | missing_scope |
| 404 | not_found |
| 405 | method_not_allowed |
| 422 | invalid_id invalid_parameter |
| 429 | rate_limited |
| 500 | internal_error |
PATCH /conversations/{id}
Set your unread, archived or important flag
Scope: messages:write, or the broad write. A participant; anyone else gets 404. Idempotency-Key is optional.
Only the caller's own flags.
Parameters
| Name | Where | Description |
|---|---|---|
id required | path | At least 1. |
Idempotency-Key | header | Makes a retry safe. Must match ^[A-Za-z0-9_.-]{1,64}$. |
Request body
| Field | Type | Description |
|---|---|---|
unread | boolean | |
archived | boolean | |
important | boolean |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/conversations/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"archived":true}'
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
unread | boolean | |
archived | boolean | |
important | boolean |
{
"data": {
"id": 55120,
"unread": false,
"archived": true,
"important": false
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
GET /conversations/{id}/messages
A conversation's messages
Scope: messages:read, or the broad read. A participant; anyone else gets 404. Newest first, by id.
Reading marks nothing read.
Parameters
| Name | Where | Description |
|---|---|---|
id required | path | At least 1. |
cursor | query | meta.next_cursor from the previous page. Up to 1024 characters. |
limit | query | Page size. Above 100 is treated as 100. At least 1. Default 25. |
If-None-Match | header | An ETag from an earlier response. |
Example request
curl "https://www.seoclerk.com/api/v1/conversations/1024/messages" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY"
Response 200
A page of these in data, with meta.limit and meta.next_cursor.
| Field | Type | Description |
|---|---|---|
id | integer | |
sender_id | integer | |
recipient_id | integer | |
text | string | Stored content, not trusted HTML. |
created_at | timestamp or null | |
attachment_id | integer or null | Download with GET attachments/{id}. |
action | string | Order messages only: what the message did (a delivery, a cancellation request and so on). |
{
"data": [
{
"id": 1024,
"sender_id": 1024,
"recipient_id": 1024,
"text": "Hello.",
"created_at": "2026-10-10T14:03:22Z",
"attachment_id": 1024,
"action": "string"
}
],
"meta": {
"limit": 1,
"next_cursor": "string",
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
| Status | Codes |
|---|---|
| 400 | https_required key_in_query |
| 401 | account_unavailable invalid_credentials key_expired key_revoked |
| 403 | missing_scope |
| 404 | not_found |
| 405 | method_not_allowed |
| 422 | bad_cursor invalid_id invalid_parameter |
| 429 | rate_limited |
| 500 | internal_error |
POST /conversations/{id}/messages
Reply to a conversation
Scope: messages:write, or the broad write. A participant; anyone else gets 404. Idempotency-Key is required.
Parameters
| Name | Where | Description |
|---|---|---|
id required | path | At least 1. |
Idempotency-Key required | header | Makes a retry safe. Required on every POST. Must match ^[A-Za-z0-9_.-]{1,64}$. |
Request body
| Field | Type | Description |
|---|---|---|
message required | string | Up to 65535 characters. |
attachment_id | integer | From POST attachments. 1 to 4294967295. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/conversations/1024/messages" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: createconversationmessage-1" \
-H "Content-Type: application/json" \
-d '{"message":"Hello."}'
Response 201
| Field | Type | Description |
|---|---|---|
conversation_id | integer | |
message_id | integer |
{
"data": {
"conversation_id": 1024,
"message_id": 1024
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
PATCH /conversations/{id}/messages/{message_id}
Edit your own message
Scope: messages:write, or the broad write. The message's sender. Idempotency-Key is optional.
Changes the text only; an attachment stays as it is.
Parameters
| Name | Where | Description |
|---|---|---|
id required | path | At least 1. |
message_id required | path | At least 1. |
Idempotency-Key | header | Makes a retry safe. Must match ^[A-Za-z0-9_.-]{1,64}$. |
Request body
| Field | Type | Description |
|---|---|---|
message required | string | Up to 65535 characters. |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/conversations/1024/messages/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"message":"Hello."}'
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
sender_id | integer | |
recipient_id | integer | |
text | string | Stored content, not trusted HTML. |
created_at | timestamp or null | |
attachment_id | integer or null | Download with GET attachments/{id}. |
action | string | Order messages only: what the message did (a delivery, a cancellation request and so on). |
{
"data": {
"id": 1024,
"sender_id": 1024,
"recipient_id": 1024,
"text": "Hello.",
"created_at": "2026-10-10T14:03:22Z",
"attachment_id": 1024,
"action": "string"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}