> ## 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.

# Plan a round

> Replaces the round's mini-plan. At most 3 tasks — one substantial and two small is the shape it was built for; a longer list is not a plan.

**A task belongs to one round of the day.** Planning it here removes it from any other round of the same day, so it cannot appear twice.

An empty list clears the plan. The round itself is created if it does not exist yet. When movedTaskIds and both interval bounds are supplied, those tasks are also softly scheduled onto the target day without changing deadlines or completion state.



## OpenAPI

````yaml https://api.doers.sh/openapi.json put /v2/rounds/{day}/{index}/plan
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/rounds/{day}/{index}/plan:
    put:
      tags:
        - Rounds
      summary: Plan a round
      description: >-
        Replaces the round's mini-plan. At most 3 tasks — one substantial and
        two small is the shape it was built for; a longer list is not a plan.


        **A task belongs to one round of the day.** Planning it here removes it
        from any other round of the same day, so it cannot appear twice.


        An empty list clears the plan. The round itself is created if it does
        not exist yet. When movedTaskIds and both interval bounds are supplied,
        those tasks are also softly scheduled onto the target day without
        changing deadlines or completion state.
      operationId: setRoundPlan
      parameters:
        - name: day
          in: path
          required: true
          description: Local day key, `YYYY-MM-DD`.
          schema:
            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])))$
        - name: index
          in: path
          required: true
          description: Which round of the day, counting from zero.
          schema:
            type: integer
            minimum: 0
            maximum: 5
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                movedTaskIds:
                  type: array
                  description: >-
                    The subset moved by this request and softly scheduled into
                    the interval.
                  items:
                    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.
                  minItems: 1
                  maxItems: 3
                roundEndMin:
                  type: integer
                  description: Exclusive target interval end, in minutes after midnight.
                  minimum: 1
                  maximum: 1440
                roundStartMin:
                  type: integer
                  description: Inclusive target interval start, in minutes after midnight.
                  minimum: 0
                  maximum: 1439
                taskIds:
                  type: array
                  description: In display order. Pass an empty array to clear the plan.
                  items:
                    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.
                  maxItems: 3
              required:
                - taskIds
              additionalProperties: false
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  round:
                    type: object
                    properties:
                      day:
                        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`.
                      index:
                        type: integer
                        minimum: -9007199254740991
                        maximum: 9007199254740991
                        description: Which round of the day, counting from zero.
                      taskIds:
                        type: array
                        items:
                          type: string
                        description: The mini-plan, in display order.
                      engaged:
                        type: boolean
                        description: A session was started, or a planned task ticked.
                      closedAt:
                        anyOf:
                          - type: number
                            description: Epoch milliseconds.
                          - type: 'null'
                        description: When it was closed. The first close wins.
                    required:
                      - day
                      - index
                      - taskIds
                      - engaged
                      - closedAt
                    additionalProperties: false
                  removedFromOtherRounds:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                required:
                  - round
                  - removedFromOtherRounds
                additionalProperties: false
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '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.
    Forbidden:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: Readable resource, but your role does not permit this action.
    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.
    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.

````