Codici di errore

I codici di stato HTTP di Listings API, i codici di errore SYxxxxx per Listings e Social e i tre formati delle risposte di errore restituiti dall'API v4.

Listings API usa i codici di stato HTTP convenzionali per indicare l'esito di una richiesta. I codici di errore hanno il prefisso SY e sono inclusi nella stringa di errore message, nel formato SYxxxxx: <human-readable reason>.

Codici di stato HTTP

HTTP status code summary

StatoSignificatoCodice SY tipicoEccezione del Python SDK
200 OKRichiesta riuscita. Per le scritture, controlla anche il corpo della risposta (vedi di seguito).--
400 Bad RequestRichiesta malformata, filtro non analizzabile, valore di enumerazione non valido o ID malformato.SY90006, SY90001ValidationError
401 UnauthorizedLa chiave API è mancante, malformata o revocata. Non hai ancora una chiave? Ottieni un pass giornaliero gratuito per la sandbox quando è disponibile.SY90005AuthenticationError
402 Payment RequiredL'account ha una fattura non pagata, quindi l'accesso all'API è sospeso. Una fattura non pagata relativa solo a Social sospende soltanto gli endpoint Social. Vedi payment_required e social_payment_required.-APIError
403 ForbiddenLa chiave è valida ma non è autorizzata ad accedere alla risorsa.SY90003PermissionDeniedError
404 Not FoundIl percorso o una risorsa identificata tramite ID non esiste.SY90002NotFoundError
422 Unprocessable EntityLa richiesta era ben formata, ma non è stato possibile elaborare un valore (ad esempio, una categoria sconosciuta o ambigua).-ValidationError
429 Too Many RequestsHai superato il limite di frequenza del tuo piano. Rispetta l'header Retry-After.-RateLimitError
5xxErrore del server. Per una lettura, puoi riprovare in sicurezza con attese progressivamente più lunghe; prima di ripetere una scrittura, consulta l'avvertenza sulle scritture di seguito.SY90007InternalServerError

Tre formati di risposta

La maggior parte degli errori include un array errors, al livello principale o annidato nel risultato dell'operazione, come mostrato nelle sezioni seguenti. Alcuni errori restituiscono invece un singolo oggetto error: il superamento del limite di frequenza (429) e alcuni errori a livello di richiesta (400/500 con un code come INTERNAL_SERVER_ERROR). Controlla entrambi i casi: errors è un array, error è un oggetto.

1. A livello di richiesta: errors[] al livello principale

Gli errori di autenticazione, autorizzazione e richiesta malformata interrompono l'elaborazione prima che l'operazione venga eseguita. Restituiscono il codice di stato 4xx corrispondente (vedi sopra), con l'errore al livello principale della risposta.

JSON
{  "data": { "createLocation": null },  "errors": [{ "message": "SY90005: Invalid Token" }]}

2. Validazione delle scritture: data.<operation>.errors[] annidato

Una richiesta di creazione, aggiornamento o pubblicazione altrimenti ben formata restituisce HTTP 200. Se l'input viola una regola di business, l'errore viene segnalato in data.<operation>.errors, annidato nel payload dell'operazione stessa. In caso di successo, questo array è presente e vuoto ("errors": []).

JSON
{  "data": {    "createLocation": {      "errors": [        { "message": "SY10126: City is Mandatory" },        { "message": "SY10010: state_iso" }      ],      "location": null    }  }}

3. A livello di gateway: un singolo oggetto error al livello principale

Il superamento del limite di frequenza e i guasti imprevisti del gateway interrompono l'elaborazione prima della traduzione e restituiscono un oggetto error con un code, un message e un correlation_id. Per il corpo della risposta 429, vedi rate_limited di seguito.

Leggi sempre data.<operation>.errors quando esegui una scrittura, anche in caso di risposta 200 con un oggetto data.<operation> popolato: una scrittura può fallire parzialmente e segnalarlo qui.

Una risposta 402 Payment Required non ha un contenitore error: code, message, doc_url e, quando c'è una fattura da pagare, pay_url si trovano al livello principale. Vedi payment_required di seguito.

Ripetere una scrittura non è a costo zero

L'API v4 non supporta Idempotency-Key: l'header viene ignorato e nessun endpoint rileva le scritture ripetute. Una chiamata di creazione, aggiornamento o pubblicazione che supera il tempo limite o restituisce un codice 5xx potrebbe comunque aver salvato le modifiche sul server, quindi ripeterla senza verifiche può produrre una sede, un post o una risposta a una recensione duplicati.

Puoi ripetere liberamente le letture con attese progressivamente più lunghe. Per una scrittura, esegui prima una lettura di verifica: cerca il record tramite una chiave che controlli (storeId, un codice del punto vendita, l'elenco delle risposte dell'interazione) e ripeti la chiamata solo se il record è effettivamente assente.

Codici comuni

Common SY error codes

CodiceMessaggioStato HTTPSignificato
SY90005Invalid Token401La chiave API è mancante, non è nel formato corretto o è stata revocata. Genera una nuova chiave dalla dashboard e inviala come Authorization: API <your-key>.
SY90001Not authorized to access this resource401 / 403La chiave è stata rifiutata per questa risorsa. Sia il Python SDK sia il Node SDK sollevano questo errore come AuthenticationError.
SY90002Invalid Id404 / 400Non è stato possibile risolvere un ID nel percorso o in un argomento (spesso un relay ID errato o non codificato in base64).
SY10126City is Mandatory200 (corpo della risposta)Un campo obbligatorio (city) è stato omesso dall'input.
SY10010state_iso200 (corpo della risposta)Il valore di stateIso è mancante o non valido. Consulta l'endpoint dei paesi e degli stati per i valori validi.

I codici di validazione nell'intervallo SY10xxx corrispondono a un campo di input specifico; message indica il nome del campo o della regola per cui la validazione non è riuscita. I codici di autenticazione e autorizzazione nell'intervallo SY90xxx riguardano l'intera richiesta e vengono restituiti al livello principale con lo stato corrispondente.

Codici degli account collegati

I codici nell'intervallo SY810xx provengono dagli endpoint Connected Accounts che importano o collegano una scheda di una piattaforma di pubblicazione. Vengono restituiti annidati nel corpo della risposta con HTTP 200 (struttura della risposta 2 riportata sopra), quindi leggi data.<operation>.errors anche quando lo stato indica un esito positivo.

SY810xx connected-account and import codes

CodiceSignificatoCosa fare
SY81019Non è stato possibile individuare un utente per l'account associato alla chiave.Contatta l'assistenza: l'account non ha un utente principale attivo.
SY81066connectedAccountId non esiste oppure l'account è archiviato.Leggi nuovamente l'ID da GET /connected-accounts.
SY81067Non è stato possibile decodificare o risolvere connectedAccountListingId.Recuperalo nuovamente da id di un record di connected-account-listings.
SY81068Quella scheda è già collegata a una sede.Scollegala prima oppure scegli un'altra scheda.
SY81069Le credenziali dell'account collegato non sono più valide.Ricollega l'account tramite connect-google o connect-facebook.
SY81070La scheda non appartiene all'account collegato che hai indicato.Associa ogni scheda all'account da cui proviene. Una causa comune è il recupero delle schede senza connectedAccountId nel corpo della richiesta, che restituisce le schede di un altro account.
SY81071Si è verificato un errore imprevisto durante la creazione della sede.Riprova; se il problema persiste, contatta l'assistenza.
SY81072La creazione della sede non è riuscita durante la preparazione o il salvataggio.Riprova; se il problema persiste, contatta l'assistenza.
SY81073Il tipo di scheda non è supportato per l'importazione.È possibile importare solo schede Google e Facebook.
SY81074Google non ha restituito dati per la scheda.Verifica che la scheda esista ancora e che l'account la gestisca ancora.
SY81075È stato superato il limite di frequenza delle richieste all'API di Google.Riprova più tardi usando il backoff.
SY81076Il recupero della scheda da Google non è riuscito.Riprova; controlla le autorizzazioni Google dell'account.
SY81077Non è stato possibile determinare il paese dalla pagina Facebook.Aggiungi un paese all'indirizzo della pagina su Facebook, quindi riprova.
SY81078La preparazione dei dati della sede a partire dalla pagina Facebook non è riuscita.Riprova; se il problema persiste, contatta l'assistenza.
SY81081La scheda non ha una categoria principale impostata.Imposta una categoria principale nella scheda, quindi riprova.
SY81082Il paese della scheda non è supportato.Consulta l'endpoint dei paesi e degli stati per i paesi supportati.
SY81083Non è stato possibile importare la scheda Google.Contatta l'assistenza indicando il timestamp.
SY81084Si è verificato un errore interno durante la preparazione dell'importazione da Facebook.Riprova; se il problema persiste, contatta l'assistenza indicando il timestamp.
SY81085Non è stato possibile importare la pagina Facebook.Contatta l'assistenza indicando il timestamp.
SY81086La creazione della sede è stata rifiutata da una regola di business. Il campo annidato message contiene il codice sottostante, ad esempio SY10151 quando l'account ha esaurito gli slot disponibili per le sedi.Leggi il messaggio annidato; per SY10151, aggiungi un componente aggiuntivo per una sede oppure passa a un piano superiore.
SY81087La richiesta di creazione della sede non è riuscita.Riprova; se il problema persiste, contatta l'assistenza indicando il timestamp.
SY81088La creazione della sede non è riuscita per un motivo non riconosciuto.Contatta l'assistenza indicando il timestamp.
SY81089Una chiamata a un servizio interno ha restituito uno stato che non indica un esito positivo. Non si tratta di un problema della tua richiesta.Riprova una volta; se il problema persiste, contatta l'assistenza indicando il timestamp, così potremo rintracciare la chiamata interna.
SY81090Si è verificato un errore imprevisto durante la chiamata interna di creazione della sede.Riprova; se il problema persiste, contatta l'assistenza indicando il timestamp.

Codici Social

I codici nell'intervallo SY950xx provengono dagli endpoint Social: brand, connessioni e post social. Come i codici degli account collegati, sono annidati nel corpo della risposta su un HTTP 200, quindi leggi data.<operation>.error (e data.<operation>.errors sulle route per le operazioni in blocco) anche quando lo stato indica un esito positivo.

SY950xx Social codes

CodiceSignificatoCosa fare
SY95041L'account ha raggiunto il limite di brand. Non si verifica con un piano API: con questo piano i brand sono illimitati.Non devi fare nulla con un piano API. Se dovessi riscontrarlo, segnalalo: GET /social/limits dovrebbe restituire brands: null.
SY95042L'account ha raggiunto il limite di connessioni per il periodo di fatturazione corrente.Il limite viene confrontato con usage.connections da GET /social/limits, ovvero il conteggio fatturabile: le connessioni attualmente attive più quelle rilasciate in questo periodo. Uno slot liberato tramite la disconnessione o l'archiviazione di un brand rimane riservato fino alla fine del periodo, quindi una disconnessione recente non risolve questo errore. Ricollega uno degli account che hai rilasciato al brand a cui era collegato (gratuitamente, riutilizzando quello slot), acquista un altro pacchetto da 5 connessioni (con effetto immediato) oppure attendi il rinnovo, quando gli slot usage.connectionsReleased torneranno disponibili. Collegare un account rilasciato a un brand diverso non riutilizza lo slot. Consulta Piani e componenti aggiuntivi.
SY95043Non esiste un brand con quell'ID in questo account, oppure il brand è archiviato.Rileggi l'ID da GET /social/brands. Gli ID dei brand sono semplici UUID, non ID relay in Base64.
SY95044Quella piattaforma non è abilitata per questo account.Il piano Social dell'account non include la piattaforma che hai chiesto di collegare. Contatta l'assistenza oppure scegli una piattaforma inclusa nell'account.
SY95045Il brand non ha un canale collegato per quella piattaforma.Indirizza l'utente a un link di connessione per quella piattaforma, oppure rimuovila da platforms. Questo errore si verifica anche quando il canale è stato scollegato dopo la programmazione del post.
SY95046La programmazione o il fuso orario non è valido.Invia scheduledAt oppure scheduleDate + scheduleTime, mai entrambi. scheduledAt richiede uno scostamento da UTC; scheduleTime è HH:MM. I fusi orari sono identificatori IANA (tzCode).
SY95047Non esiste un processo in blocco con quell'ID in questo account.Rileggi job.id dalla risposta di creazione in blocco. I processi non vengono conservati per sempre.
SY95048La richiesta in blocco supera il limite di righe.Invia al massimo 500 righe per richiesta e suddividi le restanti in ulteriori lotti. Non è stato creato nulla.
SY95049L'URL di reindirizzamento non è valido.redirectUrl e errorUrl in un link di connessione devono essere URL https assoluti sotto il tuo controllo.
SY95050La convalida in blocco non è riuscita; consulta gli errori delle singole righe.Non è stato creato nulla. Leggi job.results[]: ogni riga rifiutata riporta il proprio index con numerazione a partire da 0, il proprio clientReference e il motivo in errors[]. Correggi quelle righe e invia nuovamente l'intero lotto.
SY95051Il brand non ha soddisfatto il requisito di permanenza di 90 giorni.Un brand non può essere archiviato finché non sono trascorsi 90 giorni dalla sua creazione. La risposta riporta anche status: "TENURE_NOT_MET" e non è stato modificato nulla. Riprova dopo il 90° giorno, quando il brand e le sue connessioni vengono archiviati immediatamente, anche se i relativi slot di connessione rimangono riservati fino alla fine del periodo di fatturazione. Consulta la regola sulla permanenza.
SY95052Il canale collegato non appartiene a questo brand.Associa ogni connessione al brand per cui è stata creata. Questo errore si verifica spesso quando una chiamata agli insights viene costruita usando il post di un brand e l'ID del canale di un altro brand.

SY95042 e SY95044 sono errori relativi alle funzionalità consentite dal piano, non errori di input: riprovare senza modificare il piano produrrà lo stesso errore. SY95045, SY95046, SY95049 e SY95052 sono errori di input, correggibili nella richiesta successiva.

Codici dei diritti di utilizzo di Listings

Listings plan codes

CodiceSignificatoCosa fare
SY10150L'account ha raggiunto il limite di sedi.Archivia una sede, acquista un componente aggiuntivo per una sede extra oppure passa a un piano superiore. Consulta Piani e componenti aggiuntivi.
SY10151L'account ha esaurito i posti disponibili per le sedi con questo piano. Con un pass giornaliero sandbox, entrambe le sedi incluse sono in uso.Le soluzioni sono le stesse indicate per SY10150. Con un pass giornaliero, aggiorna una sede esistente oppure scegli un piano a pagamento. Compare anche come errore annidato in SY81086 quando una sede viene creata da una scheda di un account collegato.
SY10152La sede non è attiva da abbastanza tempo per poter essere archiviata.Le sedi devono rimanere attive per il periodo minimo previsto per l'account, pari a 90 giorni per impostazione predefinita, prima che POST /locations/archive le accetti. Attendi che il periodo minimo sia trascorso.
SY10155L'account non dispone di un piano Listings, quindi non è possibile creare sedi.La chiave API appartiene a un account senza abbonamento Listings, ad esempio un account con solo Social. Le sedi fanno parte del prodotto Listings; sottoscrivi un abbonamento prima di chiamare POST /locations.

rate_limited

429 Too Many Requests: l'account ha superato il limite di frequenza del proprio piano. Il corpo contiene la risposta di errore standard con un suggerimento retry_after_seconds, un correlation_id da citare nelle richieste di assistenza e un doc_url che rimanda a questa sezione:

JSON
{  "error": {    "code": "RATE_LIMITED",    "message": "Too many requests. Slow down.",    "retry_after_seconds": 30,    "correlation_id": "9f2c1e64-2b1a-4b0e-9f1a-2c7d5e8a1b3c",    "doc_url": "https://listingsapi.com/docs/error-codes#rate_limited"  }}

Attendi il tempo indicato da retry_after_seconds (o dall'header Retry-After, se presente), quindi riprova con backoff esponenziale. Consulta Limiti di frequenza per i limiti di ciascun piano e un'implementazione di riferimento del backoff.

payment_required

402: l'ultimo pagamento per questo account non è andato a buon fine, quindi tutti gli endpoint /api/v4 sono sospesi. Il corpo include pay_url, la pagina Stripe della fattura non pagata, quando disponibile, e l'header di risposta X-Error-Code contiene lo stesso code. Puoi comunque aprire la pagina di fatturazione nella dashboard per pagare.

JSON
{  "code": "payment_required",  "message": "This account has an unpaid invoice, so API access is paused. Pay the invoice to restore access.",  "pay_url": "https://invoice.stripe.com/i/acct_123/test_abc",  "doc_url": "https://listingsapi.com/docs/error-codes#payment_required"}

L'accesso viene ripristinato entro un minuto dal pagamento dell'ultima fattura in sospeso. Se la fattura risulta ancora non pagata 3 giorni dopo il primo tentativo di pagamento non riuscito, l'abbonamento Listings viene annullato e le sedi dell'account vengono archiviate. Se l'account dispone anche di un abbonamento Social attivo, mantiene l'accesso a Social; altrimenti, l'account viene chiuso e le sue chiavi API smettono di funzionare.

social_payment_required

402: l'ultimo pagamento per l'abbonamento Social non è andato a buon fine, quindi gli endpoint Social (/api/v4/social/*) sono sospesi. Gli endpoint Listings continuano a funzionare. Il corpo contiene gli stessi campi di payment_required, con "code": "social_payment_required". Se la fattura risulta ancora non pagata 3 giorni dopo il primo tentativo di pagamento non riuscito, l'abbonamento Social viene annullato e i brand dell'account vengono archiviati. Un account senza abbonamento Listings viene chiuso e le sue chiavi API smettono di funzionare.

Errori del piano di controllo del portale sviluppatori

Gli endpoint per la gestione degli account e delle chiavi nel portale sviluppatori (le route API della dashboard stessa) restituiscono una risposta di errore strutturata in un unico formato, distinto dai formati REST errors[] riportati sopra. Ogni code contiene un correlation_id e un doc_url che rimanda alla sezione corrispondente di questa pagina.

JSON
{  "error": {    "code": "AUTH_INVALID_KEY",    "message": "Session is invalid or expired.",    "correlation_id": "9f2c1e64-2b1a-4b0e-9f1a-2c7d5e8a1b3c",    "doc_url": "https://listingsapi.com/docs/error-codes#auth_invalid_key"  }}

auth_missing_key

401: non è stata fornita alcuna credenziale. Accedi di nuovo oppure invia la tua chiave come Authorization: API <your-key>.

auth_invalid_key

401: la sessione o la chiave non è valida oppure è scaduta. Autenticati di nuovo oppure genera una nuova chiave dalla dashboard.

auth_insufficient_scope

403: la credenziale è valida, ma non autorizza questa azione. Una chiave con ambito di lettura non può chiamare endpoint di scrittura; genera una chiave di scrittura se ne hai bisogno.

not_found

404: la risorsa richiesta, o una risorsa identificata tramite ID, non esiste.

conflict

409: la richiesta è in conflitto con lo stato attuale della risorsa (ad esempio, la revoca di una chiave già revocata).

validation_failed

422: il corpo della richiesta non ha superato la validazione. I campi field e details della risposta indicano l'input che ha causato l'errore.

internal_error

500: un errore imprevisto lato server. Riprova una lettura con backoff esponenziale; per una scrittura, rileggi prima il record (consulta Riprovare una scrittura ha un costo). Cita il correlation_id se contatti l'assistenza.

dependency_unavailable

503: un servizio da cui dipende l'API è temporaneamente non disponibile. Riprova con backoff.

Per 429, consulta rate_limited sopra.

Gestire gli errori nel codice

Controlla prima lo stato HTTP; poi, per le operazioni di scrittura, cerca nel corpo della risposta un array errors annidato:

Python
from listingsapi import APIError, ListingsAPI client = ListingsAPI(api_key=os.environ["LISTINGSAPI_KEY"]) try:    location = client.locations.create(input=payload)except APIError as e:    # Raised for a non-2xx status (AuthenticationError, ValidationError, and    # so on) and for an error payload returned inside a 200 body.    raise RuntimeError(f"Listings API error: {e}") from e

Quando usi direttamente l'API HTTP, gli stessi due controlli sono espliciti: prima il codice di stato e poi il payload della risposta:

Python
resp = requests.post(    "https://listingsapi.com/api/v4/locations",    headers={"Authorization": f"API {os.environ['LISTINGSAPI_KEY']}"},    json=payload,    timeout=30,)resp.raise_for_status()body = resp.json() op = (body.get("data") or {}).get("createLocation") or {}if op.get("errors"):    messages = [e["message"] for e in op["errors"]]    raise RuntimeError(f"Listings API error: {messages}")

L'Python SDK esegue entrambi i controlli per te: associa ogni stato HTTP a un'eccezione tipizzata e solleva un'eccezione anche per i payload di errore restituiti all'interno di un corpo 200.