Rewards-as-a-Service Developer Docs
Integrate tokenized loyalty rewards into any fintech product. Issue PLUS tokens on Base, let users redeem across 500+ brands, earn staking yield, and close the loop with our autonomous buyback engine — all through one REST API.
Crypto Card Rewards
Earn PLUS tokens on every card swipe. Partners fund reward pools; users earn automatically.
500+ Redemption Brands
Redeem PLUS for gift cards, crypto cashback, and exclusive partner perks across a global catalogue.
USDC Staking Yield
Lock PLUS tokens to earn up to 50% APY. Staking rewards are funded by real platform revenue.
Built on Base
Low-cost, fast finality L2 by Coinbase. All PLUS token operations settle on Base mainnet.
Open Banking AI
AI-powered transaction enrichment and spending insights power the rewards engine.
White-Label Dashboard
Embed a branded rewards dashboard into your app with our drop-in React components.
How RaaS works end-to-end
Funds
Spends
PLUS
Redeem
Loop
Authentication
Authorization header. Keys are scoped to your partner account.POST /v2/rewards/issue HTTP/1.1 Authorization: Bearer pm_live_sk_... Content-Type: application/json X-Partner-ID: partner_abc123
Base URL & Versioning
All endpoints are versioned. The current version is v2.
| Environment | Base URL | Key Prefix |
|---|---|---|
| Production | https://api.plusmore.xyz/v2 | pm_live_ |
| Sandbox | https://sandbox.api.plusmore.xyz/v2 | pm_test_ |
Sandbox Environment
Error Handling
All errors return a consistent JSON envelope with error,code, and message fields.
{
"error": true,
"code": "INVALID_WALLET",
"message": "The provided wallet address is not a valid Base address.",
"request_id": "req_8f3a..."
}Rate Limits
Requests are rate-limited per API key. Exceeding limits returns 429 RATE_LIMITED. See the reference table for per-endpoint limits.
How Issuance Works
PLUS tokens are issued from your partner reward pool. When a user completes a qualifying transaction, your backend calls the issuance endpoint to credit PLUS to their wallet. Tokens are minted on Base and confirmed within seconds.
Key Concepts
| Concept | Description |
|---|---|
| partner_pool | Your funded reward pool. PLUS issuance debits from this pool. |
| wallet_address | The user’s Base wallet that receives PLUS tokens. |
| reward_rate | The conversion rate from USD spend to PLUS tokens (set at partner level). |
| transaction_id | Your unique ID for the qualifying transaction. Used for idempotency. |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| wallet_address | string | Required | User’s Base wallet address (0x...) |
| amount_usd | number | Required | Transaction amount in USD |
| transaction_id | string | Required | Your unique transaction ID for idempotency |
| merchant_id | string | Optional | Merchant identifier for category-based rewards |
| metadata | object | Optional | Arbitrary key-value metadata (max 10 keys) |
{
"wallet_address": "0x1a2b3c4d5e6f7890abcdef1234567890abcdef12",
"amount_usd": 42.50,
"transaction_id": "txn_abc123",
"merchant_id": "mch_coffeeshop_01",
"metadata": {
"category": "dining",
"card_last4": "4242"
}
}{
"issuance_id": "iss_7f8a9b0c",
"wallet_address": "0x1a2b3c...ef12",
"plus_amount": 8.50,
"amount_usd": 42.50,
"reward_rate": 0.20,
"status": "pending",
"tx_hash": "0xabc123...def",
"created_at": "2025-03-01T12:00:00Z"
}{
"error": true,
"code": "INVALID_WALLET",
"message": "The provided wallet address is not a valid Base address."
}{
"error": true,
"code": "DUPLICATE_TRANSACTION",
"message": "A reward has already been issued for transaction_id txn_abc123.",
"existing_issuance_id": "iss_7f8a9b0c"
}{
"issuances": [
{
"wallet_address": "0x1a2b...ef12",
"amount_usd": 42.50,
"transaction_id": "txn_001"
},
{
"wallet_address": "0x9f8e...cd34",
"amount_usd": 18.00,
"transaction_id": "txn_002"
}
]
}Status Values
| Status | Description |
|---|---|
| pending | Transaction submitted to Base, awaiting confirmation. |
| confirmed | PLUS tokens delivered to the user’s wallet. |
| failed | Issuance failed. Check failure_reason for details. |
How Redemption Works
Users redeem PLUS tokens for gift cards, crypto cashback, and partner perks from a catalogue of 500+ brands. Redemptions are processed instantly and confirmed on-chain.
Query Parameters
| Param | Type | Required | Description |
|---|---|---|---|
| category | string | Optional | Filter by category (gift_card, cashback, partner_perk) |
| brand | string | Optional | Filter by brand name (partial match) |
| min_plus | number | Optional | Minimum PLUS cost to include |
| page | integer | Optional | Page number (default 1) |
{
"items": [
{
"brand": "Amazon",
"category": "gift_card",
"plus_cost": 50.00,
"usd_value": 50.00,
"kyc_required": false,
"in_stock": true
}
],
"total": 523,
"page": 1,
"per_page": 25
}Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| wallet_address | string | Required | User’s Base wallet address |
| catalogue_item_id | string | Required | ID of the catalogue item to redeem |
| quantity | integer | Optional | Number of items (default 1) |
Staking Overview
Users lock PLUS tokens to earn staking yield funded by real platform revenue. Four tiers offer increasing APY for longer lock-up periods.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| wallet_address | string | Required | User’s Base wallet address |
| plus_amount | number | Required | Amount of PLUS to stake |
| tier | string | Required | Staking tier: flex, 3m, 6m, 12m |
{
"wallet_address": "0x1a2b3c4d5e6f7890abcdef1234567890abcdef12",
"plus_amount": 1000.00,
"tier": "6m"
}{
"stake_id": "stk_4a5b6c7d",
"wallet_address": "0x1a2b3c...ef12",
"plus_amount": 1000.00,
"tier": "6m",
"apy": 0.35,
"status": "active",
"matures_at": "2025-09-01T12:00:00Z",
"created_at": "2025-03-01T12:00:00Z"
}User & Wallet
Register users, query wallet balances, and retrieve transaction histories. Each user is identified by their Base wallet address.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| wallet_address | string | Required | User’s Base wallet address |
| string | Optional | User email for notifications | |
| external_id | string | Optional | Your internal user ID for mapping |
{
"wallet_address": "0x1a2b3c...ef12",
"total_plus": 2450.75,
"available_plus": 1450.75,
"staked_plus": 1000.00,
"pending_rewards": 12.30,
"lifetime_earned": 5200.00,
"lifetime_redeemed": 2749.25
}Webhooks
Receive real-time notifications when events occur in the PlusMore system. Register an HTTPS endpoint and we’ll POST event payloads as they happen.
Events Reference
{
"url": "https://api.yourapp.com/webhooks/plusmore",
"events": [
"reward.issued",
"redemption.completed",
"staking.matured",
"pool.low_balance"
],
"secret": "whsec_your_signing_secret"
}Data Objects
Common data structures returned across multiple endpoints. All timestamps are ISO 8601 UTC. All monetary amounts are decimal numbers with up to 2 decimal places.
Error Codes
Rate Limits
| Endpoint | Limit |
|---|---|
| /v2/rewards/issue | 1,000 / min |
| /v2/rewards/issue/batch | 50 / min |
| /v2/redemption/* | 500 / min |
| /v2/staking/* | 300 / min |
| /v2/users/* | 500 / min |
| All other | 1,000 / min |
Changelog
| Version | Date | Changes |
|---|---|---|
| v2.1.0 | 2025-03-01 | Added batch issuance endpoint, webhook test delivery, and expanded error codes. |
| v2.0.0 | 2025-01-15 | Major release: new staking tiers, redemption catalogue API, Base mainnet migration. |
| v1.4.2 | 2024-11-10 | Bug fixes for webhook retry logic, improved rate limit headers. |