Cria um pagamento por biometria (Pix confirmado no aparelho de quem paga) e devolve o link de quem paga
Cria o pedido de um Pix que a pessoa confirma no próprio aparelho, com biometria ou bloqueio de tela. Entregue o payer_url a quem paga. O Pix é iniciado via Open Finance Brasil por uma instituição iniciadora de pagamento autorizada pelo Banco Central; o dinheiro vai direto da conta de quem paga para a conta de destino, e a UNIFOKAL não guarda nem movimenta o valor. Exige uma chave secreta criada COM o escopo pix_payments:write (chaves sem restrição não o têm) e o cadastro da organização aprovado. Idempotência pelo reference_id do corpo, sem janela e sem Idempotency-Key: repetir com o mesmo corpo devolve 200 com Idempotent-Replay: true, o estado ATUAL e o mesmo payer_url; com outro corpo é 422 idempotency_key_reuse. Não existe GET nem cancelamento pela API: o desfecho chega pelos webhooks pix_payment.succeeded, pix_payment.failed, pix_payment.expired e pix_payment.refunded, no webhook do flow. A volta do navegador de quem paga nunca prova pagamento. No sandbox (chave unifokal_test_) a confirmação acontece num banco de teste, com redirecionamento, e nenhum dado pessoal seu sai; estados e webhooks são os de produção, e nada é cobrado. Em produção, a tarifa sai do seu saldo só no Pix concluído.
Autorizações
Chave secreta (unifokal_live_ em produção, unifokal_test_ no sandbox: 64 hex mais CRC-32) no Authorization: Bearer. Só no seu servidor: nunca no browser ou app (o widget monta apenas com o id vs_ da sessão). Não existe chave publishable.
Corpo
Flow do mesmo ambiente da chave, com o módulo pix_payment e um webhook do mesmo ambiente: os eventos pix_payment.* chegam no webhook desse flow.
^flow_[0-9A-Za-z_]{1,64}$O id do PEDIDO no seu sistema e a chave de idempotência, permanente: repetir com o mesmo corpo devolve o estado atual e o mesmo payer_url (200, Idempotent-Replay: true); com outro corpo é 422 idempotency_key_reuse. Depois de failed ou expired, um pagamento novo usa outro reference_id. Nunca ponha CPF, e-mail ou telefone aqui.
1 - 255Valor em centavos de real, inteiro de 1 a 2147483647. Não é teto de negócio: o limite é o do banco de quem paga.
1 <= x <= 2147483647Opcional, até 140 caracteres, sem caractere de controle. É mostrada a quem paga.
1 - 140^[^\u0000-\u001f\u007f-\u009f]*$Conta de destino cadastrada no painel (pxr_). Sem destination_id nem destination vale o destino padrão do flow; sem nenhum dos três é 422 destination_required.
^pxr_[0-9A-Za-z_]{1,64}$A conta de destino por extenso, no lugar do destination_id. Em produção tem de casar com uma conta cadastrada no painel, ativa e já utilizável; no sandbox qualquer conta válida passa e nada sai.
Opcional: CPF (11 dígitos, dígito verificador conferido) e nome de quem paga. Presente, a confirmação não pede o CPF de novo. Nunca volta em resposta nem em webhook.
Opcional: https para onde quem paga volta ao terminar, com ?pix_payment_id=pxp_... e sem estado na URL. A volta do navegador não prova pagamento: o webhook é a fonte da verdade.
Validade do link de quem paga, de 1800 (30 minutos) a 604800 (7 dias). Padrão 86400 (24 horas).
1800 <= x <= 604800Resposta
Repetição do mesmo reference_id com o mesmo corpo: o estado atual e o mesmo payer_url.
Um pagamento por biometria. Nada de quem paga sai neste objeto. Campo novo pode surgir sem subir a versão: ignore chave desconhecida.
Id do pagamento por biometria (pxp_ + ULID).
^pxp_[0-9A-HJKMNP-TV-Z]{26}$"pix_payment"true em produção (chave unifokal_live_), false no sandbox.
O id do pedido no seu sistema, o mesmo do corpo da criação.
Id de flow (flow_ + ULID). Criado no painel, nunca pela API da chave secreta.
^flow_[0-9A-HJKMNP-TV-Z]{26}$A sessão de verificação que criou o pagamento, quando ele nasceu no widget; null quando nasceu pela API.
^vs_[0-9A-HJKMNP-TV-Z]{26}$awaiting_payer: esperando quem paga; processing: a confirmação começou; succeeded: Pix concluído e confirmado; failed: falha definitiva do pedido; expired: prazo vencido sem Pix; refunded: devolvido depois do sucesso.
awaiting_payer, processing, succeeded, failed, expired, refunded x >= 1"BRL"A conta de destino, mascarada.
O link de quem paga, com a credencial no fragmento (#). Só na resposta da criação e na repetição; null no webhook. Não registre em log.
O identificador fim a fim do Pix, depois do sucesso.
Só em failed e expired.
A categoria da última tentativa que não concluiu. not_completed_by_payer cobre tudo que é de quem paga (recusa, tempo, saldo, limite); o motivo exato só quem paga vê.