PAN/Crefaz no sandbox, re-simulação, margem em employers[] e correções de doc
Sandbox: PAN e Crefaz liberados + re-simulação por parâmetros
- Banco PAN e Crefaz entraram no allowlist do sandbox. CPFs de teste
novos (os anteriores tinham dígito verificador inválido e foram
substituídos):
50077799976(PAN — autorização WhatsApp pendente, com linkwa.me),40066688809(PAN — consulta ok),30055577741(Crefaz — SMS DataPrev pendente, sem link),20044466684(Crefaz — consulta ok). - Re-simulação no sandbox:
prazo,loan_valueevalor_parcelaagora alteram os números das ofertas, como em produção. O cenário de cada CPF é o teto (valor = margem máxima, parcelas = prazo máximo); pedido acima volta clampado comadjusted/adjustments. Modelo linear simplificado — homologa fluxo e teto, não precificação.
Consulta
employers[].margin: a margem consignável apurada em tempo real na consulta, normalizada em número (Unit e Facta informam hoje;nullnos demais). O array traz{cnpj, name, matricula, provider, margin}.adjusted/adjustmentspor oferta: ajuste de prazo/valor sinalizado — inclusive o caso “pedi 36x, voltou 18x”, que antes passava sem flag.providerscom typo agora é 422: nenhum nome válido na interseção com o allowlist devolve422 invalid_input(field: providers) listando os bancos do seu contrato, em vez de200comproviderResultsvazio.
Correção de documentação — submit PAN/Crefaz pré-autorização
As notas de 27/07 diziam que submit antes da autorização concluída voltavaprovider_unavailable/retryable: true. O comportamento real é 422 invalid_input apontando offer_ref.offer_id: aguarde o webhook
authorization_result (ou re-consulte) e submeta com o offerId novo. As
notas antigas abaixo foram corrigidas.Fluxo WhatsApp: link de autorização com colheita de evidência
Autorização com colheita de evidência — atendimentos 100% WhatsApp
Zipdin, Unit e Facta exigem evidência de autorização do titular (IP, geo, dispositivo) — que uma conversa de WhatsApp não tem como colher. Agora a API resolve isso de ponta a ponta:POST /partners/v1/authorizationsgera um link de autorização (72h, idempotente por CPF); o cliente abre a página compacta, lê o termo LGPD e autoriza com um toque — IP (capturado no servidor), geolocalização, dispositivo e versão do termo ficam registrados na Unit.- Webhook
authorization.completedavisa sua integração (ou poll noGET /authorizations/{id}, que devolve a evidência completa). - As rotas de consulta aceitam
authorization_idno lugar declient_ip: a evidência é injetada no servidor — sua integração nunca transita IP/geo do cliente.
Fluxo de leilão: lookup da proposta por proposal_key
Leilão — recupere a proposta e os dados do cliente pela proposal_key
Novo endpoint GET /partners/v1/auction-proposals/{proposal_key}: quando o
cliente chega pelo link do leilão, você recupera a proposta (valores, taxa,
parcelas) e os dados do cliente (nome, CPF, nascimento, empregador,
elegibilidade, margem) antes de pedir qualquer dado na tela — e
pré-preenche a jornada. Sem efeitos colaterais: não cria proposta, não
dispara SMS.Requer a Unit no allowlist do seu contrato (403 sem). Erros com semântica:
404 para chave desconhecida/expirada, 502 para falha do banco parceiro.No sandbox: sbx-leilao-ok devolve 200 com um cliente fictício (CPF
11144477735, o mesmo do catálogo — encadeie lookup → consulta →
formalização com um CPF só); sbx-leilao-expirada devolve 404. A
collection do Postman ganhou a pasta “Leilão — lookup por proposal_key”.Zipdin: causa raiz do erro de 'data de vencimento inicial' resolvida
Zipdin — submit se recupera sozinho do erro de “data de vencimento inicial”
Identificamos a causa raiz definitiva do erroinitialDueDate: A data de vencimento inicial é obrigatória! no submit da
Zipdin: ele ocorre quando a proposta ainda não tem uma simulação salva
do lado do banco — não é um campo do seu request (e o endpoint da Zipdin
rejeita o campo initialDueDate se enviado; a derivação automática
anunciada em 24/07 foi substituída por este mecanismo). Agora, ao receber
esse erro do banco, a API salva automaticamente a simulação da oferta
escolhida e re-tenta o submit — transparente para a sua integração.Nada muda no seu request. Se você envia initialDueDate por conta própria,
pare: o campo é removido do payload antes do envio ao banco.Zipdin: chave PIX por e-mail corrigida
Zipdin — chave PIX do tipo e-mail agora vai com o código correto
Correção de um defeito de tradução no submit da Zipdin:recebimento.pix
com tipo_chave: "email" era enviado ao banco com o código de telefone
(a Zipdin usa 1=e-mail, 2=telefone, 3=CPF, 4=aleatória). Chaves de
e-mail podiam ser recusadas (“chave inválida”) ou registradas com o tipo
errado. Se algum submit seu com PIX por e-mail falhou, basta reenviar.
Os demais tipos (cpf, telefone→vira chave CPF, aleatoria) não mudam.Novo banco: Banco PAN (consignado CLT) — sob habilitação
Banco PAN disponível na API (mediante habilitação no contrato)
Suporte completo ao Banco PAN: consulta, submit, status, formalização e sandbox. Como a Crefaz, só aparece pra sua integração quando entrar no allowlist do seu contrato.Pontos de atenção:- Autorização por WhatsApp: a consulta devolve o link; o cliente envia
a mensagem para autorizar.
submitantes disso volta422 invalid_inputapontandooffer_ref.offer_id(corrigido em 14/08 — esta nota diziaprovider_unavailable/retryable, o que nunca foi o comportamento); o webhookauthorization_resultavisa quando concluir, e a consulta seguinte traz as ofertas comofferId. vinculo.matriculaé obrigatória; os termos financeiros são resolvidos server-side (o parceiro nunca envia valores).- Sandbox: CPFs
400.666.888-09(fluxo completo) e500.777.999-76(autorização pendente) — atualizados em 14/08; os originais tinham dígito verificador inválido.
Novo banco: Crefaz (Crédito do Trabalhador) — sob habilitação
Crefaz disponível na API (mediante habilitação no contrato)
A API de Parceiros ganhou suporte completo à Crefaz (Crédito do Trabalhador — consignado privado CLT): consulta, submit, formalização, status e sandbox. O banco só aparece pra sua integração quando entrar no allowlist do seu contrato — fale com o time de parceiros da Unit.Pontos de atenção do fluxo Crefaz:- Autorização por SMS (DataPrev): a consulta dispara um SMS pro
cliente; um
submitantes da autorização volta422 invalid_inputapontandooffer_ref.offer_id(corrigido em 14/08 — esta nota diziaprovider_unavailable/retryable, o que nunca foi o comportamento). O webhookauthorization_resultavisa quando a autorização concluir. - Bloco novo
referencias: a Crefaz exige 2 referências pessoais (nome + telefone) no dataset de submissão; os demais bancos ignoram. - Recebimento só por conta bancária (sem PIX), com o código COMPE do banco.
- Sandbox: CPFs
200.444.666-84(fluxo completo) e300.555.777-41(SMS pendente) no catálogo de homologação — o segundo atualizado em 14/08; o original tinha dígito verificador inválido.
Zipdin: data de vencimento inicial enviada automaticamente
Zipdin não recusa mais submit por “data de vencimento inicial”
Submits Zipdin feitos um tempo depois da consulta podiam ser recusados com “initialDueDate: A data de vencimento inicial é obrigatória!” — o banco passa a exigir a data quando o pré-registro não é recente.
Atualização 30/07: o mecanismo descrito aqui foi substituído — a
causa raiz era outra (simulação não salva no banco) e a solução atual
está na entrada de 30 de julho. initialDueDate não deve ser enviado. Recomendação que continua valendo: formalize o quanto antes
após a consulta — ofertas são reprecificadas pelos bancos ao longo do dia.
Formalização Unit (carteira QI Tech) corrigida + instabilidade do banco sinalizada como retryable
Formalização Unit em carteira QI Tech não falha mais com 500
Contratos Unit cuja oferta foi simulada na carteira QI Tech podiam falhar na formalização comprovider_error (500 do banco): o parceiro bancário
passou a exigir o campo transfer_method no bloco de desembolso desse
caminho. A API agora envia o campo automaticamente — nada muda no seu
request. Se você recebeu esse erro, basta reenviar o mesmo submit.Instabilidade do banco agora vem como provider_unavailable retryable
Erros crus de infraestrutura do banco (HTTP 5xx) durante o submit
respondiam provider_error com retryable: false e HTML no corpo da
mensagem. Agora respondem provider_unavailable / retryable: true
(502) com mensagem limpa — seu bot pode re-tentar em alguns minutos com
segurança (o dedup do lado da API impede duplicidade).Zipdin traduz estado civil e nacionalidade automaticamente
No submit da Zipdin,titular.estado_civil canônico (ex.: uniao_estavel)
era repassado cru ao banco e recusado (“caracteres não permitidos”), e
titular.nacionalidade textual ou ausente caía em “Favor informar somente
1 ou 2”. A API agora converte os dois para o formato que o banco exige —
mesma responsabilidade de tradução já exercida nos campos da Facta.
Continue enviando os valores canônicos da documentação.Também na Zipdin: titular.nome_pai é opcional, mas o banco recusa o
submit inteiro se ele vier com nome incompleto (uma palavra só). A API
agora omite o campo nesse caso em vez de deixar o envio falhar — envie o
nome completo do pai ou simplesmente não envie o campo.offerId não some mais em consultas longas
Em consultas muito demoradas (banco lento, >90s), um blip de conexão
interna podia fazer a resposta chegar com offerId: null em todas as
propostas (e simulationGroupId: null) — a persistência das ofertas
falhava em cascata. A camada de persistência agora é resiliente a esses
blips e o offerId volta a ser garantido em toda resposta com proposta.
Se você recebeu uma resposta assim, basta re-consultar.offerId garantido em toda resposta + classificação de recusas
offerId presente em 100% das consultas
Re-consultas em sequência rápida (menos de 60s) podiam voltar com
offerId: null, forçando o uso do simulationId — que na Unit muda a
cada chamada e não era reconhecido no submit. Agora toda resposta da
consulta agregada traz offerId: a mesma oferta mantém o mesmo id
entre consultas (estável), e ofertas novas ganham id próprio. O caveat dos
60s deixa de existir. Use sempre o offerId no offer_ref.offer_id.Recusa por estado do cliente não é “banco indisponível”
Recusas determinísticas como “Cliente possui contrato em andamento” agora respondemprovider_rejected / retryable: false (422) com a
mensagem real do banco — antes saíam como provider_unavailable
retryable (502), induzindo retry em loop. Nesses casos, ofereça outro
banco ao cliente em vez de repetir o envio.Um card por jornada + fases fiéis no acompanhamento
Consultas repetidas do mesmo CPF passaram a reutilizar a mesma proposta interna (oproposal_id do submit fica estável entre consultas), e o
andamento reflete a fase real (em simulação / sem oferta disponível).Facta: tradução de cidade/nacionalidade + classificação correta de validação
Facta traduz cidade e nacionalidade automaticamente
No submit da Facta,endereco.cidade e titular.naturalidade_cidade
agora são convertidos automaticamente do nome do município para o código
que o banco exige, e titular.nacionalidade textual (“Brasileira”) vira o
código do banco — mesma responsabilidade de tradução que a API já exerce
para estado_civil e tipo_conta. Continue enviando os valores humanos
canônicos.Erro de validação não aparece mais como “banco indisponível”
Rejeições determinísticas de campo pelo banco agora respondemprovider_rejected com retryable: false (HTTP 422) — antes saíam
como provider_unavailable/retryable: true (502), o que induzia bots a
reapresentar o mesmo request em loop. Se receber provider_rejected,
corrija os dados; provider_unavailable segue reservado para
indisponibilidade real (aí sim, retry).Formalização corrigida nos 4 bancos + status honesto
Submit Unit — contrato idêntico ao fluxo interno
Osubmit de propostas Unit podia falhar com provider_error (500 do
banco): o contrato enviado divergia do formato que o fluxo interno usa em
produção (taxa em formato errado, vencimento ausente, identificadores
trocados e carteira diferente da simulação). Agora o contrato é montado
integralmente a partir da oferta persistida na consulta e sai na mesma
carteira em que a oferta foi simulada. Nada muda no seu request — mesmo
offer_ref.offer_id de sempre.Formalização C6 e Facta corrigidas + desembolso Unit
Auditoria completa de paridade contra o fluxo interno de produção:- C6: o identificador de simulação passou a ser resolvido server-side a
partir do
offer_ref.offer_idda consulta (numéricoofferIdou oid_simulacaonativo — ambos aceitos); tipo de conta agora aceita formatos comuns (“corrente”, “poupança”, códigos) e é traduzido pro enum do banco; dígitos de agência/conta são normalizados. - Facta: conta de recebimento montada com o dígito verificador; estado
civil aceita a palavra em português (“solteiro”, “casado”…) além do
código; o link de formalização agora fica disponível também no
formalizee no status (antes só na resposta do submit). - Unit: dados de desembolso (PIX/conta) corrigidos para o formato do banco — chave PIX de CPF/celular é normalizada automaticamente; contrato, assinatura e status operam sempre na mesma carteira da oferta.
Zipdin: submit e formalização corrigidos
A formalização Zipdin via API não funcionava: identificadores internos vazavam para o banco, a conveniada ia vazia e datas em formato ISO eram rejeitadas. Corrigido de ponta a ponta: a proposta do pré-registro é resolvida server-side a partir dooffer_ref.offer_id da consulta, a
conveniada é preenchida automaticamente, datas são convertidas ao formato
do banco e chave PIX de telefone é substituída pela chave CPF do titular
(a Zipdin não aceita PIX por telefone). Mesmo request de sempre — refaça a
consulta antes do submit para garantir uma oferta atualizada.Status mais honesto no acompanhamento de propostas
GET /proposals/{id}agora retornaawaiting_signatureenquanto o contrato aguarda a assinatura do titular (Unit e Facta) — antes o status podia aparecer comocreatedou atédisbursednessa fase.- Consulta agregada com tempo-limite explícito: sob lentidão extrema de um
banco, a resposta é
502 provider_unavailable(retryable) no formato do contrato — não mais um 504 genérico do proxy. - Consultas simultâneas do mesmo CPF por integrações diferentes não se misturam mais (cada parceria mantém sua própria proposta).
cancel: suportado apenas pela Facta (agora refletido corretamente — demais bancos retornam501).
offerId universal, modos de simulação, fallback de carteira e GET /banks
offerId em toda oferta + formalização Facta funcional
A consulta agregada agora retorna offerId em cada oferta — o
identificador canônico para o offer_ref.offer_id do submit, em qualquer
banco.- Facta: a formalização passou a resolver a oferta server-side — a
API re-executa a simulação no momento do submit com os dados da tabela
escolhida. O identificador nunca expira; se a tabela não estiver mais
elegível, a resposta é
409 offer_expired(refaça a consulta). Corrige o contrato anterior, que pedia umid_simuladorque a consulta de produção não retornava. - Unit: também aceita o
offerId(osimulationIdlegado continua válido). - C6/Zipdin: na época, seguiam com os ids nativos do
providerData— desde 16/07 oofferIdtambém é resolvido server-side para os dois. offerIdpode virnullapenas ao repetir a mesma consulta sem parâmetros em menos de 60 segundos (dedup de re-clique) — aguarde e re-consulte. Re-simulações com valor/parcela/prazo sempre trazemofferId(ver abaixo).
offerId imediato na re-simulação com parâmetros
O fluxo natural — consultar, ver a oferta máxima, o cliente pedir outro
valor e re-consultar em seguida — caía na janela de deduplicação de 60
segundos e as ofertas novas voltavam com offerId: null, impedindo o
submit imediato. Agora toda consulta com loan_value, valor_parcela ou
prazo persiste as ofertas na hora: a resposta traz offerId utilizável
no ato, sem espera. A janela de 60s continua valendo só para a repetição
da mesma consulta sem parâmetros (proteção contra duplo clique).Simulação por valor sem prazo agora funciona na Unit
loan_value enviado sem prazo passava batido na Unit: o valor pedido
era ignorado e a resposta trazia a proposta máxima disponível. Agora a Unit
assume 48 parcelas (o mesmo default do nosso formulário interno) e
ajusta automaticamente quando o prazo não está disponível — o valor pedido
é honrado. Para fixar um prazo específico, envie prazo junto. Os dois
modos de simulação (“por valor final” e “por parcela”) estão documentados
nos campos da consulta.Unit consulta duas carteiras antes de responder “sem proposta”
A elegibilidade na Unit é por carteira: um cliente inelegível na carteira padrão (BMP) pode ter oferta na QI Tech — e a consulta parava na primeira, devolvendo “sem proposta” para clientes com crédito disponível. Agora, se nenhum vínculo for elegível na carteira padrão, a consulta tenta automaticamente a QI Tech antes de responder. Nada muda no seu contrato de integração: mesma chamada, mesma resposta — apenas mais ofertas. A formalização usa automaticamente a mesma carteira da oferta.Formalização Unit devolve o link de assinatura de forma confiável
Contratos Unit emitidos pela carteira BMP já nascem com o link de assinatura (QiSign), mas uma falha na captura do identificador da CCB fazia oformalize responder erro em vez do link em alguns cenários — inclusive ao
reformalizar um contrato já existente. Corrigido: o identificador e o link
são persistidos na emissão e o formalize devolve o link direto
(requires_action + signatureUrl), sem depender de nova chamada ao banco.Lista de bancos para conta de recebimento
Novo endpointGET /partners/v1/banks: devolve os
códigos COMPE aceitos em recebimento.conta_bancaria.banco —
{"banks": [{"code", "name"}]}. Use para popular o seletor de banco no seu
formulário; a aceitação final por instituição segue validada no submit.Webhook de autorização do C6 + validação na borda
Webhook de autorização do C6 (biometria)
O eventoauthorization_result do C6 entrou no ar. Quando o
titular conclui a prova de vida, a Unit envia um webhook com as ofertas do C6
já embutidas — você não precisa mais ficar consultando o status para saber que
a autorização foi concluída.- Payload com ofertas. O webhook traz
event: "authorization_result",status: "approved"e o arrayoffersno mesmo formato da consulta síncrona. - Assinado. Header
X-Unit-Signature(HMAC-SHA256 do corpo). Valide sempre com comparação em tempo constante. - Entrega at-least-once. Trate os webhooks de forma idempotente,
deduplicando por
(external_reference, event).
Sandbox: o CPF de teste
12345678909 simula esse fluxo de ponta a ponta —
a 1ª consulta retorna requires_action + link e, ~15s depois, as ofertas são
liberadas e o webhook dispara. Configure um webhook_url no cadastro sandbox
para recebê-lo.Validação mais clara na entrada
telefone: formato canônico é DDD+número (10-11 dígitos); o DDI55é aceito e removido automaticamente. Fora disso,422 invalid_input.email: obrigatório em formato válido (o HubCrédito não processa consultas sem e-mail).- Erros de validação nas rotas
/partners/v1/*agora respondem422com o envelope documentado ({"code": "invalid_input", "message", "retryable", "field"}) — antes saíam como400num formato interno.
Lançamento público da API de Parceiros
Lançamento público da API de Parceiros
Primeira versão pública da API/partners/v1/*, cobrindo o fluxo completo de
originação de crédito consignado em múltiplos bancos numa integração única.- Consulta agregada multi-banco.
POST /partners/v1/consultas— numa chamada você consulta todos os bancos habilitados para a sua parceria (ou um subconjunto), com resposta síncrona ou por streaming (SSE). - Formalização unificada.
submit,formalize,statusecancelnum contrato único para Zipdin, Unit, C6 e Facta — link de assinatura e acompanhamento de status inclusos. - Sandbox de homologação. Ambiente 100% simulado (
sandbox.api.somosunit.com.br), com catálogo de CPFs de teste para cada cenário — sem tocar em nenhum banco real. - Collection do Postman. Endpoints e environments (produção e sandbox) prontos para importar.

