API Documentation

Search Jobs

POST/api/jobs/search

The 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:
jobNames(array of strings, required)

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".

organization(boolean, optional)

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.

jobEmail(string, optional)

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 codeDescription
200Lookup ran - found names are in "jobs", the rest in "notFound"
400No names, an empty or over-long name, or more than 1000 names
401Application authentication failed
403Gateway authentication failed, or account access policy forbids the request
422The body is not an object with a "jobNames" list, or has an unknown field
503A 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}