Ship transaction workflowson an open-source ledger
An immutable, double-entry ledger you run in production. Every workflow becomes a transaction you can trace, audit, and reconcile.
git clone https://github.com/blnkfinance/blnk && cd blnk && docker compose up Transaction details
Transaction workflows
const response = await blnk.Transactions.create({ precise_amount: 125034, precision: 100, currency: 'USD', source: '@WorldUSD', destination: '@MyBalance', reference: 'ref_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94', description: 'Customer payment', skip_queue: true,}); Built-in correctness and reliability
-
Double-entry accounting
Every transaction has a source and a destination. Debits always equal credits, so the books cannot silently drift.
-
Immutable records
Recorded transactions cannot be edited or deleted. History is only appended.
-
Reliable at scale
Concurrent transactions are ordered and applied safely, preventing conflicting writes from corrupting balances under high traffic.
Model multicurrency workflowswith precise money movement
-
Balances in any currency
Store multiple currencies in the same ledger and organize balances in ledger folders.
-
Currency exchange workflows
Model FX conversions and move value between currencies with a complete transaction audit trail.
-
Exact amounts, any asset
Record BTC, ETH, and other digital assets down to their smallest supported unit.
Reserve funds with inflight. Release or clear only whenyour conditions are met.
Integrate your ledger transactions withany stack, provider or payment rail
-
Your ledger is the source of truth
Put it in front of any payment provider or rail and integrate the third parties you already use.
-
Post from the stack you already have
Use our REST API and SDKs with the languages and infrastructure you already use.
const response = await blnk.Transactions.create({ precise_amount: 123012, precision: 100, currency: 'USD', source: '@WorldUSD', destination: '@MyBalance', reference: 'ref_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94', description: 'Wallet top-up for Ada Okonkwo', inflight: true, allow_overdraft: true, skip_queue: true,});if (checksComplete) { await blnk.Transactions.updateStatus( response.data.transaction_id, { status: 'commit' }, );} else { await blnk.Transactions.updateStatus( response.data.transaction_id, { status: 'void' }, );}curl -X POST "http://YOUR_BLNK_INSTANCE_URL/transactions" \ -H "X-blnk-key: $BLNK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "precise_amount": 123012, "precision": 100, "currency": "USD", "source": "@WorldUSD", "destination": "@MyBalance", "reference": "ref_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94", "description": "Wallet top-up for Ada Okonkwo", "inflight": true, "allow_overdraft": true, "skip_queue": true }'if [ "$CHECKS_COMPLETE" = true ]; then curl -X PUT "http://YOUR_BLNK_INSTANCE_URL/transactions/inflight/$TRANSACTION_ID" \ -H "X-blnk-key: $BLNK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "status": "commit" }'else curl -X PUT "http://YOUR_BLNK_INSTANCE_URL/transactions/inflight/$TRANSACTION_ID" \ -H "X-blnk-key: $BLNK_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "status": "void" }'fitransaction, resp, err := client.Transaction.Create( blnkgo.CreateTransactionRequest{ ParentTransaction: blnkgo.ParentTransaction{ PreciseAmount: big.NewInt(123012), Precision: 100, Currency: "USD", Source: "@WorldUSD", Destination: "@MyBalance", Reference: "ref_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94", Description: "Wallet top-up for Ada Okonkwo", }, Inflight: true, AllowOverdraft: true, SkipQueue: true, },)if checksComplete { transaction, resp, err = client.Transaction.Update( transaction.TransactionID, blnkgo.UpdateStatus{ Status: blnkgo.InflightStatusCommit }, )} else { transaction, resp, err = client.Transaction.Update( transaction.TransactionID, blnkgo.UpdateStatus{ Status: blnkgo.InflightStatusVoid }, )}response = blnk.transactions.create({ "precise_amount": 123012, "precision": 100, "currency": "USD", "source": "@WorldUSD", "destination": "@MyBalance", "reference": "ref_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94", "description": "Wallet top-up for Ada Okonkwo", "inflight": True, "allow_overdraft": True, "skip_queue": True,})if checks_complete: blnk.transactions.update_status( response["transaction_id"], {"status": "commit"}, )else: blnk.transactions.update_status( response["transaction_id"], {"status": "void"}, )ApiResponse<JsonNode> response = blnk.transactions().create( CreateTransactions.create() .preciseAmount(123012) .precision(100) .currency("USD") .source("@WorldUSD") .destination("@MyBalance") .reference("ref_f482a1b3-6c2d-4e89-a17b-3d5e8f2a1c94") .description("Wallet top-up for Ada Okonkwo") .inflight(true) .allowOverdraft(true) .skipQueue(true));if (checksComplete) { blnk.transactions().updateStatus( response.data().get("transaction_id").asText(), UpdateTransactionStatus.create().status("commit"));} else { blnk.transactions().updateStatus( response.data().get("transaction_id").asText(), UpdateTransactionStatus.create().status("void"));} -
Automate reconciliation
Match ledger transactions against external records and quickly identify drifts across payment rails.
Stories
Hundreds of engineers sleep well at night with Blnk powering their product.
Read more storiesCustomer testimonials
- The support from the team was incredible. They not only guided us through their product but also helped us implement it within our system. — Sajith Caldera, CEO, Bitnomi
- We are very convinced that you are the right team. We believe you can shorten our development time from a year to four months. — Mario León, CEO, Morna Tech
- Given the fact that Blnk is open-source, with support for a managed Cloud dashboard, you have solved 70% of our engineering problems. — Mohammed Al-Ameen, Head of Engineering, Digitvant
- Blnk is the best solution that I have found until now. The other choices are a bit too complex to use and do too much. Blnk does the job that a ledger needs to do without complexity. — Antonio, CTO, BR Tokens
- I’ve done a bit of research with some other products personally… and so far, we both think that yours stood out ahead of the other open-source competition. — Fahad Khawaja, Senior Engineer, Oraan
- We know we won’t get everything right the first time. But with Blnk, we are confident that we can keep iterating until we do. — Patrick McEvoy, CTO, Oraan
- The personal touch is what makes you better/different from your competitors. — Prerak Motwany, Co-founder, Bitnomi
- I’m not very good with accounting, but the docs were easy to understand and helped us get started right away. — Kevis Rondon, CTO, Morna Tech
- Integration was seamless, and the fact that it’s open-source adds flexibility. On top of that, Blnk is incredibly fast, making it a solid choice for high-performance financial systems. — Toni Akinmolayan, Senior Engineer, Yousend
- It’s the best and most comprehensive solution that I have found. — Awale Jamac, Co-founder, Onbilia
-
Public Grid
How Public Grid went from bare Postgres to a production-grade ledger
Read Public Grid's story -
Morna Tech
How Morna Tech cut a year of development to 6 months with Blnk
Read Morna Tech's story -
Yousend
How Yousend shipped cross-border payments with Blnk Finance
Read Yousend's story -
Tecnología Financiera
How Tecnología Financiera uses its licenses and Blnk to power Venezuela’s fintechs
Read Tecnología Financiera's story
Security
Open-source ledger infrastructure you can trust
Blnk is ISO/IEC 27001-certified and GDPR-compliant. Built with security features and best practices auditors ask for.
How we handle securityISO/IEC 27001 and GDPR
Blnk’s ISMS is certified to ISO/IEC 27001. Personal data is processed under GDPR.
Encryption in transit and at rest
Sensitive data at rest is encrypted with AES-256-GCM. Data in transit uses TLS 1.2 or higher.
Role-based access control
Give every team member the access they need, and nothing more. Granular roles keep sensitive ledger operations restricted while making audits and reviews straightforward.
Built for security reviews
We support vendor and security reviews with clear policies around access control, information security, incident response, and business continuity.
FAQs
Have other questions? Email us at [email protected].
What is Blnk Core?
Blnk Core is an open-source ledger for transaction workflows. You post the movement. Core keeps the balances, conversions, rails, and matches around it.
What can I build with Blnk Core?
You can build products that need to track money and balances, including wallets, lending products, marketplaces, savings, insurance, trading, and payment applications.
Is Blnk a payment provider or payment rail?
No. Blnk is the ledger. You continue to use providers and rails such as Stripe, Unit, bank transfers, or card networks to move money. Blnk records those movements and keeps your financial state in one place.
Can Blnk work alongside my existing ledger?
Yes. You can run Blnk as a shadow ledger alongside your existing system. This gives you a way to validate balances and transaction records before making it the primary ledger.
How does Blnk keep balances accurate?
Every transaction has a source and a destination. Debits always equal credits, so the books cannot silently drift. Concurrent transactions are applied in order, and configurable precision prevents unwanted rounding.
How do I integrate Blnk with my application?
Blnk provides REST APIs that you can use from any language or framework. You can integrate it into your existing application stack without adopting a specific programming language or infrastructure.
Can I try Blnk before using it in production?
Yes. You can create a Blnk Cloud sandbox , create balances, post transactions, connect a payment rail, and test your workflows before moving to production.
Is Blnk Core free?
The open-source Core engine is free to run. Paid offerings are available for teams that need managed infrastructure, a back office, support, production guarantees, or commercial licensing.
Can Blnk handle production workloads?
Yes. Blnk is designed to handle production financial workloads, from startup applications to systems processing high transaction volumes. Your deployment architecture and infrastructure determine the capacity of a specific installation.