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.
More details in the positive pay guide.
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
| Name | Type | Description |
|---|---|---|
| originatorName | string | Name of the ACH Received Payment originator. Required if originatorEntityId is not provided. |
| originatorEntityId | string | Entity ID of the ACH Received Payment originator. Required if originatorName is not provided. |
| amount | integer | Optional. Maximum allowed debit amount in cents. Decisioning uses this as a maximum. |
| expirationDate | RFC3339 Date | Optional. When the authorization expires. |
| tags | object | Optional. See Tags. Tags that will be copied to any transaction that this payment creates (see Tag Inheritance). |
At least one of originatorName or originatorEntityId must be provided.
Relationships
| Name | Type | Description |
|---|---|---|
| account | JSON:API Relationship | Required. The account this Positive Pay rule applies to. |
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
| Field | Type | Description |
|---|---|---|
| data | receivedAchDebitPositivePay | The requested resource after the operation was completed. |
{
"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
| Name | Type | Description |
|---|---|---|
| originatorName | string | Name of the ACH credit originator. Required if originatorEntityId is not provided. |
| originatorEntityId | string | Entity ID of the ACH credit originator. Required if originatorName is not provided. |
| amount | integer | Optional. Maximum allowed credit amount in cents. Decisioning uses this as a maximum. |
| expirationDate | RFC3339 Date | Optional. When the authorization expires. |
| tags | object | Optional. See Tags. Tags that will be copied to any transaction that this payment creates (see Tag Inheritance). |
At least one of originatorName or originatorEntityId must be provided.
Relationships
| Name | Type | Description |
|---|---|---|
| account | JSON:API Relationship | Required. The account this Positive Pay rule applies to. |
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
| Field | Type | Description |
|---|---|---|
| data | receivedAchCreditPositivePay | The requested resource after the operation was completed. |
{
"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
| Name | Type | Description |
|---|---|---|
| checkNumber | string | Required. Check number to authorize. |
| amount | integer | Required. Expected amount in cents. Must match within 1$ tolerance. |
| payeeName | string | Optional. Payee name to add specificity. |
| expirationDate | RFC3339 Date | Optional. When the authorization expires. |
| tags | object | Optional. See Tags. Tags that will be copied to any transaction that this payment creates (see Tag Inheritance). |
Relationships
| Name | Type | Description |
|---|---|---|
| account | relationship | Required. The account this Positive Pay rule applies to. |
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
| Field | Type | Description |
|---|---|---|
| data | checkPaymentPositivePay | The requested resource after the operation was completed. |
{
"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
| Name | Type | Description |
|---|---|---|
| expirationDate | RFC3339 Date | Optional. When the authorization expires. |
| tags | object | Optional. Internal labels for your own use. |
Relationships
| Name | Type | Description |
|---|---|---|
| account | relationship | Required. The account this Positive Pay rule applies to. |
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
| Field | Type | Description |
|---|---|---|
| data | drawdownPositivePay | The requested resource after the operation was completed. |
{
"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
| Field | Type | Description |
|---|---|---|
| data | One of receivedAchDebitPositivePay, receivedAchCreditPositivePay, checkPaymentPositivePay, or drawdownPositivePay | The Positive Pay rule. |
{
"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
| Field | Type | Description |
|---|---|---|
| data | Array of receivedAchDebitPositivePay, receivedAchCreditPositivePay, checkPaymentPositivePay, or drawdownPositivePay | 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). |
{
"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
| Field | Type | Description |
|---|---|---|
| data | One of receivedAchDebitPositivePay, receivedAchCreditPositivePay, checkPaymentPositivePay, or drawdownPositivePay | The cancelled Positive Pay rule. |
{
"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"
}
}
}
}
}