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

# Dokumente mit der Vantage-API von einem mobilen Gerät hochladen

> Verwenden Sie die ABBYY Vantage Mobile Input API, um einen mobilen Upload-Link zu generieren, Dokumente mit einem Smartphone zu erfassen und sie direkt zur Verarbeitung an Vantage zu senden.

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

Sie können die Funktion Vantage Mobile Input verwenden, mit der Sie Dokumente direkt vom mobilen Gerät aus erfassen, verarbeiten und in ABBYY Vantage hochladen können.

Vantage Mobile Input beginnt mit dem Abrufen eines mobilen Upload-Links über die Vantage-API. Der Link enthält Parameter, die unter anderem die Anzahl und die Typen der während der Mobile-Input-Sitzung zu erfassenden Dokumente sowie die ABBYY Vantage Skills zur Verarbeitung der hochgeladenen Dokumente definieren. Weitere Informationen zur Verwendung der Vantage-API finden Sie in der [Swagger-Dokumentation](https://vantage-us.abbyy.com/api/index.html?urls.primaryName=publicapi%2Fv1).

Der mobile Upload-Link kann verwendet werden, um eine Mobile-Input-Sitzung zu starten:

* In Mikroanwendungen für iOS und Android oder in einem Webbrowser.
* In nativen iOS- und Android-Anwendungen.

Um die Funktion Vantage Mobile Input hinzuzufügen, indem Sie den mobilen Upload-Link für den Vorgang abrufen, führen Sie die folgenden Schritte aus:

1. Authentifizieren Sie sich in ABBYY Vantage (ausführliche Anweisungen finden Sie unter [Authentication](/de/vantage/developer/authentication/authentication)).

<Info>
  Jede HTTP-Anforderung an ABBYY Vantage sollte einen Header mit einem Zugriffstoken enthalten, mit dem der Dienst den Benutzer im System identifiziert.
</Info>

2. Zeigen Sie die Liste der verfügbaren Skills an und suchen Sie die ID des Skills, den Sie zur Verarbeitung von Dokumenten benötigen.

Senden Sie dazu eine `GET`-Anforderung an die Ressource `skills`:

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

Führen Sie den folgenden Befehl aus:

**Für Windows:**

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

**Für Linux:**

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

Die Antwort enthält eine JSON-Datei mit der Liste der verfügbaren Skills. Suchen Sie die Skill-ID und verwenden Sie sie als Wert für den Parameter `skillId`, um einen Vorgang zu erstellen.

**Antwort:**

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

3. Erstellen Sie einen leeren Vorgang, indem Sie eine `POST`-Anfrage an die Ressource `transactions` senden und den Parameter `skillId` im Anfragekörper angeben. Um den mobilen Upload-Link für diesen Vorgang zu erhalten, fügen Sie den Parameter `generateMobileInputLink` mit dem Wert `true` im Anfragekörper hinzu:

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

Führen Sie den folgenden Befehl aus:

**Für Windows:**

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

**Für Linux:**

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

Nachdem der Vorgang erfolgreich erstellt wurde, erhalten Sie eine Antwort mit der Vorgangskennung und dem mobilen Upload-Link:

**Antwort:**

<VantageRegion>
  ```json theme={null}
  {
     "transactionId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
     "mobileInputLink": "https://vantage-us.abbyy.com/mobile?baseUrl=<base URL>&transactionId=<transaction-id>&token=<token>&v=<2.4>" 
  }
  ```
</VantageRegion>

Der Link ist 30 Minuten lang gültig, danach muss ein neuer Link abgerufen werden.

<Warning>
  Wenn Sie QR-Codes oder Schaltflächen zum Hochladen von Dokumenten auf Ihrer Website verwenden, empfehlen wir, diese QR-Codes und Schaltflächen so zu konfigurieren, dass sie alle 30 Minuten einen neuen Vorgang erstellen und/oder das Token aktualisieren. Andernfalls können Benutzer nach dem Ablauf des ursprünglichen Tokens keine Dokumente mehr hochladen.
</Warning>

Mit dem erhaltenen Link können Sie Vantage Mobile Input mit der Vantage-API starten, [zusätzliche Parameter konfigurieren](/de/vantage/developer/mobile-upload/configuring-input), [die Verarbeitung verfolgen und das Ergebnis herunterladen](/de/vantage/developer/mobile-upload/tracking-processing). Anleitungen zum Fotografieren von Dokumenten und zum Hochladen von Dokumenten von einem mobilen Gerät mit der Micro-App für iOS und Android finden Sie im Abschnitt „Hochladen von Dokumenten von einem mobilen Gerät“ des Quick Start Guide.
