Pay via Check
Send funds by physical check to a registered mailing destination.
Pay via Check lets you send funds from a Passport Account as a physical check mailed to a destination outside the Passport system. It's useful when electronic payout methods (ACH or Wire) aren't available or aren't preferred — and when you need to include printed remittance information alongside the payment.
Unlike ACH or Wire, Check does not support one-time destinations: the recipient's mailing address must already be registered in Passport — either as a saved mailing address or on a Contact — before you create the transaction.
Common use cases
- Pay vendors or suppliers by mailed check
- Send a check to a saved payee managed as a Contact
- Mail funds to your own registered mailing address
- Record a check issued outside Passport for reconciliation
Make your first payout
The fastest way to see a check payout work: send the minimal request below, then track the result. This pays a saved payee (Contact) with just the required fields — the full set of options is in the Request reference further down.
POST /v1/customer/id/{id}/transaction
{
"externalId": "check-first-payout-001",
"method": "CHECK",
"amount": "1500.00",
"purpose": "Vendor Payment",
"source": { "account": { "externalId": "passport-account-001" } },
"destination": {
"contact": {
"externalId": "vendor-contact-001",
"mailingAddress": { "externalId": "vendor-address-001" }
}
}
}You'll get back a transaction with status: SCHEDULED. Store the returned id (and your externalId) — you'll use them to track the check and for any follow-up actions, such as a stop request.
Use
externalIdfor safe retriesFor Treasury, PCE treats the
externalIdin the request body as the idempotency key — there's no separate header. Send a uniqueexternalIdper payout; if a request times out and you retry with the sameexternalId, the check is created only once.
Scenarios
Every check payout follows the same path — submit, validate, print, mail, settle — and the only thing that changes is the destination (and whether you're recording an externally issued check). Pick the scenario that matches the problem you're solving.
sequenceDiagram
participant You as Your application
participant PCE as PCE
participant Mail as Print & mail provider
You->>PCE: POST /transaction (unique externalId)
PCE->>PCE: System validations
PCE-->>You: 201 — status SCHEDULED
PCE->>Mail: Print & dispatch check — PROCESSING → IN_DELIVERY
Mail-->>PCE: Delivery confirmation
PCE-->>You: Webhook — DELIVERED → COMPLETED (or FAILED / STOPPED)
The status values above are described in full under Transaction Statuses.
Before you begin (all scenarios)
- The Passport Account you're paying from is active and has enough balance to cover the payout.
- The destination is already registered in Passport — a saved mailing address or a Contact. Check payouts don't accept inline, one-time bank or address details.
Each scenario below adds one requirement specific to its destination.
Scenario 1: Pay a vendor or payee you pay regularly
(third-party recipient saved as a Contact)
Use this when you're mailing a check to someone other than yourself — a vendor, supplier, or contractor — and you'll pay them again. You save their mailing details once as a Contact, then reference the Contact on every payout.
You'll also need: the recipient saved as a Contact with a linked mailing address — see Save Payees as Contacts.
Request
POST /v1/customer/id/{id}/transaction
{
"method": "CHECK",
"type": "REGULAR",
"amount": "2200.00",
"purpose": "Vendor Payment",
"source": { "account": { "externalId": "passport-account-001" } },
"destination": {
"contact": {
"id": "4019600",
"mailingAddress": { "id": "1048888" }
}
},
"processingDetail": { "deliveryMode": "TWO_DAY", "memo": "Q4 Services" }
}Response
{
"resourceName": "transaction",
"url": "/v1/customer/id/4225975/transaction/id/230491610",
"id": 230491610,
"externalId": "check-contact-2dd0",
"status": "SCHEDULED",
"statusDate": "06/30/2026 14:20:55",
"amount": 2200,
"method": "CHECK",
"purpose": "Vendor Payment",
"type": "REGULAR",
"transactionClass": "SEND",
"statusReason": "On User Request",
"source": {
"account": { "resourceName": "account", "id": 9915272, "url": "/v1/customer/id/4225975/account/id/9915272" }
},
"destination": {
"contact": { "resourceName": "contact", "id": 4019600, "url": "/v1/customer/id/4225975/contact/id/4019600" }
}
}You'll track this transaction through to delivery and settlement with webhooks — see Track the transaction below.
Scenario 2: Mail a check to an address you maintain
(pre-registered mailing address)
Use this when the check should go to a mailing address you already manage in Passport — for example, your own registered address or an address you maintain directly, rather than a third-party payee saved as a Contact. You reference the saved mailing address by id, and optionally name the payee printed on the check.
You'll also need: the destination mailing address registered via POST /v1/customer/id/{id}/mailingAddress. Optionally, a registered payor address to print as the return address.
Request
POST /v1/customer/id/{id}/transaction
{
"externalId": "check-address-001",
"method": "CHECK",
"type": "REGULAR",
"amount": "1500.00",
"purpose": "Vendor Payment",
"source": {
"account": { "externalId": "passport-account-001" },
"payorAddress": { "id": "6249852" }
},
"destination": {
"address": { "id": "6249852" },
"payeeName": "Acme Supplies Inc"
},
"processingDetail": { "deliveryMode": "STANDARD", "memo": "Invoice #INV-2024-001" }
}Response
{
"resourceName": "transaction",
"url": "/v1/customer/id/4225975/transaction/id/230491621",
"id": 230491621,
"externalId": "check-address-001",
"status": "SCHEDULED",
"statusDate": "06/30/2026 16:04:30",
"amount": 1500,
"method": "CHECK",
"purpose": "Vendor Payment",
"type": "REGULAR",
"transactionClass": "SEND",
"statusReason": "On User Request",
"source": {
"account": { "resourceName": "account", "id": 9915272, "url": "/v1/customer/id/4225975/account/id/9915272" }
},
"destination": {
"address": { "resourceName": "address", "id": 6249852, "url": "/v1/customer/id/4225975/mailingAddress/id/6249852" }
}
}Track it through to delivery and settlement with webhooks — see Track the transaction below.
Scenario 3: Record a check issued outside Passport
(externally issued check — type: EXTERNAL)
Use this to record a check that was issued outside the platform — for example, reconciling a check your team cut manually — so the debit is reflected against the Passport Account. Set type to EXTERNAL and provide the date the check was issued in processingDetail.checkIssueDate. The destination is still a registered mailing address.
You'll also need: the destination mailing address registered, and the original check's issue date.
Request
POST /v1/customer/id/{id}/transaction
{
"externalId": "check-external-4c2e",
"method": "CHECK",
"type": "EXTERNAL",
"amount": "100.00",
"purpose": "ICLDebitAutoMatch",
"source": { "account": { "id": "4035159" } },
"destination": {
"address": { "id": "1209279" },
"payeeName": "Jane Smith"
},
"processingDetail": {
"memo": "Manual check reconciliation",
"checkIssueDate": "10/14/2025"
}
}Response
{
"resourceName": "transaction",
"url": "/v1/customer/id/4225975/transaction/id/230491633",
"id": 230491633,
"externalId": "check-external-4c2e",
"status": "SCHEDULED",
"statusDate": "06/30/2026 20:02:50",
"amount": 100,
"method": "CHECK",
"type": "EXTERNAL",
"purpose": "ICLDebitAutoMatch",
"statusReason": "On User Request",
"destination": {
"address": { "resourceName": "address", "id": 1209279, "url": "/v1/customer/id/4225975/mailingAddress/id/1209279" }
}
}Track it through to settlement with webhooks — see Track the transaction below.
Mailing to your own registered address?
Referencing a mailing address you maintain (Scenario 2) is how you send a check to an address you own. Use a Contact (Scenario 1) when paying a third party.
Delivery timing
deliveryMode: STANDARDmails via standard postal service.TWO_DAYdelivers within two business days via expedited shipping.OVERNIGHTdelivers the next business day via courier. See Delivery Modes.
Track the transaction
Subscribe to webhooks to follow a check through printing, delivery, and settlement without polling. Each event wraps the transaction resource in payload[] — the same fields you'd get from a GET on the transaction.
{
"id": 65816901,
"eventType": "transaction.check.update",
"eventTimeStamp": "06/30/2026 14:21:09",
"eventId": "0001709618091430021",
"eventCreated": 1782743469000,
"payload": [
{
"resourceName": "transaction",
"url": "/v1/customer/id/4225975/transaction/id/230491610",
"id": 230491610,
"externalId": "check-contact-2dd0",
"status": "IN_DELIVERY",
"statusDate": "06/30/2026 14:21:09",
"amount": 2200,
"method": "CHECK",
"purpose": "Vendor Payment",
"type": "REGULAR",
"transactionClass": "SEND",
"statusReason": "Processing In Delivery",
"source": {
"account": { "resourceName": "account", "id": 9915272, "url": "/v1/customer/id/4225975/account/id/9915272" }
},
"destination": {
"contact": { "resourceName": "contact", "id": 4019600, "url": "/v1/customer/id/4225975/contact/id/4019600" }
}
}
]
}For the full event catalog and payloads, see Webhook Event Types.
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 CHECK. |
externalId | Recommended | Your own reference ID for the transaction, also used as the idempotency key — retrying with the same value won't create a duplicate. Maximum 45 characters. |
type | Optional | Type of transaction. Possible values: REGULAR (default — a standard check payout); EXTERNAL (record a check issued outside Passport — see Scenario 3). |
source.account.id (or externalId) | ✓ | The Passport Account to be debited. |
destination | ✓ | The mailing address or Contact the check is sent to. See Destination types for the supported shapes. |
amount | ✓ | Amount to send (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 — both reference a destination already registered in Passport. Check payouts do not accept inline, one-time details.
Registered mailing address — mail to an address you maintain (Scenario 2)
| Parameter | Required | Description |
|---|---|---|
destination.address.id | ✓ | Unique identifier of the mailing address assigned by Passport. |
destination.payeeName | Optional | Name of the payee to whom the check is being sent. |
source.payorAddress.id | Optional | Unique identifier of the payor's address (return address). |
Saved Contact — pay a third party you've saved (Scenario 1)
| Parameter | Required | Description |
|---|---|---|
destination.contact.id (or externalId) | ✓ | Unique identifier of the Contact assigned by Passport. |
destination.contact.mailingAddress.id | ✓ | Unique identifier of the mailing address linked to the Contact. |
Need a destination first?
Register a mailing address with
POST /v1/customer/id/{id}/mailingAddress, or save a payee under Save Payees as Contacts, before creating the check transaction.
Processing detail
The processingDetail object carries additional processing instructions. Optional as a whole, but certain fields may be required depending on your program's configuration (set by your Program Manager — the platform partner you onboarded through).
| Parameter | Required | Description |
|---|---|---|
processingDetail.deliveryMode | Recommended | Mode of delivery for the check. Possible values: STANDARD (default), TWO_DAY, OVERNIGHT. See Delivery Modes. |
processingDetail.memo | Recommended | Additional details printed in the memo field of the check. Helps the recipient identify the payment. |
processingDetail.remittanceInfo | Optional | Check remittance details passed per the Check Remittance Template linked to the customer. Sub-nodes correspond to column headings defined in the template. Maximum 10 column headings and 17 entries are supported. |
processingDetail.location.id | Optional | Unique identifier of a location to be linked to the transaction, assigned by Passport. |
External check fields
These apply only when type is EXTERNAL (see Scenario 3).
| Parameter | Required | Description |
|---|---|---|
type | ✓ | Set to EXTERNAL. |
processingDetail.checkIssueDate | ✓ | The date printed on the check indicating when it was issued. Format: MM/DD/YYYY. |
Validation and tracking
Once you submit the request, we validate it before sending the transaction for processing. We check for:
- Missing or invalid required fields
- Incorrect parameter formats or values
- Program or permission issues
If a validation fails, the request is rejected immediately with an error response — correct the issue and resubmit. For the full list, see Error Codes & Messages.
If all validations pass, track the outcome by:
- Retrieving the transaction via GET
/v1/customer/id/{id}/transaction/id/{id}(orexternalId) - Subscribing to transaction webhooks
Check the status field to understand the current state.
Delivery Modes
Check payouts support three delivery modes, which determine how and when the physical check is delivered to the recipient.
| Mode | Behavior |
|---|---|
STANDARD | Default delivery mode. Check is mailed via standard postal service. |
TWO_DAY | Check is delivered within two business days via expedited shipping. |
OVERNIGHT | Check is delivered the next business day via overnight courier. |
Transaction Statuses
| Status | Description | Reason |
|---|---|---|
SCHEDULED | Default status upon transaction creation. | ON_USER_REQUEST |
PENDING | Transaction is on hold as one or more processing conditions are not met. Source account must be ACTIVE with sufficient funds, and all entities must be OFAC and CIP verified. | EXTERNAL_ACCOUNT_BLOCKED, EXTERNAL_ACCOUNT_INACTIVE, ACCOUNT_INACTIVE, ACCOUNT_BLOCKED, ACCOUNT_CLOSURE_INITIATED, ACCOUNT_CLOSED, CUSTOMER_SUSPENDED, OFAC_STATUS_NOT_VERIFIED |
PROCESSING | Transaction has been picked up for processing. | PROCESSING_IN_TRANSIT |
IN_DELIVERY | Check has been printed and is currently under shipment. | PROCESSING_IN_DELIVERY |
DELIVERED | Check has been successfully delivered to the recipient. | Transaction Delivered |
COMPLETED | Transaction has been successfully completed after the realization interval. | PROCESSED_BY_SYSTEM, Remote Check Processed |
FAILED | Transaction could not be processed within the allowed interval. | INSUFFICIENT_FUNDS, EXTERNAL_ACCOUNT_BLOCKED, OFAC_VERIFICATION_FAILED, <return-description> (<return-code>) |
STOPPED | A stop request was received after the check was printed. | LOST_CHECK, FRAUD, INCORRECT_DESTINATION, INCORRECT_AMOUNT, INCORRECTLY_CREATED, ON_USER_REQUEST, OTHERS |
CANCELLED | Transaction was cancelled upon user request before the check was printed. | ON_USER_REQUEST, INCORRECTLY_CREATED, OTHERS |
Go live
Before you move from sandbox to production, confirm:
- Your webhook endpoint is subscribed and validating signatures.
- Idempotency is tested — retries with the same
externalIddon't create duplicate checks. - Failure, return, and stop-request paths are tested in the sandbox (see the
FAILEDandSTOPPEDstatus reasons). - Delivery modes (
STANDARD,TWO_DAY,OVERNIGHT) behave as expected for your program. - Destinations (mailing addresses and Contacts) are registered ahead of time — there are no one-time check destinations.
Best Practices
| Practice | Description |
|---|---|
| Register recipient addresses in advance | Check payouts don't support one-time destinations. Make sure the mailing address or Contact is registered in Passport before creating the transaction. |
| Use Contacts for third-party recipients | When mailing checks to another person or business, save them as a Contact so you can reuse their payee details on future payouts. |
Set a unique externalId | PCE uses the request-body externalId as the idempotency key, so retrying with the same value never creates a duplicate check. |
| Choose the right delivery mode | Select OVERNIGHT or TWO_DAY for time-sensitive payments. Use STANDARD for routine disbursements to manage costs. |
| Use the Memo field | Populate processingDetail.memo with a clear descriptor. It's printed directly on the check and helps the recipient identify the payment. |
| Include remittance information | For payments that need supporting detail — such as invoice breakdowns — use processingDetail.remittanceInfo to include structured remittance data alongside the check. |
| Monitor transaction status | Track the check through IN_DELIVERY and DELIVERED to confirm it reached the recipient before raising a stop request. |
| Use webhooks for tracking | Subscribe to transaction webhooks to receive real-time status updates without polling. |
| Test thoroughly in sandbox | Validate all scenarios, including stop requests and delivery failures, before going live. |
Updated about 18 hours ago