Documentación de la API
QUOTC transmite cotizaciones OTC generadas de forma independiente para 58 pares de divisas mediante una conexión WebSocket. Tu servidor se conecta una vez, se autentica con una clave API y recibe cada segundo el precio de todos los pares disponibles, 24/7.
Inicio rápido
- Crea una cuenta y abre Mis claves en tu panel.
- Crea una clave de prueba. Indica la dirección IPv4 o IPv6 pública del servidor que se conectará a los datos: la clave solo funciona desde esa dirección.
- Copia la clave completa con el botón Copiar y guárdala en tu servidor, por ejemplo en una variable de entorno. Las claves de prueba empiezan por
qtc_y las de producción porprd_. - Desde ese servidor, abre una conexión WebSocket con el endpoint indicado abajo y envía el mensaje de autenticación.
- Recibe cada segundo un tick por cada par disponible. Vuelve a conectarte automáticamente si se pierde la conexión.
Claves API
| Clave de prueba | Clave de producción | |
|---|---|---|
| Pares de divisas | EUR/USD, USD/JPY, AUD/USD, USD/CAD, USD/CHF, NZD/USD, EUR/GBP, EUR/JPY, GBP/JPY, AUD/JPY | Los 58 pares |
| Precio | Gratis | 500 USD / mes por clave |
| Validez | 14 días desde su creación, una por cuenta | La establece nuestro equipo al activarla |
| Prefijo de la clave | qtc_ |
prd_ |
Crea una clave de producción en tu panel y abre un ticket de soporte para gestionar el pago. La nueva clave de producción permanece inactiva hasta que nuestro equipo la activa y establece su fecha de vencimiento. Puedes crear varias claves de producción, por ejemplo una por servidor.
Cada clave está vinculada a la dirección IP de un servidor. Las conexiones desde cualquier otra dirección se rechazan. Para cambiar la dirección o renovar una clave, contacta con soporte desde tu panel.
Mantén la clave en secreto. Úsala solo en tu servidor: nunca la incluyas en código del navegador, aplicaciones móviles ni repositorios públicos. Si la clave se filtra, contacta con soporte para sustituirla.
Conexión
Endpoint
wss://wss.quotc.net
Utiliza cualquier cliente WebSocket para tu lenguaje. En los 10 segundos siguientes a abrir la conexión, envía el mensaje de autenticación con tu clave:
{"type": "auth", "token": "qtc_YOUR_KEY", "protocol": 2}Indica protocol igual a 2 para recibir los mensajes de servicio (auth_ok, subscribed). Los clientes que lo omiten reciben solo ticks y mensajes pong.
Tras una autenticación correcta, el servidor responde con auth_ok. Incluye los pares disponibles para la clave y la fecha de vencimiento de la clave en segundos Unix (UTC):
{
"type": "auth_ok",
"expiresAt": 1795683600,
"symbols": [
{ "symbol": "EURUSD", "label": "EUR/USD", "digits": 5 }
]
}Cada clave admite hasta 10 conexiones simultáneas, por lo que varios servicios del mismo servidor pueden compartirla.
Cierre y reconexión
Utiliza el código de cierre para decidir si debes volver a conectarte:
| Código | Significado | Qué hacer |
|---|---|---|
1008 |
Acceso denegado: clave desconocida, conexión desde otra IP, clave inactiva, vencida o eliminada, demasiadas conexiones o falta de autenticación en 10 segundos. | No vuelvas a conectarte con la misma clave. Revisa el estado de la clave y la dirección IP en tu panel. |
1011 |
La verificación de claves no está disponible temporalmente. | Vuelve a conectarte tras 3–5 segundos y autentícate de nuevo. |
| Otros | Error de red o reinicio del servicio. | Vuelve a conectarte tras 3–5 segundos y autentícate de nuevo. |
Las conexiones abiertas se vuelven a comprobar cada minuto. Si una clave se desactiva, vence, se elimina o se sustituye, sus conexiones se cierran con el código 1008.
Cotizaciones
Cada segundo el servidor envía un mensaje por cada par disponible para tu clave:
{
"symbol": "EURUSD",
"value": 1.11609,
"open": 1.11608,
"high": 1.11609,
"low": 1.11608,
"volume": 2,
"ts": 1793091620000
}| Campo | Descripción |
|---|---|
symbol |
Símbolo del par, por ejemplo EURUSD. Consulta la lista de pares más abajo. |
value |
Precio actual: el cierre del último segundo. |
open, high, low |
Precio de apertura, máximo y mínimo del último segundo. |
volume |
Actividad relativa del último segundo. Es comparable entre pares y no corresponde a un volumen negociado. |
ts |
Hora del tick en milisegundos Unix (UTC). |
Los precios se redondean al número de decimales indicado para cada par en la lista de abajo.
Solicitudes
Tras la autenticación, tu cliente puede enviar los siguientes mensajes. Las respuestas se muestran después de la flecha.
Ping
Mantiene la conexión activa a través de proxies. Envíalo cada 30 segundos; el servidor responde con pong y el mismo timestamp.
{"type": "ping", "timestamp": 1793091620000}
→ {"type": "pong", "timestamp": 1793091620000}Seleccionar pares
Por defecto recibes todos los pares disponibles para la clave. Envía subscribe para limitar el flujo a los pares indicados; los pares no disponibles para la clave se ignoran. Puedes enviarlo de nuevo en cualquier momento para cambiar la lista.
{"type": "subscribe", "symbols": ["EURUSD", "USDJPY"]}
→ {"type": "subscribed", "symbols": ["EURUSD", "USDJPY"]}Ejemplos de código
Clientes completos que se autentican, muestran los ticks y se reconectan tras errores de red. Antes de ejecutarlos, guarda tu clave en la variable de entorno QUOTC_API_KEY del servidor cuya IP está vinculada a la clave.
// npm install ws
const WebSocket = require('ws');
const URL = 'wss://wss.quotc.net';
const API_KEY = process.env.QUOTC_API_KEY; // keep the key out of source code
function connect() {
const ws = new WebSocket(URL);
let ping;
ws.on('open', () => {
ws.send(JSON.stringify({ type: 'auth', token: API_KEY, protocol: 2 }));
ping = setInterval(() => {
ws.send(JSON.stringify({ type: 'ping', timestamp: Date.now() }));
}, 30000);
});
ws.on('message', (raw) => {
const msg = JSON.parse(raw);
if (msg.type === 'auth_ok') {
console.log('Authorized. Pairs:', msg.symbols.map((s) => s.symbol).join(', '));
} else if (msg.symbol) {
console.log(msg.symbol, msg.value, new Date(msg.ts).toISOString());
}
});
ws.on('close', (code, reason) => {
clearInterval(ping);
if (code === 1008) {
console.error('Access denied:', reason.toString(), '- check the key and server IP');
return; // do not retry with the same key
}
setTimeout(connect, 3000); // network error or service restart
});
ws.on('error', (err) => console.error(err.message));
}
connect();
# pip install websockets
import asyncio
import json
import os
import websockets
URL = "wss://wss.quotc.net"
API_KEY = os.environ["QUOTC_API_KEY"] # keep the key out of source code
async def main():
while True:
try:
async with websockets.connect(URL) as ws:
await ws.send(json.dumps({"type": "auth", "token": API_KEY, "protocol": 2}))
async for raw in ws:
msg = json.loads(raw)
if msg.get("type") == "auth_ok":
print("Authorized. Pairs:", [s["symbol"] for s in msg["symbols"]])
elif "symbol" in msg:
print(msg["symbol"], msg["value"], msg["ts"])
except websockets.ConnectionClosed as e:
if e.rcvd is not None and e.rcvd.code == 1008:
print("Access denied:", e.rcvd.reason, "- check the key and server IP")
return # do not retry with the same key
except OSError as e:
print("Connection error:", e)
await asyncio.sleep(3) # network error or service restart
asyncio.run(main())
Conéctate desde tu servidor, no desde el navegador: la clave está vinculada a la IP del servidor y debe mantenerse en secreto. Para mostrar cotizaciones en tu sitio web, reenvíalas desde tu servidor a tus visitantes.
Pares disponibles
Una clave de producción cubre los 58 pares. La clave de prueba cubre los pares marcados en la última columna.
| Símbolo | Par | Decimales | Clave de prueba |
|---|---|---|---|
AUDCAD |
AUD/CAD | 5 | — |
EURUSD |
EUR/USD | 5 | Sí |
AUDJPY |
AUD/JPY | 3 | Sí |
NZDUSD |
NZD/USD | 5 | Sí |
AUDUSD |
AUD/USD | 5 | Sí |
USDJPY |
USD/JPY | 3 | Sí |
USDCAD |
USD/CAD | 5 | Sí |
USDCHF |
USD/CHF | 5 | Sí |
EURGBP |
EUR/GBP | 5 | Sí |
EURJPY |
EUR/JPY | 3 | Sí |
EURCAD |
EUR/CAD | 5 | — |
GBPJPY |
GBP/JPY | 3 | Sí |
EURAUD |
EUR/AUD | 5 | — |
AUDCHF |
AUD/CHF | 5 | — |
CHFJPY |
CHF/JPY | 3 | — |
EURNZD |
EUR/NZD | 5 | — |
CADCHF |
CAD/CHF | 5 | — |
GBPCHF |
GBP/CHF | 5 | — |
CADJPY |
CAD/JPY | 3 | — |
GBPNZD |
GBP/NZD | 5 | — |
NZDCAD |
NZD/CAD | 5 | — |
NZDJPY |
NZD/JPY | 3 | — |
GBPCAD |
GBP/CAD | 5 | — |
NZDSGD |
NZD/SGD | 5 | — |
USDSGD |
USD/SGD | 5 | — |
USDSEK |
USD/SEK | 5 | — |
USDCZK |
USD/CZK | 3 | — |
EURHKD |
EUR/HKD | 5 | — |
GBPUSD |
GBP/USD | 5 | — |
EURCHF |
EUR/CHF | 5 | — |
GBPAUD |
GBP/AUD | 5 | — |
AUDNZD |
AUD/NZD | 5 | — |
NZDCHF |
NZD/CHF | 5 | — |
EURSEK |
EUR/SEK | 5 | — |
GBPSEK |
GBP/SEK | 5 | — |
EURCZK |
EUR/CZK | 3 | — |
USDHKD |
USD/HKD | 5 | — |
EURSGD |
EUR/SGD | 5 | — |
GBPSGD |
GBP/SGD | 5 | — |
AUDSGD |
AUD/SGD | 5 | — |
SGDJPY |
SGD/JPY | 3 | — |
USDNOK |
USD/NOK | 5 | — |
EURNOK |
EUR/NOK | 5 | — |
USDDKK |
USD/DKK | 5 | — |
EURDKK |
EUR/DKK | 5 | — |
USDPLN |
USD/PLN | 5 | — |
EURPLN |
EUR/PLN | 5 | — |
USDHUF |
USD/HUF | 3 | — |
EURHUF |
EUR/HUF | 3 | — |
USDTRY |
USD/TRY | 5 | — |
EURTRY |
EUR/TRY | 5 | — |
USDZAR |
USD/ZAR | 5 | — |
USDMXN |
USD/MXN | 5 | — |
USDCNH |
USD/CNH | 5 | — |
USDINR |
USD/INR | 3 | — |
USDILS |
USD/ILS | 5 | — |
USDTHB |
USD/THB | 3 | — |
USDAED |
USD/AED | 5 | — |
Sobre los datos
Las cotizaciones de QUOTC son precios OTC generados de forma independiente. Siguen el nivel general del mercado de divisas, pero no son precios del mercado forex al contado ni los reproducen tick a tick. Las cotizaciones están disponibles las 24 horas, los 7 días de la semana, incluidos fines de semana y festivos.
¿Tienes preguntas sobre la integración? Contacta con nosotros o abre un ticket en tu panel.