Files API und PDFs
Die OpenAI-kompatible Files API von GetVibe API und PDF-Eingaben: Base64, ein Link oder eine file_id für chat/completions, responses und messages, welche Modelle die Bilder in einem PDF sehen, Limits und Fehler.
OpenAI-kompatible Files API zum Hochladen, Lesen und Löschen von Dateien. Für jeden Vorgang ist ein API-Schlüssel erforderlich; eine Datei ist nur für dasselbe Clientkonto zugänglich, das sie hochgeladen hat.
Eine Datei hochladen
Senden Sie multipart/form-data mit den erforderlichen Feldern file und purpose. Zulässige Zwecke: assistants, batch, fine-tune, vision und user_data. Die maximale Dateigröße beträgt 50 MiB (52 428 800 Bytes); bei Überschreitung wird 413 zurückgegeben.
curl -X POST https://getvibeapi.com/v1/files \
-H "Authorization: Bearer $GETVIBE_API_KEY" \
-F "purpose=user_data" \
-F "file=@./report.pdf"Metadaten oder Inhalte abrufen oder löschen
Der Upload gibt ein file-Objekt mit einem undurchsichtigen id, Namen, Größe, Zweck und Erstellungszeitpunkt zurück. GET ohne /content gibt diese Metadaten zurück; GET /content lädt die Rohdaten herunter. Nach einem erfolgreichen DELETE geben beide GET-Anfragen 404 zurück. Die vorhandene Datei eines anderen Kontos gibt 403 zurück, eine unbekannte Kennung 404.
Sicherer Workflow
- Laden Sie die Datei hoch und behalten Sie nur das zurückgegebene
file_id. - Verifizieren Sie die Metadaten mit demselben Schlüssel; bei der Verwendung von Responses übergeben Sie diese ID in
input_file.file_id. - Laden Sie keine Geheimnisse hoch und löschen Sie die Datei, nachdem Sie fertig sind. Eine gelöschte Datei kann nicht wiederhergestellt werden.
PDF in Modellanfragen
Jedes Textmodell akzeptiert PDFs in allen drei API-Formaten. Kurz gesagt: Senden Sie die Datei auf eine der drei folgenden Arten – standardmäßig extrahieren wir kostenlos den Text und übergeben ihn an das Modell. Das Modell liest den Text und die Tabellen, aber nicht die Bilder im PDF oder Scans. Wenn Bilder, Layout oder ein Scan wichtig sind, wählen Sie ein Modell aus der folgenden Tabelle und deaktivieren Sie die Textextraktion. Alles auf dieser Seite wurde am 2. November 2026 mit Live-Anfragen und einem dreiseitigen PDF mit Text, einer Tabelle und einem Bild überprüft.
Drei Möglichkeiten, ein PDF zu senden
| Methode | Vorgehensweise | Wann Sie es verwenden sollten |
|---|---|---|
| Base64 in der Anfrage | Chat: {"type":"file","file":{"filename":"report.pdf","file_data":"data:application/pdf;base64,…"}}; Responses: {"type":"input_file","filename":"report.pdf","file_data":"data:…"}; Messages: {"type":"document","source":{"type":"base64","media_type":"application/pdf","data":"…"}} | Ein einzelnes Dokument. Funktioniert mit allen drei Endpunkten. Dateien bis zu 20 MiB. |
| Öffentlicher Link | Chat: "file":{"file_url":"https://…"}; Responses: {"type":"input_file","file_url":"https://…"}; Messages: "source":{"type":"url","url":"https://…"} | Die Datei ist bereits online. Wir laden sie selbst herunter: nur HTTPS, ohne Anmeldung oder Passwort; der Server muss mit application/pdf antworten, bis zu 20 MiB, innerhalb von 10 Sekunden und mit höchstens 3 Weiterleitungen. |
file_id nach dem Upload | Mit POST /v1/files und purpose=user_data hochladen, dann: Chat "file":{"file_id":"file-pv-…"}, Responses {"type":"input_file","file_id":"file-pv-…"}, Messages "source":{"type":"file","file_id":"file-pv-…"} | Ein Dokument für mehrere Anfragen: Sie müssen nicht jedes Mal Megabytes erneut senden, und ein identisches Anfragepräfix wird zwischengespeichert. Die Datei wird 7 Tage aufbewahrt und ist nur für Ihr Konto sichtbar. |
Sofort ausführbare Beispiele
Der Schlüssel wird aus der Umgebungsvariable GETVIBE_API_KEY gelesen. Die Python-Beispiele verwenden unverändert die offiziellen SDKs openai und anthropic – nur die Adresse unterscheidet sich.
/v1/chat/completions
# PDF inline (base64); jq builds the body so a large file does not hit the command-line length limit
# macOS: replace base64 -w0 report.pdf with base64 -i report.pdf
jq -n --rawfile b64 <(base64 -w0 report.pdf) '{model: "deepseek-v4.1-flash", messages: [{role: "user", content: [
{type: "text", text: "Summarise the document"},
{type: "file", file: {filename: "report.pdf", file_data: ("data:application/pdf;base64," + $b64)}}]}]}' |
curl https://getvibeapi.com/v1/chat/completions \
-H "Authorization: Bearer $GETVIBE_API_KEY" -H "Content-Type: application/json" -d @-/v1/responses
# FILE_ID comes from the upload, see the "curl · file_id" tab above
curl https://getvibeapi.com/v1/responses \
-H "Authorization: Bearer $GETVIBE_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"gpt-6.1-sol","input":[{"role":"user","content":[
{"type":"input_text","text":"What were the sales in Kazan in August?"},
{"type":"input_file","file_id":"'"$FILE_ID"'"}]}]}'
# base64 instead of file_id:
# {"type":"input_file","filename":"report.pdf","file_data":"data:application/pdf;base64,…"}/v1/messages
curl https://getvibeapi.com/v1/messages \
-H "x-api-key: $GETVIBE_API_KEY" -H "anthropic-version: 2023-06-01" -H "Content-Type: application/json" \
-d '{"model":"claude-sonnet-5.5","max_tokens":1024,"messages":[{"role":"user","content":[
{"type":"document","source":{"type":"file","file_id":"'"$FILE_ID"'"}},
{"type":"text","text":"Summarise the document"}]}]}'
# other sources:
# "source":{"type":"base64","media_type":"application/pdf","data":"<base64>"}
# "source":{"type":"url","url":"https://example.com/report.pdf"}Was das Modell sieht: den Text oder die Datei selbst
Standardmäßig wird der extrahierte Text verwendet. Wir übernehmen die Textebene des PDF und übergeben sie statt der Datei an das Modell. Das ist kostenlos und funktioniert mit jedem Modell, auch mit solchen ohne PDF-Unterstützung. Das Modell sieht Wörter und Zahlen, einschließlich Tabellen (ohne Rahmen, aber mit den richtigen Werten). Was es nicht sieht: Bilder, Diagramme, Stempel, Unterschriften, Farben und Layout. Pro Anfrage werden bis zu 60,000 Zeichen Text übergeben (etwa 28 dicht bedruckte Seiten); der Rest wird abgeschnitten und das Modell darüber informiert, dass das Dokument gekürzt wurde. Der Antwort-Header x-pv-document-shim gibt an, was passiert ist: applied:text_extracted bedeutet, dass das Modell den Text erhalten hat, not-needed:lane_reads_pdf bedeutet, dass es die Datei selbst erhalten hat.
Die Datei selbst. Damit das Modell ganze Seiten einschließlich Bildern und Layout sieht, fügen Sie "plugins":[{"id":"documents","enabled":false}] in den Anfragetext ein (der Header lautet dann not-needed:disabled_by_client). Verwenden Sie dies nur mit Modellen, die in der Tabelle mit „yes“ gekennzeichnet sind: Die anderen antworten mit 400 oder geben an, dass sie keine Datei sehen, und die Eingabe-Tokens der Datei werden trotzdem abgerechnet.
# curl: add the field to the request body
"plugins": [{"id": "documents", "enabled": false}]
# Python (openai SDK)
r = client.chat.completions.create(
model="gpt-6.1-sol",
messages=[...],
extra_body={"plugins": [{"id": "documents", "enabled": False}]},
)| Modell | Standardmäßig | Sieht die Datei selbst (Extraktion deaktiviert) |
|---|---|---|
gpt-6.1-sol | die Datei selbst | ja — bei /chat/completions und /responses |
gpt-6-luna | text | ja — bei /chat/completions und /responses |
gpt-5.6-sol | text | nicht bestätigt — belassen Sie den Standardwert |
claude-sonnet-5.5, claude-opus-5.5 | text | nein — das Modell kann die Datei nicht sehen, daher extrahieren wir den Text auch bei deaktiviertem Plugin (Header x-getvibe-warnings: plugin_overridden:documents); für die Datei selbst verwenden Sie gpt-6.1-sol |
claude-haiku-5.5 | text | nein — das Modell sieht die Datei nicht |
gemini-4-argon, gemini-3.8-flash | text | nein — das Modell sieht die Datei nicht, oder 400 |
qwen3.8-flash | text | ja — bei /chat/completions; 400 bei /responses |
deepseek-v4.1-flash, glm-5.3, kimi-k3 | text | nein — 400 |
So haben wir getestet: Das Modell wurde nach einem Wort auf Seite 1, einer Zahl aus einer Tabellenzelle und einer Beschreibung eines Bildes gefragt (Formen, Farben und eine als Bild dargestellte Zahl). „Text“ bedeutet, dass es das Wort und die Zahl korrekt nannte und angab, das Bild nicht sehen zu können. „Yes“ bedeutet, dass es auch das Bild korrekt beschrieb. Senden Sie PDFs über /v1/chat/completions oder /v1/responses an GPT-, Gemini- und Qwen-Modelle: auf /v1/messages sehen sie die Datei selbst nicht.
not-needed:no_text_layer_unmeasured_lane). Es kommt dann auf das Modell an: gpt-6.1-sol und qwen3.8-flash können unseren Scan lesen, DeepSeek-Modelle antworten mit 400. Wenn Ihr Modell keinen Scan lesen kann, führen Sie OCR auf Ihrer Seite aus und senden Sie den Text oder senden Sie die Seiten als PNG/JPEG-Bilder über image_url an ein Modell, das Bilder akzeptiert.Limits, Tokens und Dauer
| Was | Limit |
|---|---|
| Ein PDF in einer Modellanfrage (base64, Link oder file_id) | bis zu 20 MiB pro Datei; die Datei muss mit %PDF- beginnen |
Hochladen unter POST /v1/files | bis zu 50 MiB (52,428,800 bytes), aber nur ein PDF bis zu 20 MiB kann in eine Modellanfrage aufgenommen werden |
file_id lifetime | 7 Tage (das Feld expires_at), danach wird die Datei gelöscht |
| Seiten | kein separates Limit; bei Textextraktion bis zu 60,000 Zeichen pro Anfrage; bei der Datei selbst bis zum Kontextfenster des Modells |
| Über einen Link herunterladen | bis zu 10 Sekunden und bis zu 3 Weiterleitungen |
So werden Tokens gezählt. Ein PDF wird als gewöhnliche Eingabe-Tokens des gewählten Modells zu dessen Preis abgerechnet; für die Datei oder die Textextraktion fällt keine separate Gebühr an. Das ergibt sich (gemessen einschließlich einer kurzen Frage) wie folgt:
- Extrahierter Text: ungefähr 700 Tokens pro dicht bedruckter Textseite (10 Seiten — 7,300 Tokens; 40 Seiten, auf 60,000 Zeichen gekürzt — 20,300 Tokens). Eine Seite mit einer kleinen Tabelle — 100–200 Tokens.
- Die Datei selbst auf GPT-Modellen: etwa 600–700 Tokens pro Seite (10 Seiten – 5,900; 40 – 23,300); auf
gemini-4-argonetwa 1,200 pro Seite; auf Claude etwa 1,600 pro Seite. Eine gescannte Seite aufgpt-6.1-sol– etwa 5,800 Tokens. - Bei Wiederholung desselben Dokuments wird der Cache genutzt, wenn sich der Anfang der Anfrage nicht ändert: Eine zweite Anfrage mit demselben
file_idlas 7,168 von 7,309 Tokens aus dem Cache.
Dauer. Die Textextraktion dauert einen Bruchteil einer Sekunde; eine Antwort zu einem 40-seitigen Dokument kam nach 4–12 Sekunden zurück. Verwenden Sie für große Dokumente und lange Antworten stream: true und setzen Sie das Client-Timeout auf mindestens 300 Sekunden.
Fehler und ihre Behebung
| Antwort | Ursache | Was zu tun ist |
|---|---|---|
400 invalid_pdf | The PDF must start with the %PDF- signature. | Dies ist kein PDF, oder das Base64 ist fehlerhaft. Stellen Sie sicher, dass Sie die Datei selbst und nicht ihren Pfad kodieren und dass der Typ application/pdf ist. |
400 invalid_pdf | The PDF size must not exceed 20 MiB. | Teilen Sie das Dokument auf oder komprimieren Sie die darin enthaltenen Bilder. |
413 invalid_request_error | Auf POST /v1/files: Die Datei ist größer als 52,428,800 Bytes | Die Datei ist größer als 50 MiB: Teilen Sie sie auf. |
400 invalid_request_error | file_id ist nicht verfügbar | Die Datei wurde gelöscht, ist abgelaufen (7 days), wurde über ein anderes Konto hochgeladen oder die ID stammt von einem anderen Dienst. Laden Sie die Datei erneut mit demselben Schlüssel hoch. |
400 invalid_pdf | The PDF URL must be a public HTTPS URL without credentials. | Der Link verwendet http://, enthält eine Anmeldung und ein Passwort, verwendet einen nicht standardmäßigen Port oder die Domain existiert nicht. Geben Sie einen öffentlichen HTTPS-Link an oder senden Sie Base64. |
400 invalid_pdf | Could not safely fetch the PDF from the URL. | Der Link liefert 404, eine Anmeldeseite, HTML statt eines PDFs oder der Server hat nicht innerhalb von 10 Sekunden geantwortet. Öffnen Sie den Link in einem privaten Browserfenster. Wenn die Datei nicht sofort heruntergeladen wird, senden Sie Base64. |
400 unsupported_input | Das Modell kann keine PDFs lesen, und die Datei enthält keinen Text (ein Scan). | Verwenden Sie ein Modell, das Scans lesen kann (siehe oben), oder führen Sie OCR auf Ihrer Seite aus. |
400 invalid_request_error | Invalid request… bei deaktivierter Textextraktion oder bei einem Scan. | Das Modell akzeptiert keine PDF-Datei. Entfernen Sie plugins documents enabled:false, damit das Modell den Text erhält, oder wählen Sie ein Modell, das in der Tabelle mit "yes" gekennzeichnet ist. |
| 200, aber „Ich sehe keine Datei“ | Die Extraktion ist deaktiviert, und das Modell oder der Kanal kann die Datei nicht lesen. | Kehren Sie zur standardmäßigen Textextraktion zurück oder wählen Sie ein in der Tabelle mit „yes“ gekennzeichnetes Modell. |
Bewährte Vorgehensweisen
- Benötigen Sie das Dokument in mehreren Anfragen? Laden Sie es einmal hoch und übergeben Sie
file_id: Die Anfrage ist kleiner, und das wiederholte Präfix wird zwischengespeichert und kostet weniger. - Setzen Sie das PDF und die dauerhaften Anweisungen an den Anfang der Nachricht und die veränderliche Frage ans Ende: So wird der Cache häufiger genutzt.
- Teilen Sie Dokumente mit mehr als etwa 28 dicht bedruckten Seiten kapitelweise auf: Bei aktivierter Textextraktion erreichen Inhalte jenseits von 60,000 Zeichen das Modell nie.
- Bei Verträgen, Berichten und Exporten mit einer Textebene genügt die Textextraktion – die günstigste Option mit jedem Modell, einschließlich
deepseek-v4.1-flash. - Benötigen Sie Diagramme, Stempel oder Scans? Deaktivieren Sie die Extraktion und verwenden Sie ein in der Tabelle mit „yes“ gekennzeichnetes Modell, zum Beispiel
gpt-6.1-sol. - Nicht-lateinischer Text (Russisch, Chinesisch und andere Sprachen) in einem PDF wird ohne besondere Einstellungen gelesen. Entfernen Sie vor dem Senden das Passwort aus einem PDF.
- Löschen Sie hochgeladene Dateien mit
DELETE /v1/files/{file_id}, sobald Sie sie nicht mehr benötigen.
file_id nicht durch eine Kennung eines Drittanbieters.