Official Links

Get to know Lyzi

FAQ

Most asked questions

API DOCUMENTATION

Lyzi Roles

Whitepaper

Introduction

Regulations & Compliance

Roadmap

Disclaimer

Resources

Introduction

To accept a cryptocurrency payment using Lyzi, two methods are available:

A. Link the payment to a “Payment Button”

B. Link the payment to a collector / salespoint.

The philosophy of those two methods is to use:

A. Payment Button for online payments, in e-commerce websites, whereas

B. ”Payment link” is more meant to be used for a in-store payment.

That being said, there is no strict limitation about using one or the other.

A. Payment Button B. Collector payment
Ideal for eShop payments Payment link for a salespoint
Requires: A payment button
(from the API) One salespoint and one collector are configured

Preliminary

To integrate Lyzi payment - in store or online - a “manager” account shall be created and approved by our compliance team (KYB process). Once this process is completed, the manager has full access to his backoffice, under https://admin.lyzi.io/. In there, the manager can create buy buttons, payment links, configure his salespoint, payment collectors and option cashier accounts.

<aside> 💡

For testing purposes, a sandbox environment is also available and can be explored under https://admin-dev.lyzi.io/. Here are shared credentials to test the integration:

User : [email protected]

Pass: Lyzi123,

</aside>

Security

The following authorizations must be added in the header of the requests to Lyzi API:

 'x-api-key': apiKey,
 'x-api-secret': apiSecret,

The key and the secret can be found in the backoffice, in the “developer” section.

A. Buy button

As mentioned in the introduction, this approach is recommended for integration in online stores or applications.

1. Create the buy button

Before integrating the Lyzi payment solution on your website or application, you shall create a “Payment Button” from your backoffice.

First, make sure that your account has been created and that the KYB is done and confirmed. If you don’t have an account, go to https://admin.lyzi.io/onboarding and complete all the information of your profile.

Then, let’s create a payment button. Go to the backoffice and find the buy button section:

Capture d'écran 2024-12-19 081441.png

Fill the information of the button, and create it.

Capture d'écran 2024-12-19 081455.png

As annoted in the picture, here are the information about the button:

  1. Name : The name of the button for you to organize the created buttons. This is not published to the consumer.
  2. Website URL : the website URL shown in the payment gate, to indicate to the consumer what website he is performing the payment for.
  3. Webhook URL : The website for the redirection of the user after the payment (successfull or failed)
  4. Name of the product : The name of the product that is being purchased. This is displayed in the payment gate to the consumer.

<aside> 💡

Note that most of this information can be and will be edited during the payment initialization, when doing the integration in your application.

</aside>

Once created, you can select the button that has been created and click on “Display” :

Capture d'écran 2024-12-19 081510.png

Capture d'écran 2024-12-19 081519.png

2. Initiate the payment

In your application, we are going to use the buy button created in the previous section, customize its parameters and initiate the payment.

The simplest way to initiate a payment, based on this buy button, is to build the following URL, with the appropriate parameters :

// This is the base URL for the payment using the button
const url = new URL("<https://pay.lyzi.io/buy-button/landing>");

// Set the query parameters
// - The ID of the button that has been created in the previous section
url.searchParams.append('id', buttonId;
// - The price of the payment to perform, as a string
url.searchParams.append('price', amount.toString());
// - The currency of the payment to perform, as a string. Only EUR, CHF and XPF are currently supported (as of 2025 Jan 1st)
url.searchParams.append('currency', "EUR");
// - The callback URL where the payment confirmation request will be POST'ed
url.searchParams.append('callbackUrl', callbackUrl);
// - The return URL, where the use will be redirected when the payment is completed and successfull
url.searchParams.append('returnUrl', returnUrl)
// - The return URL, where the use will be redirected when the payment is failed
url.searchParams.append('cancelUrl', cancelUrl)

// User can now be redirected to this URL, or a QR code can be built and shown to the user
router.push(url.toString())
// This will take the customer to the Lyzi Payment gate for him to perform the payment in cryptocurrencies

And voilà 💫 Just by a couple of lines, the payment url can be built and the user can be redirected to the payment gate to complete the payment.

Alternatively, the SDK can also be used to have more coding tool to intiate the payment:

B. Direct payment

Preliminary

The direct payment is used to link a payment to a collector, which is related to a salespoint. Before initiating the payment, the ID of the collector must be found.

Make sure that a collector has been created. Using the API or the backoffice :

Collector creation using the backoffice

image.png

image.png

Collector creation using the API:

Collector ID

Once the collector is created, retrieve its ID :

<https://api-dev.lyzi.fr/api/next/collectors/list>

The ID in the response of this request shall be used in the field merchantIdentifier for of the request of the payment below.

Request command:

To initialize a payment using cryptocurrencies, the endpoint request shall be called:

<https://api-dev.lyzi.fr/api/confirm_conversion/request>

Request body :

{
        amount: Joi.required(),
        fromAsset: Joi.string().valid('EUR', 'CHF', 'XPF').insensitive().required(),
        toAsset: Joi.string().valid('USDT', 'USDC', 'EUR').insensitive().required(),
        webhookUrl: Joi.string().allow(null, ''),
        cancelUrl: Joi.string().allow(null, '').max(256),
        returnUrl: Joi.string().allow(null, '').max(256),
        merchantIdentifier: Joi.string().allow(null, ''),
        anonymous: Joi.boolean(),
        goods: Joi.object({
          goodsName: Joi.string(),
          goodsType: Joi.string().valid('01', '02'),
          goodsCategory: Joi.string().valid('0000', '1000', '2000', '3000', '4000', '5000', '6000', '7000', '8000', '9000', 'A000', 'B000', 'C000', 'D000', 'E000', 'F000', 'Z000'),
          goodsDetail: Joi.string().max(256).allow('', null),
          goodsQuantity: Joi.string().max(256).allow('', null)
        }),
        kycInfo: Joi.object({
          hash: Joi.string().required(),  // The HMAC hash, for security
          origin: Joi.string().required(),  // The origin name (fundora)
          id: Joi.string().required(),  // The session/KYC ID
          status: Joi.string().required(), // "approved" ? :) 
          firstName: Joi.string().required(),
          lastName: Joi.string().required(),
          nidPdfUrl: Joi.string().required(),  // The url where to download the file
          poaPdfUrl: Joi.string().required(),  // The url where to download the file
          kycReportUrl: Joi.string().required(),  // The url where to download the file
          fundOriginPdfUrl: Joi.string().required(),  // The url where to download the file
          approvedAt: Joi.string().required(), // Approval date
          rawData: Joi.object() // any data that can be useful
        })
      }

And voilà 💫 Just by a couple of lines, the payment url (paymentUrl from the response) can be retrieved and the user can be redirected to the payment gate to complete the payment.