Full working examples for sending a meter reading request across seven languages and platforms.
The default asynchronous flow. You'll receive a reference_id immediately and the result via webhook later.
curl -X POST https://www.aquameter.site/api/meter-reading \-H "Authorization: Bearer aqm_live_YOUR_API_KEY" \-F "image=@/path/to/meter.jpg"
Never hard-code your API key. Store it as an environment variable and read it at runtime.
AQUAMETER_API_KEY=aqm_live_YOUR_API_KEY
const apiKey = process.env.AQUAMETER_API_KEY;
import osapi_key = os.environ["AQUAMETER_API_KEY"]
$apiKey = getenv("AQUAMETER_API_KEY");
String apiKey = System.getenv("AQUAMETER_API_KEY");
// Use flutter_dotenv or similar:final apiKey = dotenv.env['AQUAMETER_API_KEY']!;
let apiKey = ProcessInfo.processInfo.environment["AQUAMETER_API_KEY"]!
The API returns a reference_id immediately. The reading is delivered to your webhook URL once processing completes (typically within 1–3 seconds). Match the incoming reference_id to the request you stored. Always verify the X-AquaMeter-Signature header before trusting the payload — see Webhooks.
// Webhook handler (Express)app.post("/webhook", express.json(), async (req, res) => {const { event, data } = req.body;if (event === "reading.completed") {const { reference_id, reading, confidence, unobstructed, escalated } = data;// Update the record you stored when you received reference_id from the API ackawait db.meters.update({ reference_id },{ reading, confidence, unobstructed, escalated, status: "completed" },);}if (event === "reading.failed") {const { reference_id, reason } = data;await db.meters.update({ reference_id }, { status: "failed", reason });}res.sendStatus(200);});
# Webhook handler (Flask)@app.route("/webhook", methods=["POST"])def webhook():payload = request.get_json()event = payload["event"]data = payload["data"]if event == "reading.completed":db.update_meter(reference_id=data["reference_id"],reading=data["reading"],confidence=data["confidence"],unobstructed=data["unobstructed"],escalated=data["escalated"],status="completed",)elif event == "reading.failed":db.update_meter(reference_id=data["reference_id"],status="failed",reason=data.get("reason"),)return "", 200