> For the complete documentation index, see [llms.txt](https://docs.leanx.io/api-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.leanx.io/api-docs/cloud-payment/bill/create-bill.md).

# Create Bill

There are 2 ways when creating a bill. Both ways will generate a bill under a collection of your choice.

## Authentication

LeanX uses **Auth Token** to authenticate in each request's header.

{% hint style="info" %}
**Auth Token** can be retrieved in your portal dashboard under **API** page.
{% endhint %}

**Request Header**

{% code overflow="wrap" %}

```json
{
    "auth-token": "LP-0D7C06DE-MM|7394e58e-edee-4c42-9ca5-bcbc449f1b9f|2141df4a3cb633d5ce8683bb0c55067e5caebfbe07390dde277dc455bcc95c91723a81b5e565c7c02d68fb84e396722563016bf99e576a4b8cdbe4423fbf226b"
}
```

{% endcode %}

## Option 1 : Payment Page

This will create a bill and return a link to our LeanX Payment page.

HTTP Method: <mark style="color:yellow;">POST</mark>

```
https://api.leanx.dev/api/v1/merchant/create-bill-page
```

**Query**

| Query       | Type   | Description      |
| ----------- | ------ | ---------------- |
| invoice\_no | String | Your bill number |

**Request Body**

```json
{
    "collection_uuid": "CL-C0D7F54A90-LNP",
    "amount": 10.00,
    "redirect_url": "https://www.yourdomain.com/return-page",
    "callback_url": "https://www.yourdomain.com/api-callback-url",
    "full_name": "John Doe",
    "email": "johndoe@email.com",
    "phone_number": "0123456789",
}
```

**Attributes**

<table><thead><tr><th width="251">Property</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>collection_uuid<mark style="color:red;">*</mark></td><td>String</td><td>Your <a data-mention href="/pages/uBFnFoiRAhttK0FpKVke">/pages/uBFnFoiRAhttK0FpKVke</a> UUID</td></tr><tr><td>amount<mark style="color:red;">*</mark></td><td>Decimal (10,2)</td><td>Total amount to be paid in MYR</td></tr><tr><td>callback_url</td><td>String</td><td>Your callback URL</td></tr><tr><td>redirect_url<mark style="color:red;">*</mark></td><td>String</td><td>Your redirect URL</td></tr><tr><td>full_name<mark style="color:red;">*</mark></td><td>String</td><td>Name of the payer</td></tr><tr><td>email<mark style="color:red;">*</mark></td><td>String</td><td>Email of the payer</td></tr><tr><td>phone_number<mark style="color:red;">*</mark></td><td>String</td><td>Mobile number of the payer</td></tr></tbody></table>

**Response**

```json
{
    "response_code": 2000,
    "description": "SUCCESS",
    "app_version": "/api/v1",
    "talk_to_server_before": "2024-03-27T21:46:07.403797",
    "data": {
        "collection_uuid": "CL-AUTH-35775712FA-LNP",
        "redirect_url": "https://payment.leanx.dev/collection?id=CL-AUTH-35775712FA-LNP&fullname=puteri balqis&email=puteri.balqis@gmail.com&phone_number=0112459822&invoice_no=speedmart-87654432&description=test description&amount=119.0&redirect_url=aHR0cHMlM0EvL2xlYW5pcy5jb20ubXk=&callback_url=https%3A//api.leanx.dev/api/v1/callback-url/callback-redirect%3F_uuid%3D2f49c906-4a1f-4cb4-bf46-949f9f77a6ce%26order_id%3DNone",
        "old_redirect_url": "https://portal.leanx.dev/pay/collections/CL-AUTH-35775712FA-LNP?fullname=puteri balqis&email=puteri.balqis@gmail.com&phone_number=0112459822&invoice_no=speedmart-87654432&description=test description&amount=119.0&redirect_url=aHR0cHMlM0EvL2xlYW5pcy5jb20ubXk=&callback_url=https%3A//api.leanx.dev/api/v1/callback-url/callback-redirect%3F_uuid%3D2f49c906-4a1f-4cb4-bf46-949f9f77a6ce%26order_id%3DNone",
        "bill_no": "speedmart-87654432"
    },
    "breakdown_errors": "",
    "token": ""
}
```

## Option 2 : Without Payment Page

This will create a bill and return a link straight to the payment service that you chose through `payment_service_id.`

{% hint style="info" %}
Payment Service? Go to [Payment Service](/api-docs/cloud-payment/payment-service.md) to learn more about them and how to get their values.
{% endhint %}

HTTP Method: <mark style="color:yellow;">POST</mark>

```
https://api.leanx.dev/api/v1/merchant/create-bill-silent
```

**Request Body**

```json
{
    "collection_uuid": "CL-C0D7F54A90-LNP",
    "amount": 10.00,
    "redirect_url": "https://www.yourdomain.com/return-page",
    "callback_url": "https://www.yourdomain.com/api-callback-url",
    "full_name": "John Doe",
    "email": "johndoe@email.com",
    "phone_number": "0123456789",
    "payment_service_id": 33,
    "invoice_ref" : "INV202311280001"
}
```

**Request Attributes**

<table><thead><tr><th width="258">Property</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>collection_uuid<mark style="color:red;">*</mark></td><td>String</td><td>Your <a data-mention href="/pages/uBFnFoiRAhttK0FpKVke">/pages/uBFnFoiRAhttK0FpKVke</a> UUID</td></tr><tr><td>amount<mark style="color:red;">*</mark></td><td>Decimal (10,2)</td><td>Total amount to be paid in MYR</td></tr><tr><td>callback_url<mark style="color:red;">*</mark></td><td>String</td><td>Your callback URL</td></tr><tr><td>redirect_url</td><td>String</td><td>Your redirect URL</td></tr><tr><td>full_name<mark style="color:red;">*</mark></td><td>String</td><td>Name of the payer</td></tr><tr><td>email<mark style="color:red;">*</mark></td><td>String</td><td>Email of the payer</td></tr><tr><td>phone_number<mark style="color:red;">*</mark></td><td>String</td><td>Mobile number of the payer</td></tr><tr><td>payment_service_id<mark style="color:red;">*</mark></td><td>Number</td><td>The <a data-mention href="/pages/CYqn0lckkQ0xoe26WmsT">/pages/CYqn0lckkQ0xoe26WmsT</a> ID</td></tr><tr><td>invoice_ref<mark style="color:red;">*</mark></td><td>String</td><td>Merchant Invoice Reference</td></tr></tbody></table>

**Response**

```json
{
  "response_code": 2000,
  "description": "SUCCESS",
  "app_version": "/api/v1",
  "talk_to_server_before": "2023-01-31T14:28:30.842232",
  "data": {
    "bill_no": "EXAMPLE-BILL-001",
    "invoice_ref": "INV202311280001",
    "payment_url": "https://www.yourdomain.com/return-page",
    "metadata": {}
  }
}
```

**Response** **Attributes**

<table><thead><tr><th width="258">Property</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>bill_no</td><td>String</td><td>System generated bill number</td></tr><tr><td>invoice_ref</td><td>String</td><td>Merchant Invoice Reference</td></tr><tr><td>payment_url</td><td>String</td><td>URL where the customer completes payment</td></tr><tr><td>metadata</td><td>Object</td><td>QR code data. Empty for non-DuitNow QR payments.</td></tr></tbody></table>

### Duitnow QR Payment Integration

There is two integration flows that are supported:\
1\. Redirect the customer to the LeanX-hosted QR payment page using `payment_url`.\
2\. Build and host your own QR payment page using the QR information returned in `metadata.`

Using the same endpoint  and request body as other payment method.

{% hint style="info" %}
Duitnow QR `payment_service_id` must be provided in request body (example for duitnow QR: 114)\
For more details please refer to [Payment Service](/api-docs/cloud-payment/payment-service.md).
{% endhint %}

**Response**

```json
{
  "response_code": 2000,
  "description": "SUCCESS",
  "app_version": "/api/v1",
  "talk_to_server_before": "2023-01-31T14:28:30.842232",
  "data": {
    "bill_no": "EXAMPLE-BILL-001",
    "invoice_ref": "INV202311280001",
    "payment_url": "https://www.yourdomain.com/return-page",
    "metadata": {
      "qr_data": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAHvElEQVR42u3d0W3cQAwE0PSZ/utIWghicTiU3gD5Ose+k/bxAELL/fVHRF6fXy6BCOgiArqIgC4ioIsI6CICuoiALiKgi4AuIqCLCOgiArqIgC4ioIsI6CICugjoIgL6v/y239l/T7/fp19/+vr89Pen7+dPr//0+337+gYddNBBBx100EEHHXTQQR96o/8FLw257f2n70/6/aUL4fb6Bh100EEHHXTQQQcddNBBTy7kaXhP//2nC8l2YZq+f9fhtq9v0EEHHXTQQQcddNBBBx30pguRhpNeKG8rrNP/P32/QQcddNBBBx100EEHHXTQQc+93/TnT2+aaW9WTjdbNeNABx100EEHHXTQQQcd9C9Bv1ZI0oMWtjddbL+/tk0wbesbdNBBBx100EEHHXTQQQf9J290uxnkda9Pvm44JOheBx100L0OOuigex30ZujtaXuAY7qQpn9/cOGOfBG9eemDDjrooIMOOuiggw466N+Dvr1pov3Qvu3BEtuHJKYfWLo2qAJ00EEHHXTQQQcddNBBB725+bVdWN5WGNqblW3rbft6gw466KCDDjrooIMOOuigJy90evhg24ER25swtu93urC1NYtBBx100EEHHXTQQQcddNCT0NPD9NofYEk3+6490NI2HPJFwydBBx100EEHHXTQQQcd9A9CTzff2gZBpH/+2qaL9k030/cjCBt00EEHHXTQQQcddNBBB71u00Db+2s7pPBa8y/dHEw33157mirooIMOOuiggw466KCDXgl9e9jfdLY33bQ1L6c3nUyvx3Tz+TXNONBBBx100EEHHXTQQQe9Enpb8yk9+CFdSNKFYrvwtm9Smf48oIMOOuiggw466KCDDjromx/k+iaOaws9XejTD8C0PeBzphkHOuiggw466KCDDjrooJ+Avn2AQfuhhukDBKbvV9sDUNcKOeiggw466KCDDjrooIMOerIZ1wbx2nDBdCF5e3Nxe729tusOOuiggw466KCDDjrooJ9sxqVvRHuzrm3wxvYDR22DJhyyCDrooIMOOuiggw466KC/CXrbAx5tzcO24YtpuNPN1fZDEV/TjAMddNBBBx100EEHHXTQT0K/Nigh/fPbkNsPNWxrxtm9BjrooIMOOuiggw466KBfgt6+cJ8uVG2HIm4347avT/uhl8GADjrooIMOOuiggw466KCv38j0QfdPF55rEJ4u7G3Nyun7CzrooIMOOuiggw466KCDfgl6W/NqeyG3Xc/2L4LpQgo66KCDDjrooIMOOuigg94EfbuZsX0jtpuB282+9sEQbZtUXntSC+iggw466KCDDjrooIN+ohnXfqOmC1Vb8277+qa/GK5vWgIddNBBBx100EEHHXTQQX+ymZMuFNvDArcLz9sL7bXrt9icAx100EEHHXTQQQcddNA/CD3dvNje5JK+Xm3X79qwx/T1S38RgA466KCDDjrooIMOOuigby706Wbg2w5EmG62Tm+ymf5iaf8iAB100EEHHXTQQQcddNBBn4S8PZii/fMVL5xXrIftwvLaZhzooIMOOuiggw466KCDfrIZ19ac2m6uTTfDtpud6ebY9UIBOuiggw466KCDDjrooIO+2WxJL4RrhwpuF4625mT6kMW2LzbQQQcddNBBBx100EEHHfTmhd02eGH659MLMz3oY7vZ2vb7QQcddNBBBx100EEHHXTQm6BtL+R0M2b7QIZ02gvF9PUDHXTQQQcddNBBBx100EHfvHFthzI+XQjSD3SkP0/bAzZtheQzgydABx100EEHHXTQQQcd9JPNuOlC0NbsSxeW9P3bXg9pqO3NV9BBBx100EEHHXTQQQcd9GRzLN3Me1uzaXsT0fTCvvbATTCggw466KCDDjrooIMO+gehbxeCa82ka4cstg2rbN+EUnQ/QQcddNBBBx100EEHHXTQ482ZtgdKrg2/bB8Ust2s04wDHXTQQQcddNBBBx100C9Bb9t00LYJZnvYZfv9SzffrhUq0EEHHXTQQQcddNBBBx30SfjXhv89vZC3m33p4ZTT9+vaIYufnQILOuiggw466KCDDjrooK8047Y3eWwPn0x/3nQhbm+2pgv7ImTQQQcddNBBBx100EEHHfTHb1y6sEzf2O1mX3vzLN2cu/aAFuiggw466KCDDjrooIMOerRDEH5gI/0AT7o50z44on3QRfr9gA466KCDDjrooIMOOuigN0HfXujThae9cG5D3B4kMV0otgs/6KCDDjrooIMOOuigg/5t6NsL49oDI9uDKqabke2DQz50iCbooIMOOuiggw466KCDDnp9s+ltzbbtZtz19fPi9QU66KCDDjrooIMOOuiggz7efNq+UdcKU9smlulCs339PnOAA+iggw466KCDDjrooIMOesGmhmuHGk7/ve2F3lYoigI66KCDDjrooIMOOuigg17XjEsP2L82mCHdLLwGy6YW0EEHHXTQQQcddNBBB91+9NxCSR/al26WbTcT0+thuhAeKlyggw466KCDDjrooIMOOuj1wyHTMNPNonRzb7uZ1Q518YEa0EEHHXTQQQcddNBBB/2D0EWkMqCLgC4ioIsI6CICuoiALiKgiwjoIgK6COgiArqIgC4ioIsI6CICuoiALiKgi4AuIm/NX1dU3R7uVXoHAAAAAElFTkSuQmCC",
      "qr_type": "png"
    }
  }
}
```

**Response Attributes**

<table><thead><tr><th width="258">Property</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>bill_no</td><td>String</td><td>System generated bill number</td></tr><tr><td>invoice_ref</td><td>String</td><td>Merchant Invoice Reference</td></tr><tr><td>payment_url</td><td>String</td><td>URL where the customer completes payment</td></tr><tr><td>metadata</td><td>Object</td><td>QR code data. Empty for non-DuitNow QR payments.</td></tr><tr><td>metadata.qr_data</td><td>String</td><td>QR data returned according to <code>qr_type</code>.</td></tr><tr><td>metadata.qr_type</td><td>String</td><td>QR data format. Possible values are <code>emv</code> and <code>png</code>.</td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

#### Option 1: LeanX-Hosted DuitNow QR Page&#x20;

In the response, use the `payment_url` to redirect the user into our LeanX-Hosted DuitNow QR Payment page.

**Status Check:**\
QR payment status check is handled automatically by our payment page. When payment is received, our payment page will redirect the user into page that you send in `redirect_url`.

**Flow:**

<pre class="language-mermaid" data-expandable="true"><code class="lang-mermaid">flowchart TB
    A[LeanX API Response] --> B[Merchant use <a data-footnote-ref href="#user-content-fn-1">payment_url</a>]
    B --> C[Redirect to LeanX-Hosted &#x3C;br/> QR Payment page]
    C --> D[Customer scan QR and &#x3C;br/> make payment]
    D --> E[LeanX-Hosted handle &#x3C;br/> polling to check &#x3C;br/> payment status]
    E --> F[Payment Success and &#x3C;br/> LeanX-Hosted redirect &#x3C;br/> customer to merchant success page]
</code></pre>

#### Option 2: Self-Hosted DuitNow QR payment page.&#x20;

Use the raw QR Code metadata to display the payment QR directly, instead of redirecting to `payment_url`. The format varies by provider:

* **PNG** — a base64-encoded image. Render it as-is (e.g. `<img src="data:image/png;base64,...">`).
* **EMV** — a raw EMVCo QR string. Generate the QR code yourself using any QR library, then display it.

Check the format field in the metadata before rendering.

**Status Check:**\
To check whether the customer have completed the payment through QR Code, you can polling to our API <https://api.leanx.dev/api/v1/merchant/manual-checking-transaction> every 3 seconds, For more details, please refer to this section[Transaction Status](/api-docs/cloud-payment/transaction-status.md).

**Flow:**

{% code expandable="true" %}

```mermaid
flowchart TB
    A[LeanX API Response] --> B[Merchant use metadata]
    B --> C{Check QR Type?}
    C --> |EMV| D[Merchant use QR generation library <br/> to convert into <br/>visual QR Matrix]
    D --> E[Display QR Code]
    E --> F[Merchant API polling to <br/> API manual-checking-transaction <br/> every 3 seconds <br/> to check payment status]
    F --> G[Payment Success and <br/> merchant self-hosted payment page redirect <br/> customer to success payment page]
    C --> |PNG| E[Display QR Code]
```

{% endcode %}

#### **Details Implementation**

**QR Type EMV Response Example:**

```json
"metadata": {
        "qr_data": "00020201021226620014A0000006150001010689014502158000300000005020411603210720005204174053034585406234.005802MY5905Leanx6012Kuala Lumpur61055220062410302020505508110708000147079010016842428563040597",
        "qr_type": "emv"
}
```

**QR Type PNG Response Example:**

```json
"metadata": {
        "qr_data": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAH3UlEQVR42u3d0Y3kNhAE0MvT+cdhp+DDsLuK1CvgvnZvVqL6cYCGSP75V0Sezx9DIAK6iIAuIqCLCOgiArqIgC4ioIsI6CKgiwjoIgK6iIAuIqCLCOgiArqIgC4CuoiA/n8+7Z/df8dH4y//3t9ez/T9nh6v7evdrr8P1TfooIMOOuiggw466KCDDvo4xNNQpwd++vrTz2f7+rYnwnR9gw466KCDDjrooIMOOuigbxby6cKe/vu/Xu/057U9v+lmaHpiSdc36KCDDjrooIMOOuiggw5600Bsw9kulNcm1raJ4PbxBh100EEHHXTQQQcddNBBv3kg2iBPL2qZXnTR3lxtb1aCDjrooIMOOuiggw466KBvQk/DbIN4unmVLuT056fHp9gP6KCDDjrooIMOOuiggw56vBnk537e9EVgF1jQ/Rx00EH3c9BBV4h+Dvom9PakF7GkN86Y/vztAzdO39/LpQ866KCDDjrooIMOOuigfw96etFE+wEP6Y0l0ockbr+wtP0C0fQXB+iggw466KCDDjrooIMO+ubAbE8s04XRNjG0Nyvb6i893qCDDjrooIMOOuiggw466JMDPd0ce/33Tze3tmGlN5dsaxaDDjrooIMOOuiggw466KBvQi+60ZGJKQ2rbfPK7UUwt//+YnMOdNBBBx100EEHHXTQQf8g9F8Lo72w2grntkUXt20Wmv480EEHHXTQQQcddNBBBx30ZHOr/QWL6fvdvp7bmn/piXG6+fbsaaqggw466KCDDjrooIMOekUzbroZE2xuHHlw7Ysobts8cnt8Tj/Pa7vuoIMOOuiggw466KCDDvoT0NPNlYs24B8p3O0DH9rrqe35gg466KCDDjrooIMOOuigNxXidLPm4gdXWbjti5javnhsDgk66KCDDjrooIMOOuigv9yM215k0H6AwPT4tr3g1Pb3ipp9oIMOOuiggw466KCDDjrodRDTzavt691uhrY3F9OHgD7bjAMddNBBBx100EEHHXTQK6G3HUqXPgAivbnldjOrvTmVbm4G7x900EEHHXTQQQcddNBBB30cQvqFltuaY9sTy/Shim0vGLVNbKCDDjrooIMOOuiggw466M2bCZ4u/LYXdtL3c9vGEK83H0EHHXTQQQcddNBBBx30b0M/Xejp5l26udhe6NPPL32/2/8fdNBBBx100EEHHXTQQQd9EvZ2M6d9UUT6BZR08266+Tj9/NL1BzrooIMOOuiggw466KCDfhL66cLdXvSQfgEmPX63fxFs1yPooIMOOuiggw466KCDDnoT9LaNDsZHc7gQ2j7/9kUt0/V3+vdBBx100EEHHXTQQQcddNAnmy3pB9V+AENbobcdILG9+adDFkEHHXTQQQcddNBBBx30lw9wSDfjblvkkG4mpSeC28cv2JwDHXTQQQcddNBBBx100D8Ifbt5kd5ccXu82sYv/Xzb62/7iwB00EEHHXTQQQcddNBBBz1Z6NPNwK8diDA9sWz//e1m8Wc2ngAddNBBBx100EEHHXTQn4CefjC3HfDQ/gLK9ni1fdFc9HxBBx100EEHHXTQQQcd9A9CT2+Olz50MA0jvXlkunmanlhsDgk66KCDDjrooIMOOuigNzfj0ocetr/Q0t48bNsIJH3I4nY9gA466KCDDjrooIMOOuigTxbOdjOjrRl3+2aU2xtD/Doe2/WZ3hwVdNBBBx100EEHHXTQQQd9slm23Szabs69dn/p5uX2eFzUrAMddNBBBx100EEHHXTQPwj918JuH/i2F3C2N7pIT0ztzbH05pmggw466KCDDjrooIMOOui/DOz2Cy/pgW/fTPC2RS233f9nuu6ggw466KCDDjrooIMOeiX07YFpa+ZMT4Tt97O9KCi9COczhyyCDjrooIMOOuiggw466FdAT08Et28U0X7IYrpZ2Zb0xiCggw466KCDDjrooIMOOuibAzPd7Npupm03v9r+3TZRtR+6CTrooIMOOuiggw466KCDvjmQbZsnnn7hIv1Czunn1/a82xfRgA466KCDDjrooIMOOuigbzbjtpsZ7RsXtB2ymJ6ovn7I4md2gQUddNBBBx100EEHHXTQK5px6UUe6Y0Ptu93uhmZbs5uNw/T4wc66KCDDjrooIMOOuigg56Ef3vhphfVpCfOtt+ffsHp9PVcc4AD6KCDDjrooIMOOuigg34l9O1mzfTmkdvNqdsmAteX3ZgEdNBBBx100EEHHXTQQQe9KW2H/rVPnNuFnn4BKr2RyfbEDzrooIMOOuiggw466KB/G3q6MNoOvbv9hY7tQk5v/vjwIZqggw466KCDDjrooIMOOujxZtPtG/Bv32/bCyvpiXf7eV3zwgzooIMOOuiggw466KCD/gT09KKUdLNse2JoXySSbp5tN5OD9QE66KCDDjrooIMOOuiggx6Hnr6e7Yloe6I4Pf7pie7h5i/ooIMOOuiggw466KCDDnpdMy69UULbxgxtGy3c1uycnmhABx100EEHHXTQQQcddNAnB2J7oH+FeBrK9qKTbajpemhrJhaNF+iggw466KCDDjrooIMOet2hdWmY282i9IEJ283ati+OdD2ADjrooIMOOuiggw466N+GLiKVAV0EdBEBXURAFxHQRQR0EQFdREAXEdBFQBcR0EUEdBEBXURAFxHQRQR0EQFdBHQReTX/AR3KqL5RXzNLAAAAAElFTkSuQmCC",
        "qr_type": "png"
    }
```

**Code Implementation Example:**

```javascript
import { QRCodeSVG } from "qrcode.react";

function PaymentQR({ qrData, qrType }) {
  if (qrType === "emv") {
    return <QRCodeSVG value={qrData} size={256} level="M" />;
  }
  if (qrType === "png") {
    const src = qrData.startsWith("data:")
      ? qrData
      : `data:image/png;base64,${qrData}`;
    return <img src={src} alt="DuitNow QR" width={256} height={256} />;
  }
  return null;
}
```

{% hint style="info" %}
Make sure to follow all the DuitNow QR guidelines. For more details, you can refer to this official DuitNow documents[https://drive.google.com/file/d/16zu1efl7gI2vv\_FExx8EoBVNHraAOkLk/view?usp=drive\_link](https://drive.google.com/file/d/16zu1efl7gI2vv_FExx8EoBVNHraAOkLk/view?usp=drive_link "mention").
{% endhint %}

[^1]:
