Seu loop de retry assume que a primeira requisição falhou. Provavelmente, não falhou.
Um timeout ou crash não significa que sua requisição de API foi perdida. Veja como idempotency keys tornam retries seguros, e o padrão de armazenamento que realmente previne duplicatas.