> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Traitement de documents avec un seul appel d’API

> Traitez des documents dans ABBYY Vantage en un seul appel d’API combiné : listez les compétences, créez et démarrez une transaction, suivez son état et téléchargez les fichiers de résultats.

export const VantageRegion = ({children}) => {
  const STORAGE_KEY = "abbyy.vantage.region";
  const REGIONS = [{
    code: "eu",
    label: "Europe"
  }, {
    code: "us",
    label: "North America"
  }, {
    code: "au",
    label: "Australia / Asia-Pacific"
  }];
  const [region, setRegion] = useState("eu");
  const [open, setOpen] = useState(false);
  const containerRef = useRef(null);
  const dropdownRef = useRef(null);
  function safeGetSavedRegion() {
    try {
      const saved = typeof window !== "undefined" ? window.localStorage.getItem(STORAGE_KEY) : null;
      const valid = new Set(REGIONS.map(r => r.code));
      return saved && valid.has(saved) ? saved : "eu";
    } catch {
      return "eu";
    }
  }
  function safeSetSavedRegion(code) {
    try {
      if (typeof window !== "undefined") {
        window.localStorage.setItem(STORAGE_KEY, code);
      }
    } catch {}
  }
  function dispatchRegionChanged(code) {
    try {
      if (typeof window !== "undefined") {
        window.dispatchEvent(new CustomEvent("abbyy:region-changed", {
          detail: {
            code
          }
        }));
      }
    } catch {}
  }
  function replaceRegionInString(text, currentRegion) {
    if (typeof text !== "string") return text;
    const hostRegex = /https:\/\/vantage-(eu|us|au)\.abbyy\.com/gi;
    const tokenRegex = /https:\/\/vantage-\[region\]\.abbyy\.com/gi;
    const bareHostRegex = /vantage-(eu|us|au)\.abbyy\.com/gi;
    const bareTokenRegex = /vantage-\[region\]\.abbyy\.com/gi;
    return text.replace(hostRegex, `https://vantage-${currentRegion}.abbyy.com`).replace(tokenRegex, `https://vantage-${currentRegion}.abbyy.com`).replace(bareHostRegex, `vantage-${currentRegion}.abbyy.com`).replace(bareTokenRegex, `vantage-${currentRegion}.abbyy.com`);
  }
  useEffect(() => {
    setRegion(safeGetSavedRegion());
  }, []);
  useEffect(() => {
    const root = containerRef.current;
    if (!root) return;
    const anchors = root.querySelectorAll("a[href]");
    anchors.forEach(a => {
      const href = a.getAttribute("href");
      if (href) {
        const next = replaceRegionInString(href, region);
        if (next !== href) {
          a.setAttribute("href", next);
        }
      }
    });
    const walker = typeof document !== "undefined" ? document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null) : null;
    if (walker) {
      const toUpdate = [];
      let node = walker.nextNode();
      while (node) {
        const updated = replaceRegionInString(node.nodeValue, region);
        if (updated !== node.nodeValue) {
          toUpdate.push([node, updated]);
        }
        node = walker.nextNode();
      }
      toUpdate.forEach(([textNode, value]) => {
        textNode.nodeValue = value;
      });
    }
  }, [region, children]);
  useEffect(() => {
    const root = containerRef.current;
    if (!root) return;
    const anchors = root.querySelectorAll("a[href]");
    anchors.forEach(a => {
      a.style.fontWeight = "600";
      a.style.textDecoration = "underline";
      a.style.textUnderlineOffset = "2px";
    });
  }, [region, children]);
  useEffect(() => {
    const onRegionChanged = evt => {
      const code = evt && evt.detail && evt.detail.code;
      if (!code || code === region) return;
      setRegion(code);
    };
    if (typeof window !== "undefined") {
      window.addEventListener("abbyy:region-changed", onRegionChanged);
    }
    return () => {
      if (typeof window !== "undefined") {
        window.removeEventListener("abbyy:region-changed", onRegionChanged);
      }
    };
  }, [region]);
  useEffect(() => {
    const onClickAway = e => {
      if (!dropdownRef.current) return;
      if (!dropdownRef.current.contains(e.target)) {
        setOpen(false);
      }
    };
    document.addEventListener("click", onClickAway, true);
    return () => document.removeEventListener("click", onClickAway, true);
  }, []);
  const onSelect = code => {
    setRegion(code);
    safeSetSavedRegion(code);
    dispatchRegionChanged(code);
    setOpen(false);
  };
  const current = REGIONS.find(r => r.code === region) || REGIONS[0];
  return <div className="not-prose">
      <div className="mb-4 inline-flex items-center gap-2" ref={dropdownRef}>
        <span className="text-sm text-zinc-950/80 dark:text-white/80">Tenant Region:</span>
        <div className="relative">
          <button type="button" aria-haspopup="listbox" aria-expanded={open ? "true" : "false"} onClick={() => setOpen(v => !v)} className="h-8 px-3 rounded-md bg-zinc-900/5 dark:bg-white/5 border border-zinc-950/20 dark:border-white/20 text-sm inline-flex items-center gap-2">
            <span className="text-zinc-950 dark:text-white">{current.label}</span>
            <svg width="8" height="24" viewBox="0 -9 3 24" className="transition-transform text-gray-400 overflow-visible dark:text-gray-600 ml-auto" style={{
    transform: open ? "rotate(270deg)" : "rotate(90deg)"
  }}>
              <path d="M0 0L3 3L0 6" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"></path>
            </svg>
          </button>
          {open ? <div role="listbox" className="absolute z-50 left-full top-0 ml-2 w-56 rounded-xl border border-zinc-950/20 dark:border-white/20 bg-white dark:bg-zinc-900 shadow-lg p-2">
              {REGIONS.map(r => {
    const selected = r.code === region;
    return <button key={r.code} type="button" role="option" aria-selected={selected ? "true" : "false"} onClick={() => onSelect(r.code)} className={"w-full flex items-center justify-between px-3 py-2 rounded-lg text-sm hover:bg-zinc-950/5 dark:hover:bg-white/10 text-zinc-950 dark:text-white" + (selected ? " font-medium" : "")}>
                    <span style={selected ? {
      color: "#ff2038"
    } : undefined}>{r.label}</span>
                    <span className={selected ? "ml-3" : "ml-3 invisible"} style={selected ? {
      color: "#ff2038"
    } : undefined}>✓</span>
                  </button>;
  })}
            </div> : null}
        </div>
      </div>
      <div ref={containerRef} className="prose dark:prose-invert max-w-none">{children}</div>
    </div>;
};

Un scénario typique pour traiter des documents à l’aide d’un seul appel d’API (pour créer une transaction, téléverser un fichier et démarrer cette transaction) comprend les étapes suivantes :

1. [Réception de la liste de toutes les compétences disponibles](#receiving-a-list-of-all-available-skills)
2. [Création et démarrage d’une transaction](#creating-and-starting-a-transaction)
3. [Suivi de l’état de la transaction](#monitoring-the-transaction-status)
4. [Téléchargement des fichiers source et des fichiers de résultats](#downloading-source-files-and-result-files)

Chaque requête envoyée au serveur doit inclure des informations d’authentification. Voir [Authentication](/fr/vantage/developer/authentication/authentication) pour plus de détails.

Utilisez ce scénario si vous n’avez qu’un seul fichier dont la taille est inférieure à 30 Mo et que vous n’avez pas besoin de modifier les images de ce fichier.

<div id="receiving-a-list-of-all-available-skills">
  ### Récupération de la liste de toutes les compétence disponibles
</div>

Pour ce faire, envoyez une requête `GET` à la ressource `skills` :

<VantageRegion>
  ```
  GET https://vantage-us.abbyy.com/api/publicapi/v1/skills
  ```
</VantageRegion>

Exécutez la commande suivante :

**Pour Windows :**

<VantageRegion>
  ```bash theme={null}
  curl -X GET "https://vantage-us.abbyy.com/api/publicapi/v1/skills" \
  -H "Authorization: Bearer token"
  ```
</VantageRegion>

**Pour Linux :**

<VantageRegion>
  ```bash theme={null}
  curl -X GET 'https://vantage-us.abbyy.com/api/publicapi/v1/skills' \
  -H 'Authorization: Bearer token'
  ```
</VantageRegion>

La réponse contiendra un fichier JSON semblable à l’exemple suivant :

**Réponse :**

```json theme={null}
[
   {
      "id": "Receipt",
      "name": "Receipt",
      "type": "Document"
   },
   {
      "id": "c4b26798-07cb-11eb-adc1-0242ac120002",
      "name": "NewClassifier",
      "type": "Classification"
   },
   {
      "id": "c4b26798-07cb-11eb-adc1-0242ac120002",
      "name": "Invoice",
      "type": "Document"
   }
]
```

Définissez l’identifiant de la compétence que vous allez utiliser. Des descriptions détaillées des compétences sont disponibles dans les compétences intégrées.

<div id="creating-and-starting-a-transaction">
  ### Création et lancement d’une transaction
</div>

Pour créer et lancer une transaction afin de traiter un fichier téléversé avec la compétence spécifiée, envoyez la requête `POST` suivante à la ressource `transactions/launch?skillId=<skill-id>` :

<VantageRegion>
  ```
  POST https://vantage-us.abbyy.com/api/publicapi/v1/transactions/launch?skillId=skill-id
  ```
</VantageRegion>

Cela crée une nouvelle transaction et la lance immédiatement.

Exécutez la commande suivante :

**Pour Windows :**

<VantageRegion>
  ```bash theme={null}
  curl -X POST "https://vantage-us.abbyy.com/api/publicapi/v1/transactions/launch?skillId=skill-id" \
  -H "accept: text/plain" \
  -H "Authorization: Bearer token" \
  -H "Content-Type: multipart/form-data" \
  -F "Files=@1page_invoiceUS_86.pdf;type=application/pdf"
  ```
</VantageRegion>

**Pour Linux :**

<VantageRegion>
  ```bash theme={null}
  curl -X POST 'https://vantage-us.abbyy.com/api/publicapi/v1/transactions/launch?skillId=skill-id' \
  -H 'accept: text/plain' \
  -H 'Authorization: Bearer token' \
  -H 'Content-Type: multipart/form-data' \
  -F 'Files=@1page_invoiceUS_86.pdf;type=application/pdf'
  ```
</VantageRegion>

<Info>
  Lors du téléversement du fichier dans Vantage, tous les caractères suivants du nom de fichier seront remplacés par un trait de soulignement : `:/?#[]@!$&'()*+,;=\`. Le nom de fichier modifié s’affichera à la fois dans l’API Vantage et dans Skill Monitor.
</Info>

<div id="monitoring-the-transaction-status">
  ### Suivi du statut de la transaction
</div>

Pour commencer à suivre le statut de la transaction à l’aide d’une boucle avec un court délai d’attente (nous ne recommandons pas de vérifier le statut plus d’une fois par seconde), envoyez une requête `GET` à la ressource `transactions/<transaction_id>` avec l’identifiant de la transaction dans l’URI de la requête :

<VantageRegion>
  ```
  GET https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id
  ```
</VantageRegion>

Exécutez la commande suivante :

**Pour Windows :**

<VantageRegion>
  ```bash theme={null}
  curl -X GET "https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id" \
  -H "Authorization: Bearer token"
  ```
</VantageRegion>

**Pour Linux :**

<VantageRegion>
  ```bash theme={null}
  curl -X GET 'https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id' \
  -H 'Authorization: Bearer token'
  ```
</VantageRegion>

La réponse ressemblera à ceci :

**Réponse :**

<VantageRegion>
  ```json theme={null}
  {
     "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
     "status": "Processing", 
     "manualReviewLink": "https://vantage-us.abbyy.com/api/publicapi/v1/verify?documentIds=9838448d-72ae-4e9a-b071-2bb16f732e46",
     "sourceFiles": [
        {
           "id": "7b2eed6f-3fdd-43b9-a178-7211d0a8d5bb",
           "name": "Invoice07.JPG"
        }
     ]
  }
  ```
</VantageRegion>

Dans la réponse :

* Si la valeur de la clé `status` est définie sur `Processing`, les résultats ne sont pas encore prêts. Une fois le statut de la transaction passé à `Processed`, vous pourrez télécharger les résultats.
* La clé `manualReviewLink` contiendra un lien vers l’interface web du client de relecture manuelle et un jeton d’accès Vantage, si une relecture manuelle est requise. Ce lien et ce jeton peuvent être utilisés pour relire et corriger les résultats de classification et d’extraction de champs d’une transaction donnée. Tant que la relecture n’est pas terminée, la valeur de la clé `status` restera définie sur `Processing`. Le lien fourni est valable 168 heures, après quoi un nouveau lien devra être créé et obtenu pour une nouvelle période de 168 heures en utilisant la même méthode. Pour en savoir plus, consultez [Integrating manual review](/fr/vantage/developer/integrating-manual-review).

<Info>
  Les utilisateurs autorisés via ce lien ne peuvent ni afficher ni modifier d’autres documents ou transactions.
</Info>

Pour une compétence de document, la réponse ressemblera alors à ceci :

**Réponse :**

<VantageRegion>
  ```json theme={null}
  {
     "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
     "status": "Processed",
     "documents": [
        {
           "id": "9838448d-72ae-4e9a-b071-2bb16f732e46",
           "resultFiles": [
              {
                 "fileId": "3a3e6245-48e1-489a-9fef-a10b5ba28515",
                 "type": "Json"
              }
           ],
           "businessRulesErrors": []
        }
     ],
     "sourceFiles": [
        {
           "id": "7b2eed6f-3fdd-43b9-a178-7211d0a8d5bb",
           "name": "Invoice07.jpg"
        }
     ]
  }
  ```
</VantageRegion>

Dans le tableau `documents`, chaque document possède un tableau `resultFiles`. Utilisez ce tableau pour récupérer les valeurs `fileId`. Le format des fichiers de sortie est défini par la compétence que vous utilisez. Actuellement, toutes les compétences renvoient les champs extraits au [format JSON](/fr/vantage/developer/output/json/json-output).

Pour une Skill de classification, la réponse reçue une fois les documents traités ressemblera à ceci :

**Réponse :**

<VantageRegion>
  ```json theme={null}
  {
     "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
     "status": "Processed",
     "documents": [
        {
           "id": "9838448d-72ae-4e9a-b071-2bb16f732e46",
           "classification": {
              "isResultClassConfident": true,
              "resultClass": "Invoice",
              "classConfidences": [
                 {
                    "class": "Invoice",
                    "confidence": 89
                 },
                 {
                    "class": "PurchaseOrder",
                    "confidence": 32
                 }
              ]
           }
        }
     ],
     "sourceFiles": [
        {
           "id": "7b2eed6f-3fdd-43b9-a178-7211d0a8d5bb",
           "name": "Invoice07.jpg"
        }
     ]
  }
  ```
</VantageRegion>

Extrayez la classe du document à partir de la clé `resultClass` et vérifiez le niveau de confiance associé à chaque classe probable dans les clés `confidence`.

Pour une compétence de processus, la réponse peut contenir tout ou partie des informations renvoyées pour les compétences Document et de classification, selon les étapes disponibles dans la compétence de processus.

<div id="downloading-source-files-and-result-files">
  ### Téléchargement des fichiers source et des fichiers de résultat
</div>

Une fois le traitement terminé, vous pouvez télécharger deux types de fichier :

* **Fichiers source** — les fichiers d’origine que vous avez téléversés, renvoyés dans leur format binaire d’origine.
* **Fichiers de résultat** — le résultat du traitement : les données extraites, au [format JSON](/fr/vantage/developer/output/json/json-output) par défaut (le format de sortie est défini par la compétence).

<Info>
  Les fichiers source et les fichiers de résultat utilisent des points de terminaison différents et des identifiants de fichier différents :

  * **Fichier source** — `GET transactions/<transaction-id>/documents/<document-id>/sourceFiles/<file-id>/download`. L’ID du fichier provient de la réponse `GET transactions/<transaction-id>/documents` (`sourceFiles[].id`).
  * **Fichier de résultat** — `GET transactions/<transaction-id>/files/<file-id>/download`. L’ID du fichier provient du tableau `resultFiles` dans la réponse de [statut de la transaction](#monitoring-the-transaction-status) (`documents[].resultFiles[].fileId`).
</Info>

Pour obtenir une liste des documents avec leurs identifiants, envoyez une requête `GET` à la ressource `transactions/<transaction-id>/documents` et indiquez l'identifiant de la transaction :

<VantageRegion>
  ```
  GET https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/documents
  ```
</VantageRegion>

Exécutez la commande suivante :

**Pour Windows :**

<VantageRegion>
  ```bash theme={null}
  curl -X GET "https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/documents" \
  -H "Authorization: Bearer token"
  ```
</VantageRegion>

**Pour Linux :**

<VantageRegion>
  ```bash theme={null}
  curl -X GET 'https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/documents' \
  -H 'Authorization: Bearer token'
  ```
</VantageRegion>

<div id="source-files">
  #### Fichiers source
</div>

Pour télécharger un fichier source donné, envoyez une requête `GET` à la ressource `transactions/<transaction-id>/documents/<document-id>/sourceFiles/<file-id>/download` et indiquez les identifiants de la transaction, du document et du fichier (issus de la dernière réponse) :

<VantageRegion>
  ```
  GET https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/documents/document-id/sourceFiles/file-id/download
  ```
</VantageRegion>

Exécutez la commande suivante :

**Pour Windows :**

<VantageRegion>
  ```bash theme={null}
  curl -X GET "https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/documents/document-id/sourceFiles/file-id/download" \
  -H "Authorization: Bearer token"
  ```
</VantageRegion>

**Pour Linux :**

<VantageRegion>
  ```bash theme={null}
  curl -X GET 'https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/documents/document-id/sourceFiles/file-id/download' \
  -H 'Authorization: Bearer token'
  ```
</VantageRegion>

La réponse contiendra le fichier au format binaire. Répétez cette étape pour tous vos fichiers source.

<div id="result-files">
  #### Fichiers de résultat
</div>

Pour télécharger un fichier de résultat, envoyez une requête `GET` à la ressource `transactions/<transaction-id>/files/<file-id>/download` et indiquez l’identifiant de la transaction ainsi que le `fileId` du fichier de résultat. Récupérez le `fileId` dans le tableau `resultFiles` renvoyé lors de la [surveillance du statut de la transaction](#monitoring-the-transaction-status) (chaque entrée comporte un `fileId` et un `type`, par exemple `Json`) :

<VantageRegion>
  ```
  GET https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/files/file-id/download
  ```
</VantageRegion>

Exécutez la commande suivante :

**Pour Windows :**

<VantageRegion>
  ```bash theme={null}
  curl -X GET "https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/files/file-id/download" \
  -H "Authorization: Bearer token"
  ```
</VantageRegion>

**Pour Linux :**

<VantageRegion>
  ```bash theme={null}
  curl -X GET 'https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/files/file-id/download' \
  -H 'Authorization: Bearer token'
  ```
</VantageRegion>
