Vesimittarin OCR-API
Vesimittarin OCR-API. Tämä sivu kuvaa verkkosivuston taustapalvelun kolmansien osapuolten integraatioille tarjoaman julkisen HTTP API:n.
Aloita todellisella latauksella
Rekisteröidy ensin, lataa oma vesimittarikuvasi työtilaan ja luo sitten API-avain, kun olet valmis integroimaan.
Yleiskatsaus
- Käytä verkkosivuston taustapalvelua kaikissa ulkoisissa integraatioissa.
- Älä kutsu waterMeterAi-palvelua suoraan kolmannen osapuolen ohjelmista.
- Avoin API jakaa samat käyttäjät, kiintiöt, välimuistin, tehtävät ja valvontasäännöt kuin verkkoportaalilla.
- Taustapalvelu voi käyttöönottoasetusten perusteella ohjata tehtäviä eri alavirran AI-palveluihin.
- Tehtävävastaukset sisältävät yleisen result_summary-objektin, jotta eri palvelut voivat näyttää erilaisia tulostyyppejä.
Todennus
- Kirjaudu sisään verkkosivustolle ja luo API-avain API-avaimet-sivulle.
- Koko API-avain näytetään vain kerran, kun se luodaan.
- Lähetä avain jokaisen pyynnön Authorization-otsikossa.
Authorization: Bearer wm_xxxxxxxxxxxxxxxxx
API Key Permissions and Limits
- Each API key can have independent scopes, an IPv4/IPv6/CIDR allowlist, a total requests-per-minute limit, and a task submissions-per-minute limit.
- A valid key without the required scope or outside its source IP allowlist returns 403.
- Every valid-key request consumes the total request limit, including requests rejected by scope, IP, or submission policy.
- Batch requests consume one total request unit and one submission unit per uploaded file.
- Rate-limited responses return 429 with Retry-After and both X-RateLimit-* and X-SubmissionLimit-* headers.
- Task creation also has a per-key concurrency limit and returns X-ConcurrencyLimit-* headers; a concurrency rejection uses 429.
- For batch concurrency, only files that pass image validation reserve slots, and success headers report the actual active slots after task binding.
Retry-After: 30 X-RateLimit-Limit: 60 X-RateLimit-Remaining: 59 X-RateLimit-Reset: 1785902400 X-SubmissionLimit-Limit: 10 X-SubmissionLimit-Remaining: 9 X-ConcurrencyLimit-Limit: 3 X-ConcurrencyLimit-Active: 1 X-ConcurrencyLimit-Remaining: 2
Lataussäännöt
- Tiedoston enimmäiskoko: 20 Mt per kuva.
- Tuetut muodot: JPEG, PNG, WEBP.
- Taustapalvelu tarkistaa tiedoston todellisen sisällön, ei pelkästään tiedostopäätettä.
Latauksen koon valvonta
- Joukkolataukset hyväksyvät oletuksena enintään 8 kuvaa 20 Mt:n kuvakohtaisen rajan ja 20 Mt:n tiedoston kokonaissisältörajoituksen kanssa.
- Rajansa ylittävä tiedosto tai erä palauttaa 413 ennen kuvan vahvistusta tai tehtävän luomista; osittaista erää ei luoda.
- Taustapalvelu valvoo vastaanotettua tavumäärää myös silloin, kun Content-Length puuttuu tai käytössä on paloittainen siirto.
Tehtävätilat
- queued: hyväksytty ja odottaa AI-käsittelyä.
- running: käsitellään parhaillaan tai on jo välitetty dispatchCenter-palvelulle ja odottaa lopullista tulosta.
- batch_waiting_ai: kaikki erän tuotteet odottavat AI-palvelun palautumista verkkoon.
- batch_running: erä on jo luovutettu lähettäjälle ja sitä käsitellään edelleen.
- done: valmistui onnistuneesti.
- failed: käsittely epäonnistui.
- waiting_ai: jonossa, kunnes AI-palvelu palaa verkkoon, minkä jälkeen käsittely jatkuu automaattisesti.
Tuloslähteet
- fresh: luotu uudella AI-ajolla.
- cached_exact: vastasi nykyisen AI-version välimuistia.
- cached_stale: AI offline, viimeisin välimuistissa oleva tulos palautettu.
- pending: lopullista tulosta ei vielä ole.
- failed: tehtävä epäonnistui.
- Kun tehtävää ei ole vielä tehty, tarkista error_message viimeisimmän uudelleenyrityksen tai odotussyyn varalta.
Kiintiö ja laskutus
- Käytä `GET /api/open/quota` ennen suurten työkuormien lähettämistä, jos integroinnin on vältettävä kiintiövirheitä.
- Vain `fresh`-AI-ajot kuluttavat kiintiötä.
- `cached_exact`, `cached_stale`, `pending` ja `failed` tulokset eivät kuluta kiintiötä.
- Ilmaiset tilit käyttävät ensin päivittäisen kiintiön. Maksulliset tilit käyttävät aktiivisia säännöllisiä kiintiöpaketteja ja sitten väliaikaisia tai kiinteää kiintiötä taustakäytännön mukaisesti.
- Kun kiintiö on käytetty loppuun, tehtävän lähetys palauttaa `429` ja sisältää virheilmoituksen uuden tehtävän luomisen sijaan.
Välimuisti ja tulosten tuoreus
- Taustapalvelu tallentaa onnistuneet tulokset välimuistiin kuvan tiivisteen ja AI-version perusteella, alavirran palvelun nimiavaruus mukaan lukien.
- `cached_exact` tarkoittaa, että samalla kuvalla on jo onnistunut tulos nykyiselle AI-versiolle, joten uutta AI-ajoa ei tarvittu.
- `cached_stale` tarkoittaa, että AI-palvelu on offline-tilassa ja taustaohjelma palautti viimeisimmän saatavilla olevan historiallisen tuloksen.
- Kun `is_latest_ai_version` on epätosi, tallenna tulos käyttökelpoisena mutta tarkistettavana historiallisena tietona.
- Älä oleta, että jokainen `done`-tehtävä kulutti kiintiötä; tarkista `result_source`.
Task completion webhooks
- Send signed task completion events to your HTTPS endpoint with automatic retries.
- This API key is inactive. Existing records remain available, but new, enabled, test, and secret-rotation operations are blocked.
X-WaterMeter-Webhook-Id: whev_new_event X-WaterMeter-Webhook-Replay-Of: whev_original_event replay_of_event_id: whev_original_event blocked endpoint management: HTTP 409 canceled delivery status: canceled
GET/api/open/quota
/api/open/quotaLue nykyinen kiintiö ja jäljellä oleva käyttö.
Pyydä esimerkki
curl -X GET "https://watermeterai.com/api/open/quota" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx"
Vastausesimerkki
{
"ok": true,
"email": "[email protected]",
"quota": {
"account_type": "free",
"daily_limit": 20,
"used": 3,
"remaining": 17,
"day_tag": "2026-06-01",
"is_unlimited": false,
"monthly_remaining": 0,
"monthly_bonus_remaining": 0,
"fixed_remaining": 0,
"nearest_expire_at": null,
"quota_summary_text": "Free daily quota: 3/20 used today. Remaining: 17."
}
}GET/api/open/ai-status
/api/open/ai-statusLue palvelun julkinen tila tehtävien lähettämistä ja välimuistitulosten käyttöä varten.
Pyydä esimerkki
curl -X GET "https://watermeterai.com/api/open/ai-status" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx"
Vastausesimerkki
{
"ok": true,
"is_online": true,
"busy": false,
"active_jobs": 0,
"public_status": "online",
"public_status_label": "online",
"public_status_reason": "ready",
"accepts_new_tasks": true,
"can_return_cached_result": true,
"queue_state": "idle",
"queue_count": 0,
"current_ai_version": "water_v2:wm-ai-v2-2026-06-01",
"last_checked_at": "2026-06-01T06:15:30Z"
}POST/api/open/tasks
/api/open/tasksLataa yksi kuva ja luo yksi tehtävä.
Pyydä esimerkki
curl -X POST "https://watermeterai.com/api/open/tasks" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx" \ -F "file=@D:\data\meter_001.jpg"
Vastausesimerkki
{
"ok": true,
"task_id": "8e6c4d1f8f8348c0bc53e2e39d2dc111",
"status": "queued",
"result_source": "pending",
"visibility": "private",
"ai_online": true,
"is_latest_ai_version": false,
"final_reading": "-",
"result_summary": {
"resultKind": "unknown",
"primaryLabel": "Result",
"primaryValue": "-",
"secondaryLabel": "Detail",
"secondaryValue": "-",
"summaryText": "No result is available yet."
},
"error_message": "",
"created_at": "2026-06-01T06:16:10Z"
}GET/api/open/tasks/{task_id}
/api/open/tasks/{task_id}Lue yhden tehtävän tila ja lopullinen lukema.
Pyydä esimerkki
curl -X GET "https://watermeterai.com/api/open/tasks/task_a" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx"
Vastausesimerkki
{
"ok": true,
"task_id": "8e6c4d1f8f8348c0bc53e2e39d2dc111",
"status": "done",
"result_source": "fresh",
"ai_online": true,
"is_latest_ai_version": true,
"final_reading": "123.45",
"meter_type": "pointer",
"success": "yes",
"result_summary": {
"resultKind": "water_meter",
"primaryLabel": "Final Reading",
"primaryValue": "123.45",
"secondaryLabel": "Meter Type",
"secondaryValue": "pointer",
"summaryText": "Water meter recognition finished."
},
"error_message": "",
"created_at": "2026-06-01T06:16:10Z"
}GET/api/open/tasks
/api/open/tasksLue nykyisen API-avainkäyttäjän viimeisimmät tehtävät.
Pyydä esimerkki
curl -X GET "https://watermeterai.com/api/open/tasks?limit=20" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx"
Vastausesimerkki
{
"ok": true,
"items": [
{
"task_id": "8e6c4d1f8f8348c0bc53e2e39d2dc111",
"status": "done",
"result_source": "cached_exact",
"final_reading": "123.45",
"meter_type": "pointer",
"success": "yes",
"result_summary": {},
"ai_online": true,
"is_latest_ai_version": true,
"created_at": "2026-06-01T06:16:10Z",
"error_message": ""
}
]
}POST/api/open/batches
/api/open/batchesLataa useita kuvia yhdellä pyynnöllä.
Pyydä esimerkki
curl -X POST "https://watermeterai.com/api/open/batches" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx" \ -F "files=@D:\data\meter_001.jpg" \ -F "files=@D:\data\meter_002.jpg"
Vastausesimerkki
{
"ok": true,
"batch_id": "5a14f4e5f6d34fdabce00e62c0dd0001",
"status": "batch_running",
"total_count": 2,
"done_count": 0,
"failed_count": 0,
"pending_count": 2,
"items": [
{
"index": 0,
"file_name": "meter_001.jpg",
"task_id": "task_a",
"status": "queued",
"result_source": "pending",
"final_reading": "-",
"failure_kind": "",
"error_message": ""
},
{
"index": 1,
"file_name": "meter_002.jpg",
"task_id": "task_b",
"status": "queued",
"result_source": "pending",
"final_reading": "-",
"failure_kind": "",
"error_message": ""
}
]
}GET/api/open/batches/{batch_id}
/api/open/batches/{batch_id}Lue erän edistyminen ja tiedostokohtaiset tehtävätilat.
Pyydä esimerkki
curl -X GET "https://watermeterai.com/api/open/batches/5a14f4e5f6d34fdabce00e62c0dd0001" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx"
Vastausesimerkki
{
"ok": true,
"batch_id": "5a14f4e5f6d34fdabce00e62c0dd0001",
"status": "batch_done",
"total_count": 2,
"done_count": 2,
"failed_count": 0,
"pending_count": 0,
"items": [
{
"index": 0,
"file_name": "meter_001.jpg",
"task_id": "task_a",
"status": "done",
"result_source": "fresh",
"final_reading": "123.45",
"failure_kind": "",
"error_message": ""
},
{
"index": 1,
"file_name": "meter_002.jpg",
"task_id": "task_b",
"status": "done",
"result_source": "cached_exact",
"final_reading": "456.78",
"failure_kind": "",
"error_message": ""
}
]
}Suositeltu työnkulku
- Tarkista `GET /api/open/ai-status` ennen suurten työkuormien lähettämistä.
- Säilytä `task_id` tai `batch_id` omassa järjestelmässäsi heti lähettämisen jälkeen.
- Käsittele tiloja `queued`, `running`, `waiting_ai`, `batch_waiting_ai` ja `batch_running` keskeneräisinä ja jatka tilan kyselyä.
- Käytä eräpyyntöjä, kun taustapalveluun johtavan verkkoyhteyden viive on suuri ja käytössä oleva palvelu tukee erätilaa.
- Eräpyynnöt kulkevat tällä hetkellä `webBackend -> dispatchCenter -> waterMeterAi`:n kautta.
- `batch_waiting_ai` tarkoittaa, että jokainen tuote odottaa edelleen AI-palvelua, ei vielä aktiivisesti käynnissä.
- Kun käytössä oleva palvelu on `CAD`, käytä toistaiseksi `POST /api/open/tasks`-päätepistettä ja käsittele erälähetys poissa käytöstä.
Virhehuomautuksia
- 400: virheellinen pyyntö tai käytössä oleva palvelu ei tue erälähetystä.
- 401: puuttuu, virheellinen, vanhentunut tai poistettu käytöstä API-avain.
- 403: the user account is not active, the key lacks the required scope, or the source IP is outside the key allowlist.
- 404: tehtävää tai erää ei löydy, tai se ei ole nykyisen käyttäjän omistuksessa.
- 413: tiedosto liian suuri.
- 415: kuvatyyppiä ei tueta tai kuvasisältö on virheellinen.
- 429: quota exhausted or the API key request, submission, or concurrency limit was exceeded.
400 erälähetys ei ole käytettävissä
{
"detail": "batch upload is not supported for business: cax"
}401 puuttuu tai on virheellinen API-avain
{
"ok": false,
"error": "unauthorized",
"message": "Missing or invalid API key."
}413 tiedosto on liian suuri
{
"ok": false,
"error": "file_too_large",
"message": "Maximum file size is 20MB."
}429 kiintiö on käytetty loppuun
{
"ok": false,
"error": "quota_exhausted",
"message": "Quota exhausted.",
"quota": {
"remaining": 0,
"quota_summary_text": "Free daily quota: 20/20 used today. Remaining: 0."
}
}Oletko valmis testaamaan työnkulkua?
Kokeile ensimmäistä kuvaa verkkotyötilassa ja siirry sitten API-avaimiin, kun tulosmuoto sopii järjestelmääsi.