Abroad for 30+ days? Discover our monthly plans to stay connected!
All posts

PaymentsMay 11, 2026 7 min read

What Is TemanQRIS and How to Use It in Your Own Product

TemanQRIS turns QRIS payments into something you can actually integrate over lunch. Here is what it does and how to use it end to end.

temanqristemanqris.comqris api indonesiadynamic qris

If you have ever tried to integrate QRIS payments into an Indonesian product, you already know the problem. The rail is great for customers. The integration path is scattered. TemanQRIS was built to fix that, and it is now the payment backbone behind more than a few local products, including this site.

What is TemanQRIS

TemanQRIS is a payment tooling platform for QRIS. It lets merchants, developers, and small teams accept QRIS payments without running their own acquirer integration. You upload a QRIS once, then use the dashboard or the API to generate dynamic charges, payment links, and webhooks around it.

The project was originally built by Indonesian engineer Rizaldy Primanta Putra, whose portfolio at riz.my.id covers his other work across software, blockchain, and cybersecurity. TemanQRIS is the most widely used of those projects because it solves a very specific, very common pain point for Indonesian sellers.

What you can actually do with it

At the core, the API covers the full payment loop:

  1. Upload your static QRIS. This is a one-time action.
  2. Generate a dynamic QRIS for a specific amount and order id.
  3. Share a payment link if you want the customer to pay from a browser without coming back to your app.
  4. Receive a signed webhook when the payment is confirmed.
  5. Reconcile orders with a simple GET endpoint.

Every sensible field you would expect is there. Amount. Description. Order id up to 30 characters. Optional fees, set as rupiah or percent. Webhook URL and callback URL passed per request.

The minimum integration, explained like a human

Let us say you run a small online store. You have a checkout page. You want a customer to scan a QRIS, pay, and land on a thank you page.

Here is the short version of what you send. This is the actual request your backend makes.

{ "amount": 150000, "order_id": "INV-2026-0001", "description": "Order INV-2026-0001", "webhook_url": "https://yoursite.com/api/payments/webhook", "callback_url": "https://yoursite.com/checkout/complete" } ```

The response gives you a QRIS string, a base64 QR image, an expiry timestamp, and a payment link object with a ready to use URL. You render the QR, or you redirect the browser to the payment link, or both.

When the buyer pays, TemanQRIS hits your webhook with a JSON body and an X-TemanQRIS-Signature header. You verify the signature with HMAC SHA256 against your webhook secret, then mark the order as paid. If the connection drops, TemanQRIS retries up to three times at 30 seconds, 2 minutes, and 10 minutes.

Why the developer ergonomics are unusually good

Rizaldy built TemanQRIS the way a working developer actually wants a payment API to behave. A few things stand out in practice.

First, the per-request webhook URL. You do not have to log into a dashboard to change where payment events go. You just pass the URL at creation time. That means staging, production, and feature branches can coexist without stepping on each other.

Second, the payload is idempotent and the retry policy is clear. You know what arrives, how often, and what to return. Every serious integration eventually needs that.

Third, the signature scheme is standard. HMAC SHA256 with a clear prefix. If you have integrated Stripe, GitHub, or any modern webhook source, the verification code is almost copy paste.

Fourth, the rate limit is generous for development. The free tier covers most early product usage, and the premium tier removes the ceiling for production volumes.

A working example from Esim ID

Esim ID uses TemanQRIS as the default payment provider. When a traveler checks out, the backend calls /api/qris/generate with the order total, a short reference id, and our webhook URL. The customer sees the payment link. When TemanQRIS posts back payment.confirmed, we verify the signature and flip the order to paid. The whole flow is under one second on the server side.

If you want to see the same plumbing structured for reuse, the integration pattern is documented across the Esim ID how-to page and the FAQ. Nothing exotic. The point is that the integration is short because the API does not make you fight it.

Where to start

If you are evaluating QRIS options for a new product, start at temanqris.com and build a single test order. You will know within an hour whether it fits your stack. If it does, you can move on to the rest of your product instead of spending a week on payment glue.

For more context on the engineer behind the project, including his other work in blockchain infrastructure and cybersecurity, see the portfolio at riz.my.id.

Found this useful? Share it with someone planning a trip or building their own payment flow.

Back to the blog