Documentación
Avanzado

Flujos de trabajo completos

Ejemplos de extremo a extremo de flujos de trabajo de trading comunes usando Deriv API

Requisitos previos

  1. Inicie sesión en developers.deriv.com: Cree una cuenta o inicie sesión con sus credenciales para acceder al panel de control.
  2. Registre una nueva aplicación: Navegue al panel de control y registre una nueva aplicación bajo su cuenta. Elija el tipo de aplicación apropiado según su caso de uso:
    • Tipo PAT: Elija esto cuando las redirecciones del navegador no sean prácticas y la entrada manual de tokens sea aceptable. Por ejemplo, herramientas de escritorio, aplicaciones CLI o clientes nativos. El usuario genera un Personal Access Token en Deriv y lo pega en su aplicación.
    • OAuth tipo: Elija esta opción cuando su producto pueda gestionar redireccionamientos del navegador y necesite un flujo delegado estándar con autorización del usuario. Por ejemplo, paneles web o aplicaciones de navegador. OAuth 2.0 emite tokens de acceso que vencen y minimiza el uso compartido de credenciales a largo plazo.

    Esto generará un nuevo App ID. Sus App IDs heredados no funcionarán con las nuevas APIs.

  3. Generar un token de autorización:
    • Si usa tipo PAT: En el Panel de Control, vaya a la sección de tokens de API. Cree un nuevo PAT (Personal Access Token) y seleccione los alcances apropiados (por ejemplo, trade, account_manage). Copie y almacene su token de forma segura. No puede visualizarse nuevamente después de su creación.
    • Si utiliza OAuth tipo: No necesita generar un token manualmente. Continúe con el OAuth flujo de autenticación 2.0 que se describe a continuación. El flujo le proporciona un token de acceso tras una autenticación correcta. Asegúrese de tener su client_id, client_secret, y un redirect_uri HTTPS registrados.
  4. Configure los encabezados de su solicitud: Las solicitudes de API REST requieren un encabezado Authorization: Bearer. Para la autenticación basada en PAT, el encabezado Deriv-App-ID también es obligatorio (no requerido para OAuth):
required-headers.jsjavascript
1// Request headers for REST API calls
2// PAT authentication requires Deriv-App-ID; OAuth 2.0 does not require Deriv-App-ID
3headers: {
4  'Authorization': 'Bearer YOUR_AUTHORIZATION_TOKEN',  // Authorization token (PAT or JWT)
5  'Deriv-App-ID': 'YOUR_APP_ID',                      // Required for PAT authentication
6  'Content-Type': 'application/json'
7}

Flujo de trabajo de trading de Options (REST + WebSocket)

  1. REST: Obtenga una URL WebSocket autenticada mediante el endpoint OTP (requiere su token de autorización)
  2. WebSocket: Conéctese usando la URL autenticada de la respuesta OTP
  3. WebSocket: Realizar operaciones de trading

Paso 1: Obtener URL WebSocket autenticada (REST)

get-otp.jsjavascript
1// Get authenticated WebSocket URL via OTP endpoint
2// Note: This REST call requires your authorization token
3const otpResponse = await fetch(
4  `https://api.derivws.com/trading/v1/options/accounts/${accountId}/otp`,
5  {
6    method: 'POST',
7    headers: {
8      'Authorization': 'Bearer YOUR_AUTHORIZATION_TOKEN',  // PAT or JWT token
9      'Deriv-App-ID': 'YOUR_APP_ID'                        // Required for PAT authentication
10    }
11  }
12);
13
14const otpResult = await otpResponse.json();
15const wsUrl = otpResult.data.url;
16console.log('Authenticated WebSocket URL:', wsUrl);
17// Output: wss://api.derivws.com/trading/v1/options/ws/demo?otp=abc123xyz789

Paso 2: Conectarse al WebSocket

connect-websocket.jsjavascript
1// Connect to Options WebSocket using the authenticated URL from OTP response
2// The URL already contains the correct endpoint (demo/real) and authentication
3const ws = new WebSocket(wsUrl);
4
5ws.onopen = () => {
6  console.log('Connected to Options trading WebSocket');
7  // Connection is now authenticated and ready for trading
8};
9
10ws.onmessage = (msg) => {
11  const data = JSON.parse(msg.data);
12  console.log('Received:', data);
13};
14
15ws.onerror = (error) => {
16  console.error('WebSocket error:', error);
17};
18
19ws.onclose = () => {
20  console.log('WebSocket connection closed');
21};

Paso 3: Iniciar Operaciones de Trading

trading-operations.jsjavascript
1// Once connected, you can send trading commands through WebSocket
2// Example: Get account balance
3ws.send(JSON.stringify({
4  balance: 1,
5  subscribe: 1,
6  req_id: 1
7}));
8
9// Example: Subscribe to tick stream
10ws.send(JSON.stringify({
11  ticks: "1HZ100V",
12  subscribe: 1,
13  req_id: 2
14}));
15
16// Example: Get price proposal
17ws.send(JSON.stringify({
18  proposal: 1,
19  amount: 10,
20  basis: "stake",
21  contract_type: "MULTDOWN",
22  currency: "USD",
23  duration_unit: "s",
24  multiplier: 10,
25  underlying_symbol: "1HZ100V",
26  subscribe: 1,
27  req_id: 3
28}));
complete-workflow.jsjavascript
1async function setupOptionsTrading() {
2  const AUTH_TOKEN = 'YOUR_AUTHORIZATION_TOKEN';  // PAT or JWT token
3  const APP_ID = 'YOUR_APP_ID';                   // App ID from registered application
4  const API_BASE = 'https://api.derivws.com';
5  const accountId = 'YOUR_ACCOUNT_ID';            // Your demo or real account ID
6
7  try {
8    // Step 1: Get authenticated WebSocket URL (REST, requires authorization token)
9    const otpResponse = await fetch(
10      `${API_BASE}/trading/v1/options/accounts/${accountId}/otp`,
11      {
12        method: 'POST',
13        headers: {
14          'Authorization': `Bearer ${AUTH_TOKEN}`,
15          'Deriv-App-ID': APP_ID                   // Required for PAT authentication
16        }
17      }
18    );
19
20    if (!otpResponse.ok) throw new Error(`HTTP error! status: ${otpResponse.status}`);
21    const otpData = await otpResponse.json();
22    const wsUrl = otpData.data.url;
23    console.log('✓ Authenticated WebSocket URL obtained');
24
25    // Step 2: Connect to WebSocket using the authenticated URL
26    const ws = new WebSocket(wsUrl);
27
28    ws.onopen = () => {
29      console.log('✓ WebSocket connected');
30
31      // Step 3: Start trading
32      // Subscribe to balance updates
33      ws.send(JSON.stringify({
34        balance: 1,
35        subscribe: 1,
36        req_id: 1
37      }));
38
39      // Subscribe to ticks
40      ws.send(JSON.stringify({
41        ticks: "1HZ100V",
42        subscribe: 1,
43        req_id: 2
44      }));
45    };
46
47    ws.onmessage = (msg) => {
48      const data = JSON.parse(msg.data);
49
50      if (data.msg_type === 'balance') {
51        console.log('Balance:', data.balance.balance, data.balance.currency);
52      }
53
54      if (data.msg_type === 'tick') {
55        console.log('Tick:', data.tick.quote);
56      }
57    };
58
59    return ws;
60
61  } catch (error) {
62    console.error('Setup failed:', error);
63    throw error;
64  }
65}
66
67// Run the setup
68setupOptionsTrading().then(ws => {
69  console.log('Trading setup complete. WebSocket ready for operations.');
70}).catch(err => {
71  console.error('Failed to setup trading:', err);
72});

Flujos de trabajo de autenticación

Flujo de trabajo A: Autenticación basada en PAT

Con una aplicación PAT, el usuario genera un token de acceso personal en Deriv y lo introduce o pega manualmente en su aplicación. La aplicación almacena de forma segura el token y lo incluye en las solicitudes API como token bearer. Esto es más adecuado para herramientas de escritorio, aplicaciones CLI y clientes nativos donde las redirecciones del navegador no son prácticas.

  1. Inicie sesión en developers.deriv.com con sus credenciales
  2. Registre una nueva aplicación con tipo PAT en el panel de control
  3. Generar un token PAT con los alcances apropiados
  4. Include Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN> and Deriv-App-ID in all REST request headers
  5. Realice llamadas REST API autenticadas
pat-authentication.jsjavascript
1// PAT-Based Authentication: REST API
2const AUTH_TOKEN = 'YOUR_AUTHORIZATION_TOKEN';  // Your PAT token
3const APP_ID = 'YOUR_APP_ID';
4
5// All REST calls use the authorization token as a Bearer token
6const response = await fetch('https://api.derivws.com/trading/v1/options/accounts', {
7  method: 'POST',
8  headers: {
9    'Authorization': `Bearer ${AUTH_TOKEN}`,    // Authorization token (PAT)
10    'Deriv-App-ID': APP_ID,                      // App ID from registered application
11    'Content-Type': 'application/json'
12  },
13  body: JSON.stringify({
14    currency: 'USD',
15    group: 'row',
16    account_type: 'demo'
17  })
18});
19
20const result = await response.json();
21console.log('Authenticated REST call successful:', result);

Flujo de trabajo B: Autenticación OAuth 2.0

OAuth 2.0 permite a los usuarios otorgar acceso a su aplicación sin compartir su contraseña. Su aplicación redirige al usuario a una página de inicio de sesión y consentimiento de Deriv. Después de que el usuario inicia sesión y aprueba los permisos, Deriv devuelve un código de autorización a su aplicación. Usted intercambia este código por un token de acceso, que luego usa para autenticar solicitudes API. Recomendado para aplicaciones basadas en web que incorporan usuarios finales.

Antes de comenzar

  • Asegúrese de que su URL de redirección esté correctamente registrada en el panel de control
  • La URL de redireccionamiento debe utilizar HTTPS. Para el desarrollo local, puede utilizar http://localhost.
  • Su aplicación debe manejar redirecciones, leer el código de autorización e intercambiarlo por tokens
  • Debe tener un cliente OAuth 2.0 registrado con credenciales válidas: client_id, client_secret y redirect_uri
  • Todas las URLs de redirección (incluidos los subdirectorios) deben estar en la lista blanca. Las URLs deben coincidir exactamente.

Pasos del flujo OAuth 2.0

  1. Su aplicación redirige al usuario a la página de autorización OAuth 2.0 de Deriv para iniciar sesión y revisar permisos
  2. El servidor de autorización maneja el inicio de sesión y el consentimiento de forma segura
  3. Después del inicio de sesión, Deriv redirige al usuario de vuelta a su aplicación con un código de autorización y parámetro state
  4. Su aplicación intercambia este código por tokens (con PKCE si se utiliza)
  5. El OAuth servidor devuelve un token de acceso y expires_in, su duración en segundos
  6. Su aplicación almacena y usa de forma segura el token de acceso para llamadas API REST o WebSocket
oauth-authentication.jsjavascript
1// OAuth 2.0 Authentication Flow (Authorization Code with PKCE)
2const CLIENT_ID = 'YOUR_CLIENT_ID';
3const REDIRECT_URI = 'https://your-app.com/callback';
4
5// --- PKCE Helper Functions ---
6function generateCodeVerifier() {
7  const array = new Uint8Array(32);
8  crypto.getRandomValues(array);
9  return btoa(String.fromCharCode(...array))
10    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
11}
12
13async function generateCodeChallenge(verifier) {
14  const encoder = new TextEncoder();
15  const data = encoder.encode(verifier);
16  const digest = await crypto.subtle.digest('SHA-256', data);
17  return btoa(String.fromCharCode(...new Uint8Array(digest)))
18    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
19}
20
21// Step 1: Generate PKCE values and redirect user to authorization endpoint
22const codeVerifier = generateCodeVerifier();
23const codeChallenge = await generateCodeChallenge(codeVerifier);
24const state = crypto.randomUUID();
25
26sessionStorage.setItem('code_verifier', codeVerifier);
27sessionStorage.setItem('oauth_state', state);
28
29const authUrl = new URL('https://auth.deriv.com/oauth2/auth');
30authUrl.searchParams.set('response_type', 'code');
31authUrl.searchParams.set('client_id', CLIENT_ID);
32authUrl.searchParams.set('redirect_uri', REDIRECT_URI);
33authUrl.searchParams.set('scope', 'trade account_manage');
34authUrl.searchParams.set('state', state);
35authUrl.searchParams.set('code_challenge', codeChallenge);
36authUrl.searchParams.set('code_challenge_method', 'S256');
37
38window.location.href = authUrl.toString();
39
40// Step 3: Handle the callback
41const urlParams = new URLSearchParams(window.location.search);
42const authorizationCode = urlParams.get('code');
43const returnedState = urlParams.get('state');
44
45const savedState = sessionStorage.getItem('oauth_state');
46if (returnedState !== savedState) {
47  throw new Error('State mismatch: possible CSRF attack');
48}
49
50// Step 4: Exchange the authorization code for tokens
51const savedVerifier = sessionStorage.getItem('code_verifier');
52const tokenResponse = await fetch('https://auth.deriv.com/oauth2/token', {
53  method: 'POST',
54  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
55  body: new URLSearchParams({
56    grant_type: 'authorization_code',
57    client_id: CLIENT_ID,
58    code: authorizationCode,
59    redirect_uri: REDIRECT_URI,
60    code_verifier: savedVerifier
61  })
62});
63
64const tokenData = await tokenResponse.json();
65const accessToken = tokenData.access_token;
66console.log('Access token obtained, expires in', tokenData.expires_in, 'seconds');
67// No refresh token is returned: when the token expires or a call returns 401, run this flow again from step 1.
68// If a new access token also gets a 401, don't start the flow again. Check the Authorization header and the endpoint instead.
69
70// Step 6: Use the access token for authenticated API calls (OAuth Bearer tokens do not require Deriv-App-ID)
71const response = await fetch('https://api.derivws.com/trading/v1/options/accounts', {
72  method: 'GET',
73  headers: {
74    'Authorization': `Bearer ${accessToken}`,
75    'Content-Type': 'application/json'
76  }
77});
78
79const result = await response.json();
80console.log('Authenticated API call successful:', result);

Autenticación WebSocket (OTP)

Para conectarse a un endpoint WebSocket autenticado, necesita llamar al endpoint REST OTP usando su token de autorización (PAT o JWT). La respuesta contiene una URL WebSocket autenticada a la que puede conectarse directamente. La URL maneja la autenticación por usted.

Endpoints WebSocket:

Público
No se requiere autenticación

Úsela para consultar datos de mercado e información pública. No es necesario iniciar sesión.

Demo
Autenticado

Úselo para operaciones de trading en cuentas demo/virtuales. La URL de respuesta de OTP apuntará a este endpoint para las cuentas demo.

Real
Autenticado

Úselo para Trading en cuentas reales. La URL de respuesta OTP apuntará a este endpoint para cuentas reales.

websocket-otp-auth.jsjavascript
1// Step 1: Get authenticated WebSocket URL via REST (requires authorization token)
2const otpResponse = await fetch(
3  `https://api.derivws.com/trading/v1/options/accounts/${accountId}/otp`,
4  {
5    method: 'POST',
6    headers: {
7      'Authorization': 'Bearer YOUR_AUTHORIZATION_TOKEN',  // PAT or JWT token
8      'Deriv-App-ID': 'YOUR_APP_ID'                        // Required for PAT authentication
9    }
10  }
11);
12
13const otpResult = await otpResponse.json();
14const wsUrl = otpResult.data.url;
15// The URL already includes the correct endpoint and authentication
16// Output: wss://api.derivws.com/trading/v1/options/ws/demo?otp=abc123xyz789
17
18// Step 2: Connect to WebSocket using the authenticated URL
19const ws = new WebSocket(wsUrl);
20
21ws.onopen = () => {
22  console.log('WebSocket authenticated and connected');
23  // Ready for trading operations
24};

Flujo de trabajo de trading completo

  1. Establecer conexión y autenticar
  2. Obtenga símbolos activos usando active_symbols
  3. Suscríbase al flujo de ticks para el símbolo elegido usando ticks
  4. Obtenga propuesta de contrato usando proposal (con suscripción)
  5. Supervisar actualizaciones de precios en tiempo real
  6. Cuando esté listo, compre el contrato usando buy
  7. Suscríbase a actualizaciones de contratos usando proposal_open_contract
  8. Supervisar el estado del contrato en tiempo real
  9. Opcionalmente venda anticipadamente usando sell
  10. Verifique el portafolio usando portfolio
trading-workflow.jsjavascript
1// After authentication...
2
3// 1. Get active symbols
4ws.send(JSON.stringify({
5  active_symbols: "brief",
6  req_id: 3
7}));
8
9// 2. Subscribe to ticks
10ws.send(JSON.stringify({
11  ticks: "1HZ100V",
12  subscribe: 1,
13  req_id: 4
14}));
15
16// 3. Get price proposal
17ws.send(JSON.stringify({
18  proposal: 1,
19  amount: 10,
20  basis: "stake",
21  contract_type: "MULTDOWN",
22  currency: "USD",
23  duration_unit: "s",
24  multiplier: 10,
25  underlying_symbol: "1HZ100V",
26  subscribe: 1,
27  req_id: 5
28}));
29
30// 4. Buy the contract (when ready)
31// Use proposal ID from previous response
32ws.send(JSON.stringify({
33  buy: "PROPOSAL_ID_HERE",
34  price: 100,
35  req_id: 6
36}));
37
38// 5. Monitor contract status
39ws.send(JSON.stringify({
40  proposal_open_contract: 1,
41  contract_id: CONTRACT_ID,
42  subscribe: 1,
43  req_id: 7
44}));

Flujo de trabajo de datos de mercado

  1. Conéctese al endpoint WebSocket público (no se necesita autenticación)
  2. Solicite active_symbols para ver los mercados disponibles
  3. Suscríbase a ticks para actualizaciones de precios en tiempo real
  4. Opcionalmente obtenga ticks_history para datos históricos
  5. Use contracts_for para ver los tipos de contratos disponibles
  6. El flujo continúa hasta forget o desconexión
market-data.jsjavascript
1// Connect to the public WebSocket endpoint (no authentication required)
2const ws = new WebSocket('wss://api.derivws.com/trading/v1/options/ws/public');
3
4ws.onopen = () => {
5  // Get available symbols
6  ws.send(JSON.stringify({
7    active_symbols: "brief",
8    req_id: 1
9  }));
10
11  // Subscribe to tick stream
12  ws.send(JSON.stringify({
13    ticks: "1HZ100V",
14    subscribe: 1,
15    req_id: 2
16  }));
17
18  // Get historical data
19  ws.send(JSON.stringify({
20    ticks_history: "1HZ100V",
21    count: 100,
22    end: "latest",
23    style: "ticks",
24    req_id: 3
25  }));
26};
27
28ws.onmessage = (msg) => {
29  const data = JSON.parse(msg.data);
30
31  if (data.msg_type === 'active_symbols') {
32    console.log('Available symbols:', data.active_symbols);
33  }
34
35  if (data.msg_type === 'tick') {
36    console.log('Current price:', data.tick.quote);
37  }
38
39  if (data.msg_type === 'history') {
40    console.log('Historical data:', data.history);
41  }
42};

Solución de problemas

401 No autorizado
"No tiene autorización para acceder a este recurso"

Causas comunes:

  • Falta el encabezado Authorization: Bearer en las <your_authorization_token> solicitudes REST </your_authorization_token>
  • Uso de un token de autorización vencido o no válido
  • Uso de un ID de aplicación Legacy en lugar de un nuevo ID de aplicación registrado en developers.deriv.com
  • Tipo de aplicación no coincidente, como usar un PAT token con una aplicación de tipo OAuth-type, o viceversa

Solución: Asegúrese de que sus REST solicitudes incluyan Authorization: Bearer YOUR_AUTHORIZATION_TOKEN y utilicen un nuevo ID de aplicación registrado en developers.deriv.com. Asegúrese de que su tipo de token coincida con su tipo de aplicación.

403 Prohibido
Permisos insuficientes

Causas comunes:

  • El token de autorización no tiene los scopes requeridos para el endpoint
  • Creó el token sin el scope trade o account_manage scope

Solución: Genere nuevamente su token con los scopes correctos seleccionados. Debe definir al menos un scope al crear un token.

App ID no válido
ID de aplicación no reconocido

Causas comunes:

  • Uso de un ID de aplicación heredado con la nueva API
  • Uso de un App ID que no está registrado en developers.deriv.com
  • Uso de un ID de aplicación con el tipo incorrecto

Solución: Inicie sesión en developers.deriv.com y registre una nueva aplicación con el tipo correcto (PAT o OAuth) para obtener un nuevo App ID.

Token de acceso vencido
El token ya no es válido

Causas comunes:

  • OAuth Los tokens de acceso 2.0 vencen después del número de segundos indicado en expires_in
  • PAT los tokens pueden revocarse manualmente desde el panel

Solución: Para OAuth aplicaciones, ejecute de nuevo el flujo de autorización para obtener un nuevo token de acceso — Deriv no emite tokens de actualización. Si un nuevo token de acceso también recibe un 401, no inicie el flujo de nuevo. En su lugar, revise el encabezado Authorization y el endpoint. Para PAT aplicaciones, genere un nuevo token desde el panel de control. Nunca almacene tokens en el código de frontend ni los exponga en URL.

OAuth Error de redirección
El flujo de consentimiento falla o la aplicación no redirecciona al usuario

Causas comunes:

  • La URL de redireccionamiento no está incluida en la lista de permitidas del panel de la aplicación
  • La URL de redireccionamiento incluye subdirectorios que no se registraron
  • Discrepancia entre la URL utilizada en la OAuth solicitud y las URL registradas en el panel

Solución: Asegúrese de que todas las URL de redireccionamiento (incluidos los subdirectorios) estén registradas en la configuración de su aplicación en developers.deriv.com. Las URL deben coincidir exactamente.

Patrones Comunes

Gestión de suscripciones
Cómo gestionar las WebSocket suscripciones de forma eficaz
  • Guarde siempre los ID de suscripción
  • Use forget para cancelar la suscripción
  • Use forget_all para eliminar todas las
  • Elimine las suscripciones antes de desconectarse
Gestión de errores
Prácticas recomendadas para gestionar errores de API
  • Compruebe siempre el campo error
  • Implemente retroceso exponencial para los reintentos
  • Registre errores con contexto
  • Gestione las desconexiones de red correctamente
ID de solicitud
Cómo realizar seguimiento de solicitudes y respuestas
  • Use un req_id único para cada solicitud
  • Haga coincidir las respuestas mediante req_id
  • Ayuda con solicitudes simultáneas
  • Esencial para la depuración
Ciclo de vida de la conexión
Gestión del WebSocket estado de conexión
  • Gestione onopen, onclose y onerror
  • Implemente lógica de reconexión automática
  • Vuelva a autenticarse después de reconectarse
  • Restablecer suscripciones al reconectar
Click to open live chat support. Get instant help from our support team.