Activate PND (Post No Debit)
Activate Post No Debit restriction on a deposit account to block all debit transactions while allowing credits to continue.
Overview
The ActivatePNDOnAccountCommand places a Post No Debit (PND) restriction on a deposit account. Unlike a full account lock, PND allows deposits/credits to continue while blocking all withdrawals, transfers out, and debits. This is commonly used for accounts that have exceeded limits, have regulatory flags, or require debit restrictions without completely freezing the account.
Key Capabilities
- Selective Restriction: Blocks debits only, allows credits
- Regulatory Compliance: Standard banking restriction mechanism
- Automatic Triggers: Can be auto-activated when limits exceeded
- Audit Trail: Records PND reason and activation user
- Reversible: Can be removed via ReleasePNDFromDepositAccountCommand
- Balance Growth: Account can still receive deposits
API Endpoint
POST /api/bpm/cmd
Headers
Content-Type: application/json
Authorization: Bearer {access_token}
X-Tenant-ID: {tenant_id}
Request Structure
Command Payload
{
"commandName": "ActivatePNDOnAccountCommand",
"data": {
"accountEncodedKey": "string",
"lockReason": "string"
}
}
Request Fields
| Field | Type | Required | Description |
|---|---|---|---|
accountEncodedKey | string | Yes | Account number or encoded key |
lockReason | string | Yes | Reason for PND activation |
Response Structure
Success Response
{
"isSuccessful": true,
"message": "The deposit account has been placed on PND successfully. You cannot carry out any debit transaction on the account.",
"statusCode": "00"
}
Error Response
{
"isSuccessful": false,
"message": "The deposit account is already on PND (POST NO DEBIT).",
"statusCode": "INVALID_REQUEST"
}
Sample Requests
1. PND for Daily Limit Exceeded
{
"commandName": "ActivatePNDOnAccountCommand",
"data": {
"accountEncodedKey": "ACC001234567",
"lockReason": "Daily withdrawal limit exceeded - PND activated automatically"
}
}
2. PND for Suspicious Activity
{
"commandName": "ActivatePNDOnAccountCommand",
"data": {
"accountEncodedKey": "SAV987654321",
"lockReason": "Multiple failed transaction attempts detected - Security measure"
}
}
3. PND for Regulatory Hold
{
"commandName": "ActivatePNDOnAccountCommand",
"data": {
"accountEncodedKey": "8A3F2D1E9B5C4F7A6E8D2C1B3A9F5E7D",
"lockReason": "AML review in progress - Debits restricted pending clearance"
}
}
Business Logic
Processing Workflow
Validation Steps
- Extract Fields: Get accountEncodedKey and lockReason
- Account Query: Load account with related entities
- Existence Check: Verify account exists
- Duplicate Check: Verify IsOnPND is not already true
- PND Activation: Set IsOnPND flag to true
- Database Update: Persist change
- Notification: Send activity notification
- Success Response: Return confirmation with warning message
Impact of PND
Allowed Operations
- ✅ Deposits from all channels
- ✅ Transfers into the account
- ✅ Interest credits
- ✅ Salary credits
- ✅ Balance inquiries
Blocked Operations
- ❌ Withdrawals (cash, ATM, teller)
- ❌ Transfers out of the account
- ❌ Bill payments from account
- ❌ Standing orders (debits)
- ❌ Card transactions (debit)
- ❌ Check payments
Error Responses
| Error Code | Message | Resolution |
|---|---|---|
Client_Not_Found | "The deposit account does not exist." | Verify account identifier |
INVALID_REQUEST | "Account already on PND" | Check IsOnPND status first |
Code Examples
C# Implementation
public async Task<PNDResponse> ActivatePNDAsync(
string accountEncodedKey,
string lockReason)
{
var request = new
{
commandName = "ActivatePNDOnAccountCommand",
data = new { accountEncodedKey, lockReason }
};
var json = JsonSerializer.Serialize(request);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync($"{_baseUrl}/api/bpm/cmd", content);
return JsonSerializer.Deserialize<PNDResponse>(await response.Content.ReadAsStringAsync());
}
JavaScript Implementation
async activatePND(accountEncodedKey, lockReason) {
const request = {
commandName: 'ActivatePNDOnAccountCommand',
data: { accountEncodedKey, lockReason }
};
const response = await fetch(`${this.baseUrl}/api/bpm/cmd`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.accessToken}`,
'X-Tenant-ID': this.tenantId
},
body: JSON.stringify(request)
});
return await response.json();
}
Python Implementation
def activate_pnd(self, account_encoded_key: str, lock_reason: str) -> PNDResponse:
request_data = {
'commandName': 'ActivatePNDOnAccountCommand',
'data': {
'accountEncodedKey': account_encoded_key,
'lockReason': lock_reason
}
}
response = requests.post(
f'{self.base_url}/api/bpm/cmd',
headers=self.headers,
json=request_data
)
result = response.json()
return PNDResponse(
is_successful=result.get('isSuccessful', False),
message=result.get('message', ''),
status_code=result.get('statusCode', '')
)
Business Rules
Validation Rules
- Account Required: accountEncodedKey must be provided
- Lock Reason Required: lockReason is mandatory
- Account Must Exist: Account must be in system
- No Duplicate PND: Cannot activate PND on account already on PND
- Valid Identifier: Account number or encoded key accepted
Operational Rules
- Flag Set: IsOnPND boolean flag set to true
- Credits Allowed: Deposits and transfers in continue normally
- Debits Blocked: All withdrawals and transfers out are blocked
- Automatic Trigger: System can auto-activate PND when limits exceeded
- Manual Activation: Can be manually activated by authorized users
- Activity Logged: Activation logged with ActivatePND action
- Notification Sent: Activity notification published
- No Expiry: PND remains until explicitly released
- Balance Accessible: Balance inquiries still work
- Interest Accrual: Interest continues to accrue normally
Related Operations
- ReleasePNDFromDepositAccountCommand: Remove PND restriction
- LockDepositAccountCommand: Full account lock (blocks all transactions)
- InitiateWithdrawalCommand: Auto-activates PND when limits exceeded
Support
For technical assistance: api-support@banklingo.com