List customer requests
Customer requests capture what a customer asked for, and link that ask to work items. List the customer requests you can see. Results are scoped to the path and to what your token is allowed to read.
Path Parameters
slug:requiredstringThe workspace slug. It appears in your Plane URLs — in https://app.plane.so/my-team/projects/, the slug is my-team.
customer_id:requiredstring (uuid)The customer the resource belongs to.
Query Parameters
count:optionalbooleanSet to false to skip the total_count COUNT(*) (omits total_count).
offset:optionalintegerNumber of rows to skip from the start of the result set.
order_by:optionalstringField to order the list by. Prefix with '-' for descending (e.g. '-created_at'). Annotation-backed orders sort semantically and ride the default offset page.
paginate:optionalstringSet to 'cursor' to opt into the COUNT-free keyset cursor envelope (use for deep traversal); omit for the default offset envelope with total_count.
One of cursor.
per_page:optionalintegerPage size (max 200).
search:optionalstringA search term.
Response shaping
fields:optionalstringComma-separated list of fields to return. Unrequested keys are omitted from each row, not returned as null. id always comes back. Pass all for every requestable field.
An unknown name is a 400 that names the valid set, so a typo can't silently cost you the saving. See Sparse fields.
Requestable here: archived_at, created_at, created_by_id, customer_id, description, description_html, id, link, name.
Scopes
customers.requests:read
Errors
| Status | Code | Cause |
|---|---|---|
401 | unauthorized | Missing or invalid credentials. |
402 | payment_required | The feature this endpoint belongs to isn't enabled on your plan or is switched off. |
403 | forbidden | Your role or token scope doesn't allow this. |
404 | not_found | No such resource, or it's outside your tenant. |
406 | not_acceptable | The Accept header asks for a representation the API can't produce. |
429 | rate_limited | Throttled. Honor the Retry-After header before retrying. |
curl -X GET \
"https://api.plane.so/api/v2/workspaces/my-team/customers/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/requests/" \
-H "X-Api-Key: $PLANE_API_KEY"import requests
response = requests.get(
"https://api.plane.so/api/v2/workspaces/my-team/customers/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/requests/",
headers={"X-Api-Key": "your-api-key"},
)
print(response.json())const response = await fetch(
"https://api.plane.so/api/v2/workspaces/my-team/customers/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/requests/",
{
method: "GET",
headers: {
"X-Api-Key": "your-api-key",
},
},
);
const data = await response.json();{
"data": [
{
"archived_at": null,
"created_at": "2026-01-14T09:22:41.478363Z",
"created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"customer_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f",
"description": "What this is for.",
"description_html": "<p>Details go here.</p>",
"id": "b7e42a19-3c5d-4f80-9a26-8d1c0f4e7b53",
"link": "https://example.com",
"name": "Example name"
},
{
"archived_at": null,
"created_at": "2026-01-13T16:04:02.911204Z",
"created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"customer_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f",
"description": "What this is for.",
"description_html": "<p>Details go here.</p>",
"id": "8f4c2b1e-0d3a-4f7b-9c21-6e5a8b7d4f13",
"link": "https://example.com",
"name": "Another example"
}
],
"next": 1,
"pagination": {
"style": "offset"
},
"previous": 1,
"total_count": 3
}
