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?mode=scene|closeup
Content-Type: application/octet-stream
Body: bytes da imagem

Parâmetros de query

ParâmetroTipoObrigatórioDescrição
modestringnãoscene (padrão) ou closeup — veja abaixo

scene (padrão) — para frames de câmeras de monitoramento, onde a placa ocupa uma parte pequena da imagem. A imagem é processada sem modificações.

closeup — para fotos tiradas de perto, onde a placa preenche a maior parte do quadro (celular, app, leitor móvel, foto da traseira de um veículo). A imagem passa por normalização de escala antes da detecção, o que melhora drasticamente a taxa de detecção nesses casos. A orientação EXIF é aplicada automaticamente (fotos de celular em retrato).

Info

Escolha o modo pelo enquadramento da imagem, não pelo dispositivo: uma foto de celular de um estacionamento inteiro é scene; uma câmera fixa instalada a poucos metros da placa é closeup. Em ambos os modos, as coordenadas retornadas sempre se referem aos pixels da imagem original enviada.

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

curl — foto tirada de perto (placa preenche o quadro)

curl -X POST "https://api.placaflow.com.br/api/recognize?mode=closeup" \
  -H "Content-Type: application/octet-stream" \
  -H "Authorization: Bearer pk_a1b2c3d4e5f6g7h8i9j0..." \
  --data-binary @foto-celular.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%.

Créditos

Cada chamada processada com sucesso consome 1 crédito — mesmo quando nenhuma placa é detectada (o custo é do processamento, não do resultado). Chamadas que falham (erros 4xx ou 5xx) não consomem crédito: em falhas do servidor de reconhecimento, o crédito é estornado automaticamente.

Erros

CódigoDescrição
400Imagem vazia, formato inválido (apenas JPEG ou PNG), tamanho acima de 10 MB ou mode desconhecido
401Não autenticado ou API key inválida
402Créditos insuficientes (saldo zerado)
403API key não possui scope recognitions:write
429Limite de requisições atingido
500Erro interno do servidor
502Erro ao processar a imagem no servidor de reconhecimento
503Servidor de reconhecimento indisponível (offline ou timeout)
Esta página foi útil?