PaymentKit's credit-based billing system allows customers to replenish their credit balance through top-ups. You can configure a credit currency to be rechargeable, enabling both manual one-time top-ups and automatic recharges when the balance falls below a set threshold.
This guide will walk you through the process of programmatically setting up a credit currency for top-ups. The actual auto-recharge settings for a customer (e.g., the low-balance threshold and recharge amount) are managed directly by the customer through the Payment Kit billing portal, ensuring a seamless user experience.
Top-Up Workflow Overview
Before diving into the implementation, it's helpful to understand the entire top-up process from the user's perspective. When a credit currency is configured for recharge, a checkout link is generated. Your application redirects the user to this link to complete the payment, and PaymentKit automatically handles granting the credits upon success.

Step 1: Create a Top-Up Package
A top-up package is a standard Product and Price that defines how many credits a customer receives and how much they pay. The key is to embed a credit_config object in the product's metadata.
First, create a product that represents the credit pack. The metadata should specify which credit currency this product replenishes and the amount of credits granted upon purchase.
Create a Product for the Top-Up Package
const topUpProduct = await payment.products.create({
name: '1000 Credits Pack',
description: 'Top up your account with 1000 credits.',
type: 'service',
metadata: {
// This product grants credits when purchased
credit_config: {
currency_id: 'pc_credit_xxxxxx', // The ID of your credit currency
amount: '1000', // Amount of credits to grant
},
},
});Next, create a one-time price for this product. This price will determine the cost and the payment currency (e.g., USDT, ETH) for the top-up.
Create a Price for the Top-Up Package
const topUpPrice = await payment.prices.create({
product_id: topUpProduct.id,
type: 'one_time',
unit_amount: '10', // e.g., 10 USDT
currency_id: 'pc_usdt_xxxxxx', // The currency used to pay for the credits
});Step 2: Configure the Credit Currency
Once you have a price for your top-up package, you need to link it to your credit currency. This is done using the updateRechargeConfig method, which designates your new price as the base package for recharges.
updateRechargeConfig(id, data)
This method associates a base_price_id with a credit currency, enabling it for top-ups.
Parameters
| Name | Type | Description |
|---|---|---|
id | string | Required. The ID of the credit currency to configure (e.g., pc_credit_xxxxxx). |
data.base_price_id | string | Required. The ID of the Price object that serves as the top-up package. |
Example
Configure a Credit Currency for Recharge
import payment from '@blocklet/payment-js';
async function configureRecharge() {
try {
const creditCurrencyId = 'pc_credit_xxxxxx'; // Your credit currency ID
const topUpPriceId = 'price_yyyyyyyy'; // The price ID from Step 1
const updatedCurrency = await payment.paymentCurrencies.updateRechargeConfig(
creditCurrencyId,
{
base_price_id: topUpPriceId,
}
);
console.log('Recharge config updated:', updatedCurrency.recharge_config);
} catch (error) {
console.error('Error configuring recharge:', error.message);
}
}
configureRecharge();Example Response
{
"currency_id": "pc_credit_xxxxxx",
"recharge_config": {
"base_price_id": "price_yyyyyyyy"
},
"message": "Recharge config updated successfully"
}Step 3: Retrieve the Recharge Configuration
To initiate a top-up, your application needs to fetch the payment_url. Use the getRechargeConfig method to retrieve the full recharge configuration, including the checkout URL and details about the base price.
getRechargeConfig(id)
Fetches the recharge configuration for a specified credit currency.
Parameters
| Name | Type | Description |
|---|---|---|
id | string | Required. The ID of the credit currency. |
Returns
Returns an object containing the currency information and its recharge_config. The payment_url within the configuration is the link you'll use to direct users to the checkout page.
Example
Get the Top-Up URL
import payment from '@blocklet/payment-js';
async function getTopUpLink(creditCurrencyId) {
try {
const config = await payment.paymentCurrencies.getRechargeConfig(creditCurrencyId);
if (config.recharge_config && config.recharge_config.payment_url) {
console.log('Redirect user to this URL:', config.recharge_config.payment_url);
return config.recharge_config.payment_url;
} else {
console.log('Recharge is not configured for this currency.');
return null;
}
} catch (error) {
console.error('Error fetching recharge config:', error.message);
}
}
getTopUpLink('pc_credit_xxxxxx');Example Response
{
"currency_id": "pc_credit_xxxxxx",
"currency_info": {
"id": "pc_credit_xxxxxx",
"name": "App Credits",
"symbol": "CRD",
"decimal": 2,
"type": "credit"
},
"recharge_config": {
"base_price_id": "price_yyyyyyyy",
"basePrice": {
"id": "price_yyyyyyyy",
"unit_amount": "1000",
"currency_id": "pc_usdt_xxxxxx",
// ... other price details
"product": {
"id": "prod_zzzzzzzz",
"name": "1000 Credits Pack",
// ... other product details
}
},
"payment_url": "https://payment.arcblock.io/checkout/pay/pl_xxxxxxxx"
}
}With these steps complete, your credit currency is now fully enabled for top-ups. Your application can fetch the payment URL and provide a seamless way for users to add more credits to their accounts. For more details on the broader credit system, see the Credit-Based Billing guide.