Migrate deprecated API fields to the payments array
The GET /v1/events response for transaction_attempt.* events now includes a payments array. The top-level donation and recurring_plan fields have been deprecated and were removed on May 1, 2026.
What changed and why
Previously, each transaction_attempt.* event had a single donation and recurring_plan at the top level — a 1:1 relationship. A payment can now contain multiple donations and recurring plans in a single transaction. The payments array correctly represents this.
Response before and after
During the transition period, until October 30, 2026, both the old fields and payments[] are present in every response. The old top-level donation and recurring_plan fields reflect only one donation and one recurring plan per event. Since a single transaction can now contain multiple donations and recurring plans, these fields no longer represent the full transaction. After the transition period, they are removed and only payments[] remains.
Before
1{
2 "id": "66911bb67616b5001045cccc",
3 "type": "transaction_attempt.success",
4 "donation": "DXXXXXXX", // donation
5 "recurring_plan": "RXXXXXXX" // recurring plan
6}During transition
1{
2 "id": "66911bb67616b5001045cccc",
3 "type": "transaction_attempt.success",
4 "donation": "DXXXXXXX", // deprecated: donation
5 "recurring_plan": null, // deprecated: recurring plan
6 "payments": [
7 { "donation": "DXXXXXXX", "recurring_plan": null }, // one-time donation
8 { "donation": "DXXXXXXX", "recurring_plan": "RXXXXXXX" }, // donation with recurring plan
9 { "donation": null, "recurring_plan": "RXXXXXXX" } // recurring plan with a future start date
10 ]
11}After removal
1{
2 "id": "66911bb67616b5001045cccc",
3 "type": "transaction_attempt.success",
4 "payments": [
5 { "donation": "DXXXXXXX", "recurring_plan": null }, // one-time donation
6 { "donation": "DXXXXXXX", "recurring_plan": "RXXXXXXX" }, // donation with recurring plan
7 { "donation": null, "recurring_plan": "RXXXXXXX" } // recurring plan with a future start date
8 ]
9}How to migrate
- Find any code that reads
event.donationorevent.recurring_planfromtransaction_attempt.*events. - Replace those reads with a loop over
event.payments[]. - Expect
nullvalues —donationisnullfor recurring plans with a future start date, andrecurring_planisnullfor one-time donations.