Flux de travail complets
Exemples de bout en bout de flux de travail de trading courants utilisant le Deriv API
Prérequis
Important : complétez d'abord ces étapes
401 Unauthorized.- Se connecter à developers.deriv.com : Créez un compte ou connectez-vous avec vos identifiants pour accéder au tableau de bord.
- Enregistrez une nouvelle application : Naviguez vers le tableau de bord et enregistrez une nouvelle application sous votre compte. Choisissez le type d'application approprié en fonction de votre cas d'utilisation :
- Type PAT : Choisissez ceci lorsque les redirections de navigateur ne sont pas pratiques et que la saisie manuelle de token est acceptable. Par exemple, outils de bureau, applications CLI ou clients natifs. L'utilisateur génère un Personal Access Token dans Deriv et le colle dans votre application.
- OAuth type : Choisissez cette option lorsque votre produit peut gérer les redirections du navigateur et que vous avez besoin d’un flux délégué standard avec autorisation de l’utilisateur. Par exemple, pour les tableaux de bord web ou les applications de navigateur. OAuth 2.0 émet des tokens d’accès qui expirent et limite le partage d’identifiants à long terme.
Cela générera un nouvel App ID. Vos anciens App IDs ne fonctionneront pas avec les nouvelles API.
- Générez un token d'autorisation :
- Si vous utilisez le type PAT : Dans le Tableau de bord, accédez à la section tokens API. Créez un nouveau PAT (Personal Access Token) et sélectionnez les portées appropriées (par exemple
trade,account_manage). Copiez et stockez votre token en toute sécurité. Il ne pourra plus être consulté après sa création. - Si vous utilisez OAuth type : Vous n'avez pas besoin de générer manuellement un jeton. Passez au OAuth flux d'authentification 2.0 décrit ci-dessous. Ce flux vous fournit un jeton d'accès après une authentification réussie. Assurez-vous d'avoir enregistré votre
client_id,client_secret, et unredirect_uriHTTPS.
- Si vous utilisez le type PAT : Dans le Tableau de bord, accédez à la section tokens API. Créez un nouveau PAT (Personal Access Token) et sélectionnez les portées appropriées (par exemple
- Configurez vos en-têtes de requête : les requêtes REST API nécessitent un en-tête
Authorization: Bearer. Pour l'authentification basée sur PAT, l'en-têteDeriv-App-IDest également requis (non requis pour OAuth) :
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}Token d'autorisation
Authorization pour les appels REST API, et pour obtenir une URL WebSocket authentifiée via le point de terminaison OTP.Flux de travail de trading Options (REST + WebSocket)
Intégration complète
- REST : Obtenez une URL WebSocket authentifiée via le point de terminaison OTP (nécessite votre token d'autorisation)
- WebSocket : Connectez-vous à l'aide de l'URL authentifiée de la réponse OTP
- WebSocket : Effectuez des opérations de trading
Étape 1 : Obtenir l'URL WebSocket authentifiée (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' // 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Étape 2 : Se connecter au WebSocket
- Public : Aucune authentification requise. Pour les données de marché et les informations publiques.
- Démo : Authentifié. Pour le trading de compte démo.
- Réel : Authentifié. Pour le trading de compte réel.
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};Étape 3 : Commencer les opérations de trading
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}));Exemple complet
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});Flux d'authentification
Flux de travail A : Authentification basée sur PAT
Avec une application PAT, l'utilisateur génère un Personal Access Token dans Deriv et le saisit manuellement ou le colle dans votre application. L'application stocke le token en toute sécurité et l'inclut dans les demandes API en tant que token bearer. Cela convient mieux aux outils de bureau, applications CLI et clients natifs où les redirections de navigateur ne sont pas pratiques.
- Connectez-vous à
developers.deriv.comavec vos identifiants - Enregistrez une nouvelle application avec type PAT dans le tableau de bord
- Générez un token PAT avec les champs d'application appropriés
- Include
Authorization: Bearer <YOUR_AUTHORIZATION_TOKEN>andDeriv-App-IDin all REST request headers - Effectuez des appels REST API authentifiés
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);Flux de travail B : Authentification OAuth 2.0
OAuth 2.0 permet aux utilisateurs d'accorder à votre application un accès sans partager leur mot de passe. Votre application redirige l'utilisateur vers une page de connexion et de consentement Deriv. Après que l'utilisateur se connecte et approuve les permissions, Deriv renvoie un code d'autorisation à votre application. Vous échangez ce code contre un token d'accès, que vous utilisez ensuite pour authentifier les demandes API. Recommandé pour les applications Web intégrant des utilisateurs finaux.
Avant de commencer
- Assurez-vous que votre URL de redirection est correctement enregistrée dans le tableau de bord
- L'URL de redirection doit utiliser HTTPS. Pour le développement local, vous pouvez utiliser
http://localhost. - Votre application doit gérer les redirections, lire le code d'autorisation et l'échanger contre des tokens
- Vous devez avoir un client OAuth 2.0 enregistré avec des informations d'identification valides :
client_id,client_secretetredirect_uri - Toutes les URL de redirection (y compris les sous-répertoires) doivent être sur liste blanche. Les URL doivent correspondre exactement.
Important : Liste blanche d'URL de redirection
https://abc.com mais que votre URL de redirection est https://abc.com/callback, le flux échouera. Chaque sous-répertoire doit être enregistré séparément.Étapes du flux OAuth 2.0
- Votre application redirige l'utilisateur vers la page d'autorisation OAuth 2.0 de Deriv pour se connecter et examiner les permissions
- Le serveur d'autorisation gère la connexion et le consentement en toute sécurité
- Après la connexion, Deriv redirige l'utilisateur vers votre application avec un code d'autorisation et un paramètre state
- Votre application échange ce code contre des tokens (avec PKCE si utilisé)
- Le OAuth serveur renvoie un jeton d’accès et
expires_in, sa durée de validité en secondes - Votre application stocke et utilise en toute sécurité le token d'accès pour les appels WebSocket ou REST API
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);Meilleures pratiques de sécurité
- Validez toujours le paramètre
statepour empêcher les attaques CSRF - Générez votre
code_challengeà partir d'uncode_verifieraléatoire cryptographiquement sécurisé - Stockez les tokens en toute sécurité sur le serveur. Ne les exposez jamais dans le code frontend.
- Les jetons d’accès expirent après le nombre de secondes indiqué dans
expires_in. Pour en obtenir un nouveau, relancez le flux d’autorisation — Deriv n’émet pas de jetons d’actualisation. Si un nouveau jeton d’accès renvoie également une erreur 401, ne relancez pas le flux. Vérifiez plutôt l’en-têteAuthorizationet l’endpoint. - Le code d'autorisation est à usage unique et de courte durée
Authentification WebSocket (OTP)
Pour vous connecter à un point de terminaison WebSocket authentifié, vous devez appeler le point de terminaison OTP REST à l'aide de votre token d'autorisation (PAT ou JWT). La réponse contient une URL WebSocket authentifiée à laquelle vous pouvez vous connecter directement. L'URL gère l'authentification pour vous.
Points de terminaison WebSocket :
À utiliser pour les données de marché et les informations publiques. Aucune connexion requise.
À utiliser pour les opérations de Trading sur compte démo/virtuel. L'URL de réponse OTP pointera vers ce point de terminaison pour les comptes démo.
À utiliser pour le Trading sur compte réel. L’URL de réponse OTP pointera vers ce endpoint pour les comptes réels.
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};Flux de trading complet
Processus de trading de bout en bout
- Établir la connexion et s'authentifier
- Obtenez les symboles actifs à l'aide de
active_symbols - Abonnez-vous au flux de tick pour le symbole choisi à l'aide de
ticks - Obtenez une proposition de contrat à l'aide de
proposal(avec abonnement) - Surveillez les mises à jour de prix en temps réel
- Lorsque vous êtes prêt, achetez un contrat à l'aide de
buy - Abonnez-vous aux mises à jour de contrat à l'aide de
proposal_open_contract - Surveillez le statut du contrat en temps réel
- Vendez éventuellement plus tôt à l'aide de
sell - Vérifiez le portefeuille en utilisant
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}));Flux de travail de données de marché
Aucune authentification requise
- Connectez-vous au point de terminaison WebSocket public (aucune authentification nécessaire)
- Demandez
active_symbolspour voir les marchés disponibles - Abonnez-vous à
tickspour les mises à jour de prix en temps réel - Obtenez éventuellement
ticks_historypour les données historiques - Utilisez
contracts_forpour voir les types de contrats disponibles - Le flux continue jusqu'à
forgetou déconnexion
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};Dépannage
Causes courantes :
- En-tête Authorization: Bearer manquant dans les <your_authorization_token> requêtes REST </your_authorization_token>
- Utilisation d’un jeton d’autorisation expiré ou non valide
- Utilisation d’un ancien ID d’application au lieu d’un nouvel ID d’application enregistré sur developers.deriv.com
- Type d'application non correspondant, par exemple l'utilisation d'un PAT jeton avec une application de type OAuth-type, ou inversement
Solution : Assurez-vous que vos requêtes vers REST incluent Authorization: Bearer YOUR_AUTHORIZATION_TOKEN et utilisent un nouvel ID d’application enregistré sur developers.deriv.com. Assurez-vous que votre type de jeton correspond à votre type d’application.
Causes courantes :
- Le jeton d'autorisation ne dispose pas des portées requises pour le point de terminaison
- Vous avez créé le jeton sans la portée
tradeouaccount_manage
Solution : Générez à nouveau votre jeton en sélectionnant les portées appropriées. Au moins une portée doit être définie lors de la création d'un jeton.
Causes courantes :
- Utilisation d’un ID d’application existant avec la nouvelle API
- Utilisation d'un App ID non enregistré sur developers.deriv.com
- Utilisation d’un ID d’application avec le mauvais type
Solution : Connectez-vous à developers.deriv.com et enregistrez une nouvelle application avec le type approprié (PAT ou OAuth) pour obtenir un nouvel App ID.
Causes courantes :
- OAuth Les jetons d’accès 2.0 expirent après le nombre de secondes indiqué dans expires_in
- PAT les jetons peuvent être révoqués manuellement depuis le tableau de bord
Solution : Pour OAuth les applications, exécutez à nouveau le flux d’autorisation pour obtenir un nouveau token d’accès — Deriv n’émet pas de tokens de rafraîchissement. Si un nouveau token d’accès renvoie également une erreur 401, ne relancez pas le flux. Vérifiez plutôt l’en-tête Authorization et le point de terminaison. Pour PAT les applications, générez un nouveau token depuis le tableau de bord. Ne stockez jamais de tokens dans le code frontend et ne les exposez jamais dans les URL.
Causes courantes :
- L'URL de redirection n'est pas autorisée dans le tableau de bord de l'application
- L'URL de redirection inclut des sous-répertoires qui n'ont pas été enregistrés
- Incohérence entre l’URL utilisée dans la OAuth requête et les URL enregistrées dans le tableau de bord
Solution : Assurez-vous que toutes les URL de redirection, y compris les sous-répertoires, sont enregistrées dans les paramètres de votre application sur developers.deriv.com. Les URL doivent correspondre exactement.
Modèles courants
- Stockez toujours les ID d’abonnement
- Utilisez
forgetpour vous désabonner - Utilisez
forget_allpour supprimer tous les - Supprimer les abonnements avant la déconnexion
- Vérifiez toujours le champ
error - Implémentez un délai exponentiel entre les tentatives
- Enregistrez les erreurs avec leur contexte
- Gérez les déconnexions réseau avec élégance
- Utilisez un req_id unique pour chaque requête
- Faites correspondre les réponses à l’aide de req_id
- Aide à gérer les requêtes simultanées
- Essentiel pour le débogage
- Gérez onopen, onclose, onerror
- Mettez en œuvre une logique de reconnexion automatique
- S’authentifier à nouveau après la reconnexion
- Restaurer les abonnements lors de la reconnexion
D'autres questions ? Nous contacter