This article presents possible use cases and corresponding sample flows that you can support. It provides a useful starting point as you plan your implementation.
When a user changes content, you can review the change before deciding whether it should stand. The review request gives you both the live version and the proposed version, so you can see exactly what is changing.
To review a content change:
action to see what the user did.currentDataItem, the live version, with proposedDataItem, the version submitted for approval. For PUBLISH_DRAFT, only proposedDataItem is present. For UNPUBLISH_PUBLISHED, only currentDataItem is present.UNPUBLISH_CHANGED, read versionOnUnpublish when present to determine whether the user requested to preserve the latest draft edits or the live published version.submittedByUserId and submittedAt to record who submitted the change and when.When a user submits several items from the same collection at once, the whole selection arrives as one event instead of one event per item. This keeps a multi-item submission together, so you can review it as the single unit of work the user intended.
To review a batch of content changes:
collectionId and one entry per item, and you receive a single Bulk Review Requested event.bulkComplianceReviewRequest.complianceReviewRequests to get every review request in the batch, in the order the items were submitted.action, because a single batch can combine actions. Compare currentDataItem and proposedDataItem per request exactly as you would for a single review.Once a reviewer accepts a change, the content still has to go live. Approving a review request applies the action the user originally requested, so you don't have to work out which CMS call each item needs.
To approve a content change and publish it:
UNPUBLISH_CHANGED request, set versionOnUnpublish to KEEP_LATEST_DRAFT_VERSION or KEEP_LIVE_PUBLISHED_VERSION, depending on which version the reviewer wants preserved as the saved draft.prodCollectionId and the accepted requests as items. Each item's action is applied: publish items go live, and unpublish items are retracted.publishResult and unpublishResult to confirm the content change for each item, matching entries to your request through itemMetadata.originalIndex.statusUpdateResults to confirm each item's requestReviewStatus is now APPROVED. Read it here rather than from the returned review requests, whose data items are read before the status is written. Don't treat the status as proof the content changed: a PUBLISH_* item's status is set before it's published, so it can be APPROVED with its publish still having failed. Retry any item that publishResult or unpublishResult reports as failed.When a reviewer turns a change down, the content must stay as it is while the decision is still recorded. Rejecting a review request writes the decision to the data item without touching its content.
To reject a content change:
prodCollectionId and the rejected requests as items. Nothing is published or unpublished, so each item's content is left exactly as it was.statusUpdateResults to confirm each item's requestReviewStatus is now REJECTED, matching entries to your request through itemMetadata.originalIndex. As with approving, read the status here rather than from the returned review requests.If you maintain an external audit or compliance system, you can keep it in sync with every reviewable content change on the site.
To forward content changes to an external system:
complianceReviewRequest object, or for a batch, each object in bulkComplianceReviewRequest.complianceReviewRequests. Include the action, currentDataItem, proposedDataItem, optional versionOnUnpublish, and submittedByUserId.Last updated: 18 October 2026