# Changelog

## September 2026

### 10 September

**Formulir HTML kini mengirim kontainer yang ditandatangani.** Menggantikan field tagihan yang terpisah—`data` (base64url dari JSON) dan `signature` (HMAC-SHA256 dari string `data`). Endpoint berubah dari `invoices/createFromForm` menjadi `invoices/form`. Formulir lama tidak lagi bekerja dan harus dibangun ulang: lihat [Tanda tangan formulir HTML](./creating-invoices/html-forms/form-signature.md).

### 8 September

**Field numerik di isi webhook kini berupa angka.** Enam field yang dulu dikirim sebagai string kini dikirim sebagai angka: `project.commissionRate`, `invoice.commissionFiatUSD`, `invoice.amountFiatUSD`, `invoice.amountFiat`, `invoice.calcAmountFiat`, `payment.amount`. Susunan field, namanya, dan urutannya tidak berubah.

Perlu diingat: nol di belakang dibuang, sehingga jumlah 10.00 tiba sebagai 10. Jumlah di bawah 0.0001 tiba dalam notasi eksponensial, misalnya 1.0e-6—penguraian JSON standar mengembalikan angka yang benar; hanya penguraian string manual yang rusak.

Notifikasi yang dibentuk sebelum peluncuran dan belum terkirim tiba dalam format lama. Penerima harus menerima kedua varian sampai antreannya habis—ini memakan waktu tidak lebih dari dua hari.

### 6 September

**Field numerik di respons API kini berupa angka.** Berlaku untuk `invoices/list`, `payments/list`, dan `invoices/create`.

| Field               | Sebelum          | Sesudah |
| ------------------- | ---------------- | ------ |
| `commissionFiatUSD` | `"0.10"`         | `0.1`  |
| `amountFiatUSD`     | `"10.00"`        | `10`   |
| `amountFiat`        | `"1000.00"`      | `1000` |
| `views`             | `"0"`            | `0`    |
| `payment.amount`    | `"10.500000000"` | `10.5` |

**Kunci yang dibatasi pada proyek kini menerapkan pembatasan di semua metode.** Sebelumnya, sebagian metode mengabaikan proyek. Kini pembatasan menjadi filter di metode daftar, dan permintaan atas tagihan atau dompet proyek lain ditolak dengan `Restricted project`. Metode yang tidak dapat menghormati pembatasan proyek ditutup untuk kunci semacam itu. Rinciannya ada di bagian “Cakupan kunci”.

**Daftar pembayaran kini mengembalikan pembayaran tak tercocokkan.** Sebelumnya, `payments/list` hanya mengembalikan pembayaran yang terikat pada tagihan. Kini hasilnya memuat semua pembayaran di seluruh dompet Anda; yang tak tercocokkan tidak memiliki blok `invoice`. Pembayaran inilah yang diperlukan untuk pencocokan manual lewat `invoices/bindPayment`.

**Pembatalan tagihan kini membedakan alasan penolakan.** Sebelumnya, tagihan yang tidak ada maupun syarat yang tidak terpenuhi sama-sama mengembalikan `Invoice not found` yang umum. Kini `Invoice not found` hanya berarti tagihannya tidak ada, sedangkan syarat yang tidak terpenuhi mengembalikan `Invoice cannot be canceled`.

**Identifikasi yang salah bentuk kini ditolak.** `invoices/list` memvalidasi `invoiceId`, `invoiceUid`, dan `projectId`; `payments/list`—`walletId` dan `invoiceId`. Nilai yang tidak sesuai mengembalikan `Parameter is filled in incorrectly` beserta nama field-nya. Sebelumnya, parameter semacam itu dibuang diam-diam dan hasilnya kembali tanpa filter.

**Batas periode kini mencakup seluruh hari yang disebut.** `startDate` dan `endDate` ditafsirkan dari `00:00:00` sampai `23:59:59`. Sebelumnya, hari akhir terpotong seluruhnya, dan kueri satu hari hanya mengembalikan rekaman yang dibuat tepat tengah malam. Berlaku untuk `invoices/list`, `payments/list`, `statistics/invoices`, dan `statistics/payments`.

**Field proyek ditambahkan ke riwayat saldo.** Setiap operasi di metode `billing/history` kini membawa field `projectId`. Untuk operasi tingkat akun—pengisian saldo dan bonus—nilainya `null`.

### 4 September

**Deskripsi dan data layanan kembali dalam bentuk aslinya.** Field `description` dan `serviceData` dulu disimpan terenkode, dan di respons API tanda kutip tiba sebagai `&quot;` dan tanda lebih kecil sebagai `<`. Kini yang dikembalikan persis seperti yang dikirim merchant. Saat merender dalam HTML, lakukan escape di sisi Anda.

**Formulir HTML hanya menerima POST.** Membuat tagihan dengan mengikuti tautan berparameter di bilah alamat tidak lagi bekerja—parameter hanya dibaca dari isi permintaan. Jika Anda memakai tautan, ganti dengan formulir dengan `method="post"`.

### 3 September

**Notifikasi webhook kini ditandatangani.** Header `X-Timestamp` dan `X-Signature` ditambahkan; tanda tangan dihitung dengan HMAC-SHA256 memakai kunci rahasia webhook. Memverifikasi tanda tangan memungkinkan Anda membedakan notifikasi asli dari palsu. Mekanisme dan contohnya ada di bagian “Verifikasi tanda tangan webhook”.

Perubahan ini kompatibel mundur: jika Anda tidak menambahkan pemeriksaan, penangan Anda tetap bekerja seperti sebelumnya.
