Skip to main content

Overview

Positive Pay helps protect accounts from fraudulent or unexpected payments by giving account holders proactive control. Customers pre-approve the ACH originators, check payments, and wire drawdowns they want to allow. When a payment is received, Unit automatically evaluates it against the configured Positive Pay rules to deterministically allow it to proceed or block it at the Positive Pay layer. For wire drawdowns specifically, after passing Positive Pay checks based on the configured rules and any uploaded authorization documentation, the drawdown may still be subject to the bank's manual review and potential return under the bank's standard processes.

You can also opt in to Positive Pay by payment type at the account level or deposit product level. When a payment type is opted in, payments of that type are processed only if they match an active Positive Pay rule.

More details in the positive pay guide.

Configure Positive Pay Policy

Configure Positive Pay policy to control which payment types require matching Positive Pay rules before they can be processed.

Account-level Opt-In

Configures Positive Pay opt-in for a specific account.

VerbPOST
URLhttps://api.s.unit.sh/positive-pay-policy
Required Scopepayments-write
Data TypepositivePayPolicy
Timeout (Seconds)5

Attributes

optInTypesRequired
array of strings
Required. Payment types to opt in. Supported values: CheckPayment, ReceivedAchDebit, ReceivedAchCredit.

Relationships

accountRequired
JSON:API Relationship
Required. The account this Positive Pay policy applies to.
Example Request:
curl -X POST 'https://api.s.unit.sh/positive-pay-policy'
-H 'Content-Type: application/vnd.api+json'
-H 'Authorization: Bearer ${TOKEN}'
--data-raw '{
"data": {
"type": "positivePayPolicy",
"attributes": {
"optInTypes": [
"CheckPayment",
"ReceivedAchDebit",
"ReceivedAchCredit"
]
},
"relationships": {
"account": {
"data": {
"type": "account",
"id": "{{accountId}}"
}
}
}
}
}'

Deposit Product-level Opt-In

Configures Positive Pay opt-in defaults for all accounts on a deposit product.

VerbPATCH
URLhttps://api.s.unit.sh/deposit-products/{depositProductId}
Data TypeupdateDepositProduct
Timeout (Seconds)5

Attributes

positivePayOptInRequired
array of strings
Required. Payment types to opt in by default. Supported values: CheckPayment, ReceivedAchDebit, ReceivedAchCredit.
Example Request:
curl -X PATCH 'https://api.s.unit.sh/deposit-products/{depositProductId}'
-H 'Content-Type: application/vnd.api+json'
-H 'Authorization: Bearer ${TOKEN}'
--data-raw '{
"data": {
"type": "updateDepositProduct",
"attributes": {
"positivePayOptIn": [
"CheckPayment",
"ReceivedAchDebit",
"ReceivedAchCredit"
]
}
}
}'
Note

Account-level opt-in can be used for per-account overrides, while deposit product-level opt-in can be used as a shared default for accounts on the same deposit product.

Create Received ACH Debit Positive Pay

Creates a Positive Pay rule for incoming ACH debits.

VerbPOST
URLhttps://api.s.unit.sh/positive-pay
Required Scopepayments-write
Data TypereceivedAchDebitPositivePay
Timeout (Seconds)5

Attributes

originatorNameRequired
string
Name of the ACH Received Payment originator. Required if originatorEntityId is not provided.
originatorEntityIdRequired
string
Entity ID of the ACH Received Payment originator. Required if originatorName is not provided.
amountOptional
integer
Optional. Maximum allowed debit amount in cents. Decisioning uses this as a maximum.
expirationDateOptional
RFC3339 Date
Optional. When the authorization expires.
tagsOptional
object
Optional. See Tags. Tags that will be copied to any transaction that this payment creates (see Tag Inheritance).
Note

At least one of originatorName or originatorEntityId must be provided.

Relationships

accountRequired
JSON:API Relationship
Required. The account this Positive Pay rule applies to.
Example Request:
curl -X POST 'https://api.s.unit.sh/positive-pay'
-H 'Content-Type: application/vnd.api+json'
-H 'Authorization: Bearer ${TOKEN}'
--data-raw '{
"data": {
"type": "receivedAchDebitPositivePay",
"attributes": {
"originatorName": "Payroll Company Inc",
"originatorEntityId": "1234567",
"amount": 500000,
"expirationDate": "2026-12-31",
"tags": {
"purpose": "payroll"
}
},
"relationships": {
"account": {
"data": {
"type": "account",
"id": "123"
}
}
}
}
}'

Response

Response is a JSON:API document.

201 Created

data
The requested resource after the operation was completed.
Example Response:
{
"data": {
"type": "receivedAchDebitPositivePay",
"id": "1",
"attributes": {
"createdAt": "2026-01-15T10:00:00.000Z",
"status": "Active",
"originatorName": "Payroll Company Inc",
"originatorEntityId": "1234567",
"amount": 500000,
"expirationDate": "2026-12-31",
"tags": {
"purpose": "payroll"
}
},
"relationships": {
"account": {
"data": {
"type": "depositAccount",
"id": "123"
}
}
}
}
}

Create Received ACH Credit Positive Pay

Creates a Positive Pay rule for incoming ACH credits.

VerbPOST
URLhttps://api.s.unit.sh/positive-pay
Required Scopepayments-write
Data TypereceivedAchCreditPositivePay
Timeout (Seconds)5

Attributes

originatorNameRequired
string
Name of the ACH credit originator. Required if originatorEntityId is not provided.
originatorEntityIdRequired
string
Entity ID of the ACH credit originator. Required if originatorName is not provided.
amountOptional
integer
Optional. Maximum allowed credit amount in cents. Decisioning uses this as a maximum.
expirationDateOptional
RFC3339 Date
Optional. When the authorization expires.
tagsOptional
object
Optional. See Tags. Tags that will be copied to any transaction that this payment creates (see Tag Inheritance).
Note

At least one of originatorName or originatorEntityId must be provided.

Relationships

accountRequired
JSON:API Relationship
Required. The account this Positive Pay rule applies to.
Example Request:
curl -X POST 'https://api.s.unit.sh/positive-pay'
-H 'Content-Type: application/vnd.api+json'
-H 'Authorization: Bearer ${TOKEN}'
--data-raw '{
"data": {
"type": "receivedAchCreditPositivePay",
"attributes": {
"originatorName": "ACME Payouts",
"originatorEntityId": "9988776",
"amount": 1000000,
"expirationDate": "2026-12-31",
"tags": {
"purpose": "refund"
}
},
"relationships": {
"account": {
"data": {
"type": "account",
"id": "123"
}
}
}
}
}'

Response

Response is a JSON:API document.

201 Created

data
The requested resource after the operation was completed.
Example Response:
{
"data": {
"type": "receivedAchCreditPositivePay",
"id": "2",
"attributes": {
"createdAt": "2026-01-15T10:00:00.000Z",
"status": "Active",
"originatorName": "ACME Payouts",
"originatorEntityId": "9988776",
"amount": 1000000,
"expirationDate": "2026-12-31",
"tags": {
"purpose": "refund"
}
},
"relationships": {
"account": {
"data": {
"type": "depositAccount",
"id": "123"
}
}
}
}
}

Create Check Payment Positive Pay

Creates a Positive Pay rule for check payments.

VerbPOST
URLhttps://api.s.unit.sh/positive-pay
Required Scopepayments-write
Data TypecheckPaymentPositivePay
Timeout (Seconds)5

Attributes

checkNumberRequired
string
Required. Check number to authorize.
amountRequired
integer
Required. Expected amount in cents. Must match within 1$ tolerance.
payeeNameOptional
string
Optional. Payee name to add specificity.
expirationDateOptional
RFC3339 Date
Optional. When the authorization expires.
tagsOptional
object
Optional. See Tags. Tags that will be copied to any transaction that this payment creates (see Tag Inheritance).

Relationships

accountRequired
relationship
Required. The account this Positive Pay rule applies to.
Example Request:
curl -X POST 'https://api.s.unit.sh/positive-pay'
-H 'Content-Type: application/vnd.api+json'
-H 'Authorization: Bearer ${TOKEN}'
--data-raw '{
"data": {
"type": "checkPaymentPositivePay",
"attributes": {
"checkNumber": "10045",
"payeeName": "ACME Corp",
"amount": 250000,
"expirationDate": "2026-12-31",
"tags": {
"category": "vendor"
}
},
"relationships": {
"account": {
"data": {
"type": "account",
"id": "123"
}
}
}
}
}'

Response

Response is a JSON:API document.

201 Created

data
The requested resource after the operation was completed.
Example Response:
{
"data": {
"type": "checkPaymentPositivePay",
"id": "3",
"attributes": {
"createdAt": "2026-01-15T10:00:00.000Z",
"status": "Active",
"checkNumber": "10045",
"payeeName": "ACME Corp",
"amount": 250000,
"expirationDate": "2026-12-31",
"tags": {
"category": "vendor"
}
},
"relationships": {
"account": {
"data": {
"type": "depositAccount",
"id": "123"
}
}
}
}
}

Create Wire Drawdown Positive Pay

Positive Pay wire-drawdown rules aren't enforced when created; creation only records the rule and sets it to AwaitingDocuments. After you upload an authorization document, the rule becomes Active, and incoming drawdowns can be processed. Once those conditions are met, drawdowns referencing that rule are routed to the bank for manual review against the uploaded document. Each wire drawdown must include the Positive Pay Rule ID; if the referenced rule is not Active (for example, AwaitingDocuments, Expired, or Cancelled), the drawdown is rejected.

VerbPOST
URLhttps://api.s.unit.sh/positive-pay
Required Scopepayments-write
Data TypedrawdownPositivePay
Timeout (Seconds)5

Attributes

expirationDateOptional
RFC3339 Date
Optional. When the authorization expires.
tagsOptional
object
Optional. Internal labels for your own use.

Relationships

accountRequired
relationship
Required. The account this Positive Pay rule applies to.
Example Request:
curl -X POST 'https://api.s.unit.sh/positive-pay'
-H 'Content-Type: application/vnd.api+json'
-H 'Authorization: Bearer ${TOKEN}'
--data-raw '{
"data": {
"type": "drawdownPositivePay",
"attributes": {
"expirationDate": "2026-12-31",
"tags": {
"purpose": "vendor-payment"
}
},
"relationships": {
"account": {
"data": {
"type": "account",
"id": "123"
}
}
}
}
}'

Response

Response is a JSON:API document.

201 Created

data
The requested resource after the operation was completed.
Example Response:
{
"data": {
"type": "drawdownPositivePay",
"id": "4",
"attributes": {
"createdAt": "2026-01-15T10:00:00.000Z",
"status": "AwaitingDocuments",
"expirationDate": "2026-12-31",
"tags": {
"purpose": "vendor-payment"
}
},
"relationships": {
"account": {
"data": {
"type": "depositAccount",
"id": "123"
}
}
}
}
}

Upload Document

Upload the authorization document required to activate a drawdown rule (Wire Drawdown Only).

Note

Maximum size for a document is 20 MB.

VerbPUT
URLhttps://api.s.unit.sh/positive-pay/{id}/documents
Required Scopepayments-write
Timeout (Seconds)5

Headers

NameDescription
Content-TypeOne of image/png, image/jpeg, or application/pdf.

Once uploaded, the rule transitions from AwaitingDocuments to Active.

curl -X PUT "https://api.s.unit.sh/positive-pay/1/documents" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/pdf" \
--data-binary @authorization.pdf

Get by ID

Get a Positive Pay rule by ID.

VerbGET
URLhttps://api.s.unit.sh/positive-pay/{positivePayId}
Required Scopepayments
Timeout (Seconds)5
curl -X GET "https://api.s.unit.sh/positive-pay/1" \
-H "Authorization: Bearer ${TOKEN}"

Response

Response is a JSON:API document.

200 OK

Example Response:
{
"data": {
"type": "receivedAchDebitPositivePay",
"id": "1",
"attributes": {
"createdAt": "2026-01-15T10:00:00.000Z",
"status": "Active",
"originatorName": "Payroll Company Inc",
"originatorEntityId": "1234567",
"amount": 500000,
"expirationDate": "2026-12-31",
"tags": {
"purpose": "payroll"
}
},
"relationships": {
"account": {
"data": {
"type": "depositAccount",
"id": "123"
}
}
}
}
}

List

List Positive Pay rules. Filtering, paging, and sorting can be applied.

VerbGET
URLhttps://api.s.unit.sh/positive-pay
Required Scopepayments
Timeout (Seconds)5

Query Parameters

NameTypeDefaultDescription
page[limit]integer100Optional. Maximum number of resources that will be returned. Maximum is 1000 resources. See Pagination.
page[offset]integer0Optional. Number of resources to skip. See Pagination.
filter[accountId]string(empty)Optional. Filters the results by the specified account id.
filter[status]string(empty)Optional. Filters by rule status. One of: AwaitingDocuments, Active, Expired, Cancelled.
filter[type]string(empty)Optional. Filters by rule type. One of: receivedAchDebitPositivePay, receivedAchCreditPositivePay, checkPaymentPositivePay, drawdownPositivePay.
sortstringsort=-createdAtOptional. Leave empty or provide sort=createdAt for ascending order. Provide sort=-createdAt (leading minus sign) for descending order.
curl -X GET "https://api.s.unit.sh/positive-pay?filter[accountId]=123&filter[status]=Active&page[limit]=20" \
-H "Authorization: Bearer ${TOKEN}"

Response

Response is a JSON:API document.

200 OK

data
Array of positive pay rule resources. Each resource can be any of the listed rule types, as indicated by the type field.
meta
JSON object
Pagination data includes offset, limit and total (estimated total items).
Example Response:
{
"data": [
{
"type": "receivedAchDebitPositivePay",
"id": "1",
"attributes": {
"createdAt": "2026-01-15T10:00:00.000Z",
"status": "Active",
"originatorName": "Payroll Company Inc",
"originatorEntityId": "1234567",
"amount": 500000,
"expirationDate": "2026-12-31",
"tags": {
"purpose": "payroll"
}
},
"relationships": {
"account": {
"data": {
"type": "depositAccount",
"id": "123"
}
}
}
},
{
"type": "checkPaymentPositivePay",
"id": "2",
"attributes": {
"createdAt": "2026-01-16T14:30:00.000Z",
"status": "Active",
"checkNumber": "10045",
"payeeName": "ACME Corp",
"amount": 250000,
"expirationDate": "2026-12-31",
"tags": {
"category": "vendor"
}
},
"relationships": {
"account": {
"data": {
"type": "depositAccount",
"id": "123"
}
}
}
}
],
"meta": {
"pagination": {
"total": 2,
"limit": 20,
"offset": 0
}
}
}

Cancel

Cancel a Positive Pay rule by ID. Cancelled rules stop authorizing payments.

The positivePay.cancelled webhook event is fired.

VerbPOST
URLhttps://api.s.unit.sh/positive-pay/{positivePayId}/cancel
Required Scopepayments-write
Timeout (Seconds)5
curl -X POST "https://api.s.unit.sh/positive-pay/1/cancel" \
-H "Authorization: Bearer ${TOKEN}"

Response

Response is a JSON:API document.

200 OK

Example Response:
{
"data": {
"type": "receivedAchDebitPositivePay",
"id": "1",
"attributes": {
"createdAt": "2026-01-15T10:00:00.000Z",
"status": "Cancelled",
"originatorName": "Payroll Company Inc",
"originatorEntityId": "1234567",
"amount": 500000,
"expirationDate": "2026-12-31",
"tags": {
"purpose": "payroll"
}
},
"relationships": {
"account": {
"data": {
"type": "depositAccount",
"id": "123"
}
}
}
}
}