Cos'è e perché conta
Se la tua app chiama un servizio di intelligenza artificiale, ogni richiesta la paghi tu. Non l'utente che preme il pulsante: tu, con la chiave che hai messo sul server.
Quasi sempre, però, nessuno ha scritto un limite. Basta un bot, uno script lasciato girare, qualcuno che clicca cento volte o che ha trovato la tua chiave: le richieste partono una dopo l'altra, anche di notte, e te ne accorgi solo quando arriva il conto.
Claude Code la funzione che chiama l'AI te la scrive in un attimo. Il limite, spesso, no: non lo aggiunge perché nessuno gliel'ha chiesto. Bastano poche righe di codice e un'impostazione, ma devi chiederle tu.
Servono due protezioni diverse, e una non sostituisce l'altra:
- Il limite di richieste sta nel tuo codice. Dice: questa persona può fare al massimo tot richieste al minuto. Lo scrive Claude.
- Il tetto di spesa sta nel pannello del servizio AI. Dice: questo mese non si va oltre questa cifra. Lo imposti tu, a mano.
Il limite ferma l'abuso di tutti i giorni. Il tetto è la rete sotto: ti salva quando il limite ha un buco, o quando la chiave finisce in mani sbagliate e qualcuno la usa senza passare dalla tua app.
1. Il limite nel codice
Apri Claude Code nella cartella della tua app (da terminale: entri nella cartella e scrivi claude) e incolla questo:
La mia app chiama un servizio di intelligenza artificiale. Trova tutti i punti del codice da cui parte una richiesta all'AI. Poi: 1. metti un limite di richieste per persona al minuto su quegli endpoint (per utente se è loggato, per indirizzo IP se non lo è), con un messaggio chiaro tipo 'Troppe richieste, riprova tra un minuto'; se l'app gira su serverless o su più istanze, il contatore deve stare in un archivio condiviso (per esempio Redis), non nella memoria del server; 2. controlla che la chiave dell'AI stia solo sul server e mai nel codice che arriva al browser o al telefono; 3. alla fine spiegami in parole semplici cosa hai cambiato e come provarlo.
Cosa vuol dire, in parole semplici
- Endpoint: è l'indirizzo del tuo server che l'app chiama quando l'utente preme il pulsante. Il controllo va lì, non nell'app: un controllo nell'app o nel browser si aggira in un attimo.
- Per utente o per IP: se la persona ha fatto login, la riconosci dal suo account. Se non l'ha fatto, hai solo il suo indirizzo IP. Non è perfetto, perché più persone possono avere lo stesso IP e chi vuole abusare può cambiarlo, ma ferma la maggior parte dei casi.
- Archivio condiviso: su un hosting serverless, e in generale quando l'app gira su più copie del server, ogni richiesta può finire su una copia diversa. Un contatore nella memoria di una copia vede solo le sue richieste e si azzera quando la copia si spegne. Per questo deve stare in un posto che vedono tutte: Redis o il tuo database.
- Chiave solo sul server: tutto quello che arriva al browser o al telefono si può leggere. Una chiave dentro l'app è, di fatto, pubblica. Attento alle variabili che alcuni framework mandano apposta al browser, come quelle che iniziano con NEXT_PUBLIC_ in Next.js, VITE_ in Vite o EXPO_PUBLIC_ in Expo: la chiave dell'AI non deve mai stare lì.
Che numero scegliere
Il prompt non dice quante richieste al minuto. Se Claude te lo chiede, pensa a quante volte una persona vera usa quella funzione in un minuto e lascia un po' di margine. Meglio partire basso: alzarlo dopo è facile.
Il limite al minuto da solo non basta. Poche richieste al minuto, ripetute per tutta la notte, fanno comunque migliaia di richieste. Se la funzione è cara, aggiungi un limite al giorno:
Aggiungi anche un limite giornaliero per utente sulle stesse richieste all'AI, usando lo stesso archivio condiviso del limite al minuto. Quando si supera, mostra un messaggio chiaro tipo 'Hai raggiunto il limite di oggi, riprova domani'.
2. Il tetto di spesa
Questo lo fai tu, non Claude. Ci vogliono due minuti.
- Entra nel pannello del servizio AI che usi e cerca la parte della fatturazione o dei limiti di utilizzo.
- Imposta un tetto mensile. Scegli un numero che puoi permetterti di perdere in una notte storta.
- Leggi cosa succede quando il tetto viene raggiunto. È il passaggio che quasi tutti saltano.
Attenzione: non tutti i servizi fermano davvero le richieste al tetto, alcuni ti mandano solo un avviso. Quindi non fidarti del nome dell'impostazione: controlla nella documentazione del tuo servizio cosa fa davvero quel limite. La differenza è tra «blocca le richieste» e «ti manda una notifica».
Se il tuo pannello offre solo l'avviso, usa i crediti prepagati con la ricarica automatica spenta: finiti i crediti, le richieste si fermano. Anche qui, verifica che il tuo servizio funzioni così prima di contarci.
Se l'app usa altri servizi a pagamento, come l'invio di SMS o le mappe, ripeti lo stesso controllo per ognuno.
3. L'avviso
Nello stesso pannello, se c'è l'opzione, attiva un'email di avviso quando arrivi a metà del tetto. Mettila su un indirizzo che leggi davvero.
Il motivo è semplice: un tetto che blocca le richieste ferma anche i tuoi utenti veri. L'avviso a metà ti lascia il tempo di capire cosa succede, se è gente vera che usa l'app o un abuso, prima che l'app smetta di rispondere.
4. La prova
Un limite che non hai provato è un limite che non sai se esiste. Chiedi a Claude:
Scrivi un piccolo script che chiama il mio endpoint AI 30 volte in un minuto con lo stesso utente di prova e dimmi quante richieste passano e quante vengono bloccate.
Se passano tutte, il limite non sta funzionando: fattelo sistemare prima di pubblicare.
- Fai la prova sulla versione locale o di prova dell'app, non su quella che usano gli utenti. Le richieste che passano arrivano davvero all'AI.
- Se il limite che hai scelto è più alto di 30 al minuto, alza anche il numero della prova, se no passano tutte anche con il limite a posto.
- Se l'app gira su serverless, ripeti la prova anche sulla versione di prova online. In locale c'è un solo server, e un contatore tenuto in memoria sembra funzionare anche quando online non funzionerebbe.
Gli errori più comuni
- Mettere il limite solo nell'app o nel browser. Si aggira facilmente: il controllo va sul server, nell'endpoint.
- Tenere il contatore nella memoria del server su serverless. Ogni copia conta per conto suo: usa Redis o il database.
- Impostare il budget nel pannello e pensare di essere coperti. A volte è solo un avviso: controlla cosa fa davvero e, se serve, usa i crediti prepagati senza ricarica automatica.
- Lasciare la chiave dell'AI nel codice dell'app o in una variabile pubblica. Spostala sul server e, se è già finita in un'app pubblicata, cancellala dal pannello e creane una nuova.
- Proteggere un endpoint e dimenticarne un altro. Fatti elencare da Claude tutti i punti da cui parte una richiesta all'AI e controlla che il limite ci sia su ognuno.
- Non provare il limite. Lancia lo script di prova prima di pubblicare, ogni volta che cambi quelle parti.
Checklist
- Limite di richieste su ogni endpoint che chiama l'AI
- Contatore in un archivio condiviso (Redis o database)
- Chiave dell'AI solo sul server
- Tetto mensile impostato nel pannello del servizio
- Verificato se il tetto blocca le richieste o manda solo un avviso
- Email di avviso a metà del tetto
- Prova da 30 richieste fatta, con una parte bloccata
Domande frequenti
Ho pochi utenti, mi serve davvero?
Sì. Il problema non sono gli utenti veri, sono i bot e gli script, che non guardano quanti utenti hai. Un endpoint aperto su internet si può trovare anche se l'app non la conosce nessuno.
Cos'è Redis? Devo installare qualcosa?
È un archivio molto veloce, usato spesso proprio per i contatori. Molti hosting lo offrono come servizio già pronto. Se non vuoi aggiungere niente, va bene anche il database che usi già: dillo a Claude e userà quello per il contatore.
Il limite rallenta l'app?
Per chi la usa normalmente no: è un controllo velocissimo prima della richiesta, e non se ne accorge nessuno. Lo nota solo chi supera il limite, e vede il messaggio.
Se il tetto blocca tutto, la mia app smette di funzionare?
La parte che usa l'AI sì, finché non alzi il tetto o ricarichi i crediti. Per questo serve l'avviso a metà: ti dà il tempo di capire se è crescita vera o un abuso, prima che succeda.