Premiers pas
Trois étapes, une clé, environ cinq minutes. L'essai gratuit sert EURUSD, XAUUSD avec 7 jours d'historique, ce qui suffit à ces étapes.
1. Ouvrir un compte et obtenir la clé
Inscrivez-vous avec votre adresse professionnelle et confirmez-la depuis le mail que nous envoyons. Sur la page de votre compte, lancez l'essai de 7 jours : la clé s'affiche une seule fois, puis nous n'en gardons qu'une empreinte. Enregistrez-la sur votre serveur.
2. Votre serveur : la clé contre un jeton, puis l'historique
La clé reste sur votre serveur. Votre serveur l'échange contre un jeton par utilisateur final (l'end_user_id est le vôtre), et le jeton lit les bougies. Avec curl, remplacez adk_live_... par votre clé, et l'emplacement du jeton par l'access_token renvoyé ; en Python et en JavaScript, la clé est lue dans la variable d'environnement ADONA_API_KEY.
# votre serveur échange la clé contre un jeton
curl -s https://api.adona-robot.com/v1/tokens \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer adk_live_...' \
-d '{"end_user_id":"u-42"}'
# le jeton lit les bougies
curl -s 'https://api.adona-robot.com/v1/candles?symbol=EURUSD&timeframe=M1&limit=1000' \
-H 'Authorization: Bearer <token>'# pip install requests
import os
import requests
API = "https://api.adona-robot.com"
# votre serveur échange la clé contre un jeton
r = requests.post(
f"{API}/v1/tokens",
headers={"Authorization": f"Bearer {os.environ['ADONA_API_KEY']}"},
json={"end_user_id": "u-42"},
timeout=30,
)
if not r.ok:
raise SystemExit(f"refused: {r.status_code} {r.text}")
token = r.json()["access_token"]
# le jeton lit les bougies
r = requests.get(
f"{API}/v1/candles",
headers={"Authorization": f"Bearer {token}"},
params={"symbol": "EURUSD", "timeframe": "M1", "limit": 1000},
timeout=30,
)
if not r.ok:
raise SystemExit(f"refused: {r.status_code} {r.text}")
page = r.json()
print(len(page["candles"]), "bars, newest:", page["candles"][-1] if page["candles"] else None)
// Node 18+, sur votre serveur : ADONA_API_KEY=... node history.mjs
const API = "https://api.adona-robot.com";
async function call(path, bearer, init = {}) {
const response = await fetch(`${API}${path}`, {
...init,
headers: { Authorization: `Bearer ${bearer}`, "Content-Type": "application/json" },
});
if (!response.ok) throw new Error(`refused: ${response.status} ${await response.text()}`);
return response.json();
}
const key = process.env.ADONA_API_KEY;
if (!key) throw new Error("set ADONA_API_KEY to your API key");
// votre serveur échange la clé contre un jeton
const { access_token: token, expires_in } = await call("/v1/tokens", key, {
method: "POST",
body: JSON.stringify({ end_user_id: "u-42" }),
});
// le jeton lit les bougies
const page = await call("/v1/candles?symbol=EURUSD&timeframe=M1&limit=1000", token);
console.log(page.candles.length, "bars, newest:", page.candles.at(-1));
console.log(`token ok, expires in ${expires_in} s`);
La réponse est une page de bougies, de la plus ancienne à la plus récente, avec next_before pour remonter plus loin. Le champ expires_in du jeton dit combien de secondes il dure : réutilisez-le jusque-là.
La même chose sur un serveur Node, avec le jeton réutilisé jusqu'à son expiration : token-server.ts
3. Le flux en direct
Le jeton obtient un ticket, et le ticket ouvre le flux. Le ticket passe en second sous-protocole, jamais dans l'URL, et expire en quelques secondes : ouvrez le flux juste après. curl obtient le ticket ; garder le flux ouvert demande un client WebSocket, ce que sont les onglets Python et JavaScript. Le JavaScript tourne dans un navigateur, qui ne peut appeler l'API que depuis une page dont votre compte déclare l'origine : ajoutez-la dans les origines navigateur de la page de votre compte, puis collez ceci dans la console de cette page, avec votre jeton. Les prix arrivent en trames quote, les barres en trames candle.
# un ticket pour le flux, à partir du jeton
curl -s -X POST https://api.adona-robot.com/v1/ws-ticket \
-H 'Authorization: Bearer <token>'
# le flux lui-même demande un client WebSocket : voir Python ou JavaScript# pip install requests "websockets>=13"
import asyncio
import json
import os
import requests
from websockets.asyncio.client import connect
API = "https://api.adona-robot.com"
STREAM = "wss://api.adona-robot.com/v1/stream"
def post(path, bearer, body=None):
r = requests.post(API + path, headers={"Authorization": f"Bearer {bearer}"}, json=body, timeout=30)
if not r.ok:
raise SystemExit(f"refused: {r.status_code} {r.text}")
return r.json()
async def main():
token = post("/v1/tokens", os.environ["ADONA_API_KEY"], {"end_user_id": "u-42"})["access_token"]
# un ticket pour le flux, à partir du jeton
ticket = post("/v1/ws-ticket", token)["ticket"]
# le flux : prix en direct et barres d'une minute
async with connect(STREAM, subprotocols=["adona.data.v1", f"ticket.{ticket}"]) as ws:
await ws.send(json.dumps({
"type": "subscribe", "request_id": "sub",
"payload": {"channels": ["quote:EURUSD", "candle:EURUSD:M1"]},
}))
async for message in ws:
print(json.loads(message))
asyncio.run(main())
// un ticket pour le flux, à partir du jeton
const { ticket } = await (await fetch("https://api.adona-robot.com/v1/ws-ticket", {
method: "POST",
headers: { Authorization: "Bearer <token>" },
})).json();
// le flux : prix en direct et barres d'une minute
const ws = new WebSocket("wss://api.adona-robot.com/v1/stream", ["adona.data.v1", `ticket.${ticket}`]);
ws.onopen = () => ws.send(JSON.stringify({
type: "subscribe", request_id: "sub", payload: { channels: ["quote:EURUSD", "candle:EURUSD:M1"] },
}));
ws.onmessage = (event) => console.log(JSON.parse(event.data));Déclarer une origine sur la page du compte
Un client navigateur complet, avec les reconnexions et les refus qu'un nouvel essai ne change pas : browser.ts
Ensuite
Chaque route, champ et code de refus est dans la référence. La page du compte montre votre consommation, l'identifiant de votre clé, sa rotation et le passage à un palier payant.