approval_status | yes | string | review, approved, denied, approved_changed, denied_changed | Approval status the product holds after this transition. approved_changed / denied_changed mean the creator edited content on an approved or denied product and it is queued for re-review. | |
approved_at | no | `string | null` | - | When this product was most recently approved, or null if it never has been. Retained across later transitions — use occurred_at for the time of this change. |
denial_reason | no | `string | null` | - | Human-readable reason recorded with a denial, in English; null on every other transition. Wording can change — branch on denial_reason_code instead. |
denial_reason_code | no | `string | null` | picture_missing, wrong_category, promo_url_missing, promo_url_and_picture_missing, missing_medical_disclosure, missing_thank_you_statement, description_insufficient, restricted_items, prohibited_guarantees, similar_to_existing, test_product, other | Stable identifier for a preset rejection reason, safe to branch on. Null when the reason is free-form text or the transition is not a denial. |
denied_at | no | `string | null` | - | When this product was most recently denied, or null if it never has been. Retained across later transitions, so an approved product still reports the denial that preceded it — use occurred_at for the time of this change. |
event_id | yes | string | - | - | |
event_type | yes | const | cart.product.approval_status.changed | - | |
occurred_at | yes | string | - | - | |
previous_approval_status | yes | string | review, approved, denied, approved_changed, denied_changed | Approval status the product held before this transition. | |
product_name | no | `string | null` | - | - |
product_type | no | `string | null` | - | - |
schema_version | yes | const | 1.0 | - | |
status | yes | string | active, inactive, archived | Sale status after the transition. Approval activates the product; a denial leaves the sale status alone, and only an admin reversal of an approval deactivates it. | |