Orders
Buying, and everything the order page does.
GET /orders
Orders bought or sold
Scope: orders: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. |
role | query | seller lists sales. One of buyer, seller. Default buyer. |
status | query | A numeric order status. Must match ^[0-9]{1,2}$. |
active | query | 1: only orders whose status is not final (GET order-statuses). One of 0, 1. |
If-None-Match | header | An ETag from an earlier response. |
Example request
curl "https://www.seoclerk.com/api/v1/orders" \
-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 | |
service_id | integer | |
buyer_id | integer | |
seller_id | integer | |
title | string | |
status | integer | The order's state; GET order-statuses names each value. |
unit_price | money | |
quantity | integer | |
delivery_days | integer | |
created_at | timestamp or null | |
started_at | timestamp or null | |
completed_at | timestamp or null | |
site | string | |
unread | boolean | The caller's own flag. |
important | boolean | The caller's own flag. |
note | string or null | The seller's private note. Always null for the buyer. |
{
"data": [
{
"id": 481220,
"service_id": 9012,
"buyer_id": 1501,
"seller_id": 77,
"title": "Logo design",
"status": 1,
"unit_price": {
"amount": "25.00",
"currency": "USD"
},
"quantity": 1,
"delivery_days": 3,
"created_at": "2026-10-09T18:22:05Z",
"started_at": "2026-10-09T18:22:05Z",
"completed_at": null,
"site": "SEOClerks",
"unread": true,
"important": false,
"note": null
}
],
"meta": {
"limit": 25,
"next_cursor": null,
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /orders
Buy a listing with the balance
Scope: checkout:write. The broad write grant does not include it. Idempotency-Key is required.
One ordinary listing by another member, paid from the balance; there is no card path. The debit, the order and its payment commit together. When the balance is short and the key also holds deposits:write (and the site allows it), the member's own Auto Reload runs once and the purchase is tried again.
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 |
|---|---|---|
listing_id required | integer | 1 to 2147483647. |
quantity | integer | Default 1. Above 1 only where the listing allows multiples. 1 to 999. |
tier | integer | A tier id from the service detail. 1 to 999. |
tier_quick_delivery | boolean | Needs tier. |
extras | list of string | Extra ids, as services/{id}/extras lists them. Up to 20 items. |
coupon | string | Up to 64 characters. |
expected_total required | string | What the caller expects to pay. A different total is refused with price_changed, never charged. Must match ^[0-9]{1,7}(\.[0-9]{1,2})?$. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/orders" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: createorder-1" \
-H "Content-Type: application/json" \
-d '{"listing_id":9012,"tier":2,"extras":["1"],"expected_total":"45.00"}'
Response 201
| Field | Type | Description |
|---|---|---|
id | integer | |
service_id | integer | |
buyer_id | integer | |
seller_id | integer | |
title | string | |
status | integer | |
unit_price | money | |
quantity | integer | |
total | money | |
paid_from | string | |
request_id | integer | When a bid was bought. |
response_id | integer | When a bid was bought. |
{
"data": {
"id": 481221,
"service_id": 9012,
"buyer_id": 1501,
"seller_id": 77,
"title": "Logo design",
"status": 0,
"unit_price": {
"amount": "45.00",
"currency": "USD"
},
"quantity": 1,
"total": {
"amount": "45.00",
"currency": "USD"
},
"paid_from": "balance"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /orders/quote
Price an order without placing it
Scope: checkout:write. The broad write grant does not include it.
The same body as POST orders, priced without writing anything. shortfall is what the balance lacks; deposit_amount is the whole-dollar link that would cover it; duplicate_of names a recent purchase of the same listing at the same total. It takes no Idempotency-Key and places no order.
Request body
| Field | Type | Description |
|---|---|---|
listing_id required | integer | 1 to 2147483647. |
quantity | integer | Default 1. Above 1 only where the listing allows multiples. 1 to 999. |
tier | integer | A tier id from the service detail. 1 to 999. |
tier_quick_delivery | boolean | Needs tier. |
extras | list of string | Extra ids, as services/{id}/extras lists them. Up to 20 items. |
coupon | string | Up to 64 characters. |
expected_total required | string | What the caller expects to pay. A different total is refused with price_changed, never charged. Must match ^[0-9]{1,7}(\.[0-9]{1,2})?$. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/orders/quote" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"listing_id":1024,"expected_total":"12.50"}'
Response 200
| Field | Type | Description |
|---|---|---|
listing_id | integer | |
title | string | |
seller_id | integer | |
quantity | integer | |
unit_price | money | |
total | money | |
paid_from | string | |
balance_available | money | |
shortfall | money or null | |
order_page | string | |
duplicate_of | object or null | |
duplicate_of.order_id | integer | |
duplicate_of.created_at | timestamp | |
duplicate_window_hours | integer | |
spend_limit | object or null | |
spend_limit.limit | money | |
spend_limit.window_days | integer | |
spend_limit.spent | money | |
spend_limit.remaining | money | |
auto_reload | object | |
auto_reload.on | boolean | |
auto_reload.setup_url | string | |
deposit_amount | integer or null |
{
"data": {
"listing_id": 1024,
"title": "Logo design",
"seller_id": 1024,
"quantity": 1,
"unit_price": {
"amount": "12.50",
"currency": "USD"
},
"total": {
"amount": "12.50",
"currency": "USD"
},
"paid_from": "balance",
"balance_available": {
"amount": "12.50",
"currency": "USD"
},
"shortfall": {
"amount": "12.50",
"currency": "USD"
},
"order_page": "https://www.seoclerk.com/example",
"duplicate_of": {
"order_id": 1024,
"created_at": "2026-10-10T14:03:22Z"
},
"duplicate_window_hours": 1,
"spend_limit": {
"limit": {
"amount": "12.50",
"currency": "USD"
},
"window_days": 1,
"spent": {
"amount": "12.50",
"currency": "USD"
},
"remaining": {
"amount": "12.50",
"currency": "USD"
}
},
"auto_reload": {
"on": true,
"setup_url": "https://www.seoclerk.com/example"
},
"deposit_amount": 1
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
GET /orders/{id}
An order
Scope: orders:read, or the broad read. The order's recorded buyer or seller; 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/orders/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY"
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
service_id | integer | |
buyer_id | integer | |
seller_id | integer | |
title | string | |
status | integer | The order's state; GET order-statuses names each value. |
unit_price | money | |
quantity | integer | |
delivery_days | integer | |
created_at | timestamp or null | |
started_at | timestamp or null | |
completed_at | timestamp or null | |
site | string | |
unread | boolean | The caller's own flag. |
important | boolean | The caller's own flag. |
note | string or null | The seller's private note. Always null for the buyer. |
{
"data": {
"id": 1024,
"service_id": 1024,
"buyer_id": 1024,
"seller_id": 1024,
"title": "Logo design",
"status": 1,
"unit_price": {
"amount": "12.50",
"currency": "USD"
},
"quantity": 1,
"delivery_days": 1,
"created_at": "2026-10-10T14:03:22Z",
"started_at": "2026-10-10T14:03:22Z",
"completed_at": "2026-10-10T14:03:22Z",
"site": "SEOClerks",
"unread": true,
"important": true,
"note": "string"
},
"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 /orders/{id}
Set your flags on an order, and the seller's note
Scope: orders:write, or the broad write. Idempotency-Key is optional.
Unread and important are your own side's flags, as on the order page. Only the seller writes a note; the buyer gets 403 wrong_role. An order whose stored data cannot take a note answers 409 invalid_request.
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 | Your own flag. |
important | boolean | Your own flag. |
note | string | The seller only: a private note, at most 300 characters, stored and given back exactly as sent. An empty string clears it. Up to 300 characters. |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/orders/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"unread":true}'
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
unread | boolean | |
important | boolean | |
note | string or null | The seller's private note. Always null for the buyer. |
{
"data": {
"id": 1024,
"unread": true,
"important": true,
"note": "string"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /orders/{id}/buyer-ratings
Rate the buyer
Scope: orders:write, or the broad write. The seller. 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 |
|---|---|---|
rating required | string | One of positive, negative. |
comment required | string | Up to 500 characters. |
endorse | boolean | Also publish a recommendation. On POST only. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/orders/1024/buyer-ratings" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: ratebuyer-1" \
-H "Content-Type: application/json" \
-d '{"rating":"positive","comment":"Great work."}'
Response 200
| Field | Type | Description |
|---|---|---|
order_id | integer | |
rating_id | integer |
{
"data": {
"order_id": 1024,
"rating_id": 1024
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
PATCH /orders/{id}/buyer-ratings/{rating_id}
Edit your rating of the buyer
Scope: orders:write, or the broad write. The seller. Idempotency-Key is optional.
Parameters
| Name | Where | Description |
|---|---|---|
id required | path | At least 1. |
rating_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 |
|---|---|---|
rating required | string | One of positive, negative. |
comment required | string | Up to 500 characters. |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/orders/1024/buyer-ratings/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"rating":"positive","comment":"Great work."}'
Response 200
| Field | Type | Description |
|---|---|---|
order_id | integer | |
rating_id | integer |
{
"data": {
"order_id": 1024,
"rating_id": 1024
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
PATCH /orders/{id}/cancellation-requests/{message_id}
Answer or take back a cancellation request
Scope: orders:write, or the broad write. The order's recorded buyer or seller; anyone else gets 404. Idempotency-Key is optional.
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 |
|---|---|---|
status required | string | accepted and declined are the other party's answer; aborted is the requester taking it back. One of accepted, declined, aborted. |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/orders/1024/cancellation-requests/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"accepted"}'
Response 200
| Field | Type | Description |
|---|---|---|
order_id | integer | |
message_id | integer | |
status | string |
{
"data": {
"order_id": 1024,
"message_id": 1024,
"status": "string"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /orders/{id}/completion
Complete an order and rate the seller
Scope: orders:write, or the broad write. The buyer. 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 |
|---|---|---|
rating required | string | One of positive, negative. |
comment required | string | Up to 500 characters. |
endorse | boolean | Also publish a recommendation. On POST only. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/orders/1024/completion" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: completeorder-1" \
-H "Content-Type: application/json" \
-d '{"rating":"positive","comment":"Great work."}'
Response 200
| Field | Type | Description |
|---|---|---|
order_id | integer | |
rating_id | integer | |
status | integer | Always 5 (completed). |
{
"data": {
"order_id": 1024,
"rating_id": 1024,
"status": 1
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
PATCH /orders/{id}/deliveries/{message_id}
Withdraw a delivery
Scope: orders:write, or the broad write. The seller who sent it. Idempotency-Key is optional.
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 |
|---|---|---|
withdrawn required | boolean | Must be true. Always true. |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/orders/1024/deliveries/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"withdrawn":true}'
Response 200
| Field | Type | Description |
|---|---|---|
order_id | integer | |
message_id | integer | |
withdrawn | boolean |
{
"data": {
"order_id": 1024,
"message_id": 1024,
"withdrawn": true
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
PATCH /orders/{id}/extension-requests/{message_id}
Answer or take back an extension request
Scope: orders:write, or the broad write. The order's recorded buyer or seller; anyone else gets 404. Idempotency-Key is optional.
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 |
|---|---|---|
status required | string | accepted and declined are the other party's answer; aborted is the requester taking it back. One of accepted, declined, aborted. |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/orders/1024/extension-requests/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"accepted"}'
Response 200
| Field | Type | Description |
|---|---|---|
order_id | integer | |
message_id | integer | |
status | string |
{
"data": {
"order_id": 1024,
"message_id": 1024,
"status": "string"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /orders/{id}/guarantee
Invoke the order's guarantee
Scope: orders:write, or the broad write. The buyer. 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 |
|---|---|---|
reason required | string | Up to 65535 characters. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/orders/1024/guarantee" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: invokeguarantee-1" \
-H "Content-Type: application/json" \
-d '{"reason":"string"}'
Response 200
| Field | Type | Description |
|---|---|---|
order_id | integer | |
status | integer | |
returned | money |
{
"data": {
"order_id": 1024,
"status": 1,
"returned": {
"amount": "12.50",
"currency": "USD"
}
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /orders/{id}/invoice
Email the order's invoice to yourself
Scope: orders:write, or the broad write. The buyer; anyone else gets 404. Idempotency-Key is required.
The invoice the order page's button sends, to your account's email whatever your email preferences. Once per order in each half hour; sooner answers 429 rate_limited. The mail leaves after the request is stored.
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}$. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/orders/1024/invoice" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: emailorderinvoice-1"
Response 202
| Field | Type | Description |
|---|---|---|
order_id | integer | |
email | string | Where it is being sent: your account's email. |
{
"data": {
"order_id": 1024,
"email": "[email protected]"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
GET /orders/{id}/messages
An order's messages
Scope: orders:read, or the broad read. The order's recorded buyer or seller; anyone else gets 404. Newest first, by id.
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/orders/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 /orders/{id}/messages
Send an order message, delivery or request
Scope: orders:write, or the broad write. The order's recorded buyer or seller; anyone else gets 404. Idempotency-Key is required.
No attachment can be sent with an order message yet.
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. |
action | string | Default message. The others are what the order page's buttons do; who may send each, and when, is decided by the website's own order rules. One of message, delivery, revision, seller_cancellation, seller_cancellation_direct, cancellation_request, extension_request. Default message. |
days | integer | Required with extension_request, and only then. 1 to 365. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/orders/1024/messages" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: createordermessage-1" \
-H "Content-Type: application/json" \
-d '{"message":"Here is the finished logo.","action":"delivery"}'
Response 201
| Field | Type | Description |
|---|---|---|
order_id | integer | |
message_id | integer | |
action | string |
{
"data": {
"order_id": 481220,
"message_id": 2204518,
"action": "delivery"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
PATCH /orders/{id}/verification
Accept or reject an order awaiting verification
Scope: orders:write, or the broad write. The seller. Idempotency-Key is optional.
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 |
|---|---|---|
status required | string | One of accepted, rejected. |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/orders/1024/verification" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"accepted"}'
Response 200
| Field | Type | Description |
|---|---|---|
order_id | integer | |
status | integer |
{
"data": {
"order_id": 1024,
"status": 1
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}