Votre boucle de retry part du principe que la première requête a échoué. Ce n'est probablement pas le cas.
Un timeout ou un crash ne signifie pas que votre requête API a été perdue. Voici comment les clés d'idempotence rendent les retries sûrs, et le pattern de stockage qui empêche réellement les doublons.