API Documentation
    Setup

    Overview

    Overview and rate limits

    API Key

    Setup, limits, and trial keys

    MCP Server

    Connect AI assistants to Tamarind tools

    SDK

    The tamarind Python library — jobs, tools, and files

    CLI

    Run Tamarind from your terminal, scripts, or agents
    GET

    View available tools and configurations

    Submit Jobs
    Job Management
    GET

    List and inspect jobs

    POST

    Look up many jobs by name in one request

    POST

    Download job results

    DELETE

    Delete jobs and associated data

    POST

    Stop running or queued jobs

    File Management
    Pipelines
    Custom Tools
    Finetuning
    Assays

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 = "insert-api-key-here"
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}