Errores, paginación y cuotas
El cuerpo de error, los códigos de estado que verás, las respuestas de cuota, cómo paginan los endpoints de listas, la mezcla de mayúsculas y minúsculas en los ID de las respuestas y cómo se cuenta el uso de la API.
Estas convenciones se aplican a toda la API REST. MCP tiene su propio comportamiento ante los errores, que se explica en Introducción a MCP.
El cuerpo de error
Casi todos los errores son un objeto JSON con un único mensaje legible por personas:
{"error": "Conversation not found"}
No hay códigos de error generales pensados para máquinas. Algunas familias de errores añaden un campo adicional:
| Campo adicional | Cuándo | Ejemplo |
|---|---|---|
reason | Cuotas y límites del plan (429) | {"error":"Quota exceeded","reason":"credit_count"} |
code | Bloqueos de guardrails y de residencia de datos en los endpoints de ejecución | {"error":"...","code":"SENSITIVE_DATA_BLOCKED"} |
error_code | Bloqueos por datos sensibles y errores de servidores MCP en los endpoints de conversación | {"error":"...","error_code":"..."} |
Los códigos de residencia de datos son EU_INFERENCE_REQUIRED, ZERO_RETENTION_REQUIRED, NO_PROVIDER_ASSIGNED y NO_ENDPOINT_AVAILABLE. Algunos fallos de autenticación devuelven solo el código de estado, con el cuerpo vacío, así que no des por hecho que todas las respuestas de error se pueden analizar como JSON.
Códigos de estado
| Estado | Significado | Cuerpo habitual |
|---|---|---|
200 / 201 / 204 | Éxito | El recurso, o nada en el caso de 204 |
400 | JSON no válido o un campo que no ha superado la validación; también modelos restringidos y bloqueos de residencia de datos y de guardrails en los endpoints de ejecución | {"error":"<binding error text>"} |
401 | No hay ninguna clave de API válida | {"error":"Invalid API key"}, o un cuerpo vacío si no se ha reconocido ninguna clave |
403 | A la clave le falta un permiso, la ruta no admite claves, la cuenta no está activa o la petición procede de una región no admitida | {"error":"This api key does not have any of the required permissions. You need at least one of: ..."} |
404 | No existe o el propietario de la clave no puede verlo | {"error":"Conversation not found"} (algunas rutas devuelven un cuerpo vacío) |
429 | Se ha alcanzado la cuota del espacio de trabajo o un límite del plan | {"error":"Quota exceeded","reason":"..."} |
500 / 503 | La operación ha fallado, por ejemplo porque no se ha seleccionado ningún modelo o por un error del proveedor | {"error":"<message>"} |
Los códigos de estado exactos de cada endpoint aparecen en cada página de referencia REST. Los errores de autenticación se explican en Claves de API y autenticación.
Cuotas
Las rutas que inician trabajo de pago (ejecuciones, conversaciones, generación multimedia, transcripción, subidas a bases de conocimiento y procesamiento de archivos) comprueban primero el plan y los créditos del espacio de trabajo. Si la comprobación falla, devuelven:
HTTP 429
{"error": "Quota exceeded", "reason": "credit_count"}
reason | Significado |
|---|---|
credit_count | El espacio de trabajo ha agotado sus créditos. Un administrador puede recargarlos en la aplicación. |
user_count | Un límite en el número de usuarios del plan del espacio de trabajo. |
subscription | La suscripción del espacio de trabajo no lo permite. |
trial_expired | El periodo de prueba ha terminado. |
unknown | No se ha podido clasificar el límite. |
En este caso, un 429 no es un límite de frecuencia, así que reintentar de inmediato no servirá de nada. Hazlo llegar a una persona que pueda resolverlo. Los créditos y los planes se explican en Uso, créditos y facturación.
Límites de frecuencia
No hay ningún límite publicado de peticiones por clave ni por usuario. El volumen de trabajo lo determinan el plan y los créditos de tu espacio de trabajo, y se comunica mediante la respuesta 429 Quota exceeded descrita arriba. Las llamadas síncronas largas (un modelo lento, una transcripción larga) duran lo que tarde el trabajo, así que configura un tiempo de espera generoso en tu cliente HTTP.
Paginación
Los endpoints de listas que paginan aceptan dos parámetros de consulta:
| Parámetro | Valor predeterminado | Significado |
|---|---|---|
page | 1 | Número de página, empezando por 1. |
size | 10 | Elementos por página. |
Los metadatos de paginación van en los headers de la respuesta, no en el cuerpo. El cuerpo es un array JSON simple.
| Header | Significado |
|---|---|
X-Page | La página que has recibido. |
X-Page-Size | El tamaño de página utilizado. |
X-Total-Count | El número total de elementos en todas las páginas. |
Algunos endpoints de listas lo devuelven todo si no envías parámetros de paginación (por ejemplo, GET /ai_model). La referencia de cada endpoint indica cuáles.
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;
}
}Las herramientas MCP paginan de otra forma: con los argumentos limit y offset, y con un total_count en el resultado. Consulta la referencia de herramientas MCP.
ID y mayúsculas en los nombres de campo
- La mayoría de los recursos usan ID numéricos. Muchos endpoints aceptan también un
slugde 8 caracteres en lugar del ID; las páginas de referencia indican dónde. - La mayoría de los registros incluyen cuatro campos base cuyas claves van con mayúscula inicial:
ID,CreatedAt,UpdatedAtyDeletedAt. El resto de los campos están en snake_case, y algunos en camelCase (por ejemplo,isUseren los mensajes, ouserIdyprojectIden las conversaciones). - Algunas respuestas construidas a mano, como los resultados de ejecución de prompts, usan en su lugar
idycreated_aten minúsculas. - Los valores de créditos e importes de tipo decimal (por ejemplo,
credits_usedomultiplier) llegan como cadenas JSON, del tipo"0.4213". Analízalos con un tipo decimal, no con uno de coma flotante.
{
"ID": 5120,
"CreatedAt": "2026-09-28T09:13:58Z",
"DeletedAt": null,
"slug": "aB3dE5gH",
"userId": 77,
"next_message_ai_model_id": 42,
"credits_used": "0.4213"
}
En tu cliente, asigna cada campo de forma explícita en lugar de depender de una única convención de nombres.
ID de correlación
Cada respuesta incluye un header X-Correlation-ID. Regístralo junto con tus propios logs de peticiones. Si necesitas ayuda con una llamada concreta, inclúyelo cuando escribas a hello@stickyprompts.com.
Restricción geográfica
Las peticiones procedentes de una región en la que el servicio no está disponible se rechazan, tanto en REST como en MCP:
HTTP 403
{"error": "access from your region is not supported"}
Cómo se cuenta el uso
Las llamadas a la API y a MCP pasan por la misma ruta de ejecución, cuotas y facturación que la aplicación web. El uso se atribuye al propietario de la clave y a su espacio de trabajo, exactamente igual que si hubiera hecho lo mismo en la aplicación, y consume los mismos créditos. No hay una lista de precios aparte para la API, y el uso de la API no se muestra por separado del uso de la aplicación. Las respuestas de cada ejecución no incluyen el recuento de tokens ni el coste; los administradores del espacio de trabajo ven el uso en Uso, créditos y facturación.