Skip to content

POST /api/meters/analyze

Распознаёт счётчик на фотографии: тип, серийный номер, показания.

Запрос

http
POST /api/meters/analyze
Authorization: Bearer ВАШ_JWT
Content-Type: multipart/form-data
ПолеТипОписание
imagefileJPEG или 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.

MIT License