Paid at home. Settled in dollars.

Lemak takes a payment in the payer's own currency through a local channel, converts it to US dollars at an aggregated rate plus a stated spread, and settles to you over USDC or SWIFT.

What it does

Four steps, from the payer's channel to your account. Each one is a state in the database, and each state change writes its ledger entry in the same transaction.

  1. Collect

    A payer pays through a local channel: a bank QR, a wallet, a redirect. The channel calls back. Before anything is marked paid, we call the channel's own query, and the amount, currency and status must agree.

  2. Convert

    Quotes from several sources are trimmed of outliers and averaged into an immutable snapshot. Your rate is that mid plus a spread in basis points, fixed at the point you choose: order, payment or channel settlement.

  3. Hold

    Money is pending until the channel's statement confirms that it arrived. It is available three days after that by default.

  4. Settle

    USD to you over USDC or SWIFT. Both rails are operated by hand today: a person sends each payout from a queue, and two people sign the receipt.

One record, two views

The table you work from and the journal we post are two readings of one record. There is no second store to disagree with the first.

Payments

Specimen
AmountMethodPaymentStatusNet
1,000.00 THBPromptPaypi_AGQH…G6YPaid27.63 USD
2,450.00 PHPQR Phpi_7KWQ…2XBPaid41.88 USD
560.00 THBPromptPaypi_M4TB…J9LRequires payment—
18,900.00 PHPQR Phpi_QZ2E…R4VFailed—

Journal J1, payment succeeded, THB

Specimen
AccountDebitCredit
Channel receivable1,000.00—
Merchant pending—975.00
Fee revenue—25.00
Journal1,000.001,000.00

Balanced per currency at commit, written in the same transaction as the state it records, and append-only after.

Controls

Each control is held by the database or by a test, not by this page.

  • Journal integrity

    Four measures keep the ledger append-only: an insert-only grant, a revoke from every other role, a row trigger that stops the owner, and a statement trigger that stops a truncate.

  • Duplicate suppression

    One atomic insert claims an idempotency key. Two retries of one request cannot both proceed.

  • Your credentials

    A key is 130 bits from crypto/rand, shown once and stored as a digest. Requests are signed by HMAC or by Ed25519, and with Ed25519 we never hold the private half.

  • Key custody

    Every secret we issue is derived from one master key by purpose. None of them is stored.

  • Dual control

    A fee, a spread, an adjustment and a payout account change each need a second approver. The database refuses the change when the maker is also the checker.

  • Audit

    Every administrative write commits its audit row in the same transaction as the change.

How a price is built

Three parts, each a row you can read: a fee on the payment, a spread on the rate, and a fee on a dispute. Here is the example this site uses.

  1. Paid in

    1,000.00 THB

    The payer's amount, in minor units from end to end.

  2. After the fee

    975.00 THB

    A payment fee of 2.5%, from the fee row in force when the payment was made.

  3. Rate

    35.28

    An aggregated mid of 35.00 plus a spread of 80 basis points, kept to twelve places.

  4. Settled

    27.63 USD

    Rounded down. The remainder is booked to a named account, not kept loose.

The PRODUCT specification's worked example. Your rates are the ones in your agreement. How a price is built, in full

The name

Lemak is Malay and Indonesian for rich, or creamy, as in nasi lemak: rice cooked in coconut milk. Our markets are in Southeast Asia, so the coconut palm is the one picture that carries the name.

The Straits trade settled through the bill of exchange. Money was paid in at one house and paid out at another, in another currency. The two houses settled between themselves on one book.

That is this business, with better clocks. The motto on the crest, per unum librum, means "through one book".

Where it stands

What is true today, without spin.

MarketsThe Philippines, by QR Ph, through one production adapter, measured against the live provider. Its callback wire format is unverified until a public endpoint and a paid order exist. Thailand (PromptPay), Indonesia and Vietnam are planned. Test mode runs every method through a mock channel.
SettlementUSD only. USDC and SWIFT, both manual.
OnboardingOur operators create each account. There is no self-service sign-up.
StatusNot live. No environment holds merchant funds. Every statement on this site describes what the code does, verified by its tests against a live database.
IntegrationThe specification is public, and you can read it before any contact.

Release notes

  • Webhook signing, version one

    Each endpoint has its own secret. The signature covers the timestamp and the body as one string.

  • A changed payout account holds the settlement

    A new payout account needs a second approver, and the next settlement waits 24 hours after it.

  • The first production channel

    The Philippines adapter, built against the live provider and measured there.

  • The checkout carries the merchant's mark

    The hosted page shows the payer who is being paid.

Read it, then talk to us.

To talk to us, book a demo. The form goes to a person on our sales team, who replies by email. The specification says what is built, what is not, and how each part is verified, so you can read it first.