Parser APIKI+
Bestellung parsen
Bestellungen als UBL-Order-XML lesen wir direkt, PDFs liest die KI. Die Felder bleiben dauerhaft gleich, damit deine Zuordnung in zwei Jahren noch passt.
- KI in der EU
- Server in Deutschland
- Kein Abo
- Datei wird gelöscht
So funktioniert der Aufruf
Für Bestellung gibt es einen eigenen Aufruf mit festem Antwortformat. Du bekommst also immer dieselben Felder zurück und musst nicht raten, was gerade ankommt. Wie du dich anmeldest, was einzelne Fehlermeldungen bedeuten und wie du vorab den Preis erfährst, steht in der API-Dokumentation.
bestellung-po-test-1.xml · Strukturierte Belege: 1 Credit je Datei.
- Käufer
- Testkunde AG · Max Einkauf (einkauf@testkunde.example)
- Lieferanschrift
- Testkunde AG, Lager Nord · Hafenstraße 9, 20457 Hamburg
- Bestellung
- PO-TEST-1 vom 15.03.2024
- Position 1
- 1 Stk. Widget (Käufer-Art. K-100 · Lieferanten-Art. A-1) · 100,00 EUR
- Summen
- Netto 100,00 EUR + 19,00 EUR USt = Brutto 119,00 EUR
UBL-Order-XML lesen wir lokal zum Dateipreis; Bestell-PDFs und Scans liest die KI in der EU.
purchaseorder.v1
HTTP 200 · warnings: []
POST /api/v1/purchase-order · source: "ubl_order"
{
"schema": "purchaseorder.v1",
"source": "ubl_order",
"billed": 1,
"buyer": {
"name": "Testkunde AG",
"contact_name": "Max Einkauf"
},
"seller": {
"name": "Fixture GmbH"
},
"ship_to": {
"name": "Testkunde AG, Lager Nord",
"address": "Hafenstraße 9, 20457 Hamburg, DE"
},
"order": {
"number": "PO-TEST-1",
"date": "2024-03-15"
},
"totals": {
"net": 100,
"vat": 19,
"gross": 119
},
"lines": [
{
"seller_item_number": "A-1",
"buyer_item_number": "K-100",
"description": "Widget",
"quantity": 1,
"unit": "C62",
"unit_price": 100,
"net": 100
}
],
"confidence": {
"overall": 1,
"order": 1,
"lines": 1
},
"warnings": []
}
Sofort kostenlos testen (0 Credits mit öffentlichem Test-Key):
curl -sS -X POST https://parser-api.micro-ki.de/api/v1/purchase-order -H "Authorization: Bearer pak_test_X0001" -F "file=@bestellung-po-test-1.xml"
Welche Dateien du schicken kannst
Du schickst einfach die Datei. Welches Format sie hat, erkennen wir selbst, du musst nichts dazu angeben.
| Was du schickst | Was das ist |
|---|---|
| XML (UBL-Order) | Bestellung als XML-Datei |
| PDF / JPG / PNG / WEBP / TIFF / HEIC ohne XML | Scan, Foto oder Druck-PDF |
| DOCX / ODT / TXT | Word, LibreOffice, reiner Text |
Bestellung purchaseorder.v1
So rufst du es auf
# curl 7 curl -sS -X POST \ -H "Authorization: Bearer pak_test_X0001" \ -H "Idempotency-Key: lauf-1-0" \ -F "file=@dokument.pdf" \ https://parser-api.micro-ki.de/api/v1/purchase-order
# Python 3
import requests
with open("dokument.pdf", "rb") as f:
r = requests.post(
"https://parser-api.micro-ki.de/api/v1/purchase-order",
headers={
"Authorization": "Bearer pak_test_X0001",
"Idempotency-Key": "lauf-1-0",
},
files={"file": ("dokument.pdf", f)},
timeout=280,
)
print(r.status_code, r.json())
<?php // PHP 8
$ch = curl_init('https://parser-api.micro-ki.de/api/v1/purchase-order');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer pak_test_X0001',
'Idempotency-Key: lauf-1-0',
],
CURLOPT_POSTFIELDS => ['file' => new CURLFile('dokument.pdf')],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 280,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo $status, ' ', $body, PHP_EOL;
// Node.js 20
import { openAsBlob } from 'node:fs';
const form = new FormData();
form.append('file', await openAsBlob('dokument.pdf'), 'dokument.pdf');
const res = await fetch('https://parser-api.micro-ki.de/api/v1/purchase-order', {
method: 'POST',
headers: {
Authorization: 'Bearer pak_test_X0001',
'Idempotency-Key': 'lauf-1-0',
},
body: form,
});
console.log(res.status, await res.json());
// C# 9, .NET 8
using System.Net.Http.Headers;
using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(280) };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "pak_test_X0001");
http.DefaultRequestHeaders.Add("Idempotency-Key", "lauf-1-0");
await using var file = File.OpenRead("dokument.pdf");
using var form = new MultipartFormDataContent();
form.Add(new StreamContent(file), "file", "dokument.pdf");
using var res = await http.PostAsync("https://parser-api.micro-ki.de/api/v1/purchase-order", form);
Console.WriteLine($"{(int)res.StatusCode} {await res.Content.ReadAsStringAsync()}");
// Java 11
import java.io.ByteArrayOutputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Duration;
public class ParserApi {
public static void main(String[] args) throws Exception {
var boundary = "----ParserApi";
var file = Path.of("dokument.pdf");
var body = new ByteArrayOutputStream();
var utf8 = StandardCharsets.UTF_8;
body.write(("--" + boundary + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"dokument.pdf\"\r\nContent-Type: application/octet-stream\r\n\r\n").getBytes(utf8));
body.write(Files.readAllBytes(file));
body.write(("\r\n--" + boundary + "--\r\n").getBytes(utf8));
var client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(30)).build();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://parser-api.micro-ki.de/api/v1/purchase-order"))
.timeout(Duration.ofSeconds(280))
.header("Authorization", "Bearer pak_test_X0001")
.header("Idempotency-Key", "lauf-1-0")
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(HttpRequest.BodyPublishers.ofByteArray(body.toByteArray()))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}
Beispiel-Antwort
{
"schema": "purchaseorder.v1",
"source": "ubl_order",
"document": {
"type": "purchase_order",
"page_count": 0,
"currency": "EUR"
},
"buyer": {
"name": "Testkunde AG",
"address": null,
"vat_id": null,
"customer_number": null,
"contact_name": "Max Einkauf",
"contact_department": null,
"phone": null,
"email": "einkauf@testkunde.example"
},
"seller": {
"name": "Fixture GmbH",
"address": null,
"vat_id": null,
"contact_name": null,
"contact_department": null,
"phone": null,
"email": null
},
"ship_to": {
"name": "Testkunde AG, Lager Nord",
"address": "Hafenstraße 9, 20457 Hamburg, DE"
},
"order": {
"number": "PO-TEST-1",
"date": "2024-03-15",
"delivery_date": null,
"reference": null,
"delivery_terms": null
},
"totals": {
"line_total": 100,
"charges": 0,
"allowances": 0,
"net": 100,
"vat": 19,
"gross": 119
},
"payment_terms": {
"text": "Zahlbar innerhalb von 30 Tagen netto."
},
"notes": [
"Bitte Bestellnummer auf dem Lieferschein angeben."
],
"lines": [
{
"seller_item_number": "A-1",
"buyer_item_number": "K-100",
"gtin": "4012345001235",
"description": "Widget",
"quantity": 1,
"unit": "C62",
"unit_price": 100,
"vat_rate": null,
"net": 100,
"gross": null
}
],
"confidence": {
"overall": 1,
"buyer": 1,
"order": 1,
"lines": 1
},
"warnings": [],
"request_id": "req_beispiel",
"billed": 0,
"available": 18,
"pricing": {
"rule": "structured",
"label": "Strukturierte Belege: 1 Credit je Datei."
}
}
Felder
| Feld | Typ | Bedeutung |
|---|---|---|
| schema | const purchaseorder.v1 | Unser Name für dieses JSON, zum Beispiel „purchaseorder.v1“. Das ist kein amtlicher Formatname. |
| source | string | Wie wir die Datei gelesen haben: „ubl_order“, „mistral“. „mistral“ heißt, die KI hat sie gelesen (Scan, PDF ohne XML, Word, Text). |
| request_id | string | Diese eine Anfrage, für Logs und Support. |
| billed | integer | Credits für diese Anfrage. 0 beim Test-Key und wenn wir in 15 Minuten dieselbe Datei wiedererkennen. |
| available | integer | Guthaben nach dieser Anfrage. |
| pricing | object | „rule“ und „label“: genau einer der drei Sätze, was ein Credit kostet. |
| document | object | Typ, Seiten, Währung. |
| document.type | const purchase_order | Immer „purchase_order“. |
| document.page_count | integer|number|null | Seitenzahl bei PDF und TIFF, 1 bei Bild (JPG, PNG, WEBP, HEIC), sonst 0 (XML, DOCX, ODT, TXT). |
| document.currency | string|null | Währung, zum Beispiel EUR. |
| buyer | object | Besteller. |
| buyer.name | string|null | Name des Bestellers. |
| buyer.address | string|null | Adresse des Bestellers. |
| buyer.vat_id | string|null | USt-IdNr. des Bestellers. |
| buyer.customer_number | string|null | Kundennummer beim Lieferanten. |
| buyer.contact_name | string|null | Ansprechpartner beim Besteller. |
| buyer.contact_department | string|null | Abteilung des Ansprechpartners beim Besteller (z. B. Einkauf, Buchhaltung). |
| buyer.phone | string|null | Telefon des Bestellers oder des Ansprechpartners. |
| buyer.email | string|null | E-Mail des Bestellers oder des Ansprechpartners. |
| seller | object | Lieferant. |
| seller.name | string|null | Name des Lieferanten. |
| seller.address | string|null | Adresse des Lieferanten. |
| seller.vat_id | string|null | USt-IdNr. des Lieferanten. |
| seller.contact_name | string|null | Ansprechpartner beim Lieferanten. |
| seller.contact_department | string|null | Abteilung des Ansprechpartners beim Lieferanten (z. B. Einkauf, Buchhaltung). |
| seller.phone | string|null | Telefon des Lieferanten oder des Ansprechpartners. |
| seller.email | string|null | E-Mail des Lieferanten oder des Ansprechpartners. |
| ship_to | object | Lieferanschrift, nur wenn die Bestellung eine nennt. |
| ship_to.name | string|null | Name des Warenempfängers. |
| ship_to.address | string|null | Lieferadresse. Eine Zeile, Teile mit Komma getrennt, wie buyer.address. |
| order | object | Kopf der Bestellung. |
| order.number | string|null | Bestellnummer. |
| order.date | string|null | Bestelldatum. |
| order.delivery_date | string|null | Gewünschtes Lieferdatum. |
| order.reference | string|null | Referenz der Bestellung. |
| order.delivery_terms | string|null | Lieferbedingungen oder Incoterms (z. B. frei Haus, DAP Hamburg, FOB). |
| totals | object | Summen der Bestellung. |
| totals.line_total | number|null | Summe der Positionen. |
| totals.charges | number|null | Zuschläge auf Belegebene, zum Beispiel Fracht. |
| totals.allowances | number|null | Abschläge auf Belegebene, zum Beispiel Rabatt. |
| totals.net | number|null | Netto: Summe ohne Umsatzsteuer. |
| totals.vat | number|null | MwSt-Betrag. |
| totals.gross | number|null | Brutto. |
| payment_terms | object | Zahlungsbedingungen. |
| payment_terms.text | string|null | Zahlungsbedingungen als Text, wie in der Bestellung. |
| notes[] | array | Bemerkungen zur ganzen Bestellung. |
| lines[] | array | Positionen. |
| lines[].seller_item_number | string|null | Artikelnummer des Lieferanten. |
| lines[].buyer_item_number | string|null | Artikelnummer des Bestellers. |
| lines[].gtin | string|null | GTIN, früher EAN (8 bis 14 Ziffern, von GS1). |
| lines[].description | string|null | Text der Position. |
| lines[].quantity | number|null | Menge. |
| lines[].unit | string|null | Einheit als UN/ECE-Code (Rec. 20), auf allen Wegen gleich: C62 Stück, HUR Stunde, DAY Tag, MON Monat, KGM Kilogramm, LTR Liter, MTR Meter, LS Pauschale (vollständige Liste im Abschnitt „Einheiten“). Unbekannte Einheiten wie gedruckt. |
| lines[].unit_price | number|null | Einzelpreis. |
| lines[].vat_rate | number|null | MwSt-Satz der Position in Prozent. |
| lines[].net | number|null | Netto der Position. |
| lines[].gross | number|null | Brutto der Position. |
| confidence | object | 0 bis 1 je Feldgruppe. Bei UBL-Order 1 für jede Gruppe, die in der Datei steht, 0 für eine leere Gruppe (z. B. keine Positionen). Liest die KI (Quelle „mistral“), ist es ihre eigene Einschätzung. |
| confidence.overall | number|null | 0–1 für die ganze Bestellung. |
| confidence.buyer | number|null | 0–1 für den Besteller. |
| confidence.order | number|null | 0–1 für den Kopf. |
| confidence.lines | number|null | 0–1 für die Positionen. |
| warnings[] | array | Kurze Codes, keine Fließtexte. Welche es bei diesem Endpunkt gibt und was zu tun ist: Abschnitt „Hinweise (warnings)“. |
Was du bekommst
- Reines UBL-Order-XML kostet einen festen Dateipreis. PDFs ohne XML und Bilder werden nach Seiten berechnet.
- Für Technik-Interessierte: Der Aufruf ist POST /api/v1/purchase-order, das Antwortformat heißt purchaseorder.v1.
- Die Antwort hat immer denselben Aufbau. Du ordnest die Felder einmal zu und musst nichts nachbessern.
- Passt die Datei nicht zu diesem Dokumenttyp, bekommst du eine klare Fehlermeldung, und es werden keine Credits abgebucht.
- Wir speichern deine Datei nicht. Nur 15 Minuten lang merken wir uns einen Fingerabdruck, damit eine Wiederholung nicht doppelt kostet.
- Fertige Vorlagen für n8n und Make findest du nach dem Kauf in deinem Konto.
Was kostet das
Zum Einstieg kaufst du nur Start für 4,90 € (80 Credits, API-Key inklusive) . Größere Pakete kaufst du später in deinem Konto nach, sie sind pro Credit günstiger. Kein Abo: Deine Credits gelten mindestens drei Jahre, bis zum Ende des dritten Jahres nach dem Kauf.
-
Zum Start
Start
4,90 €
80 Credits
6,1 Cent pro Credit
Start holen -
Nachkauf im Konto
Workflow
14,90 €
500 Credits
3,0 Cent pro Credit
-
Nachkauf im Konto
Agentur
49,90 €
2400 Credits
2,1 Cent pro Credit
-
Nachkauf im Konto
Scale
179,00 €
9500 Credits
1,9 Cent pro Credit
Endpreise. Gemäß § 19 UStG wird keine Umsatzsteuer berechnet. Angebot nur für Unternehmer (§ 14 BGB), nicht für Verbraucher.
Was du für ein Credit bekommst
E-Rechnung & Co.
SERVER DE
- XML
- EDI
- SWIFT
- ZUGFeRD
1 Dokument
für 1 Credit
Strukturierte Belege: 1 Credit je Datei.
Word & Text
EU-KI
- DOCX
- ODT
- TXT
1 Dokument
für 2 Credit
Office und Klartext: 2 Credit je Datei.
PDF & Scan
EU-KI
- JPG
- PNG
- WEBP
- TIFF
- HEIC
1 Seite
für 2 Credit
PDF-OCR: 2 Credit je Seite.
Die fertigen Vorlagen für n8n und Make bekommst du nach dem Kauf in deinem Konto. Öffentlich zum Download liegen sie nicht.
Weitere Dokumenttypen
So läuft es in n8n So läuft es in Make API-Dokumentation So funktioniert's Hilfe / FAQ