SheetDiff™API Structural Diff

API Structural Diff

Une API REST qui compare une transcription générée par IA avec la version post-éditée par l'annotateur — détectant les changements structurels au niveau des lignes (divisions, fusions, modifications, ajouts, suppressions), avec détail des différences par colonne, scores CER/WER/SER et une note de qualité composite par lot.

Auth par clé API
en-tête x-api-key
Débit limité
10/min · 60/15min
REST JSON
application/json
Moteur 8 passes
détection divisions + fusions

Démarrage rapide

Aucun SDK nécessaire. Envoyez une requête POST avec vos deux tableaux de lignes de transcription et recevez un diff complet en JSON. L'API est en phase de dégustation — demandez une clé API pour commencer.

1. Vérifiez que le service est actif :

bash
curl https://structural-diff-engine.onrender.com/v1/health

2. Lancez une comparaison :

curl -X POST https://structural-diff-engine.onrender.com/v1/diff \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "original": [
      { "speaker": "Alice", "start_time": 0, "end_time": 1, "transcript": "Hello world" },
      { "speaker": "Bob",   "start_time": 1, "end_time": 3, "transcript": "Good morning everyone" }
    ],
    "reworked": [
      { "speaker": "Alice", "start_time": 0, "end_time": 1, "transcript": "Hello there" },
      { "speaker": "Bob",   "start_time": 1, "end_time": 2, "transcript": "Good morning" },
      { "speaker": "Bob",   "start_time": 2, "end_time": 3, "transcript": "everyone" }
    ]
  }'

URL de base

Tous les points de terminaison sont préfixés par /v1.

url
https://structural-diff-engine.onrender.com

Authentification

Incluez votre clé API dans l'en-tête de requête x-api-key à chaque appel vers /v1/diff.

bash
curl -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -X POST https://structural-diff-engine.onrender.com/v1/diff -d '{...}'
Les clés sont provisionnées individuellement par agence. Une clé absente ou invalide renvoie 401 Unauthorized.

Limites de débit

Deux niveaux indépendants sont appliqués par clé API, avec repli sur l'IP en l'absence de clé. Dépasser l'un ou l'autre renvoie 429 Too Many Requests.

NiveauLimiteEn-tête de réponse
Rafale10 requêtes / minuteRateLimit-Limit
Fenêtre60 requêtes / 15 minutesRateLimit-Remaining

Points de terminaison

GET /v1/health

Sonde de disponibilité légère. Aucune authentification requise. Renvoie la version du service et le temps de fonctionnement.

GET/v1/health· Sans auth
json
{ "status": "ok", "version": "1.0.0", "uptime": 42, "timestamp": "..." }

POST /v1/diff

Comparez deux tableaux de lignes de transcription. Renvoie des résultats au niveau des lignes avec des scores de qualité. Charge utile max : 5 Mo · Lignes max : 30 000.

POST/v1/diff Auth requise

Corps de la requête

NameTypeDescription
original*arrayObjets de ligne de la version de référence / originale.
reworked*arrayObjets de ligne à comparer.
configobjectSurcharges optionnelles de l'algorithme. Voir .
headersstring[]Noms de colonnes — requis lors de l'utilisation d'un tableau 2D.
columnMappingobjectCarte d'index de colonnes pour l'entrée en tableau 2D. Voir .

Champs de l'objet ligne

Tous les champs sont optionnels sauf transcript. Les champs inconnus sont transmis sans modification.

NameTypeDescription
transcript*stringLe contenu textuel de la ligne.
speakerstringNom ou identifiant du locuteur.
start_timenumber|stringHeure de début du segment en secondes.
end_timenumber|stringHeure de fin du segment en secondes.
non_speech_eventsstringAnnotations telles que [musique], [rires].
emotionstringÉtiquette d'émotion.
languagestringCode de langue (ex. "fr", "ar").
localestringCode de locale (ex. "fr-FR").
accentstringÉtiquette d'accent.

Structure de la réponse

Toutes les réponses réussies utilisent cette enveloppe :

json
{
  "status": "success",
  "requestId": "550e8400-e29b-41d4-a716-446655440000",
  "timestamp": "2026-04-08T21:00:00.000Z",
  "data": {
    "results": [
      {
        "status": "MODIFIED",
        "originalRow": { "transcript": "Hello world", ... },
        "reworkedRow": { "transcript": "Hello there", ... },
        "notes": "transcript changed"
      },
      {
        "status": "SPLIT",
        "originalRow": { "transcript": "Good morning everyone", ... },
        "reworkedRows": [ { "transcript": "Good morning" }, { "transcript": "everyone" } ],
        "notes": "split into 2 rows"
      }
    ],
    "scores": { "CER": 0.12, "WER": 0.18, "SER": 0.33, "cerT": 0.12, "werT": 0.18 },
    "composite": { "score": 3.8, "grade": "B", "label": "Good" },
    "meta": { "originalRows": 2, "reworkedRows": 3, "headers": [...] }
  }
}

Statuts de diff

StatutSignification
UNCHANGEDLa ligne est identique dans les deux versions.
MODIFIEDLa ligne existe dans les deux versions mais le contenu a changé.
ADDEDLa ligne est uniquement présente dans la version révisée.
DELETEDLa ligne est uniquement présente dans la version originale.
SPLITUne ligne originale a été divisée en deux lignes révisées ou plus.
MERGEDDeux lignes originales ou plus ont été combinées en une ligne révisée.

Scores

NameTypeDescription
CERnumberTaux d'erreur de caractères dans toutes les colonnes (0–1, plus bas = meilleur).
WERnumberTaux d'erreur de mots dans toutes les colonnes (0–1).
SERnumberTaux d'erreur de segmentation — proportion de lignes divisées ou fusionnées.
cerTnumberCER calculé uniquement sur la colonne de transcription.
werTnumberWER calculé uniquement sur la colonne de transcription.

Note composite

NameTypeDescription
scorenumberScore de qualité pondéré (1,0–5,0, plus élevé = meilleur).
gradestringNote alphabétique : A, B, C, D ou F.
labelstringÉtiquette lisible — ex. "Excellent", "Bon", "À améliorer".

Options de configuration

Passez un objet config dans le corps de la requête pour remplacer les valeurs par défaut de l'algorithme. Tous les champs sont optionnels.

NameTypeDescription
simpleModebooleanDésactiver la détection des divisions et fusions. Diff ligne par ligne pur. Défaut : false.
enableSplitsbooleanActiver la détection des lignes divisées. Défaut : true.
enableMergesbooleanActiver la détection des lignes fusionnées. Défaut : true.
enableCERbooleanCalculer le taux d'erreur de caractères. Défaut : true.
enableWERbooleanCalculer le taux d'erreur de mots. Défaut : true.
enableSERbooleanCalculer le taux d'erreur de segmentation. Défaut : true.
stripDiacriticsbooleanNormaliser les caractères arabes/accentués avant la comparaison. Défaut : true.
positionalModebooleanComparer les lignes strictement par position, sans alignement. Défaut : false.
ignoreColNamesstring[]Noms de colonnes exclus de la détection MODIFIED. Défaut : [].
enableInlineDiffbooleanInclure transcriptDiff dans les lignes MODIFIED. Mettre false pour ignorer le diff caractère par caractère et réduire la taille de réponse. Défaut : true.
structuralTransformsTransformRule[]Règles find/replace appliquées aux deux côtés avant la comparaison par similarité (max 20 règles). Défaut : [].

Mappage des colonnes

Lorsque original / reworked sont des tableaux 2D (tableaux de tableaux) plutôt que des objets, fournissez headers et/ou columnMapping pour indiquer au moteur quel index correspond à chaque champ.

json
{
  "original":      [[0, 1, "Alice", "Hello world"]],
  "headers":       ["start_time", "end_time", "speaker", "transcript"],
  "columnMapping": { "transcript": 3, "speaker": 2, "start_time": 0, "end_time": 1 }
}
NameTypeDescription
transcript*integerIndex de colonne base 0 pour le champ de transcription.
speakerintegerIndex de colonne base 0 pour le champ du locuteur.
start_timeintegerIndex de colonne base 0 pour l'heure de début.
end_timeintegerIndex de colonne base 0 pour l'heure de fin.
nseintegerIndex de colonne base 0 pour les événements non-vocaux.
extraColsinteger[]Index de colonnes supplémentaires à inclure (max 20).

Référence des erreurs

Toutes les erreurs utilisent une enveloppe uniforme :

json
{
  "status": "error",
  "requestId": "550e8400-...",
  "timestamp": "2026-04-08T21:00:00.000Z",
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Validation failed",
    "details": [{ "field": "original", "message": "\"original\" is required" }]
  }
}
HTTPCodeCause
400BAD_REQUESTCorps JSON malformé
401UNAUTHORIZEDEn-tête x-api-key manquant ou invalide
404NOT_FOUNDPoint de terminaison inconnu
413PAYLOAD_TOO_LARGECorps de requête dépasse 5 Mo
422VALIDATION_ERRORÉchec de la validation du schéma (voir tableau details)
429RATE_LIMIT_EXCEEDEDLimite de débit par rafale ou par fenêtre atteinte
500INTERNAL_ERRORErreur serveur ou moteur inattendue

Traçage des requêtes

Fournissez un en-tête x-request-id pour corréler les requêtes dans votre système. Caractères alphanumériques, tirets et traits de soulignement uniquement, max 64 caractères. La valeur est renvoyée dans les en-têtes de réponse.

bash
curl -H "x-request-id: job-2026-01-batch-3" \
  -H "x-api-key: YOUR_KEY" \
  -X POST https://structural-diff-engine.onrender.com/v1/diff -d '{...}'

Obtenir un accès API

L'API est disponible pour les agences et équipes en phase de dégustation. Les clés sont provisionnées individuellement. Contactez-nous pour recevoir votre clé et commencer l'intégration.

API Structural Diff · v1.0 · Développé par Mohamed Yaakoubi← Retour à SheetDiff™