Document Reading
Learn how to send PDFs and other document data to document-capable models.
Document Reading
LLMGateway supports sending documents (PDFs and other file types) to document-capable models using OpenAI's file content block format. The gateway forwards the document to the underlying provider so the model can read and reason over its contents.
Document-Capable Models
Document input is currently supported on Google Gemini models via Google AI Studio. You can find document-capable models on the models page with the document filter.
Sending a Document
Add a file content block to a user message. The file_data field must be a base64-encoded data URL that includes the document's MIME type.
curl -X POST "https://api.llmgateway.io/v1/chat/completions" \
-H "Authorization: Bearer $LLM_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-2.5-flash",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Summarize this document."
},
{
"type": "file",
"file": {
"filename": "report.pdf",
"file_data": "data:application/pdf;base64,JVBERi0xLjQKJ..."
}
}
]
}
]
}'Content Block Fields
type: must be"file".file.filename(optional): original filename, shown in the playground and forwarded for context.file.file_data: base64-encoded data URL of the formdata:<mime-type>;base64,<data>.
The file.file_id field (for referencing files uploaded via a provider's
Files API) is accepted by the schema but not currently supported by the Google
transform. Use file_data with an inline base64 data URL.
Supported File Types
The accepted MIME types depend on the target model. Gemini models commonly support:
application/pdftext/plaintext/htmltext/csstext/javascripttext/csvtext/markdowntext/xml
If the upstream provider rejects the MIME type, the gateway surfaces a 400 error including the unsupported MIME type and the provider it was sent to. To use a different file type, encode the file with the matching MIME type in the data URL prefix.
Encoding a File as a Data URL
Any tool that can produce base64 output works. For example, in a shell:
DATA=$(base64 -i report.pdf | tr -d '\n')
echo "data:application/pdf;base64,$DATA"Or in JavaScript:
import { readFileSync } from "node:fs";
const buffer = readFileSync("report.pdf");
const fileData = `data:application/pdf;base64,${buffer.toString("base64")}`;Then pass fileData as the file.file_data value in your request.
Multiple Documents
You can include multiple file blocks in a single message, optionally mixed with text and image content:
curl -X POST "https://api.llmgateway.io/v1/chat/completions" \
-H "Authorization: Bearer $LLM_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-2.5-pro",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "Compare these two reports." },
{
"type": "file",
"file": {
"filename": "q1.pdf",
"file_data": "data:application/pdf;base64,JVBERi0x..."
}
},
{
"type": "file",
"file": {
"filename": "q2.pdf",
"file_data": "data:application/pdf;base64,JVBERi0x..."
}
}
]
}
]
}'Error Handling
The gateway returns 400 for the following document-related errors:
- The selected model does not support document input.
- The
fileblock is missing bothfile_dataandfile_id. file_datais not a valid base64 data URL.- The upstream provider rejects the document's MIME type for the selected model.
How is this guide?
Last updated on
Data Retention
Store and access your full request and response data for debugging, analytics, and compliance.
Embeddable Payments
Embed end-user payments and sessions into your own site with the Payments SDK. Your end-users get their own wallet, buy credits, and pay per request — billed through LLM Gateway, with your markup as margin.