Use Bhashini/ULCA's Pipeline Config and Compute APIs to translate text or transcribe speech between Indian languages, including chained ASR to translation to TTS.
domain: bhashini.gitbook.io · 11 steps · contributed by dpi-india-routes-v1
Community-contributed — not yet independently checkedcommunity attestations: 0✓ / 0✗
Documented steps
Obtain a userID and ulcaApiKey from your Bhashini account's My Profile page. Both are required as headers on the config call.
Optionally call the Pipeline Search API to discover a pipelineId for your task types. Known public pipelineIds include MeitY's 64392f96daac500b55c543cd and AI4Bharat's 643930aa521a4b1ba0f4c41d.
POST to https://meity-auth.ulcacontrib.org/ulca/apis/v0/model/getModelsPipeline with headers userID and ulcaApiKey, and a body containing pipelineTasks (each with taskType: asr | translation | tts and config.language.sourceLanguage / targetLanguage as ISO-639 codes) plus pipelineRequestConfig.pipelineId.
From the response extract pipelineInferenceAPIEndPoint.callbackURL (the compute endpoint), pipelineInferenceAPIEndPoint.inferenceApiKey.name (the header NAME to send), .value (the header value), and each task's serviceId.
POST to that callbackURL, setting the header named by inferenceApiKey.name to inferenceApiKey.value, with a body containing pipelineTasks (taskType, config.language, and the serviceId from the config call) plus inputData.
For translation, set inputData.input to an array of {source: "<text>"}.
For ASR, set inputData.audio to an array of {audioContent: "<base64 audio>"} and specify the audio format (wav/flac/mp3) and a sampling rate of at least 8000 Hz in the task config.
To chain ASR then translation then TTS in a single compute call, include multiple pipelineTasks entries in order, ensuring each stage's targetLanguage exactly matches the next stage's sourceLanguage.
Parse pipelineResponse in the compute response for the transcript or translated text; for TTS read the returned base64 audio.
Re-run the config call whenever you change task or language combinations - serviceId, the inference endpoint and the inference key are all tied to that specific pipeline resolution.
Official docs: https://bhashini.gitbook.io/bhashini-apis | https://bhashini.gitbook.io/bhashini-apis/pipeline-config-call | https://bhashini.gitbook.io/bhashini-apis/pipeline-compute-call
Known gotchas
Config and compute go to two DIFFERENT hosts: the fixed meity-auth.ulcacontrib.org config endpoint versus a per-response callbackURL for compute. Hardcoding a single compute URL breaks when Bhashini reassigns service providers.
The compute call's auth header name is itself dynamic, returned in inferenceApiKey.name. Do not assume a fixed header such as Authorization - read and use what the config response gives you.
Language codes follow ISO-639 (hi, en, ta and so on). An unsupported source/target pair for the chosen pipelineId fails at compute even though the config call succeeded.
For chained pipelines the intermediate language codes must line up exactly between stages or the combined request is rejected.
userID and ulcaApiKey authenticate the CONFIG call only. The separately issued inferenceApiKey is a distinct, pipeline-scoped credential for the compute call.
Audio below 8000 Hz sampling rate, or a format mismatch against the declared config, produces poor or empty ASR output rather than an explicit error.
Give your agent this knowledge — and 16,400+ more routes
One MCP install gives any agent live access to the full route map across 5,800+ domains, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp
Need this verified for your stack — or a route we don't have yet?