API REFERENCE
Get Project
On this page
/api/projects/{projectId}A client project and every task on it, oldest first, with the project's collaborators. This is what the project page renders.
Authentication
x-api-key in header
bearerAuth bearer
Request
curl --request GET \
--url 'https://api.recoupable.dev/api/projects/YOUR_PROJECT_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.
Parameters
Path parameters
projectIdstringrequiredThe project's UUID.
Responses
200The project, its tasks and its collaborators.+
application/json
statusstringrequiredprojectobjectrequiredProperties for project
idstringrequiredformat: uuid
namestringrequiredcreated_atstringrequiredformat: date-time
tasksarray<ProjectTask>requiredEvery task on the project, oldest first. Both the active and completed sets; a client splits them on completed_at.
Item properties for tasks
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
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",
"description": "A client project and every task on it, oldest first, with the project's collaborators. This is what the project page renders.",
"security": [
{
"apiKeyAuth": []
},
{
"bearerAuth": []
}
],
"parameters": [
{
"name": "projectId",
"in": "path",
"required": true,
"description": "The project's UUID.",
"schema": {
"type": "string",
"format": "uuid"
}
}
],
"responses": {
"200": {
"description": "The project, its tasks and its collaborators.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProjectResponse"
}
}
}
},
"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"
}
}
}
}
}
}