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

# Procesamiento de documentos con llamadas a la API separadas

> Procese documentos en ABBYY Vantage con llamadas separadas a la API: cree una transacción vacía, agregue archivos, inicie el procesamiento, supervise el estado y descargue los resultados.

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 escenario típico para procesar documentos mediante llamadas a la API separadas (para crear una transacción, cargar un archivo e iniciar una transacción) consta de los siguientes pasos:

1. [Recibir una lista de todas las skills disponibles](#receiving-a-list-of-all-available-skills)
2. [Crear una transacción vacía](#creating-an-empty-transaction)
3. [Agregar un conjunto de archivos que se procesarán en la transacción](#adding-a-set-of-files-to-be-processed-in-the-transaction)
4. [Iniciar la transacción](#starting-the-transaction)
5. [Supervisar el estado de la transacción](#monitoring-the-transaction-status)
6. [Descargar archivos de origen y archivos de resultados](#downloading-source-files-and-result-files)

Cada solicitud al servidor debe incluir información de autenticación (como un token de acceso). Para obtener más información, consulte [Authentication](/es/vantage/developer/authentication/authentication).

<div id="receiving-a-list-of-all-available-skills">
  ### Obtener una lista de todas las skills disponibles
</div>

Para ello, envía una solicitud `GET` al recurso `skills`:

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

Ejecute el siguiente comando:

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

La respuesta contendrá un archivo JSON similar al siguiente:

```
[
   {
      "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"
   }
]
```

Defina el identificador de la skill que va a utilizar. Puede encontrar descripciones detalladas de las skills en las skills integradas.

<div id="creating-an-empty-transaction">
  ### Creación de una transacción vacía
</div>

Para ello, envíe la siguiente solicitud `POST` al recurso `transactions`:

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

Ejecute el siguiente comando:

<VantageRegion>
  ```bash theme={null}
  curl -X POST "https://vantage-us.abbyy.com/api/publicapi/v1/transactions" \
  -H "accept: */*" \
  -H "Authorization: Bearer token" \
  -H "Content-Type: application/json" \
  -d "{\"skillId\":\"123\"}"
  ```
</VantageRegion>

Una vez creada correctamente la transacción vacía, recibirá una respuesta con el identificador de la transacción:

```
{
   "transactionId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
```

<div id="adding-a-set-of-files-to-be-processed-in-the-transaction">
  ### Añadir un conjunto de archivos para procesar en la transacción
</div>

<Info>
  El número máximo de archivos en una transacción es de 1000.
</Info>

Un conjunto de archivos se puede añadir de dos maneras:

* [Directamente a la transacción](#adding-files-directly-to-the-transaction)
* [A un documento, y luego añadir este documento a la transacción](#adding-files-to-a-document)

<div id="adding-files-directly-to-the-transaction">
  #### Añadir archivos directamente a la transacción
</div>

Para ello, envíe una solicitud `POST` al recurso `transactions/<transaction-id>/files`:

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

<VantageRegion>
  En el cuerpo de la solicitud, envíe el archivo que se va a procesar. Para obtener información sobre los Parameter disponibles para personalizar archivos, consulte la [Referencia de la API](https://vantage-us.abbyy.com/api/swagger).
</VantageRegion>

Ejecute el siguiente comando:

<VantageRegion>
  ```bash theme={null}
  curl -X POST "https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/files/" \
  -H "Authorization: Bearer token" \
  -F "Files=@Invoice07.jpg; type=image/jpeg"
  ```
</VantageRegion>

Como resultado, recibirá una respuesta con una lista de los archivos añadidos y sus identificadores. Puede añadir tantos archivos como necesite repitiendo esta llamada varias veces.

Opciones adicionales para la carga de archivos:

* [Edición de imágenes añadidas](/es/vantage/developer/processing-documents/editing-added-images)
* [Ordenar archivos y documentos](/es/vantage/developer/processing-documents/ordering-files-and-docs)

<div id="adding-files-to-a-document">
  #### Agregar archivos a un documento
</div>

Primero, cree un documento enviando una solicitud `POST` al recurso `transactions/<transaction-id>/documents`:

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

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

Como resultado, recibirá una respuesta con el identificador del documento.

Luego, agregue archivos al documento enviando una solicitud `POST` al recurso `transactions/<transaction-id>/documents/<document-id>/sourceFiles`:

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

<VantageRegion>
  ```bash theme={null}
  curl -X POST "https://vantage-us.abbyy.com/api/publicapi/v1/transactions/transaction-id/documents/document-id/sourceFiles/" \
  -H "Authorization: Bearer token" \
  -F "Files=@Invoice07.jpg; type=image/jpeg"
  ```
</VantageRegion>

<div id="starting-the-transaction">
  ### Iniciar la transacción
</div>

Para iniciar la transacción con la skill y los archivos especificados, envíe la siguiente solicitud `POST` al recurso `transactions/<transaction-id>/start`:

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

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

<div id="monitoring-the-transaction-status">
  ### Supervisar el estado de la transacción
</div>

Para empezar a supervisar el estado de la transacción mediante un bucle con un breve tiempo de espera (no recomendamos comprobar el estado con más frecuencia que una vez por segundo), envíe una solicitud `GET` al recurso `transactions/<transaction_id>` con el identificador de la transacción en el URI de la solicitud:

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

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

La respuesta tendrá un aspecto similar al siguiente:

```
{
   "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"
      }
   ]
}
```

En la respuesta:

* Si el valor de la clave **status** se establece en:
  * **New** — la transacción se ha creado, pero no está actualmente en curso.
  * **Processing** — la transacción se ha iniciado, pero los resultados aún no están listos.
  * **Processed** — la transacción se ha completado correctamente y podrá descargar los resultados.
  * **Failed** — la transacción ha fallado.
  * **Canceled** — la transacción se canceló.
* La clave **manualReviewLink** contendrá un enlace a la interfaz web del cliente de revisión manual y un token de acceso de Vantage, si se requiere revisión manual. Este enlace y este token pueden utilizarse para revisar y corregir los resultados de la clasificación y la extracción de campos de una transacción concreta. Hasta que se complete la revisión, el valor de la clave **status** se establecerá en **Processing**. El enlace proporcionado es válido durante 168 horas, transcurridas las cuales debe crearse y obtenerse un nuevo enlace para otro período de 168 horas utilizando el mismo método. Consulte más información en [Integrating manual review](/es/vantage/developer/integrating-manual-review).

<Info>
  Los usuarios autorizados mediante este enlace no pueden ver ni modificar ningún otro documento o transacción.
</Info>

Para un Skill de documento, la respuesta tendrá ahora un aspecto similar al siguiente:

```
{
   "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"
      }
   ]
}
```

En el array **documents**, cada documento tiene un array **resultFiles**. Use este array para obtener los valores de **fileId**. El formato de los archivos de salida lo define la skill que utiliza. Actualmente, todas las skills devuelven los campos extraídos en [formato JSON](/es/vantage/developer/output/json/json-output).

Para una Skill de clasificación, la respuesta que se recibe después de que se hayan procesado los documentos tendrá un aspecto similar al siguiente:

```
{
   "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"
      }
   ]
}
```

Extraiga la clase del documento de la clave **resultClass** y compruebe el nivel de confianza de cada posible clase en las claves **confidence**.

Para una Habilidad de proceso, la respuesta puede contener toda o parte de la información que se devuelve para las habilidades de documento y de clasificación, según las etapas disponibles en la Habilidad de proceso.

<div id="downloading-source-files-and-result-files">
  ### Descarga de archivos de origen y de resultados
</div>

Una vez finalizado el procesamiento, puede descargar dos tipos de archivos:

* **Archivos de origen** — los archivos originales que cargó, devueltos en su formato binario original.
* **Archivos de resultados** — la salida del procesamiento: los datos extraídos, en [formato JSON](/es/vantage/developer/output/json/json-output) de forma predeterminada (el formato de salida lo establece la skill).

<Info>
  Los archivos de origen y los archivos de resultados usan endpoints e identificadores de archivo diferentes:

  * **Archivo de origen** — `GET transactions/<transaction-id>/documents/<document-id>/sourceFiles/<file-id>/download`. El ID del archivo proviene de la respuesta de `GET transactions/<transaction-id>/documents` (`sourceFiles[].id`).
  * **Archivo de resultados** — `GET transactions/<transaction-id>/files/<file-id>/download`. El ID del archivo proviene del array `resultFiles` en la respuesta de [estado de la transacción](#monitoring-the-transaction-status) (`documents[].resultFiles[].fileId`).
</Info>

Para obtener una lista de documentos con sus identificadores, envíe una solicitud `GET` al recurso `transactions/<transaction-id>/documents` y especifique el identificador de la transacción:

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

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

Como resultado, recibirá una lista de todos los documentos creados dentro de esta transacción. La respuesta también incluye los identificadores de estos documentos, que pueden ser necesarios para solicitar información detallada sobre documentos específicos.

<div id="source-files">
  #### Archivos de origen
</div>

Para descargar un archivo de origen que necesite, envíe una solicitud `GET` al recurso `transactions/<transaction-id>/documents/<document-id>/sourceFiles/<file-id>/download` y especifique los identificadores de la transacción, el documento y el archivo (de la última respuesta):

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

Ejecute el siguiente comando:

<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 respuesta contendrá el archivo en formato binario. Repita este paso para todos sus archivos de origen.

<div id="result-files">
  #### Archivos de resultados
</div>

Para descargar un archivo de resultados, envíe una solicitud `GET` al recurso `transactions/<transaction-id>/files/<file-id>/download` y especifique el identificador de la transacción y el `fileId` del archivo de resultados. Obtenga el `fileId` del array `resultFiles` devuelto al [consultar el estado de la transacción](#monitoring-the-transaction-status) (cada entrada tiene un `fileId` y un `type`, como `Json`):

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

Ejecute el siguiente comando:

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