As duas rotas POST de composição recebem multipart/form-data e devolvem uma imagem binária. A rota GET /api/v2/widget-measurements/match recebe apenas parâmetros de query e devolve JSON de capacidades. O runtime do widget obtém a identidade e o recibo antes de chamar as composições.
Passo 1
Tenha o user_id do perfil
O campo user_id identifica o perfil usado no snippet. Ele não é uma API key nem substitui a origem autorizada e o recibo de identidade.
Passo 2
Cadastre produtos
Cada produto precisa existir no catálogo com a reference_url que será enviada na composição.
Passo 3
Envie multipart/form-data
Envie imagem, reference_url e user_id e receba a imagem resultante em binário.
Importante
Créditos e assinatura
O lojista ainda precisa ter assinatura ativa e créditos disponíveis para gerar composições.
Estas são rotas públicas mediadas pelo widget: o navegador não envia API key. O runtime autorizado emite ou renova o identity_receipt e o envia nas composições; não trate os exemplos como APIs servidor-a-servidor independentes.
Antes de qualquer composição, o handler confere o UUID do owner, a origem da página, o provisionamento e o produto ativo. Fashion e Óculos também exigem o UUID exato de product_id; Home encontra o tipo permitido pela URL normalizada e nunca aceita product_type do cliente.
As composições Fashion, Óculos e Home usam multipart, resposta binária, Idempotency-Key e timeout de cliente de 120 segundos. A rota de Medidas é um GET sem body, sem multipart e sem idempotência: ela retorna JSON de capacidades.
Idempotency-Key: home-operation-unique-001
Content-Type: multipart/form-data (gerado automaticamente pelo cliente HTTP)
Campos obrigatórios: environment_image, reference_url, user_id, identity_receiptQuando a requisição é aceita, a API devolve headers de limite e pode definir um cookie interno de identidade. Quando o visitante é bloqueado, a resposta 429 inclui o payload JSON abaixo.
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 9
X-RateLimit-Reset: 1776945600
Retry-After: 3600
Set-Cookie: reverbs_widget_rate_limit_id=...; Path=/; Max-Age=31536000; HttpOnly; SameSite=None; Secure
{
"success": false,
"code": "VISITOR_RATE_LIMITED",
"message": "Limite de gerações atingido. Tente novamente quando o período for renovado.",
"limit": 10,
"remaining": 0,
"reset_at": "2026-04-23T12:00:00.000Z"
}O guia cobre Fashion, Óculos, Home (Móveis, Revestimentos e Pisos) e Measurements, com leituras e instalação do runtime de óculos.
Recebe a foto da pessoa, o UUID do produto Fashion ativo e o recibo emitido pelo runtime autorizado. Devolve a imagem gerada em binário.
https://app.provei.ai/api/v2/widget-fashion/try-onEstas são rotas públicas mediadas pelo widget. O navegador não envia API key; cada rota valida a origem e aplica suas próprias verificações de identidade e produto antes de processar.
Clientes cURL, Node.js e Python devem informar essa mesma origem explicitamente (por exemplo, Origin: https://loja.com.br); uma origem não autorizada é rejeitada antes da composição.
Content-Type: multipart/form-data (gerado automaticamente pelo cliente HTTP)| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
user_image | file | Sim | Foto da pessoa em PNG, JPEG ou WebP com no máximo 4 MiB. O limite de 5 MiB vale para o corpo multipart completo. |
reference_url | string | Sim | URL enviada para a composição. O handler localiza o produto Fashion ativo pelo product_id; quando a URL não coincide com a URL canônica cadastrada, a requisição não é rejeitada por esse desencontro e a URL informada segue para o serviço de composição. |
product_id | string (UUID) | Sim | UUID exato do produto Fashion ativo pertencente ao user_id. Ele seleciona o produto consultado pelo handler; não é comparado à reference_url para rejeitar um desencontro. |
user_id | string (UUID) | Sim | UUID do perfil proprietário usado pelo widget. A rota valida o formato, ownership, origem autorizada e provisionamento. |
identity_receipt | string | Sim | Recibo de identidade assinado emitido ou renovado pelo runtime do widget autorizado. Não é uma API key. |
visitor_id | string | Não | Identificador opcional do visitante para controle de rate limit. |
session_id | string | Não | Identificador opcional da sessão do visitante para o rate limit. |
customer_identity_hash | string | Não | Hash opcional de identidade persistente quando a integração já possui um identificador do cliente. |
curl -X POST https://app.provei.ai/api/v2/widget-fashion/try-on \
-H "Origin: https://loja.com.br" \
-H "Idempotency-Key: fashion-operation-unique-001" \
-F "user_image=@/caminho/foto-pessoa.jpg" \
-F "reference_url=https://loja.com.br/produto/camiseta-azul" \
-F "product_id=123e4567-e89b-12d3-a456-426614174000" \
-F "user_id=550e8400-e29b-41d4-a716-446655440000" \
-F "identity_receipt=SIGNED_WIDGET_RECEIPT" \
--output resultado.bin| Status | Mensagem | O que fazer |
|---|---|---|
400 | Content-Length declarado inválido, body ausente/ilegível ou Idempotency-Key ausente/acima de 255 caracteres. | Envie um body multipart legível e uma chave opaca única por composição. Um multipart que falhe na interpretação do formData pode resultar em 500. |
401 | Guard: identity_receipt inválido/ausente; serviço upstream: chave de API inválida, revogada ou indisponível no servidor. | Recarregue o runtime autorizado para emitir/renovar o recibo; a API key é resolvida apenas no servidor. |
402 | O serviço upstream confirmou créditos insuficientes. | Confirme o saldo de créditos da conta antes de iniciar uma nova composição. |
403 | Guard: origem não autorizada para o owner; serviço upstream: assinatura inativa. | Confira a origem cadastrada e o estado da assinatura; não tente substituir o guard por uma API key no browser. |
404 | Fashion não está provisionado para o owner ou product_id não identifica um produto Fashion ativo. | Confirme o UUID do perfil/produto e o provisionamento Fashion. Um desencontro entre reference_url e a URL canônica, sozinho, não gera este status. |
413 | O corpo multipart completo excede o limite de 5 MiB da rota Fashion. | Reduza a foto e o overhead do multipart; a imagem individual também deve ter até 4 MiB. |
422 | Campo inválido: imagem ausente/incompatível, reference_url vazia, UUID do produto/owner inválido ou identity_receipt acima de 4096 caracteres. | Corrija os campos validados do multipart e reenvie a requisição. |
429 | Visitante bloqueado por rate limit. O payload inclui `code: "VISITOR_RATE_LIMITED"`. | Leia Retry-After e os headers X-RateLimit-* antes de permitir nova tentativa. |
500 | Erro interno ao interpretar a requisição ou preparar a composição. | Confira o multipart e tente novamente; não trate esse retorno como confirmação de que a composição foi processada. |
503 | O serviço de composição está temporariamente indisponível. | Aguarde alguns instantes antes de reenviar. |
504 | O processamento excedeu o tempo limite de 120 segundos. | Configure o cliente para aguardar até 120 segundos e trate a operação como uma nova tentativa. |
Recebe selfie enviada ou foto estática da câmera frontal mobile e gera uma imagem de IA. Não é vídeo contínuo nem AR ao vivo.
https://app.provei.ai/api/v2/widget-glasses/try-onEstas são rotas públicas mediadas pelo widget. O navegador não envia API key; cada rota valida a origem e aplica suas próprias verificações de identidade e produto antes de processar.
Clientes cURL, Node.js e Python devem informar essa mesma origem explicitamente (por exemplo, Origin: https://loja.com.br); uma origem não autorizada é rejeitada antes da composição.
Origin autorizado e Idempotency-Key obrigatórios. FormData gera o Content-Type/boundary. Não envie API key, credenciais de IA ou imagens de referência do catálogo.| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
user_image | file | Sim | Foto da pessoa em PNG, JPEG ou WebP com no máximo 4 MiB. O limite de 5 MiB vale para o corpo multipart completo. |
reference_url | string | Sim | URL equivalente à referência canônica do produto glasses ativo. O servidor normaliza a comparação e rejeita desencontro com 404; não encaminha uma URL arbitrária como Fashion. |
product_id | string (UUID) | Sim | UUID exato do produto glasses ativo pertencente ao user_id. Obtenha-o pela correspondência de URL do catálogo. |
user_id | string (UUID) | Sim | UUID do perfil proprietário usado pelo widget. A rota valida o formato, ownership, origem autorizada e provisionamento. |
identity_receipt | string | Sim | Recibo de identidade assinado emitido ou renovado pelo runtime do widget autorizado. Não é uma API key. |
visitor_id | string | Não | Identificador opcional do visitante para controle de rate limit. |
session_id | string (UUID) | Não | UUID opcional da sessão, usado no rate limit e encaminhado à composição. |
customer_identity_hash | string | Não | Hash opcional de identidade persistente quando a integração já possui um identificador do cliente. |
# Substitua pelos dados reais da instalação e recibo do runtime autorizado.
# Preserve GLASSES_OPERATION_ID e os mesmos campos em reenvios.
curl --fail-with-body --max-time 125 \
"https://app.provei.ai/api/v2/widget-glasses/try-on" \
-H "Origin: https://loja.com.br" \
-H "Idempotency-Key: ${GLASSES_OPERATION_ID}" \
-F "[email protected];type=image/jpeg" \
-F "reference_url=https://loja.com.br/produto/oculos-preto" \
-F "product_id=${GLASSES_PRODUCT_ID}" \
-F "user_id=${GLASSES_OWNER_ID}" \
-F "identity_receipt=${WIDGET_IDENTITY_RECEIPT}" \
--output resultado.bin| Status | Mensagem | O que fazer |
|---|---|---|
400 | Content-Length declarado inválido, body ausente/ilegível ou Idempotency-Key ausente/acima de 255 caracteres. | Envie um body multipart legível e uma chave opaca única por composição. Um multipart que falhe na interpretação do formData pode resultar em 500. |
401 | Guard: identity_receipt inválido/ausente; serviço upstream: chave de API inválida, revogada ou indisponível no servidor. | Recarregue o runtime autorizado para emitir/renovar o recibo; a API key é resolvida apenas no servidor. |
402 | O serviço upstream confirmou créditos insuficientes. | Confirme o saldo de créditos da conta antes de iniciar uma nova composição. |
403 | Guard: origem não autorizada para o owner; serviço upstream: assinatura inativa. | Confira a origem cadastrada e o estado da assinatura; não tente substituir o guard por uma API key no browser. |
404 | Acesso glasses ausente, produto inexistente/inativo/de outro owner ou tipo, ou reference_url não canônica. | Confirme provisionamento glasses e produto ativo do owner; use a URL canônica cadastrada. |
413 | Corpo multipart completo acima de 5 MiB. | Normalize a selfie inteira para até 4 MiB, sem recortar o rosto, e reduza o overhead multipart. |
422 | Campo inválido: imagem ausente/incompatível, reference_url vazia, UUID do produto/owner inválido ou identity_receipt acima de 4096 caracteres. | Corrija os campos validados do multipart e reenvie a requisição. |
429 | Visitante bloqueado por rate limit. O payload inclui `code: "VISITOR_RATE_LIMITED"`. | Leia Retry-After e os headers X-RateLimit-* antes de permitir nova tentativa. |
500 | Erro interno ao interpretar a requisição ou preparar a composição. | Confira o multipart e tente novamente; não trate esse retorno como confirmação de que a composição foi processada. |
503 | O serviço de composição está temporariamente indisponível. | Aguarde alguns instantes antes de reenviar. |
504 | O processamento excedeu o tempo limite de 120 segundos. | Timeout não prova ausência de efeito. Reenvie a mesma operação com a mesma chave e payload; não inicie nova geração automaticamente. |
409 | Conflito de idempotência/admissão retornado pelo serviço de composição. | Não contorne o conflito trocando a chave; mantenha a identidade da operação e confira o payload. |
Recebe a foto do ambiente, a URL de referência e o recibo emitido pelo runtime autorizado. O servidor encontra o tipo canônico furniture, revestimento ou pisos pela URL; o cliente não escolhe product_type.
https://app.provei.ai/api/v2/widget/composeEstas são rotas públicas mediadas pelo widget. O navegador não envia API key; cada rota valida a origem e aplica suas próprias verificações de identidade e produto antes de processar.
Clientes cURL, Node.js e Python devem informar essa mesma origem explicitamente (por exemplo, Origin: https://loja.com.br); uma origem não autorizada é rejeitada antes da composição.
Headers obrigatórios: Origin (origem autorizada) e Idempotency-Key. Não envie API key, product_type nem imagens de referência do catálogo.| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
environment_image | file | Sim | Foto do ambiente em PNG, JPEG ou WebP com no máximo 4 MiB. O mesmo campo serve para Móveis, Revestimentos e Pisos. |
reference_url | string (HTTPS URL) | Sim | URL da página do produto ativo. O servidor normaliza a URL, encontra uma única linha do catálogo e resolve o modo provisionado. |
user_id | string (UUID) | Sim | UUID do perfil usado na instalação do widget. Não concede acesso sozinho: origem autorizada, ownership e recibo também são verificados. |
identity_receipt | string | Sim | Recibo de identidade assinado emitido ou renovado pelo runtime do widget autorizado. Não envie uma API key. |
mask_image | file (PNG) | Não | Máscara PNG opcional apenas para o modo furniture (Móveis). Para Revestimentos e Pisos, o servidor rejeita este campo. |
visitor_id | string | Não | Identificador opcional de visitante para o rate limit. |
session_id | string | Não | Identificador opcional de sessão para o rate limit. |
customer_identity_hash | string | Não | Hash opcional de identidade persistente para o rate limit. |
curl -X POST https://app.provei.ai/api/v2/widget/compose \
-H "Origin: https://loja.com.br" \
-H "Idempotency-Key: home-operation-unique-001" \
-F "environment_image=@/caminho/foto-ambiente.jpg" \
-F "reference_url=https://loja.com.br/produto/sofa-marrom" \
-F "user_id=550e8400-e29b-41d4-a716-446655440000" \
-F "identity_receipt=SIGNED_WIDGET_RECEIPT" \
-F "mask_image=@/caminho/mascara.png" \
--output resultado.bin| Status | Mensagem | O que fazer |
|---|---|---|
400 | Body/multipart inválido, ou Idempotency-Key ausente ou acima de 255 caracteres. | Envie multipart/form-data legível e uma chave opaca única por composição. |
401 | Guard: identity_receipt inválido/ausente; serviço upstream: chave de API inválida, revogada ou indisponível no servidor. | Recarregue o runtime autorizado para obter um recibo válido; a API key permanece no servidor. |
402 | O serviço upstream confirmou créditos insuficientes. | Confirme o saldo de créditos da conta antes de iniciar uma nova composição. |
403 | Guard: origem não autorizada para o owner; serviço upstream: assinatura inativa. | Confirme a origem registrada e o estado da assinatura antes de reenviar. |
404 | Nenhum produto ativo corresponde à URL normalizada, ou o modo Home não está provisionado. | Use a URL canônica do produto e confirme o provisionamento de Móveis, Revestimentos ou Pisos. |
409 | Mais de um produto ativo corresponde à URL normalizada. | Corrija a duplicidade do catálogo antes de gerar a composição. |
413 | O corpo multipart completo excede o limite permitido de 9 MiB. | Reduza a imagem do ambiente e remova campos desnecessários antes de reenviar. |
422 | ID do owner ausente, imagem/referência inválida, imagem acima de 4 MiB, imagem de referência indisponível ou máscara incompatível com o modo. | Corrija o multipart; para Revestimentos e Pisos, não envie mask_image. |
429 | Visitante bloqueado por rate limit. O payload inclui `code: "VISITOR_RATE_LIMITED"`. | Leia Retry-After e os headers X-RateLimit-* antes de permitir nova tentativa. |
500 | Ocorreu um erro temporário. | Registre o contexto e tente novamente conforme sua política. |
503 | O serviço de composição está temporariamente indisponível. | Aguarde alguns instantes antes de reenviar. |
504 | O processamento excedeu o tempo limite de 120 segundos. | Configure o cliente para aguardar até 120 segundos e trate a operação como uma nova tentativa. |
Consulta as capacidades de medidas para o produto da URL. A rota retorna JSON e não recebe body, multipart, API key ou Idempotency-Key.
https://app.provei.ai/api/v2/widget-measurements/matchEstas são rotas públicas mediadas pelo widget. O navegador não envia API key; cada rota valida a origem e aplica suas próprias verificações de identidade e produto antes de processar.
Clientes cURL, Node.js e Python devem informar essa mesma origem explicitamente (por exemplo, Origin: https://loja.com.br); uma origem não autorizada é rejeitada antes da composição.
GET com `userId` (UUID), `url` (URL absoluta) e `Origin` (origem autorizada). Nenhum body, multipart ou header de idempotência.| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
userId | string (UUID) | Sim | UUID do perfil proprietário. A rota verifica origem, ownership e se há pelo menos uma ação de medidas provisionada. |
url | string (URL) | Sim | URL da página do produto. Query string, hash e a barra final são normalizados antes do matching. |
curl "https://app.provei.ai/api/v2/widget-measurements/match?userId=550e8400-e29b-41d4-a716-446655440000&url=https%3A%2F%2Floja.com.br%2Fproduto%2Fcamiseta-azul" \
-H "Origin: https://loja.com.br"| Status | Mensagem | O que fazer |
|---|---|---|
200 eligible: false | A resposta de capacidade não encontrou uma ação utilizável para esta URL. | Leia `reason`: "service_disabled", "no_measurements", "product_inactive", "not_a_product_page", "no_comparable_sizes", "measurement_basis_unclassified", "display_only_table" ou "insufficient_common_dimensions". |
200 eligible: true | O produto tem pelo menos uma capacidade disponível; `sizes` pode ser vazio quando só há visualização ou recomendação. | Use os booleanos `canShowSizeGuide`, `canRecommendSize`, `canVisualizeRecommendedSize` e `canCompareSizes` para escolher a ação. |
400 | Parâmetros inválidos: userId ausente/inválido ou url ausente/inválida na query string. | Envie um UUID válido em userId e uma URL absoluta codificada em url. |
403 | A origem da página não está autorizada para o owner. | Faça a chamada a partir de uma origem registrada para o perfil. |
404 | O perfil ou uma ação de medidas não está provisionado para esta consulta. | Confirme o UUID e o provisionamento de Tamanho Ideal, Guia de Medidas ou Comparar tamanhos. |
500 | Erro interno ao buscar configuração ou correspondência. | Tente novamente; o endpoint não expõe detalhes internos no payload. |
arrayBuffer, bytes ou blob.sizes vazio quando a capacidade disponível é apenas de visualização/recomendação.visitor_id, session_id ou customer_identity_hash quando disponíveis e respeite Retry-After/X-RateLimit-* em 429.Abaixo está a referência interativa carregada de /api/reference. Ela inclui as composições e leituras do widget deste guia e também os caminhos legados intencionalmente expostos para clientes e produtos; os conjuntos de endpoints não são idênticos.
Consulte /api/docs para explorar a referência interativa. Este guia documenta as rotas do widget e seus contratos mediados pelo runtime; a referência também mantém as APIs legadas de clientes e produtos porque elas são expostas intencionalmente.