Límites de uso
Los límites dependen de tu plan y se cuentan por cuenta, sumando todas las claves. Se anuncian de antemano, cada rechazo indica su motivo y nunca se trunca nada en silencio. Los valores de esta página son los del catálogo de precios.
#Los límites por plan
Cuatro planes, cuatro conjuntos de límites. El plan Empresa se negocia; no tiene valor por defecto.
| Límite | Free | Traders | Financial | Startup |
|---|---|---|---|---|
| Peticiones al mes | 10.000 | 200.000 | 2.000.000 | 20.000.000 |
| Límite de velocidad, por minuto | 30 | 60 | 300 | 600 |
| Ráfaga permitida | 10 | 20 | 50 | 100 |
| Familias de datos | 4 / 12 | 7 / 12 | 12 / 12 | 12 / 12 |
| Endpoints REST abiertos | 41 | 77 | 119 | 119 |
| Conexiones WebSocket simultáneas | — | 3 | 10 | 20 |
El catálogo documenta 121 rutas, dos de las cuales son sondas fuera de cuota (/v1/health y /v1/status) que no cuentan para nadie. Solo la primera responde sin clave.
#Límite de velocidad y cuota mensual
Dos contadores, ambos por cuenta: no por dirección, no por clave. Rotar una clave, o repartir el tráfico entre varias direcciones, no cambia ni uno ni otro.
- El límite de velocidad se mide por minuto, con una ráfaga tolerada: unas cuantas peticiones de golpe pasan; más allá, las siguientes se suavizan y después se rechazan. El rechazo es un
429conRetry-After: 1. - La cuota mensual cuenta cada petición sujeta a cuota durante el mes natural en UTC, y se reinicia a cero el primer día del mes. Una vez agotada, devuelve un
429conRetry-After: 3600hasta que se renueva, o hasta un cambio de plan, que es inmediato.
HTTP/1.1 429 Too Many Requests
Retry-After: 1
X-Deny-Reason: rate
{"status":"error","timestamp":1775648290510,"detail":"Debit depasse : votre offre autorise un nombre limite de requetes par minute.","retry_after":1}La cabecera X-Deny-Reason lleva el motivo de cualquier rechazo ligado al plan (rate, quota, family, websocket o key), y el cuerpo lo repite en claro en detail. No hay cabecera de contador en las respuestas normales: el estado de la cuota se consulta en la consola, que avisa al 80 % y después en la primera petición rechazada.
#Las familias de datos
Cada endpoint pertenece exactamente a una familia de cuota, y cada plan abre un conjunto de familias. Una familia que falta en tu plan falta en todos los canales: la ruta REST devuelve un 403, el snapshot retira sus campos y los enumera en out_of_plan_fields, el flujo WebSocket rechaza el canal.
| Familia | Free | Traders | Financial | Startup |
|---|---|---|---|---|
| Precio y volumen prix-volume | sí | sí | sí | sí |
| Derivados derives | sí | sí | sí | sí |
| Microestructura microstructure | — | sí | sí | sí |
| Ticks brutos ticks | — | — | sí | sí |
| Opciones options | — | sí | sí | sí |
| Snapshot snapshot | — | sí | sí | sí |
| Indicadores indicateurs | sí | sí | sí | sí |
| Macro macro | sí | sí | sí | sí |
| On-chain onchain | — | — | sí | sí |
| Sentimiento sentiment | — | — | sí | sí |
| ETF etf | — | — | sí | sí |
| Tokenomics tokenomics | — | — | sí | sí |
HTTP/1.1 403 Forbidden
X-Deny-Reason: family
{"status":"error","timestamp":1775648290510,"detail":"Cette famille de donnees n est pas incluse dans votre offre."}La correspondencia entre las trece familias del catálogo y estas doce familias de cuota está en la página de precios; la que hay entre una ruta y su familia está en el catálogo de endpoints.
#Hasta dónde llega el historial
La profundidad del historial depende del plan y de la temporalidad. Es una ventana móvil desde ahora, no un límite por petición: ayer está fuera del plan en velas de 1 min en Free, sea cual sea la paginación.
| Temporalidad | Free | Traders | Financial | Startup |
|---|---|---|---|---|
1m | 1 h | 24 h | 3 días | 1 semana |
5m | 4 h | 3 días | 1 semana | 30 días |
15m | 4 h | 3 días | 1 semana | 30 días |
1h | 24 h | 1 semana | 30 días | 90 días |
4h | 1 semana | 30 días | 72 días | Completo |
1d | 30 días | Completo | Completo | Completo |
ticks | — | — | 1 h | 24 h |
30msigue la ventana de1hy1wla de1d: «Completo» vale por tanto también para la semana allí donde vale para el día.- Las rutas sin temporalidad (historiales
since_ms/until_ms, series diarias, funding) están limitadas por la ventana1hdel plan: 24 h en Free, 1 semana en Traders, 30 días en Financial, 90 días en Startup. - Las rutas tick a tick (
/v1/raw/spot-ticks,/v1/raw/futures-ticks,/v1/raw/trades) tienen su propia ventana, la filaticksde arriba, y solo están abiertas donde lo está la familia: 1 h en Financial, 24 h en Startup. - La comprobación se hace sobre el límite más antiguo realmente alcanzado:
limitmultiplicado por la duración de la temporalidad, osince_ms, o ununtil_msque ya va más allá de la ventana.
Superarlo devuelve un 403 explícito, nunca una respuesta truncada: el detail dice qué se pidió, qué permite el plan y el limit máximo utilizable.
HTTP/1.1 403 Forbidden
{"detail":"Profondeur d'historique hors offre : 30 jour(s) demandes en 1m, votre offre en autorise 1 heure(s) (soit limit=60 au maximum sur ce timeframe, et aucune borne since_ms/until_ms au-dela de cette fenetre)."}Lo que contiene el propio dato
Más allá de la ventana del plan, la profundidad disponible depende de la familia: Fear & Greed desde 2018, valoración on-chain y macro durante varios años, diferenciales entre mercados solo dos días. El catálogo /v1/macro/intraday/series da el valor exacto para cada instrumento macro.
#Conexiones al flujo
El flujo WebSocket está abierto a partir de Traders. La clave se comprueba en el handshake: un plan sin el flujo recibe un 403 y la conexión no se establece. El límite de conexiones simultáneas vale para toda la cuenta, sumando todas las claves; la conexión que sobra se cierra con el código 4003 y el límite en el motivo.
| Límite | Al superarlo |
|---|---|
| Simultaneous connections per account: 3 on Traders, 10 on Financial, 20 on Startup | cierre 4003, el límite en el motivo |
| Flujo ausente del plan (Free) | 403 en el handshake, X-Deny-Reason: websocket |
| Canal de una familia fuera del plan | op: error, la suscripción no se aplica |
| Aperturas: 1 por segundo, ráfaga de 10 | 429 en el handshake |
| Cola de envío de 256 tramas | se descartan las más antiguas, seq salta |
| 10 desbordamientos tolerados | cierre 4003, motivo «client too slow» |
Una conexión que permanece suscrita cuesta mucho menos que consultas repetidas: si llamas al mismo endpoint cada segundo, el flujo es la respuesta adecuada. Ver Flujo WebSocket.
#Límites de profundidad
Con independencia del plan, cada ruta limita su limit. Estos límites son técnicos; la ventana del plan se aplica encima, y cuenta la más estricta de las dos.
| Superficie | Tipo | Descripción |
|---|---|---|
REST endpoints | limit | Normalmente 1000; 500 en el ratio largo/corto y los diferenciales entre mercados; 10 000 en los ticks individuales. El límite exacto figura en la tabla de parámetros de cada ruta. |
Snapshot | one ceiling per field | 1000 velas, 1440 minutos para las series por minuto, 3600 segundos para las operaciones agregadas, 10 000 para los ticks; 200 ventanas para el CVD, 50 para los diferenciales entre mercados. Superarlo devuelve un 400 o un 422; ir más allá de la ventana del plan devuelve un 403. |
Indicators | results + warm-up ≤ 1000 | Cincuenta instancias por llamada como máximo. El rechazo indica el periodo máximo utilizable para el número de resultados pedido. |
#Qué hacer
Respeta el plazo anunciado y no repitas un 403
En un 429, igual que en un 503, la cabecera Retry-After da el plazo. Un 403 ligado al plan (familia, profundidad, flujo) no cambiará por repetirlo: lee X-Deny-Reason y detail, y corrige la petición o cambia de plan.
import time
import httpx
def get(client: httpx.Client, path: str, **params):
"""Retry on the delay the server announces, never on a 403."""
for attempt in range(4):
response = client.get(path, params=params)
if response.status_code in (429, 503):
# The server knows when it will be ready: do not invent a delay.
# On an exhausted monthly quota (X-Deny-Reason: quota), Retry-After
# is an hour: no point insisting, the counter restarts on the 1st.
wait = float(response.headers.get("Retry-After", 2 ** attempt))
time.sleep(wait)
continue
# 403: the request is outside the plan (family, depth, key). Replaying
# it as is will produce exactly the same response.
response.raise_for_status()
return response.json()
raise RuntimeError("the service is still unavailable after 4 attempts")Agrupa en lugar de repetir
El snapshot trae hasta sesenta y un campos en una petición, contada una sola vez. Para un panel, es una llamada por ciclo en lugar de diez, y diez veces menos cuota.
# Three calls where one is enough.
GET /v1/funding/rate?symbol=BTCUSDT
GET /v1/basis?symbol=BTCUSDT
GET /v1/oi/delta?symbol=BTCUSDT
# The same result, in one request (from Traders upwards).
GET /v1/snapshot?symbol=BTCUSDT&funding_rate_8h=true&basis=1&oi_delta=1No vuelvas a pedir lo que no cambia
Fear & Greed publica un punto al día. Los fundamentales de los ETF son trimestrales. Las series macro diarias cambian una vez al día. Consultarlas cada minuto consume cuota sin aprender nada: ajusta cada familia al ritmo de sus datos.