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

# Review explicit menu/location/channel targets and retained releases



## OpenAPI

````yaml /generated/catalog-workspace.openapi.json post /api/v1/catalog/workspace/publication-review
openapi: 3.0.3
info:
  title: Staff Menu Manager authoring
  version: 1.0.0
  description: >-
    Persistent tenant-scoped library/relationship authoring and scoped
    publication review. Prices and POS structure retain their existing
    authority. Food Unknown is null; a nullable override inherits while []
    disables inherited rules. Publication and menu-aware public serving activate
    together through S1.
servers: []
security: []
paths:
  /api/v1/catalog/workspace/publication-review:
    post:
      summary: Review explicit menu/location/channel targets and retained releases
      operationId: catalogPublicationReview
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CatalogPublicationReviewRequest'
      responses:
        '200':
          description: >-
            Committed authoring evidence or read-only review; no publication is
            activated by a review.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CatalogPublicationReview'
        '400':
          description: Invalid shape, units or identifier.
        '401':
          description: >-
            A current merchant staff session is required. Machine credentials
            are not admitted.
        '403':
          description: >-
            Current organization role/location grant or POS authority forbids
            the operation.
        '404':
          description: The record or location does not exist in the authorized tenant.
        '409':
          description: >-
            CATALOG_DRAFT_STALE_REVISION: refresh the current draft before
            retrying.
        '422':
          description: >-
            Invalid references, non-ready publication evidence or semantic
            validation blockers.
      security:
        - StaffSession: []
components:
  schemas:
    CatalogPublicationReviewRequest:
      type: object
      properties:
        expectedDraftRevision:
          type: integer
          minimum: 0
          exclusiveMinimum: true
          maximum: 9007199254740991
        targets:
          minItems: 1
          maxItems: 1000
          type: array
          items:
            type: object
            properties:
              menuId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              locationId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              channel:
                type: string
                enum:
                  - online
                  - catering
            required:
              - menuId
              - locationId
              - channel
            additionalProperties: false
      required:
        - expectedDraftRevision
        - targets
      additionalProperties: false
    CatalogPublicationReview:
      type: object
      properties:
        draftRevision:
          type: integer
          minimum: 0
          exclusiveMinimum: true
          maximum: 9007199254740991
        targets:
          minItems: 1
          maxItems: 1000
          type: array
          items:
            type: object
            properties:
              menuId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              locationId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              channel:
                type: string
                enum:
                  - online
                  - catering
              menuReleaseId:
                nullable: true
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              targetRevision:
                type: integer
                minimum: 0
                maximum: 9007199254740991
            required:
              - menuId
              - locationId
              - channel
              - menuReleaseId
              - targetRevision
            additionalProperties: false
        retained:
          maxItems: 10000
          type: array
          items:
            type: object
            properties:
              menuId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              locationId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              channel:
                type: string
                enum:
                  - online
                  - catering
              menuReleaseId:
                nullable: true
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              targetRevision:
                type: integer
                minimum: 0
                maximum: 9007199254740991
            required:
              - menuId
              - locationId
              - channel
              - menuReleaseId
              - targetRevision
            additionalProperties: false
        changes:
          maxItems: 1000
          type: array
          items:
            type: object
            properties:
              target:
                type: object
                properties:
                  menuId:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  locationId:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  channel:
                    type: string
                    enum:
                      - online
                      - catering
                required:
                  - menuId
                  - locationId
                  - channel
                additionalProperties: false
              addedEntityIds:
                type: array
                items:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              changedEntityIds:
                type: array
                items:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              removedEntityIds:
                type: array
                items:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              reorderedParentIds:
                type: array
                items:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              effectiveChanges:
                maxItems: 50000
                type: array
                items:
                  oneOf:
                    - type: object
                      properties:
                        kind:
                          type: string
                          enum:
                            - price
                        entityId:
                          type: string
                          format: uuid
                          pattern: >-
                            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                        before:
                          nullable: true
                          type: object
                          properties:
                            amount:
                              type: string
                              pattern: ^(0|[1-9]\d*)(?:\.\d{1,4})?$
                            currency:
                              type: string
                              pattern: ^[A-Z]{3}$
                            origin:
                              type: string
                              enum:
                                - default
                                - location_override
                                - provider
                          required:
                            - amount
                            - currency
                            - origin
                          additionalProperties: false
                        after:
                          nullable: true
                          type: object
                          properties:
                            amount:
                              type: string
                              pattern: ^(0|[1-9]\d*)(?:\.\d{1,4})?$
                            currency:
                              type: string
                              pattern: ^[A-Z]{3}$
                            origin:
                              type: string
                              enum:
                                - default
                                - location_override
                                - provider
                          required:
                            - amount
                            - currency
                            - origin
                          additionalProperties: false
                      required:
                        - kind
                        - entityId
                        - before
                        - after
                      additionalProperties: false
                    - type: object
                      properties:
                        kind:
                          type: string
                          enum:
                            - item_schedule
                        entityId:
                          type: string
                          format: uuid
                          pattern: >-
                            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                      required:
                        - kind
                        - entityId
                      additionalProperties: false
                    - type: object
                      properties:
                        kind:
                          type: string
                          enum:
                            - menu_schedule
                        entityId:
                          type: string
                          format: uuid
                          pattern: >-
                            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                      required:
                        - kind
                        - entityId
                      additionalProperties: false
                    - type: object
                      properties:
                        kind:
                          type: string
                          enum:
                            - pos_hours
                      required:
                        - kind
                      additionalProperties: false
            required:
              - target
              - addedEntityIds
              - changedEntityIds
              - removedEntityIds
              - reorderedParentIds
              - effectiveChanges
            additionalProperties: false
        blockers:
          maxItems: 100000
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                minLength: 1
                maxLength: 128
              message:
                type: string
                minLength: 1
                maxLength: 2000
              entityId:
                nullable: true
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              target:
                nullable: true
                type: object
                properties:
                  menuId:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  locationId:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  channel:
                    type: string
                    enum:
                      - online
                      - catering
                required:
                  - menuId
                  - locationId
                  - channel
                additionalProperties: false
            required:
              - code
              - message
              - entityId
              - target
            additionalProperties: false
        warnings:
          maxItems: 100000
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                minLength: 1
                maxLength: 128
              message:
                type: string
                minLength: 1
                maxLength: 2000
              entityId:
                nullable: true
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              target:
                nullable: true
                type: object
                properties:
                  menuId:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  locationId:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  channel:
                    type: string
                    enum:
                      - online
                      - catering
                required:
                  - menuId
                  - locationId
                  - channel
                additionalProperties: false
            required:
              - code
              - message
              - entityId
              - target
            additionalProperties: false
        confirmationToken:
          type: string
          pattern: ^[a-f0-9]{64}$
      required:
        - draftRevision
        - targets
        - retained
        - changes
        - blockers
        - warnings
        - confirmationToken
      additionalProperties: false
  securitySchemes:
    StaffSession:
      type: http
      scheme: bearer
      bearerFormat: JWT

````

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