UnitPay
  • Products
  • Pricing
  • Docs
  • Help
  • About
  • Security
  • Legal
|
Demo Get a quote

Developer documentation

Create a payment via API

Last updated: 07 May 2026

Contents

    The initPayment method initiates a payment from your server. Pass the payment intent (project, amount, currency, customer reference, description) to UnitPay; UnitPay returns a hosted payment URL that you redirect the customer to. After the customer completes the payment, UnitPay notifies your callback handler — see Callback handler.

    Endpoint

    Send a request to https://api.unitpay.net/api. The request body uses query-string-style parameters under params[...]. Both GET and POST are accepted; production traffic should use POST over TLS.

    Required parameters

    ParameterTypeDescription
    methodstringAlways initPayment.
    params[paymentType]stringPayment-method code: card, qris, va, or another method enabled on your project. Contact onboarding to see the codes available to you.
    params[projectId]integerYour project ID, visible in the merchant cabinet under Settings → Project.
    params[sum]numberPayment amount in major currency units (for example, 150000.00 for IDR 150,000 or 10.00 for USD 10). Two decimal places maximum.
    params[account]stringCustomer or order identifier in your system. Returned unchanged in callbacks so you can match the result to the original order.
    params[desc]stringHuman-readable order description shown to the customer on the payment form and on the receipt.

    Optional parameters

    ParameterTypeDescription
    params[currency]stringISO 4217 currency code: IDR, USD, or EUR. Defaults to the project's primary currency.
    params[locale]stringPayment-form language: en or id. Auto-detected from the customer's Accept-Language header when omitted.
    params[backUrl]stringURL the customer is sent to if they abandon the payment. Must use a domain registered to your project.
    params[resultUrl]stringURL the customer is sent to after a successful payment. URL-encode any query string.
    params[customerEmail]stringCustomer email used for the receipt.
    params[signature]stringRequest signature. Required when "API request signing" is enabled on the project. See Signing the request below.

    Signing the request

    UnitPay signs requests with HMAC-SHA-256 using your project secret key. Reuse the same algorithm you use to verify incoming callbacks (see Callback handler — signature verification):

    1. Take all params[*] values except params[signature] and sort them by parameter name.
    2. Concatenate the values, separated by the literal four-character delimiter {up}, in this order: method, then each sorted parameter value, then your project secret key.
    3. Hash the resulting string with SHA-256 and lowercase the hex digest.
    4. Pass the digest as params[signature].

    Never embed the secret key in client-side code or log it. Rotate it from Settings → Project → Secret key if you suspect compromise.

    Example request

    POST https://api.unitpay.net/api
    Content-Type: application/x-www-form-urlencoded
    
    method=initPayment
    &params[paymentType]=card
    &params[projectId]=123456
    &params[sum]=150000.00
    &params[currency]=IDR
    &params[account]=order-9821
    &params[desc]=Order%20%239821
    &params[locale]=en
    &params[signature]=<sha256-hex-digest>

    Successful response

    UnitPay replies with HTTP 200 and a JSON body that includes the hosted payment URL. Redirect the customer's browser to redirectUrl.

    {
      "result": {
        "type": "redirect",
        "paymentId": 1231231234,
        "message": "Payment created.",
        "receiptUrl": "https://pay.unitpay.net/receipt/1231231234-12d1fae123",
        "statusUrl": "https://pay.unitpay.net/receipt/1231231234-12d1fae123",
        "redirectUrl": "https://pay.unitpay.net/123456-1fc2f/card?..."
      }
    }
    FieldDescription
    typeredirect — redirect the customer to redirectUrl; response — the message field is final, display it to the customer; invoice — an invoice was emailed to the customer, no further action required.
    paymentIdUnitPay's unique payment identifier. Store it alongside your account reference so you can correlate callbacks and refunds.
    redirectUrlHosted payment URL. Valid until the payment expires (15 minutes by default).
    receiptUrlHosted receipt URL the customer can revisit later.

    Error response

    {
      "error": {
        "message": "Invalid signature.",
        "code": -32010
      }
    }

    Treat any response that contains an error object as a hard failure: do not retry blindly. Common causes are an incorrect projectId, a signature mismatch, an unsupported currency, or a payment-method code that is not enabled for your project.

    Test mode

    Every project has a separate test secret key and a test toggle in the merchant cabinet. Test-mode payments use the same endpoint and parameters but never move real funds, and the callback handler receives params[test]=1 for those transactions. Switch to test mode while you implement and verify your integration end-to-end before enabling live payments.

    Next steps

    • Generate a payment link — share a hosted payment URL without writing server-side code.
    • Callback handler — verify signatures and confirm the result on your server.
    • Refund a payment — issue a full or partial refund from your server.

    Metode initPayment memulai pembayaran dari server Anda. Kirimkan data pembayaran (proyek, jumlah, mata uang, referensi pelanggan, deskripsi) ke UnitPay; UnitPay akan mengembalikan URL pembayaran terhosting yang dapat Anda gunakan untuk mengarahkan pelanggan. Setelah pelanggan menyelesaikan pembayaran, UnitPay akan memberi tahu callback handler Anda — lihat Penanganan callback.

    Endpoint

    Kirim permintaan ke https://api.unitpay.net/api. Body permintaan menggunakan parameter bergaya query-string di bawah params[...]. Baik GET maupun POST diterima; trafik produksi sebaiknya menggunakan POST melalui TLS.

    Parameter wajib

    ParameterTipeDeskripsi
    methodstringSelalu initPayment.
    params[paymentType]stringKode metode pembayaran: card, qris, va, atau metode lain yang aktif pada proyek Anda. Hubungi tim onboarding untuk mengetahui kode yang tersedia.
    params[projectId]integerID proyek Anda, terlihat di kabinet merchant pada Pengaturan → Proyek.
    params[sum]numberJumlah pembayaran dalam satuan mata uang utama (misalnya 150000.00 untuk IDR 150.000 atau 10.00 untuk USD 10). Maksimum dua angka desimal.
    params[account]stringIdentifikasi pelanggan atau pesanan dalam sistem Anda. Dikembalikan tanpa perubahan pada callback agar Anda dapat mencocokkan hasilnya dengan pesanan asli.
    params[desc]stringDeskripsi pesanan yang dapat dibaca pelanggan, ditampilkan pada formulir pembayaran dan kuitansi.

    Parameter opsional

    ParameterTipeDeskripsi
    params[currency]stringKode mata uang ISO 4217: IDR, USD, atau EUR. Default mengikuti mata uang utama proyek.
    params[locale]stringBahasa formulir pembayaran: en atau id. Otomatis dideteksi dari header Accept-Language pelanggan jika dihilangkan.
    params[backUrl]stringURL tujuan jika pelanggan membatalkan pembayaran. Harus menggunakan domain yang terdaftar pada proyek Anda.
    params[resultUrl]stringURL tujuan setelah pembayaran berhasil. Lakukan URL-encode untuk semua query string.
    params[customerEmail]stringEmail pelanggan yang digunakan untuk kuitansi.
    params[signature]stringTanda tangan permintaan. Wajib jika "Penandatanganan permintaan API" diaktifkan pada proyek. Lihat Menandatangani permintaan di bawah.

    Menandatangani permintaan

    UnitPay menandatangani permintaan dengan HMAC-SHA-256 menggunakan kunci rahasia proyek Anda. Gunakan algoritma yang sama untuk memverifikasi callback masuk (lihat Penanganan callback — verifikasi tanda tangan):

    1. Ambil semua nilai params[*] kecuali params[signature] dan urutkan berdasarkan nama parameter.
    2. Gabungkan nilai-nilai tersebut dengan pemisah literal empat karakter {up}, dalam urutan: method, lalu setiap nilai parameter terurut, lalu kunci rahasia proyek Anda.
    3. Hash string yang dihasilkan dengan SHA-256 dan ubah hex digest menjadi huruf kecil.
    4. Sertakan digest sebagai params[signature].

    Jangan pernah menyertakan kunci rahasia di kode sisi klien atau dalam log. Lakukan rotasi melalui Pengaturan → Proyek → Kunci rahasia jika Anda mencurigai kebocoran.

    Contoh permintaan

    POST https://api.unitpay.net/api
    Content-Type: application/x-www-form-urlencoded
    
    method=initPayment
    &params[paymentType]=card
    &params[projectId]=123456
    &params[sum]=150000.00
    &params[currency]=IDR
    &params[account]=order-9821
    &params[desc]=Order%20%239821
    &params[locale]=en
    &params[signature]=<sha256-hex-digest>

    Respons sukses

    UnitPay membalas dengan HTTP 200 dan body JSON yang berisi URL pembayaran terhosting. Arahkan browser pelanggan ke redirectUrl.

    {
      "result": {
        "type": "redirect",
        "paymentId": 1231231234,
        "message": "Payment created.",
        "receiptUrl": "https://pay.unitpay.net/receipt/1231231234-12d1fae123",
        "statusUrl": "https://pay.unitpay.net/receipt/1231231234-12d1fae123",
        "redirectUrl": "https://pay.unitpay.net/123456-1fc2f/card?..."
      }
    }
    FieldDeskripsi
    typeredirect — arahkan pelanggan ke redirectUrl; response — field message bersifat final, tampilkan ke pelanggan; invoice — faktur telah dikirim via email ke pelanggan, tidak diperlukan tindakan tambahan.
    paymentIdIdentifikasi unik pembayaran di UnitPay. Simpan bersama referensi account Anda agar dapat mengaitkan callback dan pengembalian dana.
    redirectUrlURL pembayaran terhosting. Berlaku hingga pembayaran kedaluwarsa (default 15 menit).
    receiptUrlURL kuitansi terhosting yang dapat diakses kembali oleh pelanggan.

    Respons error

    {
      "error": {
        "message": "Invalid signature.",
        "code": -32010
      }
    }

    Anggap respons apa pun yang mengandung objek error sebagai kegagalan keras: jangan mencoba ulang tanpa pemeriksaan. Penyebab umum adalah projectId yang salah, ketidakcocokan tanda tangan, mata uang yang tidak didukung, atau kode metode pembayaran yang belum diaktifkan untuk proyek Anda.

    Mode pengujian

    Setiap proyek memiliki kunci rahasia uji coba terpisah dan tombol pengaturan mode uji di kabinet merchant. Pembayaran mode uji menggunakan endpoint dan parameter yang sama tetapi tidak memindahkan dana sungguhan, dan callback handler akan menerima params[test]=1 untuk transaksi tersebut. Gunakan mode uji selama Anda mengimplementasikan dan memverifikasi integrasi secara menyeluruh sebelum mengaktifkan pembayaran live.

    Langkah selanjutnya

    • Membuat tautan pembayaran — bagikan URL pembayaran terhosting tanpa menulis kode sisi server.
    • Penanganan callback — verifikasi tanda tangan dan konfirmasi hasil pada server Anda.
    • Pengembalian dana pembayaran — lakukan pengembalian penuh atau sebagian dari server Anda.

    Related documentation

    • Generate a payment link Membuat tautan pembayaran
    • Callback handler Penanganan callback
    • Refund a payment Pengembalian dana pembayaran

    Company

    • About
    • Security
    • Contact

    Products

    • Online Payments
    • Payouts (USDT)
    • Pricing
    • Docs
    • Help

    Support

    • support@unitpay.net
    • sales@unitpay.net
    • compliance@unitpay.net
    • legal@unitpay.net

    WhatsApp

    +6285121084571

    Mon-Fri 09:00-18:00 WIB

    Legal

    • Privacy Policy
    • Cookie Policy
    • Terms of Service
    • Acceptable Use Policy
    • AML/CFT Statement
    • Legal Center

    Tidak puas? / Not satisfied?

    • Hubungi OJK / Contact OJK: 157 (24 jam) / (24h)
    • LAPS SJK: https://lapssjk.id
    • Email keluhan / Complaint email: complaints@unitpay.net
    • Didit
    • Didit
    • Amazon Web Services (Asia Pacific - Jakarta)
    • Iubenda
    |
    Sitemap

    (c) 2026 PT UNIT GLOBAL SYSTEM. All rights reserved. NPWP: 22.709.627.8-021.000 · NIB: 2511240128903