Errori, paginazione e quote
Il corpo degli errori, i codici di stato che incontrerai, le risposte sulle quote, come paginano gli endpoint di elenco, le maiuscole miste negli ID delle risposte e come viene conteggiato l'utilizzo dell'API.
Queste convenzioni valgono per tutta l’API REST. MCP gestisce gli errori a modo suo, come spiegato in Panoramica di MCP.
Il corpo degli errori
Quasi ogni errore è un oggetto JSON con un unico messaggio leggibile da una persona:
{"error": "Conversation not found"}
Non esistono codici di errore generali leggibili da una macchina. Alcune famiglie di errori aggiungono un campo in più:
| Campo aggiuntivo | Quando | Esempio |
|---|---|---|
reason | Quote e limiti del piano (429) | {"error":"Quota exceeded","reason":"credit_count"} |
code | Blocchi dovuti ai guardrail e alla residenza dei dati sugli endpoint di esecuzione | {"error":"...","code":"SENSITIVE_DATA_BLOCKED"} |
error_code | Blocchi per dati sensibili ed errori dei server MCP sugli endpoint delle conversazioni | {"error":"...","error_code":"..."} |
I codici relativi alla residenza dei dati sono EU_INFERENCE_REQUIRED, ZERO_RETENTION_REQUIRED, NO_PROVIDER_ASSIGNED e NO_ENDPOINT_AVAILABLE. Alcuni errori di autenticazione restituiscono solo lo stato, con il corpo vuoto, quindi non dare per scontato che ogni risposta di errore sia un JSON valido.
Codici di stato
| Stato | Significato | Corpo tipico |
|---|---|---|
200 / 201 / 204 | Operazione riuscita | La risorsa, oppure niente per 204 |
400 | JSON non valido o un campo non ha superato la validazione; anche modelli soggetti a restrizioni e blocchi per residenza dei dati e guardrail sugli endpoint di esecuzione | {"error":"<binding error text>"} |
401 | Nessuna chiave API valida | {"error":"Invalid API key"}, oppure un corpo vuoto quando non è stata riconosciuta alcuna chiave |
403 | Alla chiave manca un’autorizzazione, la route non è accessibile alle chiavi, l’account non è attivo oppure la richiesta proviene da una regione non supportata | {"error":"This api key does not have any of the required permissions. You need at least one of: ..."} |
404 | Risorsa non trovata, o non visibile al proprietario della chiave | {"error":"Conversation not found"} (alcune route restituiscono un corpo vuoto) |
429 | Raggiunta la quota del workspace o un limite del piano | {"error":"Quota exceeded","reason":"..."} |
500 / 503 | L’operazione non è riuscita, per esempio perché non è stato selezionato alcun modello o per un errore del provider | {"error":"<message>"} |
Gli stati esatti di ogni endpoint sono elencati nelle singole pagine di riferimento REST. Gli errori di autenticazione sono spiegati in Chiavi API e autenticazione.
Quote
Le route che avviano lavoro a pagamento - esecuzioni, conversazioni, generazione di media, trascrizione, caricamenti nelle knowledge base ed elaborazione di file - verificano prima il piano e i crediti del workspace. Se la verifica non va a buon fine, restituiscono:
HTTP 429
{"error": "Quota exceeded", "reason": "credit_count"}
reason | Significato |
|---|---|
credit_count | Il workspace ha esaurito i crediti. Un amministratore può ricaricarli nell’app. |
user_count | Un limite sul numero di utenti previsto dal piano del workspace. |
subscription | L’abbonamento del workspace non lo consente. |
trial_expired | Il periodo di prova è terminato. |
unknown | Non è stato possibile classificare il limite. |
In questo caso un 429 non è un rate limit, quindi riprovare subito non serve. Segnalalo a una persona che possa intervenire. Crediti e piani sono trattati in Utilizzo, crediti e fatturazione.
Rate limit
Non esiste un rate limit pubblicato per chiave o per utente. Il volume di richieste dipende dal piano e dai crediti del tuo workspace, e i limiti si manifestano con la risposta 429 Quota exceeded descritta sopra. Le chiamate sincrone lunghe (un modello lento, una trascrizione estesa) durano quanto il lavoro che svolgono, quindi imposta un timeout generoso nel tuo client HTTP.
Paginazione
Gli endpoint di elenco che paginano accettano due parametri di query:
| Query | Predefinito | Significato |
|---|---|---|
page | 1 | Numero di pagina, a partire da 1. |
size | 10 | Elementi per pagina. |
I metadati di paginazione si trovano negli header della risposta, non nel corpo. Il corpo è un semplice array JSON.
| Header | Significato |
|---|---|
X-Page | La pagina che hai ricevuto. |
X-Page-Size | La dimensione di pagina usata. |
X-Total-Count | Il numero totale di elementi in tutte le pagine. |
Alcuni endpoint di elenco restituiscono tutto quando non invii parametri di paginazione (per esempio GET /ai_model). Il riferimento di ogni endpoint indica quali.
curl -i "https://api.stickyprompts.com/api/v1/conversation?page=2&size=25" \
-H "Authorization: Bearer $STICKY_API_KEY"
# X-Page: 2
# X-Page-Size: 25
# X-Total-Count: 137import os
import requests
BASE = "https://api.stickyprompts.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['STICKY_API_KEY']}"}
def all_conversations(size=50):
page = 1
while True:
r = requests.get(f"{BASE}/conversation", headers=HEADERS,
params={"page": page, "size": size})
r.raise_for_status()
yield from r.json()
if page * size >= int(r.headers["X-Total-Count"]):
break
page += 1const BASE = "https://api.stickyprompts.com/api/v1";
const headers = { Authorization: `Bearer ${process.env.STICKY_API_KEY}` };
async function* allConversations(size = 50) {
for (let page = 1; ; page++) {
const res = await fetch(`${BASE}/conversation?page=${page}&size=${size}`, { headers });
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
yield* await res.json();
if (page * size >= Number(res.headers.get("X-Total-Count"))) break;
}
}Gli strumenti MCP paginano in modo diverso, con gli argomenti limit e offset e un total_count nel risultato. Consulta Riferimento degli strumenti.
ID e convenzioni dei nomi dei campi
- La maggior parte delle risorse usa ID numerici. Molti endpoint accettano anche uno
slugdi 8 caratteri al posto dell’ID; le pagine di riferimento indicano dove. - La maggior parte dei record include quattro campi di base con chiavi con l’iniziale maiuscola:
ID,CreatedAt,UpdatedAteDeletedAt. Gli altri campi sono in snake_case, e alcuni in camelCase (per esempioisUsernei messaggi,userIdeprojectIdnelle conversazioni). - Alcune risposte costruite a mano, come i risultati delle esecuzioni dei prompt, usano invece
idecreated_atin minuscolo. - I valori di crediti e importi tipizzati come decimali (per esempio
credits_used,multiplier) arrivano come stringhe JSON, del tipo"0.4213". Interpretali con un tipo decimale, non con un float.
{
"ID": 5120,
"CreatedAt": "2026-09-28T09:13:58Z",
"DeletedAt": null,
"slug": "aB3dE5gH",
"userId": 77,
"next_message_ai_model_id": 42,
"credits_used": "0.4213"
}
Nel tuo client mappa i campi in modo esplicito, invece di affidarti a un’unica convenzione di denominazione.
Correlation ID
Ogni risposta contiene un header X-Correlation-ID. Registralo insieme ai log delle tue richieste. Se ti serve aiuto su una chiamata specifica, includilo quando scrivi a hello@stickyprompts.com.
Restrizione geografica
Le richieste provenienti da una regione non servita vengono rifiutate, sia via REST sia via MCP:
HTTP 403
{"error": "access from your region is not supported"}
Come viene conteggiato l’utilizzo
Le chiamate API e MCP seguono lo stesso percorso di esecuzione, quote e fatturazione della web app. L’utilizzo viene attribuito al proprietario della chiave e al suo workspace, esattamente come se avesse fatto la stessa cosa nell’app, e attinge agli stessi crediti. Non esiste un listino prezzi separato per l’API, e l’utilizzo dell’API non viene riportato separatamente da quello dell’app. Le singole risposte delle esecuzioni non includono il numero di token né il costo; gli amministratori del workspace vedono l’utilizzo in Utilizzo, crediti e fatturazione.