Desarrolladores
Solicitudes y errores
Cómo son las solicitudes y las respuestas de la API de Ora, qué significa cada error y cuáles son los límites de frecuencia.
Solicitudes y respuestas
Sección titulada «Solicitudes y respuestas»- JSON de entrada, JSON de salida. Envía
Content-Type: application/jsoncuando hay un cuerpo, y solo cuando lo hay. - Envoltorio. Todas las respuestas llevan
"success": trueo"success": false. Compruébalo, no solo el código de estado. - Las cantidades de tokens van en unidades base en bruto, como cadenas decimales, porque desbordan los números de JavaScript:
"250000000000". Divídelas entre 10 elevado al número de decimales del token para mostrarlas (la mayoría de los tokens de launchpads de Solana usan 6 decimales; los tokens EVM, 18). - Cantidades nativas. Los campos de entrada con nombre
…Solson números decimales simples del activo de gas de la chain (0.5). Las cantidades nativas en bruto de las respuestas van en lamports en Solana y en wei en las chains EVM. - Direcciones. Las direcciones de Solana van en base58; las direcciones EVM, en hexadecimal con
0x. En una ruta,{address}y{mint}son el mint (Solana) o el contrato (EVM) de un token. - ID de solicitud. Todas las respuestas llevan una cabecera
X-Request-ID. Envía el tuyo (un UUID v4) para vincular una llamada con tus logs; Ora lo propaga por todos los servicios por los que pasa. - Las marcas de tiempo van en ISO 8601, en UTC.
Errores
Sección titulada «Errores»Una llamada fallida responde con "success": false y un error. Cuando Ora reenvía el fallo de uno de sus servicios, error es un código de referencia corto (como M4K8T) y message contiene el motivo legible.
{ "success": false, "error": "M4K8T", "message": "…readable reason…"}| Estado | Significado | Qué hacer |
|---|---|---|
400 |
El cuerpo o un parámetro no es válido. | Lee error y message: indican el campo. No reintentes sin cambiar nada. |
401 |
Falta la clave, está mal formada, o se rotó o se revocó. | Revisa la cabecera y la clave. No reintentes en bucle: las claves rechazadas tienen un límite de frecuencia por IP. |
403 |
El acceso a la API está desactivado en la cuenta. | Pide al soporte de Ora que active el acceso a la API. |
404 |
No existe, o no es tuyo. Ora nunca revela si existe algo que no te pertenece. | Revisa el ID o la dirección, y que pertenezca a tu cuenta. |
409 |
El recurso no está en un estado que lo permita (aún no lanzado, ya en marcha...). | Lee el estado y luego actúa. |
429 |
Límite de frecuencia alcanzado. | Reduce el ritmo: consulta Límites de frecuencia. |
502 |
Un servicio detrás de la API ha fallado. | Reintenta con backoff. Si persiste, envía el código error y el X-Request-ID al soporte de Ora. |
503 |
No disponible temporalmente (una dependencia está caída u ocupada). | Reintenta con backoff. |
Límites de frecuencia
Sección titulada «Límites de frecuencia»| Cupo | Límite | Se cuenta por | Cubre |
|---|---|---|---|
| Solicitudes a la API | 100 por minuto | Cuenta | Todas las solicitudes hechas con tu clave, streams incluidos (una por conexión). Es independiente del cupo propio de la app: un script muy activo nunca ralentiza tu sesión en la app. |
| Claves rechazadas | 20 por minuto | Dirección IP | Las solicitudes cuya clave está mal formada o es desconocida (401). Superado el límite, reciben un 429. |
Las ventanas son fijas, de un minuto. Un 429 no lleva cabecera Retry-After: espera y luego reintenta con backoff exponencial, empezando en 1 segundo y con un máximo de 60. Reparte los trabajos por lotes en el tiempo en lugar de enviarlos en ráfagas.
export async function withRetry(fn, tries = 6) { for (let i = 0; ; i++) { try { return await fn(); } catch (err) { const retryable = err.status === 429 || err.status === 502 || err.status === 503; if (!retryable || i + 1 >= tries) throw err; await new Promise((r) => setTimeout(r, Math.min(60_000, 1000 * 2 ** i))); } }}// Reads only. Before retrying a write, check what already happened.