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.