Dashboard

Reconhecimento por foto

POST /api/recognize

Envie uma imagem JPEG ou PNG e receba os dados de todas as placas detectadas. Cada chamada bem-sucedida consome 1 crédito.

Autenticação

Scope necessário: recognitions:write

Inclua o header Authorization: Bearer <api-key> ou use cookie de sessão.

Requisição

POST /api/recognize
Content-Type: application/octet-stream
Body: bytes da imagem

Headers

HeaderObrigatórioDescrição
AuthorizationsimBearer pk_... (API key) ou cookie de sessão
Content-Typesimapplication/octet-stream

Body

O corpo da requisição deve conter os bytes brutos da imagem (JPEG ou PNG).

RestriçãoValor
Tamanho máximo10 MB
Formatos aceitosJPEG, PNG
Timeout30 segundos
Custo1 crédito por chamada

Exemplos

curl

curl -X POST "https://api.placaflow.com.br/api/recognize" \
  -H "Content-Type: application/octet-stream" \
  -H "Authorization: Bearer pk_a1b2c3d4e5f6g7h8i9j0..." \
  --data-binary @foto.jpg

Node.js

const fs = require('fs');

const image = fs.readFileSync('foto.jpg');

const res = await fetch('https://api.placaflow.com.br/api/recognize', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/octet-stream',
    'Authorization': 'Bearer pk_a1b2c3d4e5f6g7h8i9j0...',
  },
  body: image,
});

const data = await res.json();
console.log(`Placas encontradas: ${data.plates.length}`);
console.log(`Tempo de processamento: ${data.processingTimeMs}ms`);
console.log(`Créditos restantes: ${data.creditsRemaining}`);

for (const plate of data.plates) {
  console.log(`${plate.plate} — ${plate.conf.toFixed(1)}%`);
}

Python

import requests

with open('foto.jpg', 'rb') as f:
    image = f.read()

res = requests.post(
    'https://api.placaflow.com.br/api/recognize',
    headers={
        'Content-Type': 'application/octet-stream',
        'Authorization': 'Bearer pk_a1b2c3d4e5f6g7h8i9j0...',
    },
    data=image,
)

data = res.json()
print(f"Placas encontradas: {len(data['plates'])}")
print(f"Tempo: {data['processingTimeMs']}ms")
print(f"Créditos restantes: {data['creditsRemaining']}")

for plate in data['plates']:
    print(f"{plate['plate']} — {plate['conf']:.1f}%")

Resposta 200

{
  "plates": [
    {
      "plate": "ABC1D23",
      "conf": 95.2,
      "charConfs": "0.98;0.95;0.92;0.96;0.94;0.97;0.93",
      "coordinateLeft": 100,
      "coordinateTop": 200,
      "coordinateRight": 300,
      "coordinateBottom": 250,
      "plateType": "car",
      "time": "2026-03-22T14:30:00.000-03:00",
      "createdAt": "2026-03-22T14:30:00.000-03:00"
    },
    {
      "plate": "XYZ9K87",
      "conf": 88.7,
      "charConfs": "0.91;0.87;0.90;0.85;0.92;0.88;0.86",
      "coordinateLeft": 520,
      "coordinateTop": 310,
      "coordinateRight": 710,
      "coordinateBottom": 365,
      "plateType": "car",
      "time": "2026-03-22T14:30:00.000-03:00",
      "createdAt": "2026-03-22T14:30:00.000-03:00"
    }
  ],
  "processingTimeMs": 45,
  "imageWidth": 1920,
  "imageHeight": 1080,
  "creditsRemaining": 499
}

Campos da resposta (raiz)

CampoTipoDescrição
platesarrayLista de placas detectadas (pode ser vazia)
processingTimeMsnumberTempo de processamento em milissegundos
imageWidthnumberLargura da imagem em pixels
imageHeightnumberAltura da imagem em pixels
creditsRemainingnumberCréditos restantes após esta chamada

Campos de cada placa (plates[n])

CampoTipoDescrição
platestringTexto da placa (uppercase)
confnumberConfiança geral (0-100)
charConfsstringConfiança por caractere (0-1), separado por ;
coordinateLeftnumberBounding box: X esquerdo em pixels
coordinateTopnumberBounding box: Y superior em pixels
coordinateRightnumberBounding box: X direito em pixels
coordinateBottomnumberBounding box: Y inferior em pixels
plateTypestringTipo de veículo: car, motorcycle, etc.
timestringTimestamp do reconhecimento
createdAtstringTimestamp de criação do registro

Dica

O campo charConfs contém valores entre 0 e 1, não 0 e 100. Para exibir como porcentagem, multiplique por 100. Ex: "0.98;0.95;0.92" significa 98%, 95%, 92%.

Erros

CódigoDescrição
400Imagem vazia, formato inválido ou tamanho acima de 10 MB
401Não autenticado ou API key inválida
402Créditos insuficientes (saldo zerado)
403API key não possui scope recognitions:write
502Agente de processamento indisponível
503Nenhum servidor de reconhecimento disponível
Esta página foi útil?