Reward and loyalty points

Build a points system on a ledger API

Issue, redeem, schedule, and expire point balances while keeping each movement attached to a business transfer.

Reward grant
{
  "transfer_id": "reward_1001",
  "scene": "top_up",
  "from_accounts": [
    { "account_id": "-1", "asset": "points", "action": "top_up", "amount": "250" }
  ],
  "to_accounts": [
    { "account_id": "member_42", "asset": "points", "action": "top_up", "amount": "250",
      "expire_at": 4102444800 }
  ]
}

Replace expire_at with a future Unix-second boundary for the reward campaign.

Clear product boundary

Use XferAPI for the balance, not the loyalty strategy

Your application

Defines campaigns, earning rules, eligibility, redemption choices, and the customer experience.

XferAPI

Stores point balances and executes balanced, traceable movements between accounts and platform accounts.

Earn and redeem

Move points from a configured platform account to a member, then back to a spending or settlement destination.

Campaign windows

Give a grant a future start or an exclusive expiry boundary in Unix seconds.

Support-ready history

Read the transfer status and per-account records when a reward or redemption needs investigation.

Questions about a points integration

These answers describe the balance layer. Your app remains responsible for the surrounding reward program.

Is XferAPI a loyalty program platform?

No. It provides accounts, point balances, transfers, time boundaries, and records. Campaign design and customer experiences stay in your application.

Can points expire?

Yes. A destination entry may have a Unix-second expire_at value. At that boundary the value is no longer available; physical cleanup happens lazily.

How is a redemption undone?

Request reversal for the complete transfer ID and scene. XferAPI applies the inverse balance changes and moves the existing records to their reversal state.

Start with one points flow

Create a ledger, issue a scoped service key, and test an earn or redemption transfer against the same API contract you will use in production.