Skip to main content
Understanding resource state transitions is essential for building robust integrations. This guide documents the lifecycle of key resources in the Dakota API.

Application Lifecycle

Applications go through a defined lifecycle from creation to decision. Understanding these states helps you build proper status handling and user feedback.

Application-Level States

completed is a legacy status retained for backward compatibility; new integrations should read approved / declined. The application_decision field below is also still populated.

Application Decisions

Once an application reaches completed status, the application_decision field contains the outcome:

Proof of Address State (Individuals)

For individual applications, the application-level poa_status field exposes the review state of the customer’s Proof of Address document. It is null for business applications. The customer.kyb_status.updated webhook event surfaces these transitions via its reason_code field — see Webhook events.

Applicant-Level States (Business & Individuals)

Within an application, each entity (business or individual) has its own status:

Transaction Lifecycle

Transactions progress through multiple states from initiation to completion.

Transaction States

Transaction Status Reference

A cancelled transaction has the status cancelled (two Ls). Earlier versions of this page said canceled. The API has always sent cancelled, so check your handlers for cancelled.
Wallet and auto-account transactions on GET /transactions and GET /transactions/{transaction_id} (resource_type wallet, auto_account or fx_auto_account), and wallet.transaction.* webhooks, return two status fields. status is a display label, such as Broadcasted or Success. status_code is the code from this table; the label Success has the code completed. Branch on status_code, and treat a code you don’t recognise like unknown. One-off transactions (resource_type one_off) and transaction.* webhooks have no status_code: their status is already a code from this table. See Wallet Transaction Events.
pending_return, returned, and pending_reversal appear on the transaction object, but they are not distinct webhook lifecycle stages. Read them from data.object.status on a *.updated event, or from GET /transactions/{transaction_id} (status_code where the transaction has one, otherwise status) — no separate event fires for them. See Webhooks.

Terminal vs Non-Terminal States

Terminal states indicate the transaction has reached an outcome:
  • completed, invalid, failed, cancelled, reversed, returned, rejected
Whether a terminal state can still change depends on the transaction:
  • Wallet transactions: completed, failed and reversed never change. Only a repeat of the same status, such as a hash backfill, can follow.
  • Auto and one-off transactions: completed can still move to pending_return, returned, pending_reversal or reversed, for example after an ACH or wire return. failed and returned can move again when Dakota retries, resumes or re-sends the payment, so keep handling updates after them.
  • The other terminal states (cancelled, invalid and rejected, and reversed outside wallet transactions) don’t move in the normal flow, but Dakota can still correct a status that was reported out of order. Apply every update you receive, even after a terminal state.
Non-terminal states indicate the transaction is still in progress:
  • not_started, pending, processing, in_progress, waiting_for_signature, awaiting_confirmation, broadcasted, needs_manual_input, pending_return, pending_reversal, timed_out, unknown

Auto Transaction Lifecycle

Auto transactions have their own lifecycle:

Handling State Changes

Polling for Status Updates

For non-terminal states, poll periodically to check for updates:

Using Webhooks for State Changes

Instead of polling, configure webhooks to receive real-time notifications:
See Webhook Integration for complete webhook setup.

State Transition Rules

Valid Transitions

Not all state transitions are valid. The API enforces these rules: Applications:
  • pending → submitted (via submit endpoint)
  • submitted → completed (automatic after review)
Transactions:
  • A wallet transaction never leaves completed, failed or reversed
  • On auto and one-off transactions, completed can move to pending_return, returned, pending_reversal or reversed, and failed and returned can move again when Dakota retries, resumes or re-sends the payment
  • cancelled can only be triggered while in non-terminal state
  • reversed usually follows completed (a return or an originator reversal). An auto or one-off transaction that Dakota stops or refunds before it completes can also end reversed, and a wallet transaction reaches reversed without completing when its execution reverts on the blockchain

Error Handling

See Error Codes for all error types and handling best practices.