Come sono strutturate le risposte di errore dell’API di LinkHarbor, cosa significano i codici di errore principali e come deve reagire il tuo codice.
Ogni risposta di errore dell’API ha lo stesso formato. Il tuo codice dovrebbe basarsi sul codice di errore nel campo error, non sul testo in message – il codice resta stabile, mentre il testo può cambiare e viene tradotto nella lingua dell’account.
Struttura di una risposta di errore
{
"error": "validation_failed",
"message": "Some of the information provided is invalid. Please check and try again.",
"details": [
{ "field": "title", "reason": "minLength", "message": "…" }
],
"request_id": "6b1f0c2e-…"
} - error
- Codice leggibile dalle macchine, per esempio not_found. Per la maggior parte degli errori si trova anche nell’header X-Error-Code – ma basati sul campo nel corpo.
- message
- Descrizione leggibile nella lingua dell’account: con una chiave API quella del proprietario del workspace, con un’app collegata quella della persona che l’ha collegata. Senza un token valido – per esempio con 401 dal controllo del token – la lingua segue Accept-Language, altrimenti è l’inglese. L’header Content-Language indica la lingua.
- details
- Presente solo quando c’è altro da dire. Per 422 dalla validazione dell’input, un elenco con field, reason e message per ogni problema; per 422 dalla logica di business e per tutti gli altri errori, un oggetto, per esempio con reason, retry_after_sec o un elenco di issues. Quando una dimensione viene superata contiene field, reason e limit, e per 413 request_too_large max_bytes e max_kb. Quindi verifica se details è un elenco.
- request_id
- L’ID della richiesta. Si trova anche nell’header X-Request-Id. Indicalo quando contatti l’assistenza.
Eccezioni: la risposta 429 rate_limited ha il campo retry_after_sec invece di details; con 429 e 403 insufficient_scope, request_id manca nel corpo. 401 dal controllo del token e 422 dal controllo dello schema non hanno l’header X-Error-Code, e con il controllo dello schema viene tradotto solo il message di primo livello; i testi all’interno di details restano in inglese. L’header X-Request-Id è sempre presente.
I codici più importanti
| HTTP | error | Significato | Cosa fare |
|---|---|---|---|
| 400 | invalid_json | Il corpo non è JSON valido | Controlla il JSON |
| 400 | bad_request | Content-Type errato o richiesta malformata | Imposta Content-Type: application/json |
| 401 | missing_bearer_token | Nessun token nell’header Authorization | Imposta l’header Authorization: Bearer … |
| 401 | invalid_token | Token scaduto o non valido, oppure chiave eliminata | Richiedi un nuovo token; se non basta, controlla la chiave |
| 401 | invalid_api_key | ID o secret della chiave errati nello scambio del token | Controlla le credenziali |
| 402 | plan_limit_reached | Limite del piano raggiunto, per esempio per i link brevi | Aggiorna il piano o elimina delle voci |
| 403 | insufficient_scope | Scope mancante o endpoint non abilitato per le chiavi API | Crea una chiave con lo scope giusto |
| 403 | forbidden | Nessuna autorizzazione per questa azione | Eseguila nella dashboard |
| 403 | feature_not_available | Funzione non inclusa nel piano | Controlla il piano |
| 403 | block_type_requires_plan | Tipo di blocco disponibile solo in un piano superiore | Scegli un altro tipo di blocco o aggiorna il piano |
| 403 | template_locked | Modello premium non disponibile nel piano attuale | Scegli un modello da GET /v1/templates/available |
| 403 | workspace_suspended, workspace_read_only, workspace_grace_expired | Workspace bloccato o in sola lettura per un pagamento in sospeso | Regola il pagamento nella dashboard |
| 404 | not_found | La risorsa non esiste o non appartiene al tuo workspace | Controlla l’ID |
| 409 | conflict | Conflitto generico con lo stato attuale | Ricarica lo stato, modifica l’input |
| 409 | workspace_template_in_use | Il modello del workspace è ancora usato da alcune pagine; il numero è in details.count | Passa le pagine a un altro modello, poi eliminalo |
| 409 | handle_taken, slug_taken | Handle o slug del link breve già in uso | Scegli un altro valore |
| 409 | form_in_use, page_not_private, page_not_published, never_published | Conflitto con lo stato: modulo ancora su una pagina, pagina non privata o non pubblicata, mai pubblicata | Cambia lo stato, poi riprova |
| 409 | page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reached | Raggiunto il limite di quantità o di spazio del piano | Rimuovi delle voci o aggiorna il piano |
| 409 | draft_not_publishable | La bozza ha dei problemi; l’elenco è in details.issues | Risolvi i problemi, poi pubblica di nuovo |
| 413 | request_too_large | Corpo più grande di quanto consentito per questo endpoint (64 KB, 1 MB o 2 MB); il limite è in details.max_kb | Invia meno dati per richiesta, vedi Limiti di richieste |
| 413 | payload_too_large | File caricato più grande di 10 MB | Riduci il file |
| 422 | validation_failed | Input non valido o campo sconosciuto; dettagli in details | Correggi i campi come descritto in details |
| 422 | handle_reserved, target_url_invalid, target_url_scheme, target_url_host | Handle riservato, oppure URL di destinazione non valido o non consentito | Scegli un altro valore |
| 422 | workspace_template_disabled | Il modello del workspace selezionato è disattivato | Attiva il modello in «Domini e modelli» o scegline un altro |
| 422 | template_css_external, template_section_invalid | Modello del workspace: il CSS carica da server esterni, oppure una sezione {{#if}}/{{#unless}}/{{#each}} è posizionata in modo errato | Rimuovi gli indirizzi esterni, oppure chiudi la sezione all’interno dello stesso tag o testo |
| 422 | custom_css_external | Il CSS personalizzato carica qualcosa da server esterni | Rimuovi gli indirizzi esterni dal CSS |
| 429 | rate_limited, api_key_locked | Troppe richieste, oppure chiave bloccata dopo tentativi falliti | Attendi quanto indicato da Retry-After o details.retry_after_sec |
| 500 | internal_error | Errore imprevisto | Riprova più tardi, annota il request_id |
| 503 | service_unavailable | Servizio temporaneamente non disponibile | Riprova dopo una pausa |
Leggere gli errori di input
Con 422 validation_failed, details elenca ogni problema separatamente: field è il percorso del campo (con barre per gli oggetti annidati, per esempio theme_config/button_style), reason è la regola violata, come required, minLength, maxLength, enum o additionalProperties. Con additionalProperties, il messaggio dice quali campi sono sconosciuti – spesso è un errore di battitura nel nome del campo.
Gestione consigliata nel tuo codice
- 400, 413 e 422: non ripetere, correggi invece la richiesta
- 401 invalid_token: richiedi una volta un nuovo token e riprova
- 403: non ripetere; controlla lo scope, il piano o chi è autorizzato a farlo
- 404: controlla l’ID; dopo un’eliminazione è normale
- 409: ricarica lo stato e decidi se l’azione serve ancora
- 429: attendi quanto indicato da Retry-After, poi riprova – vedi Limiti di richieste
- 500 e 503: riprova qualche volta con pause crescenti
Potrebbe esserti utile anche
Non hai trovato nulla?
Dicci di cosa hai bisogno e il nostro team di assistenza ti aiuterà personalmente.