{"openapi":"3.1.0","info":{"title":"Beer-Lambert Spectroscopy API","version":"1.0.0","description":"Beer–Lambert spectroscopy maths as an API, computed locally and deterministically. The beer-lambert endpoint applies the law A = ε·c·l, where absorbance equals the molar absorptivity times the concentration times the optical path length: give any three of the four and it solves for the fourth (the path length defaults to the standard 1 cm cuvette when omitted), and it always reports the matching transmittance and percent transmittance. The transmittance endpoint converts between absorbance and transmittance in both directions, A = −log₁₀(T) and T = 10^(−A), and accepts a fraction or a percentage. The calibration endpoint reads a concentration off a linear calibration curve, A = slope·c + intercept, solving for the concentration from a measured absorbance or for the expected absorbance from a concentration. Units are whatever you supply consistently — for molar absorptivity in M⁻¹cm⁻¹, a path length in cm and absorbance dimensionless, the concentration comes out in molar. Everything is computed locally and deterministically, so it is instant and private. Ideal for analytical-chemistry and lab tools, spectrophotometer and assay apps, biotech and education software, and quality-control calculators. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 3 endpoints. This is Beer–Lambert spectroscopy; for solution dilution and molarity use a dilution API and for chemical compound data use a chemistry API.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/beerlambert-api","description":"oanor gateway"}],"tags":[{"name":"Spectroscopy"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/beer-lambert":{"get":{"operationId":"get_v1_beer_lambert","tags":["Spectroscopy"],"summary":"A = ε·c·l solver","description":"","parameters":[{"name":"absorbance","in":"query","required":false,"description":"Absorbance A","schema":{"type":"string"}},{"name":"molar_absorptivity","in":"query","required":false,"description":"Molar absorptivity ε","schema":{"type":"string"},"example":"6220"},{"name":"concentration","in":"query","required":false,"description":"Concentration c","schema":{"type":"string"},"example":"0.0001"},{"name":"path_length","in":"query","required":false,"description":"Path length l (default 1 cm)","schema":{"type":"string"},"example":"1"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"A = ε·c·l.","absorbance":0.622,"solved_for":"absorbance","path_length":1,"concentration":0.0001,"transmittance":0.23878113,"molar_absorptivity":6220,"percent_transmittance":23.878113},"meta":{"timestamp":"2026-06-04T10:18:58.045Z","request_id":"762920ab-fb41-40ff-9083-6eb3decff34d"},"status":"ok","message":"A = ε·c·l solver","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/calibration":{"get":{"operationId":"get_v1_calibration","tags":["Spectroscopy"],"summary":"Linear calibration concentration","description":"","parameters":[{"name":"slope","in":"query","required":true,"description":"Calibration slope","schema":{"type":"string"},"example":"5000"},{"name":"intercept","in":"query","required":false,"description":"Intercept (default 0)","schema":{"type":"string"},"example":"0.02"},{"name":"absorbance","in":"query","required":false,"description":"Measured absorbance (to get c)","schema":{"type":"string"},"example":"0.52"},{"name":"concentration","in":"query","required":false,"description":"Or concentration (to get A)","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"mode":"absorbance_to_concentration","note":"c = (A − intercept) / slope.","slope":5000,"intercept":0.02,"absorbance":0.52,"concentration":0.0001},"meta":{"timestamp":"2026-06-04T10:18:58.142Z","request_id":"dbeed38b-f850-4091-87b1-4ff8d151f4d2"},"status":"ok","message":"Linear calibration concentration","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/transmittance":{"get":{"operationId":"get_v1_transmittance","tags":["Spectroscopy"],"summary":"Absorbance ↔ transmittance","description":"","parameters":[{"name":"absorbance","in":"query","required":false,"description":"Absorbance A","schema":{"type":"string"},"example":"1"},{"name":"transmittance","in":"query","required":false,"description":"Or transmittance T (0-1)","schema":{"type":"string"}},{"name":"percent_transmittance","in":"query","required":false,"description":"Or %T","schema":{"type":"string"}}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"mode":"absorbance_to_transmittance","absorbance":1,"transmittance":0.1,"percent_transmittance":10},"meta":{"timestamp":"2026-06-04T10:18:58.238Z","request_id":"0f89f4af-cc1e-4ce4-9a59-3e8980b6fb2c"},"status":"ok","message":"Absorbance <-> transmittance","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Spec","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"api":"beerlambert","note":"Beer–Lambert spectroscopy maths — computed locally and deterministically, no key, no third-party service. Path length defaults to 1 cm; units are whatever you supply (consistently).","endpoints":["/v1/beer-lambert","/v1/transmittance","/v1/calibration","/v1/meta"]},"meta":{"timestamp":"2026-06-04T10:18:58.316Z","request_id":"f614a14c-eea4-495b-97a2-06483c138a94"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":2000,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":500,"monthly_call_quota":25000,"rps_limit":5,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":1500,"monthly_call_quota":150000,"rps_limit":15,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":4900,"monthly_call_quota":750000,"rps_limit":40,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/beerlambert-api"}