Passez et suivez vos commandes de traduction de documents certifiés de manière automatisée. Une API REST sur HTTPS, authentifiée via un jeton « bearer » et renvoyant des données au format JSON — avec des webhooks signés pour chaque événement.
curl -X POST https://www.rapidtranslate.org/api/v1/orders \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "reference=APO-10432" \
-F "source_language=Spanish" \
-F "target_language=English (US)" \
-F "translation_type=certified" \
-F "files[]=@document.pdf"
→ {
"id": "9b1c2d3e-…",
"status": "pending",
"livemode": true
} L'API RapidTranslate permet à votre application d'envoyer des documents pour une traduction certifiée, de consulter l'état d'avancement et les tarifs actualisés, et de recevoir les fichiers finis — sans que votre équipe ait à passer par notre processus de paiement. Elle est conçue pour les entreprises qui passent des commandes de traduction pour le compte de leurs propres clients.
Toutes les demandes doivent être adressées à https://www.rapidtranslate.org/api/v1 via HTTPS. Les requêtes et les réponses sont au format JSON, sauf lors de la création d'une commande, où les fichiers sont téléchargés sous la forme de multipart/form-data. Tous les montants sont restitués sous la forme de centimes entiers en dollars américains, et tous les horodatages sont au format UTC ISO-8601.
Vous préférez explorer l'API avant de commencer à coder ? Notre collection Postman contient tous les points de terminaison préconfigurés : authentification, exemples de corps de requête et paramètres de requête inclus.
Télécharger la collection Postman
apiKey à une clé provenant de Paramètres de l'entreprise → Clés API.baseUrl pour votre environnement — la valeur par défaut est « production ».Authentifiez chaque requête à l'aide de votre clé API secrète en tant que jeton « bearer », puis demandez une réponse au format JSON. Les deux en-têtes sont obligatoires :
Autorisation : Bearer VOTRE_CLÉ_API
Accept : application/json Vous pouvez générer et renouveler des clés dans votre tableau de bord, sous « Paramètres de l'entreprise » → « Clés API ». Les clés s'affichent une seule fois lors de leur création et sont stockées sous forme hachée. Si vous perdez une clé, renouvelez-la. Chaque clé correspond à un mode (Production ou Sandbox) et dispose d'un ensemble fixe de périmètres d'accès.
Chaque point de terminaison nécessite une capacité spécifique sur la clé. Une clé ne disposant pas de la portée requise renvoie 403 accès interdit_scope.
| Champ d'application | Subventions |
|---|---|
commandes : écriture | Créer et valider des commandes |
commandes : lecture | Récupérer et afficher les commandes |
prix : lire | Consultez la liste des prix |
Le mode test est une propriété de la clé, et non de votre compte. Une clé « Sandbox » fonctionne dans un environnement entièrement simulé ; une clé « Live » passe des commandes réelles et facturables. Vous pouvez utiliser les deux simultanément.
Les commandes en mode « sandbox » utilisent les mêmes processus de validation, de mappage des champs et de tarification réelle, mais ne prennent pas en charge le stockage des fichiers, la reconnaissance optique de caractères (OCR) ni l'exécution de la commande. Dès sa création, une commande en mode « sandbox » suit automatiquement son cycle de vie (en cours de traitement → terminé), en déclenchant les mêmes webhooks qu'une commande en production et en fournissant enfin un exemple de document statique.
Chaque réponse et chaque webhook contient un livemode Activez cette option pour que votre intégration puisse créer une branche sans vérifier la clé :
livemode : true — commande réelle et facturablelivemode : false — environnement de test / commande testLe nombre de requêtes est limité par organisation. Le quota par défaut est de 120 requêtes par minute. Si cette valeur est dépassée, le résultat est 429 rate_limited; réessayez après une courte pause. Si votre intégration nécessite une limite plus élevée, contactez support@rapidtranslate.org.
Chaque réponse réussie encapsule sa charge utile dans un données clé. Les points de terminaison de la liste ajoutent un méta bloc avec pagination.
{
"data": {
"id": "9b1c...-uuid",
"reference": "APO-10432",
"status": "processing",
"total": 11270,
"currency": "USD"
}
} {
"data": [ ... ],
"meta": {
"current_page": 1,
"per_page": 25,
"total": 134,
"last_page": 6
}
} Les erreurs utilisent les codes d'état HTTP standard et renvoient une réponse stable et lisible par machine code_d'erreur accompagné d'un message rédigé en français. Les erreurs de validation ajoutent un champ indexé par clé erreurs objet.
{
"message": "The given data was invalid.",
"error_code": "validation_failed",
"errors": {
"source_language": ["The selected source language is invalid."]
}
} | HTTP | code_d'erreur | Signification |
|---|---|---|
| 400 | bad_request | Corps de la requête mal formé |
| 401 | non authentifié | Clé manquante, non valide ou révoquée |
| 402 | paiement_échoué | Commande validée, mais le paiement n'a pas pu être prélevé |
| 402 | credit_hold | Le montant de la commande dépasse votre limite de crédit |
| 403 | portée_interdite | La clé n'a pas la portée requise |
| 403 | compte_suspendu | Suspension d'une organisation pour non-paiement de factures |
| 404 | not_found | Il n'existe aucune commande de ce type pour cette organisation. |
| 409 | référence en double | Réutilisation d'une référence pour une autre commande |
| 409 | n'est pas en attente de validation | La commande n'est pas en attente de votre validation |
| 422 | validation_échouée | Champs manquants ou non valides |
| 429 | rate_limited | Limite de requêtes dépassée |
| 500 | erreur_serveur | Erreur inattendue du serveur |
| 503 | échec du traitement | Échec du traitement en aval (OCR / tarification) |
La commande statut suit un cycle de vie stable. Ces cinq valeurs sont également celles adoptées par la statut filtrer par Liste des commandes:
| Statut | Signification |
|---|---|
en attente | Reçu ; la tarification n'est pas encore finalisée. total peut-être nul. |
en attente d'approbation | Le montant a été calculé et nous attendons votre validation du montant total (uniquement si une validation est requise). |
traitement | Approuvé et actif ; traduction en cours. |
terminé | C'est terminé ; les documents traduits sont disponibles. |
annulé | La commande a été annulée. |
Tant qu'une commande est en cours de traitement, des étiquettes plus détaillées (par exemple Attribué au traducteur, Traduire, Expédié) peuvent également apparaître. Lorsqu'une autorisation est requise, une commande peut indiquer brièvement paiement_échoué ou credit_hold si le prélèvement n'a pas pu être effectué, déterminer le mode de paiement et valider à nouveau.
GET /langues
Renvoie toutes les langues prises en charge. Utilisez la fonction nom valeur mot pour mot comme langue_source / langue_cible lors de la création d'une commande — les commandes sont associées en fonction du nom de la langue, et non de son code.
Nécessite une clé authentifiée.
curl https://www.rapidtranslate.org/api/v1/languages \
-H "Authorization: Bearer VOTRE_CLÉ_API" \
-H "Accept: application/json" {
"data": [
{ "code": "english-uk", "name": "English (UK)", "active": true },
{ "code": "spanish", "name": "Spanish", "active": true }
]
} GET /tarifs
Renvoie la grille tarifaire de référence américaine, en dollars américains (USD), sur laquelle sont facturées vos commandes. Les montants sont exprimés sous forme de chaînes décimales. Les prix sont regroupés par traduction type (chacun avec un régulier et rapide par‑unité prix), livraison méthode, et apostille — les mêmes valeurs que celles que vous indiquez lors de la création d'une commande.
Champ d'application : prix : lire
{
"data": {
"country": { "code": "US", "name": "United States" },
"currency": { "code": "USD", "symbol": "$" },
"translation": {
"certified": { "unit": "page", "regular": "27.99", "rapid": "37.99" },
"standard": { "unit": "word", "regular": "0.11", "rapid": "0.15" },
"specialized": { "unit": "page", "regular": "47.99", "rapid": "57.99" },
"naati": { "unit": "page", "regular": "42.99", "rapid": "52.99" },
"sworn": {
"unit": "page",
"note": "Sworn pricing depends on the language pair.",
"language_pairs": [
{ "languages": ["Spanish","English"], "unit": "page", "regular": "57.99", "rapid": "67.99" },
{ "languages": ["Polish","English"], "unit": "page", "regular": "46.99", "rapid": "56.99" }
]
}
},
"delivery": {
"email": "0.00", "notarized_email": "19.99",
"mail_standard": "29.99", "mail_next_day": "55.00"
},
"apostille": { "base": "79.00", "additional_document": "15.00" }
}
} Tarifs certifiés. Le tarif de la traduction assermentée est fixé par paire de langues. paires de langues répertorie chaque paire éligible à l'assermentation avec son propre régulier/rapide prix. Toutes les variantes de l'anglais (anglais (États-Unis/Royaume-Uni/Australie/Canada)) sont acceptées, et chaque paire fonctionne dans les deux sens, sauf si elle comporte « bidirectionnel » : false.
POST /commandes
Crée une commande de traduction et télécharge les fichiers source. Comme il transfère des fichiers, ce point de terminaison utilise multipart/form-data (pas au format JSON). Les champs imbriqués utilisent la notation entre crochets, par exemple : client[nom].
Champ d'application : commandes : écriture
| Champ | Type | Notes |
|---|---|---|
référence | chaîne obligatoire | Votre référence de commande unique. Si vous la réutilisez, la commande existante sera renvoyée (voir « idempotence »). |
client[nom] | chaîne obligatoire | Nom et prénom complets du client final. |
client[e-mail] | chaîne obligatoire | Adresse e-mail du client final. |
langue_source | chaîne obligatoire | Formulation exacte nom de Liste des langues. |
langue_cible | chaîne obligatoire | Formulation exacte nom de Liste des langues. |
type_de_traduction | chaîne obligatoire | L'un des certifié, standard, spécialisé, sous serment, naati. |
redressement | chaîne obligatoire | régulier ou rapide. |
livraison[mode] | chaîne obligatoire | L'un des e-mail, e-mail certifié par un notaire, mail_standard, livraison_le_lendemain. |
livraison[adresse][...] | objet | Requis pour mail_standard / livraison_le_lendemain: rue, ville, code_postal, pays (État (facultatif). pays est un code ISO, par exemple : ÉTATS-UNIS. |
apostille [activée] | booléen | Ajouter la procédure d'apostille. Voir les règles ci-dessous. |
apostille [documents] | entier | Nombre de documents à apostiller. Obligatoire lorsque cette option est activée. |
apostille [pays_de_destination] | chaîne de caractères | Pays pour lequel l'apostille est destinée. |
notes | chaîne de caractères | Instructions en texte libre. |
code_promo | chaîne de caractères | Un code de réduction à appliquer. Les codes manifestement invalides ou inapplicables sont rejetés lors de la création avec 422 Échec de la validation; la remise est définitive une fois que le prix de la commande a été fixé (voir la remarque ci-dessous). |
fichiers[] | fichier[] obligatoire | 1 à 20 fichiers. Formats autorisés : pdf, jpg, jpeg, png, doc, docx, tiff, heic. Taille maximale : 20 Mo par fichier. |
référence est unique à chaque organisation. Si l'on répète une opération de création avec les mêmes référence renvoie la commande existante avec 200 au lieu de créer un doublon (une nouvelle commande renvoie 201). mail_standard mode de livraison. livraison_le_lendemain Uniquement pour les adresses aux États-Unis. curl -X POST https://www.rapidtranslate.org/api/v1/orders \
-H "Authorization: Bearer VOTRE_CLÉ_API" \
-H "Accept: application/json" \
-F "reference=APO-10432" \
-F "customer[name]=Jane Doe" \
-F "customer[email]=jane@example.com" \
-F "source_language=Espagnol" \
-F "target_language=Anglais (États-Unis)" \
-F « translation_type=certified » \
-F « turnaround=regular » \
-F « delivery[method]=email » \
-F « files[] =@/path/to/birth-certificate.pdf » {
"data": {
"id": "9b1c2d3e-...-uuid",
"reference": "APO-10432",
"livemode": true,
"status": "pending",
"source_language": "Spanish",
"target_language": "English (US)",
"translation_type": "certified",
"turnaround": "regular",
"total": null,
"currency": "USD",
"created_at": "2026-08-28T10:15:00+00:00"
}
} Une commande nouvellement créée commence par en attente avec un nul montant total pendant le calcul du prix. Sondage Consulter une commande ou guettez le statut_de_la_commande webhook pour consulter les mises à jour concernant le prix et le statut.
Bons de réduction. A code_promo est vérifiée en deux étapes. Lors de la création, nous validons les éléments qui ne dépendent pas de la longueur du document — la validité du code, les limites d'utilisation et les types de traduction/de service auxquels il s'applique — et nous rejetons immédiatement tout code non conforme. Les règles qui dépendent du nombre de pages ou de mots (ainsi que le montant de la remise lui-même) sont appliquées une fois le document compté ; la remise apparaît donc sur la au prix de total, et non le montant initial en attente réponse. Si, une fois le nombre d'articles connu, il s'avère qu'un coupon n'est pas applicable, la commande est tout de même passée au prix plein et signalée à notre équipe pour examen.
GET /commandes/{id}
Récupère une seule commande en fonction de son id (l'UUID renvoyé lors de la création). Renvoie 404 Page introuvable si la commande ne concerne pas votre organisation.
Champ d'application : commandes : lecture
curl https://www.rapidtranslate.org/api/v1/orders/9b1c2d3e-...-uuid \
-H "Authorization: Bearer VOTRE_CLÉ_API" \
-H "Accept: application/json" GET /commandes
Renvoie les commandes de votre organisation, les plus récentes en premier, avec pagination dans méta. Tous les paramètres de requête sont facultatifs.
Champ d'application : commandes : lecture
| Requête | Notes |
|---|---|
statut | L'un des en attente, en attente d'approbation, traitement, terminé, annulé. |
référence | Triez les résultats selon votre référence. |
langue_source / langue_cible | Filtrer par nom de langue. |
créé_à partir de / created_to | Période (inclusivement). |
trier | -date_de_création (par défaut, les plus récents en premier) ou created_at (les plus anciens en premier). |
par page | 1–100. La valeur par défaut correspond au format de page standard. |
page | Numéro de page. |
curl "https://www.rapidtranslate.org/api/v1/orders?status=completed&per_page=50" \
-H "Authorization: Bearer VOTRE_CLÉ_API" \
-H "Accept: application/json" POST /commandes/{id}/valider
Valide le montant total calculé pour une commande qui est en attente d'approbation, ce qui déclenche son exécution. Cette étape n'est nécessaire que si votre compte doit faire l'objet d'une validation avant le début des travaux. L'appel est idempotent.
Champ d'application : commandes : écriture
curl -X POST https://www.rapidtranslate.org/api/v1/orders/9b1c2d3e-...-uuid/approve \
-H "Authorization: Bearer VOTRE_CLÉ_API" \
-H "Accept: application/json" En cas de réussite, la commande mise à jour est renvoyée. Si la commande n'est pas en attente de validation, vous obtenez 409 n'attend pas d'approbation; si une opération de chargement est requise mais échoue, vous obtenez 402 Échec du paiement ou 402 credit_hold.
Les ensembles fixes acceptés lors de la création d'une commande.
| Valeur | Description |
|---|---|
certifié | Traduction certifiée (tarif à la page). |
standard | Traduction standard (tarif au mot). |
spécialisé | Traduction spécialisée / d'expertise (par page). |
sous serment | Traduction assermentée (par page). |
naati | Traduction certifiée par la NAATI (par page). |
| Valeur | Description |
|---|---|
régulier | Délai d'exécution standard. |
rapide | Délais d'exécution accélérés. |
| Valeur | Adresse | Description |
|---|---|---|
e-mail | Non | Livraison numérique par e-mail (gratuite). |
e-mail certifié par un notaire | Non | Transmission numérique certifiée par un notaire. |
mail_standard | Oui | Courrier postal ; expédié vers les pays pris en charge. |
livraison_le_lendemain | Oui | Livraison le jour ouvrable suivant (adresses aux États-Unis uniquement). |
Au lieu d'effectuer des requêtes régulières, configurez un point de terminaison Webhook pour recevoir les événements au fur et à mesure qu'ils se produisent. Définissez votre URL et consultez votre clé de signature dans « Paramètres de l'entreprise » → « Webhooks ». Les Webhooks sont très pratiques : les informations récupérées via un Webhook font toujours autorité.
| Événement | Envoyé le |
|---|---|
statut_de_la_commande | Le statut d'une commande change. |
avis_client | Une commande a été tarifée et attend votre validation (en mode validation uniquement). |
livraison_de_documents | Les documents traduits sont prêts, avec leurs liens de téléchargement. |
paiement_échoué | Le montant d'une ordonnance approuvée n'a pas pu être recouvré — ce qui entraîne une échec bloc (raison, message). Mettez à jour la fiche de portefeuille et validez à nouveau. |
credit_hold | Une commande validée dépasserait votre limite de crédit — ce qui entraînerait un credit_hold bloc (message). Réglez vos factures ou demandez une limite plus élevée. |
Chaque envoi est présenté dans la même enveloppe : une événement bloc (y compris livemode) et un élément spécifique à l'événement données bloc.
{
"event": {
"type": "order_status",
"id": "evt_9b1c...",
"livemode": true,
"sent_at": "2026-08-28T10:20:00+00:00"
},
"data": {
"order": {
"id": "9b1c2d3e-...-uuid",
"reference": "APO-10432",
"status": "completed"
}
}
} Les livraison_de_documents L'événement ajoute un documents tableau (chacun contenant nom, lien_de_téléchargement, version, statut) et un portail lien. Le avis_client L'événement ajoute une liste détaillée tarification bloc et un actions.approve objet contenant l'URL à appeler.
Chaque requête est signée afin que vous puissiez vérifier qu’elle provient bien de RapidTranslate. Nous envoyons trois en-têtes :
| En-tête | Valeur |
|---|---|
X-RapidTranslate-Signature | sha256=<hmac> |
X-RapidTranslate-Horodatage | Horodatage Unix utilisé dans la signature |
X-RapidTranslate-Événement | L'identifiant unique de l'événement |
Calculez la signature attendue en utilisant l'algorithme HMAC-SHA256 sur la chaîne de caractères « {timestamp}.{raw_request_body} » en utilisant votre clé secrète de signature du webhook, puis comparez-la à la valeur de l'en-tête :
// PHP
$expected = 'sha256=' . hash_hmac(
'sha256',
$timestamp . '.' . $rawBody,
$webhookSecret
);
$valid = hash_equals($expected, $signatureHeader); Node.js (Express) — implémenter la route avec un analyseur de corps brut afin de conserver les octets exacts :
// app.use('/webhooks/rapidtranslate', express.raw({ type: 'application/json' }))
const crypto = require('crypto');
const timestamp = req.get('X-RapidTranslate-Timestamp');
const received = req.get('X-RapidTranslate-Signature'); // "sha256=..."
const rawBody = req.body; // Buffer, untouched
const expected = 'sha256=' + crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
const valid = received &&
crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected)); Il y a trois choses qui posent problème :
X-RapidTranslate-Signature L'en-tête contient un sha256= préfixe. Soit comparer avec 'sha256=' + yourHmac (comme ci-dessus) ou supprimer le préfixe avant de comparer — ne comparez pas la valeur hexadécimale seule avec l'en-tête complet.hash_equals / crypto.timingSafeEqual), jamais avec == ou ===.Les {timestamp} fait partie de la chaîne signée ; il faut donc le lire dans l'en-tête et l'ajouter au début avant de procéder au hachage. Cela permet également de rejeter les envois périmés ou réutilisés — par exemple, tout horodatage datant de plus de cinq minutes.
Les livraisons ayant échoué font l'objet d'une nouvelle tentative avec un délai d'attente exponentiel (jusqu'à 5 tentatives). Répondre par un 2xx statut pour accuser réception.