POST /api/meters/analyze
Распознаёт счётчик на фотографии: тип, серийный номер, показания.
Запрос
http
POST /api/meters/analyze
Authorization: Bearer ВАШ_JWT
Content-Type: multipart/form-data| Поле | Тип | Описание |
|---|---|---|
image | file | JPEG или PNG, фото счётчика |
cURL
bash
curl -X POST https://meters-api-prod.nyc-1.optimatica.pro/api/meters/analyze \
-H "Authorization: Bearer ВАШ_JWT" \
-F "image=@/path/to/meter.jpg"fetch
js
const form = new FormData()
form.append('image', file)
const res = await fetch('https://meters-api-prod.nyc-1.optimatica.pro/api/meters/analyze', {
method: 'POST',
headers: { Authorization: 'Bearer ВАШ_JWT' },
body: form,
})
const data = await res.json()Успешный ответ 200
json
{
"success": true,
"meter": {
"type": "water_cold",
"serialNumber": "12345678",
"currentReading": 123.456,
"tariffCount": null,
"waterTypeUnknown": false
}
}Не распознано 200
json
{
"success": false,
"error": "NO_VALID_PHOTO"
}Ошибки HTTP
| Код | Пример тела | Когда |
|---|---|---|
| 400 | { "error": "No file uploaded" } | Нет поля image |
| 401 | { "error": "Unauthorized" } | Нет ключа |
| 402 | { "error": "Payment required" } | Квота исчерпана |
| 403 | { "error": "Client blocked" } | Клиент заблокирован |
| 500 | — | Внутренняя ошибка LLM |
TypeScript типы
ts
import type {
AnalyzeMeterResponse,
AnalyzeMeterSuccess,
AnalyzeMeterFailure,
MeterData,
MeterType,
} from 'optimatica-meters'SDK
ts
import { analyzeMeterPhoto, ZhkhApiError } from 'optimatica-meters'
try {
const result = await analyzeMeterPhoto(file, { apiKey: 'eyJhbGci...' })
} catch (err) {
if (err instanceof ZhkhApiError) {
console.log(err.status, err.message)
}
}React Native — передайте объект { uri, name?, type? } вместо File.