API Documentation
Overview
Python SDK Reference
End to End example
List custom tools
Get a custom tool
Create a custom tool
Update a custom tool
Delete a custom tool
Create a source upload
Build a custom tool
List build logs
Cancel a custom tool build
Run a custom tool
Publish a custom tool version
List custom tool versions
Search Jobs
/api/jobs/searchThe POST API endpoint /jobs/search looks up to 1000 jobs by name in one request. Send a list of job names and it returns each job's status, plus the names that don't match any job. Use it instead of calling GET /jobs?jobName= once per job: for example, to check which jobs in a campaign already exist before you resubmit, or to poll a set of jobs until they finish.
Parameters:
The exact names of the jobs to look up, up to 1000 per request. Jobs from /submit-batch are named after their batch, for example "myBatchName-myJobName".
Look the names up across your organization's jobs instead of only your own. This searches your organization's job list, which does not include batch child jobs.
Look the names up among the jobs of another member of your organization.
Reading the response: jobs has one entry for each name that matched a job, with its JobStatus and timestamps; when several jobs share a name, you get the newest. notFound lists the names that matched no job, so when you are resuming a campaign, these are the jobs you still need to submit. statuses counts the returned jobs by status. Each entry leaves out the job's Settings, Score, AggregationError and resultUrl; to get those, look the job up with GET /jobs?jobName=.
HTTP Response Status Codes
| Status code | Description |
|---|---|
| 200 | Lookup ran - found names are in "jobs", the rest in "notFound" |
| 400 | No names, an empty or over-long name, or more than 1000 names |
| 401 | Application authentication failed |
| 403 | Gateway authentication failed, or account access policy forbids the request |
| 422 | The body is not an object with a "jobNames" list, or has an unknown field |
| 503 | A dependency required by the Jobs API is unavailable |
1import requests
2
3api_key = "***************"
4headers = {'x-api-key': api_key}
5base_url = "https://app.tamarind.bio/api/"
6
7# The names to look up. This list can be as long as you need.
8job_names = ["myJobName", "myOtherJobName"]
9
10found, not_found = [], []
11for i in range(0, len(job_names), 1000): # up to 1000 names per request
12 response = requests.post(base_url + "jobs/search", headers=headers,
13 json={"jobNames": job_names[i:i + 1000]})
14 response.raise_for_status()
15 result = response.json()
16 found.extend(result["jobs"])
17 not_found.extend(result["notFound"])
18
19for job in found:
20 print(job["JobName"], job["JobStatus"])
21print("No job with these names:", not_found)Response Format
1{
2 "jobs": [
3 {
4 "JobName": "myJobName",
5 "JobStatus": "Complete",
6 "Type": "immunebuilder",
7 "Started": "2025-12-12 05:38:29",
8 "Completed": "2025-12-12 05:38:44",
9 "Created": "2025-12-12 05:38:03",
10 "TamarindSchemaVersion": "v3",
11 "WeightedHours": 0.01
12 }
13 ],
14 "notFound": [
15 "myOtherJobName"
16 ],
17 "statuses": {
18 "Complete": 1,
19 "In Queue": 0,
20 "Running": 0,
21 "Stopped": 0
22 }
23}