Services
Listings.
PATCH /ratings/{id}
Change your rating of a seller
Scope: orders:write, or the broad write. Idempotency-Key is optional.
Only the member who left the rating. The id is the one GET services/{id}/ratings gives, or GET me/ratings for ratings of your listings (role=seller, the default; role=buyer ids are another kind of rating).
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 |
|---|---|---|
rating required | string | One of positive, negative. |
comment required | string | At most 500 characters. 1 to 500 characters. |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/ratings/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"rating":"positive","comment":"Great work."}'
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
rating | string | |
comment | string |
{
"data": {
"id": 1024,
"rating": "positive",
"comment": "Great work."
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /ratings/{id}/helpful
Mark a rating helpful
Scope: account:write, or the broad write. Idempotency-Key is required.
Marking twice changes nothing. After six changes to one rating in half an hour, as on the website, the next answers 429 rate_limited.
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/ratings/1024/helpful" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: markratinghelpful-1"
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
helpful | boolean | Whether you have marked it helpful. |
helpful_total | integer |
{
"data": {
"id": 1024,
"helpful": true,
"helpful_total": 1
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
DELETE /ratings/{id}/helpful
Take back a helpful mark
Scope: account:write, or the broad write. 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}$. |
Example request
curl -X DELETE "https://www.seoclerk.com/api/v1/ratings/1024/helpful" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY"
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
helpful | boolean | Whether you have marked it helpful. |
helpful_total | integer |
{
"data": {
"id": 1024,
"helpful": true,
"helpful_total": 1
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /ratings/{id}/reply
Reply to a rating of your listing
Scope: orders:write, or the broad write. Idempotency-Key is required.
Only the listing's seller. Sending it again changes the reply.
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 |
|---|---|---|
text required | string | At most 500 characters. 1 to 500 characters. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/ratings/1024/reply" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: replytorating-1" \
-H "Content-Type: application/json" \
-d '{"text":"Hello."}'
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
reply | string |
{
"data": {
"id": 1024,
"reply": "string"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
GET /services
Search the catalog, or list your own listings
Scope: listings:read, or the broad read. Newest first, by id.
Generated order-only listings are never listed.
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. |
q | query | Matches title and tags. 2 to 120 characters. |
category_id | query | At least 1. |
seller_id | query | At least 1. |
mine | query | 1: your own listings, in any state. One of 0, 1. |
status | query | Needs mine=1. One of 0, 1, 2, 4. |
If-None-Match | header | An ETag from an earlier response. |
Example request
curl "https://www.seoclerk.com/api/v1/services" \
-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 | |
seller_id | integer | |
title | string | |
category_id | integer | For a service (type 0), an id from GET categories. |
type | integer | |
status | integer | 0 inactive, 1 active, 2 paused, 4 draft or in review. Only 1 is public. |
price | money | The cheapest tier's price, or the sale price when on sale. |
delivery_days | integer | |
created_at | timestamp or null | |
rating | number | |
sold_out | boolean | |
position | integer or null | Your own listings only: their order on your Manage services page, lowest first (0 when never set). Null on anyone else's. |
{
"data": [
{
"id": 1024,
"seller_id": 1024,
"title": "Logo design",
"category_id": 1024,
"type": 1,
"status": 1,
"price": {
"amount": "12.50",
"currency": "USD"
},
"delivery_days": 1,
"created_at": "2026-10-10T14:03:22Z",
"rating": 4.8,
"sold_out": true,
"position": 1
}
],
"meta": {
"limit": 1,
"next_cursor": "string",
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /services
Create a listing
Scope: listings:write, or the broad write. Idempotency-Key is required.
The sell form's own rules, through listing_write.php: title, description, instructions, category, price, delivery and media, then quick delivery, extras, tiers, subscription, sale, coupons, the abandoned-checkout discount, guarantee, affiliate commission, custom fields and included features. draft keeps it a draft; otherwise it goes live or to review as the website decides. Software and instant-download listings are website-only.
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 |
|---|---|---|
title required | string | Up to 500 characters. |
description required | string | Up to 65000 characters. |
instructions required | string | At least 50 characters. Up to 65000 characters. |
tags required | string | Up to 250 characters. |
category_id required | integer | 1 to 2147483647. |
price required | integer | Whole dollars. 1 to 999999. |
delivery_days required | integer | 0 to 100000. |
allow_multiple | boolean | |
media required | list of string | Image ids from POST images, or on an edit the listing's own media ids as GET services/{id} gives them. At most ten; an empty list is refused. Left out of an edit, the gallery stays. Up to 10 items. |
quick_delivery | object or null | |
quick_delivery.days required | integer | Faster delivery, in days. 0 to 100000. |
quick_delivery.price required | integer | Whole dollars. 0 to 999999. |
extras | list of object | Up to 50 items. |
extras[].id | integer | Keeps this extra's key. Omit for a new extra. 1 to 1000. |
extras[].name required | string | Up to 150 characters. |
extras[].price required | integer | Whole dollars. 0 to 999999. |
extras[].days required | integer | 0 to 100000. |
extras[].quick_days | integer | 0 to 100000. |
tiers | list of object or null | Up to 3 items. |
tiers[].name required | string | Up to 60 characters. |
tiers[].price required | integer | Whole dollars. 0 to 999999. |
tiers[].days required | integer | 0 to 100000. |
tiers[].sale_price | integer | 0 to 999999. |
tiers[].quick_days | integer | 0 to 100000. |
tiers[].quick_price | integer | 0 to 999999. |
tiers[].features required | list of string | Up to 10 items. |
subscription | string or null | One of D, W, B, M, Y. |
sale | object or null | |
sale.price required | integer | Whole dollars, below the listing price. 0 to 999999. |
sale.days required | integer | 0 to 100000. |
coupons | list of object | Up to 20 items. |
coupons[].code required | string | 5 to 20 letters, digits, dots, dashes or underscores. Up to 64 characters. |
coupons[].discount required | integer | 5 to 90 percent. 0 to 100. |
coupons[].enabled | boolean | Default true. |
abandoned_discount | integer | 0 to 50 in steps of 5. 0 to 50. |
guarantee | object or null | |
guarantee.percent required | integer | 25 to 100. 0 to 100. |
guarantee.text required | string | Up to 300 characters. |
affiliate_commission | integer or null | The standard rate to 70. 0 to 100. |
custom_fields | list of object | Up to 20 items. |
custom_fields[].icon required | string | One of the form's icons. Up to 64 characters. |
custom_fields[].title required | string | Up to 100 characters. |
custom_fields[].description required | string | Up to 200 characters. |
included_features | list of string | Up to 20 items. |
allow_subscribe | boolean or null | Null keeps what is stored: the form did not show it. |
draft | boolean | Create as a draft; publish it later with an edit. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/services" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: createservice-1" \
-H "Content-Type: application/json" \
-d '{"title":"Logo design","description":"A short description.","instructions":"string","category_id":1024,"tags":"string","price":1,"delivery_days":1,"media":["string"]}'
Response 201
| Field | Type | Description |
|---|---|---|
id | integer | |
status | integer | |
url | string |
{
"data": {
"id": 1024,
"status": 1,
"url": "https://www.seoclerk.com/example"
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
POST /services/positions
Order your own listings
Scope: listings:write, or the broad write. Idempotency-Key is required.
The order of your listings on your Manage services page. Every id must be one of your listings that is not deleted, or nothing changes (404). Each listing's position is in its reads.
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 |
|---|---|---|
service_ids required | list of integer | Your own listings, first to last; at most 200, each once. Listings not named keep their place. Up to 200 items. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/services/positions" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: setservicepositions-1" \
-H "Content-Type: application/json" \
-d '{"service_ids":[1]}'
Response 200
| Field | Type | Description |
|---|---|---|
positions | list of object | |
positions[].id | integer | |
positions[].position | integer |
{
"data": {
"positions": [
{
"id": 1024,
"position": 1
}
]
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
GET /services/{id}
A listing
Scope: listings:read, or the broad read.
A listing that is not public is visible to its seller only.
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/services/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY"
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
seller_id | integer | |
title | string | |
category_id | integer | For a service (type 0), an id from GET categories. |
type | integer | |
status | integer | 0 inactive, 1 active, 2 paused, 4 draft or in review. Only 1 is public. |
price | money | The cheapest tier's price, or the sale price when on sale. |
delivery_days | integer | |
created_at | timestamp or null | |
rating | number | |
sold_out | boolean | |
position | integer or null | Your own listings only: their order on your Manage services page, lowest first (0 when never set). Null on anyone else's. |
description | string | Stored content, not trusted HTML. |
subscription | object | |
subscription.enabled | boolean | |
subscription.interval | string | |
subscription.interval_days | integer | |
allow_multiple | boolean | |
instant_delivery | boolean | |
quantity_available | integer | |
tiers | list of object | |
tiers[].id | integer / string | |
tiers[].name | string | |
tiers[].price | money | |
tiers[].delivery_days | integer / string | |
tiers[].features | any | As stored for the tier. |
tiers[].quick_delivery_days | any | As stored for the tier. |
tiers[].quick_delivery_price | money |
{
"data": {
"id": 1024,
"seller_id": 1024,
"title": "Logo design",
"category_id": 1024,
"type": 1,
"status": 1,
"price": {
"amount": "12.50",
"currency": "USD"
},
"delivery_days": 1,
"created_at": "2026-10-10T14:03:22Z",
"rating": 4.8,
"sold_out": true,
"position": 1,
"description": "A short description.",
"subscription": {
"enabled": true,
"interval": "string",
"interval_days": 1
},
"allow_multiple": true,
"instant_delivery": true,
"quantity_available": 1,
"tiers": [
{
"id": 1024,
"name": "Example",
"price": {
"amount": "12.50",
"currency": "USD"
},
"delivery_days": 1,
"features": "string",
"quick_delivery_days": "string",
"quick_delivery_price": {
"amount": "12.50",
"currency": "USD"
}
}
]
},
"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 /services/{id}
Edit your listing
Scope: listings:write, or the broad write. The seller only; anyone else gets 404. Software and instant-download listings are edited on the website. Idempotency-Key is optional.
Only the fields sent change. publish publishes a draft. An edit that moves a live or paused listing from a category outside review into one inside sends it to review. media names image ids from POST images, or the listing's own ids as GET services/{id} gives them; left out, the gallery stays. The owner's GET services/{id} carries an editable object with exactly these fields, and sending it back changes nothing but the edit time.
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 |
|---|---|---|
title | string | Up to 500 characters. |
description | string | Up to 65000 characters. |
instructions | string | At least 50 characters. Up to 65000 characters. |
tags | string | Up to 250 characters. |
category_id | integer | 1 to 2147483647. |
price | integer | Whole dollars. 1 to 999999. |
delivery_days | integer | 0 to 100000. |
allow_multiple | boolean | |
media | list of string | Image ids from POST images, or on an edit the listing's own media ids as GET services/{id} gives them. At most ten; an empty list is refused. Left out of an edit, the gallery stays. Up to 10 items. |
quick_delivery | object or null | |
quick_delivery.days required | integer | Faster delivery, in days. 0 to 100000. |
quick_delivery.price required | integer | Whole dollars. 0 to 999999. |
extras | list of object | Up to 50 items. |
extras[].id | integer | Keeps this extra's key. Omit for a new extra. 1 to 1000. |
extras[].name required | string | Up to 150 characters. |
extras[].price required | integer | Whole dollars. 0 to 999999. |
extras[].days required | integer | 0 to 100000. |
extras[].quick_days | integer | 0 to 100000. |
tiers | list of object or null | Up to 3 items. |
tiers[].name required | string | Up to 60 characters. |
tiers[].price required | integer | Whole dollars. 0 to 999999. |
tiers[].days required | integer | 0 to 100000. |
tiers[].sale_price | integer | 0 to 999999. |
tiers[].quick_days | integer | 0 to 100000. |
tiers[].quick_price | integer | 0 to 999999. |
tiers[].features required | list of string | Up to 10 items. |
subscription | string or null | One of D, W, B, M, Y. |
sale | object or null | |
sale.price required | integer | Whole dollars, below the listing price. 0 to 999999. |
sale.days required | integer | 0 to 100000. |
coupons | list of object | Up to 20 items. |
coupons[].code required | string | 5 to 20 letters, digits, dots, dashes or underscores. Up to 64 characters. |
coupons[].discount required | integer | 5 to 90 percent. 0 to 100. |
coupons[].enabled | boolean | Default true. |
abandoned_discount | integer | 0 to 50 in steps of 5. 0 to 50. |
guarantee | object or null | |
guarantee.percent required | integer | 25 to 100. 0 to 100. |
guarantee.text required | string | Up to 300 characters. |
affiliate_commission | integer or null | The standard rate to 70. 0 to 100. |
custom_fields | list of object | Up to 20 items. |
custom_fields[].icon required | string | One of the form's icons. Up to 64 characters. |
custom_fields[].title required | string | Up to 100 characters. |
custom_fields[].description required | string | Up to 200 characters. |
included_features | list of string | Up to 20 items. |
allow_subscribe | boolean or null | Null keeps what is stored: the form did not show it. |
publish | boolean | Publish a draft. |
Example request
curl -X PATCH "https://www.seoclerk.com/api/v1/services/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Logo design"}'
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
status | integer |
{
"data": {
"id": 1024,
"status": 1
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
DELETE /services/{id}
Delete your listing
Scope: listings:write, or the broad write. The seller only; anyone else gets 404. 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}$. |
Example request
curl -X DELETE "https://www.seoclerk.com/api/v1/services/1024" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY"
Response 204
No body.
Errors
POST /services/{id}/activate
Activate your listing
Scope: listings:write, or the broad write. The seller only; 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}$. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/services/1024/activate" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: activateservice-1"
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
status | integer | The listing's status after the action. |
{
"data": {
"id": 1024,
"status": 1
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
GET /services/{id}/addons
Alias of extras
Scope: listings:read, or the broad read. 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/services/1024/addons" \
-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 | string | Pass in extras when ordering. |
name | string | |
price | money | |
delivery_days | integer | |
quick_delivery | boolean | |
quick_delivery_days | integer or null |
{
"data": [
{
"id": "string",
"name": "Example",
"price": {
"amount": "12.50",
"currency": "USD"
},
"delivery_days": 1,
"quick_delivery": true,
"quick_delivery_days": 1
}
],
"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 |
GET /services/{id}/bumps
A listing's boost history
Scope: listings:read, or the broad read. The seller only; 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/services/1024/bumps" \
-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 | |
type | string | |
created_at | timestamp or null | |
paid | boolean | |
rebumped | boolean |
{
"data": [
{
"id": 1024,
"type": "string",
"created_at": "2026-10-10T14:03:22Z",
"paid": true,
"rebumped": true
}
],
"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 /services/{id}/bumps
Boost your listing
Scope: bumps:write, or the broad write. The seller only. 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 |
|---|---|---|
type required | string | Which credit to spend. One of free, paid. |
reboost | boolean | Paid only: book a second boost twelve hours later. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/services/1024/bumps" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: boostservice-1" \
-H "Content-Type: application/json" \
-d '{"type":"free"}'
Response 201
| Field | Type | Description |
|---|---|---|
id | integer | |
service_id | integer | |
spent | string | The kind of credit spent. |
reboost | boolean | |
created_at | timestamp or null | |
balance | object | Boost credits. |
balance.free | integer | |
balance.paid | integer |
{
"data": {
"id": 1024,
"service_id": 1024,
"spent": "string",
"reboost": true,
"created_at": "2026-10-10T14:03:22Z",
"balance": {
"free": 1,
"paid": 1
}
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
GET /services/{id}/extras
A listing's extras
Scope: listings:read, or the broad read. Newest first, by id.
In stored order, not by id. Editing the listing invalidates an outstanding cursor.
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/services/1024/extras" \
-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 | string | Pass in extras when ordering. |
name | string | |
price | money | |
delivery_days | integer | |
quick_delivery | boolean | |
quick_delivery_days | integer or null |
{
"data": [
{
"id": "string",
"name": "Example",
"price": {
"amount": "12.50",
"currency": "USD"
},
"delivery_days": 1,
"quick_delivery": true,
"quick_delivery_days": 1
}
],
"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 /services/{id}/pause
Pause your listing
Scope: listings:write, or the broad write. The seller only; 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}$. |
Example request
curl -X POST "https://www.seoclerk.com/api/v1/services/1024/pause" \
-H "Authorization: Bearer $SEOCLERKS_API_KEY" \
-H "Idempotency-Key: pauseservice-1"
Response 200
| Field | Type | Description |
|---|---|---|
id | integer | |
status | integer | The listing's status after the action. |
{
"data": {
"id": 1024,
"status": 1
},
"meta": {
"request_id": "9f2c4e1ab07d3351"
}
}
Errors
GET /services/{id}/ratings
A listing's ratings
Scope: listings:read, or the broad read. 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/services/1024/ratings" \
-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 | |
member_id | integer | The member rated. |
rater_id | integer | |
service_id | integer | |
positive | boolean | |
negative | boolean | |
comment | string | |
created_at | timestamp or null | |
edited_at | timestamp or null | |
reply | string | The seller's reply. Only on ratings of a seller, and only when there is one. |
{
"data": [
{
"id": 1024,
"member_id": 1024,
"rater_id": 1024,
"service_id": 1024,
"positive": true,
"negative": true,
"comment": "Great work.",
"created_at": "2026-10-10T14:03:22Z",
"edited_at": "2026-10-10T14:03:22Z",
"reply": "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 |