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

# List digital products

> Returns a paginated list of the store's digital products (PDFs, books and other downloads), newest first.

Returns a paginated list of the store's digital products, newest first, with the category populated. Supports `search` (name and author), `listed`, `featured` and `category` filters. Requires the `READ_INVENTORY` scope.

The list is under `data.digitals`. Each item carries two extra counters that single reads do not: `sales` (paid or completed order lines) and `activeAccess` (buyers who can download it right now). The private file id is never returned: `file.attached` says whether a file is set.

<Note>
  These endpoints only work on a store whose type is `digital`. On any other store they return `403` with `This is only available on digital stores.` See [Digital stores](/digital-stores).
</Note>

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET https://api.salesive.com/api/v1/digital-products?search=cookbook&limit=20 \
    -H "Authorization: Bearer app_<your-app-access-token>"
  ```
</CodeGroup>


## OpenAPI

````yaml apps-api/specs/digital.json GET /digital-products
openapi: 3.1.0
info:
  title: Salesive Apps API , Digital products
  description: >-
    Digital store endpoints (products, the all-access pass and buyer access)
    callable by an installed third-party app using its app access token. They
    only work on stores whose type is `digital`. The target store is bound to
    the token server-side by the OAuth install flow.
  version: 1.0.0
servers:
  - url: https://api.salesive.com/api/v1
    description: Production
security:
  - AppToken: []
paths:
  /digital-products:
    get:
      tags:
        - digital-products
      summary: List digital products
      description: >-
        Returns a paginated list of the store's digital products (PDFs, books
        and other downloads), newest first, with the category populated. Each
        item also carries `sales` and `activeAccess`. The private file id is
        never returned. Requires the `READ_INVENTORY` scope. The store must be a
        digital store, otherwise the call returns 403.
      operationId: listDigitalProducts
      parameters:
        - name: page
          in: query
          required: false
          schema:
            type: integer
            default: 1
            minimum: 1
          description: Page number (1-based).
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            default: 20
            minimum: 1
            maximum: 100
          description: Items per page, 1 to 100.
        - name: search
          in: query
          required: false
          schema:
            type: string
          description: Case-insensitive match on name and author.
        - name: listed
          in: query
          required: false
          schema:
            type: boolean
          description: Filter by listed status.
        - name: featured
          in: query
          required: false
          schema:
            type: boolean
          description: Filter by featured status.
        - name: category
          in: query
          required: false
          schema:
            type: string
          description: Filter by category ObjectId.
      responses:
        '200':
          description: 'List digital products: success.'
          content:
            application/json:
              schema:
                type: object
                required:
                  - status
                  - success
                  - message
                  - data
                properties:
                  status:
                    type: integer
                    example: 200
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: Digital products retrieved successfully
                  data:
                    type: object
                    properties:
                      digitals:
                        type: array
                        items:
                          $ref: '#/components/schemas/DigitalProductListItem'
                      pagination:
                        $ref: '#/components/schemas/Pagination'
                    example:
                      digitals:
                        - _id: 6702c1a4e1b3a40012cd2001
                          shop: 66a1eee0e1b3a40012ab0001
                          name: The Lagos Cookbook
                          description: >-
                            120 everyday Nigerian recipes, with a shopping list
                            for each week.
                          author: Ngozi Okafor
                          images:
                            - >-
                              https://cdn.salesive.com/d/lagos-cookbook-cover.jpg
                          category:
                            _id: 66a2a0aae1b3a40012cd0001
                            name: Cookbooks
                            slug: cookbooks
                          access: both
                          pricing:
                            oneTime: 4500
                            monthly: 1500
                          price: 1500
                          inPass: true
                          file:
                            name: lagos-cookbook.pdf
                            size: 8421376
                            format: pdf
                            mimetype: application/pdf
                            attached: true
                          preview:
                            enabled: true
                            pages: 3
                          listed: true
                          featured: false
                          createdAt: '2026-10-11T09:12:00.000Z'
                          updatedAt: '2026-10-11T09:30:00.000Z'
                          sales: 14
                          activeAccess: 9
                      pagination:
                        total: 1
                        page: 1
                        limit: 20
                        pages: 1
                        hasNext: false
                        hasPrev: false
                        nextPage: null
                        prevPage: null
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
components:
  schemas:
    DigitalProductListItem:
      type: object
      properties:
        _id:
          type: string
        shop:
          type: string
          description: The store id (always the installing store).
        name:
          type: string
          description: Product name (max 120 characters).
        description:
          type: string
          description: Description (max 10,000 characters).
        author:
          type: string
          description: Author or publisher (max 120 characters).
        images:
          type: array
          items:
            type: string
          description: Cover image links (max 10). The first is the main cover.
        category:
          description: >-
            Category. Populated as `{ _id, name, slug }` on reads, `null` when
            none.
          nullable: true
          oneOf:
            - type: string
              description: Category ObjectId.
            - type: object
              properties:
                _id:
                  type: string
                name:
                  type: string
                slug:
                  type: string
        access:
          type: string
          enum:
            - purchase
            - subscription
            - both
          description: >-
            How buyers get the product: `purchase` (one-time payment, permanent
            access), `subscription` (a 30-day pass for this product) or `both`
            (the buyer picks).
        pricing:
          type: object
          properties:
            oneTime:
              type: number
              nullable: true
              description: >-
                One-time price in the store currency. `null` unless `access` is
                `purchase` or `both`.
            monthly:
              type: number
              nullable: true
              description: >-
                Price for a 30-day pass. `null` unless `access` is
                `subscription` or `both`.
        price:
          type: number
          description: >-
            Derived, read-only: the cheapest way in (the lower of
            `pricing.oneTime` and `pricing.monthly`). Storefront cards show
            this.
        inPass:
          type: boolean
          description: Whether the product is covered by the store's all-access pass.
        file:
          type: object
          description: >-
            The private file buyers download. The file id is never returned:
            `attached` says whether one is set.
          properties:
            name:
              type: string
              description: Original file name.
            size:
              type: integer
              description: Size in bytes.
            format:
              type: string
              enum:
                - pdf
                - epub
                - mobi
                - zip
              nullable: true
            mimetype:
              type: string
            attached:
              type: boolean
              description: '`true` when a file is attached.'
        preview:
          $ref: '#/components/schemas/DigitalPreview'
        listed:
          type: boolean
          description: >-
            Whether the product shows in the storefront. A product without a
            file cannot be listed.
        featured:
          type: boolean
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        sales:
          type: integer
          description: >-
            Paid or completed order lines for this product (list responses
            only).
        activeAccess:
          type: integer
          description: >-
            Buyers who can download it right now: lifetime and unexpired product
            passes (list responses only).
    Pagination:
      type: object
      description: Pagination metadata.
      properties:
        total:
          type: integer
          description: Total number of matching items.
        page:
          type: integer
          description: Current page (1-based).
        pages:
          type: integer
          description: Total number of pages.
        limit:
          type: integer
          description: Items per page.
        hasNext:
          type: boolean
        hasPrev:
          type: boolean
        nextPage:
          type: integer
          nullable: true
        prevPage:
          type: integer
          nullable: true
    DigitalPreview:
      type: object
      description: >-
        The free preview of a PDF book: the first `pages` pages, cut on demand.
        A product with no stored preview setting reads as `{ enabled: true,
        pages: 3 }`.
      properties:
        enabled:
          type: boolean
          description: Whether buyers can open the free preview. Default `true`.
        pages:
          type: integer
          minimum: 1
          maximum: 20
          description: >-
            How many pages to show, 1 to 20 (default 3). The storefront never
            shows more than half of the book. A value outside 1 to 20, or a
            fraction, returns 400 and nothing changes.
  responses:
    BadRequest:
      description: The body or query failed validation. `message` says which rule.
      content:
        application/json:
          schema:
            type: object
            properties:
              status:
                type: integer
                example: 400
              success:
                type: boolean
                example: false
              message:
                type: string
                example: A one-time price is required
              data:
                type: object
                nullable: true
    Unauthorized:
      description: Missing or invalid app access token.
      content:
        application/json:
          schema:
            type: object
            properties:
              status:
                type: integer
                example: 401
              success:
                type: boolean
                example: false
              message:
                type: string
                example: App token expired or invalid.
              data:
                type: object
                nullable: true
    Forbidden:
      description: >-
        The app token lacks the required scope (`READ_INVENTORY` for reads,
        `WRITE_INVENTORY` for writes), or the store is not a digital store
        (`This is only available on digital stores.`).
      content:
        application/json:
          schema:
            type: object
            properties:
              status:
                type: integer
                example: 403
              success:
                type: boolean
                example: false
              message:
                type: string
                example: >-
                  This app is missing the required permission(s):
                  WRITE_INVENTORY
              data:
                type: object
                nullable: true
  securitySchemes:
    AppToken:
      type: http
      scheme: bearer
      description: >-
        Installed-app access token (prefix app_), issued by the OAuth install
        flow. The store is bound to the token server-side , never send a shop
        id.

````

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