Blnk Core 0.15.3 is out. This SDK still targets 0.15.0 (1.3.0) and is missing the new request fields, response types, and coverage below.
Core changelog: https://docs.blnkfinance.com/changelog/blnk-core
Missing support
1. Dry-run transactions (dry_run)
Core can preview a post without writing a transaction, queue entry, webhook, hook, or @ balance. The reference is not consumed. The preview always returns HTTP 200; a projected rejection is would_apply: false, not an HTTP error. dry_run takes precedence over skip_queue.
Add optional dryRun(boolean) (JSON dry_run, default false) to:
blnk.transactions().create() (POST /transactions)
blnk.transactions().createBulk() (POST /transactions/bulk)
blnk.transactions().refund() (POST /refund-transaction/{id})
blnk.transactions().updateStatus() (PUT /transactions/inflight/{id})
blnk.transactions().bulkCommitInflight()
blnk.transactions().bulkVoidInflight()
Add a typed dry-run response (do not treat it as a recorded transaction). Shape:
dry_run: true
would_apply: boolean
rejection?: { code, reason, message } when would_apply is false (code is the same catalog code a real post would return)
status, reference, currency, amount, precise_amount (string), precision
operation on inflight previews (commit | void)
balances[] with balance_id, role, currency, virtual, and current_* / resulting_* minor-unit strings
For bulk and splits, skip_queue still selects cumulative vs independent projection. run_async is ignored on a bulk dry run.
Docs: Dry-run transactions · Dry-run a transaction
2. Create internal balances (indicator)
You can now create a General Ledger balance yourself. CreateLedgerBalance has no indicator setter.
- Add optional
indicator(String) on create
- Callers send
ledgerId("general_ledger_id") and an @ indicator (no whitespace), e.g. @Revenue
- Duplicate indicator + currency returns
409 with GEN_CONFLICT
indicator is only valid when ledger_id is general_ledger_id
Docs: Internal balances · Create balance
3. Refund description and meta_data
Refund currently only documents skipQueue. Core 0.15.3 also accepts:
description — narration for the refund. When omitted or empty, Core copies the original transaction's description
metaData — merged onto metadata inherited from the original. Sent keys replace matching keys; other keys stay. An empty object is ignored. The original transaction is not modified
Docs: Refund transaction
4. List hooks without a type
GET /hooks without type now returns all hooks (PRE and POST). Confirm blnk.hooks().list() works with no type filter. If the SDK currently requires type, make it optional.
Docs: List hooks
5. Validation errors to recognize
No new endpoints. Surface these structured codes when Core rejects a request:
TXN_INVALID_AMOUNT — negative amount, precise_amount, or precision
- Source equal to destination is rejected before processing
GEN_CONFLICT — duplicate internal-balance indicator + currency
Docs: API error codes
Out of scope (Core-only, no SDK API change)
- Official image is now
ghcr.io/blnkfinance/blnk
- Committed/voided transactions no longer keep
meta_data.inflight: true
- Typesense keeps balance
meta_data after a transaction
- Scoped keys can update metadata with
metadata:write
Acceptance criteria
Blnk Core 0.15.3 is out. This SDK still targets 0.15.0 (
1.3.0) and is missing the new request fields, response types, and coverage below.Core changelog: https://docs.blnkfinance.com/changelog/blnk-core
Missing support
1. Dry-run transactions (
dry_run)Core can preview a post without writing a transaction, queue entry, webhook, hook, or
@balance. Thereferenceis not consumed. The preview always returns HTTP200; a projected rejection iswould_apply: false, not an HTTP error.dry_runtakes precedence overskip_queue.Add optional
dryRun(boolean)(JSONdry_run, defaultfalse) to:blnk.transactions().create()(POST /transactions)blnk.transactions().createBulk()(POST /transactions/bulk)blnk.transactions().refund()(POST /refund-transaction/{id})blnk.transactions().updateStatus()(PUT /transactions/inflight/{id})blnk.transactions().bulkCommitInflight()blnk.transactions().bulkVoidInflight()Add a typed dry-run response (do not treat it as a recorded transaction). Shape:
dry_run: truewould_apply: booleanrejection?: { code, reason, message }whenwould_applyisfalse(codeis the same catalog code a real post would return)status,reference,currency,amount,precise_amount(string),precisionoperationon inflight previews (commit|void)balances[]withbalance_id,role,currency,virtual, andcurrent_*/resulting_*minor-unit stringsFor bulk and splits,
skip_queuestill selects cumulative vs independent projection.run_asyncis ignored on a bulk dry run.Docs: Dry-run transactions · Dry-run a transaction
2. Create internal balances (
indicator)You can now create a General Ledger balance yourself.
CreateLedgerBalancehas noindicatorsetter.indicator(String)on createledgerId("general_ledger_id")and an@indicator (no whitespace), e.g.@Revenue409withGEN_CONFLICTindicatoris only valid whenledger_idisgeneral_ledger_idDocs: Internal balances · Create balance
3. Refund
descriptionandmeta_dataRefund currently only documents
skipQueue. Core 0.15.3 also accepts:description— narration for the refund. When omitted or empty, Core copies the original transaction's descriptionmetaData— merged onto metadata inherited from the original. Sent keys replace matching keys; other keys stay. An empty object is ignored. The original transaction is not modifiedDocs: Refund transaction
4. List hooks without a type
GET /hookswithouttypenow returns all hooks (PRE and POST). Confirmblnk.hooks().list()works with no type filter. If the SDK currently requirestype, make it optional.Docs: List hooks
5. Validation errors to recognize
No new endpoints. Surface these structured codes when Core rejects a request:
TXN_INVALID_AMOUNT— negativeamount,precise_amount, orprecisionGEN_CONFLICT— duplicate internal-balance indicator + currencyDocs: API error codes
Out of scope (Core-only, no SDK API change)
ghcr.io/blnkfinance/blnkmeta_data.inflight: truemeta_dataafter a transactionmetadata:writeAcceptance criteria
dryRunon create, bulk create, refund, update inflight, bulk commit, and bulk voidwouldApply,rejection,balances)indicatoronledgerBalances().create()withledgerId("general_ledger_id")descriptionandmetaDataontransactions().refund()hooks().list()withouttypereturns all hooks