---
title: "Update a product. Roles: admin."
method: PUT
path: "/api/products/{productId}"
tags: ["Products"]
---

# Update a product. Roles: admin.

`PUT /api/products/{productId}`

## Path parameters

- `productId` integer, required

## Query parameters

- `locale` string

## Request body

- ProductRequest
  - `typeCode` 'CERT' | 'COURSE' | 'EVENT', required
  - `membershipId` integer
  - `detail` string
  - `imageUuid` string, uuid
  - `price` integer, required
  - `currency` 'AED' | 'ARS' | 'AUD' | 'CAD' | 'CHF' | 'CLP' | 'CNY' | 'EUR' | 'GBP' | 'INR' | 'JPY' | 'KRW' | 'MYR' | 'NZD' | 'PKR' | 'SGD' | 'USD' | 'ZAR', required
  - `active` boolean
  - `recurring` boolean
  - `allowProrate` boolean
  - `name` string, required
  - `eventId` integer
  - `certId` integer
  - `contentId` integer
  - `salesStartTime` string, date-time
  - `salesEndTime` string, date-time
  - `eventCheckInStartTime` string, date-time
  - `eventCheckInEndTime` string, date-time
  - `taxEnabled` boolean, required
  - `taxCode` string
  - `enrollmentScopeCode` 'ENROLL' | 'ENROLL_AND_RENEW' | 'RENEW'
  - `audience` AudienceIdRequest
    - `audienceId` integer, required
  - `audiencePromo` AudiencePromoRequest
    - `contentId` integer, required
    - `actionText` string

## Response `200`

OK

- ProductResponse
  - `success` boolean
  - `error` string
  - `product` ProductFull
    - `audit` Audit
      - `createdTime` string, date-time
      - `modifiedTime` string, date-time
      - `modifiedBy` string
    - `productId` integer
    - `membershipId` integer
    - `name` string
    - `detail` string
    - `currency` 'AED' | 'ARS' | 'AUD' | 'CAD' | 'CHF' | 'CLP' | 'CNY' | 'EUR' | 'GBP' | 'INR' | 'JPY' | 'KRW' | 'MYR' | 'NZD' | 'PKR' | 'SGD' | 'USD' | 'ZAR'
    - `price` integer
    - `imageUuid` string, uuid
    - `typeCode` 'CERT' | 'COURSE' | 'EVENT'
    - `salesStartTime` string, date-time
    - `salesEndTime` string, date-time
    - `eventCheckInStartTime` string, date-time
    - `eventCheckInEndTime` string, date-time
    - `availableForSale` boolean
    - `availableForCheckIn` boolean
    - `active` boolean
    - `recurring` boolean
    - `recurringInterval` 'DAY' | 'WEEK' | 'MONTH' | 'YEAR'
    - `recurringIntervalCount` integer
    - `allowProrate` boolean
    - `taxEnabled` boolean
    - `taxCode` string
    - `enrollmentScopeCode` 'ENROLL' | 'ENROLL_AND_RENEW' | 'RENEW'
    - `audiencePromo` AudiencePromo
      - `contentId` integer
      - `actionText` string
      - `localizedValues` AudiencePromoLocaleValues
        - `actionText` string
    - `previewing` boolean
    - `qualifiedName` string
    - `audience` AudienceCore
      - `audit` Audit
        - `createdTime` string, date-time
        - `modifiedTime` string, date-time
        - `modifiedBy` string
      - `audienceId` integer
      - `membershipId` integer
      - `name` string
      - `criterionType` 'COMPOUND' | 'COURSE' | 'GROUP' | 'IDENTITY_PROVIDER' | 'PROFILE_QUESTION' | 'PROGRAM'
      - `criterionOperator` 'AND' | 'OR' | 'EQUALS' | 'NOT_EQUALS'
      - `criterionValue` string
      - `invalidTime` string, date-time
      - `groupDescendantsIncluded` boolean
      - `idpPluginId` integer
    - `event` EventSlim
      - `audit` Audit
        - `createdTime` string, date-time
        - `modifiedTime` string, date-time
        - `modifiedBy` string
      - `alternateLocales` object
        - `empty` boolean
      - `eventId` integer
      - `membershipId` integer
      - `attendanceTypeCode` 'IN_PERSON' | 'VIRTUAL'
      - `registrationTypeCode` 'OPEN' | 'REGISTRATION' | 'REGISTRATION_WITH_RSVP' | 'TICKETED'
      - `eventSeries` EventSeriesFull
        - `audit` Audit
          - `createdTime` string, date-time
          - `modifiedTime` string, date-time
          - `modifiedBy` string
        - `eventSeriesId` integer
        - `period` 'DAILY' | 'WEEKLY'
        - `stepSize` integer
        - `endDate` string, date
        - `endCount` integer
      - `title` string
      - `description` string
      - `body` string
      - `externalBody` string
      - `location` string
      - `startDateTime` string, date-time
      - `endDateTime` string, date-time
      - `registrationOpenDateTime` string, date-time
      - `registrationCloseDateTime` string, date-time
      - `timeZoneId` string
      - `allDay` boolean
      - `credits` number
      - `published` boolean
      - `unlisted` boolean
      - `allowViewRegistrations` boolean
      - `registrationTicketingEnabled` boolean
      - `dependentRegistrationEnabled` boolean
      - `cancelled` boolean
      - `external` boolean
      - `imageUuid` string, uuid
      - `contactLabel` string
      - `contactUrl` string
      - `audienceId` integer
      - `audiencePromo` AudiencePromo
        - `contentId` integer
        - `actionText` string
        - `localizedValues` AudiencePromoLocaleValues
          - `actionText` string
      - `reminder1Minutes` integer
      - `reminder2Minutes` integer
      - `emailRemindersEnabled` boolean
      - `registrationsMax` integer
      - `registrationsMaxWarningThreshold` integer
      - `previewing` boolean
      - `locale` string
    - `cert` CertCore
      - `audit` Audit
        - `createdTime` string, date-time
        - `modifiedTime` string, date-time
        - `modifiedBy` string
      - `alternateLocales` object
        - `empty` boolean
      - `certId` integer
      - `membershipId` integer
      - `typeCode` 'CERTIFICATION' | 'CHALLENGE' | 'MEMBERSHIP' | 'PASS'
      - `name` string
      - `shortDescription` string
      - `description` string
      - `external` boolean
      - `required` boolean
      - `audienceId` integer
      - `externalPluginId` integer
      - `externalId` string
      - `externalReferenceId` string
      - `allowAdminEnroll` boolean
      - `allowSelfEnroll` boolean
      - `autoEnrollEnabled` boolean
      - `autoRenewalEnabled` boolean
      - `isOpen` boolean
      - `unlisted` boolean
      - `credits` number
      - `pointsRequired` number, float
      - `renewalPointsRequired` number, float
      - `completionStrategy` 'ALL_PREREQ_COMPLETE' | 'ANY_PREREQ_COMPLETE' | 'EARNED_REQUIRED_POINTS'
      - `renewalStrategy` 'ALL_PREREQ_COMPLETE' | 'ANY_PREREQ_COMPLETE' | 'EARNED_REQUIRED_POINTS'
      - `certificateUuid` string, uuid
      - `certificatesEnabled` boolean
      - `enrollmentNotificationsEnabled` boolean
      - `completionNotificationsEnabled` boolean
      - `imageUuid` string, uuid
      - `openDate` string, date
      - `closeDate` string, date
      - `termIntervalCode` 'DAY' | 'WEEK' | 'MONTH' | 'YEAR'
      - `termIntervalCount` integer
      - `termStartCode` 'EARN' | 'ENROLL' | 'FIRST_EARN' | 'FIRST_ENROLL' | 'ANCHOR'
      - `expireReminderDays` integer
      - `earlyRenewalDays` integer
      - `renewalGracePeriodDays` integer
      - `renewalAnchorDate` string, date
      - `emailCompletionBody` string
      - `tier` integer
      - `benefitTypeCode` 'PHYSICAL' | 'VIRTUAL' | 'HYBRID'
      - `programCategory` ProgramCategoryCore
        - `audit` Audit
          - `createdTime` string, date-time
          - `modifiedTime` string, date-time
          - `modifiedBy` string
        - `alternateLocales` object
          - `empty` boolean
        - `programCategoryId` integer
        - `membershipId` integer
        - `typeCode` 'CERTIFICATION' | 'CHALLENGE' | 'MEMBERSHIP' | 'PASS'
        - `name` string
        - `description` string
        - `required` boolean
        - `tierBehaviorCode` 'NONE' | 'REPLACE_ON_ENROLL' | 'REPLACE_ON_COMPLETION'
        - `downgradePolicyCode` 'NEVER' | 'DURING_RENEWAL' | 'ALWAYS_NO_REFUND' | 'ALWAYS_REFUND' | 'ALWAYS_REFUND_LESS_FEES'
        - `locale` string
      - `memberCert` MemberCertCore
        - `audit` Audit
          - `createdTime` string, date-time
          - `modifiedTime` string, date-time
          - `modifiedBy` string
        - `token` string, uuid
        - `enrollDate` string, date
        - `firstEnrollDate` string, date
        - `startDate` string, date
        - `earnDate` string, date
        - `firstEarnDate` string, date
        - `renewalEligibleDate` string, date
        - `expireDate` string, date
        - `failDate` string, date
        - `endDate` string, date
        - `creditsEarned` number
        - `pointsEarned` number, float
        - `status` 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETED' | 'FAILED' | 'EXPIRED'
        - `externalEnrollmentId` string
        - `renewable` boolean
        - `expiresSoon` boolean
      - `locale` string
    - `course` CourseCore
      - `audit` Audit
        - `createdTime` string, date-time
        - `modifiedTime` string, date-time
        - `modifiedBy` string
      - `alternateLocales` object
        - `empty` boolean
      - `contentId` integer
      - `contentType` string
      - `membershipId` integer
      - `detail` string
      - `previewing` boolean
      - `subTitle` string
      - `thumbnailImageUuid` string, uuid
      - `title` string
      - `keywords` string
      - `body` string
      - `properties` object
      - `externalPluginId` integer
      - `externalId` string
      - `externalReferenceId` string
      - `certificateUuid` string, uuid
      - `credits` number
      - `courseEmailCompletionBody` string
      - `termIntervalCode` 'DAY' | 'WEEK' | 'MONTH' | 'YEAR'
      - `termIntervalCount` integer
      - `earlyRenewalDays` integer
      - `locale` string
      - `certificatesEnabled` boolean
      - `allowAdminEnroll` boolean
      - `allowSelfEnroll` boolean
      - `allowSelfEnrollReset` boolean
      - `enrollmentNotificationsEnabled` boolean
      - `completionNotificationsEnabled` boolean
      - `creditsRepeatable` boolean
      - `isPublished` boolean
    - `programScopeCode` 'ENROLL' | 'ENROLL_AND_RENEW' | 'RENEW'

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not found
- `500` — Internal server error

## Changes

- **2026-09-02** `870f28ba2607` — 5 info
  - added the optional property `error/errorId` to the response with the `400` status
  - added the optional property `error/errorId` to the response with the `401` status
  - added the optional property `error/errorId` to the response with the `403` status
  - added the optional property `error/errorId` to the response with the `404` status
  - …1 more

[Change history](https://skmtc.dev/mobilecoach/apis/untitled-api/changes/api/products/:productId/put.md)

---

[API](https://skmtc.dev/mobilecoach/apis/untitled-api.md) · [All operations](https://skmtc.dev/mobilecoach/apis/untitled-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/mobilecoach/untitled-api/revisions/870f28ba2607/schema)
