refund and dispute.
Every event requires
read:self. Each arrives in the envelope, and the tables below describe data.
These events cover one-time purchases only, identified by a
purchase_reference with the appotp_ prefix. Subscription reversals and chargebacks are reconciled through GET /apps/{appUuid}/subscription-status, not these events.Refund resource
data.object is "refund". The refund references the original payment through payment_id, carries amount rather than gross, and has no status or paid_at. Amounts are integers in USD cents.
Example: app.refund.created
Dispute resource
data.object is "dispute". app.dispute.flagged and app.dispute.created share the resource and differ in status.
app.dispute.flagged is an early chargeback warning. A dispute is likely and no formal chargeback has been filed, so prepare evidence or refund pre-emptively. app.dispute.created is the formal dispute. The same payment can produce a flagged event and later a created event, and the money moves only when app.refund.created arrives with reason: "chargeback".
Example: app.dispute.created
app.dispute.flagged uses the identical shape with "type": "app.dispute.flagged" and "status": "warning".
Reconciling
data.payment_id on a refund and data.payment.id on a dispute carry the invoice number of the original payment, which you re-read with GET /apps/{appUuid}/payments/{invoiceNumber}. See Reconciliation.