DevelopersAPI TEMA v2
Rapidoc · TEMA v2 · BabyCare

BabyCare

Classificação do choro de bebê a partir de áudio em tempo real: habilitação da criança, envio dos blocos de áudio e histórico de escaneamentos.

Escopo do parceiro de consumo

Só a experiência do beneficiário

O parceiro de consumo constrói apenas a experiência do beneficiário. Gestão, relatórios agregados e consumo por período ficam no Manager da Rapidoc — o parceiro não integra nada disso.

Headers

Todas as chamadas levam os três headers da API TEMA v2:

HeaderValor
AuthorizationBearer <token> — do parceiro, fornecido pela Rapidoc
clientId<uuid-do-cliente> — sempre o do próprio cliente
Content-Typeapplication/vnd.rapidoc.tema-v2+json — exceto o envio de áudio (application/octet-stream)

Datas nas respostas

Todo campo de data das respostas (createdAt) já vem formatado como string dd/MM/yyyy HH:mm:ss no fuso GMT-3 (ex.: "01/09/2026 14:20:05") — não é epoch e não precisa de new Date(...). Os valores enviados na query (dateInitial/dateFinal) seguem o formato dd/MM/yyyy.

BabyCare

Classifica o choro de bebê a partir de áudio em tempo real. O beneficiário-alvo é a criança. Exige o produto babycare ativo no cliente e o parâmetro HAS_BABY_CARE = true na criança — faltando qualquer um dos dois, o envio de áudio devolve 422.

EndpointO que faz
POST /tema/api/beneficiary-babycare-scans/{uuid}/audioRecebe ~1s de áudio (PCM mono 16-bit, 8 ou 16 kHz) e devolve a classificação do choro ao concluir a sessão
GET /tema/api/beneficiary-babycare-scans/{uuid}Histórico de escaneamentos da criança, mais recente primeiro

Streaming de áudio

POST .../audio recebe cada chunk de ~1 s de áudio bruto no corpo da requisição — não é upload de arquivo, é leitura ao vivo do microfone, enviada em loop. Content-Type é application/octet-stream nesse endpoint (exceção à regra geral da API).

ItemLocalValor
Content-Typeheaderapplication/octet-stream
x-audio-sample-rateheader8000 ou 16000, igual à taxa real do áudio
x-audio-timestampheaderms desde o início da sessão (0, +1000 a cada chunk)
corpobináriobytes do chunk PCM mono 16-bit, sem cabeçalho
curl · POST /beneficiary-babycare-scans/{uuid}/audio
curl --location '{{BASE_URL}}/tema/api/beneficiary-babycare-scans/UUID_DA_CRIANCA/audio' \
  --header 'Authorization: Bearer SEU_TOKEN' \
  --header 'clientId: UUID_DO_CLIENTE' \
  --header 'Content-Type: application/octet-stream' \
  --header 'x-audio-sample-rate: 16000' \
  --header 'x-audio-timestamp: 0' \
  --data-binary '@chunk.pcm'

A resposta é repassada como veio do serviço de análise, sem desserialização — traz um campo phase (partial ou done). Envie chunks em loop, incrementando x-audio-timestamp em 1000 a cada chunk, até receber phase: "done" — é nesse momento que o resultado (tipo de choro) é gravado automaticamente. Beneficiário ou cliente não elegíveis ao BabyCare: 422. Falha ao comunicar com o serviço de análise: 502.

Implementação: captura e envio dos chunks

O fluxo de quem envia é sempre o mesmo, independente da linguagem: capturar áudio do microfone (ex.: Web Audio API no navegador), fatiar em blocos de ~1 s, converter cada bloco para PCM linear mono 16-bit little-endian (sem cabeçalho de arquivo) e enviar em loop — um POST .../audio por bloco, incrementando x-audio-timestamp em 1000 a cada envio, até a resposta trazer phase: "done" ou um erro.

Cada resposta precisa ser conferida antes do próximo envio: um 422 ou 502 interrompe a sessão — não adianta continuar mandando chunks; phase: "done" também encerra, é o sinal de que o resultado já foi classificado e gravado.

Não exponha credenciais no navegador

Não existe forma de esconder Authorization e clientId em um código que roda no navegador (página, SPA): abrindo o devtools, a aba de rede mostra o header de qualquer chamada feita direto do front para o TEMA — mesmo com o valor ofuscado ou vindo de uma variável de ambiente do lado do front, no navegador tudo isso vira texto plano no momento da requisição.

A forma segura é o navegador nunca falar direto com o TEMA: ele captura e envia o chunk para um endpoint do seu próprio backend — ou um middleware (ex.: Next.js), não precisa ser necessariamente um backend dedicado — que guarda o clientId/token do lado do servidor (variável de ambiente, nunca no bundle do front) e repassa a chamada para o TEMA, devolvendo a resposta ao navegador.

Fluxo · onde ficam as credenciais
Navegadorcaptura o áudio do microfonesem credenciais
Seu backendAPI route ou middlewareguarda clientId + token
TEMAAPIrecebe Authorization

O navegador só precisa saber o beneficiaryUuid e os headers de formato do áudio (x-audio-sample-rate, x-audio-timestamp) — quem sabe o clientId e o token é o backend.

Histórico de escaneamentos

Histórico da criança — GET /tema/api/beneficiary-babycare-scans/{uuid}?period=week

curl · GET /beneficiary-babycare-scans/{uuid}
curl --location '{{BASE_URL}}/tema/api/beneficiary-babycare-scans/UUID_DA_CRIANCA?period=week' \
  --header 'Authorization: Bearer SEU_TOKEN' \
  --header 'clientId: UUID_DO_CLIENTE' \
  --header 'Content-Type: application/vnd.rapidoc.tema-v2+json'
json · resposta 200
[
  { "uuid": "UUID_DO_SCAN", "cryType": "HUNGRY", "createdAt": "01/09/2026 03:12:44" },
  { "uuid": "UUID_DO_SCAN", "cryType": "SLEEP", "createdAt": "31/08/2026 22:40:03" }
]

period aceita week (semana corrente) ou month (padrão). Valores de cryType: HUNGRY (fome), SLEEP (sono), PAIN (dor), BURP (necessidade de arrotar), UNCOMFORTABLE (desconforto).

Passo a passo de implementação

Sequência mínima para integrar o BabyCare — os detalhes de cada chamada estão nas seções acima.

Passo a passo · BabyCare
  1. 1
    GET/beneficiaries/{uuid}

    Confere HAS_BABY_CARE nos parameters da criança

  2. 2
    POST/beneficiary-babycare-scans/{uuid}/audio

    Envia os chunks de áudio em loop até phase: "done"

    Repetido a cada ~1 s, um bloco por vez (ver o fluxo de credenciais acima)

  3. 3
    GET/beneficiary-babycare-scans/{uuid}

    Lista o histórico de choros já classificados

Uso nas telas do app

Exige app com captura de microfone.

#EndpointUso
1GET/tema/api/beneficiaries/{uuid}Ao abrir o BabyCare, ler o beneficiário e checar em parameters se HAS_BABY_CARE vale true. Se não, a criança não está habilitada e não há o que escanear. A habilitação é feita no Manager — o app do parceiro não ativa nada, só consulta.
2POST/tema/api/beneficiary-babycare-scans/{uuid}/audioEnviar os blocos de 1 s (PCM mono 16-bit LE, 8/16 kHz) durante a sessão, com os headers x-audio-sample-rate e x-audio-timestamp. Repetir até a resposta trazer phase: "done". Detalhe byte a byte em Protocolo de áudio.
3GET/tema/api/beneficiary-babycare-scans/{uuid}period=week|monthHistórico de choros da criança (cryType + createdAt).

Protocolo de áudio

Especificação do que viaja no body de POST /tema/api/beneficiary-babycare-scans/{beneficiaryUuid}/audio — para implementar o cliente do zero, em qualquer stack, reproduzindo exatamente o que o TEMA espera.

É leitura ao vivo, não upload de arquivo. O app abre o microfone e vai enviando o som enquanto o choro acontece, em blocos de 1 s, um atrás do outro. Nada é gravado nem montado como .wav/.mp3 antes — cada bloco é um pedaço do stream capturado naquele segundo. O TEMA processa cada bloco e devolve o andamento da sessão.

ItemValor
Método / PathPOST /tema/api/beneficiary-babycare-scans/{beneficiaryUuid}/audio
Content-Typeapplication/octet-stream
Duração do bloco1 segundo
Sample rate8000 ou 16000 Hz
AmostraPCM 16 bits · little-endian · mono

01 · O body é áudio cru, não um arquivo

Não é JSON, não é base64, não é um .wav com header. É PCM puro: a sequência de amostras de 16 bits, little-endian, mono, sem nenhum envelope em volta. Cada amostra ocupa 2 bytes, byte menos significativo primeiro. Não há cabeçalho: o primeiro byte do body já é o byte baixo da amostra 0.

tamanho de cada bloco
1 segundo de áudio = n amostras × 2 bytes   (n = sample rate)

 8 kHz  →  8.000 amostras/s × 2 = 16.000 bytes por bloco
16 kHz  → 16.000 amostras/s × 2 = 32.000 bytes por bloco

02 · Headers de cada requisição

Vão junto do binário, nunca dentro dele:

HeaderValor
AuthorizationBearer SEU_TOKEN — token do cliente autenticado
clientIdUUID_DO_CLIENTE — identifica o cliente dono do beneficiário
Content-Typeapplication/octet-stream — corpo binário, nunca application/json
x-audio-sample-rate16000 ou 8000 — tem que bater com o sample rate real do PCM enviado
x-audio-timestamp0 no 1º bloco; 1000, 2000, … nos seguintes — ver 03
corpobytes do bloco PCM (1 s = sample rate × 2 bytes)
curl · POST /beneficiary-babycare-scans/{uuid}/audio
curl --location '{{BASE_URL}}/tema/api/beneficiary-babycare-scans/UUID_DA_CRIANCA/audio' \
  --header 'Authorization: Bearer SEU_TOKEN' \
  --header 'clientId: UUID_DO_CLIENTE' \
  --header 'Content-Type: application/octet-stream' \
  --header 'x-audio-sample-rate: 16000' \
  --header 'x-audio-timestamp: 0' \
  --data-binary '@chunk.pcm'

03 · x-audio-timestamp

Milissegundos desde o início da sessão. 0 no primeiro bloco e +1000 a cada bloco seguinte (1000, 2000, 3000…), porque cada bloco carrega 1 s de áudio. É o relógio da sessão — não é epoch e não reinicia entre blocos; só volta a 0 quando você inicia uma sessão nova.

04 · O loop no app

  1. Pedir permissão de microfone e abrir a captura (Web Audio AudioContext + getUserMedia, ou o equivalente nativo).
  2. Reamostrar para 16 kHz (ou 8 kHz) e converter de Float32 [-1, 1] para Int16 little-endian.
  3. Acumular 1 s de amostras e disparar o POST — sequencial, um bloco por vez, x-audio-timestamp em 0, 1000, 2000…
  4. A resposta é o andamento da sessão em JSON (phase e, ao final, answer). Enquanto phase ≠ "done", siga enviando.
  5. Quando vier phase: "done" com answer, encerre a captura — nesse momento o TEMA grava o escaneamento com o cryType. Depois é só chamar o GET de histórico.

Erros e limites

  • 422 — criança sem HAS_BABY_CARE = true ou cliente sem o produto babycare. Cheque antes (tela 1) para não abrir a captura à toa.
  • 502 — falha no serviço de análise; normalmente é reiniciar a sessão do zero.
  • O áudio não é armazenado em nenhum lugar — só o cryType resultante.
  • A latência é sensível: 1 bloco por segundo, sequencial. Mantenha os blocos em ~1 s e não acumule vários antes de enviar.

Apresentação de telas

Mockup para visualizar como o fluxo aparece para o beneficiário e a qual chamada cada tela corresponde. Não é a UI real.

1 / 4
BabyCare
Bebê Teste
Produto babycare (cliente)ativo
HAS_BABY_CARE (criança)true
Habilitado — pode escanear. Se viesse false: “criança não elegível” (a habilitação é feita no Manager).
Iniciar escaneamento
GET

Ao abrir o BabyCare, o app lê o beneficiário e verifica se HAS_BABY_CARE = true nos parameters. Se estiver, segue para o escaneamento; se não, a criança não está habilitada. A habilitação é feita no Manager — o app do parceiro não ativa nada, só consulta.

GET /beneficiaries/{uuid} — checar parameters[HAS_BABY_CARE]

Checklist

Valide em sandbox antes de ir para produção. Os itens marcados ficam salvos neste navegador.

0 / 1