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 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 payout; if a request times out and you retry with the same externalId, 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: STANDARD mails via standard postal service. TWO_DAY delivers within two business days via expedited shipping. OVERNIGHT delivers 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

ParameterRequiredDescription
methodSet to CHECK.
externalIdRecommendedYour 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.
typeOptionalType 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.
destinationThe mailing address or Contact the check is sent to. See Destination types for the supported shapes.
amountAmount to send (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 — 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)

ParameterRequiredDescription
destination.address.idUnique identifier of the mailing address assigned by Passport.
destination.payeeNameOptionalName of the payee to whom the check is being sent.
source.payorAddress.idOptionalUnique identifier of the payor's address (return address).

Saved Contact — pay a third party you've saved (Scenario 1)

ParameterRequiredDescription
destination.contact.id (or externalId)Unique identifier of the Contact assigned by Passport.
destination.contact.mailingAddress.idUnique 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).

ParameterRequiredDescription
processingDetail.deliveryModeRecommendedMode of delivery for the check. Possible values: STANDARD (default), TWO_DAY, OVERNIGHT. See Delivery Modes.
processingDetail.memoRecommendedAdditional details printed in the memo field of the check. Helps the recipient identify the payment.
processingDetail.remittanceInfoOptionalCheck 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.idOptionalUnique 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).

ParameterRequiredDescription
typeSet to EXTERNAL.
processingDetail.checkIssueDateThe 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:

  1. Missing or invalid required fields
  2. Incorrect parameter formats or values
  3. 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:

  1. Retrieving the transaction via GET /v1/customer/id/{id}/transaction/id/{id} (or externalId)
  2. 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.

ModeBehavior
STANDARDDefault delivery mode. Check is mailed via standard postal service.
TWO_DAYCheck is delivered within two business days via expedited shipping.
OVERNIGHTCheck is delivered the next business day via overnight courier.

Transaction Statuses

StatusDescriptionReason
SCHEDULEDDefault status upon transaction creation.ON_USER_REQUEST
PENDINGTransaction 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
PROCESSINGTransaction has been picked up for processing.PROCESSING_IN_TRANSIT
IN_DELIVERYCheck has been printed and is currently under shipment.PROCESSING_IN_DELIVERY
DELIVEREDCheck has been successfully delivered to the recipient.Transaction Delivered
COMPLETEDTransaction has been successfully completed after the realization interval.PROCESSED_BY_SYSTEM, Remote Check Processed
FAILEDTransaction could not be processed within the allowed interval.INSUFFICIENT_FUNDS, EXTERNAL_ACCOUNT_BLOCKED, OFAC_VERIFICATION_FAILED, <return-description> (<return-code>)
STOPPEDA stop request was received after the check was printed.LOST_CHECK, FRAUD, INCORRECT_DESTINATION, INCORRECT_AMOUNT, INCORRECTLY_CREATED, ON_USER_REQUEST, OTHERS
CANCELLEDTransaction 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 externalId don't create duplicate checks.
  • Failure, return, and stop-request paths are tested in the sandbox (see the FAILED and STOPPED status 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

PracticeDescription
Register recipient addresses in advanceCheck 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 recipientsWhen 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 externalIdPCE uses the request-body externalId as the idempotency key, so retrying with the same value never creates a duplicate check.
Choose the right delivery modeSelect OVERNIGHT or TWO_DAY for time-sensitive payments. Use STANDARD for routine disbursements to manage costs.
Use the Memo fieldPopulate processingDetail.memo with a clear descriptor. It's printed directly on the check and helps the recipient identify the payment.
Include remittance informationFor payments that need supporting detail — such as invoice breakdowns — use processingDetail.remittanceInfo to include structured remittance data alongside the check.
Monitor transaction statusTrack the check through IN_DELIVERY and DELIVERED to confirm it reached the recipient before raising a stop request.
Use webhooks for trackingSubscribe to transaction webhooks to receive real-time status updates without polling.
Test thoroughly in sandboxValidate all scenarios, including stop requests and delivery failures, before going live.

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