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

  1. Crea una cuenta y abre Mis claves en tu panel.
  2. 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.
  3. 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 por prd_.
  4. Desde ese servidor, abre una conexión WebSocket con el endpoint indicado abajo y envía el mensaje de autenticación.
  5. 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();

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.