Documentation API.
Authentifiez-vous avec OAuth ou des personal access tokens, puis lisez et écrivez trades, comptes, connexions, imports et métriques via l’API publique Deltalytix v1.
Ce que vous pouvez faire
Chaque ligne ouvre le guide correspondant. Incluez ce scope sur votre jeton.
| Vous pouvez | Scope |
|---|---|
| Lire le profil de l’utilisateur authentifié | profile:read |
| Lister les trades | trades:read |
| Créer des trades | trades:write |
| Lister les comptes et métriques associées | accounts:read |
| Lister les connexions broker | connections:read |
| Créer des connexions et déclencher une sync | connections:write |
| Envoyer des fichiers d’import | imports:write |
| Lire les métriques summary, equity et comptes | metrics:read |
Authentification
Obtenir un jeton
Vous pouvez générer ou coller un jeton depuis n’importe quel panneau d’essai, au moment où vous en avez besoin.
Deltalytix est son propre serveur d’autorisation OAuth 2.0. Les humains se connectent toujours via Supabase ; les jetons API sont émis et validés par Deltalytix.
Chaque requête /api/v1/* exige un jeton Bearer :
Authorization: Bearer dltx_at_…Les endpoints REST sont servis depuis https://www.deltalytix.app sous API v1 (/api/v1/*). Les listes acceptent limit (défaut 100, max 500) et cursor. Les timestamps sont en ISO 8601. Découverte machine-readable : /openapi.json, /.well-known/openid-configuration, /.well-known/oauth-protected-resource.
Formats de jetons
Les jetons sont des chaînes opaques. Deltalytix ne stocke que des empreintes SHA-256.
| Type | Préfixe | Durée de vie |
|---|---|---|
| Access token | dltx_at_<48 hex chars> | 3600 secondes |
| Refresh token | dltx_rt_<48 hex chars> | 30 jours (rotation à chaque usage) |
| Personal access token (PAT) | dltx_pat_<48 hex chars> | Pas d’expiration jusqu’à révocation |
| Client ID | dltx_app_<24 hex chars> | — |
| Client secret | dltx_secret_<48 hex chars> | Affiché une seule fois à la création |
Scopes
Demandez uniquement les scopes dont votre intégration a besoin. Séparez-les par des espaces dans le paramètre OAuth scope. La liste complète est dans ce que vous pouvez faire.
Personal access tokens
Les PAT conviennent aux scripts et outils privés. Créez-les et révoquez-les dans Paramètres → Connexions, en choisissant les scopes nécessaires. La valeur du jeton n’est affichée qu’une fois.
curl https://www.deltalytix.app/api/v1/me \
-H "Authorization: Bearer dltx_pat_YOUR_TOKEN"Token démo
Le playground de la documentation peut émettre un token démo de courte durée, en lecture seule, sans connexion. Il authentifie un compte d’exemple partagé (DEMO-001) pour essayer les routes GET. Les scopes d’écriture exigent votre propre token docs ou PAT. Les tokens docs générés une fois connecté expirent au bout de 24 heures.
OAuth 2.0
Enregistrez votre application sur la page Développeurs pour obtenir un client_id et un client_secret.
1. Autoriser
Envoyez l’utilisateur vers la page de consentement (HTML). Les utilisateurs non authentifiés sont redirigés vers /authentication?next=….
GET /oauth/authorize
?client_id=dltx_app_…
&redirect_uri=https%3A%2F%2Fyour-app.example%2Fcallback
&response_type=code
&scope=profile%3Aread%20trades%3Aread
&state=csrf-token
&code_challenge=BASE64URL_SHA256_OF_VERIFIER
&code_challenge_method=S256Essayer cette route
Cet endpoint d’autorisation exige une redirection navigateur et le consentement de l’utilisateur ; il ne peut donc pas être envoyé ici comme une requête API.
| Query | Requis | Notes |
|---|---|---|
client_id | Oui | Application OAuth enregistrée |
redirect_uri | Oui | Doit correspondre exactement à une URI enregistrée |
response_type | Oui | Doit être code |
scope | Oui | Scopes séparés par des espaces |
state | Recommandé | Protection CSRF ; renvoyé à la redirection |
code_challenge | Recommandé | Challenge PKCE S256 |
code_challenge_method | Avec challenge | Doit être S256 |
En cas d’approbation, Deltalytix émet un code d’autorisation à usage unique (TTL de 10 minutes) et redirige. Une nouvelle approbation de la même application pour le même utilisateur révoque les jetons d’accès et de rafraîchissement antérieurs de cette paire et invalide les codes d’autorisation non utilisés, afin que seul le nouvel octroi reste utilisable :
https://your-app.example/callback?code=…&state=…En cas de refus :
https://your-app.example/callback?error=access_denied&state=…2. Échanger le code contre des jetons
POST /api/oauth/token accepte du form-urlencoded ou du JSON.
curl -X POST https://www.deltalytix.app/api/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=AUTHORIZATION_CODE" \
-d "redirect_uri=https://your-app.example/callback" \
-d "client_id=dltx_app_…" \
-d "client_secret=dltx_secret_…" \
-d "code_verifier=PKCE_VERIFIER"Chaque application OAuth est un client confidentiel. Envoyez client_secret dans le corps (client_secret_post) ou via Authorization: Basic (client_secret_basic) lors de l’échange du code, du refresh et de la révocation. Un secret absent ou incorrect renvoie 401 invalid_client. PKCE reste recommandé : un code émis avec un code_challenge exige aussi le code_verifier correspondant.
Succès
{
"access_token": "dltx_at_…",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "dltx_rt_…",
"scope": "profile:read trades:read"
}Les erreurs OAuth suivent la RFC 6749 :
Erreur
{
"error": "invalid_grant",
"error_description": "Invalid or expired authorization code"
}3. Appeler l’API
curl https://www.deltalytix.app/api/v1/trades?limit=10 \
-H "Authorization: Bearer dltx_at_…"const res = await fetch("https://www.deltalytix.app/api/v1/trades?limit=10", {
headers: {
Authorization: `Bearer ${accessToken}`,
},
});4. Rafraîchir l’access token
curl -X POST https://www.deltalytix.app/api/oauth/token \
-H "Content-Type: application/json" \
-d '{
"grant_type": "refresh_token",
"refresh_token": "dltx_rt_…",
"client_id": "dltx_app_…",
"client_secret": "dltx_secret_…"
}'Les refresh tokens tournent à chaque usage. Conservez le nouveau refresh_token de chaque réponse réussie.
5. Révoquer un jeton
curl -X POST https://www.deltalytix.app/api/oauth/revoke \
-H "Content-Type: application/json" \
-d '{
"token": "dltx_at_…",
"client_id": "dltx_app_…",
"client_secret": "dltx_secret_…"
}'La révocation renvoie toujours 200, que le jeton ait été trouvé ou non.
Échecs côté resource server
Un Bearer manquant ou invalide renvoie 401 :
Erreur
{
"error": "unauthorized",
"message": "…"
}avec un en-tête WWW-Authenticate pointant vers les métadonnées de ressource protégée.
Un jeton valide sans le scope requis renvoie 403 :
Erreur
{
"error": "insufficient_scope",
"message": "…"
}Gérer les applications et les jetons
Sur la page Développeurs, vous pouvez :
- Créer des applications OAuth (nom, redirect URIs, scopes autorisés) —
client_idtoujours visible ;client_secretaffiché une fois. Les redirect URIs doivent être des URLhttpsabsolues (httpuniquement surlocalhost), sans fragment. - Modifier une application, régénérer son secret client ou la supprimer
Dans Paramètres → Connexions, vous pouvez :
- Créer et révoquer des personal access tokens avec les scopes choisis — la valeur du PAT est affichée une fois
- Révoquer les applications que vous avez autorisées sur votre compte
Trades
Lister et créer des trades avec filtres, pagination et le pipeline partagé d’import / déduplication.
Gérez l’historique de trades de l’utilisateur authentifié.
Lister les trades
GET /api/v1/tradesScope : trades:read
Paramètres de requête
| Paramètre | Description |
|---|---|
accountNumber | Filtrer par numéro de compte |
instrument | Filtrer par instrument |
side | Filtrer par sens |
from | Borne inférieure inclusive sur entryDate (ISO 8601) |
to | Borne supérieure inclusive sur entryDate (ISO 8601) |
cursor | Curseur de pagination opaque |
limit | Taille de page (défaut 100, max 500) |
Exemple
curl "https://www.deltalytix.app/api/v1/trades?accountNumber=SIM-001&limit=50" \
-H "Authorization: Bearer dltx_at_…"const params = new URLSearchParams({
accountNumber: "SIM-001",
from: "2026-01-01T00:00:00.000Z",
limit: "50",
});
const res = await fetch(`https://www.deltalytix.app/api/v1/trades?${params}`, {
headers: { Authorization: `Bearer ${accessToken}` },
});
const page = await res.json();Réponse 200
Succès
{
"data": [
{
"id": "trade_01HZX…",
"accountNumber": "SIM-001",
"instrument": "ES",
"side": "long",
"quantity": 2,
"entryPrice": 5120.25,
"closePrice": 5128.5,
"entryDate": "2026-03-15T14:30:00.000Z",
"closeDate": "2026-03-15T15:10:00.000Z",
"pnl": 825,
"commission": 8.64,
"timeInPosition": 2400,
"tags": ["breakout"],
"comment": "Morning continuation",
"createdAt": "2026-03-15T15:12:01.000Z"
}
],
"nextCursor": null
}Créer des trades
POST /api/v1/tradesScope : trades:write
Crée un ou plusieurs trades via le même pipeline de déduplication que le tableau de bord (UUID v5 + createMany avec skipDuplicates). Les doublons sont comptés, pas traités comme des erreurs dures.
Corps de requête
{
"trades": [
{
"accountNumber": "SIM-001",
"instrument": "ES",
"quantity": 2,
"entryPrice": 5120.25,
"closePrice": 5128.5,
"entryDate": "2026-03-15T14:30:00.000Z",
"closeDate": "2026-03-15T15:10:00.000Z",
"pnl": 825,
"side": "long",
"commission": 8.64,
"entryId": "optional-broker-entry-id",
"closeId": "optional-broker-close-id",
"timeInPosition": 2400,
"tags": ["breakout"],
"comment": "Morning continuation"
}
]
}| Champ | Requis | Notes |
|---|---|---|
accountNumber | Oui | Compte cible |
instrument | Oui | Symbole / contrat |
quantity | Oui | Taille |
entryPrice | Oui | Prix d’entrée |
closePrice | Oui | Prix de sortie |
entryDate | Oui | ISO 8601 |
closeDate | Oui | ISO 8601 |
pnl | Oui | P&L réalisé |
side | Non | ex. long / short |
commission | Non | Frais |
entryId | Non | Identifiant d’entrée broker |
closeId | Non | Identifiant de sortie broker |
timeInPosition | Non | Durée en secondes |
tags | Non | Tableau de chaînes |
comment | Non | Texte libre |
Exemple
curl -X POST https://www.deltalytix.app/api/v1/trades \
-H "Authorization: Bearer dltx_at_…" \
-H "Content-Type: application/json" \
-d '{
"trades": [
{
"accountNumber": "SIM-001",
"instrument": "ES",
"quantity": 2,
"entryPrice": 5120.25,
"closePrice": 5128.5,
"entryDate": "2026-03-15T14:30:00.000Z",
"closeDate": "2026-03-15T15:10:00.000Z",
"pnl": 825,
"side": "long",
"commission": 8.64
}
]
}'Réponse 201
Succès
{
"imported": 1,
"duplicates": 0,
"total": 1
}Si chaque ligne est un doublon, la réponse reste un succès avec des compteurs (par exemple "imported": 0, "duplicates": 3, "total": 3), pas un statut d’erreur.
Comptes
Lister les comptes de trading, les payouts et les métriques de performance optionnelles.
Lisez les comptes de l’utilisateur authentifié et les informations de payout associées.
Lister les comptes
GET /api/v1/accountsScope : accounts:read
Paramètres de requête
| Paramètre | Description |
|---|---|
includeMetrics | Lorsque true, attache les métriques par compte issues de computeMetricsForAccounts |
Exemple
curl "https://www.deltalytix.app/api/v1/accounts?includeMetrics=true" \
-H "Authorization: Bearer dltx_at_…"const res = await fetch(
"https://www.deltalytix.app/api/v1/accounts?includeMetrics=true",
{
headers: { Authorization: `Bearer ${accessToken}` },
},
);
const payload = await res.json();Réponse 200
Succès
{
"data": [
{
"id": "acc_01HZX…",
"number": "SIM-001",
"propfirm": "Topstep",
"startingBalance": 50000,
"createdAt": "2026-01-15T09:00:00.000Z",
"hidden": false,
"group": { "id": "grp_01HZX…", "name": "Evaluations" },
"balance": 52480.12,
"payouts": [
{
"id": "pay_01HZX…",
"amount": 2500,
"date": "2026-02-01T00:00:00.000Z",
"status": "PAID"
}
],
"metrics": { "…": "…" }
}
]
}Comptes masqués
Tous les comptes sont renvoyés, y compris ceux masqués dans le tableau de bord. Masquer un compte le place dans le groupe Hidden Accounts : hidden vaut alors true et group.name vaut "Hidden Accounts". Ignorez les comptes où hidden vaut true pour retrouver ce qu’affiche le tableau de bord. group vaut null pour un compte qui n’appartient à aucun groupe.
metrics n’est présent que lorsque includeMetrics=true. Les champs incluent balance, drawdown, consistency et progress vers les objectifs du compte.
Pour des analyses au niveau portefeuille sur tous les comptes, préférez les endpoints Métriques.
Connexions
Lister les connexions broker, créer une connexion synchronisable côté serveur et déclencher une sync.
Les connexions broker synchronisent les trades dans Deltalytix. Les jetons bruts du broker ne sont jamais renvoyés par l’API.
Services synchronisables côté serveur en v1 :
service | Création | Sync | Notes |
|---|---|---|---|
ibkr | token, queryId | oui | IBKR Flex Web Service |
dxfeed | login, password, propFirmId | oui | Prop firms Volumetrica / DxFeed |
rithmic-protocol | username, password, systemName, historyStartDate, optionnel gatewayId | oui | Passerelle Rithmic Protocol |
tradovate | OAuth dashboard uniquement | oui | Connecter dans le dashboard Deltalytix, puis lister et synchroniser via l’API |
Les services classiques rithmic, thor et etp peuvent apparaître dans GET, mais ne sont ni créables ni synchronisables via cette API.
Lister les connexions
GET /api/v1/connectionsScope : connections:read
Exemple
curl https://www.deltalytix.app/api/v1/connections \
-H "Authorization: Bearer dltx_at_…"Réponse 200
Succès
{
"data": [
{
"id": "conn_01HZX…",
"service": "ibkr",
"externalId": "flex-query-123",
"lastSyncedAt": "2026-03-15T16:00:00.000Z",
"environment": "live",
"accountNumbers": ["U1234567"]
}
],
"nextCursor": null
}| Champ | Description |
|---|---|
id | Identifiant de connexion |
service | Clé du fournisseur (ibkr, tradovate, dxfeed, rithmic-protocol, …) |
externalId | Identifiant côté fournisseur (jamais un secret) |
lastSyncedAt | Horodatage de la dernière sync réussie, ou null |
environment | ex. live / demo le cas échéant |
accountNumbers | Numéros de comptes Deltalytix liés |
Créer une connexion
POST /api/v1/connectionsScope : connections:write
Le corps est discriminant sur service. En cas de succès, l’API stocke les identifiants (chiffrés), lie les comptes si disponibles, tente une sync initiale, et renvoie la connexion sans secrets.
IBKR Flex
{
"service": "ibkr",
"token": "<flex token>",
"queryId": "<flex query id>"
}curl -X POST https://www.deltalytix.app/api/v1/connections \
-H "Authorization: Bearer dltx_at_…" \
-H "Content-Type: application/json" \
-d '{
"service": "ibkr",
"token": "YOUR_FLEX_TOKEN",
"queryId": "YOUR_FLEX_QUERY_ID"
}'DxFeed
{
"service": "dxfeed",
"login": "trader@example.com",
"password": "…",
"propFirmId": "miltraders"
}propFirmId doit être un id de firme activé (par ex. miltraders, myfundedfutures, phoenixtraderfunding).
Rithmic Protocol
{
"service": "rithmic-protocol",
"username": "your-username",
"password": "…",
"systemName": "Rithmic Paper Trading",
"historyStartDate": "2026-01-01",
"gatewayId": "core"
}historyStartDate est au format YYYY-MM-DD. gatewayId est optionnel (ex. core, nyc, test).
Réponse 201
Succès
{
"id": "conn_01HZX…",
"service": "ibkr",
"externalId": "flex-query-123",
"accountNumbers": ["U1234567"],
"imported": 42,
"duplicates": 3
}Si la connexion est enregistrée mais que la sync initiale échoue, la réponse reste 201 avec imported: 0 et un message warning.
Service non supporté → 422
Erreur
{
"error": "unsupported_service",
"message": "Only credential-based connection services can be created in v1",
"details": {
"supported": ["ibkr", "dxfeed", "rithmic-protocol"]
}
}Déclencher une synchronisation
POST /api/v1/connections/{id}/syncScope : connections:write
Disponible pour ibkr, dxfeed, rithmic-protocol, et les connexions tradovate déjà liées dans le dashboard.
Exemple
curl -X POST https://www.deltalytix.app/api/v1/connections/conn_01HZX…/sync \
-H "Authorization: Bearer dltx_at_…"Réponse 200
Succès
{
"status": "completed",
"imported": 42,
"duplicates": 3
}Imports
Envoyer des fichiers de trades CSV ou XLSX avec mapping IA ou parseurs spécifiques à une plateforme.
Importez des trades depuis des fichiers sans passer par l’interface du tableau de bord.
Envoyer un fichier
POST /api/v1/importsScope : imports:write
Content-Type : multipart/form-data
Champs du formulaire
| Champ | Requis | Description |
|---|---|---|
file | Oui | Fichier .csv ou .xlsx |
type | Oui | "ai" ou un nom de plateforme |
accountNumber | Oui | Numéro de compte de destination |
Import IA (type=ai)
Le serveur parse le fichier (Papa Parse pour CSV, read-excel-file pour XLSX), exécute le même pipeline de mapping et de formatage IA que le tableau de bord, puis enregistre les trades via le cœur partagé de sauvegarde.
curl -X POST https://www.deltalytix.app/api/v1/imports \
-H "Authorization: Bearer dltx_at_…" \
-F "file=@./trades.csv" \
-F "type=ai" \
-F "accountNumber=SIM-001"const form = new FormData();
form.append("file", fileInput.files[0]);
form.append("type", "ai");
form.append("accountNumber", "SIM-001");
const res = await fetch("https://www.deltalytix.app/api/v1/imports", {
method: "POST",
headers: { Authorization: `Bearer ${accessToken}` },
body: form,
});
const result = await res.json();Import plateforme (type=<platform>)
Lorsque type est une clé de plateforme, le serveur utilise un parseur enregistré extrait du flux d’import du tableau de bord. Les plateformes supportées dépendent des parseurs disponibles en fonctions pures (candidats : tradezella, tradovate, quantower, topstep, ftmo, atas, et d’autres).
curl -X POST https://www.deltalytix.app/api/v1/imports \
-H "Authorization: Bearer dltx_at_…" \
-F "file=@./export.xlsx" \
-F "type=tradovate" \
-F "accountNumber=SIM-001"Réponse de succès
Succès
{
"imported": 128,
"duplicates": 4,
"total": 132,
"accountNumber": "SIM-001"
}Plateforme non supportée → 422
Erreur
{
"error": "unsupported_service",
"message": "Unknown import type",
"details": {
"supported": ["ai", "tradovate", "tradezella", "quantower"]
}
}La liste exacte details.supported reflète le registre de parseurs en production.
Métriques
Statistiques de synthèse, courbes d’équité et métriques de performance par compte.
Calculez des analyses de performance à partir des trades de l’utilisateur authentifié.
Tous les endpoints de métriques exigent le scope metrics:read.
Synthèse
GET /api/v1/metrics/summaryUtilise les mêmes filtres que GET /api/v1/trades. Les statistiques proviennent de calculateStatistics et de la formule de profit factor du tableau de bord (gains et pertes bruts nets de commission).
Paramètres de requête
| Paramètre | Description |
|---|---|
accountNumber | Filtrer par compte |
instrument | Filtrer par instrument |
side | Filtrer par sens |
from / to | Bornes sur entryDate |
cursor / limit | Acceptés pour cohérence avec les filtres trades le cas échéant |
Exemple
curl "https://www.deltalytix.app/api/v1/metrics/summary?from=2026-01-01T00:00:00.000Z" \
-H "Authorization: Bearer dltx_at_…"Réponse 200
Succès
{
"totalPnl": 12450.5,
"totalCommission": 312.4,
"tradeCount": 186,
"winCount": 102,
"lossCount": 78,
"breakevenCount": 6,
"winRate": 0.5484,
"profitFactor": 1.62,
"averageWin": 215.3,
"averageLoss": -142.1,
"longCount": 110,
"shortCount": 76,
"tradingDays": 48
}Courbe d’équité
GET /api/v1/metrics/equityConstruit des points d’équité journaliers via computeEquityChartData.
Paramètres de requête
| Paramètre | Description |
|---|---|
from | Date de début (ISO 8601) |
to | Date de fin (ISO 8601) |
accountNumbers | Numéros de compte séparés par des virgules ; lorsqu’ils sont fournis, renvoie aussi des séries par compte |
Exemple
curl "https://www.deltalytix.app/api/v1/metrics/equity?accountNumbers=SIM-001,SIM-002&from=2026-01-01T00:00:00.000Z" \
-H "Authorization: Bearer dltx_at_…"const params = new URLSearchParams({
accountNumbers: "SIM-001,SIM-002",
from: "2026-01-01T00:00:00.000Z",
});
const res = await fetch(
`https://www.deltalytix.app/api/v1/metrics/equity?${params}`,
{ headers: { Authorization: `Bearer ${accessToken}` } },
);
const equity = await res.json();Réponse 200
Succès
{
"points": [
{
"date": "2026-01-02",
"equity": 50120.5
},
{
"date": "2026-01-03",
"equity": 50385.25
}
],
"accounts": {
"SIM-001": [
{ "date": "2026-01-02", "equity": 25050.0 },
{ "date": "2026-01-03", "equity": 25210.75 }
],
"SIM-002": [
{ "date": "2026-01-02", "equity": 25070.5 },
{ "date": "2026-01-03", "equity": 25174.5 }
]
}
}L’objet accounts est inclus lorsque accountNumbers est demandé.
Métriques par compte
GET /api/v1/metrics/accountsExécute computeMetricsForAccounts pour tous les comptes de l’utilisateur.
Exemple
curl https://www.deltalytix.app/api/v1/metrics/accounts \
-H "Authorization: Bearer dltx_at_…"Réponse 200
Succès
{
"data": [
{
"accountNumber": "SIM-001",
"balance": 52480.12,
"drawdown": 3.4,
"consistency": 0.82,
"progress": 0.61
}
]
}Erreurs
Enveloppe d’erreur REST, codes de statut HTTP et réponses d’erreur OAuth.
Enveloppe d’erreur REST
Les erreurs de l’API v1 utilisent un corps JSON cohérent :
Erreur
{
"error": "machine_code",
"message": "Explication lisible",
"details": {}
}| Champ | Description |
|---|---|
error | Code machine stable |
message | Explication lisible |
details | Contexte structuré optionnel (validation, valeurs supportées, …) |
Codes de statut HTTP
| Statut | Cause typique |
|---|---|
400 | Erreur de validation (query/body mal formé) |
401 | Bearer manquant, expiré, révoqué ou invalide |
403 | Authentifié mais scope requis manquant |
404 | Ressource introuvable |
422 | Requête sémantiquement invalide (service/type non supporté) |
500 | Erreur serveur inattendue |
Non autorisé (401)
Erreur
{
"error": "unauthorized",
"message": "Missing or invalid access token"
}Les réponses incluent :
WWW-Authenticate: Bearer resource_metadata="https://www.deltalytix.app/.well-known/oauth-protected-resource"Scope insuffisant (403)
Erreur
{
"error": "insufficient_scope",
"message": "Token is missing required scope trades:write"
}Service non supporté (422)
Erreur
{
"error": "unsupported_service",
"message": "Only credential-based connection services can be created in v1",
"details": {
"supported": ["ibkr", "dxfeed", "rithmic-protocol"]
}
}Erreurs OAuth
Les échecs du token endpoint utilisent la forme RFC 6749 (pas l’enveloppe REST) :
Erreur
{
"error": "invalid_grant",
"error_description": "Authorization code is invalid or expired"
}Les valeurs OAuth error courantes incluent invalid_request, invalid_client, invalid_grant, unauthorized_client, unsupported_grant_type et invalid_scope.
Les refus sur l’authorization endpoint redirigent vers le redirect_uri enregistré avec error=access_denied (et le state d’origine s’il a été fourni).
Compteurs hors erreur
Certains endpoints d’écriture signalent des doublons ou des imports nuls avec un succès HTTP et des compteurs, plutôt qu’un corps d’erreur. Par exemple, POST /api/v1/trades renvoie 201 avec "imported": 0 lorsque chaque ligne existe déjà.
Conseils de gestion
- Branchez d’abord sur le statut HTTP, puis sur
error. - Affichez
messageaux développeurs ; utilisezerrorpour la logique programmatique. - Traitez
details.supportedcomme la liste autorisée faisant autorité lorsqu’elle est présente. - Sur
401, rafraîchissez l’access token OAuth ou demandez un nouveau PAT ; ne réessayez pas indéfiniment.
Référence OpenAPI
Chemins, méthodes, paramètres et codes de réponse issus du document OpenAPI live.
Télécharger openapi.jsonChargement du document OpenAPI…