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

# Get a digital product

> Retrieves a single digital product by id.

Retrieves one digital product by id, scoped to the store, with the category populated. Returns `404` if it is not in this store or was deleted. Requires the `READ_INVENTORY` scope.

<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/6702c1a4e1b3a40012cd2001 \
    -H "Authorization: Bearer app_<your-app-access-token>"
  ```
</CodeGroup>


## OpenAPI

````yaml apps-api/specs/digital.json GET /digital-products/{id}
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/{id}:
    get:
      tags:
        - digital-products
      summary: Get a digital product
      description: >-
        Retrieves one digital product by id, with the category populated.
        Returns 404 if it is not in this store or has been deleted. Requires the
        `READ_INVENTORY` scope. The store must be a digital store, otherwise the
        call returns 403.
      operationId: getDigitalProduct
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: The digital product's ObjectId.
      responses:
        '200':
          description: 'Get a digital product: 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 product retrieved successfully
                  data:
                    allOf:
                      - $ref: '#/components/schemas/DigitalProduct'
                    example:
                      _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'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    DigitalProduct:
      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
    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:
    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
    NotFound:
      description: The record does not exist in this store.
      content:
        application/json:
          schema:
            type: object
            properties:
              status:
                type: integer
                example: 404
              success:
                type: boolean
                example: false
              message:
                type: string
                example: Product not found
              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.