Errori comuni
Tabella diagnostica dei codici HTTP, codici di errore della piattaforma e dodici problemi ricorrenti con verifica e soluzione.
Riferimento diagnostico per le automazioni. Parti dal codice HTTP, poi approfondisci nel problema specifico.
Codici HTTP delle chiamate inbound
| Codice | Significato | Causa tipica | Rimedio |
|---|---|---|---|
400 | Richiesta malformata | JSON non valido, campo obbligatorio assente, tipo errato | Valida il corpo prima dell'invio. Leggi errors[].field nella risposta. |
401 | Non autenticato | Chiave assente, errata, scaduta o revocata | Verifica l'header Authorization. Controlla la scadenza in Console. |
403 | Non autorizzato | Scope insufficienti, progetto non accessibile | Aggiungi lo scope mancante alla chiave o crea una chiave dedicata. |
404 | Risorsa inesistente | Identificativo errato, risorsa di un altro progetto | Verifica l'ID e l'header X-BP-Project. |
409 | Conflitto | Risorsa già esistente, versione obsoleta, Idempotency-Key riusata con corpo diverso | Leggi la risorsa esistente e aggiorna, oppure usa una nuova chiave. |
410 | Risorsa rimossa | Documento cancellato, sessione purgata per ritenzione | Non ritentare. Chiudi il flusso con esito ignorato. |
413 | Payload troppo grande | Corpo oltre 2 MB, upload oltre 25 MB | Riduci il payload, usa l'upload a blocchi per i file. |
415 | Tipo non supportato | Content-Type assente o diverso da application/json | Imposta Content-Type: application/json. |
422 | Entità non elaborabile | Sintassi valida ma regola di business violata | Correggi i dati. Vedi errors[].code per la regola specifica. |
429 | Troppe richieste | Limite di frequenza superato | Attendi Retry-After, riduci il parallelismo. |
500 | Errore interno | Anomalia sulla piattaforma | Ritenta con backoff. Se persiste, apri una segnalazione con il traceId. |
502 | Gateway non valido | Servizio a monte temporaneamente non raggiungibile | Ritenta con backoff esponenziale. |
503 | Servizio non disponibile | Manutenzione o sovraccarico | Ritenta rispettando Retry-After. |
504 | Timeout del gateway | Richiesta troppo lunga a monte | Riduci limit nelle query paginate, ritenta. |
Ritentare o no
Ritenta solo su 429, 500, 502, 503, 504 e sugli errori di rete. Su 4xx diversi da
429 il ritentativo produce sempre lo stesso risultato: correggi la richiesta.
Codici di errore della piattaforma
Il corpo di errore ha sempre questa forma:
{
"error": {
"code": "INSUFFICIENT_SCOPE",
"title": "Permessi insufficienti",
"message": "La chiave API non dispone dello scope identity:bookings:write.",
"traceId": "trc_6b19e0d4c8f24a7f",
"errors": [
{
"field": "scope",
"code": "MISSING",
"message": "Scope richiesto: identity:bookings:write"
}
]
}
}| Codice | HTTP | Significato | Rimedio |
|---|---|---|---|
INVALID_API_KEY | 401 | Chiave non riconosciuta | Verifica il valore completo, incluso il prefisso |
API_KEY_EXPIRED | 401 | Chiave oltre la data di scadenza | Crea una nuova chiave e ruota |
API_KEY_REVOKED | 401 | Chiave revocata manualmente | Crea una nuova chiave |
INSUFFICIENT_SCOPE | 403 | Scope mancante | Aggiungi lo scope indicato in errors |
PROJECT_NOT_ACCESSIBLE | 403 | Progetto non associato alla chiave | Correggi X-BP-Project |
IP_NOT_ALLOWED | 403 | IP di origine fuori dalla allowlist | Aggiungi l'IP in Console |
RESOURCE_NOT_FOUND | 404 | Identificativo inesistente | Verifica l'ID |
IDEMPOTENCY_KEY_REUSED | 409 | Stessa chiave con corpo diverso | Usa una chiave nuova |
VERSION_CONFLICT | 409 | Risorsa modificata da altri | Rileggi e riapplica la modifica |
RESOURCE_GONE | 410 | Risorsa cancellata | Non ritentare |
PAYLOAD_TOO_LARGE | 413 | Corpo oltre il limite | Riduci o suddividi |
VALIDATION_FAILED | 422 | Regola di business violata | Leggi errors per il dettaglio |
RATE_LIMIT_EXCEEDED | 429 | Limite superato | Attendi Retry-After |
INTERNAL_ERROR | 500 | Anomalia interna | Segnala con il traceId |
Codici restituiti dal tuo endpoint
Come Blu Pantheon interpreta la risposta del tuo webhook.
| Risposta | Interpretazione | Conseguenza |
|---|---|---|
200, 201, 202, 204 | Consegna riuscita | Nessun ritentativo |
3xx | Redirect | Fallita. I redirect non vengono seguiti |
400 | Payload rifiutato | Fallita, ritentativo (che fallirà ancora) |
401, 403 | Firma o autorizzazione | Fallita, ritentativo |
404 ripetuto per 24 ore | Endpoint inesistente | Disattivazione automatica |
410 ripetuto per 24 ore | Endpoint dismesso | Disattivazione automatica |
429 | Il tuo sistema è saturo | Fallita, ritentativo con backoff |
5xx | Errore applicativo | Fallita, ritentativo |
| Nessuna risposta entro 10 s | Timeout | Fallita, ritentativo |
Problemi ricorrenti
Sintomo. Tutte le chiamate inbound restituiscono 401 con codice API_KEY_EXPIRED. Il
problema compare improvvisamente, senza modifiche al codice.
Causa. La chiave ha superato la data di scadenza impostata alla creazione.
Verifica.
curl -sS "$BP_API_BASE_URL/identity/v1/me" \
-H "Authorization: Bearer $BP_API_KEY" | jq '.error.code, .data.expiresAt'Soluzione. Crea una nuova chiave con gli stessi scope, distribuiscila nel gestore di segreti, riavvia i consumatori e revoca la vecchia. Procedura completa in Autenticazione.
Prevenzione. Attiva la notifica di scadenza a 30 giorni e pianifica la rotazione in calendario.
Sintomo. Alcune chiamate funzionano, altre restituiscono 403 con INSUFFICIENT_SCOPE.
Tipicamente le letture passano e le scritture falliscono.
Causa. Alla chiave è stato assegnato solo lo scope di lettura.
Verifica.
curl -sS "$BP_API_BASE_URL/identity/v1/me" \
-H "Authorization: Bearer $BP_API_KEY" | jq '.data.scopes'Confronta l'elenco con lo scope indicato nel campo errors della risposta di errore.
Soluzione.
Prevenzione. Documenta gli scope necessari nel README dell'automazione e verificali nello smoke test di rilascio.
Sintomo. Il tuo endpoint risponde 401 a ogni consegna. Nei log consegne tutte le
consegne risultano fallite con lo stesso codice.
Causa. Segreto errato, stringa firmata costruita male, corpo non grezzo, oppure rotazione del segreto non completata.
Verifica. Scarica il corpo grezzo dai log consegne e ricalcola la firma offline:
TIMESTAMP="1767225600"
openssl dgst -sha256 -hmac "$BP_WEBHOOK_SECRET" -r \
<(printf '%s.' "$TIMESTAMP"; cat corpo.json) | cut -d' ' -f1Confronta il risultato con il valore v1 dell'header registrato.
Soluzione. Se il valore calcolato coincide, il bug è nel tuo codice: probabilmente stai ri-serializzando il JSON. Se non coincide, il segreto è sbagliato: ricopialo dalla Console. Dettagli in Firma HMAC.
Prevenzione. Test unitario sulla verifica della firma con un caso noto, eseguito in CI.
Sintomo. Rifiuti con 400 e motivo timestamp-fuori-tolleranza, spesso intermittenti o
concentrati sotto carico.
Causa. Orologio del server non sincronizzato, oppure verifica eseguita in un worker asincrono che elabora la richiesta molti minuti dopo la ricezione.
Verifica.
# Scarto rispetto all ora di rete
timedatectl status
chronyc tracking | grep "System time"
# Confronto con un server pubblico
curl -sSI https://api.blupantheon.com | grep -i '^date:'
date -uSoluzione. Attiva NTP. Sposta la verifica della firma all'ingresso della richiesta HTTP, prima di qualunque coda interna.
Prevenzione. Allarme se lo scarto dell'orologio supera i 30 secondi.
Sintomo. Log consegne con motivo connessione rifiutata o host non risolto. Nessuna
traccia nei log del tuo server.
Causa. DNS non propagato, firewall che blocca il traffico in ingresso, servizio fermo, oppure endpoint pubblicato solo in rete interna.
Verifica.
# Risoluzione DNS
dig +short automation.acme.it
# Raggiungibilità della porta 443 dall esterno
nc -zv automation.acme.it 443
# Richiesta di prova da una rete esterna alla tua
curl -sS -o /dev/null -w "%{http_code}\n" \
-X POST "https://automation.acme.it/webhooks/blupantheon" \
-H "Content-Type: application/json" --data-raw '{}'Esegui i comandi da una rete esterna alla tua: dall'interno funzionerebbe comunque.
Soluzione. Pubblica l'endpoint, apri la porta 443 in ingresso, verifica che il reverse proxy inoltri correttamente il percorso.
Prevenzione. Monitor sintetico esterno che interroga /health ogni minuto.
Sintomo. Log consegne con motivo TLS non valido o certificato scaduto. Il browser
mostra un avviso di sicurezza sull'endpoint.
Causa. Certificato scaduto, catena intermedia incompleta, hostname non corrispondente, oppure certificato autofirmato.
Verifica.
openssl s_client -connect automation.acme.it:443 \
-servername automation.acme.it </dev/null 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
# Verifica della catena completa
curl -sS -o /dev/null -w "%{ssl_verify_result}\n" https://automation.acme.it/Un valore diverso da 0 in ssl_verify_result indica un problema di verifica.
Soluzione. Rinnova il certificato e installa la catena completa, non solo il certificato foglia. Molti server dimenticano gli intermedi: il browser li recupera automaticamente, i client HTTP no.
Prevenzione. Rinnovo automatico e allarme a 30 giorni dalla scadenza.
Sintomo. Log consegne con motivo timeout e tempo di risposta pari a 10000 ms. Il tuo
sistema riceve e talvolta elabora più volte lo stesso evento.
Causa. L'elaborazione del gestionale avviene dentro la richiesta HTTP del webhook.
Verifica.
curl -sS -o /dev/null \
-w "totale %{time_total}s (connessione %{time_connect}s, TLS %{time_appconnect}s)\n" \
-X POST "https://automation.acme.it/webhooks/blupantheon" \
-H "Content-Type: application/json" --data-raw '{}'Soluzione. Separa ricezione ed elaborazione: verifica la firma, accoda, rispondi 202.
Elabora in un worker separato. Pattern descritto in
Modello di integrazione.
Prevenzione. Allarme sul p95 del tempo di risposta oltre 500 ms.
Sintomo. Log consegne con codice 301, 302, 307 o 308 e stato fallito. L'endpoint
funziona perfettamente da browser.
Causa. Regola di riscrittura del reverse proxy: da HTTP a HTTPS, da dominio senza www a
dominio con www, oppure aggiunta della barra finale al percorso.
Verifica.
curl -sS -o /dev/null -w "%{http_code} -> %{redirect_url}\n" \
-X POST "https://automation.acme.it/webhooks/blupantheon" \
-H "Content-Type: application/json" --data-raw '{}'Se redirect_url non è vuoto, hai trovato la causa.
Soluzione. Registra in Console l'URL finale, quello che non produce redirect. Se la riscrittura riguarda la barra finale, includila o rimuovila coerentemente.
Prevenzione. Nel test di registrazione dell'endpoint verifica sempre che il codice sia
2xx diretto, senza salti.
Sintomo. Il tuo endpoint risponde 413. Accade solo su alcuni eventi, tipicamente sessioni
lunghe o documenti con molti campi estratti.
Causa. Limite di dimensione del corpo configurato troppo basso nel server o nel proxy.
Verifica. Controlla la dimensione del corpo nei log consegne e confrontala con il limite configurato.
# NGINX
grep -r "client_max_body_size" /etc/nginx/
# Express
grep -rn "limit:" server.jsSoluzione. Imposta un limite di almeno 2 MB:
location /webhooks/blupantheon {
client_max_body_size 2m;
proxy_pass http://127.0.0.1:3000;
proxy_request_buffering off;
}app.post('/webhooks/blupantheon', express.raw({ type: 'application/json', limit: '2mb' }), handler);Prevenzione. Testa con un payload realistico di sessione lunga, non con un evento di prova minimale.
Sintomo. Nel gestionale compaiono ordini, clienti o ticket duplicati. Il problema si concentra nei periodi in cui il sistema era lento.
Causa. Nessuna deduplica su X-BP-Delivery e nessun Idempotency-Key sulle scritture. Ogni
ritentativo di consegna riesegue l'operazione.
Verifica. Cerca nel gestionale record con lo stesso riferimento creati a distanza di 1, 5 o 30 minuti: coincidono con la sequenza di ritentativi.
SELECT RIFEST, COUNT(*) AS occorrenze, MIN(created_at), MAX(created_at)
FROM ordini
WHERE created_at > NOW() - INTERVAL 7 DAY
GROUP BY RIFEST
HAVING COUNT(*) > 1;Soluzione. Implementa la deduplica a due livelli descritta in
Webhook: tabella con delivery_id come chiave primaria e
controllo aggiuntivo sul campo id dell'evento. Aggiungi Idempotency-Key su tutte le
scritture inbound.
Prevenzione. Test di rilascio che invia due volte la stessa consegna e verifica che venga creato un solo record.
Sintomo. Risposte 429 con RATE_LIMIT_EXCEEDED, tipicamente durante import massivi o
riallineamenti.
Causa. Troppe richieste in parallelo, oppure polling con intervallo troppo breve.
Verifica.
curl -sS -D - -o /dev/null \
"$BP_API_BASE_URL/identity/v1/clients?limit=1" \
-H "Authorization: Bearer $BP_API_KEY" \
| grep -i "x-ratelimit"Soluzione.
- Rispetta sempre
Retry-After: è il valore corretto, non usare attese fisse. - Riduci il parallelismo a un massimo di 5 richieste concorrenti.
- Aumenta
limitnelle query paginate per ridurre il numero di chiamate. - Sostituisci il polling frequente con i webhook.
- Metti in cache locale i dati che cambiano raramente, come le tabelle dei servizi.
Prevenzione. Allarme quando X-RateLimit-Remaining scende sotto il 10% del limite.
Sintomo. 403 con codice IP_NOT_ALLOWED. La stessa chiave funziona da una postazione e
non da un'altra, oppure smette di funzionare dopo una migrazione infrastrutturale.
Causa. Sulla chiave API è configurata una restrizione per indirizzo IP e l'automazione esce con un IP diverso, ad esempio dopo un cambio di NAT gateway o uno scale-out.
Verifica.
# IP pubblico di uscita del server dell automazione
curl -sS https://api.ipify.org
echo
# Confronto con la allowlist configurata
curl -sS "$BP_API_BASE_URL/identity/v1/me" \
-H "Authorization: Bearer $BP_API_KEY" | jq '.error'Soluzione.
Prevenzione. Documenta gli IP di uscita nel registro dell'integrazione e aggiorna la allowlist come parte di ogni migrazione infrastrutturale.
Cosa allegare a una segnalazione
Quando apri un ticket al supporto, includi sempre:
| Informazione | Dove trovarla |
|---|---|
traceId | Campo data.traceId del payload o corpo dell'errore |
| ID evento e ID consegna | Log consegne in Console |
| Intervallo temporale preciso | Prima e ultima occorrenza, con fuso orario |
| Codice HTTP e corpo dell'errore | Risposta ricevuta, senza header Authorization |
| Prefisso e ultimi 4 caratteri della chiave | keyPrefix e keyLast4 da /identity/v1/me |
| URL dell'endpoint webhook | Configurazione in Console |
| Comando di riproduzione | Il curl che riproduce il problema, con il segreto oscurato |
Mai allegare segreti
Non inserire nella segnalazione la chiave API completa, il segreto whsec_, header
Authorization integrali o dati personali dei clienti. Oscurali prima di allegare i log.