Documentação
Avançado

Fluxos de Trabalho Completos

Exemplos ponta-a-ponta de fluxos de trabalho de negociação comuns usando a Deriv API

Pré-requisitos

  1. Inicie sessão em developers.deriv.com: Crie uma conta ou inicie sessão com as suas credenciais para aceder ao painel.
  2. Registar uma nova aplicação: Navegue até ao Dashboard e registe uma nova aplicação na sua conta. Escolha o tipo de aplicação apropriado com base no seu caso de uso:
    • Tipo PAT: Escolha esta opção quando os redirecionamentos de navegador não são práticos e a entrada manual de token é aceitável. Por exemplo, ferramentas de desktop, apps CLI ou clientes nativos. O utilizador gera um Personal Access Token na Deriv e cola-o na sua app.
    • OAuth tipo: Escolha esta opção quando o seu produto puder processar redirecionamentos do navegador e precisar de um fluxo delegado padrão com autorização do utilizador. Por exemplo, painéis de controlo na Web ou aplicações executadas no navegador. OAuth 2.0 emite tokens de acesso que expiram e minimiza a partilha de credenciais a longo prazo.

    Isto irá gerar um novo App ID. Os seus App IDs legados não funcionarão com as novas APIs.

  3. Gerar um token de autorização:
    • Se usar tipo PAT: No Dashboard, vá à secção de tokens de API. Crie um novo PAT (Personal Access Token) e selecione os âmbitos apropriados (por exemplo, trade, account_manage). Copie e guarde o seu token de forma segura. Não pode ser visualizado novamente após a criação.
    • Se utilizar OAuth tipo: Não precisa de gerar um token manualmente. Avance para o OAuth fluxo de autenticação 2.0 descrito abaixo. O fluxo fornece-lhe um token de acesso após uma autenticação bem-sucedida. Certifique-se de que tem o seu client_id, client_secret, e um redirect_uri HTTPS registado.
  4. Configure os cabeçalhos do seu pedido: Os pedidos REST API requerem um cabeçalho Authorization: Bearer. Para autenticação baseada em PAT, o cabeçalho Deriv-App-ID também é necessário (não obrigatório 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}

Fluxo de Trabalho de Negociação de Options (REST + WebSocket)

  1. REST: Obter um URL WebSocket autenticado via endpoint OTP (requer o seu token de autorização)
  2. WebSocket: Ligar utilizando o URL autenticado da resposta OTP
  3. WebSocket: Realizar operações de negociação

Passo 1: Obter URL WebSocket Autenticado (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

Passo 2: Ligar ao 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};

Passo 3: Iniciar Operações de Negociação

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});

Fluxos de Autenticação

Fluxo de trabalho A: Autenticação Baseada em PAT

Com uma app PAT, o utilizador gera um Personal Access Token na Deriv e introduz ou cola-o manualmente na sua aplicação. A app armazena o token de forma segura e inclui-o nos pedidos de API como token bearer. Isto é mais adequado para ferramentas de desktop, apps CLI e clientes nativos onde os redirecionamentos de navegador não são práticos.

  1. Inicie sessão em developers.deriv.com com as suas credenciais
  2. Registe uma nova aplicação com tipo PAT no Dashboard
  3. Gerar um token PAT com âmbitos apropriados
  4. Include Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN> and Deriv-App-ID in all REST request headers
  5. Fazer chamadas 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);

Fluxo de Trabalho B: Autenticação OAuth 2.0

O OAuth 2.0 permite que os utilizadores concedam acesso à sua app sem partilhar a sua palavra-passe. A sua app redireciona o utilizador para uma página de login e consentimento da Deriv. Após o utilizador fazer login e aprovar as permissões, a Deriv devolve um código de autorização à sua app. Troca este código por um token de acesso, que depois usa para autenticar pedidos de API. Recomendado para aplicações web que integram utilizadores finais.

Antes de Começar

  • Certifique-se de que o seu URL de redirecionamento está corretamente registado no painel
  • O URL de redirecionamento deve utilizar HTTPS. Para desenvolvimento local, pode utilizar http://localhost.
  • A sua app deve lidar com redirecionamentos, ler o código de autorização e trocá-lo por tokens
  • Deve ter um cliente OAuth 2.0 registado com credenciais válidas: client_id, client_secret e redirect_uri
  • Todos os URLs de redirecionamento (incluindo subdiretórios) devem estar na lista branca. Os URLs devem corresponder exatamente.

Passos do Fluxo OAuth 2.0

  1. A sua app redireciona o utilizador para a página de autorização OAuth 2.0 da Deriv para iniciar sessão e rever permissões
  2. O servidor de autorização gere o login e o consentimento de forma segura
  3. Após o início de sessão, a Deriv redireciona o utilizador de volta para a sua app com um código de autorização e parâmetro state
  4. A sua aplicação troca este código por tokens (com PKCE, se utilizado)
  5. O OAuth servidor devolve um token de acesso e expires_in, a respetiva duração em segundos
  6. A sua app armazena e usa de forma segura o token de acesso para chamadas de API WebSocket ou REST
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);

Autenticação WebSocket (OTP)

Para se ligar a um endpoint WebSocket autenticado, precisa de chamar o endpoint REST OTP usando o seu token de autorização (PAT ou JWT). A resposta contém um URL WebSocket autenticado ao qual se pode ligar diretamente. O URL trata da autenticação por si.

Endpoints WebSocket:

Público
Não é necessária autenticação

Utilize para dados de mercado e informações públicas. Não é necessário iniciar sessão.

Demo
Autenticado

Utilize para operações de negociação em contas demo/virtuais. O URL de resposta OTP apontará para este endpoint para contas demo.

Real
Autenticado

Utilize para negociação em contas reais. O URL de resposta OTP apontará para este endpoint para contas reais.

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};

Fluxo de Negociação Completo

  1. Estabelecer ligação e autenticar
  2. Obter símbolos ativos usando active_symbols
  3. Subscrever stream de tick para símbolo escolhido usando ticks
  4. Obter proposta de contrato usando proposal (com subscrição)
  5. Monitorizar atualizações de preço em tempo real
  6. Quando estiver pronto, compre o contrato usando buy
  7. Subscrever atualizações de contrato usando proposal_open_contract
  8. Monitorizar estado do contrato em tempo real
  9. Opcionalmente vender mais cedo usando sell
  10. Verificar portfólio 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}));

Fluxo de Trabalho de Dados de Mercado

  1. Ligar ao endpoint WebSocket público (sem autenticação necessária)
  2. Solicitar active_symbols para ver mercados disponíveis
  3. Subscrever ticks para atualizações de preço em tempo real
  4. Opcionalmente obter ticks_history para dados históricos
  5. Use contracts_for para ver tipos de contrato disponíveis
  6. O stream continua até forget ou desligar
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};

Resolução de Problemas

401 Não autorizado
"Não está autorizado a aceder a este recurso"

Causas comuns:

  • Cabeçalho Authorization: Bearer em falta <your_authorization_token> nos REST pedidos</your_authorization_token>
  • Utilização de um token de autorização expirado ou inválido
  • Utilizar um App ID Legacy em vez de um novo App ID registado em developers.deriv.com
  • Tipo de aplicação incompatível, como utilizar um token PAT com uma aplicação do tipo OAuth, ou vice-versa

Solução: Certifique-se de que os seus REST pedidos incluem Authorization: Bearer YOUR_AUTHORIZATION_TOKEN e utilizam um novo ID da aplicação registado em developers.deriv.com. Certifique-se de que o tipo de token corresponde ao tipo de aplicação.

403 Proibido
Permissões insuficientes

Causas comuns:

  • O token de autorização não tem os âmbitos necessários para o endpoint
  • Criou o token sem o âmbito trade ou account_manage

Solução: Gere novamente o seu token com os âmbitos corretos selecionados. É necessário definir pelo menos um âmbito ao criar um token.

App ID inválido
ID da aplicação não reconhecido

Causas comuns:

  • Utilização de um ID de aplicação legado com a nova API
  • Utilização de um App ID não registado em developers.deriv.com
  • Utilizar um App ID com o tipo incorreto

Solução: Inicie sessão em developers.deriv.com e registe uma nova aplicação com o tipo correto (PAT ou OAuth) para obter um novo App ID.

Token de acesso expirado
Token já não é válido

Causas comuns:

  • OAuth Os tokens de acesso 2.0 expiram após o número de segundos indicado em expires_in
  • PAT os tokens podem ser revogados manualmente a partir do painel

Solução: Para OAuth aplicações, execute novamente o fluxo de autorização para obter um novo token de acesso — Deriv não emite tokens de atualização. Se um novo token de acesso também receber um 401, não inicie novamente o fluxo. Em vez disso, verifique o cabeçalho Authorization e o endpoint. Para PAT aplicações, gere um novo token no painel de controlo. Nunca armazene tokens no código de front-end nem os exponha em URLs.

OAuth Falha no redirecionamento
O fluxo de consentimento falha ou a aplicação não redireciona o utilizador

Causas comuns:

  • O URL de redirecionamento não está na lista de permissões no painel da aplicação
  • O URL de redirecionamento inclui subdiretórios que não foram registados
  • Incompatibilidade entre o URL utilizado no OAuth pedido e os URLs registados no painel de controlo

Solução: Certifique-se de que todos os URLs de redirecionamento (incluindo subdiretórios) estão registados nas definições da sua aplicação em developers.deriv.com. Os URLs têm de corresponder exatamente.

Padrões Comuns

Gestão de Subscrições
Como gerir WebSocket subscrições de forma eficaz
  • Guarde sempre os IDs de subscrição
  • Utilize forget para cancelar a subscrição
  • Utilize forget_all para limpar todas as
  • Limpar subscrições antes de desligar
Tratamento de erros
Práticas recomendadas para o tratamento de erros da API
  • Verifique sempre o campo error
  • Implemente um recuo exponencial para novas tentativas
  • Registe erros com contexto
  • Lide adequadamente com desconexões de rede
IDs de pedido
Como acompanhar pedidos e respostas
  • Utilize um req_id único para cada pedido
  • Associe respostas utilizando req_id
  • Ajuda com pedidos simultâneos
  • Essencial para depuração
Ciclo de vida da ligação
Gerir WebSocket estado da ligação
  • Lide com onopen, onclose, onerror
  • Implemente lógica de reconexão automática
  • Reautenticar após voltar a ligar
  • Restaurar subscrições ao voltar a ligar
Click to open live chat support. Get instant help from our support team.