ওয়াটার মিটার OCR API
ওয়াটার মিটার OCR API. এই পৃষ্ঠাটি সর্বজনীন HTTP API নথিভুক্ত করে যা ওয়েবসাইট ব্যাকএন্ড তৃতীয় পক্ষের একীকরণের জন্য প্রকাশ করে।
একটি বাস্তব আপলোড দিয়ে শুরু করুন
প্রথমে রেজিস্টার করুন, ওয়ার্কস্পেসে আপনার নিজের ওয়াটার মিটার ফটো আপলোড করুন এবং তারপর যখন আপনি ইন্টিগ্রেট করতে প্রস্তুত তখন একটি API কী তৈরি করুন৷
ওভারভিউ
- সমস্ত বহিরাগত ইন্টিগ্রেশনের জন্য ওয়েবসাইট ব্যাকএন্ড ব্যবহার করুন।
- তৃতীয় পক্ষের প্রোগ্রাম থেকে সরাসরি waterMeterAi এ কল করবেন না।
- উন্মুক্ত API একই ব্যবহারকারী, কোটা, ক্যাশে, কাজ এবং নিরীক্ষার নিয়মগুলিকে ওয়েব পোর্টাল হিসাবে শেয়ার করে৷
- ব্যাকএন্ড ডিপ্লয়মেন্ট কনফিগারেশন অনুযায়ী বিভিন্ন ডাউনস্ট্রিম AI পরিষেবা নির্বাচন করতে পারে।
- টাস্কের প্রতিক্রিয়ায় এখন সাধারণ result_summary অবজেক্ট থাকে, যাতে বিভিন্ন পরিষেবা বিভিন্ন ধরনের ফলাফল দেখাতে পারে।
প্রমাণীকরণ
- ওয়েবসাইটে সাইন ইন করুন এবং API কী পৃষ্ঠায় একটি API কী তৈরি করুন।
- সম্পূর্ণ API কীটি শুধুমাত্র একবার তৈরি করা হলে দেখানো হয়।
- প্রতিটি অনুরোধে Authorization হেডারে কী পাঠান।
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
আপলোডের নিয়ম
- সর্বাধিক ফাইলের আকার: প্রতি ছবি 20MB।
- সমর্থিত বিন্যাস: JPEG, PNG, WEBP।
- ব্যাকএন্ড প্রকৃত ফাইলের বিষয়বস্তু যাচাই করে, শুধু ফাইল এক্সটেনশন নয়।
আপলোড আকার প্রয়োগ
- ব্যাচ আপলোডগুলি ডিফল্টরূপে 8টি পর্যন্ত ছবি গ্রহণ করে, প্রতি-চিত্রের সীমা 20MB এবং একটি 20MB মোট ফাইল-কন্টেন্ট সীমা সহ।
- একটি ফাইল বা ব্যাচ যা তার সীমা অতিক্রম করে 413 ইমেজ যাচাই বা টাস্ক তৈরির আগে রিটার্ন করে; কোন আংশিক ব্যাচ তৈরি করা হয় না।
- Content-Length অনুপস্থিত বা খণ্ডিত স্থানান্তর ব্যবহার করা হলেও ব্যাকএন্ড প্রকৃত প্রাপ্ত বাইট গণনা কার্যকর করে।
টাস্ক স্টেটস
- queued: গ্রহণ করা হয়েছে এবং AI প্রক্রিয়াকরণের জন্য অপেক্ষা করছে।
- running: বর্তমানে প্রক্রিয়াধীন, অথবা ডিসপ্যাচারের কাছে পাঠানোর পরও চূড়ান্ত ফলাফলের অবস্থা নিয়মিত যাচাই করা হচ্ছে।
- batch_waiting_ai: ব্যাচের প্রতিটি আইটেম AI পরিষেবা অনলাইনে ফিরে আসার জন্য অপেক্ষা করছে।
- batch_running: ব্যাচটি ইতিমধ্যেই প্রেরণকারীর কাছে হস্তান্তর করা হয়েছে এবং এখনও প্রক্রিয়া করা হচ্ছে।
- done: সফলভাবে সমাপ্ত।
- failed: প্রক্রিয়াকরণ ব্যর্থ হয়েছে।
- waiting_ai: AI পরিষেবা অনলাইনে ফিরে না আসা পর্যন্ত সারিবদ্ধ, তারপর এটি স্বয়ংক্রিয়ভাবে পুনরায় শুরু হবে।
ফলাফল সূত্র
- fresh: একটি নতুন AI রান দ্বারা উত্পন্ন।
- cached_exact: বর্তমান AI সংস্করণ ক্যাশে মিলেছে।
- cached_stale: AI অফলাইন, সর্বশেষ ক্যাশে ফলাফল ফিরে এসেছে।
- pending: এখনও কোনো চূড়ান্ত ফলাফল নেই।
- failed: টাস্ক ব্যর্থ হয়েছে।
- যখন একটি কাজ এখনও সম্পন্ন করা হয় না, সর্বশেষ পুনরায় চেষ্টা বা অপেক্ষার কারণের জন্য error_message চেক করুন।
কোটা এবং বিলিং
- আপনার ইন্টিগ্রেশন কোটা ব্যর্থতা এড়াতে হলে বড় কাজের চাপ জমা দেওয়ার আগে `GET /api/open/quota` ব্যবহার করুন।
- শুধুমাত্র `fresh` AI রান কোটা খরচ করে।
- `cached_exact`, `cached_stale`, `pending`, এবং `failed` ফলাফল কোটা ব্যবহার করে না।
- বিনামূল্যের অ্যাকাউন্টগুলি প্রথমে দৈনিক কোটা ব্যবহার করে। প্রদত্ত অ্যাকাউন্টগুলি ব্যাকএন্ড নীতি অনুসারে সক্রিয় পর্যায়ক্রমিক কোটা প্যাকেজ, তারপর অস্থায়ী বা নির্দিষ্ট কোটা ব্যবহার করে।
- কোটা শেষ হয়ে গেলে, টাস্ক জমা দেওয়া `429` ফেরত দেয় এবং একটি নতুন টাস্ক তৈরি করার পরিবর্তে একটি ত্রুটি বার্তা অন্তর্ভুক্ত করে।
ক্যাশে এবং ফলাফল সতেজতা
- ব্যাকএন্ড ইমেজ হ্যাশ ও AI সংস্করণ অনুযায়ী সফল ফলাফল ক্যাশে করে; এতে ডাউনস্ট্রিম পরিষেবার namespace-ও থাকে।
- `cached_exact` মানে বর্তমান AI সংস্করণের জন্য একই চিত্রের ইতিমধ্যেই একটি সফল ফলাফল রয়েছে, তাই কোনো নতুন AI রানের প্রয়োজন ছিল না।
- `cached_stale` মানে AI পরিষেবাটি অফলাইন এবং ব্যাকএন্ড সর্বশেষ উপলব্ধ ঐতিহাসিক ফলাফল ফিরিয়ে দিয়েছে।
- `is_latest_ai_version`-এর মান false হলে ফলাফলটি ব্যবহারযোগ্য, তবে পর্যালোচনাযোগ্য ঐতিহাসিক ডেটা হিসেবে সংরক্ষণ করুন।
- প্রতিটি `done` টাস্ক গ্রাস করা কোটা অনুমান করবেন না; `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/quotaবর্তমান কোটা এবং অবশিষ্ট ব্যবহার পড়ুন।
উদাহরণ অনুরোধ
curl -X GET "https://watermeterai.com/api/open/quota" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx"
প্রতিক্রিয়া উদাহরণ
{
"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-statusটাস্ক জমা এবং ক্যাশে-ফলাফল ফলব্যাকের জন্য পাবলিক সার্ভিস স্ট্যাটাস পড়ুন।
উদাহরণ অনুরোধ
curl -X GET "https://watermeterai.com/api/open/ai-status" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx"
প্রতিক্রিয়া উদাহরণ
{
"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/tasksএকটি ছবি আপলোড করুন এবং একটি একক টাস্ক তৈরি করুন।
উদাহরণ অনুরোধ
curl -X POST "https://watermeterai.com/api/open/tasks" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx" \ -F "file=@D:\data\meter_001.jpg"
প্রতিক্রিয়া উদাহরণ
{
"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}একটি টাস্ক স্ট্যাটাস এবং চূড়ান্ত পড়া পড়ুন।
উদাহরণ অনুরোধ
curl -X GET "https://watermeterai.com/api/open/tasks/task_a" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx"
প্রতিক্রিয়া উদাহরণ
{
"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/tasksবর্তমান API কী ব্যবহারকারীর মালিকানাধীন সাম্প্রতিক কাজগুলি পড়ুন৷
উদাহরণ অনুরোধ
curl -X GET "https://watermeterai.com/api/open/tasks?limit=20" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx"
প্রতিক্রিয়া উদাহরণ
{
"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/batchesএক অনুরোধে একাধিক ছবি আপলোড করুন।
উদাহরণ অনুরোধ
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"
প্রতিক্রিয়া উদাহরণ
{
"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}ব্যাচের অগ্রগতি এবং প্রতি-ফাইল টাস্ক স্টেট পড়ুন।
উদাহরণ অনুরোধ
curl -X GET "https://watermeterai.com/api/open/batches/5a14f4e5f6d34fdabce00e62c0dd0001" \ -H "Authorization: Bearer wm_xxxxxxxxxxxxxxxxx"
প্রতিক্রিয়া উদাহরণ
{
"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": ""
}
]
}প্রস্তাবিত প্রবাহ
- বড় কাজের চাপ পাঠানোর আগে `GET /api/open/ai-status` চেক করুন।
- জমা দেওয়ার পরপরই আপনার নিজস্ব সিস্টেমে `task_id` বা `batch_id` সংরক্ষণ করুন।
- `queued`, `running`, `waiting_ai`, `batch_waiting_ai`, এবং `batch_running`-কে চূড়ান্ত নয় এমন অবস্থা ধরে নিয়মিত অবস্থা যাচাই করুন।
- ব্যাকএন্ডের নেটওয়ার্ক পথে বিলম্ব বেশি হলে এবং স্থাপিত পরিষেবা ব্যাচ মোড সমর্থন করলে ব্যাচ অনুরোধ ব্যবহার করুন।
- ব্যাচের অনুরোধগুলি বর্তমানে `webBackend -> dispatchCenter -> waterMeterAi` এর মাধ্যমে প্রবাহিত হয়।
- `batch_waiting_ai` মানে প্রতিটি আইটেম এখনও AI পরিষেবার জন্য অপেক্ষা করছে, এখনও সক্রিয়ভাবে চলছে না।
- স্থাপিত পরিষেবা `CAD` হলে আপাতত `POST /api/open/tasks` ব্যবহার করুন এবং ব্যাচ আপলোডকে অনুপলব্ধ ধরে নিন।
ত্রুটি নোট
- 400: অনুরোধ অবৈধ, অথবা স্থাপিত পরিষেবা ব্যাচ আপলোড সমর্থন করে না।
- 401: অনুপস্থিত, অবৈধ, মেয়াদোত্তীর্ণ, বা নিষ্ক্রিয় API কী।
- 403: the user account is not active, the key lacks the required scope, or the source IP is outside the key allowlist.
- 404: টাস্ক বা ব্যাচ পাওয়া যায়নি, বা বর্তমান ব্যবহারকারীর মালিকানাধীন নয়।
- 413: ফাইল খুব বড়।
- 415: অসমর্থিত চিত্রের ধরন বা অবৈধ চিত্র সামগ্রী।
- 429: quota exhausted or the API key request, submission, or concurrency limit was exceeded.
400 ব্যাচ আপলোড অনুপলব্ধ
{
"detail": "batch upload is not supported for business: cax"
}401 অনুপস্থিত বা অবৈধ API কী৷
{
"ok": false,
"error": "unauthorized",
"message": "Missing or invalid API key."
}413 ফাইল খুব বড়
{
"ok": false,
"error": "file_too_large",
"message": "Maximum file size is 20MB."
}429 কোটা শেষ
{
"ok": false,
"error": "quota_exhausted",
"message": "Quota exhausted.",
"quota": {
"remaining": 0,
"quota_summary_text": "Free daily quota: 20/20 used today. Remaining: 0."
}
}ওয়ার্কফ্লো পরীক্ষা করতে প্রস্তুত?
প্রথম ছবির জন্য ওয়েব ওয়ার্কস্পেস ব্যবহার করুন, তারপর ফলাফল বিন্যাস আপনার সিস্টেমে ফিট হয়ে গেলে API কীগুলিতে যান।