Transcriptions — Poll / Retrieve
curl --request GET \
--url https://api.linqalpha.com/v2/transcriptions/{job_id} \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.linqalpha.com/v2/transcriptions/{job_id}"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.linqalpha.com/v2/transcriptions/{job_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.linqalpha.com/v2/transcriptions/{job_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.linqalpha.com/v2/transcriptions/{job_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.linqalpha.com/v2/transcriptions/{job_id}")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linqalpha.com/v2/transcriptions/{job_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"error": null,
"payload": {
"job_id": "5a1d3f6e-9c2b-4e7a-8f10-6b2c3d4e5f60",
"status": "processing"
}
}
Transcriptions
Transcriptions — Poll / Retrieve
Step 3. Reads stored state only; never restarts processing. 200 for any owned job including failed ones; 404 for unknown or foreign jobs, and for jobs whose stored files have been deleted (one year after the job finishes). Signed artifact URLs expire after expires_in seconds — call again for fresh ones.
GET
/
v2
/
transcriptions
/
{job_id}
Transcriptions — Poll / Retrieve
curl --request GET \
--url https://api.linqalpha.com/v2/transcriptions/{job_id} \
--header 'X-API-KEY: <api-key>'import requests
url = "https://api.linqalpha.com/v2/transcriptions/{job_id}"
headers = {"X-API-KEY": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-KEY': '<api-key>'}};
fetch('https://api.linqalpha.com/v2/transcriptions/{job_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.linqalpha.com/v2/transcriptions/{job_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.linqalpha.com/v2/transcriptions/{job_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.linqalpha.com/v2/transcriptions/{job_id}")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.linqalpha.com/v2/transcriptions/{job_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"error": null,
"payload": {
"job_id": "5a1d3f6e-9c2b-4e7a-8f10-6b2c3d4e5f60",
"status": "processing"
}
}
Step 3. Reads stored job state; it never restarts processing. Returns
Poll every 30–60 seconds and honor
200 for any job your organization owns, including failed ones, and 404 for unknown or foreign jobs.
curl --request GET \
--url 'https://api.linqalpha.com/v2/transcriptions/<job_id>' \
--header 'X-API-KEY: <api-key>'
Status values
| status | meaning |
|---|---|
queued | accepted, waiting to start |
processing | speech-to-text or translation running |
succeeded | every requested step completed (terminal) |
failed | a requested step failed (terminal) |
Retry-After. Stop on succeeded or failed.
Result
On successpayload.result carries the versioned segment list plus signed download URLs:
segments[]:start_seconds,end_seconds,speaker(speaker_1,speaker_2, … consistent within the job when the speech-to-text provider labels speakers;nullotherwise),language(code of the original speech),text(raw speech-to-text output, always preserved, no cleanup applied),translated_text(requested language, ornullwhen notarget_languagewas given).artifacts:raw_text,raw_json(speech-to-text output with no cleanup applied) and, when translation was requested and at least one segment was translated,translated_text,translated_json. Each has a signedurlandexpires_in(1 hour). CallGETagain to receive fresh URLs.
Errors
Job-level failures sit inpayload.error (the envelope’s top-level error stays null, because the lookup itself succeeded):
| payload.error.code | meaning |
|---|---|
TRANSCRIPTION_FAILED | audio could not be transcribed; no result |
TRANSLATION_FAILED | speech-to-text succeeded but translation failed. result.segments is retained with translated_text: null for the segments that failed |
Translation quality is best effort. Missing or invalid translation output is reported with
TRANSLATION_FAILED and translated_text: null for the affected segments. The original text is always preserved.Polling notes
- Polls do not count against your organization’s transcription limit; only
POST /v2/transcriptions/uploadsandPOST /v2/transcriptionsdo. - Uploaded audio is deleted 90 days after it is uploaded, and a job’s results and artifacts one year after the job finishes. Deletion can happen up to a day later. Download the results you need to keep. After deletion,
GETanswers404for the job, and a new submission for an upload whose audio has been deleted answers404(upload the file again). 503with the envelope’s top-levelerror.codeTRANSCRIPTION_RESULT_UNAVAILABLEmeans the job reached a terminal status but its stored result could not be read at that moment. The job is unchanged: wait for theRetry-Afterseconds in the response and callGETagain. Asucceededjob is never answered without itsresult; afailedjob may have none (see the table above). A500withTRANSCRIPTION_GET_FAILon a terminal job means the stored result could not be read in a way polling will not fix; contact support with thejob_id.
Was this page helpful?