Ingest API quickstart
Upload a file and start an ingest job in three HTTP calls.
May 21, 2026
The Ingest API turns a raw file (PDF, image, audio, text) into a searchable document in your Vulgate Library. It's a two-step process: upload the file, then start an ingest job.
The full reference lives at /docs/ingest/overview. This guide walks through the minimum needed to upload your first file from code.
Step 1 — Request a signed upload URL
Vulgate uses signed storage URLs so file uploads bypass the API server entirely. First, request a URL from /api/uploads:
curl -G "https://vulgate.ai/api/uploads" \
-H "Authorization: Bearer $VULGATE_API_KEY" \
--data-urlencode "name=research-paper.pdf" \
--data-urlencode "type=application/pdf"
Response:
{
"url": "https://...signed-storage-url...",
"method": "PUT",
"headers": {
"content-type": "application/pdf",
"x-amz-meta-name": "research-paper.pdf"
}
}
Keep the file ID returned in the headers (x-amz-meta-name along with the path part of the URL) — you'll need it in step 3. The signed URL is valid for a short window.
Step 2 — Upload the file to the signed URL
Send the file body as a PUT to the signed URL with the headers from step 1. Don't include the Vulgate auth header here — the signature handles auth:
curl -X PUT "<signed-url-from-step-1>" \
-H "Content-Type: application/pdf" \
-H "X-Amz-Meta-Name: research-paper.pdf" \
--data-binary @research-paper.pdf
The storage service responds with HTTP 200 and no body when successful.
Step 3 — Start an ingest job
Tell Vulgate to start processing the uploaded file by POSTing to /api/jobs with the file ID from step 1:
curl -X POST "https://vulgate.ai/api/jobs" \
-H "Authorization: Bearer $VULGATE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"files": [{ "id": "<file-id-from-step-1>" }]
}'
The job runs in the background. Once it completes, the document is searchable — call the Search API or Chat API to interact with it.
Multipart uploads for large files
The single-file flow above works well for typical files. For very large files, use the multipart endpoints (POST /api/uploads). See Uploading files for the full reference.
Related
Search help