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.
| Verb | POST |
| URL | https://api.s.unit.sh/positive-pay-policy |
| Required Scope | payments-write |
| Data Type | positivePayPolicy |
| Timeout (Seconds) | 5 |
Attributes
CheckPayment, ReceivedAchDebit, ReceivedAchCredit.Relationships
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.
| Verb | PATCH |
| URL | https://api.s.unit.sh/deposit-products/{depositProductId} |
| Data Type | updateDepositProduct |
| Timeout (Seconds) | 5 |
Attributes
CheckPayment, ReceivedAchDebit, ReceivedAchCredit.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"
]
}
}
}'
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.
| Verb | POST |
| URL | https://api.s.unit.sh/positive-pay |
| Required Scope | payments-write |
| Data Type | receivedAchDebitPositivePay |
| Timeout (Seconds) | 5 |
Attributes
originatorEntityId is not provided.originatorName is not provided.At least one of originatorName or originatorEntityId must be provided.
Relationships
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
{
"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.
| Verb | POST |
| URL | https://api.s.unit.sh/positive-pay |
| Required Scope | payments-write |
| Data Type | receivedAchCreditPositivePay |
| Timeout (Seconds) | 5 |
Attributes
originatorEntityId is not provided.originatorName is not provided.At least one of originatorName or originatorEntityId must be provided.
Relationships
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
{
"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.
| Verb | POST |
| URL | https://api.s.unit.sh/positive-pay |
| Required Scope | payments-write |
| Data Type | checkPaymentPositivePay |
| Timeout (Seconds) | 5 |
Attributes
Relationships
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
{
"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.
| Verb | POST |
| URL | https://api.s.unit.sh/positive-pay |
| Required Scope | payments-write |
| Data Type | drawdownPositivePay |
| Timeout (Seconds) | 5 |
Attributes
Relationships
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
{
"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).
Maximum size for a document is 20 MB.
| Verb | PUT |
| URL | https://api.s.unit.sh/positive-pay/{id}/documents |
| Required Scope | payments-write |
| Timeout (Seconds) | 5 |
Headers
| Name | Description |
|---|---|
| Content-Type | One 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.
| Verb | GET |
| URL | https://api.s.unit.sh/positive-pay/{positivePayId} |
| Required Scope | payments |
| 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
{
"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.
| Verb | GET |
| URL | https://api.s.unit.sh/positive-pay |
| Required Scope | payments |
| Timeout (Seconds) | 5 |
Query Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| page[limit] | integer | 100 | Optional. Maximum number of resources that will be returned. Maximum is 1000 resources. See Pagination. |
| page[offset] | integer | 0 | Optional. 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. |
| sort | string | sort=-createdAt | Optional. 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
type field.{
"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.
| Verb | POST |
| URL | https://api.s.unit.sh/positive-pay/{positivePayId}/cancel |
| Required Scope | payments-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
{
"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"
}
}
}
}
}