
Vaquill AI — India
Provided by Vaquill AI
Structured, section-level access to Indian legislation: 64,000+ acts across Central, State and regulatory sources (745,000+ individually addressable sections) spanning all 41 Indian jurisdictions. Sourced from official publishers only (India Code, state gazettes, and 50 regulator sites including RBI, SEBI, IRDAI, TRAI, CCI).
Added: September 14, 2026 · Last updated: October 26, 2026
- Jurisdiction
- India
- Practice area
- General practice
- Category
- Legislation
- Documents in this database
- 64,179
- Founded
- 2026
- Pricing
- Paid
- Connection type
- MCP
- Promo code
THOMASMOREVQ2020% off
Ask Vaquill AI — India
Ask a legal question — get an answer sourced directly from Vaquill AI — India.
Sign in to ask this database a question directly.
Available tools (37)
?
fetchEnabled
Fetch one Indian enactment by the `id` from a `search` result, returning `{id, title, text, url, metadata}`. Also accepts a source URL or a bare path. NOTE: the India corpus serves an enactment as publisher links rather than inline text, so `text` carries the title and `metadata` carries the PDF, HTML and plain-text URLs to read. Prefer `get_act_text` if you can call it.
Enabled
get_act_amendmentsEnabled
The amendment history recorded against one enactment: substitutions, insertions and omissions, each with the amending Act and its effective date (e.g. 'Subs. by Act 22 of 2023, s. 44 (w.e.f. 13-11-2025)'). Use to check whether a provision still reads as enacted before relying on its text. An empty list means no amendment was recorded, NOT that the Act was never amended. Cost: 5 credits.
Enabled
get_act_sectionEnabled
Metadata for one provision, including its citation, position in the act, structural features and references. Use when identifying or inspecting a provision without fetching its wording. Text is not included. Use get_act_section_body to read it. wordCount covers all passages, and actsReferenced normalizes whitespace before deduplication so publisher line breaks do not create duplicate acts. Cost: 2 credits.
Enabled
get_act_section_bodyEnabled
The publisher's full text for one provision, taken directly from the act document without synthesized search headers. Use when reading, quoting or citing the provision's wording rather than its metadata. Amendments are not applied to this text. Check get_section_history for recorded changes before treating the wording as current law. Cost: 3 credits.
Enabled
get_act_statusEnabled
An act's standing in three separate fields, publisherStatus for India Code's label, servedStatus for API availability and repealClaim for the publisher's sourced repeal record. Use when assessing whether an act remains law or why it is unavailable. These are not one verdict. A repealClaim does not verify that the repealing instrument was brought into force. Cost: 1 credit.
Enabled
get_act_structureEnabled
An act's table of contents, with chapters and parts where the publisher supplies them and provisions listed beneath. Use when locating a section or planning a traversal of the act. hasHierarchy is false for most acts, where nodes is a flat section list rather than an error. Section numbers sort numerically with alphabetic suffixes attached. Cost: 2 credits.
Enabled
get_act_textEnabled
Source links for one enactment: the plain-text, PDF and HTML renderings, plus how many sections it holds. Use when the user wants to read or cite the Act itself rather than a matched section. Cost: 3 credits.
Enabled
get_corresponding_provisionsEnabled
Map a repealed Indian criminal code to the 2023 code that replaced it, section by section: IPC to BNS and CrPC to BNSS, in force from 1 July 2024. Pass either side ('ipc' or 'bns' both work). Use whenever a source, a pleading or the user cites an old section number, so you answer under the provision actually in force rather than the repealed one. 'iea'/'bsa' return 404 until that mapping lands. Cost: 1 credit.
Enabled
get_coverageEnabled
India corpus counts for acts and provisions, broken down by jurisdiction, regulator and status, plus coverage depth. Use when checking whether the corpus supports a question before searching or interpreting an empty result. The depth block distinguishes text coverage from much thinner parsed amendment coverage. actsClaimingAmendmentsWithoutEvents marks missing records, not an absence of amendments. Free.
Enabled
get_pricing_inEnabled
Credit-to-price conversion and per-endpoint costs for the India legislation API, billed in US dollars. Use when estimating a workflow or comparing endpoint charges. Set region to US for United States primary-law pricing instead. Both surfaces use the same API key and account-wide credit balance. No authentication is required.
Enabled
get_section_historyEnabled
Recorded amendments to one provision, including the changing Act and section, effective dates and replaced wording where published. Use when tracing changes or checking whether published text reflects later amendments. An empty history can mean no changes or no parsed records, as coverage explains. Read appliedStatus on every event. Amendments are not applied to served text. Cost: 2 credits.
Enabled
india_act_cited_byEnabled
Paged inbound citations from provisions elsewhere in the corpus that name an act. Use when finding provisions that mention the act, rather than following its outbound references. Matching uses the act's title, not its identifier, so title variants and line breaks can be missed. Read matchBasis and treat results as a floor. total counts distinct citing provisions across all pages. Cost: 2 credits.
Enabled
india_act_definitionsEnabled
Extracted defined terms and their defining provisions, plus a separate definitionSections list. Use when a question turns on an act's own meaning of a term. Extraction covers only a minority of acts, so an empty result does not mean the act defines nothing. definitionSections identifies provisions to read even without extracted terms. terms is paged, but definitionSections is not. Cost: 2 credits.
Enabled
india_act_subordinateEnabled
Paged rules, regulations, notifications and orders the publisher records as made under an act. Use when looking beyond the parent statute to its subordinate instruments. Matching uses the parent's title, not parent_act_id, which is an India Code identifier that does not address this corpus. Check matchBasis. total counts distinct instruments across all pages, while returned counts rows on this page. Cost: 2 credits.
Enabled
india_section_referencesEnabled
Outbound citations from a provision to other enactments and sections of its own act. Use when following references outwards, not finding citations to the act. actId identifies served targets, while resolved false marks coverage gaps rather than parse failures. Results are not paged. totalActs and totalSections give full counts, so check truncated before treating returned references as complete. Cost: 2 credits.
Enabled
list_act_filtersEnabled
Self-describing filter vocabulary: every category, state, department and status the acts corpus actually holds, with counts. Call this before filtering, so a query uses a value that exists instead of returning empty because the spelling was wrong.
Enabled
list_actsEnabled
Browse and filter enactments rather than searching their text: by jurisdiction (central or a state), issuing regulator, year and status. Use when the user wants to know WHAT exists in an area before asking what it says, or to confirm an Act's exact title before citing it. Cost: 1 credit.
Enabled
resolve_india_citationEnabled
The provision named by an Indian legal citation, accepting common abbreviations and flexible element order. Use when a user provides a citation rather than a research topic, such as s.302 IPC, O. 39 R. 1 CPC or Art. 21 of the Constitution. Subsection and clause references are supported. Malformed citations are rejected rather than reported as not found. Cost: 2 credits.
Enabled
resolve_india_citations_batchEnabled
Provision resolutions for a list of Indian legal citations, using the same resolver as resolve_india_citation. Use when several citations need resolving without individual calls. Accepts up to 50 distinct citations and 500 entries before deduplication. One citation failing does not invalidate the others. Unknown request fields are rejected rather than ignored. Cost: 2 credits.
Enabled
searchEnabled
Generic corpus search over Indian Central and State legislation, returning `{id, title, url}` records for citation. Present so this server works in clients that require the standard search/fetch pair. Prefer `search_acts` if you can call it: it filters by category, state, year and status. Pair with `fetch` to read a result.
Enabled
search_actsEnabled
Search Indian legislation down to the individual section: Central and State Acts plus the instruments of the principal regulators (SEBI, RBI, MCA, IRDAI, TRAI, DGFT). Use for any 'what does Indian law say' question. Supports boolean and phrase queries; filters by category, state, year and status. Returns sections with title, chapter and a sourceUrl pointing at the publisher's own document. The returned actId (e.g. 'IND_central_2065') feeds every acts tool. Cost: 2 credits.
Enabled
create_documentDisabled
Starts translating a file you uploaded with `POST /in/translation/files`. **Charged in pages, when the translation finishes.** Submitting costs nothing. The job spends one translation page per physical page of the document, once, on completion, and a job that fails spends nothing. **Authentication:** a `vq_key_` key holding `translate:write`. A wildcard (`*`) key includes it. ## Asynchronous You get `202 Accepted`, a `documentId` and a `Location` header. Poll `GET /in/translation/documents/{id}` until `status` is `completed` (or `failed`), then download with `GET /in/translation/documents/{id}/content`. Documents take from seconds to several minutes depending on length. ## What is checked before the job is queued Everything refusable is refused before anything is queued: an unsupported language (read `GET /in/translation/languages`), an unknown `outputFormat`, `courtStyle` or `engine`, an unknown or foreign `fileId` (404) and an insufficient balance (402). The balance check uses the page count recorded at upload. For `pdf` and `docx` that is exact. For images and plain text the count is not known until the job runs, so the check only confirms you hold at least one page; if the real count is higher than your balance the job ends `failed` with `INSUFFICIENT_TRANSLATION_PAGES` and you are not charged. Reading a scanned document is included in those translation pages: this route never spends pages from the separate OCR pool. ## Formatting the output `courtStyle` renders the translation to an Indian court's mandated paper, font, margins and line spacing (Supreme Court and nine High Courts). Omit it for the compact reader-friendly layout, which is about 45% fewer pages. The font mandate applies when `targetLanguage` is English; an Indic target is always set in Noto Sans, because the mandated Latin faces carry no Devanagari, while paper size, margins and spacing still apply. Tables, figures and document structure are preserved on every job. That is the default path, not an option, so there is no flag to set. `handwritten: true` routes extraction through a vision model that reads handwriting far better than the default OCR, at a higher cost per page to us. Page billing is unchanged either way. Leave it false for born-digital or clean typed documents, where the default is both cheaper and as accurate. `engine` selects the translation model: omit it for `gpt54` (recommended), `gpt54mini` for cheaper and faster work on simple text, `sarvam` for Indic languages. Billing does not change with the engine. ## Removing stamps and signatures Stamp, seal and signature images can be dropped from the rendered output. This is an ACCOUNT setting rather than a per-job field, so it applies to every job this account submits, through the API and the web app alike. Set it once in your Anuvad profile and this route honours it. Images are classified and only removed above a confidence threshold, so an unclear mark is kept rather than guessed away. ## No URLs This route does not accept a URL, only a `fileId`. A `sourceFileUrl` field is a 422. ## Duplicates Submitting the same `fileId` with the same languages and format again while the first job is still running returns that job (still `202`) instead of starting a second one. Once it has finished, the same request starts a new job.
Disabled
get_act_versionsDisabled
Every state of an act's text that the weekly corpus sync has recorded, oldest first, with the one served today marked `isCurrent`. **Cost: 1 credit.** Refunded when the act is unknown or the version archive cannot be read. Pass a `versionId` to `?version=` on `GET /acts/{actId}/sections/{n}` or `GET /acts/{actId}/sections/{n}/body` to read the provision as it stood in that version. **`observedFrom` and `observedTo` are NOT legal effective dates.** They are when the corpus sync observed the publisher's text in that state. A provision may have been in force long before we first saw it, and a change we observed on a Sunday may have commenced months earlier. An act the sync has not yet recorded a history for returns one version, `initial`, built from the passages we hold today: `observedFrom` is the earliest time any of them was ingested and `observedTo` is null. `source` says which case you are looking at.
Disabled
get_changesDisabled
The act-level change feed of the weekly corpus sync: which acts were newly loaded, had their text replaced, or had their amendment record or metadata updated, run by run, oldest first. **Cost: 1 credit.** Refunded when the feed cannot be read, and when no run has published one yet. Page with `cursor`: pass the `nextCursor` of one page as the `cursor` of the next, unchanged. Store the last one you processed and you will see every change exactly once. `since` (YYYY-MM-DD) starts the feed at the first run swept on or after that date. Each `changes` row carries the act's `versionId` after the change; read the prior text with `GET /acts/{actId}/versions` and `?version=`. `withdrawnCandidates` are items the publisher no longer lists. They are reported, never applied: the act is still served until a person decides. Dates are when the sync observed the publisher's text, not legal effective dates.
Disabled
get_documentDisabled
Returns the status of a document translation job. **Free.** Never charged, so poll as often as the rate limit allows. A sensible cadence is every 2 to 5 seconds. **Authentication:** a `vq_key_` key holding `translate:read`. ## Status | `status` | Meaning | | --- | --- | | `pending` | Queued, not started. | | `processing` | Being translated. `progress` runs from 0 to 100. | | `completed` | Done. Download it from `/content`. `pagesCharged` is set. | | `failed` | Not translated and not charged. See `error.code`. | `pagesCharged` is `null` until the job completes, because pages are charged once, on completion. ## Errors `error.code` is `INSUFFICIENT_TRANSLATION_PAGES` (your balance did not cover the document when it was processed) or `TRANSLATION_FAILED`. Neither charges you. ## Example ```bash curl https://api.vaquill.ai/api/v1/in/translation/documents/$DOCUMENT_ID \ -H "Authorization: Bearer $VAQUILL_API_KEY" ```
Disabled
get_document_contentDisabled
Downloads the translated file once the job has completed. **Free.** Never charged, and downloading again never charges again. **Authentication:** a `vq_key_` key holding `translate:read`. ## Bytes, not a link The file is streamed through this API. The response body IS the file: there is no URL to follow, nothing that expires, and nothing to forward. Send the same `Authorization` header you use for every other call. ## Which file you get By default, the format you asked for in `outputFormat`. A job submitted with `outputFormat=pdf` also produces a Word copy when one could be generated; add `?format=docx` to download it. `?format=pdf` asks for the PDF explicitly. If the format you ask for does not exist for this job the answer is 404. `Content-Type` and `Content-Disposition` (an attachment with a filename) are set from the file. `ETag` is supported (`If-None-Match` gives `304`) and so is `Range` (`206`) for plain, unencrypted files, so an interrupted download can resume. ## Not finished While `status` is not `completed` this is a 404. Poll the status route first. ## Example ```bash curl -o translated.pdf \ https://api.vaquill.ai/api/v1/in/translation/documents/$DOCUMENT_ID/content \ -H "Authorization: Bearer $VAQUILL_API_KEY" ```
Disabled
get_india_credit_balanceDisabled
The account-wide spendable credit balance shared by the India and United States APIs. Use for pre-flight checks or low-balance alerts from an India workflow. This returns the same balance as get_credit_balance, not a separate India allowance. Check bySource before assuming credits will last. Subscription credits expire at the period end. Free.
Disabled
get_page_balanceDisabled
Returns the translation and OCR pages this API key's account can spend now. **Free.** Never charged, so you can poll it to drive alerting or a pre-flight check without the check itself costing you anything. Like the credit balance, it is designed to still answer when the answer is "nothing": at a zero balance a metered call 402s and tells you nothing, which is the moment the number matters most. **Authentication:** a `vq_key_` key holding `translate:read`. ## Pages, not characters This product bills physical pages. A page of text is 2,000 characters; a page of a document is a page of that document. Nothing here is counted in tokens. ## Two pools, and which one this API spends `translation` and `ocr` are separate balances, not two views of one number. **Translating a document, scanned or not, spends translation pages only.** Reading a scan is included in that price: this API does not charge you OCR pages for it. Budget from the `translation` pool. The `ocr` pool exists for standalone text extraction, which is a separate operation this API surface does not currently expose. It is reported here so the figure is visible to an account that holds OCR pages, not because a translation call will draw on it. ## Your free allowance applies here too Pages are pooled per ACCOUNT, not per credential, so the monthly free allowance your account holds is spendable through the API as well. A charge draws on `free` before `paid`, which means the first pages of a month can cost nothing and leave `paid` untouched. Budget from `pagesRemaining`, which is `free` plus `paid`. Budgeting from `paid` alone understates what you can spend. ## Separate from API credits Translation pages and API credits are different currencies on different ledgers. `GET /credits/balance` reports credits for the primary-law endpoints and says nothing about pages; this endpoint reports pages and says nothing about credits. Neither pays for the other. ## Pages are pooled per organization If your key belongs to an organization, these figures are the ORGANIZATION's pooled balance, not your personal one. Every member spends from the same pool, so a colleague's large job changes what you see here. ## Example ```bash curl https://api.vaquill.ai/api/v1/in/translation/balance \ -H "Authorization: Bearer $VAQUILL_API_KEY" ``` ```json { "translation": { "pagesRemaining": 1480, "free": 0, "paid": 1480, "totalPurchased": 2000, "totalConsumed": 520 }, "ocr": { "pagesRemaining": 310, "free": 0, "paid": 310, "totalPurchased": 500, "totalConsumed": 190 }, "pagesArePhysical": true, "asOf": "2026-11-01T12:34:56Z" } ```
Disabled
get_regulatory_coverageDisabled
Read this before trusting an empty result anywhere else. A search returns nothing both when the publisher published nothing and when we have not reached that publisher for a fortnight, and only this route tells those apart. **Cost: free.** It lists the valid `publisherId` and `sourceId` values for every other `/reg` route. Monitoring began 2026-08-23, so nothing earlier exists here, and coverage is not uniform across publishers: read an empty result together with `GET /reg/sources` rather than as 'nothing was published'. Nothing returned states whether a document is in force or superseded. A null `sourceCheckedAt` means the source has not been checked yet, never that it was checked and is fine.
Disabled
get_regulatory_documentDisabled
The full record for one document. The body, the capture history and the diff are each opt in with `include`, because a body averages about 8,400 characters and most callers do not want it. **Cost: 1 credit**, whichever `include` values are asked for. Refunded when the call fails, and when the id names no document. `include=diff` compares the two most recent captures. When one side has no extracted text, `delta.bodyComparable` is false and the line counts are null: a diff of nothing is not a diff of zero changes.
Disabled
get_regulatory_document_fileDisabled
The publisher's original file as we archived it: usually a PDF, sometimes HTML or an image. Returns the bytes, not JSON, as an attachment. **Cost: 1 credit.** Refunded when the call fails, including when no file was ever archived. Check `fileAvailability` on the document first. `available` means this route serves the file. `not_archived` means we only ever read the listing, and this route answers 404 `content_not_archived`: do not retry it. A 502 `archive_unavailable` is a different fact: we hold the file and cannot read it right now, so retrying may help. Where we hold no copy, `publisherFileUrl` on the document is the publisher's own link.
Disabled
list_languagesDisabled
Returns every language this API can translate from and to. **Free.** Never charged, so you can call it at start-up or on a schedule to keep your own list current. It is rate limited like every other key-authenticated route. **Authentication:** a `vq_key_` key holding `translate:read`. ## Read this instead of hard-coding the list A code you invent is refused with a 422 before any page is charged, and the error names what is supported. Reading the list means a language we add works on your side with no change, and it means you never pay to discover a typo. Regional tags are accepted and narrowed to the language, so `hi-IN` is read as `hi`. You do not need to strip them yourself. ## Scope English plus the 22 languages of the Eighth Schedule to the Constitution of India. These are the languages Indian courts and governments work in, and each one is backed by script support in rendered output. `auto` appears in this list as a SOURCE only. There is no translating into an undetermined language, so sending it as `targetLanguage` is a 422 that says so. ## Direction is not decoration `direction` is `rtl` for Urdu, Sindhi and Kashmiri. Honour it when you render a language's own name and when you display translated output, or a correct translation is shown wrongly. ## Example ```bash curl https://api.vaquill.ai/api/v1/in/translation/languages \ -H "Authorization: Bearer $VAQUILL_API_KEY" ```
Disabled
list_page_packsDisabled
Returns the page packs you can buy, and what they cost. **Free.** Never charged, so you can poll it to keep your own price list current. **Authentication:** a `vq_key_` key holding `translate:read`. ## Pages are sold in INR only Translation pages are bought in Indian rupees with GST, through Razorpay. There is no USD price for a page, which is why the translation rows in `GET /api/v1/api-credits/pricing` carry `usdCost: 0` and `unit: "page"`. That zero means "not priced in dollars", not "free". This route is where the real price lives. Pages are also a separate ledger from API credits. Credits do not buy pages and pages do not pay for primary-law calls. ## Every money field is in paise `priceInr`, `baseInr` and `gstInr` are in paise, 1/100 of a rupee, which is the unit the payment is charged in. `priceInr` is GST-inclusive and is the amount you pay. Only `pricePerPageInr` is in rupees, and it is a display figure. Read this list rather than hard-coding a price. Larger packs are cheaper per page, and both pools (`translation` and `ocr`) have their own packs. ## Example ```bash curl https://api.vaquill.ai/api/v1/in/translation/packs \ -H "Authorization: Bearer $VAQUILL_API_KEY" ```
Disabled
list_regulatory_changesDisabled
An append only feed of corpus events: a document we had not seen (`new`), a new capture of one we had (`rechanged`, carrying the current text), or one the publisher removed from its listing (`retracted`). **Cost: 1 credit.** Refunded when the call fails. To follow this feed, call once with `since` (or with neither), then pass the previous response's `nextCursor` as `cursor` from then on. Do not resume from `observedAt`: timestamps here are not monotonic, so a timestamp resume can skip rows for good. `cursor` together with `since` is a 400. `total` is always `null` on this feed. It is walked, not sized, and null is not zero. Monitoring began 2026-08-23, so nothing earlier exists here, and coverage is not uniform across publishers: read an empty result together with `GET /reg/sources` rather than as 'nothing was published'. Nothing returned states whether a document is in force or superseded.
Disabled
list_regulatory_documentsDisabled
One route for searching and listing. With `q` it runs a full text search over titles and extracted bodies and returns a marked `excerpt`. Without `q` it lists in date order. Scope filters apply with or without `q`. **Cost: 1 credit.** Refunded when the call fails. Fetch several known documents in one call with a repeated `id`. `total` is one of three things: a number (measured), `null` (not measured), or `0` (genuinely empty). Null is not zero. Walk with `nextCursor` until `hasMore` is false. Send a list as a repeated key (`?publisherId=4&publisherId=7`). A comma separated value is a 400 and is not charged. Monitoring began 2026-08-23, so nothing earlier exists here, and coverage is not uniform across publishers: read an empty result together with `GET /reg/sources` rather than as 'nothing was published'. Nothing returned states whether a document is in force or superseded.
Disabled
translate_textDisabled
Translates a piece of text and returns it in the same response. **Charged in pages.** See the cost rules below. A failed translation is refunded in full. **Authentication:** a `vq_key_` key holding `translate:write`. A wildcard (`*`) key includes it. ## Pages, not characters This product bills pages. A page of text is 2,000 characters, and the cost is `ceil(characters / 2000)`. | Characters | Pages | | --- | --- | | 1 to 2,000 | 1 | | 2,001 to 4,000 | 2 | | 50,000 | 25 | **Any non-empty text costs at least 1 page.** Unlike the dashboard, there is no free floor on SIZE here: a 10-character request spends a page. Empty or whitespace-only text is a 422 and costs nothing. That is about size, not about your allowance. Your account's monthly free pages are spendable through the API, and a charge draws on them first, so a short request can still cost you nothing out of pocket. ## When you are charged and when you are not Everything that can be checked up front is checked BEFORE the charge, and a refusal costs nothing: an unsupported language (read `GET /in/translation/languages` instead of hard-coding it), text over 50,000 characters (a 422, never a truncation) and empty text. If your balance cannot cover the pages you get a 402 and nothing is translated. Once charged, if the translation fails or comes back empty the pages are refunded and you get an error. You are never billed for a translation you did not receive. ## Retries Send an `Idempotency-Key` header. A retry of the same request with the same key returns the original response and does not charge again. ## Limits Text is at most 50,000 characters, because this route holds the connection open while the translation runs. Anything longer belongs on the document routes. ## Example ```bash curl -X POST https://api.vaquill.ai/api/v1/in/translation/translations \ -H "Authorization: Bearer $VAQUILL_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"text": "The petitioner submits that the impugned order is contrary to law.", "targetLanguage": "hi", "sourceLanguage": "en"}' ``` ```json { "translatedText": "याचिकाकर्ता का निवेदन है कि आक्षेपित आदेश विधि के विरुद्ध है।", "detectedLanguage": "en", "targetLanguage": "hi", "pagesCharged": 1, "charCount": 66 } ```
Disabled
upload_fileDisabled
Uploads a source file and returns a `fileId` to translate it with. **Free.** Never charged: pages are spent when a translation finishes, not on upload or retrieval, so a file you never translate costs nothing. **Authentication:** a `vq_key_` key holding `translate:write`. A wildcard (`*`) key includes it. ## Why this route exists `POST /in/translation/documents` does not accept a URL. It accepts the `fileId` returned here, which refers to a file this API stored for your account. That is deliberate: the API never fetches an address you name, so it cannot be pointed at an internal service or at someone else's document. A `fileId` from another account is a 404. ## Limits - Types: `pdf`, `docx`, `txt`, `jpg`, `jpeg`, `png`, `tif`, `tiff`, `webp`, `bmp`. - Size: at most 150 MB, and not empty. - A `fileId` is valid for 24 hours. You can translate one file into several languages by posting `/documents` more than once with the same `fileId`. ## `pageCount` Physical pages for `pdf` and `docx`, which is what you will be charged. For images and plain text it is `null`: their page count is only known when the job runs, and `POST /documents` can then only check you hold at least one page. ## Example ```bash curl -X POST https://api.vaquill.ai/api/v1/in/translation/files \ -H "Authorization: Bearer $VAQUILL_API_KEY" \ -F "file=@petition.pdf" ``` ```json { "fileId": "3f2c9a52-8d2e-4a43-9e0b-5b6a1c7d9f10", "filename": "petition.pdf", "sizeBytes": 482113, "pageCount": 12, "expiresAt": "2026-11-02T12:34:56Z" } ```
Disabled

