Recover a Batch submission
curl --request GET \
--url https://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key} \
--header 'Authorization: <authorization>'import requests
url = "https://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}', 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://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$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://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_bodyAPI
Recover a Batch submission
Check ingestion or recover an accepted job after an uncertain submission response.
GET
/
v1
/
batch-submissions
/
{idempotency_key}
Recover a Batch submission
curl --request GET \
--url https://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key} \
--header 'Authorization: <authorization>'import requests
url = "https://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}', 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://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$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://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://your-sutro-deployment.example.com/v1/batch-submissions/{idempotency_key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_bodyUse this read-only endpoint after an
idempotent Batch submission.
The key is scoped to the authenticated owner and deployment. Reading its state
never submits inference.
HTTP
Require
string
required
The submission’s UUID, written in canonical lowercase form.
string
required
Deployment API key in the form
Key YOUR_SUTRO_API_KEY.curl --fail-with-body \
"${SUTRO_API_URL%/}/v1/batch-submissions/889b580e-90ee-4c47-9949-1ae63c6dcb76" \
-H "Authorization: Key $SUTRO_API_KEY"
States
A known reservation returns HTTP200. Inspect status and retryable even
when the HTTP request succeeded.
| State | Meaning | Next step |
|---|---|---|
INGESTING, retryable: false | The deployment is retaining and validating input. | Keep polling this key. |
INGESTING, retryable: true | The ingestion lease expired. | Replay the original submission with the same key and pinned object. |
RETRYABLE, retryable: true | A transient ingestion failure occurred. | Replay with the same key; refresh the signed GET URL if necessary. |
FAILED, retryable: false | Input retention or validation failed terminally. | Inspect code and available detail, correct the problem, and intentionally use a new key. |
ACCEPTED | The original job was created. | Monitor results as the job ID; do not submit another job. |
{
"status": "ACCEPTED",
"idempotency_key": "889b580e-90ee-4c47-9949-1ae63c6dcb76",
"results": "job-12345678-1234-1234-1234-1234567890ab",
"metadata": {
"job_id": "job-12345678-1234-1234-1234-1234567890ab",
"message": "Job created successfully"
}
}
404 means this key has no reservation visible to the current owner in
this deployment. Keep the same key when replaying an uncertain submission.
The existing job status endpoint reports execution
after acceptance; an accepted submission is not a completed job.
Check deployment capabilities
Before using durable submissions, readGET /v1/batch-capabilities with the
same deployment key:
curl --fail-with-body "${SUTRO_API_URL%/}/v1/batch-capabilities" \
-H "Authorization: Key $SUTRO_API_KEY"
{
"idempotent_submission": 1,
"submission_owner_id": "22222222-2222-4222-8222-222222222222",
"input_formats": ["csv", "parquet", "jsonl"],
"result_formats": ["parquet"]
}
idempotent_submission: 1 and the formats your client uses. Upgrade an
older deployment before submitting; do not fall back to an ordinary submission
when relying on safe replay. The
Python SDK and
CLI perform this check.
The CLI also preserves a local submission receipt automatically; Python callers
persist their key and request configuration.
submission_owner_id is the stable authenticated account ID. The CLI binds new
receipts to it and verifies it before replaying an unresolved submission, so API
key rotation for the same owner works while switching owners cannot create
another job from the saved source.