API REFERENCE
Get Project Task
On this page
/api/projects/{projectId}/tasks/{taskId}One task with its comment feed and the project's collaborators. This is what the task detail page renders.
Authentication
x-api-key in header
bearerAuth bearer
Request
curl --request GET \
--url 'https://api.recoupable.dev/api/projects/YOUR_PROJECT_ID/tasks/YOUR_TASK_ID' \
--header 'x-api-key: YOUR_API_KEY'Replace the YOUR_ placeholders with your values. Required query parameters are included; optional parameters are listed below.
Try it
Fill in the fields, send the request from your browser, and read the live response. The curl below updates as you type.
Kept in this browser tab only and cleared when it closes.
curl --request GET \
--url 'https://recoup-api.vercel.app/api/projects/{projectId}/tasks/{taskId}'Parameters
Path parameters
projectIdstringrequiredThe project's UUID.
taskIdstringrequiredThe task's UUID.
Responses
200The task, its comments and the project's collaborators.+
application/json
statusstringrequiredtaskobjectrequiredProperties for task
idstringrequiredformat: uuid
project_idstringrequiredformat: uuid
titlestringrequireddescriptionstringnullabledue_datestringnullableA calendar date with no time of day, e.g. 2026-09-12.
format: date
assignee_account_idstringnullableWho the task is waiting on. A client renders its "needs you" treatment when this matches the viewing account.
format: uuid
completed_atstringnullableNull means the task is not complete. There is no separate boolean.
format: date-time
completed_bystringnullableformat: uuid
comment_countintegerNumber of comments on this task. Present on the project read so a list can render a count without a call per task.
format: int32
created_atstringrequiredAlso the sort key: tasks come back oldest first.
format: date-time
updated_atstringformat: date-time
commentsarray<ProjectComment>requiredOldest first, so the feed reads top to bottom.
Item properties for comments
idstringrequiredformat: uuid
task_idstringrequiredformat: uuid
account_idstringrequiredformat: uuid
author_namestringnullableThe author's accounts.name, resolved server-side. Frequently null; render a fallback.
bodystringrequiredcreated_atstringrequiredformat: date-time
collaboratorsarray<ProjectCollaborator>requiredItem properties for collaborators
account_idstringrequiredformat: uuid
namestringnullableThe collaborator's accounts.name. Frequently null — nothing captures a name at sign-up today — so clients must render a fallback.
400Bad request — invalid path parameter or request body.+
application/json
statusstring · enumrequiredAlways "error" for error responses.
Values: "error"
errorstringrequiredHuman-readable error message.
messagestringCarries the message in place of error when the failure comes from the authentication layer, so a 401 raised while verifying the credential reads message and every other error reads error.
401Unauthorized — missing or invalid credentials.+
application/json
statusstring · enumrequiredAlways "error" for error responses.
Values: "error"
errorstringrequiredHuman-readable error message.
messagestringCarries the message in place of error when the failure comes from the authentication layer, so a 401 raised while verifying the credential reads message and every other error reads error.
404Not found — either no project or task with this id exists, or the authenticated account is not a collaborator on it. The two cases are deliberately indistinguishable so the response cannot be used to discover which project ids are real.+
application/json
statusstring · enumrequiredAlways "error" for error responses.
Values: "error"
errorstringrequiredHuman-readable error message.
messagestringCarries the message in place of error when the failure comes from the authentication layer, so a 401 raised while verifying the credential reads message and every other error reads error.
500Internal server error.+
application/json
statusstring · enumrequiredAlways "error" for error responses.
Values: "error"
errorstringrequiredHuman-readable error message.
messagestringCarries the message in place of error when the failure comes from the authentication layer, so a 401 raised while verifying the credential reads message and every other error reads error.
Full specification
Download the OpenAPI file for complete schemas, constraints, and examples.
Download projects.jsonView operation source
{
"summary": "Get project task",
"description": "One task with its comment feed and the project's collaborators. This is what the task detail page renders.",
"security": [
{
"apiKeyAuth": []
},
{
"bearerAuth": []
}
],
"parameters": [
{
"name": "projectId",
"in": "path",
"required": true,
"description": "The project's UUID.",
"schema": {
"type": "string",
"format": "uuid"
}
},
{
"name": "taskId",
"in": "path",
"required": true,
"description": "The task's UUID.",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"responses": {
"200": {
"description": "The task, its comments and the project's collaborators.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProjectTaskResponse"
}
}
}
},
"400": {
"description": "Bad request — invalid path parameter or request body.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"401": {
"description": "Unauthorized — missing or invalid credentials.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"404": {
"description": "Not found — either no project or task with this id exists, or the authenticated account is not a collaborator on it. The two cases are deliberately indistinguishable so the response cannot be used to discover which project ids are real.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"500": {
"description": "Internal server error.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}