ChiralCall API v1
Predict the active enantiomer of chiral molecules via a simple REST API. Built by Arroway Sciences.
Overview
ChiralCall API v1 enables programmatic access to enantiomer predictions across 50 compound classes spanning pharmaceuticals and agrochemicals. Predictions are based on a proprietary first-principles computational method with 98.5% accuracy verified against 1,051 compounds with published active enantiomer data (Wilson 95% CI: 97.7%–99.0%).
Submit a SMILES string with a valid API key and receive immediate predictions including the active enantiomer (R or S), confidence level, and compound class information.
Authentication
All requests to the ChiralCall API require authentication via an API key passed in the X-API-Key header.
X-API-Key: your_api_key_here
Generate and manage API keys on the API Keys dashboard.
Endpoint
POST
/api/v1/predict
Submit a molecule and receive a prediction for the active enantiomer.
Rate Limits
Academic (.edu)
100/mo
Free forever
Founding Customer
Unlimited
$9,995/year
Enterprise
Custom
SLA + dedicated support
Rate limits are applied per API key. Exceeding your limit returns 429 Too Many Requests with a Retry-After header.
Batch Predictions
Submit hundreds or thousands of compounds in a single request. Send a JSON array of SMILES strings and receive structured results with per-compound confidence scores, compound class statistics, and explanations.
Endpoint
POST
/api/predict/batch
Request Format
POST /api/predict/batch
Content-Type: application/json
X-API-Key: sk_live_...
{
"smiles": [
"CC(C)Cc1ccc(cc1)[C@@H](C)C(=O)O",
"OC(=O)[C@@H](c1ccc(F)cc1)C1CCNCC1",
"O=C1CN=C(c2ccccc2)c2cc(Cl)ccc2N1"
]
}Response Format
{
"ok": true,
"count": 3,
"results": [
{
"input_smiles": "CC(C)Cc1ccc(cc1)[C@@H](C)C(=O)O",
"ok": true,
"family": "arylpropionic-acid",
"family_label": "Arylpropionic acid (profen NSAID)",
"active_enantiomer": "S",
"confidence_score": 94.2,
"confidence_tier": "very_high",
"scope": "validated",
"drug_class_stats": {
"n_validated": 28,
"n_correct": 28,
"accuracy": "100.0%",
"wilson_ci_lower": 87.7,
"kc_tier": "T1"
}
},
...
],
"elapsed_ms": 200
}Each result in the array includes the same fields as a single prediction response, plus drug_class_stats with per-compound-class validation metrics. Ideal for CRO workflows processing hundreds of compounds per batch.
Request Format
Request Body (JSON)
{
"smiles": "CC(C)Cc1ccc(cc1)[C@@H](C)C(=O)O",
"store": false,
"contribute": false
}smiles (required)
SMILES string representing the input molecule. Stereo markers (@, @@) are preserved.
store (optional)
Boolean. If true, the query is stored for internal analysis (anonymized). Default: false.
contribute (optional)
Boolean. If true and store is true, the prediction is shared to improve model training. Default: false.
Response Format
Successful Response (200 OK)
{
"ok": true,
"input_smiles": "CC(C)Cc1ccc(cc1)[C@@H](C)C(=O)O",
"canonical_smiles": "CC(C)Cc1ccc([C@@H](C)C(=O)O)cc1",
"family": "arylpropionic-acid",
"family_label": "Arylpropionic acid (profen NSAID)",
"active_enantiomer": "S",
"confidence": 0.98,
"scope": "validated",
"notes": "Matched known compound: S-Ibuprofen. S enantiomer is the active form in the Arylpropionic acids family.",
"elapsed_ms": 50
}Out-of-Scope Response (200 OK)
{
"ok": true,
"input_smiles": "CCCCCCc1ccccc1",
"canonical_smiles": "CCCCCCc1ccccc1",
"scope": "out-of-scope",
"notes": "No validated family matched. This compound falls outside our current prediction scope.",
"elapsed_ms": 50
}Response Fields
ok
Boolean indicating whether the request was processed successfully.
input_smiles
The SMILES string as provided in the request.
canonical_smiles
RDKit-canonicalized SMILES for the input molecule.
family
Machine-readable family identifier (e.g., "arylpropionic-acid").
family_label
Human-readable family label (e.g., "Arylpropionic acid (profen NSAID)").
active_enantiomer
The predicted active enantiomer: "R", "S", or null (out-of-scope).
confidence
Confidence score from 0 to 1. Known compounds: 0.82–0.99. Out-of-scope: null.
scope
Scope classification: "validated", "exploratory", or "out-of-scope".
notes
Human-readable explanation of the result.
elapsed_ms
Approximate request processing time in milliseconds (bucketed).
Code Examples
cURL
curl -X POST https://chiralcall.com/api/v1/predict \
-H "X-API-Key: sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"smiles": "CC(C)Cc1ccc(cc1)[C@@H](C)C(=O)O"
}'Python
import requests
api_key = "sk_live_..."
url = "https://chiralcall.com/api/v1/predict"
response = requests.post(
url,
headers={"X-API-Key": api_key},
json={"smiles": "CC(C)Cc1ccc(cc1)[C@@H](C)C(=O)O"}
)
if response.status_code == 200:
result = response.json()
print(f"Active enantiomer: {result['active_enantiomer']}")
print(f"Family: {result['family_label']}")
print(f"Confidence: {result['confidence']}")
else:
print(f"Error: {response.status_code}")
print(response.json())JavaScript / Node.js
const apiKey = "sk_live_...";
const url = "https://chiralcall.com/api/v1/predict";
const response = await fetch(url, {
method: "POST",
headers: {
"X-API-Key": apiKey,
"Content-Type": "application/json",
},
body: JSON.stringify({
smiles: "CC(C)Cc1ccc(cc1)[C@@H](C)C(=O)O",
}),
});
if (response.ok) {
const result = await response.json();
console.log("Active enantiomer:", result.active_enantiomer);
console.log("Family:", result.family_label);
console.log("Confidence:", result.confidence);
} else {
console.error("Error:", response.status, await response.json());
}Rate Limits
Rate limits are determined by your plan and are returned in response headers.
Free Tier
10 requests / month
Standard Plan
Unlimited requests
Enterprise
Custom limits & support
Response headers include X-RateLimit-Limit and X-RateLimit-Remaining.
Error Codes
401 Unauthorized
Missing, empty, or invalid X-API-Key header. Verify your API key is correct and valid.
400 Bad Request
Malformed request: invalid JSON, missing "smiles" field, or invalid SMILES string. Check your request format.
429 Too Many Requests
You have exceeded the rate limit for your plan. Wait before making additional requests.
500 Internal Server Error
An unexpected error occurred. Retry with exponential backoff. Contact support if the issue persists.
Storage Modes
Stateless (Default)
No data is retained. Set store: false or omit the field. Requests are processed without any logging or persistence beyond transient API logs.
Store Mode
Set store: true. The query is stored (anonymized) for internal analysis and reporting. No model retraining occurs.
Contribute Mode
Set store: true and contribute: true. Your query is shared with the ChiralCall research team to improve model accuracy. Your contribution helps advance chiral prediction science.
Questions about the API? Check out our FAQ or contact us.
ChiralCall API v1 • Last updated April 2026 • Predictions are for research use only.