Pular para o conteúdo principal

Lifecycle

Máquinas de estado do estoque de recebíveis e da operação de antecipação. Os campos e payloads de cada transição estão na Referência Técnica.

Estoque de recebíveis​

Um recebível registrado no estoque entra como IN_STOCK e segue:

StatusSignificado
IN_STOCKDisponível para antecipação.
CONSUMEDAntecipado — virou título de uma operação.
EXPIREDExpirou por TTL (POST /v1/stock/{id}/expire).
CANCELLEDCancelado (POST /v1/stock/{id}/cancel).

Operação​

Uma operação é a antecipação efetiva. Criada via estoque (/v1/stock/request-anticipation) ou diretamente (/v1/operations/direct):

StatusSignificado
WAITING_APPROVALAguardando aprovação do Backoffice. Pode ser cancelada.
APPROVED_DIRECTDentro do limite de auto-aprovação. Contrato enviado imediatamente.
CONTRACT_SENT / IN_SIGNATURE / SIGNEDFluxo de assinatura eletrônica do contrato.
WAITING_RELEASE / PROCESSING_PAYMENTFunding e envio do PIX ao cedente.
PAIDPIX creditado ao cedente.
COMPLETEDTodos os títulos da operação foram pagos pelos sacados.
DENIED / CANCELLEDNegada pelo Backoffice / cancelada pelo originador.
Cancelamento

POST /v1/operations/{id}/cancel só funciona em WAITING_APPROVAL. Após aprovada, retorna 409.

Onde ler o estado: lifecycle_status vs status​

As respostas de criação de operação trazem dois campos de estado, ambos declarados como nullable no contrato. A regra é simples:

lifecycle_status é o campo autoritativo. É ele que espelha a coluna persistida da operação (o enum da máquina de estado acima) e o único que aparece nas leituras (GET /v1/operations, GET /v1/operations/{id}). status é um alias legado, emitido por um único endpoint.

Respostalifecycle_statusstatus
POST /v1/stock/request-anticipationPreenchido — WAITING_APPROVAL ou APPROVED_DIRECTnull (ausente)
POST /v1/operations/directnull (ausente)Preenchido — WAITING_APPROVAL ou APPROVED_DIRECT
GET /v1/operations, GET /v1/operations/{id}Preenchido (nunca nulo)não existe

Consequências práticas:

  • Nunca vêm os dois preenchidos na mesma resposta de criação — cada endpoint emite exatamente um. Leia com precedência: lifecycle_status ?? status.
  • As duas portas de criação aplicam o mesmo limite de auto-aprovação da policy: a operação nasce APPROVED_DIRECT quando o total solicitado cabe no auto_approve_limit_brl da policy regente, e WAITING_APPROVAL quando o ultrapassa. Sem limite configurado (ausente ou zero), toda operação nasce WAITING_APPROVAL — a ausência de limite nunca significa "aprova tudo".
  • Para acompanhar a operação depois da criação, use GET /v1/operations/{id}, que sempre traz lifecycle_status. status não muda de valor e não deve ser usado como fonte de estado.

Webhooks: lifecycle_status só vem em 2 dos 7 eventos operation.*​

A regra lifecycle_status ?? status vale para as respostas HTTP de criação. Ela não se aplica aos webhooks: no payload dos eventos os dois campos podem estar ausentes.

EventoTraz lifecycle_status?
operation.createdSim
operation.approvedSim
operation.contract_signedNão — operation_id, contract_id, signed_at
operation.paidNão — operation_id, display_number, opr_liquid_value, payment_sent_at
operation.deniedNão — operation_id, reason
operation.cancelledNão — operation_id, cancelled_at
operation.overdueNão — operation_id, overdue_titles_count, total_outstanding_brl

Em 4 desses eventos o estado alcançado é implícito no event_type — cada um corresponde exatamente a uma transição da máquina de estado acima:

Eventolifecycle_status resultante
operation.contract_signedSIGNED
operation.paidPAID
operation.deniedDENIED
operation.cancelledCANCELLED
operation.overdue não é um estado de operação

Não existe lifecycle_status = OVERDUE — o valor não faz parte do enum, e consultar GET /v1/operations?lifecycle_status=OVERDUE retorna erro. Esse evento reporta títulos vencidos (overdue_titles_count, total_outstanding_brl): quem entra em OVERDUE é o título, não a operação. A operação em si tipicamente segue em PAID — o dinheiro já foi desembolsado ao cedente; quem está inadimplente é o sacado. Acompanhe pelos eventos e pelo status de GET /v1/titles.

Se você precisa do estado explícito da operação ao processar qualquer desses eventos — inclusive os terminais de dinheiro —, faça um GET /v1/operations/{operation_id} com o operation_id do payload. O payload exato de cada evento está em Catálogo de Eventos.