Image Facebook
03 Heures 10 Min 31 Sec
Documentation destinée aux développeurs

API RapidTranslate

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.

URL de base https://www.rapidtranslate.org/api/v1
Version v1
Format JSON
create-order.sh
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
}

Introduction

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.

Accès. L'accès à l'API est réservé aux comptes d'entreprise. Ajoutez votre entreprise dans votre tableau de bord, puis générez des clés dans « Paramètres de l'entreprise » → « Clés API ». Si vous ne disposez pas encore d'un compte d'entreprise, contactez support@rapidtranslate.org.

Collection Postman

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

  1. Dans Postman, choisissez Fichier → Importer, puis sélectionnez le fichier téléchargé.
  2. Ouvrez la collection Variables et définir apiKey à une clé provenant de Paramètres de l'entreprise → Clés API.
  3. (Facultatif) Définir baseUrl pour votre environnement — la valeur par défaut est « production ».
  4. Envoyez toutes vos demandes. Utilisez une clé « Sandbox » pour effectuer des tests sans passer de commandes facturables.

Authentification

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.

Champs d'application

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'applicationSubventions
commandes : écritureCréer et valider des commandes
commandes : lectureRécupérer et afficher les commandes
prix : lireConsultez la liste des prix
Gardez vos clés secrètes. Une clé active permet de passer des commandes facturables. Ne la divulguez jamais dans le code côté client, les navigateurs ou les dépôts publics.

Mode bac à sable et mode test

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 facturable
  • livemode : false — environnement de test / commande test

Limites de débit

Le 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.

Réponses

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.

Ressource unique

{
  "data": {
    "id": "9b1c...-uuid",
    "reference": "APO-10432",
    "status": "processing",
    "total": 11270,
    "currency": "USD"
  }
}

Liste paginée

{
  "data": [ ... ],
  "meta": {
    "current_page": 1,
    "per_page": 25,
    "total": 134,
    "last_page": 6
  }
}

Erreurs

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."]
  }
}
HTTPcode_d'erreurSignification
400bad_requestCorps de la requête mal formé
401non authentifiéClé manquante, non valide ou révoquée
402paiement_échouéCommande validée, mais le paiement n'a pas pu être prélevé
402credit_holdLe montant de la commande dépasse votre limite de crédit
403portée_interditeLa clé n'a pas la portée requise
403compte_suspenduSuspension d'une organisation pour non-paiement de factures
404not_foundIl n'existe aucune commande de ce type pour cette organisation.
409référence en doubleRéutilisation d'une référence pour une autre commande
409n'est pas en attente de validationLa commande n'est pas en attente de votre validation
422validation_échouéeChamps manquants ou non valides
429rate_limitedLimite de requêtes dépassée
500erreur_serveurErreur inattendue du serveur
503échec du traitementÉchec du traitement en aval (OCR / tarification)

Statuts des commandes

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:

StatutSignification
en attenteReçu ; la tarification n'est pas encore finalisée. total peut-être nul.
en attente d'approbationLe montant a été calculé et nous attendons votre validation du montant total (uniquement si une validation est requise).
traitementApprouvé 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.

Liste des langues

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 }
  ]
}

Consulter la liste des prix

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.

Créer une commande

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

Paramètres corporels

ChampTypeNotes
référencechaîne obligatoireVotre référence de commande unique. Si vous la réutilisez, la commande existante sera renvoyée (voir « idempotence »).
client[nom]chaîne obligatoireNom et prénom complets du client final.
client[e-mail]chaîne obligatoireAdresse e-mail du client final.
langue_sourcechaîne obligatoireFormulation exacte nom de Liste des langues.
langue_ciblechaîne obligatoireFormulation exacte nom de Liste des langues.
type_de_traductionchaîne obligatoireL'un des certifié, standard, spécialisé, sous serment, naati.
redressementchaîne obligatoirerégulier ou rapide.
livraison[mode]chaîne obligatoireL'un des e-mail, e-mail certifié par un notaire, mail_standard, livraison_le_lendemain.
livraison[adresse][...]objetRequis 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éenAjouter la procédure d'apostille. Voir les règles ci-dessous.
apostille [documents]entierNombre de documents à apostiller. Obligatoire lorsque cette option est activée.
apostille [pays_de_destination]chaîne de caractèresPays pour lequel l'apostille est destinée.
noteschaîne de caractèresInstructions en texte libre.
code_promochaîne de caractèresUn 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[] obligatoire1 à 20 fichiers. Formats autorisés : pdf, jpg, jpeg, png, doc, docx, tiff, heic. Taille maximale : 20 Mo par fichier.
Idempotence. 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).
Règles relatives à l'apostille. L'apostille n'est disponible que lorsque la langue cible est l'anglais (quelle que soit la variante), et ces commandes doivent utiliser le mail_standard mode de livraison. livraison_le_lendemain Uniquement pour les adresses aux États-Unis.

Exemple

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.

Consulter une commande

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"

Liste des commandes

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êteNotes
statutL'un des en attente, en attente d'approbation, traitement, terminé, annulé.
référenceTriez les résultats selon votre référence.
langue_source / langue_cibleFiltrer par nom de langue.
créé_à partir de / created_toPé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 page1–100. La valeur par défaut correspond au format de page standard.
pageNumé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"

Approuver une commande

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.

Valeurs des champs

Les ensembles fixes acceptés lors de la création d'une commande.

Types de traduction

ValeurDescription
certifiéTraduction certifiée (tarif à la page).
standardTraduction standard (tarif au mot).
spécialiséTraduction spécialisée / d'expertise (par page).
sous sermentTraduction assermentée (par page).
naatiTraduction certifiée par la NAATI (par page).

Redressement

ValeurDescription
régulierDélai d'exécution standard.
rapideDélais d'exécution accélérés.

Modes de livraison

ValeurAdresseDescription
e-mailNonLivraison numérique par e-mail (gratuite).
e-mail certifié par un notaireNonTransmission numérique certifiée par un notaire.
mail_standardOuiCourrier postal ; expédié vers les pays pris en charge.
livraison_le_lendemainOuiLivraison le jour ouvrable suivant (adresses aux États-Unis uniquement).

Webhooks

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énements

ÉvénementEnvoyé le
statut_de_la_commandeLe statut d'une commande change.
avis_clientUne commande a été tarifée et attend votre validation (en mode validation uniquement).
livraison_de_documentsLes 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_holdUne 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.

Enveloppe

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.

Vérification des signatures

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êteValeur
X-RapidTranslate-Signaturesha256=<hmac>
X-RapidTranslate-HorodatageHorodatage Unix utilisé dans la signature
X-RapidTranslate-ÉvénementL'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 :

  • Les 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.
  • Hachez le corps de la requête brute exactement tel qu’il a été reçu. La resérialisation du JSON analysé modifie les espaces et l’ordre des clés, ce qui empêche la signature de correspondre — lisez le corps avant que n’importe quel middleware JSON ne l’analyse.
  • Comparer en temps constant (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.