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

# Search the reviewed catalogue

> Approved Agents somebody else published, most curated first. Matches the approved name, summary, publisher handle and declared integrations. Several categories **widen** the result (OR); text and categories **narrow** each other (AND).

Never returns what you own, what you already installed, a version no reviewer approved, or anything suspended. Writes nothing.



## OpenAPI

````yaml https://api.doers.sh/openapi.json get /v2/marketplace/discover
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/marketplace/discover:
    get:
      tags:
        - Marketplace
      summary: Search the reviewed catalogue
      description: >-
        Approved Agents somebody else published, most curated first. Matches the
        approved name, summary, publisher handle and declared integrations.
        Several categories **widen** the result (OR); text and categories
        **narrow** each other (AND).


        Never returns what you own, what you already installed, a version no
        reviewer approved, or anything suspended. Writes nothing.
      operationId: discoverPackages
      parameters:
        - name: categories
          in: query
          required: false
          description: Category slugs. Several widen the result rather than narrowing it.
          schema:
            type: array
            items:
              type: string
            maxItems: 9
        - name: cursor
          in: query
          required: false
          description: 'From a previous page''s `nextCursor`. Opaque: do not construct one.'
          schema:
            type: string
            maxLength: 512
        - name: limit
          in: query
          required: false
          description: How many to return. The app asks for one page at a time.
          schema:
            type: integer
            default: 24
            minimum: 1
            maximum: 48
        - name: query
          in: query
          required: false
          description: >-
            Free text over name, summary, publisher handle and declared
            integrations.
          schema:
            type: string
            maxLength: 200
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  listings:
                    type: array
                    items:
                      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.
                        name:
                          type: string
                        emoji:
                          anyOf:
                            - type: string
                            - type: 'null'
                        summary:
                          type: string
                        version:
                          type: integer
                          minimum: -9007199254740991
                          maximum: 9007199254740991
                        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
                        categories:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: string
                              slug:
                                type: string
                              label:
                                type: string
                              position:
                                type: integer
                                minimum: -9007199254740991
                                maximum: 9007199254740991
                            required:
                              - id
                              - slug
                              - label
                              - position
                            additionalProperties: false
                        licence:
                          anyOf:
                            - type: string
                              enum:
                                - mit
                                - cc-by-4.0
                            - type: 'null'
                        integrations:
                          type: array
                          items:
                            type: string
                          description: What the approved version declares it reaches.
                        installers:
                          type: integer
                          minimum: -9007199254740991
                          maximum: 9007199254740991
                          description: >-
                            Accounts that installed it, counted once each. See
                            `since`.
                        since:
                          anyOf:
                            - type: number
                              description: Epoch milliseconds.
                            - type: 'null'
                          description: >-
                            When installer counting began, or `null` when nobody
                            has installed it yet. Never a guess: earlier
                            installs are not in the count, and inventing a start
                            date would present an incomplete observation as a
                            lifetime total.
                        approvedAt:
                          type: number
                          description: Epoch milliseconds.
                      required:
                        - packageId
                        - kind
                        - name
                        - emoji
                        - summary
                        - version
                        - publisher
                        - categories
                        - licence
                        - integrations
                        - installers
                        - since
                        - approvedAt
                      additionalProperties: false
                  total:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                    description: Matches before `limit` is applied.
                  nextCursor:
                    anyOf:
                      - type: string
                      - type: 'null'
                    description: Opaque cursor for the next page, or null.
                required:
                  - listings
                  - total
                  - nextCursor
                additionalProperties: false
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '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.
    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.

````