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.

📘

Use externalId for safe retries

For Treasury, PCE treats the externalId in the request body as the idempotency key; there's no separate header. Send a unique externalId per 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

ParameterRequiredDescription
methodSet to BOOK
externalIdRecommendedYour own reference ID, also the idempotency key. Retrying with the same value won't create a duplicate. Maximum 45 characters.
typeOptionalType of transaction. Possible value: REGULAR.
source.account.id (or externalId)The Passport Account to debit
destinationThe Passport Account to credit. See Destination types for the supported shapes.
amountAmount to transfer (in USD). Must be greater than zero.
purposePurpose of the transaction. Maximum 128 characters.
allowDuplicateOptionalSet 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)

ParameterRequiredDescription
destination.account.id or externalIdUnique identifier of the destination account

Passport Payment ID (PPI) (Scenario 2)

ParameterRequiredDescription
destination.ppiThe 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:

PracticeDescription
Verify account statusEnsure both source and destination accounts are ACTIVE before initiating the transfer.
Verify PPI before first useCall the Verify PPI endpoint to confirm the PPI is valid and resolves to the expected recipient.
Set a meaningful purposeInclude a clear purpose for reconciliation and audit trails.
Handle instant settlementBOOK transfers complete instantly; design your flow to handle immediate COMPLETED status.

Next steps

See also



Did this page help you?
.readme-logo { display: none !important; }