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

# List catalog categories

> Flat, id-based list of category nodes (top groups, leaf categories, provider nodes) with live endpoint counts and the exact catalog total. Use the returned `id` values with `GET /public/v1/endpoints?category=…` (+ optional `q=`).



## OpenAPI

````yaml https://monid.ai/openapi.json get /public/v1/categories
openapi: 3.1.0
info:
  title: Monid API
  version: 0.1.0
  description: >-
    Agentic payment platform for data — agents discover and buy data on demand.
    Authenticated `/v1/*` routes accept a Monid API key or Clerk JWT as a Bearer
    token. All errors return `{ code, message }`. List endpoints use cursor
    pagination; consult each operation schema for its last-page cursor encoding.
servers:
  - url: https://api.monid.ai
    description: Production
  - url: https://monid.ai
    description: Public registry alias (public/v1 only)
security: []
paths:
  /public/v1/categories:
    get:
      tags:
        - Public Registry
      summary: List catalog categories
      description: >-
        Flat, id-based list of category nodes (top groups, leaf categories,
        provider nodes) with live endpoint counts and the exact catalog total.
        Use the returned `id` values with `GET /public/v1/endpoints?category=…`
        (+ optional `q=`).
      parameters:
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
            description: >-
              Filter by static eligibility for x402 payment (`POST
              /x402/v1/run`): `true` keeps only payable endpoints, `false` only
              non-payable ones. Omit for all endpoints.
          required: false
          description: >-
            Filter by static eligibility for x402 payment (`POST /x402/v1/run`):
            `true` keeps only payable endpoints, `false` only non-payable ones.
            Omit for all endpoints.
          name: supportsX402
          in: query
        - schema:
            type: string
            minLength: 1
            maxLength: 100
            description: >-
              Narrow to endpoints payable via x402 on this customer-payment
              network (CAIP-2 id, e.g. `eip155:8453`). Implies
              `supportsX402=true`; an unknown/unconfigured id returns an empty
              page.
            example: eip155:8453
          required: false
          description: >-
            Narrow to endpoints payable via x402 on this customer-payment
            network (CAIP-2 id, e.g. `eip155:8453`). Implies
            `supportsX402=true`; an unknown/unconfigured id returns an empty
            page.
          name: x402Network
          in: query
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
            description: >-
              Filter by whether running the endpoint can change your workspace
              resources (phone numbers, files, asset libraries): `true` keeps
              only endpoints that cannot create, modify or delete them, `false`
              only endpoints that can. Omit for all endpoints. This describes
              RESOURCE effects only — a readonly endpoint may still perform
              real-world actions and is still billed.
          required: false
          description: >-
            Filter by whether running the endpoint can change your workspace
            resources (phone numbers, files, asset libraries): `true` keeps only
            endpoints that cannot create, modify or delete them, `false` only
            endpoints that can. Omit for all endpoints. This describes RESOURCE
            effects only — a readonly endpoint may still perform real-world
            actions and is still billed.
          name: readonly
          in: query
        - schema:
            type: string
            description: >-
              Keep only endpoints whose run can have AT LEAST ONE of the named
              effects on your workspace resources (phone numbers, files, asset
              libraries): `creates`, `updates`, `deletes`. Omit for all
              endpoints. Takes precedence over `readonly` (`readonly=true` is
              the alias for "no write effects"). Resource effects only — an
              endpoint with no effect may still perform real-world actions and
              is still billed.
            example: creates,deletes
          required: false
          description: >-
            Keep only endpoints whose run can have AT LEAST ONE of the named
            effects on your workspace resources (phone numbers, files, asset
            libraries): `creates`, `updates`, `deletes`. Omit for all endpoints.
            Takes precedence over `readonly` (`readonly=true` is the alias for
            "no write effects"). Resource effects only — an endpoint with no
            effect may still perform real-world actions and is still billed.
          name: effects
          in: query
        - schema:
            type: string
            maxLength: 60
            pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$
            description: >-
              Node id filter. A TOP id returns the top plus its member nodes; a
              leaf/provider id returns that single node. Omit for every node.
            example: social-media
          required: false
          description: >-
            Node id filter. A TOP id returns the top plus its member nodes; a
            leaf/provider id returns that single node. Omit for every node.
          name: category
          in: query
        - schema:
            type: string
            minLength: 1
            maxLength: 200
            description: >-
              Optional free-text query — counts become per-node search hit
              counts (same BM25 semantics as `GET /public/v1/endpoints?q=`).
              Nodes with zero hits are omitted.
            example: twitter
          required: false
          description: >-
            Optional free-text query — counts become per-node search hit counts
            (same BM25 semantics as `GET /public/v1/endpoints?q=`). Nodes with
            zero hits are omitted.
          name: q
          in: query
      responses:
        '200':
          description: Category nodes
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicCategoriesResponse'
        '400':
          description: Bad request — input failed validation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    PublicCategoriesResponse:
      type: object
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/PublicCategoryNode'
          description: >-
            Flat node list: tops (priority order) then leaves/providers
            (alphabetical). Hidden, unlinked, and zero-count nodes omitted.
        totalEndpointCount:
          type: integer
          minimum: 0
          description: >-
            Exact number of catalog-visible endpoints (with `q`: matching the
            query) — drives the All rail count.
      required:
        - items
        - totalEndpointCount
    Error:
      type: object
      properties:
        code:
          type: integer
          description: HTTP status code, duplicated in the body.
          example: 400
        message:
          type: string
          description: Human-readable error description.
          example: Bad Request
        hints:
          type: object
          additionalProperties:
            anyOf:
              - type: string
              - type: object
                properties:
                  kind:
                    type: string
                    enum:
                      - command
                      - discover
                      - inspect
                      - run
                      - getRun
                      - stop
                      - releaseResource
                      - topup
                  command:
                    type: string
                  query:
                    type: string
                  provider:
                    type: string
                  endpoint:
                    type: string
                  runId:
                    type: string
                  resourceId:
                    type: string
                  stripe:
                    type: string
                  dashboard:
                    type: string
                  docs:
                    type: string
                  comment:
                    type: string
                required:
                  - kind
          description: >-
            Optional next actions, rendered for the calling client like
            run-response hints (e.g. the paid TinyFish version on a free-quota
            429 — spending permission required).
        errorCode:
          type: string
          enum:
            - RATE_LIMITED
            - X402_WORKSPACE_RESOURCES
            - X402_WORKSPACE_ONLY
            - X402_ACCRUING_COST
            - X402_EXCEEDS_SETTLEMENT_WINDOW
            - X402_VALIDITY_WINDOW_TOO_SHORT
            - X402_UNBOUNDED_PRICE
            - X402_PROMOTION
            - INSUFFICIENT_SCOPE
            - WALLET_INSUFFICIENT_FUNDS
            - IDENTITY_PROVIDER_UNKNOWN
            - IDENTITY_LINK_REQUIRES_SESSION
            - IDENTITY_LINK_STATE_INVALID
            - IDENTITY_VERIFICATION_FAILED
            - IDENTITY_PROVIDER_UNAVAILABLE
            - IDENTITY_ALREADY_LINKED
            - IDENTITY_USER_ALREADY_LINKED
            - IDENTITY_LINK_RATE_LIMITED
            - IDENTITY_REQUIRED
            - PROMO_IDENTITY_REDEEMED
            - PROMO_REDEEM_REQUIRES_SESSION
            - PROMO_CODE_REDEEMED_BY_WORKSPACE
            - PROMO_CODE_REDEEMED_BY_USER
          description: >-
            OPTIONAL machine-readable discriminant from the documented
            `ApiErrorCode` registry. Absent on legacy errors; clients MUST treat
            unknown values as absent.
      required:
        - code
        - message
    PublicCategoryNode:
      oneOf:
        - $ref: '#/components/schemas/TopCategoryNode'
        - $ref: '#/components/schemas/LeafCategoryNode'
        - $ref: '#/components/schemas/ProviderCategoryNode'
      discriminator:
        propertyName: kind
        mapping:
          top: '#/components/schemas/TopCategoryNode'
          category: '#/components/schemas/LeafCategoryNode'
          provider: '#/components/schemas/ProviderCategoryNode'
    TopCategoryNode:
      type: object
      properties:
        id:
          type: string
          description: Stable node id (e.g. "social-media", "twitter", "apify").
        displayName:
          type: string
          description: >-
            Display label — manifest copy for tops/leaves; resolved provider
            display name for provider nodes.
        description:
          type: string
          description: Short blurb, when available.
        endpointCount:
          type: integer
          minimum: 0
          description: >-
            Live endpoint count (with `q`: endpoints matching the query). Top
            counts are DISTINCT-document counts across their members.
        noMarkup:
          type: string
          enum:
            - all
            - partial
            - none
          description: >-
            `all`: every endpoint in this node is tagged `no-markup` (provider's
            standard rate, no platform fee). `partial`: at least half are.
            `none`: fewer than half. Same scope as `endpointCount`.
          example: all
        kind:
          type: string
          enum:
            - top
          description: System group node.
        children:
          type: array
          items:
            type: string
          description: >-
            Ordered member node ids (linked leaves in display order, then
            provider nodes).
      required:
        - id
        - displayName
        - endpointCount
        - noMarkup
        - kind
        - children
    LeafCategoryNode:
      type: object
      properties:
        id:
          type: string
          description: Stable node id (e.g. "social-media", "twitter", "apify").
        displayName:
          type: string
          description: >-
            Display label — manifest copy for tops/leaves; resolved provider
            display name for provider nodes.
        description:
          type: string
          description: Short blurb, when available.
        endpointCount:
          type: integer
          minimum: 0
          description: >-
            Live endpoint count (with `q`: endpoints matching the query). Top
            counts are DISTINCT-document counts across their members.
        noMarkup:
          type: string
          enum:
            - all
            - partial
            - none
          description: >-
            `all`: every endpoint in this node is tagged `no-markup` (provider's
            standard rate, no platform fee). `partial`: at least half are.
            `none`: fewer than half. Same scope as `endpointCount`.
          example: all
        kind:
          type: string
          enum:
            - category
          description: Leaf category node.
        shortDescription:
          type: string
          description: >-
            Short tile copy (at most 88 characters) for the Tools directory
            tile. Authored separately from `description`, which stays the
            category/provider page copy.
          example: Profiles, posts, hashtags and comments from Instagram.
        parents:
          type: array
          items:
            type: string
          description: Top ids this leaf is linked under (a leaf may have several parents).
      required:
        - id
        - displayName
        - endpointCount
        - noMarkup
        - kind
        - shortDescription
        - parents
    ProviderCategoryNode:
      type: object
      properties:
        id:
          type: string
          description: Stable node id (e.g. "social-media", "twitter", "apify").
        displayName:
          type: string
          description: >-
            Display label — manifest copy for tops/leaves; resolved provider
            display name for provider nodes.
        description:
          type: string
          description: Short blurb, when available.
        endpointCount:
          type: integer
          minimum: 0
          description: >-
            Live endpoint count (with `q`: endpoints matching the query). Top
            counts are DISTINCT-document counts across their members.
        noMarkup:
          type: string
          enum:
            - all
            - partial
            - none
          description: >-
            `all`: every endpoint in this node is tagged `no-markup` (provider's
            standard rate, no platform fee). `partial`: at least half are.
            `none`: fewer than half. Same scope as `endpointCount`.
          example: all
        kind:
          type: string
          enum:
            - provider
          description: Derived provider node.
        shortDescription:
          type: string
          description: >-
            Short tile copy (at most 88 characters) for the Tools directory
            tile. Authored separately from `description`, which stays the
            category/provider page copy.
          example: AI-powered web search with page content, highlights and summaries.
        provider:
          type: string
          description: Provider slug.
        url:
          type: string
          format: uri
          description: >-
            The provider's own public website, when it declares one
            (`ProviderInfo.url`). Absent otherwise — never null, never empty.
            Provider nodes only: a leaf/top category has no vendor to link to.
            This is display copy, NOT the endpoint-level documentation URL
            (`docUrl`).
          example: https://context.dev
        docsUrl:
          type: string
          format: uri
          description: >-
            The provider's own API documentation, when known
            (`ProviderInfo.docsUrl`). Provider nodes only; absent otherwise.
          example: https://docs.context.dev
        parents:
          type: array
          items:
            type: string
          description: >-
            Top ids this provider node is linked under (a node may have several
            parents).
        promotion:
          type: object
          properties:
            discountPercent:
              type: integer
              example: 50
          required:
            - discountPercent
          description: >-
            Present ONLY while this provider runs an ACTIVE limited-time
            promotion (`/promo/...` endpoints) — the tile's "N% OFF" tag.
            Provider nodes only.
      required:
        - id
        - displayName
        - endpointCount
        - noMarkup
        - kind
        - shortDescription
        - provider
        - parents

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.