Tous les articles
Analyse approfondie8 min de lecture

Un remboursement via l'Advanced Commerce API est le seul moyen pour un développeur iOS de lancer un remboursement, et Apple garde le dernier mot

La plupart des développeurs iOS ne peuvent pas rembourser un client. Les apps qui utilisent l'Advanced Commerce API d'Apple peuvent demander un remboursement, révoquer un abonnement ou rendre un montant personnalisé. Voici comment fonctionne chaque endpoint, ce qu'Apple peut encore refuser et où l'argent se perd.

Une femme à son bureau à domicile parcourt une vaste bibliothèque de livres audio et de cours sur un iPad posé à côté d'un ordinateur portable, le type d'app à très grand catalogue qui peut envoyer à Apple une demande de remboursement via l'Advanced Commerce API

Points clés

  • Un ingénieur d'Apple a déclaré en juin 2026 qu'un développeur ne peut pas émettre directement un remboursement pour un achat ordinaire sur l'App Store. La seule contribution du développeur, ce sont les données de consommation et la refundPreference envoyées en réponse à un CONSUMPTION_REQUEST.
  • Les apps approuvées pour l'Advanced Commerce API d'Apple disposent d'un endpoint Request Transaction Refund qui demande à l'App Store de rembourser un paiement ponctuel ou une transaction d'abonnement, ainsi que des endpoints Revoke Subscription et Cancel a Subscription.
  • Pour appeler les endpoints de remboursement, de révocation et d'annulation de l'Advanced Commerce API, l'Account Holder du développeur doit signer l'Advanced Commerce API Addendum, et Apple précise que l'appel renvoie une erreur si la dernière version n'a pas été acceptée.
  • L'endpoint Request Transaction Refund accepte un refundType FULL, PRORATED ou CUSTOM, et un refundAmount en millièmes de la devise n'est autorisé qu'avec CUSTOM. Apple précise que le montant doit inclure les taxes dans toutes les régions sauf le Canada et les États-Unis.
  • Le champ refundRiskingPreference d'Apple vaut true par défaut, ce qui permet à l'App Store d'envoyer un CONSUMPTION_REQUEST au sujet de la propre demande de remboursement du développeur. Apple demande une réponse sous 12 heures.
  • Les endpoints de remboursement, de révocation et d'annulation de l'Advanced Commerce API sont limités à 5 requêtes par seconde et par app en production, et le sandbox n'en obtient que 10 pour cent.
  • Après un appel réussi à Revoke Subscription, Apple envoie une notification REFUND et demande aux développeurs de couper le service à compter de sa revocationDate, pas avant l'arrivée de la notification.

Un développeur iOS ordinaire ne peut pas rembourser un client. En juin 2026, un App Store Commerce Engineer a répondu à une question sur le forum des développeurs en une seule phrase : pour l'instant, un développeur ne peut pas émettre directement un remboursement. Il existe une exception, et elle se trouve dans l'Advanced Commerce API. Les apps qu'Apple approuve peuvent envoyer une demande de remboursement via l'Advanced Commerce API, révoquer un abonnement avec remboursement ou demander un montant personnalisé. C'est toujours Apple qui décide si l'argent est rendu.

Ce qu'est l'Advanced Commerce API et qui y a accès

Apple a lancé l'Advanced Commerce API le 23 janvier 2025. Elle gère les achats intégrés Apple pour des catalogues exceptionnellement vastes d'achats ponctuels personnalisés, d'abonnements et d'abonnements avec options complémentaires. Vous ne créez pas chaque produit dans App Store Connect. Vous définissez les SKU sur votre propre serveur et les transmettez à Apple au moment de l'achat.

L'accès est accordé app par app. Vous remplissez un formulaire de demande, et la page d'éligibilité d'Apple cite trois modèles économiques qui doivent être au cœur de l'app :

  • Des catalogues exceptionnellement vastes d'achats ponctuels, comme des livres audio, des leçons, des cours ou des mini apps.
  • Des catalogues exceptionnellement vastes de contenus par abonnement, où l'offre de chaque créateur est un abonnement distinct.
  • Un abonnement avec des options complémentaires qui se renouvellent ensemble comme un seul achat, comme des chaînes premium ou du sport.

Apple permet aussi de postuler lorsqu'un autre programme exige l'API. Le Mini Apps Partner Program, qui reverse à ses membres 85% des ventes intégrées éligibles dans les mini apps hébergées, l'impose.

Les endpoints de remboursement sont arrivés plus tard, et ils exigent une signature

La version 1.1, datée du 24 mars 2025, a ajouté Request Transaction Refund et Revoke Subscription. La page du programme d'Apple indique que les apps proposant des contenus par abonnement peuvent aussi être éligibles aux API Cancel, Revoke et Refund pour gérer les résiliations, valider le contenu après l'achat et administrer leurs catalogues. Chaque page d'endpoint ajoute la même condition : votre Account Holder doit signer l'Advanced Commerce API Addendum, et si la dernière version n'est pas acceptée, l'appel renvoie une erreur. C'est l'Addendum, et non la documentation, qui énumère les cas d'usage prévus pour chaque endpoint.

Les trois endpoints, côte à côte

Cancel a SubscriptionRevoke SubscriptionRequest Transaction Refund
CheminadvancedCommerce/v1/subscription/cancel/{transactionId}advancedCommerce/v1/subscription/revoke/{transactionId}advancedCommerce/v1/transaction/requestRefund/{transactionId}
CouvreAbonnements à renouvellement automatiqueUn abonnement et tous ses élémentsPaiements ponctuels et transactions d'abonnement
RemboursementAucunFULL ou PRORATEDFULL, PRORATED ou CUSTOM, par SKU
AccèsMaintenu jusqu'à la fin de la périodePrend fin à la revocationDateDéfini par élément avec l'indicateur revoke
Limite en production5 par seconde5 par seconde5 par seconde

Cancel a Subscription arrête le prochain prélèvement

Cancel désactive le renouvellement automatique. Apple précise que le client garde l'accès jusqu'à la fin de la période en cours. Rien n'est remboursé. C'est le bon choix quand un client veut partir et a déjà utilisé le temps qu'il a payé.

Revoke Subscription met fin à tout, tout de suite

Revoke passe le renouvellement automatique à false et révoque l'abonnement avec un remboursement total ou au prorata. Son corps de requête accepte refundReason, refundRiskingPreference, refundType et requestInfo. Apple envoie ensuite une notification REFUND à votre endpoint App Store Server Notifications V2. La consigne d'Apple est précise : coupez le service à compter de la revocationDate de cette notification, et ne le coupez pas avant son arrivée.

Request Transaction Refund fonctionne élément par élément

C'est l'outil de précision. Vous envoyez une liste d'éléments, et chacun indique un SKU, un refundReason, un refundType et un indicateur revoke. Avec CUSTOM, vous envoyez aussi refundAmount en millièmes de la devise, donc 4990 signifie 4,99. Si vous envoyez un montant avec FULL ou PRORATED, Apple le rejette avec l'erreur 4000155. La réponse contient une transaction signée et, pour les abonnements, les informations de renouvellement signées.

Apple accepte ces valeurs de refundReason : UNINTENDED_PURCHASE, FULFILLMENT_ISSUE, UNSATISFIED_WITH_PURCHASE, LEGAL, OTHER et MODIFY_ITEMS_REFUND. Une septième, SIMULATE_REFUND_DECLINE, sert uniquement aux tests en sandbox et sur TestFlight, et elle existe parce que l'App Store peut dire non.

Apple peut encore refuser votre propre demande de remboursement

Le nom de l'endpoint est honnête. C'est une demande. Deux champs montrent où se situe vraiment la décision.

refundRiskingPreference ouvre la porte à un contrôle de consommation

Apple décrit refundRiskingPreference comme le fait de savoir si l'App Store vous demande des données de consommation pour éclairer sa décision de remboursement. La valeur par défaut est true. Dans ce cas, vous recevez un CONSUMPTION_REQUEST pour votre propre demande de remboursement et vous répondez via Send Consumption Information. Apple demande aux développeurs de répondre dans les 12 heures suivant la réception d'un CONSUMPTION_REQUEST. Passez-le à false et cette notification n'arrive pas.

Les erreurs qui vous disent non

ErreurCodeCe que dit Apple
AlreadyRefundedError4030021La transaction a déjà été remboursée
PendingRefundError4000181La transaction a des remboursements en attente
TransactionNotRefundableError4030024La transaction n'est pas remboursable
TransactionCannotBeRefundedContactSupportError4030025Le client peut contacter l'assistance Apple
RefundAmountWithoutCustomError4000155Un montant a été envoyé sans CUSTOM

PendingRefundError est celle qu'il faut anticiper. Une cause probable est un client qui a déjà fait la demande à Apple via Report a Problem avant que votre équipe de support n'agisse. Les règles d'éligibilité d'Apple imposent de toute façon à ces apps de proposer un accès au remboursement dans l'app, soit un lien Report a Problem, soit l'API beginRefundRequest, si bien que les deux portes restent ouvertes en même temps.

Un développeur tient un iPhone au-dessus d'un registre de transactions imprimé et vérifie quel élément un remboursement via l'Advanced Commerce API doit couvrir

Ce qu'un remboursement via l'Advanced Commerce API vous coûte en argent

Rembourser de votre propre initiative semble moins cher que de contester un litige. Cela reste de l'argent qui sort, et l'API permet de reproduire facilement certaines erreurs à grande échelle.

Les taxes dans le montant personnalisé

Apple indique qu'un refundAmount demandé doit inclure les taxes dans toutes les régions sauf le Canada et les États-Unis. Une équipe qui calcule un remboursement CUSTOM à partir du prix hors taxes de son SKU remboursera trop peu les clients de toutes les autres vitrines, puis paiera du temps de support pour corriger chaque cas.

Les coûts qui ne reviennent pas

  • Reversements : dans un catalogue de créateurs ou chez un hébergeur de mini apps, la part du créateur est souvent versée à la vente. Un remboursement au client ne la récupère pas.
  • Licences de contenu : les redevances par titre dues à un ayant droit pour un livre audio ou un cours peuvent être déclenchées par l'accès, selon votre contrat, et un remboursement ne les annule pas.
  • Calcul : le streaming, le transcodage et tout travail serveur effectué pour l'achat figurent déjà sur votre facture.
  • Appels d'API : les services tiers facturés à la requête, de la synthèse vocale à l'inférence de modèles, restent facturés après le remboursement.

Un remboursement total alors que vous visiez un seul élément

Revoke Subscription rembourse et met fin à tout l'abonnement, options comprises. Si le client ne conteste qu'une option, Request Transaction Refund vous permet de rembourser ce seul SKU, avec revoke activé uniquement pour cet élément. Appeler Revoke Subscription pour une réclamation portant sur un seul élément rend aussi le revenu du forfait de base.

Une checklist avant d'activer ces appels

  • Vérifiez que votre Account Holder a accepté l'Advanced Commerce API Addendum en vigueur, et créez une alerte sur l'erreur renvoyée quand il expire.
  • Générez un nouveau requestReferenceId UUID pour chaque requête, et ne réutilisez le même que pour relancer un appel qui a expiré.
  • Mettez les appels de remboursement en file d'attente. La limite est de 5 par seconde et par app, et une réponse 429 contient un en-tête Retry-After en millisecondes UNIX.
  • Testez les refus en sandbox avec SIMULATE_REFUND_DECLINE, et rappelez-vous que les limites du sandbox représentent 10 pour cent de celles de la production.
  • Décidez de refundRiskingPreference au cas par cas, et gardez un service de réponse sur la consommation prêt pour la fenêtre de 12 heures quand la valeur reste true.
  • Ne coupez l'accès qu'à l'arrivée de la notification REFUND, à compter de sa revocationDate.
  • Journalisez le motif, le montant et le SKU de chaque demande, pour que votre propre taux de remboursement soit visible avant qu'Apple ne voie le sien.

Questions fréquentes

Un développeur iOS peut-il rembourser un client directement ?
Pas pour un achat ordinaire sur l'App Store. Un ingénieur d'Apple a déclaré en juin 2026 qu'un développeur ne peut pas émettre directement un remboursement. Les apps approuvées pour l'Advanced Commerce API, avec l'Addendum signé, peuvent en demander un via l'endpoint Request Transaction Refund, et c'est toujours Apple qui décide.
Quelle est la différence entre Cancel et Revoke dans l'Advanced Commerce API ?
Cancel désactive le renouvellement automatique et le client garde l'accès jusqu'à la fin de la période, sans remboursement. Revoke met fin immédiatement à l'abonnement et à tous ses éléments et rembourse le montant total ou au prorata. Apple envoie une notification REFUND après une révocation.
Puis-je rembourser un montant personnalisé avec l'Advanced Commerce API ?
Oui. Passez refundType à CUSTOM et transmettez refundAmount en millièmes de la devise. Apple indique que le montant doit inclure les taxes dans toutes les régions sauf le Canada et les États-Unis, et l'envoi d'un montant avec FULL ou PRORATED renvoie l'erreur 4000155.
Vais-je recevoir un CONSUMPTION_REQUEST pour un remboursement que j'ai moi-même demandé ?
C'est possible. refundRiskingPreference vaut true par défaut, ce qui permet à l'App Store de vous demander des données de consommation via un CONSUMPTION_REQUEST, et Apple demande une réponse sous 12 heures. Passez-le à false et, selon Apple, cette notification ne sera pas envoyée.
Pourquoi ma demande de remboursement via l'Advanced Commerce API a-t-elle échoué ?
Vérifiez le code d'erreur. 4030021 signifie que la transaction a déjà été remboursée, 4000181 qu'un remboursement est déjà en attente, 4030024 qu'elle n'est pas remboursable et 4030025 que le client doit contacter l'assistance Apple. Un Addendum non signé ou obsolète renvoie aussi une erreur.

Sources et lectures complémentaires

RefundHalt

Le pilote automatique des remboursements pour l'App Store et Google Play

Poursuivre la lecture

La prochaine demande de remboursement est déjà en route.

Configurez RefundHalt dans le temps qu'il vous faudrait pour lire un nouvel e-mail d'assistance au sujet d'un remboursement que vous n'avez pas pu contester.