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
Validate Job
/api/validate-jobThe POST API endpoint /validate-job runs the same validation as /submit-job, but without submitting the job and at no cost. Use it as a pre-flight check before /submit-job: send the type and settings you plan to submit, and it reports whether the payload is valid, and if not, which fields are missing or wrong.
Parameters:
type
(string, required)
The tool name to validate against, for example "esmfold". Use a name from GET /tools.
settings
(object, required)
The settings object you plan to submit. Keys must match the tool's schema. Use a single object here; to check a batch, validate one representative job.
jobName
(string, optional)
If provided, validate-job also checks that the name is not already taken, so you can catch the conflict before submitting.
Reading the response: the request returns 200; check the valid field. When valid is true, normalized is your settings with defaults filled in, ready to pass straight to /submit-job. When valid is false, error is the first problem to fix; fix it and validate again until it passes. missing_fields lists required inputs still needed (each with an example), but can be empty when the validator stops at the first error.
HTTP Response Status Codes
| Status code | Description |
|---|---|
| 200 | Validation ran - read the "valid" field in the response body |
| 400 | Missing or incorrect API key |
| 405 | Method not allowed |
1import requests
2
3api_key = "***************"
4headers = {'x-api-key': api_key}
5base_url = "https://app.tamarind.bio/api/"
6
7# Same "type" and "settings" you plan to submit. "settings" is a single object,
8# and its keys must match the tool's schema from GET /tools.
9params = {
10 "type": "esmfold",
11 "settings": {
12 "sequence": "MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQ"
13 }
14}
15result = requests.post(base_url + "validate-job", headers=headers, json=params).json()
16
17if result["valid"]:
18 # result["normalized"] is exactly what to submit (defaults filled in)
19 requests.post(base_url + "submit-job", headers=headers, json={
20 "jobName": "myJobName",
21 "type": params["type"],
22 "settings": result["normalized"],
23 })
24else:
25 print(result["error"])
26 print([f["name"] for f in result.get("missing_fields", [])])Response Format
1{
2 "valid": true,
3 "normalized": {
4 "sequence": "MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQ"
5 },
6 "source": "tools-v2-global"
7}