Fluxos de Trabalho Completos
Exemplos ponta-a-ponta de fluxos de trabalho de negociação comuns usando a Deriv API
Pré-requisitos
Importante: Complete Estes Passos Primeiro
401 Unauthorized.- Inicie sessão em developers.deriv.com: Crie uma conta ou inicie sessão com as suas credenciais para aceder ao painel.
- 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.
- Tipo OAuth: Escolha esta opção quando o seu produto pode lidar com redirecionamentos de navegador e necessita de um fluxo delegado padrão com autorização do utilizador. Por exemplo, painéis web ou apps de navegador. O OAuth 2.0 emite tokens de curta duração 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.
- 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 o tipo OAuth: Não precisa de gerar um token manualmente. Proceda ao fluxo de autenticação OAuth 2.0 descrito abaixo. O fluxo fornecerá um token de acesso de curta duração após autenticação bem-sucedida. Certifique-se de que tem o seu
client_id,client_secrete umredirect_uriHTTPS registado.
- 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,
- Configure os seus cabeçalhos de pedido: Cada pedido REST API deve incluir ambos os cabeçalhos obrigatórios:
1// Required headers for ALL REST API calls
2headers: {
3 'Authorization': 'Bearer YOUR_AUTHORIZATION_TOKEN', // Authorization token (PAT or JWT)
4 'Deriv-App-ID': 'YOUR_APP_ID', // App ID from your registered application
5 'Content-Type': 'application/json'
6}Token de Autorização
Authorization para chamadas REST API e para obter um URL WebSocket autenticado via endpoint OTP.Fluxo de Trabalho de Negociação de Options (REST + WebSocket)
Integração Completa
- REST: Obter um URL WebSocket autenticado via endpoint OTP (requer o seu token de autorização)
- WebSocket: Ligar utilizando o URL autenticado da resposta OTP
- WebSocket: Realizar operações de negociação
Passo 1: Obter URL WebSocket Autenticado (REST)
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'
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=abc123xyz789Passo 2: Ligar ao WebSocket
- Público: Sem autenticação necessária. Para dados de mercado e informação pública.
- Demo: Autenticado. Para negociação em conta demo.
- Real: Autenticado. Para negociação em conta real.
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
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}));Exemplo Completo
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
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.
- Inicie sessão em
developers.deriv.comcom as suas credenciais - Registe uma nova aplicação com tipo PAT no Dashboard
- Gerar um token PAT com âmbitos apropriados
- Include
Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>andDeriv-App-IDin all REST request headers - Fazer chamadas REST API autenticadas
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 usar HTTPS
- 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_secreteredirect_uri - Todos os URLs de redirecionamento (incluindo subdiretórios) devem estar na lista branca. Os URLs devem corresponder exatamente.
Importante: Lista Branca de URL de Redirecionamento
https://abc.com mas o seu URL de redirecionamento é https://abc.com/callback, o fluxo falhará. Cada subdiretório deve ser registado separadamente.Passos do Fluxo OAuth 2.0
- 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
- O servidor de autorização gere o login e o consentimento de forma segura
- 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
- A sua aplicação troca este código por tokens (com PKCE, se utilizado)
- O servidor OAuth devolve o token de acesso (e token de atualização opcional)
- A sua app armazena e usa de forma segura o token de acesso para chamadas de API WebSocket ou REST
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
68// Step 6: Use the access token for authenticated API calls
69const response = await fetch('https://api.derivws.com/trading/v1/options/accounts', {
70 method: 'GET',
71 headers: {
72 'Authorization': `Bearer ${accessToken}`,
73 'Deriv-App-ID': CLIENT_ID,
74 'Content-Type': 'application/json'
75 }
76});
77
78const result = await response.json();
79console.log('Authenticated API call successful:', result);Melhores Práticas de Segurança
- Valide sempre o parâmetro
statepara prevenir ataques CSRF - Gere o seu
code_challengea partir de umcode_verifieraleatório criptograficamente seguro - Armazene os tokens de forma segura no servidor. Nunca os exponha em código frontend.
- Os tokens de acesso têm curta duração (tipicamente 3600 segundos) e devem ser atualizados
- O código de autorização é de utilização única e de curta duração
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:
Use for market data and public information. No login needed.
Use for demo/virtual account trading operations. The OTP response URL will point to this endpoint for demo accounts.
Use for live/real account trading. The OTP response URL will point to this endpoint for real accounts.
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'
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
Processo de Negociação Ponta-a-Ponta
- Estabelecer ligação e autenticar
- Obter símbolos ativos usando
active_symbols - Subscrever stream de tick para símbolo escolhido usando
ticks - Obter proposta de contrato usando
proposal(com subscrição) - Monitorizar atualizações de preço em tempo real
- Quando estiver pronto, compre o contrato usando
buy - Subscrever atualizações de contrato usando
proposal_open_contract - Monitorizar estado do contrato em tempo real
- Opcionalmente vender mais cedo usando
sell - Verificar portfólio usando
portfolio
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
Sem Autenticação Necessária
- Ligar ao endpoint WebSocket público (sem autenticação necessária)
- Solicitar
active_symbolspara ver mercados disponíveis - Subscrever
tickspara atualizações de preço em tempo real - Opcionalmente obter
ticks_historypara dados históricos - Use
contracts_forpara ver tipos de contrato disponíveis - O stream continua até
forgetou desligar
1// Connect to the public WebSocket endpoint (no authentication required)
2const ws = new WebSocket('wss://ws.binaryws.com/websockets/v3');
3
4ws.onopen = () => {
5 // Get available symbols
6 ws.send(JSON.stringify({
7 active_symbols: "brief",
8 product_type: "basic",
9 req_id: 1
10 }));
11
12 // Subscribe to tick stream
13 ws.send(JSON.stringify({
14 ticks: "1HZ100V",
15 subscribe: 1,
16 req_id: 2
17 }));
18
19 // Get historical data
20 ws.send(JSON.stringify({
21 ticks_history: "1HZ100V",
22 count: 100,
23 end: "latest",
24 style: "ticks",
25 req_id: 3
26 }));
27};
28
29ws.onmessage = (msg) => {
30 const data = JSON.parse(msg.data);
31
32 if (data.msg_type === 'active_symbols') {
33 console.log('Available symbols:', data.active_symbols);
34 }
35
36 if (data.msg_type === 'tick') {
37 console.log('Current price:', data.tick.quote);
38 }
39
40 if (data.msg_type === 'history') {
41 console.log('Historical data:', data.history);
42 }
43};Resolução de Problemas
Causas comuns:
- Missing Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN> header in REST requests
- Using an expired or invalid authorization token
- Using a legacy App ID instead of a new App ID registered on developers.deriv.com
- Mismatched application type, such as using a PAT token with an OAuth-type application, or vice versa
Solução: Ensure your REST requests include Authorization: Bearer YOUR_AUTHORIZATION_TOKEN and use a new App ID registered on developers.deriv.com. Make sure your token type matches your application type.
Causas comuns:
- Authorization token does not have the required scopes for the endpoint
- You created the token without trade or account_manage scope
Solução: Regenerate your token with the correct scopes selected. At least one scope must be defined when creating a token.
Causas comuns:
- Using a legacy App ID with the new API
- Using an App ID not registered on developers.deriv.com
- Using an App ID with the wrong type
Solução: Log in to developers.deriv.com and register a new application with the correct type (PAT or OAuth) to get a new App ID.
Causas comuns:
- OAuth 2.0 access tokens are short-lived (typically 3600 seconds / 1 hour) and expire automatically
- PAT tokens can be revoked manually from the dashboard
Solução: For OAuth apps, implement token refresh logic using the refresh token. For PAT apps, generate a new token from the dashboard. Never store tokens in frontend code or expose them in URLs.
Causas comuns:
- Redirect URL is not whitelisted in the application dashboard
- Redirect URL includes subdirectories that were not registered
- Mismatch between the URL used in the OAuth request and the URLs registered in the dashboard
Solução: Ensure all redirect URLs (including subdirectories) are registered in your application settings on developers.deriv.com. The URLs must match exactly.
Padrões Comuns
- Always store subscription IDs
- Use forget to unsubscribe
- Use forget_all to clear all
- Clean up subscriptions before disconnect
- Always check for error field
- Implement exponential backoff for retries
- Log errors with context
- Handle network disconnections gracefully
- Use unique req_id for each request
- Match responses using req_id
- Helps with concurrent requests
- Essential for debugging
- Handle onopen, onclose, onerror
- Implement auto-reconnect logic
- Re-authenticate after reconnect
- Restore subscriptions on reconnect
Alguma outra questão? Entrar em contacto