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

# Read a package before installing it

> Everything the address describes: the version on offer, its changelog, and **every file in full**. Writes nothing and installs nothing — the page that offers an agent has to be able to show what that agent says, because an installed agent runs on the caller's workspace with the caller's key.

Answers 404 for a token that is unknown or has been taken down. The author of a package may read their own, unlike installing it.

A POST that reads: the token is the whole capability, and a query string is written to every access log and sent onward in a `Referer`.



## OpenAPI

````yaml https://api.doers.sh/openapi.json post /v2/packages/preview
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/packages/preview:
    post:
      tags:
        - Installs
      summary: Read a package before installing it
      description: >-
        Everything the address describes: the version on offer, its changelog,
        and **every file in full**. Writes nothing and installs nothing — the
        page that offers an agent has to be able to show what that agent says,
        because an installed agent runs on the caller's workspace with the
        caller's key.


        Answers 404 for a token that is unknown or has been taken down. The
        author of a package may read their own, unlike installing it.


        A POST that reads: the token is the whole capability, and a query string
        is written to every access log and sent onward in a `Referer`.
      operationId: previewPackage
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: The token from a package's public address.
                  minLength: 1
                  maxLength: 128
              required:
                - token
              additionalProperties: false
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  package:
                    type: object
                    properties:
                      packageId:
                        type: string
                      kind:
                        type: string
                        enum:
                          - agent
                          - note
                          - folder
                        description: >-
                          An agent and its notes, a note on its own, or a folder
                          of them.
                      slug:
                        type: string
                      name:
                        type: string
                      emoji:
                        anyOf:
                          - type: string
                          - type: 'null'
                      summary:
                        type: string
                      version:
                        type: integer
                        minimum: -9007199254740991
                        maximum: 9007199254740991
                        description: >-
                          The version on offer today, not any version already
                          installed.
                      changelog:
                        type: string
                      publishedAt:
                        type: number
                        description: Epoch milliseconds.
                      publisher:
                        type: object
                        properties:
                          id:
                            type: string
                          kind:
                            type: string
                            enum:
                              - personal
                              - official
                          handle:
                            type: string
                          displayName:
                            type: string
                        required:
                          - id
                          - kind
                          - handle
                          - displayName
                        additionalProperties: false
                      files:
                        type: array
                        items:
                          type: object
                          properties:
                            path:
                              type: string
                            content:
                              type: string
                          required:
                            - path
                            - content
                          additionalProperties: false
                      contentDigest:
                        anyOf:
                          - type: string
                          - type: 'null'
                      reviewStatus:
                        type: string
                        enum:
                          - approved
                          - unreviewed
                      approvedAt:
                        anyOf:
                          - type: number
                            description: Epoch milliseconds.
                          - type: 'null'
                    required:
                      - packageId
                      - kind
                      - slug
                      - name
                      - emoji
                      - summary
                      - version
                      - changelog
                      - publishedAt
                      - publisher
                      - files
                      - contentDigest
                      - reviewStatus
                      - approvedAt
                    additionalProperties: false
                required:
                  - package
                additionalProperties: false
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '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.
    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.

````