Ripple is rolling out Policy Engine v2, which runs policy checks and transaction approvals in a single policy phase. Until now, a transaction that required approvals passed its policy checks first and then waited in a separate approval phase. With Policy Engine v2, the transaction stays in the policy phase until policy rules and any required approvals all complete.
This changes the sequence of status values that transactions emit. If you poll the transactions API or consume TRANSACTION webhooks, review the changes below and update any automation that depends on the approval statuses.
Nothing changes in an environment until Ripple enables Policy Engine v2 there. It's active in Development today. Ripple will announce the Sandbox and Production dates separately and will enable Sandbox first so that you can validate your integration before Production changes. See Availability.
New transactions no longer transition through APPROVAL_CHECK_PENDING or APPROVAL_CHECK_PASSED. Instead, the transaction remains in POLICY_CHECK_PENDING while approvers act on it.
| Status | Before | After |
|---|---|---|
APPROVAL_CHECK_PENDING | Ripple Custody (Wallet) emits this status when a transaction-level approval round starts. | Ripple Custody (Wallet) doesn't emit this status. The transaction stays in POLICY_CHECK_PENDING while it collects approvals. |
APPROVAL_CHECK_PASSED | Ripple Custody (Wallet) emits this status when the transaction meets its approval requirement. | Ripple Custody (Wallet) doesn't emit this status. The policy phase completes with POLICY_CHECK_PASSED and the transaction proceeds to COMPILATION_PENDING. |
Both values remain valid members of the TransactionStatus enum. Clients that deserialize the enum keep working, and historical transactions keep the status history they already have. Transactions already in flight when Ripple enables Policy Engine v2 complete on the path they started, so they might still emit these statuses for a short time after the switch.
Ripple Custody (Wallet) still emits POLICY_CHECK_PASSED for every allowed transaction, but later in the lifecycle. It now means that the transaction passed policy evaluation and all required approvals, and compilation is about to start. Previously, Ripple Custody (Wallet) emitted it before any approval round started.
The status sequence for an allowed outbound transaction becomes:
REQUESTED → POLICY_CHECK_PENDING → POLICY_CHECK_PASSED → COMPILATION_PENDING → COMPILED → SIGNATURE_PENDING → SIGNED → PUBLISH_PENDING → PUBLISHED → CONFIRMATION_PENDING → CONFIRMEDWhen a policy rule, an approver, or an expired approval rejects a transaction during the policy phase, the transaction moves from POLICY_CHECK_PENDING to REJECTED. This is the same transition a policy rejection makes today.
Because approvals now happen inside the policy phase, a transaction can stay in POLICY_CHECK_PENDING for the full approval window, which can be hours or until the approval expires. Previously, this status typically lasted milliseconds. Review any timeout or alerting logic that depends on time spent in POLICY_CHECK_PENDING.
When the policy phase rejects a transaction, Ripple Custody (Wallet) adds a structured entry to the transaction's problems array that explains why. Each entry includes:
| Field | Description |
|---|---|
reason | A PAL006.xxx code. Policy rule rejections carry the rule's code, for example PAL006.007 for a transfer that exceeds a constant (lifetime) limit. PAL006.044 means the transaction didn't meet its approval requirement. PAL006.045 means the approval expired. |
message | A human-readable explanation. Ripple Custody (Wallet) mirrors the same text into the deprecated reasons array for compatibility. |
retryability | NOT_RETRYABLE for policy-phase rejections. Fix the cause and submit a new transaction. |
Read the problems entry rather than parsing the free-text reasons array. Transactions created before the rollout don't carry a policy-stamped problems entry, so treat its absence as no information rather than as an error.
- Approver experience. Ripple Custody (Wallet) still creates approval requests for transactions that require them. Approvers receive and action them in the web console and passkey flows exactly as before.
- Approvals API and approval webhooks. In-progress approval visibility, such as who has approved so far, stays in the approvals API and
APPROVALdomain webhooks. An open approval request for a transaction means it's waiting on approvers while the transaction itself sits inPOLICY_CHECK_PENDING. - Webhook event types. There are no new
TRANSACTIONwebhook events. Notifications for the two approval statuses stop arriving for new transactions because those transitions no longer happen. - API schema. Ripple isn't removing any fields or enum values.
- Approval groups, quorums, and policy configuration. Your existing policies and approval groups continue to apply without changes.
- Terminal statuses.
CONFIRMED,REJECTED, andFAILEDbehave exactly as today.
Before Ripple enables Policy Engine v2 in your environment:
- Remove any state-machine logic that requires
APPROVAL_CHECK_PENDINGorAPPROVAL_CHECK_PASSEDto occur. Don't remove the values from your client-side enum definitions. - If your integration waits for
APPROVAL_CHECK_PASSEDbefore it treats a transaction as progressing, wait forPOLICY_CHECK_PASSEDor any later status instead. - If you interpret
POLICY_CHECK_PASSEDas "policy passed, approvals may still be pending," update that interpretation. After the change, it means the whole policy phase, including approvals, is complete. - If you treat
APPROVAL_CHECK_PENDINGas "awaiting approval," usePOLICY_CHECK_PENDINGtogether with the approvals API orAPPROVALwebhooks to detect that state. - Adjust any timeout or alerting logic that depends on time spent in
POLICY_CHECK_PENDING. - Optionally, read the structured
problemsentry onREJECTEDtransactions instead of the deprecatedreasonsarray.
These changes apply equally to API polling and to TRANSACTION webhook consumers, because webhook notifications carry the same status values.
Every organization now has access to Policy Engine v2 in Sandbox and Production.
| Environment | Status |
|---|---|
| Development | Active for all organizations. |
| Sandbox | Ripple enables Policy Engine v2 in Sandbox on September 21, 2026. Ripple enables Sandbox before Production so that you can validate against Sandbox first. |
| Production | Ripple will announce the date and coordinate enablement with each organization. |
Until Ripple enables Policy Engine v2 in an environment, transactions there continue to emit the legacy status sequence, including APPROVAL_CHECK_PENDING and APPROVAL_CHECK_PASSED.
- How transactions work for the complete status reference
- Webhooks overview for
TRANSACTIONwebhook payloads - Approvals for how approval requests work
- Ripple Custody (Wallet) API for the transaction and approvals endpoints