Developer reference
Calculation API
Version 1 exposes the same deterministic engine operations used by calculator pages. Send JSON with an explicit mode and units; responses include version and request metadata.
Request contract
Send POST requests with Content-Type: application/json. Anonymous request policy is provisional. Bodies are read incrementally with a 16 KB limit before schema and operation-specific complexity validation.
POST /api/v1/formula
Parse and normalize a molecular formula.
Request
{
"formula": "C8H10N4O2"
}Response data
{
"canonicalFormula": "C8H10N4O2",
"charge": "0",
"elements": {
"C": "8",
"H": "10",
"N": "4",
"O": "2"
},
"explicitNuclides": {},
"totalAtoms": "24",
"versions": {
"formulaEngine": "0.1.0"
}
}POST /api/v1/molecular-weight
Calculate average, exact, monoisotopic, and nominal formula masses.
Request
{
"formula": "C8H10N4O2"
}Response data
{
"averageMolecularMass": "194.194",
"dataVersions": {
"PubChem-periodic-table+NIST-isotopes": "2026-08-28"
},
"elementMassPercentages": {
"C": "49.480416490725769076",
"H": "5.1906856030567370774",
"N": "28.851560810323696922",
"O": "16.477337095893796925"
},
"exactMass": "194.08037557916",
"molarMassGramsPerMole": "194.194",
"monoisotopicMass": "194.08037557916",
"nominalMass": "194",
"totalAtoms": "24",
"versions": {
"formulaEngine": "0.1.0"
}
}POST /api/v1/balance
Balance a reaction using exact rational conservation.
Request
{
"equation": "H2 + O2 -> H2O"
}Response data
{
"coefficients": [
"2",
"1",
"2"
],
"equation": "2 H2 + O2 → 2 H2O",
"rowLabels": [
"H",
"O"
],
"rows": [
[
"2",
"0",
"-2"
],
[
"0",
"2",
"-1"
]
],
"versions": {
"equationEngine": "0.1.0"
}
}POST /api/v1/molarity
Solve one explicit molarity mode with typed units.
Request
{
"amountUnit": "mol",
"mode": "moles-volume",
"moles": "1",
"volume": "2",
"volumeUnit": "L"
}Response data
{
"molarityMolesPerLiter": "0.5",
"moles": "1",
"steps": [
"Normalized amount to moles and volume to liters.",
"Applied M = n / V to the moles-volume solve mode."
],
"versions": {
"solutionEngine": "0.1.0",
"unitEngine": "0.1.0"
},
"volumeLiters": "2"
}POST /api/v1/dilution
Solve one unknown in C1V1 = C2V2.
Request
{
"concentrationUnit": "M",
"finalConcentration": "1",
"finalVolume": "10",
"stockConcentration": "10",
"unknown": "stockVolume",
"volumeUnit": "L"
}Response data
{
"diluentVolumeLiters": "9",
"finalConcentrationMolesPerLiter": "1",
"finalVolumeLiters": "10",
"stockConcentrationMolesPerLiter": "10",
"stockVolumeLiters": "1",
"steps": [
"Normalized concentration and volume units.",
"Solved stockVolume from C1V1 = C2V2.",
"Computed diluent as final volume minus stock volume."
],
"versions": {
"solutionEngine": "0.1.0",
"unitEngine": "0.1.0"
}
}POST /api/v1/stoichiometry
Normalize mixed reactant quantities and find the limiting reagent.
Request
{
"equation": "H2 + O2 -> H2O",
"productIndex": 0,
"reactants": [
{
"quantity": {
"mode": "mass",
"unit": "g",
"value": "4.032"
},
"speciesIndex": 0
},
{
"quantity": {
"mode": "moles",
"unit": "mol",
"value": "2"
},
"speciesIndex": 1
}
]
}Response data
{
"availableExtentMoles": "1",
"coefficients": [
"2",
"1",
"2"
],
"equation": "2 H2 + O2 → 2 H2O",
"excess": [
{
"remainingMoles": "1",
"speciesIndex": 1
}
],
"limitingReactantIndexes": [
0
],
"maximumProductMoles": "2",
"productIndex": 0,
"versions": {
"constants": "9.0",
"equationEngine": "0.1.0",
"stoichiometryEngine": "0.1.0"
}
}Error envelope
Expected input or chemistry issues return a 4xx response. Unexpected failures return a request ID without a stack trace.
{
"error": {
"code": "validation_failed",
"issues": [
{
"message": "Formula is required.",
"path": [
"formula"
]
}
],
"message": "Request validation failed.",
"requestId": "00000000-0000-4000-8000-000000000000"
}
}