> ## Documentation Index
> Fetch the complete documentation index at: https://docs.doers.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a task

> Creates a task from structured fields. To create from a sentence, use `POST /v2/tasks/quick` instead.

A task belongs to a project **or** to an area, never both: if `projectId` is given, `areaId` is ignored.



## OpenAPI

````yaml https://api.doers.sh/openapi.json post /v2/tasks
openapi: 3.1.0
info:
  title: Doers API
  version: 2.0.0
  description: >-
    The open API of Doers: tasks, projects, areas, prioritised context and the
    day's plan.


    ## Authentication


    Every route requires a bearer token, generated from **Settings > API & MCP**
    in the app:


    ```

    Authorization: Bearer pc_…

    ```


    ## Two date fields, not to be confused


    - `when` — the **schedule**: `today`, `anytime` (Later), `someday` (Future)
    or a date.

    - `deadline` — the **commitment**, independent of the schedule.


    ## Time zone


    The server reasons in UTC and does not know yours. Send the `X-PC-Today:
    YYYY-MM-DD` header

    (or the `day` argument where it exists) so dated operations use your local
    day.


    ## MCP server


    The same token gives access to the [Model Context
    Protocol](https://modelcontextprotocol.io)

    server at `POST https://doers.sh/mcp`, which exposes the same operations as
    tools for Claude,

    Cursor and other compatible clients.
servers:
  - url: https://api.doers.sh
    description: Production.
security:
  - bearerAuth: []
tags:
  - name: Tasks
  - name: Projects
  - name: Areas
  - name: Headings
  - name: Comments
  - name: Realtime
  - name: Devices
  - name: Context
  - name: Plan
  - name: Sessions
  - name: Rounds
  - name: Journal
  - name: Habits
  - name: Stats
  - name: Users
  - name: Profiles
  - name: Workspaces
  - name: Access
  - name: Activity
  - name: Tokens
  - name: Referrals
  - name: Files
  - name: Connections
  - name: Collaborators
  - name: Links
  - name: Packages
  - name: Installs
  - name: Billing
  - name: Calendar
  - name: Coach
  - name: Marketplace
paths:
  /v2/tasks:
    post:
      tags:
        - Tasks
      summary: Create a task
      description: >-
        Creates a task from structured fields. To create from a sentence, use
        `POST /v2/tasks/quick` instead.


        A task belongs to a project **or** to an area, never both: if
        `projectId` is given, `areaId` is ignored.
      operationId: createTask
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                areaId:
                  anyOf:
                    - type: string
                      format: uuid
                      pattern: >-
                        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                      description: Identifier of a row.
                    - type: 'null'
                conversationPath:
                  type: string
                  description: Local Atelier conversation carrying this delegated task.
                  maxLength: 1024
                deadline:
                  description: Due date, distinct from `when`.
                  anyOf:
                    - type: string
                      format: date
                      pattern: >-
                        ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
                      description: Local day key, `YYYY-MM-DD`.
                    - type: 'null'
                durationMin:
                  type: integer
                  minimum: 15
                  maximum: 1440
                headingId:
                  description: >-
                    Heading of the project or area that groups the task. `null`
                    moves it back to the top. It must belong to the same parent
                    as the task.
                  anyOf:
                    - type: string
                      format: uuid
                      pattern: >-
                        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                      description: Identifier of a row.
                    - type: 'null'
                kind:
                  type: string
                  description: '`event` is a calendar block, excluded from task lists.'
                  enum:
                    - task
                    - event
                notes:
                  type: string
                  description: >-
                    Markdown: bold, italic, headings, lists, quotes, rules,
                    links, inline code, tables and checkboxes. **Do not use code
                    blocks (```) or images**: the app's editor does not support
                    them and truncates the display from that point on.
                  maxLength: 10000
                order:
                  type: number
                  description: >-
                    Manual position. Fractional values are valid; lower sorts
                    first.
                priority:
                  type: integer
                  description: >-
                    0 none · 1 low · 2 medium · 3 high · 4 “goal of the day”.
                    Out of range is a 400.
                  minimum: 0
                  maximum: 4
                projectId:
                  anyOf:
                    - type: string
                      format: uuid
                      pattern: >-
                        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                      description: Identifier of a row.
                    - type: 'null'
                repeat:
                  description: Repeat rule. `null` stops it repeating.
                  anyOf:
                    - type: object
                      properties:
                        every:
                          type: integer
                          minimum: 1
                          maximum: 365
                          description: 'The multiplier: 2 × week.'
                        unit:
                          type: string
                          enum:
                            - day
                            - week
                            - month
                            - year
                        mode:
                          type: string
                          enum:
                            - calendar
                            - after
                          description: >-
                            `calendar`: the next one starts from the scheduled
                            date. `after`: from ticking.
                        weekdays:
                          description: >-
                            ISO weekdays (1 = Monday … 7 = Sunday) the weekly
                            rule fires on. Only valid with unit "week".
                          minItems: 1
                          maxItems: 7
                          type: array
                          items:
                            type: integer
                            minimum: 1
                            maximum: 7
                      required:
                        - every
                        - unit
                        - mode
                      description: >-
                        Repeat rule. Ticking the task creates the next
                        occurrence.
                    - type: 'null'
                requestId:
                  type: string
                  description: >-
                    Stable creation request identifier. Reusing it returns the
                    first task. If that task has been deleted, the request
                    remains consumed and returns a conflict.
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                tags:
                  type: array
                  items:
                    type: string
                    minLength: 1
                  maxItems: 20
                time:
                  type: string
                  description: Time `HH:MM` — only meaningful alongside a date.
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                title:
                  type: string
                  minLength: 1
                  maxLength: 500
                visibility:
                  type: string
                  description: >-
                    Who sees this task on shared and social surfaces. Defaults
                    to private on create.
                  enum:
                    - public
                    - anonymized
                    - private
                when:
                  description: >-
                    Scheduling: `today`, `anytime` (Later), `someday` (Future),
                    or a `YYYY-MM-DD` date. Not to be confused with `deadline`,
                    which is the due date.
                  anyOf:
                    - type: string
                      enum:
                        - today
                        - anytime
                        - someday
                    - type: string
                      format: date
                      pattern: >-
                        ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
              required:
                - title
              additionalProperties: false
      responses:
        '201':
          description: Created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  task:
                    type: object
                    properties:
                      id:
                        type: string
                      title:
                        type: string
                      notes:
                        type: string
                      status:
                        type: string
                        enum:
                          - open
                          - done
                          - archived
                      priority:
                        type: integer
                        minimum: -9007199254740991
                        maximum: 9007199254740991
                      when:
                        oneOf:
                          - type: object
                            properties:
                              kind:
                                type: string
                                const: today
                            required:
                              - kind
                            additionalProperties: false
                          - type: object
                            properties:
                              kind:
                                type: string
                                const: anytime
                            required:
                              - kind
                            additionalProperties: false
                          - type: object
                            properties:
                              kind:
                                type: string
                                const: someday
                            required:
                              - kind
                            additionalProperties: false
                          - type: object
                            properties:
                              kind:
                                type: string
                                const: date
                              date:
                                type: string
                              hasTime:
                                type: boolean
                              time:
                                anyOf:
                                  - type: string
                                  - type: 'null'
                            required:
                              - kind
                              - date
                              - hasTime
                            additionalProperties: false
                        description: >-
                          How the task is scheduled (distinct from its
                          `deadline`).
                      deadline:
                        anyOf:
                          - type: string
                          - type: 'null'
                        description: Due date `YYYY-MM-DD`, or `null`.
                      projectId:
                        anyOf:
                          - type: string
                          - type: 'null'
                      areaId:
                        anyOf:
                          - type: string
                          - type: 'null'
                      headingId:
                        anyOf:
                          - type: string
                          - type: 'null'
                        description: >-
                          Heading grouping the task, or `null` if it sits above
                          them all.
                      tags:
                        type: array
                        items:
                          type: string
                      checklist:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                            label:
                              type: string
                            done:
                              type: boolean
                          required:
                            - id
                            - label
                            - done
                          additionalProperties: false
                      completedAt:
                        anyOf:
                          - type: number
                          - type: 'null'
                      durationMin:
                        anyOf:
                          - type: number
                          - type: 'null'
                      kind:
                        type: string
                        enum:
                          - task
                          - event
                      repeat:
                        anyOf:
                          - type: object
                            properties:
                              every:
                                type: integer
                                minimum: 1
                                maximum: 365
                                description: 'The multiplier: 2 × week.'
                              unit:
                                type: string
                                enum:
                                  - day
                                  - week
                                  - month
                                  - year
                              mode:
                                type: string
                                enum:
                                  - calendar
                                  - after
                                description: >-
                                  `calendar`: the next one starts from the
                                  scheduled date. `after`: from ticking.
                              weekdays:
                                description: >-
                                  ISO weekdays (1 = Monday … 7 = Sunday) the
                                  weekly rule fires on. Only valid with unit
                                  "week".
                                minItems: 1
                                maxItems: 7
                                type: array
                                items:
                                  type: integer
                                  minimum: 1
                                  maximum: 7
                            required:
                              - every
                              - unit
                              - mode
                            additionalProperties: false
                            description: >-
                              Repeat rule. Ticking the task creates the next
                              occurrence.
                          - type: 'null'
                      visibility:
                        type: string
                        enum:
                          - public
                          - anonymized
                          - private
                        description: >-
                          Who sees this task on shared and social surfaces:
                          public shows title and project, anonymized shows only
                          the area, private shows nothing. New tasks default to
                          private.
                      order:
                        type: number
                        description: >-
                          Manual position. Fractional values are valid; lower
                          sorts first.
                      notePath:
                        anyOf:
                          - type: string
                            maxLength: 1024
                            description: >-
                              Path of a note in the local markdown vault,
                              relative to its root (`Projects/Launch.md`). When
                              set, the app shows that note **instead of** the
                              `notes` field. Do not invent one: it names a file
                              on the user's machine.
                          - type: 'null'
                      conversationPath:
                        anyOf:
                          - type: string
                            maxLength: 1024
                            description: >-
                              Path of the Atelier conversation this task is
                              delegated to, relative to the vault root
                              (`Agents/Reel scripter/Conversations/….md`). The
                              agent is derived from the path. Do not invent one:
                              it names a file on the user's machine.
                          - type: 'null'
                      assigneeId:
                        anyOf:
                          - type: string
                          - type: 'null'
                        description: >-
                          Who it is assigned to: one person who reaches the
                          task, or nobody.
                      assignee:
                        anyOf:
                          - type: object
                            properties:
                              id:
                                type: string
                              username:
                                anyOf:
                                  - type: string
                                  - type: 'null'
                              name:
                                anyOf:
                                  - type: string
                                  - type: 'null'
                              email:
                                anyOf:
                                  - type: string
                                  - type: 'null'
                              image:
                                anyOf:
                                  - type: string
                                  - type: 'null'
                            required:
                              - id
                              - username
                              - name
                              - email
                              - image
                            additionalProperties: false
                          - type: 'null'
                        description: The same person, as the row draws them.
                      accessRole:
                        description: Your effective role on this task.
                        type: string
                        enum:
                          - owner
                          - editor
                          - commenter
                          - reader
                    required:
                      - id
                      - title
                      - notes
                      - status
                      - priority
                      - when
                      - deadline
                      - projectId
                      - areaId
                      - headingId
                      - tags
                      - checklist
                      - completedAt
                      - durationMin
                      - kind
                      - repeat
                      - visibility
                      - order
                      - notePath
                      - conversationPath
                      - assigneeId
                      - assignee
                    additionalProperties: false
                required:
                  - task
                additionalProperties: false
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/Unprocessable'
        '429':
          $ref: '#/components/responses/TooManyRequests'
components:
  responses:
    BadRequest:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: >-
        Invalid request — unreadable body, out-of-range field or unknown
        parameter.
    Unauthorized:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: Token missing, unknown or revoked.
    NotFound:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: >-
        Resource does not exist **or** belongs to another account — the API
        never distinguishes the two.
    Conflict:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: Conflicts with the resource's current state.
    Unprocessable:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: >-
        Well-formed but unusable request — an empty title once parsed, for
        instance.
    TooManyRequests:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: Too many requests. `Retry-After` says how many seconds to wait.
  schemas:
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Stable machine-readable code.
            message:
              type: string
              description: Human-readable message.
            details:
              type: array
              description: Per-field detail, present on validation errors.
              items:
                type: object
                properties:
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - field
                  - message
          required:
            - code
            - message
      required:
        - error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: A `pc_…` token generated from Settings > API & MCP.

````