{"openapi":"3.1.0","info":{"title":"PID Tuning API","version":"1.0.0","description":"PID-controller-tuning maths as an API, computed locally and deterministically. The ziegler-nichols endpoint computes controller gains with the closed-loop (ultimate-gain) method: from the ultimate gain Ku at which the loop sustains oscillation and its period Tu it returns the proportional, integral and derivative gains for a P, PI, PD or PID controller using the classic table (PID: Kp = 0.6·Ku, Ti = 0.5·Tu, Td = 0.125·Tu), in both the standard (Ti, Td) and parallel (Ki, Kd) parameters. The reaction-curve endpoint computes gains with the open-loop method from a step-response process model — the process gain K, the dead time L and the time constant T — using the Ziegler-Nichols reaction-curve table (PID: Kp = 1.2·T/(K·L), Ti = 2L, Td = 0.5L). The convert endpoint translates between the parallel form (Kp, Ki, Kd) and the standard form (Kp, Ti, Td) using Ki = Kp/Ti and Kd = Kp·Td. Everything is computed locally and deterministically, so it is instant and private. Ideal for industrial-automation, robotics, process-control, motor-control and IoT app developers, controller-tuning and loop-design tools, and control-systems education. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 3 endpoints. This is PID controller tuning; for op-amp circuits use an op-amp API and for resonance and reactance a resonance API.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/pid-api","description":"oanor gateway"}],"tags":[{"name":"PID"},{"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/convert":{"get":{"operationId":"get_v1_convert","tags":["PID"],"summary":"PID form conversion","description":"","parameters":[{"name":"kp","in":"query","required":true,"description":"Proportional gain Kp","schema":{"type":"string"},"example":"6"},{"name":"ki","in":"query","required":false,"description":"Integral gain Ki (parallel)","schema":{"type":"string"}},{"name":"kd","in":"query","required":false,"description":"Derivative gain Kd (parallel)","schema":{"type":"string"}},{"name":"ti","in":"query","required":false,"description":"Integral time Ti (standard)","schema":{"type":"string"},"example":"1"},{"name":"td","in":"query","required":false,"description":"Derivative time Td (standard)","schema":{"type":"string"},"example":"0.25"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"Kd":1.5,"Ki":6,"Kp":6,"to":"parallel","from":"standard","note":"Standard → parallel: Ki = Kp/Ti, Kd = Kp·Td.","inputs":{"kp":6,"td":0.25,"ti":1}},"meta":{"timestamp":"2026-06-05T11:30:28.463Z","request_id":"67cdb044-487b-45e8-aaa6-234df7cda078"},"status":"ok","message":"Form conversion","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/reaction-curve":{"get":{"operationId":"get_v1_reaction_curve","tags":["PID"],"summary":"ZN open-loop tuning","description":"","parameters":[{"name":"process_gain","in":"query","required":true,"description":"Process gain K","schema":{"type":"string"},"example":"2"},{"name":"dead_time","in":"query","required":true,"description":"Dead time L (s)","schema":{"type":"string"},"example":"1"},{"name":"time_constant","in":"query","required":true,"description":"Time constant T (s)","schema":{"type":"string"},"example":"5"},{"name":"type","in":"query","required":false,"description":"P, PI or PID","schema":{"type":"string"},"example":"PID"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"Kd":1.5,"Ki":1.5,"Kp":3,"Td":0.5,"Ti":2,"note":"Open-loop ZN from a step-response reaction curve (process gain K, dead time L, time constant T). PID: Kp=1.2·T/(K·L), Ti=2L, Td=0.5L.","inputs":{"type":"PID","dead_time":1,"process_gain":2,"time_constant":5},"method":"Ziegler-Nichols open-loop (reaction curve)"},"meta":{"timestamp":"2026-06-05T11:30:28.548Z","request_id":"67161297-ce27-4bf0-b0fe-54db8aacdae5"},"status":"ok","message":"ZN open-loop","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/ziegler-nichols":{"get":{"operationId":"get_v1_ziegler_nichols","tags":["PID"],"summary":"ZN closed-loop tuning","description":"","parameters":[{"name":"ultimate_gain","in":"query","required":true,"description":"Ultimate gain Ku","schema":{"type":"string"},"example":"10"},{"name":"ultimate_period","in":"query","required":true,"description":"Ultimate period Tu (s)","schema":{"type":"string"},"example":"2"},{"name":"type","in":"query","required":false,"description":"P, PI, PD or PID","schema":{"type":"string"},"example":"PID"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"Kd":1.5,"Ki":6,"Kp":6,"Td":0.25,"Ti":1,"note":"Closed-loop ZN: raise the proportional gain until sustained oscillation to find Ku and its period Tu, then apply the table (PID: Kp=0.6Ku, Ti=0.5Tu, Td=0.125Tu). Expect ~25 % overshoot; detune for less aggressive control.","inputs":{"type":"PID","ultimate_gain":10,"ultimate_period":2},"method":"Ziegler-Nichols closed-loop (ultimate gain)"},"meta":{"timestamp":"2026-06-05T11:30:28.678Z","request_id":"79de3ef9-39df-42c4-9e64-78b41368602f"},"status":"ok","message":"ZN closed-loop","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":{"notes":"Ku is the ultimate gain, Tu its oscillation period; K/L/T are the process gain, dead time and time constant from a step response. type: P, PI, PD or PID.","service":"pid-api","formulae":{"forms":"Ki=Kp/Ti, Kd=Kp·Td","zn_open_pid":"Kp=1.2·T/(K·L), Ti=2L, Td=0.5L","zn_closed_pid":"Kp=0.6Ku, Ti=0.5Tu, Td=0.125Tu"},"endpoints":{"GET /v1/meta":"This document.","GET /v1/convert":"Convert between parallel (Kp,Ki,Kd) and standard (Kp,Ti,Td) forms.","GET /v1/reaction-curve":"Open-loop ZN gains from process gain, dead time and time constant.","GET /v1/ziegler-nichols":"Closed-loop ZN gains from ultimate gain Ku and period Tu."},"description":"PID controller-tuning calculator: Ziegler-Nichols closed-loop (ultimate gain) and open-loop (reaction curve) tuning, and conversion between the parallel and standard PID forms."},"meta":{"timestamp":"2026-06-05T11:30:28.791Z","request_id":"a716788e-8524-4fd9-bf35-765f60b48b39"},"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":2850,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":1000,"monthly_call_quota":41000,"rps_limit":6,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2500,"monthly_call_quota":249000,"rps_limit":15,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":7200,"monthly_call_quota":1730000,"rps_limit":40,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/pid-api"}