# Step 1: Create job and get presigned URL
RESPONSE=$(curl -s -X POST https://prod.visionapi.unsiloed.ai/v2/parse/upload \
-H "api-key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"file_name": "report.pdf",
"use_high_resolution": true,
"layout_analysis": "smart_layout_detection",
"ocr_strategy": "auto_detection",
"extract_strikethrough": false,
"merge_tables": false
}')
JOB_ID=$(echo "$RESPONSE" | jq -r '.job_id')
UPLOAD_URL=$(echo "$RESPONSE" | jq -r '.upload_url')
# Step 2: Upload file
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: application/pdf" \
--data-binary @report.pdf
# Step 3: Poll for results
curl -X GET "https://prod.visionapi.unsiloed.ai/parse/$JOB_ID" \
-H "api-key: your-api-key"
{
"job_id": "a3f1c2d4-7e8b-4a9f-b2c1-123456789abc",
"upload_url": "https://upload.visionapi.unsiloed.ai/uploads/a3f1c2d4.../report.pdf?signature=...",
"expires_at": "2025-10-22T07:06:16Z",
"upload_method": "PUT",
"upload_headers": {
"Content-Type": "application/pdf"
},
"credit_used": 0,
"quota_remaining": 1000
}
Parse and segment PDFs, images, and Office files into meaningful sections using advanced AI models with flexible customization options.
# Step 1: Create job and get presigned URL
RESPONSE=$(curl -s -X POST https://prod.visionapi.unsiloed.ai/v2/parse/upload \
-H "api-key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"file_name": "report.pdf",
"use_high_resolution": true,
"layout_analysis": "smart_layout_detection",
"ocr_strategy": "auto_detection",
"extract_strikethrough": false,
"merge_tables": false
}')
JOB_ID=$(echo "$RESPONSE" | jq -r '.job_id')
UPLOAD_URL=$(echo "$RESPONSE" | jq -r '.upload_url')
# Step 2: Upload file
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: application/pdf" \
--data-binary @report.pdf
# Step 3: Poll for results
curl -X GET "https://prod.visionapi.unsiloed.ai/parse/$JOB_ID" \
-H "api-key: your-api-key"
{
"job_id": "a3f1c2d4-7e8b-4a9f-b2c1-123456789abc",
"upload_url": "https://upload.visionapi.unsiloed.ai/uploads/a3f1c2d4.../report.pdf?signature=...",
"expires_at": "2025-10-22T07:06:16Z",
"upload_method": "PUT",
"upload_headers": {
"Content-Type": "application/pdf"
},
"credit_used": 0,
"quota_remaining": 1000
}
/v2/parse/upload with your configuration — the API creates a parse job and returns a short-lived presigned URL.GET /parse/{job_id} to track progress and retrieve results — the same endpoint as v1.AwaitingUpload. It transitions to Queued once the upload completes, then to Processing, and finally Succeeded or Failed. See Get Parse Job Status for the full response schema and polling examples."report.pdf"). Determines the MIME type for the presigned URL. Supported formats: PDF, images (PNG, JPEG, TIFF), and office documents (DOCX, PPTX, XLSX).true.smart_layout_detection (default) or page_by_page."smart_layout_detection" (default): Intelligently identifies document structure, headers, sections, and content relationships across the entire document using bounding boxes."page_by_page": Analyzes each page independently as a single segment. Faster for simple documents."advanced_layout_detection": Uses a vision-language model for exhaustive page segmentation. Detects 14 element types (Caption, Footnote, Formula, ListItem, PageFooter, PageHeader, Picture, SectionHeader, Table, Text, Title, KeyValuePair, Signature, Seal). Best for visually complex or unusual layouts.auto_detection (default) or force_ocr."auto_detection" (default): Intelligently detects bad quality PDFs, scanned documents, and images, then applies OCR only where needed."force_ocr": Runs OCR on the entire document regardless of quality.UnsiloedHawk (default, recommended), UnsiloedBeta, or UnsiloedStorm."UnsiloedHawk" (Recommended, default): Higher accuracy for complex layouts and mixed content."UnsiloedBeta": Handles rotated/warped text and irregular bounding boxes."UnsiloedStorm": Enterprise-grade accuracy optimized for 50+ languages."standard": Good balance of speed and accuracy."advanced": Higher quality, best for complex layouts, rotated text, and mixed-language content.false.false.20.false.false.false.false.false."1-5" (pages 1 to 5), "2,4,6" (specific pages), "[1,3,5]" (array format), "1-3,7,10-15" (combination).["docx"]. The exported file is available via the exports field in the task response."Unsiloed" (default) — e.g., PageHeader, ListItem, Picture. "Other" — alternative names e.g., Header, List Item, Figure."all" to include every type. Defaults to "all".["Table", "Formula", "Picture"].validate_segments instead.{
"Table": {"html": "VLM", "markdown": "VLM", "model_id": "us_table_v2"},
"Picture": {"html": "VLM", "markdown": "VLM", "model_id": "nova"},
"Formula": {"html": "Auto", "markdown": "VLM", "model_id": "nova"}
}
html / markdown: "VLM" or "Auto"model_id (Table): "astra", "us_table_v1", "us_table_v2"model_id (Picture/Formula): "nova", "luna", "sol"use_table_ocr (Table only): Advanced OCR for bordered cells and complex table layouts.vlm: Custom prompt for the VLM model. Use this to give the model specific instructions for extracting or describing these segment types.false to exclude them and reduce response size. Available fields: html, markdown, ocr, image, content, bbox, confidence, embed. All default to true."Continue" (default) — skips failed pages and continues processing the rest. "Fail" — aborts the entire job on the first error.GET /parse/{job_id} to poll status and retrieve results.api-key header needed for the upload itself. Valid until expires_at.upload_url expires. Upload must complete before this time."PUT". Use an HTTP PUT request when uploading to upload_url.Content-Type set to the MIME type inferred from file_name./v2/parse/upload with your file name and configuration. The API returns a job_id and a short-lived presigned URL.
import requests
API_KEY = "your-api-key"
BASE_URL = "https://prod.visionapi.unsiloed.ai"
response = requests.post(
f"{BASE_URL}/v2/parse/upload",
headers={"api-key": API_KEY, "Content-Type": "application/json"},
json={
"file_name": "report.pdf",
"use_high_resolution": True,
"layout_analysis": "smart_layout_detection",
"ocr_strategy": "auto_detection",
"extract_strikethrough": False,
"merge_tables": False,
},
)
response.raise_for_status()
data = response.json()
job_id = data["job_id"]
upload_url = data["upload_url"]
upload_headers = data["upload_headers"]
print(f"Job ID: {job_id}")
print(f"Upload URL expires: {data['expires_at']}")
{
"job_id": "a3f1c2d4-7e8b-4a9f-b2c1-123456789abc",
"upload_url": "https://upload.visionapi.unsiloed.ai/uploads/a3f1c2d4.../report.pdf?signature=...",
"expires_at": "2025-10-22T07:06:16Z",
"upload_method": "PUT",
"upload_headers": {
"Content-Type": "application/pdf"
},
"credit_used": 0,
"quota_remaining": 1000
}
upload_url and upload_headers from the response to PUT your file. No API key is needed for this request.
with open("report.pdf", "rb") as f:
put_response = requests.put(upload_url, headers=upload_headers, data=f)
put_response.raise_for_status()
print("Upload complete — job is now queued for processing")
upload_headers. A missing or mismatched Content-Type will cause the upload to be rejected with a 403.AwaitingUpload → Queued → Processing → Succeeded. Poll GET /parse/{job_id} using the same endpoint as v1.
import time
while True:
status_response = requests.get(
f"{BASE_URL}/parse/{job_id}",
headers={"api-key": API_KEY},
)
status_response.raise_for_status()
job = status_response.json()
print(f"Status: {job['status']}")
if job["status"] == "Succeeded":
print(f"Done! {job['total_chunks']} chunks extracted.")
break
elif job["status"] == "Failed":
raise RuntimeError(f"Job failed: {job.get('message')}")
time.sleep(5)
# Step 1: Create job and get presigned URL
RESPONSE=$(curl -s -X POST https://prod.visionapi.unsiloed.ai/v2/parse/upload \
-H "api-key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"file_name": "report.pdf",
"use_high_resolution": true,
"layout_analysis": "smart_layout_detection",
"ocr_strategy": "auto_detection",
"extract_strikethrough": false,
"merge_tables": false
}')
JOB_ID=$(echo "$RESPONSE" | jq -r '.job_id')
UPLOAD_URL=$(echo "$RESPONSE" | jq -r '.upload_url')
# Step 2: Upload file
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: application/pdf" \
--data-binary @report.pdf
# Step 3: Poll for results
curl -X GET "https://prod.visionapi.unsiloed.ai/parse/$JOB_ID" \
-H "api-key: your-api-key"
{
"job_id": "a3f1c2d4-7e8b-4a9f-b2c1-123456789abc",
"upload_url": "https://upload.visionapi.unsiloed.ai/uploads/a3f1c2d4.../report.pdf?signature=...",
"expires_at": "2025-10-22T07:06:16Z",
"upload_method": "PUT",
"upload_headers": {
"Content-Type": "application/pdf"
},
"credit_used": 0,
"quota_remaining": 1000
}
| Feature | v1 (POST /parse) | v2 (POST /v2/parse/upload) |
|---|---|---|
| File delivery | Through API server | Direct via presigned URL |
| Max file size | Limited by server upload | Up to 5 GB via direct PUT |
| Upload speed | Bottlenecked by API server | Full client bandwidth |
| Concurrency | Shared server capacity | No server contention |
| Best for | Quick uploads, small files | Large files, high volume |
| Status | Cause | Action |
|---|---|---|
400 | Invalid or missing file_name, unsupported extension | Fix file_name and retry |
401 | Missing or invalid api-key | Check your API key |
402 | Insufficient quota — not enough page credits remaining | Add page credits to your account |
403 | Access has been revoked | Contact support |
429 | Rate limit exceeded | Back off and retry after 1 second |
500 | Internal server error | Retry with exponential backoff |
503 | Job queue is at capacity | Back off and retry after the Retry-After header value |
403 on upload | Missing or wrong headers, expired URL | Check upload_headers, get a new URL |
Job status Failed | Processing error | Check message field in the status response |
API key for authentication. Use 'Bearer <your_api_key>'
Request body for POST /v2/parse/upload. Configuration fields mirror the existing /parse multipart form fields.
File name with extension. Required. Determines content-type.
Enable per-segment agentic OCR for higher accuracy. Pass "standard" or "advanced".
JSON object for chunk processing configuration.
Detect checkboxes in document images. Defaults to false.
Error handling strategy: Continue (default) or Fail.
Seconds until the task and its output are deleted.
Export format(s) to generate after processing. Currently supported: ["docx"].
File format for exporting parsed results. When specified in a parse request,
the pipeline generates the requested export file after processing completes.
The exported file is available via the exports field in the task response.
docx Extract structured data from charts and graphs. Defaults to false.
Transfer text color from the PDF text layer to OCR results. Defaults to false.
Attach hyperlink URLs from PDF annotations to OCR results. Defaults to false.
Preserve strikethrough formatting in HTML/Markdown output. Defaults to false.
Layout analysis strategy: smart_layout_detection (default) or page_by_page.
JSON object for LLM processing configuration.
Maximum number of tables per merge group. Groups larger than this are split. Defaults to 20.
Merge tables that span multiple pages into a single unified structure. Defaults to false.
OCR engine: UnsiloedHawk (default, recommended), UnsiloedBeta, or UnsiloedStorm.
OCR strategy: auto_detection (default) or force_ocr.
JSON object controlling which output fields are included in the response.
Page range to process. Formats: "1-5", "2,4,6", "[1,3,5]". Defaults to all pages.
Segment filter: comma-separated segment types to keep, or "all". Defaults to "all".
JSON object for segment processing/analysis configuration.
Segment type naming convention: Unsiloed (default) or Other.
Use high-resolution images for cropping and post-processing. Defaults to true.
JSON array of segment types to validate with VLM. Example: ["Table","Formula"].
Legacy: validate table segments using VLM. Prefer validate_segments instead.
Extract and hyperlink bibliography citations in the markdown output. Defaults to false.
Upload URL created
Response from POST /v2/parse/upload.
Number of page credits deducted (initial reservation, reconciled on upload).
RFC 3339 timestamp when upload_url expires.
Use this ID to poll GET /parse/{job_id} for status.
Remaining page credits after deduction.
Headers the client MUST include in the PUT request.
Show child attributes
Always "PUT".
S3 presigned PUT URL. Valid until expires_at.