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

# Set a digital product featured

> Marks a digital product as featured, or removes the mark.

Marks a digital product as featured on the storefront, or removes the mark. Requires the `WRITE_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 PATCH https://api.salesive.com/api/v1/digital-products/6702c1a4e1b3a40012cd2001/featured \
    -H "Authorization: Bearer app_<your-app-access-token>" \
    -H "Content-Type: application/json" \
    -d '{"featured":true}'
  ```
</CodeGroup>


## OpenAPI

````yaml apps-api/specs/digital.json PATCH /digital-products/{id}/featured
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}/featured:
    patch:
      tags:
        - digital-products
      summary: Set a digital product featured
      description: >-
        Marks a digital product as featured, or removes the mark. Requires the
        `WRITE_INVENTORY` scope. The store must be a digital store, otherwise
        the call returns 403.
      operationId: setDigitalProductFeatured
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: The digital product's ObjectId.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - featured
              properties:
                featured:
                  type: boolean
              example:
                featured: true
      responses:
        '200':
          description: 'Set a digital product featured: 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 updated 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: true
                      createdAt: '2026-10-11T09:12:00.000Z'
                      updatedAt: '2026-10-11T09:30:00.000Z'
        '400':
          $ref: '#/components/responses/BadRequest'
        '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:
    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
    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.