Bank deposits

Deposits into a bank account.

The object#

FieldTypeDescription
idread-onlyintegerNolaPro id.
cashtotalmoneystring(4dp)Stored as decimal(19,4).
checktotalmoneystring(4dp)Stored as decimal(19,4).
othertotalmoneystring(4dp)Stored as decimal(19,4).
cashoutmoneystring(4dp)Stored as decimal(19,4).
depositdatestringDate of the bank deposit - the accounting date it posts under.
checkaccountidintegerChecking account the deposit goes into.
checkaccountstring(30)The name of the referenced checkaccounts, instead of the id. Send this or checkaccountid, not both unless they agree.
onbankstatementread-onlyinteger1 once the deposit has been matched to a bank statement.
cancelbooleanCancelled. Always a boolean on the wire, whatever integer width the column uses (D23).
entrydatestringWhen the record was created.
bankstatement_enddateread-onlystringEnd date of the bank statement the deposit was reconciled under. Maintained by bank reconciliation.
voucheridintegerVoucherid. Id only.
voucherstring(50)The voucher of the referenced gltransactions, instead of the id. Send this or voucherid, not both unless they agree.
depositdescriptionstring(255)Description printed on the deposit slip.
currencystring(10)Currency of the deposit.
ccdepositinteger1 when the deposit records credit-card settlement funds rather than checks and cash.
ardailycloseidintegerArdailycloseid. Id only.
bankstatement_cleardateread-onlystringDate the deposit cleared the bank. Maintained by bank reconciliation.
cancelvoucheridintegerCancelvoucherid. Id only.
cancelvoucherstring(50)The voucher of the referenced gltransactions, instead of the id. Send this or cancelvoucherid, not both unless they agree.
externalidstring(100)Your own key. Scoped to your company.

Endpoints#

GET/bankdeposits/{id}/lines 200422

What went into a deposit.

The composition of a bank deposit - each payment or item that made up the total. Reconciling a deposit against a bank statement needs the parts, not the sum: the statement shows one credit, and matching it means knowing which receipts were banked together.

Requires scope banking:read.

Parameters
NameInTypeNotes
idrequiredpathintegerThe deposit id.
When it fails
StatusCodeMeaning
422unknown_valueNo such parent record in this company.
curl \
  'https://acme.nolapro.com/!/api/v2/bankdeposits/104/lines' \
  -H 'Authorization: Bearer $NP_TOKEN'
POST/bankdeposits/batch 207422422a409422b422c422d

Create many.

Requires scope banking:write.

Parameters
NameInTypeNotes
Idempotency-KeyheaderstringMakes the write safely retryable. Any unique string per logical operation; a UUID is fine. The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing. The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours.
Body array
FieldTypeDescription
idread-onlyintegerNolaPro id.
cashtotalmoneystring(4dp)Stored as decimal(19,4).
checktotalmoneystring(4dp)Stored as decimal(19,4).
othertotalmoneystring(4dp)Stored as decimal(19,4).
cashoutmoneystring(4dp)Stored as decimal(19,4).
depositdatestringDate of the bank deposit - the accounting date it posts under.
checkaccountidintegerChecking account the deposit goes into.
checkaccountstring(30)The name of the referenced checkaccounts, instead of the id. Send this or checkaccountid, not both unless they agree.
onbankstatementread-onlyinteger1 once the deposit has been matched to a bank statement.
cancelbooleanCancelled. Always a boolean on the wire, whatever integer width the column uses (D23).
entrydatestringWhen the record was created.
bankstatement_enddateread-onlystringEnd date of the bank statement the deposit was reconciled under. Maintained by bank reconciliation.
voucheridintegerVoucherid. Id only.
voucherstring(50)The voucher of the referenced gltransactions, instead of the id. Send this or voucherid, not both unless they agree.
depositdescriptionstring(255)Description printed on the deposit slip.
currencystring(10)Currency of the deposit.
ccdepositinteger1 when the deposit records credit-card settlement funds rather than checks and cash.
ardailycloseidintegerArdailycloseid. Id only.
bankstatement_cleardateread-onlystringDate the deposit cleared the bank. Maintained by bank reconciliation.
cancelvoucheridintegerCancelvoucherid. Id only.
cancelvoucherstring(50)The voucher of the referenced gltransactions, instead of the id. Send this or cancelvoucherid, not both unless they agree.
externalidstring(100)Your own key. Scoped to your company.
When it fails
StatusCodeMeaning
422deposit_refusedA row was refused. Read each row's own status.
422acannot_mix_cc_and_cashA card deposit cannot also carry cash.
409already_depositedA receipt is already on another deposit.
422bunknown_valueNo such bank account, receipt or voucher in this company.
422caccount_not_configuredThe bank account has no GL account assigned.
422dperiod_closedThe GL period containing the deposit date is closed.
curl -X POST \
  'https://acme.nolapro.com/!/api/v2/bankdeposits/batch' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: your-unique-key' \
  -d '[
    {
        "cashtotal": "125.0000",
        "checktotal": "125.0000",
        "othertotal": "125.0000",
        "cashout": "125.0000",
        "depositdate": "2026-08-01",
        "checkaccountid": 104
    }
]'
GET/bankdeposits 200403

List bank deposits.

Requires scope banking:read.

Parameters
NameInTypeNotes
cancelquerystringDefaults to false. Pass true or any.
externalidquerystringExact match on your own key.
includequerystringComma-separated extras to embed. Only custom_fields is available: the extra fields this install has defined on the record. Off by default, and an unrecognised value is refused rather than ignored. See Conventions.
When it fails
StatusCodeMeaning
403insufficient_scopeToken lacks read scope.
curl \
  'https://acme.nolapro.com/!/api/v2/bankdeposits' \
  -H 'Authorization: Bearer $NP_TOKEN'
POST/bankdeposits 201400409422422x0422x1422x2422x3

Bank a set of receipts together.

A deposit is not a row, it is a set of receipts banked together, and creating one posts a voucher: the bank account is debited for the total and each receipt's holding account is credited. You do not send totals. They are worked out from the receipts you list, so the deposit and the ledger cannot disagree. cashtotal and cashout are the exception, being loose notes that no receipt represents. Every receipt is checked to be yours, live, and not already banked. Banking one twice would credit the bank account twice, so a receipt already on another deposit is refused rather than moved.

Requires scope banking:write.

Parameters
NameInTypeNotes
Idempotency-KeyheaderstringMakes the write safely retryable. Any unique string per logical operation; a UUID is fine. The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing. The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours.
Body
FieldTypeDescription
checkaccountidrequiredintegerThe bank account the money is going into. It must have a GL account assigned or the deposit cannot post.
depositdatestringThe banking date. Defaults to today. Its GL period must be open.
depositdescriptionstring(255)Free text shown on the deposit and its ledger voucher.
costcodeidintegerCost code to carry onto the ledger lines. 0 for none.
cashtotalstring(4dp)Loose cash banked, as a decimal string. Not a JSON number.
cashoutstring(4dp)Cash withdrawn from the deposit to petty cash, as a decimal string.
ccdepositbooleanTrue when these receipts are card settlements. A card deposit cannot also carry cash; bank them separately, which is what the Daily Close does.
invoicepaymentidsarray of integerPayments taken against invoices (arinvoicepaymentdetail ids).
cashpaymentidsarray of integerOver-the-counter cash payments (cashpayment ids).
orderdepositidsarray of integerDeposits taken against sales orders (arorder_deposit ids).
estquotedepositidsarray of integerDeposits taken against print quotes (estquote_deposit ids).
vouchersobjectJournal entries being banked, as voucher id to the GL account the money came out of.
When it fails
StatusCodeMeaning
400invalid_requestMissing or malformed field.
409already_depositedA receipt is already on another deposit.
422deposit_refusedA rule was broken. Nothing was written.
422x0unknown_valueNo such bank account, receipt or voucher in this company.
422x1account_not_configuredThe bank account has no GL account assigned.
422x2period_closedThe GL period containing the deposit date is closed.
422x3cannot_mix_cc_and_cashA card deposit cannot also carry cash.
curl -X POST \
  'https://acme.nolapro.com/!/api/v2/bankdeposits' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: your-unique-key' \
  -d '{
    "checkaccountid": 104
}'
GET/bankdeposits/{id} 200404

Retrieve one record.

Requires scope banking:read.

Parameters
NameInTypeNotes
idrequiredpathintegerThe record id.
includequerystringComma-separated extras to embed. Only custom_fields is available: the extra fields this install has defined on the record. Off by default, and an unrecognised value is refused rather than ignored. See Conventions.
When it fails
StatusCodeMeaning
404not_foundNo record with that id.
curl \
  'https://acme.nolapro.com/!/api/v2/bankdeposits/104' \
  -H 'Authorization: Bearer $NP_TOKEN'
Response 200
{
    "cashtotal": "125.0000",
    "checktotal": "125.0000",
    "othertotal": "125.0000",
    "cashout": "125.0000",
    "depositdate": "2026-08-01",
    "checkaccountid": 104
}
PATCH/bankdeposits/{id} 200404

Update.

Only depositdescription can change. The totals are in the voucher this deposit already posted, so amending one here would leave the two disagreeing. To change what is IN a deposit, cancel it and bank the receipts again - that leaves the reversal in the ledger, which is the point.

Requires scope banking:write.

Parameters
NameInTypeNotes
idrequiredpathintegerThe record id.
Idempotency-KeyheaderstringMakes the write safely retryable. Any unique string per logical operation; a UUID is fine. The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing. The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours.
Body
FieldTypeDescription
depositdescriptionstring(255)Free text on the deposit. The only amendable field: the totals are in the voucher this deposit already posted.
When it fails
StatusCodeMeaning
404not_foundNo record with that id.
curl -X PATCH \
  'https://acme.nolapro.com/!/api/v2/bankdeposits/104' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: your-unique-key' \
  -d '{
    "depositdescription": "Example depositdescription"
}'
Response 200
{
    "cashtotal": "125.0000",
    "checktotal": "125.0000",
    "othertotal": "125.0000",
    "cashout": "125.0000",
    "depositdate": "2026-08-01",
    "checkaccountid": 104
}
DELETE/bankdeposits/{id} 200404

Cancel.

Reverses the deposit and releases its receipts so they can be banked again. A reversing voucher is written; nothing is erased. A deposit already cleared on a bank statement is refused.

Requires scope banking:cancel.

Parameters
NameInTypeNotes
idrequiredpathintegerThe record id.
Idempotency-KeyheaderstringMakes the write safely retryable. Any unique string per logical operation; a UUID is fine. The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing. The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours.
When it fails
StatusCodeMeaning
404not_foundNo record with that id.
curl -X DELETE \
  'https://acme.nolapro.com/!/api/v2/bankdeposits/104' \
  -H 'Authorization: Bearer $NP_TOKEN'
Response 200
{
    "cashtotal": "125.0000",
    "checktotal": "125.0000",
    "othertotal": "125.0000",
    "cashout": "125.0000",
    "depositdate": "2026-08-01",
    "checkaccountid": 104
}
GET/bankdeposits/{id}/pdf 200

Deposit slip as a PDF

The deposit slip listing everything banked together. Answers application/pdf, not JSON. Because the body is binary it cannot be carried inside a /batch results array; asking for it there returns 415 not_batchable.

Requires scope banking:read.

Parameters
NameInTypeNotes
idrequiredpathintegerThe record id.
curl \
  'https://acme.nolapro.com/!/api/v2/bankdeposits/104/pdf' \
  -H 'Authorization: Bearer $NP_TOKEN'
GET/bankdeposits/{id}/attachments 200404

List files attached to a bank deposit.

The attachments on this bank deposit, newest first. Accepted filedefinitionid values: 50 (default 50). Metadata only - each file's bytes are at GET /attachments/{id}/content.

Requires scope banking:read.

Parameters
NameInTypeNotes
idrequiredpathintegerThe bank deposit id.
filedefinitionidqueryintegerOnly files in this list. Accepted filedefinitionid values: 50 (default 50).
filecategoryidqueryintegerOnly files filed under this category.
filenamequerystringPartial match on the file name, case insensitive.
When it fails
StatusCodeMeaning
404not_foundNo bank deposit with that id in this company.
curl \
  'https://acme.nolapro.com/!/api/v2/bankdeposits/104/attachments' \
  -H 'Authorization: Bearer $NP_TOKEN'
POST/bankdeposits/{id}/attachments 201400404409413415422

Attach a file to a bank deposit.

multipart/form-data with one file part; see the AttachmentUpload schema for the other parts. Accepted filedefinitionid values: 50 (default 50). Answers 201 with the attachment's metadata and Location: /attachments/{id}. Check _meta.warnings for datatype_truncated and stored_under_parent_company.

Requires scope banking:write.

Parameters
NameInTypeNotes
idrequiredpathintegerThe bank deposit id.
Idempotency-KeyheaderstringMakes the write safely retryable. Any unique string per logical operation; a UUID is fine. The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing. The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours.
Body multipart/form-data
FieldTypeDescription
filerequiredstringThe file. Exactly one part named file; a second one, or file[], is 400 invalid_request so an idempotent retry can never half-succeed. Empty is refused. Over the cap (the smaller of APIV2_MAX_UPLOAD_BYTES, 64 MB by default, and PHP's upload_max_filesize / post_max_size) is 413 payload_too_large naming the limit that applied.
filenamestring(255)Overrides the part's file name.
notestextFree text shown beside the file.
filedefinitionidintegerOnly when the parent accepts more than one list. Anything the parent does not accept is 422 unknown_value naming the accepted ids.
filecategoryidintegerCategory by id.
filecategorystring(255)Category by name. Sent with filecategoryid and disagreeing is 422 conflicting_reference.
When it fails
StatusCodeMeaning
400unknown_parameterA form field that is not on the AttachmentUpload schema.
400invalid_typefiledefinitionid or filecategoryid that is not an integer.
404not_foundNo bank deposit with that id in this company.
409upload_limit_reachedThis file list allows a fixed number of files on a bank deposit and it is full. Remove one first.
413payload_too_largeThe file is over the cap. The body names the limit that applied.
415multipart_requiredThe body was not multipart/form-data.
422unknown_valuefiledefinitionid is not one this bank deposit accepts, or the category does not exist in this company.
curl -X POST \
  'https://acme.nolapro.com/!/api/v2/bankdeposits/104/attachments' \
  -H 'Authorization: Bearer $NP_TOKEN' \
  -H 'Idempotency-Key: your-unique-key' \
  -F 'file=@grant-letter-signed.pdf' \
  -F 'filename=grant-letter-signed.pdf' \
  -F 'notes=Signed copy received 21 Sep' \
  -F 'filedefinitionid=8' \
  -F 'filecategory=Receipts'