Skip to content
GET /v1/so2

SO2 free vs molecular + dose

Try it live

10 free calls per day — no sign-up, no API key. Goes through the oanor gateway.

Custom headers (optional)
api.oanor.com/winemaking-api

It works. Grab an API key and use it in your project.

Get an API key

Code snippets

curl "https://api.oanor.com/winemaking-api/v1/so2" \
  -H "x-oanor-key: oanor_test_..."
await fetch("https://api.oanor.com/winemaking-api/v1/so2", {
  headers: { "x-oanor-key": "oanor_test_..." }
});
$ch = curl_init("https://api.oanor.com/winemaking-api/v1/so2");
curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-oanor-key: oanor_test_..."]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$out = curl_exec($ch);
import requests
requests.get(
    "https://api.oanor.com/winemaking-api/v1/so2",
    headers={"x-oanor-key": "oanor_test_..."}
)

Example response

A real response from this endpoint, captured by the latest health check.

{
    "data": {
        "note": "Molecular SO2 = free SO2 / (1 + 10^(pH−1.81)); aim for ~0.8 mg/L molecular. KMS (metabisulfite) is 57.6% SO2; a campden tablet ≈ 0.44 g KMS. Lower pH needs far less free SO2.",
        "inputs": {
            "ph": 3.4
        },
        "kms_grams": 0.7613,
        "so2_to_add_mgL": 21.924,
        "campden_tablets": 1.73,
        "target_free_so2_mgL": 31.924,
        "current_free_so2_mgL": 10,
        "molecular_target_mgL": 0.8,
        "free_so2_for_target_mgL": 31.924,
        "current_molecular_so2_mgL": 0.2506
    },
    "meta": {
        "timestamp": "2026-06-06T07:14:13.017Z",
        "request_id": "4a699853-dccc-473a-b196-2b097595fd0b"
    },
    "status": "ok",
    "message": "SO2 / sulfite",
    "success": true
}