## Problem Transient 429/500/503 responses currently surface straight to the caller. Every mature payment SDK (Stripe, Adyen, Square) retries these safely. ## Proposal - Retry idempotent requests (GET, and POSTs carrying an `Idempotency-Key` — see #1) up to `maxRetries` (default 2) with exponential backoff + jitter. - Respect `Retry-After` when present. Never retry 4xx other than 429. ## Acceptance criteria - [ ] Configurable `maxRetries` in the `Furlpay` constructor - [ ] Backoff with jitter, `Retry-After` respected - [ ] Tests with a mocked fetch: retry-then-succeed, exhaust-then-throw, no-retry-on-400
Problem
Transient 429/500/503 responses currently surface straight to the caller. Every mature payment SDK (Stripe, Adyen, Square) retries these safely.
Proposal
Idempotency-Key— see Support idempotency keys on all mutating requests #1) up tomaxRetries(default 2) with exponential backoff + jitter.Retry-Afterwhen present. Never retry 4xx other than 429.Acceptance criteria
maxRetriesin theFurlpayconstructorRetry-Afterrespected