x-api-key oppure, se non viene inviata alcuna chiave API, l’IP del client. Ogni ambito mantiene un contatore indipendente con una finestra scorrevole di 60 secondi.
Identificatore ed esenzioni
Il middleware sceglie l’identificatore per la limitazione della frequenza nell’ordine seguente:- Intestazione
x-api-key→ contatore per chiave. - Primo hop di
X-Forwarded-For→ contatore per IP. REMOTE_ADDR→ contatore per IP.
- La
DIDIT_WEBAPP_API_KEYinterna (usata solo dalla console di Didit). - Gli endpoint protetti dal permesso
IsValidSession(il traffico delle sessioni integrate e dell’SDK). GET /system/healthcheck(servito daHealthMiddlewareprima di questo stack).- I webhook dei provider: Stripe, Screening AML, callback di verifica facciale e modifiche alle liste KYC.
Limiti globali
Ogni richiesta autenticata viene inoltre associata, in base al metodo HTTP, a un ambito generico, così qualsiasi nuova route eredita un valore predefinito ragionevole:
La creazione di transazioni e l’acquisizione di eventi vengono conteggiate nell’ambito
ingest-write invece che in generic-write: un’integrazione con volumi elevati di acquisizione ottiene 600 richieste al minuto per chiave API senza consumare il budget delle altre scritture.
I limiti specifici per endpoint (sezione successiva) si applicano in aggiunta al limite globale. Il primo ambito che supera il proprio contatore è quello che restituisce 429.
Limiti specifici per endpoint
Il middleware definisce ambiti più restrittivi per le route con l’impatto maggiore:GET /v3/session/<id>/decision/ è servito da SessionV3RetrieveView e non rientra nell’ambito session-decision. È regolato solo dal limite generale generic-get di 600/min. La limitazione di 100/min per la decisione si applica ai percorsi di decisione v1 e v2.Struttura della risposta 429
Quando superi un qualsiasi ambito ricevi un HTTP429 con questo corpo e queste intestazioni:
Le intestazioni
X-RateLimit-* vengono inviate solo nella risposta 429: oggi le risposte riuscite non le includono. Usa il valore di Retry-After (oppure X-RateLimit-Reset - now) come ritardo prima del tentativo successivo.
Linee guida per il client
- Rispetta
Retry-Aftercome valore minimo del backoff. A questo, aggiungi un backoff esponenziale con jitter (5s → 10s → 20s → 40s ± random) in modo che due client che ricevono429nello stesso momento non si sincronizzino. - Interrompi i tentativi dopo un limite ridotto (ad esempio 5 tentativi). Restituisci l’errore al chiamante e avvisa il tuo team: 429 ripetuti indicano di solito un loop incontrollato, non un picco temporaneo.
- Usa un unico identificatore per ogni carico di lavoro. Condividere una
x-api-keytra molti backend li fa confluire nello stesso contatore, e può far sì che un vicino rumoroso lasci gli altri senza risorse. Crea un’applicazione separata (e quindi unapi_keyseparato) per ambiente, marchio o cliente: vedi Registrazione programmatica. - Metti in cache le letture delle decisioni. Gli endpoint
/decision/non sono progettati per cicli di polling serrati; se ti servono aggiornamenti in tempo reale, usa i Webhook e chiamaGET /v3/session/<id>/decision/solo per il recupero dei dati arretrati o per l’audit. - Genera i PDF offline. Il rendering dei PDF è limitato dalla CPU (tetto di 50/min). Avvialo da una coda una volta che la sessione raggiunge uno stato finale, non a ogni visualizzazione di pagina.
Esempio di client con gestione dei 429
Hai bisogno di più capacità?
Se 600 sessioni al minuto non bastano, ad esempio per un lancio di marketing o un recupero dei dati arretrati, scrivi a support@didit.me indicando il tuo UUID diapplication e le frequenze sostenute e di picco previste. Le eccezioni vengono configurate per applicazione.