RecoupGet a Free AuditFree Audit

API REFERENCE

Create Project Task

On this page
POST/api/projects/{projectId}/tasks

Add a task to a project. New tasks are always incomplete; set completed with the update endpoint instead.

Authentication

x-api-key in header

bearerAuth bearer

Request

cURL
curl --request POST \
  --url 'https://api.recoupable.dev/api/projects/YOUR_PROJECT_ID/tasks' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "title": "Distribution portal access",
  "description": "Create a read only login for your distributor dashboard and share it with us.",
  "due_date": "2026-09-12",
  "assignee_account_id": "0f0e6d8a-1b2c-4d3e-8f90-a1b2c3d4e5f6"
}'

Replace the YOUR_ placeholders with your values. Required query parameters are included; optional parameters are listed below.

Parameters

Path parameters

projectIdstringrequired

The project's UUID.

Request body required

The task to create.

application/json

titlestringrequired

minLength: 1

descriptionstringnullable
due_datestringnullable

format: date

assignee_account_idstringnullable

Must be a collaborator on this project.

format: uuid

A task waiting on the client

needsClient
{
  "title": "Distribution portal access",
  "description": "Create a read only login for your distributor dashboard and share it with us.",
  "due_date": "2026-09-12",
  "assignee_account_id": "0f0e6d8a-1b2c-4d3e-8f90-a1b2c3d4e5f6"
}

Responses

201Task created.

application/json

statusstringrequired
taskobjectrequired
Properties for task
idstringrequired

format: uuid

project_idstringrequired

format: uuid

titlestringrequired
descriptionstringnullable
due_datestringnullable

A calendar date with no time of day, e.g. 2026-09-12.

format: date

assignee_account_idstringnullable

Who the task is waiting on. A client renders its "needs you" treatment when this matches the viewing account.

format: uuid

completed_atstringnullable

Null means the task is not complete. There is no separate boolean.

format: date-time

completed_bystringnullable

format: uuid

comment_countinteger

Number 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_atstringrequired

Also the sort key: tasks come back oldest first.

format: date-time

updated_atstring

format: date-time

400Bad request — invalid path parameter or request body.

application/json

statusstring · enumrequired

Always "error" for error responses.

Values: "error"

errorstringrequired

Human-readable error message.

messagestring

Carries 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 · enumrequired

Always "error" for error responses.

Values: "error"

errorstringrequired

Human-readable error message.

messagestring

Carries 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 · enumrequired

Always "error" for error responses.

Values: "error"

errorstringrequired

Human-readable error message.

messagestring

Carries 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 · enumrequired

Always "error" for error responses.

Values: "error"

errorstringrequired

Human-readable error message.

messagestring

Carries 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.json
View operation source
json
{
  "summary": "Create project task",
  "description": "Add a task to a project. New tasks are always incomplete; set `completed` with [the update endpoint](/api-reference/projects/task-update) instead.",
  "security": [
    {
      "apiKeyAuth": []
    },
    {
      "bearerAuth": []
    }
  ],
  "parameters": [
    {
      "name": "projectId",
      "in": "path",
      "required": true,
      "description": "The project's UUID.",
      "schema": {
        "type": "string",
        "format": "uuid"
      }
    }
  ],
  "requestBody": {
    "description": "The task to create.",
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/CreateProjectTaskRequest"
        },
        "examples": {
          "needsClient": {
            "summary": "A task waiting on the client",
            "value": {
              "title": "Distribution portal access",
              "description": "Create a read only login for your distributor dashboard and share it with us.",
              "due_date": "2026-09-12",
              "assignee_account_id": "0f0e6d8a-1b2c-4d3e-8f90-a1b2c3d4e5f6"
            }
          }
        }
      }
    }
  },
  "responses": {
    "201": {
      "description": "Task created.",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/ProjectTaskMutationResponse"
          }
        }
      }
    },
    "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"
          }
        }
      }
    }
  }
}