Load documents as text
Load up to 200 documents as text into a batch you can check claims and drafts against, when you hold the text rather than the files.
Last updated 12 September 2026
Load documents as text
POST https://api.quorumtech.ch/attest/v1/batch
Loads up to 200 documents, supplied as text, into a batch that later checks can run against.
Prefer POST /attest/v1/batches with the original files where you have them: parsing on the
server means a citation points at something the server actually read.
Batches live in memory only and age out on a timer. Delete a batch once the work is done.
Use this when the documents already exist as text in your system: extracted pages, transcripts, records. If you hold the original files, upload them instead, so the server parses them and each document gets a fileHash that proves what was checked.
Give each document an id you can recognise in citations (letters, digits, dot, dash and underscore, at most 64 characters) and a title for the explanations. scope describes what the evidence set covers, in a sentence, and helps the review tell an out-of-scope claim from an unsupported one. It describes the evidence, never the claims.
The batch lives in memory on one server and expires after six hours. Delete it when the work is done.
{
"name": "FY2025 reporting pack",
"scope": "The group's FY2025 annual report and the Q4 trading update.",
"documents": [
{
"id": "annual-report-2025",
"title": "FY2025 Annual Report",
"content": "Group revenue for FY2025 was CHF 94.0m, up from CHF 82.0m in the prior year. Operating margin improved to 18%. The auditor is KPMG Zurich."
},
{
"id": "q4-trading-update",
"title": "Q4 FY2025 trading update",
"content": "Fourth-quarter revenue was CHF 26.1m. Headcount at year end was 412, up from 380."
}
]
}
Request
A JSON body with these fields:
| Field | Type | Required | Description |
| --- | --- | --- | --- |
| name | string | no | At most 200 characters. |
| scope | string | no | What this evidence set covers. Describes the evidence, not the claims. At most 2,000 characters. |
| documents | object[] | yes | 1 to 200 items. |
| documents[].id | string | no | At most 64 characters. Pattern ^[A-Za-z0-9_.-]+$. |
| documents[].title | string | no | At most 500 characters. |
| documents[].publishedAt | string | no | At most 64 characters. |
| documents[].content | string | yes | |
Example request
curl -X POST "https://api.quorumtech.ch/attest/v1/batch" \
-H "Authorization: Bearer $QUORUM_API_KEY" \
-H "content-type: application/json" \
-d '{
"name": "FY2025 reporting pack",
"scope": "The group'\''s FY2025 annual report and the Q4 trading update.",
"documents": [
{
"id": "annual-report-2025",
"title": "FY2025 Annual Report",
"content": "Group revenue for FY2025 was CHF 94.0m, up from CHF 82.0m in the prior year. Operating margin improved to 18%. The auditor is KPMG Zurich."
},
{
"id": "q4-trading-update",
"title": "Q4 FY2025 trading update",
"content": "Fourth-quarter revenue was CHF 26.1m. Headcount at year end was 412, up from 380."
}
]
}'
Responses
201
The batch is loaded and ready to check against.
| Field | Type | Description |
| --- | --- | --- |
| batchId | string | |
| documents | BatchDocument[] | |
| documents[].id | string | |
| documents[].title | string | |
| documents[].spans | integer | How many citable spans the document parsed into. |
| spans | integer | |
| totalChars | integer | |
| batchHash | string | |
| createdAt | string (date-time) | |
Errors
The body is { "error": { "code", "message" } }; the full catalogue with what to do about each code is on the Errors page.
| Status | Codes | When |
| --- | --- | --- |
| 400 | | The request does not match the schema. error.issues names each failing field. |
| 401 | | The key is missing, not recognised, or revoked. |
| 402 | payment_required, credits_exhausted, remaining, needed | The workspace has no active API subscription (payment_required), or is prepaid and has no credits left for this request (credits_exhausted, with remaining and needed). Manage billing and add credits at https://developer.quorumtech.ch/billing. |
| 403 | | The key is not scoped to Attest. |
| 413 | | The batch exceeds the size the server holds in memory. |
| 429 | rate_limited, claims_rate_limited, claim_budget_exhausted, monthly_cap_reached, cap | Over the key's requests-per-minute limit (rate_limited), its claims-per-minute ceiling (claims_rate_limited), its claims-per-day budget (claim_budget_exhausted), or, for a postpaid workspace, its monthly credit cap (monthly_cap_reached, with cap and resetsAt). Retry-After says when to try again; the daily budget resets at midnight UTC and the cap on the first of the month. |
Cost
Free. Loading documents costs no credits; the claims checked against the batch are charged when they are checked.
Related articles
Fetch a page in one call
The same work as the extract call, with the request held open until the page is done and the Markdown returned directly.
Watch an extraction
Server-sent events for one job: its state now, every change after it, and the finished page. Closes when the job does.
Read an extraction's progress
One frame of a job's state without its Markdown, for a progress bar that should not carry a page's text with every poll.
Collect an extraction
Poll a job that answered 202. Returns its state while it runs and the Markdown once it is done.
Still need help?
Ask Quincy in the chat bubble below, or write to support@quorumtech.ch and we will help you directly.