Pay via BOOK
Move funds between two Passport Accounts within the system.
Pay via BOOK moves funds instantly from one Passport Account to another within the system. Use it for internal transfers, ecosystem disbursements, or paying another party who also has a Passport Account. Because both accounts are within the system, BOOK transfers settle immediately without external bank networks. For the full field list, jump to the Request reference.
You can also address a BOOK transfer using a Passport Payment ID (PPI) instead of an account ID. PPI is a verified identifier that resolves to a Passport Account.
Common use cases
- Move funds between two users within the platform
- Transfer funds between internal operating accounts
- Send money between customer-linked Accounts
- Pay another party using their Passport Payment ID (PPI)
Make your first BOOK transfer
The fastest way to see it work: transfer funds between two Passport Accounts with the minimal fields below. The full set of options is in the Request reference.
POST /v1/customer/id/{id}/transaction
{
"externalId": "book-first-transfer-001",
"method": "BOOK",
"amount": "500.00",
"purpose": "Internal Transfer",
"source": { "account": { "externalId": "source-account-001" } },
"destination": { "account": { "externalId": "destination-account-001" } }
}You'll get back a transaction with status: SCHEDULED. BOOK transfers settle instantly, so the status typically moves to COMPLETED immediately. Store the returned id and your externalId to track it.
UseexternalIdfor safe retriesFor Treasury, PCE treats the
externalIdin the request body as the idempotency key; there's no separate header. Send a uniqueexternalIdper transfer, and retrying with the same value creates it only once.
Scenarios
Every BOOK transfer follows the transaction lifecycle. Because both accounts are within the Passport system, BOOK transfers settle instantly. The only thing that changes per scenario is how you address the destination.
sequenceDiagram
participant You as Your Application
participant PCE as PCE
participant Src as Source Account
participant Dest as Destination Account
You->>PCE: POST /v1/customer/id/{id}/transaction (method: BOOK)
PCE->>PCE: Validate accounts + balance
PCE->>Src: Debit amount
PCE->>Dest: Credit amount
PCE-->>You: 201 Created (status: COMPLETED)
Note over Src,Dest: BOOK transfers settle instantly
Before you begin (all scenarios)
- The source Passport Account is active and has enough balance to cover the transfer.
- The destination Passport Account exists and is active.
Each scenario below shows a different way to address the destination.
Scenario 1: Transfer to another Passport Account by ID
(destination addressed by account ID or externalId)
Use this to move funds to another Passport Account when you know the account's ID or externalId.
You'll also need: the destination account's id or externalId.
Request
POST /v1/customer/id/{id}/transaction
{
"externalId": "book-account-001",
"method": "BOOK",
"type": "REGULAR",
"amount": "500.00",
"purpose": "Internal Transfer",
"source": { "account": { "externalId": "source-account-001" } },
"destination": { "account": { "externalId": "destination-account-001" } }
}Response
{
"resourceName": "transaction",
"url": "/v1/customer/id/4225975/transaction/id/230491600",
"id": 230491600,
"externalId": "book-account-001",
"status": "COMPLETED",
"statusDate": "06/29/2026 14:20:55",
"amount": 500,
"method": "BOOK",
"purpose": "Internal Transfer",
"type": "REGULAR",
"transactionClass": "SEND",
"statusReason": "Processed By System",
"source": {
"account": { "resourceName": "account", "id": 9915272, "url": "/v1/customer/id/4225975/account/id/9915272" }
},
"destination": {
"account": { "resourceName": "account", "id": 9915280, "url": "/v1/customer/id/4225975/account/id/9915280" }
}
}Scenario 2: Transfer to another party using their Passport Payment ID (PPI)
(destination addressed by PPI)
Use this to pay another party who has shared their Passport Payment ID (PPI). PPI is a verified identifier that resolves to their Passport Account, so you don't need to know their account ID.
You'll also need: the recipient's verified PPI.
What is PPI?A Passport Payment ID (PPI) is a verified identifier linked to a Passport Account. Recipients share their PPI so payers can BOOK funds to them without exchanging account IDs. Verify a PPI before first use via the Verify PPI endpoint.
Request
POST /v1/customer/id/{id}/transaction
{
"externalId": "book-ppi-001",
"method": "BOOK",
"type": "REGULAR",
"amount": "250.00",
"purpose": "Payment to Partner",
"source": { "account": { "externalId": "source-account-001" } },
"destination": { "ppi": "recipient-ppi-12345" }
}Response
{
"resourceName": "transaction",
"url": "/v1/customer/id/4225975/transaction/id/230491611",
"id": 230491611,
"externalId": "book-ppi-001",
"status": "COMPLETED",
"statusDate": "06/29/2026 15:10:30",
"amount": 250,
"method": "BOOK",
"purpose": "Payment to Partner",
"type": "REGULAR",
"transactionClass": "SEND",
"statusReason": "Processed By System",
"source": {
"account": { "resourceName": "account", "id": 9915272, "url": "/v1/customer/id/4225975/account/id/9915272" }
},
"destination": {
"account": { "resourceName": "account", "id": 9915290, "url": "/v1/customer/id/4225980/account/id/9915290" }
}
}Track the transaction
Subscribe to webhooks or GET the transaction to follow it. Because BOOK transfers settle instantly, they typically complete immediately. The statuses, the webhook payload, and the event types all live in Transaction lifecycle.
Request reference
The complete set of fields for the create-transaction request. Scenarios above use subsets of these.
Core parameters
| Parameter | Required | Description |
|---|---|---|
method | ✓ | Set to BOOK |
externalId | Recommended | Your own reference ID, also the idempotency key. Retrying with the same value won't create a duplicate. Maximum 45 characters. |
type | Optional | Type of transaction. Possible value: REGULAR. |
source.account.id (or externalId) | ✓ | The Passport Account to debit |
destination | ✓ | The Passport Account to credit. See Destination types for the supported shapes. |
amount | ✓ | Amount to transfer (in USD). Must be greater than zero. |
purpose | ✓ | Purpose of the transaction. Maximum 128 characters. |
allowDuplicate | Optional | Set to true to allow duplicate transactions on the same day. Defaults to false. |
Destination types
The destination object takes one of two shapes, matching the scenarios above.
Passport Account by ID (Scenario 1)
| Parameter | Required | Description |
|---|---|---|
destination.account.id or externalId | ✓ | Unique identifier of the destination account |
Passport Payment ID (PPI) (Scenario 2)
| Parameter | Required | Description |
|---|---|---|
destination.ppi | ✓ | The recipient's verified Passport Payment ID |
Validation
The prerequisites above are the validations, and PCE enforces them when you submit. A submission is checked synchronously; if a check fails, the request returns an error and no transaction is created. Submission checks:
- Required fields are present and correctly formatted.
- The source Passport Account is active and has enough balance to cover the transfer.
- The destination Passport Account exists and is active (or the PPI resolves to a valid active account).
Other conditions can only be judged once the transfer is in flight, such as an account becoming inactive or blocked mid-transfer. These surface after creation as PENDING or FAILED; see Transaction lifecycle. For error codes, see Error Codes and Messages.
Statuses
Pay via BOOK uses the shared transaction lifecycle. Because BOOK transfers don't involve external networks, they typically settle instantly to COMPLETED. See the lifecycle page for all statuses, the reasons, and how to track a transaction.
If a BOOK transfer fails
A BOOK transfer moves to FAILED when the source has insufficient funds or the destination account is invalid. A PENDING transfer is on hold because one of the accounts is inactive or blocked. In both cases, resolve the underlying issue and submit a new transfer. For the specific error codes, see Transactions Error codes.
Go live
The shared pre-production checklist (production credentials, webhook subscription and signature validation, idempotency, and sandbox testing) is in Getting Started. Specific to Pay via BOOK, also confirm:
- Both source and destination accounts are active before initiating the transfer.
- If using PPI, verify the PPI before first use.
Best practices
General practices (set a unique externalId, subscribe to webhooks, test in sandbox) are in Getting Started. Specific to Pay via BOOK:
| Practice | Description |
|---|---|
| Verify account status | Ensure both source and destination accounts are ACTIVE before initiating the transfer. |
| Verify PPI before first use | Call the Verify PPI endpoint to confirm the PPI is valid and resolves to the expected recipient. |
| Set a meaningful purpose | Include a clear purpose for reconciliation and audit trails. |
| Handle instant settlement | BOOK transfers complete instantly; design your flow to handle immediate COMPLETED status. |
Next steps
See also
- Transfer funds: move money between your own Passport Account and external bank
- Pay via ACH: pay external bank accounts via ACH
- Pay via Wire (Domestic): same-day payouts to external banks
- Verify PPI: verify a Passport Payment ID before use
- Error Codes and Messages: resolve a failed transfer
Updated about 15 hours ago