Esiste un endpoint che restituisce l'intera cronologia dei rimborsi App Store di un cliente, ed ecco cosa restituisce
L'endpoint Get Refund History di Apple restituisce la cronologia completa dei rimborsi App Store di un cliente come transazioni firmate. Ecco ogni campo, come il token revision pagina, perché funziona per cliente e non per app, e quanto ti costa un rimborso che ti sfugge.

Punti chiave
- Get Refund History è un endpoint dell'App Store Server API che restituisce gli acquisti in-app rimborsati di un cliente per la tua app come elenco di transazioni firmate, così puoi riconciliare i rimborsi e revocare l'accesso anche quando una notifica non ti è mai arrivata.
- Chiami GET /inApps/v2/refund/lookup/{transactionId} con qualsiasi id di transazione di quel cliente, e Apple restituisce i suoi rimborsi per tutti i tipi di acquisto della tua app, non solo quello che hai richiesto.
- La risposta ha tre campi: signedTransactions, fino a 20 transazioni JWS per pagina ordinate dal rimborso più vecchio per primo, più un token revision e un booleano hasMore per la paginazione.
- Conserva il token revision finale. Rimandalo la volta successiva e Apple restituisce solo i rimborsi più recenti di quel punto, il che trasforma uno scarico completo della cronologia in un breve elenco di nuove righe a ogni esecuzione.
- Ogni transazione decodificata porta revocationDate e revocationReason. Un revocationReason di 1 significa che il cliente ha ottenuto il rimborso per un problema reale o percepito nella tua app, e 0 significa un altro motivo, come un acquisto accidentale.
- L'endpoint funziona per cliente, non per app. Non esiste una singola chiamata che elenca tutti i rimborsi dell'intera app, quindi riconcili per account a partire da un id di transazione, oppure leggi il tuo feed di notifiche REFUND per la vista sull'intera app.
- Il motivo per configurarlo sono i soldi. Un rimborso che non intercetti mai tiene un account attivo, e continui a pagare calcolo, chiamate all'API del modello, archiviazione e pagamenti per un cliente che App Store ha già rimborsato.
Apple conserva un registro consultabile di ogni rimborso concesso sull'account di un cliente per la tua app, e una sola chiamata lo restituisce. L'endpoint è Get Refund History, parte dell'App Store Server API, e ti consegna la cronologia completa dei rimborsi App Store di quel cliente come elenco di transazioni firmate. Passi un id di transazione, ricevi ciò che Apple ha rimborsato, e lo riconcili con ciò che hai ancora attivo.
Ecco perché ne vale la pena. Un rimborso che non vedi mai è un rimborso che continui a pagare. Il denaro è già andato, ma l'account resta attivo, e ogni ora che lo è continui a spendere in calcolo, chiamate all'API del modello, archiviazione e qualsiasi pagamento legato a quel cliente. Le tue notifiche di rimborso dovrebbero intercettarlo nel momento in cui accade. Get Refund History è la rete di sicurezza per quando non lo fanno, dopo un'interruzione, un deploy che ha perso un webhook, o un caso di assistenza in cui ti serve il quadro completo in una sola chiamata.
Cosa restituisce l'endpoint della cronologia dei rimborsi App Store
Chiami GET /inApps/v2/refund/lookup/{transactionId} sull'App Store Server API, firmato con lo stesso JWT che usi per ogni altra chiamata. L'id di transazione nel percorso può essere qualsiasi transazione del cliente. Apple lo legge come un'identità, non come un filtro, e restituisce gli acquisti rimborsati di quel cliente in tutta la tua app: consumabili, non consumabili, abbonamenti a rinnovo automatico e non rinnovabili allo stesso modo. La vecchia V1 di questo endpoint restituiva fino a 50 rimborsi in una singola risposta ed è deprecata. La versione attuale pagina, così gestisci clienti con cronologie lunghe senza un payload gigante.
La risposta è composta da tre campi
| Campo | Cosa contiene |
|---|---|
| signedTransactions | Fino a 20 transazioni rimborsate di questo cliente, ciascuna un JWS firmato che verifichi e decodifichi. Ordinate dal rimborso più vecchio per primo, per revocationDate. Un array vuoto significa che il cliente non ha rimborsi nella tua app |
| revision | Un token di paginazione. Rimandalo per ottenere la pagina successiva, e conserva l'ultimo per recuperare solo i nuovi rimborsi la volta successiva |
| hasMore | Vero quando Apple detiene più transazioni rimborsate di quante ne abbia restituite questa pagina, quindi richiami con il revision |
Cosa ti dice una transazione rimborsata
Ogni voce in signedTransactions è un JWS. Verificalo contro la catena di certificati di Apple, decodificalo, e hai un payload di transazione ordinario con i campi di rimborso compilati. Sono questi quelli che contano qui.
| Campo | Cosa ti dice |
|---|---|
| transactionId | L'id della transazione rimborsata, la tua chiave di join verso l'acquisto che hai registrato |
| originalTransactionId | L'id del primo acquisto della catena, come colleghi tra loro i rinnovi di un abbonamento |
| productId | Il prodotto che è stato rimborsato, così revochi il diritto giusto e nient'altro |
| revocationDate | L'ora UNIX, in millisecondi, in cui Apple ha rimborsato la transazione |
| revocationReason | Perché Apple l'ha rimborsato. 1 significa un problema reale o percepito con la tua app, 0 significa un altro motivo, come un acquisto accidentale |
| price, currency | L'importo, in milliunits, e il suo codice valuta ISO 4217, così puoi totalizzare il denaro restituito |
| appAccountToken | L'UUID che hai allegato all'acquisto, il modo più pulito per ricollegare un rimborso al tuo utente |
Il token revision è come smetti di rileggere l'intero elenco
Il modo ingenuo di usare questo endpoint è cercare un cliente e percorrere ogni pagina ogni volta. Funziona, e su un cliente con cinquanta rimborsi sono cinquanta righe che già conoscevi più l'unica nuova. Il token revision esiste per eliminare quello spreco. Ogni risposta porta un revision. Quando hasMore è vero, lo rimandi per ottenere la pagina successiva. Quando arrivi alla fine, conservi l'ultimo revision che hai visto.
Cosa questo endpoint non farà
C'è un'aspettativa da abbandonare prima di costruirci sopra. Get Refund History funziona per cliente, non per app. Non puoi chiedergli tutti i rimborsi che la tua app ha subito la settimana scorsa. Risponde a una domanda, quali rimborsi ha questo account, e devi arrivare con un id di transazione di quell'account per porla. Gli sviluppatori sbattono contro questo muro di continuo e vanno a cercare un endpoint di rimborsi sull'intera app che non esiste.
La vista sull'intera app vive altrove. Il tuo feed App Store Server Notifications invia una notifica REFUND nel momento in cui Apple ne concede ciascuno, e Get Notification History ti permette di riprodurre quel feed filtrato sui tipi di rimborso in un intervallo di date. Quindi la divisione è netta. Le notifiche e la loro cronologia ti danno il flusso sull'intera app. Get Refund History ti dà l'elenco autorevole di un account, su richiesta, che è ciò che vuoi a un banco di assistenza o dopo un'interruzione.

Quanto ti costa in denaro un rimborso mancato
L'endpoint è l'impianto idraulico. La bolletta è il motivo per cui posi il tubo. Ogni rimborso in quell'elenco è denaro già restituito, e l'unica variabile rimasta sotto il tuo controllo è per quanto tempo continui a spendere su un account che non paga più.
Continui a pagare per servire un account rimborsato
Il prezzo d'acquisto sparisce nell'istante in cui Apple concede il rimborso. Ciò che continua a girare è il costo dell'erogazione. Per un'app che fa lavoro reale per utente, è calcolo, chiamate all'API del modello, archiviazione e qualsiasi pagamento a creator o partner legato al suo utilizzo. Un cliente rimborsato a cui non tagli mai l'accesso è un abbonamento che finanzi di tasca tua. Riconciliare contro Get Refund History e revocare in base a ciò che trovi è come spegni quel contatore quando una notifica è passata inosservata.
Un motivo di rimborso pari a 1 è una segnalazione di difetto travestita
revocationReason ti costa il doppio se lo ignori. Il primo costo è il rimborso stesso. Il secondo è ogni rimborso futuro dovuto alla stessa causa. Quando un prodotto continua a tornare con revocationReason 1, un problema reale o percepito nella tua app, Apple ti sta consegnando un campione etichettato di ciò che spinge i clienti a chiedere indietro i soldi. Analizzane l'andamento per prodotto e potrai tappare la falla invece di pagarla un rimborso alla volta.
Intercettarlo tardi è comunque meglio che non intercettarlo
Uno storno è definitivo con la banca e, sull'altro store, ora comporta una commissione che lo sviluppatore assorbe. Un rimborso App Store non è così. È liquidato, ma il diritto è tuo da revocare nel momento in cui lo sai. Quindi anche un rimborso che trovi con giorni di ritardo tramite questo endpoint vale la pena trovarlo. Non puoi recuperare il denaro, ma puoi fermare la spesa che ancora girava dietro di esso.
Come si integra con le notifiche, e con Google
Pensa ai pezzi come a un unico sistema. La notifica REFUND è il segnale in tempo reale, inviato al tuo server man mano che Apple decide. Get Refund History è la fonte di verità in modalità pull per un singolo cliente, la chiamata che fai quando l'invio è fallito o quando una persona ha bisogno dell'account completo davanti. Sul lato Google Play la forma è la stessa idea con nomi diversi: una VoidedPurchaseNotification viene inviata in tempo reale, e la Voided Purchases API è l'elenco che estrai. Entrambi gli store ti danno un flusso e un registro. L'errore è fidarsi solo del flusso, perché i flussi cadono.
Configurarlo alla maniera di RefundHalt
Il ciclo è breve una volta che ogni pezzo è al suo posto. Prendi una notifica REFUND come trigger. Riconcilia contro Get Refund History così che un webhook perso non lasci mai attivo un account rimborsato. Decodifica ogni transazione, collegala tramite appAccountToken o transactionId al tuo utente, leggi revocationReason così che un rimborso da difetto venga segnalato e non solo archiviato, e revoca il diritto esatto invece dell'intero account. Pagina con il token revision così da leggere i rimborsi nuovi, non quelli vecchi.
Questa è la parte che RefundHalt esegue per te. Ascolta le notifiche di rimborso, ricorre a Get Refund History quando gli serve l'elenco autorevole, verifica ogni transazione firmata, revoca l'acquisto preciso, e conserva il revision così che ogni passaggio legga solo ciò che è cambiato. Ottieni l'accesso tagliato in pochi secondi e un registro pulito di chi è stato rimborsato, per cosa e perché, senza dover allestire tu stesso il polling e la verifica JWS.
Domande frequenti
- Come vedo tutti i rimborsi dell'intera app, non solo di un cliente?
- Non puoi con Get Refund History, perché funziona per cliente e richiede un id di transazione dell'account su cui stai indagando. Per la vista sull'intera app, usa il tuo feed App Store Server Notifications, che invia una notifica REFUND per ogni rimborso man mano che Apple lo concede, e Get Notification History per riprodurre quel feed filtrato sui tipi di rimborso in un intervallo di date.
- Quanti rimborsi restituisce l'endpoint Get Refund History?
- La versione attuale restituisce fino a 20 transazioni rimborsate per pagina, ordinate con il rimborso più vecchio per primo, e pagina il resto con un token revision quando hasMore è vero. L'endpoint V1 deprecato restituiva fino a 50 in una singola risposta. Non c'è un limite sul totale, quindi un cliente con una lunga cronologia semplicemente occupa più pagine.
- A cosa serve il token revision?
- È così che pagini e così che eviti di rileggere l'intera cronologia di un cliente ogni volta. Ogni risposta include un revision. Lo rimandi per recuperare la pagina successiva, e conservi l'ultimo così che la tua prossima ricerca restituisca solo i rimborsi più recenti di quel punto. Questo mantiene una riconciliazione pianificata su un breve elenco di righe nuove.
- Cosa significa revocationReason in una transazione rimborsata?
- È il motivo per cui Apple ha rimborsato la transazione. Un valore di 1 significa che il cliente ha ottenuto il rimborso a causa di un problema reale o percepito all'interno della tua app, e 0 significa un altro motivo, come un acquisto accidentale. revocationDate ti dice quando è avvenuto il rimborso, in millisecondi UNIX. Leggere revocationReason ti permette di distinguere un difetto di prodotto da un rimborso occasionale per ripensamento.
- Mi serve ancora questo se gestisco già le notifiche REFUND?
- Sì, come rete di sicurezza. Le notifiche sono il segnale in tempo reale, ma un invio può non arrivare durante un'interruzione, un deploy sbagliato o una modifica del webhook, e un rimborso mancato lascia attivo un account rimborsato che ti costa denaro. Get Refund History è la fonte di verità in modalità pull contro cui riconcili così che non resti attivo nulla che Apple abbia già rimborsato.
Fonti e approfondimenti
- 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
Il pilota automatico dei rimborsi per App Store e Google Play
Continua a leggere
La tua app può mostrare un foglio di richiesta di rimborso dentro l'app, ed ecco cosa fa Apple dopo che il cliente tocca invia
La richiesta di rimborso dentro l'app di Apple permette a un cliente di chiedere un rimborso senza uscire dalla tua app, su un foglio che Apple costruisce ed esamina. Ecco cosa restituisce beginRefundRequest, gli orologi del CONSUMPTION_REQUEST e delle 48 ore che avvia sul tuo server, e se vale la pena pubblicare il pulsante.
Quando un acquisto su Google Play viene rimborsato o subisce un chargeback, la Voided Purchases API è come lo scopri
Google Play annulla un acquisto in silenzio quando viene rimborsato o subisce un chargeback. La Voided Purchases API è l'elenco di quegli ordini, così puoi revocare l'accesso. Ecco ogni campo, la finestra di 30 giorni, l'opzione di revoca che nasconde gli ordini e quanto costa.