> For clean Markdown of any page, append `.md` to the page URL. > For a complete documentation index, see https://docs.sarvam.ai/llms.txt. > For full documentation content in one file, see https://docs.sarvam.ai/llms-full.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.sarvam.ai/_mcp/server. # Trigger Export POST https://api.sarvam.ai/translate/document/jobs/{job_id}/export Enqueue an async export for one target language. Returns `202 Accepted` with `export_state=Pending`. Poll `GET /translate/document/jobs/{job_id}/export/status` until `export_state` is `Completed`, then download from `download_url`. * When `format` is omitted, the export uses the uploaded file's native format. * **PDF uploads** may optionally set `format` to `pdf`, `docx`, `html`, `txt`, or `epub`. * **Microsoft Office uploads** always export in the original format only (for example, xlsx in → xlsx out). * Optional `fit_line_height` / `fit_font_shrink` tune PDF/DOCX shrink-to-fit. * Returns `409` when an export for the same language and format is already `Pending` or `Running`. Reference: https://docs.sarvam.ai/api-reference/translate-document/doc-translation-trigger-export ## Authentication - `api-subscription-key` header (required) — API Key authentication via header ## Request ### Path parameters - `job_id` (string, required) — The `job_id` returned by POST /translate/document/jobs. ### Query parameters - `lang` (enum, required) — BCP-47 target language code (e.g. `hi-IN`). - Allowed values: `as-IN`, `bn-IN`, `brx-IN`, `doi-IN`, `en-IN`, `gu-IN`, `hi-IN`, `kn-IN`, `ks-IN`, `kok-IN`, `mai-IN`, `ml-IN`, `mni-IN`, `mr-IN`, `ne-IN`, `or-IN`, `pa-IN`, `sa-IN`, `sat-IN`, `sd-IN`, `ta-IN`, `te-IN`, `ur-IN` - `format` (enum, optional) — Optional target export format. When omitted, defaults to the uploaded file's native format. - **PDF uploads:** may be set to `pdf` (default), `docx`, `html`, `txt`, or `epub`. - **Microsoft Office uploads** (`.doc`, `.docx`, `.xls`, `.xlsx`, `.ppt`, `.pptx`, and related formats): always export in the original format only; other values are rejected. - Allowed values: `pdf`, `docx`, `html`, `txt`, `epub` - `fit_line_height` (boolean, optional) — When true, the export may reduce line spacing to fit translated text within the original layout. PDF/DOCX only. - `fit_font_shrink` (boolean, optional) — When true, the export may reduce font size to fit translated text within the original layout. PDF/DOCX only. ## Response ### 202 Export enqueued. - `export_id` (string, required) — Unique export job identifier. - `job_id` (string, required) — The job this export belongs to. - `target_language_code` (string, required) — BCP-47 code of the exported file. - `format` (string, required) — Output format (e.g. pdf, docx, xlsx). - `export_state` (enum, required) — Current state of the export: `Pending`, `Running`, `Completed`, or `Failed`. - Allowed values: `Pending`, `Running`, `Completed`, `Failed` - `created_at` (string, required) — Export creation timestamp. - `download_url` (string, optional, nullable) — Signed download URL when export_state is Completed. - `filename` (string, optional, nullable) — Output filename. - `file_size` (integer, optional, nullable) — Output file size in bytes. - `expires_in_hours` (integer, optional, nullable) — Hours until the download URL expires. - `error_message` (string, optional, nullable) — Sanitized failure reason when export_state is Failed. - `completed_at` (string, optional, nullable) — Export completion timestamp. Present when `export_state` is `Completed` or `Failed`. - `progress` (integer, optional, nullable) — 0–100 for PDF/DOCX page render; omitted for other formats. - `pages_completed` (integer, optional, nullable) — Pages rendered so far (PDF/DOCX with page-level render). - `pages_total` (integer, optional, nullable) — Total pages in the export render pass. ## Errors ### 400 Bad Request Error Bad Request — Unsupported export format or invalid language code. - `error` (Sarvam_Model_API_ErrorDetails, required) — Error details ### 401 Unauthorized Error Unauthorized. Send a valid `api-subscription-key`. - `error` (Sarvam_Model_API_ErrorDetails, required) — Error details ### 404 Not Found Error Not Found — No job exists for this job_id. - `error` (Sarvam_Model_API_ErrorDetails, required) — Error details ### 409 Conflict Error Export already in progress for this language and format. - `error` (Sarvam_Model_API_ErrorDetails, required) — Error details ### 500 Internal Server Error Internal Server Error - `error` (Sarvam_Model_API_ErrorDetails, required) — Error details ### 503 Service Unavailable Error Service Unavailable — Export enqueue failed. Please retry. - `error` (Sarvam_Model_API_ErrorDetails, required) — Error details ## Types ### Sarvam_Model_API_ErrorDetails - `request_id` (string, required, nullable) - `message` (string, required) — Message describing the error - `code` (enum, required) — Error code for the specific error that has occurred. Refer to the error code documentation for more details. - Allowed values: `invalid_request_error`, `internal_server_error`, `unprocessable_entity_error`, `insufficient_quota_error`, `invalid_api_key_error`, `authentication_error`, `not_found_error`, `rate_limit_exceeded_error`, `model_call_error`, `gateway_timeout_error`, `billing_service_unavailable_error` ## Examples **Response** ```json { "export_id": "exp_1a2b3c4d", "job_id": "550e8400-e29b-41d4-a716-446655440000", "target_language_code": "hi-IN", "format": "pdf", "export_state": "Pending", "created_at": "2026-08-04T10:10:00Z" } ``` **SDK Code** ```python from sarvamai import SarvamAI client = SarvamAI(api_subscription_key="YOUR_SARVAM_API_KEY") export = client.document_translation.trigger_export( job_id="550e8400-e29b-41d4-a716-446655440000", lang="hi-IN", ) print(f"export_id={export.export_id} state={export.export_state}") ``` ```typescript import { SarvamAIClient } from "sarvamai"; const client = new SarvamAIClient({ apiSubscriptionKey: process.env.SARVAM_API_KEY, }); const jobId = "550e8400-e29b-41d4-a716-446655440000"; const exportJob = await client.documentTranslation.triggerExport(jobId, { lang: "hi-IN", }); console.log(`export_id=${exportJob.export_id} state=${exportJob.export_state}`); ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.sarvam.ai/translate/document/jobs/550e8400-e29b-41d4-a716-446655440000/export?lang=hi-IN" req, _ := http.NewRequest("POST", url, nil) req.Header.Add("api-subscription-key", "") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://api.sarvam.ai/translate/document/jobs/550e8400-e29b-41d4-a716-446655440000/export?lang=hi-IN") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["api-subscription-key"] = '' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://api.sarvam.ai/translate/document/jobs/550e8400-e29b-41d4-a716-446655440000/export?lang=hi-IN") .header("api-subscription-key", "") .asString(); ``` ```php request('POST', 'https://api.sarvam.ai/translate/document/jobs/550e8400-e29b-41d4-a716-446655440000/export?lang=hi-IN', [ 'headers' => [ 'api-subscription-key' => '', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://api.sarvam.ai/translate/document/jobs/550e8400-e29b-41d4-a716-446655440000/export?lang=hi-IN"); var request = new RestRequest(Method.POST); request.AddHeader("api-subscription-key", ""); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["api-subscription-key": ""] let request = NSMutableURLRequest(url: NSURL(string: "https://api.sarvam.ai/translate/document/jobs/550e8400-e29b-41d4-a716-446655440000/export?lang=hi-IN")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ```