Er is één endpoint dat de volledige App Store refund history van een klant teruggeeft, en dit is wat het oplevert
Het Get Refund History endpoint van Apple geeft de volledige App Store refund history van een klant terug als ondertekende transacties. Hier vindt u elk veld, hoe het revision-token pagineert, waarom het per klant is en niet per app, en wat een gemiste refund u kost.

Belangrijkste inzichten
- Get Refund History is een App Store Server API endpoint dat de terugbetaalde in-app-aankopen van een klant voor uw app teruggeeft als een lijst met ondertekende transacties, zodat u refunds kunt afstemmen en toegang kunt intrekken, zelfs als een melding u nooit bereikte.
- U roept GET /inApps/v2/refund/lookup/{transactionId} aan met een willekeurige transactie-id voor die klant, en Apple geeft diens refunds terug over elk aankooptype in uw app, niet alleen degene waar u naar vroeg.
- Het antwoord heeft drie velden: signedTransactions, tot 20 JWS-transacties per pagina, gesorteerd op oudste refund eerst, plus een revision-token en een hasMore-boolean voor paginering.
- Bewaar het laatste revision-token. Geef het de volgende keer terug en Apple levert alleen refunds die nieuwer zijn dan dat punt, waardoor een volledige history-dump bij elke run verandert in een korte lijst met nieuwe regels.
- Elke gedecodeerde transactie draagt revocationDate en revocationReason. Een revocationReason van 1 betekent dat de klant terugbetaald kreeg wegens een werkelijk of ervaren probleem in uw app, en 0 betekent een andere reden zoals een onbedoelde aankoop.
- Het endpoint is per klant, niet per app. Er is geen enkele aanroep die elke refund over uw hele app opsomt, dus u stemt per account af vanaf een transactie-id, of u leest uw REFUND-meldingenstroom voor het app-brede overzicht.
- De reden om het aan te sluiten is geld. Een refund die u nooit opmerkt houdt een account actief, en u blijft betalen voor rekenkracht, model-API-aanroepen, opslag en uitbetalingen voor een klant die de App Store al schadeloos heeft gesteld.
Apple houdt voor elk account van een klant bij uw app een opvraagbaar overzicht bij van elke refund die het heeft verleend, en één aanroep geeft dat terug. Het endpoint heet Get Refund History, onderdeel van de App Store Server API, en het levert u de volledige App Store refund history van die klant als een lijst met ondertekende transacties. U geeft een transactie-id door, u krijgt terug wat Apple heeft terugbetaald, en u stemt het af tegen wat u nog aan hebt staan.
Dit is waarom het de moeite waard is. Een refund die u nooit ziet, is een refund waar u voor blijft betalen. Het geld is al weg, maar het account blijft actief, en elk uur dat dit zo is blijft u uitgeven aan rekenkracht, model-API-aanroepen, opslag en elke uitbetaling die aan die klant is gekoppeld. Uw refund-meldingen zijn bedoeld om dit te vangen op het moment dat het gebeurt. Get Refund History is het vangnet voor wanneer ze dat niet doen, na een storing, een deploy die een webhook liet vallen, of een supportzaak waarbij u het hele beeld in één aanroep nodig hebt.
Wat het App Store refund history endpoint teruggeeft
U roept GET /inApps/v2/refund/lookup/{transactionId} aan tegen de App Store Server API, ondertekend met dezelfde JWT die u voor elke andere aanroep gebruikt. De transactie-id in het pad kan elke transactie van de klant zijn. Apple leest het als een identiteit, niet als een filter, en geeft de terugbetaalde aankopen van die klant over uw hele app terug: verbruiksartikelen, niet-verbruiksartikelen, automatisch verlengende en niet-verlengende abonnementen gelijk. De oudere V1 van dit endpoint gaf tot 50 refunds in één antwoord terug en is verouderd. De huidige versie pagineert, zodat u klanten met een lange geschiedenis afhandelt zonder een reusachtige payload.
Het antwoord bestaat uit drie velden
| Veld | Wat het bevat |
|---|---|
| signedTransactions | Tot 20 terugbetaalde transacties voor deze klant, elk een ondertekende JWS die u verifieert en decodeert. Gesorteerd op oudste refund eerst, op revocationDate. Een lege array betekent dat de klant geen refunds in uw app heeft |
| revision | Een paginerings-token. Geef het terug om de volgende pagina te krijgen, en bewaar het laatste om de volgende keer alleen nieuwe refunds op te halen |
| hasMore | True wanneer Apple meer terugbetaalde transacties heeft dan deze pagina teruggaf, zodat u opnieuw aanroept met het revision |
Wat één terugbetaalde transactie u vertelt
Elke vermelding in signedTransactions is een JWS. Verifieer het tegen Apples certificaatketen, decodeer het, en u hebt een gewone transactie-payload met de refund-velden ingevuld. Dit zijn degene die hier tellen.
| Veld | Wat het u vertelt |
|---|---|
| transactionId | De id van de terugbetaalde transactie, uw koppelsleutel terug naar de aankoop die u vastlegde |
| originalTransactionId | De id van de eerste aankoop in de keten, hoe u de verlengingen van een abonnement aan elkaar knoopt |
| productId | Het product dat werd terugbetaald, zodat u de juiste rechten intrekt en niets anders |
| revocationDate | De UNIX-tijd, in milliseconden, waarop Apple de transactie terugbetaalde |
| revocationReason | Waarom Apple het terugbetaalde. 1 betekent een werkelijk of ervaren probleem met uw app, 0 betekent een andere reden zoals een onbedoelde aankoop |
| price, currency | Het bedrag, in milliunits, en de bijbehorende ISO 4217 valutacode, zodat u het teruggegeven geld kunt optellen |
| appAccountToken | De UUID die u bij de aankoop hebt meegegeven, de schoonste manier om een refund terug te koppelen aan uw eigen gebruiker |
Het revision-token is hoe u stopt met de hele lijst opnieuw te lezen
De naïeve manier om dit endpoint te gebruiken is een klant opzoeken en elke keer elke pagina doorlopen. Dat werkt, en bij een klant met vijftig refunds zijn dat vijftig regels die u al kende plus die ene nieuwe. Het revision-token bestaat om die verspilling te doden. Elk antwoord draagt een revision. Wanneer hasMore true is, geeft u het terug om de volgende pagina te krijgen. Wanneer u het einde bereikt, bewaart u het laatste revision dat u zag.
Wat dit endpoint niet zal doen
Er is één verwachting die u moet laten varen voordat u erop bouwt. Get Refund History is per klant, niet per app. U kunt er niet elke refund aan vragen die uw app afgelopen week opliep. Het beantwoordt één vraag, namelijk welke refunds dit account heeft, en u moet met een transactie-id voor dat account aankomen om die te stellen. Ontwikkelaars lopen voortdurend tegen deze muur op en gaan op zoek naar een app-breed refund-endpoint dat niet bestaat.
Het app-brede overzicht ligt ergens anders. Uw App Store Server Notifications stroom stuurt een REFUND-melding op het moment dat Apple elke refund verleent, en met Get Notification History kunt u die stroom, gefilterd op refund-typen, over een datumbereik opnieuw afspelen. De verdeling is dus helder. Meldingen en hun geschiedenis geven u de app-brede stroom. Get Refund History geeft u de gezaghebbende lijst van één account, op aanvraag, wat is wat u wilt aan een supportbalie of na een storing.

Wat een gemiste refund u in geld kost
Het endpoint is leidingwerk. De rekening is de reden dat u de pijp legt. Elke refund in die lijst is geld dat al is teruggegeven, en de enige variabele die nog in uw controle ligt is hoe lang u blijft uitgeven aan een account dat niet meer betaalt.
U blijft betalen om een terugbetaald account te bedienen
De aankoopprijs is weg op het moment dat Apple de refund verleent. Wat blijft draaien zijn de kosten van levering. Voor een app die per gebruiker echt werk doet, is dat rekenkracht, model-API-aanroepen, opslag en elke creator- of partneruitbetaling die aan hun gebruik is gekoppeld. Een terugbetaalde klant wiens toegang u nooit hebt afgesneden, is een abonnement dat u uit eigen zak financiert. Afstemmen tegen Get Refund History en intrekken op wat u vindt, is hoe u die meter uitzet wanneer een melding erdoorheen glipte.
Een refund-reden van 1 is een vermomd defectrapport
revocationReason kost u dubbel als u het negeert. De eerste kost is de refund zelf. De tweede is elke toekomstige refund uit dezelfde oorzaak. Wanneer een product steeds terugkomt met revocationReason 1, een werkelijk of ervaren probleem in uw app, reikt Apple u een gelabeld staaltje aan van wat klanten hun geld terug doet vragen. Zet het uit per product en u kunt het lek dichten in plaats van het één refund tegelijk uit te betalen.
Het laat vangen is nog altijd beter dan het niet vangen
Een chargeback is definitief bij de bank en draagt in de andere store inmiddels een vergoeding die de ontwikkelaar slikt. Een App Store refund is dat niet. Hij is afgehandeld, maar de rechten zijn van u om in te trekken op het moment dat u het weet. Zelfs een refund die u dagen te laat via dit endpoint vindt, is dus de moeite waard om te vinden. U kunt het geld niet terughalen, maar u kunt de uitgave stoppen die er nog achter liep.
Hoe dit past bij meldingen, en bij Google
Zie de onderdelen als één systeem. De REFUND-melding is het live signaal, naar uw server geduwd terwijl Apple beslist. Get Refund History is de pull-gebaseerde bron van waarheid voor één klant, de aanroep die u doet wanneer de push mislukte of wanneer een mens het volledige account voor zich nodig heeft. Aan de Google Play kant is de vorm hetzelfde idee met andere namen: een VoidedPurchaseNotification wordt in realtime geduwd, en de Voided Purchases API is de lijst die u trekt. Beide stores geven u een stroom en een grootboek. De fout is alleen de stroom vertrouwen, want stromen vallen weg.
Het aansluiten op de RefundHalt manier
De lus is klein zodra elk onderdeel op zijn plaats staat. Neem een REFUND-melding als de trigger. Stem af tegen Get Refund History zodat een weggevallen webhook nooit een terugbetaald account actief laat. Decodeer elke transactie, koppel het op appAccountToken of transactionId terug aan uw gebruiker, lees revocationReason zodat een defect-refund wordt gemarkeerd en niet alleen weggeborgen, en trek de exacte rechten in in plaats van het hele account. Pagineer met het revision-token zodat u nieuwe refunds leest, niet oude.
Dit is het deel dat RefundHalt voor u draait. Het luistert naar de refund-meldingen, valt terug op Get Refund History wanneer het de gezaghebbende lijst nodig heeft, verifieert elke ondertekende transactie, trekt de precieze aankoop in en bewaart het revision zodat elke doorloop alleen leest wat veranderd is. U krijgt de toegang binnen seconden afgesneden en een schoon overzicht van wie werd terugbetaald, waarvoor en waarom, zonder de polling en de JWS-verificatie zelf op te zetten.
Veelgestelde vragen
- Hoe zie ik elke refund over mijn hele app, niet alleen één klant?
- Dat kan niet met Get Refund History, want het is per klant en heeft een transactie-id nodig voor het account waar u naar vraagt. Voor het app-brede overzicht gebruikt u uw App Store Server Notifications stroom, die een REFUND-melding stuurt voor elke refund zodra Apple die verleent, en Get Notification History om die stroom, gefilterd op refund-typen, over een datumbereik opnieuw af te spelen.
- Hoeveel refunds geeft het Get Refund History endpoint terug?
- De huidige versie geeft tot 20 terugbetaalde transacties per pagina terug, gesorteerd met de oudste refund eerst, en pagineert door de rest met een revision-token wanneer hasMore true is. Het verouderde V1 endpoint gaf tot 50 in één antwoord terug. Er is geen limiet op het totaal, dus een klant met een lange geschiedenis beslaat simpelweg meer pagina's.
- Waar is het revision-token voor?
- Het is hoe u pagineert en hoe u vermijdt om de hele geschiedenis van een klant elke keer opnieuw te lezen. Elk antwoord bevat een revision. U geeft het terug om de volgende pagina op te halen, en u bewaart het laatste zodat uw volgende opzoeking alleen refunds teruggeeft die nieuwer zijn dan dat punt. Dat houdt een geplande afstemming op een korte lijst met nieuwe regels.
- Wat betekent revocationReason in een terugbetaalde transactie?
- Het is waarom Apple de transactie terugbetaalde. Een waarde van 1 betekent dat de klant terugbetaald kreeg wegens een werkelijk of ervaren probleem binnen uw app, en 0 betekent een andere reden, zoals een onbedoelde aankoop. revocationDate vertelt u wanneer de refund plaatsvond, in UNIX-milliseconden. Het lezen van revocationReason laat u een productdefect scheiden van een eenmalige spijt-refund.
- Heb ik dit nog nodig als ik al REFUND-meldingen verwerk?
- Ja, als vangnet. Meldingen zijn het live signaal, maar een push kan mislukken tijdens een storing, een slechte deploy of een webhook-wijziging, en een gemiste refund laat een terugbetaald account actief en kost u geld. Get Refund History is de pull-gebaseerde bron van waarheid waartegen u afstemt zodat niets aan blijft staan dat Apple al heeft terugbetaald.
Bronnen en verder lezen
- Apple Developer: Get Refund History (App Store Server API)
- Apple Developer: RefundHistoryResponse
- Apple Developer: JWSTransactionDecodedPayload (revocationDate, revocationReason)
- Apple Developer: Get Refund History V1 (deprecated)
- Apple Developer: App Store Server Notifications V2 notificationType (REFUND)
- Apple Developer: Support customers and handle refunds (WWDC21)
RefundHalt
De terugbetalingsautopiloot voor de App Store en Google Play
Lees verder
Je app kan een in-app formulier voor terugbetalingsverzoeken tonen, en dit doet Apple nadat een klant op verzenden tikt
Met Apples in-app terugbetalingsverzoek kan een klant om een terugbetaling vragen zonder je app te verlaten, via een formulier dat Apple bouwt en beoordeelt. Hier lees je wat beginRefundRequest teruggeeft, welke CONSUMPTION_REQUEST- en 48-uursklokken het op je server start, en of de knop het waard is om uit te brengen.
Wanneer een Google Play-aankoop wordt terugbetaald of teruggeboekt, is de Voided Purchases API hoe je erachter komt
Google Play maakt een aankoop stilletjes ongeldig wanneer die wordt terugbetaald of teruggeboekt. De Voided Purchases API is de lijst van die bestellingen, zodat je toegang kunt intrekken. Hier vind je elk veld, het venster van 30 dagen, de revoke-optie die bestellingen verbergt, en wat het kost.