PlusMore RaaS API v2 — Free sandbox access → · Built on Base · $1M+ real savings delivered
PlusMore RaaS API

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.

Platform is live. PlusMore has delivered over $1 M in real savings to users across partner platforms. The RaaS API is production-ready and processing transactions on Base mainnet.
💳

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

1
Partner
Funds
2
User
Spends
3
Issue
PLUS
4
Stake /
Redeem
5
Buyback
Loop

Authentication

🔑
Bearer Token Authentication
All API requests require a valid API key passed via the Authorization header. Keys are scoped to your partner account.
HTTP
POST /v2/rewards/issue HTTP/1.1
Authorization: Bearer pm_live_sk_...
Content-Type: application/json
X-Partner-ID: partner_abc123
⚠️
Keep your keys secret. Never expose API keys in client-side code or public repositories. Sandbox keys start with pm_test_ and production keys start with pm_live_.

Base URL & Versioning

All endpoints are versioned. The current version is v2.

EnvironmentBase URLKey Prefix
Productionhttps://api.plusmore.xyz/v2pm_live_
Sandboxhttps://sandbox.api.plusmore.xyz/v2pm_test_

Sandbox Environment

Developer Sandbox
Test before you ship
The sandbox mirrors production exactly but uses test tokens with no real value. Issue, redeem, and stake freely while building your integration. Rate limits are relaxed to speed up development.
ℹ️
Sandbox tokens have no real value. All PLUS tokens issued in the sandbox are test tokens on Base Sepolia. They cannot be redeemed or transferred to mainnet.

Error Handling

All errors return a consistent JSON envelope with error,code, and message fields.

JSON
{
  "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.

Non-inflationary design. PLUS tokens are only issued when backed by real funds in your partner pool. The autonomous buyback engine ensures token supply stays healthy.

Key Concepts

ConceptDescription
partner_poolYour funded reward pool. PLUS issuance debits from this pool.
wallet_addressThe user’s Base wallet that receives PLUS tokens.
reward_rateThe conversion rate from USD spend to PLUS tokens (set at partner level).
transaction_idYour unique ID for the qualifying transaction. Used for idempotency.
POST/v2/rewards/issue
Issue PLUS tokens to a user wallet for a qualifying transaction.

Request Body

FieldTypeRequiredDescription
wallet_addressstringRequiredUser’s Base wallet address (0x...)
amount_usdnumberRequiredTransaction amount in USD
transaction_idstringRequiredYour unique transaction ID for idempotency
merchant_idstringOptionalMerchant identifier for category-based rewards
metadataobjectOptionalArbitrary key-value metadata (max 10 keys)
JSON — Request
{
  "wallet_address": "0x1a2b3c4d5e6f7890abcdef1234567890abcdef12",
  "amount_usd": 42.50,
  "transaction_id": "txn_abc123",
  "merchant_id": "mch_coffeeshop_01",
  "metadata": {
    "category": "dining",
    "card_last4": "4242"
  }
}
JSON — 201 Created
{
  "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"
}
JSON — 400 Bad Request
{
  "error": true,
  "code": "INVALID_WALLET",
  "message": "The provided wallet address is not a valid Base address."
}
JSON — 409 Conflict
{
  "error": true,
  "code": "DUPLICATE_TRANSACTION",
  "message": "A reward has already been issued for transaction_id txn_abc123.",
  "existing_issuance_id": "iss_7f8a9b0c"
}
POST/v2/rewards/issue/batch
Issue PLUS tokens to multiple wallets in a single request. Supports up to 500 issuances per batch.
JSON — Request
{
  "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"
    }
  ]
}
GET/v2/rewards/issue/{issuance_id}
Retrieve the current status of an issuance.

Status Values

StatusDescription
pendingTransaction submitted to Base, awaiting confirmation.
confirmedPLUS tokens delivered to the user’s wallet.
failedIssuance 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.

ℹ️
KYC may be required. Some redemption options require the user to have completed KYC. Check the kyc_required field in the catalogue response.
GET/v2/redemption/catalogue
Browse available redemption options. Filter by category, brand, or minimum PLUS amount.

Query Parameters

ParamTypeRequiredDescription
categorystringOptionalFilter by category (gift_card, cashback, partner_perk)
brandstringOptionalFilter by brand name (partial match)
min_plusnumberOptionalMinimum PLUS cost to include
pageintegerOptionalPage number (default 1)
JSON — 200 OK
{
  "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
}
POST/v2/redemption/redeem
Redeem PLUS tokens for a catalogue item.

Request Body

FieldTypeRequiredDescription
wallet_addressstringRequiredUser’s Base wallet address
catalogue_item_idstringRequiredID of the catalogue item to redeem
quantityintegerOptionalNumber of items (default 1)
Auto Buyback. Every redemption triggers the autonomous buyback engine, which uses a portion of platform revenue to buy PLUS from the open market — maintaining healthy token economics.
GET/v2/redemption/{redemption_id}
Check the status of a redemption. Returns the redemption object with current status and fulfilment details.

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.

10%
Flex
No lock-up
20%
3 Months
90-day lock
35%
6 Months
180-day lock
50%
12 Months
365-day lock
ℹ️
Yield is real, not inflationary. Staking rewards come from PlusMore platform revenue (interchange fees, partner subscriptions), not token inflation. APY rates are subject to quarterly adjustment.
POST/v2/staking/stake
Stake PLUS tokens at a chosen tier.

Request Body

FieldTypeRequiredDescription
wallet_addressstringRequiredUser’s Base wallet address
plus_amountnumberRequiredAmount of PLUS to stake
tierstringRequiredStaking tier: flex, 3m, 6m, 12m
JSON — Request
{
  "wallet_address": "0x1a2b3c4d5e6f7890abcdef1234567890abcdef12",
  "plus_amount": 1000.00,
  "tier": "6m"
}
JSON — 201 Created
{
  "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"
}
GET/v2/staking/{stake_id}
Retrieve the current state of a staking position, including accrued yield and maturity date.
DEL/v2/staking/{stake_id}
Unstake PLUS tokens before the maturity date. An early exit penalty applies.
⚠️
Early exit penalty. Unstaking before maturity forfeits all accrued yield and incurs a 5% penalty on the principal. Flex-tier stakes have no penalty.

User & Wallet

Register users, query wallet balances, and retrieve transaction histories. Each user is identified by their Base wallet address.

POST/v2/users/register
Register a new user wallet with your partner platform.

Request Body

FieldTypeRequiredDescription
wallet_addressstringRequiredUser’s Base wallet address
emailstringOptionalUser email for notifications
external_idstringOptionalYour internal user ID for mapping
GET/v2/users/{wallet_address}/balance
Retrieve the PLUS token balance and breakdown for a user wallet.
JSON — 200 OK
{
  "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
}
GET/v2/users/{wallet_address}/transactions
Retrieve a paginated list of all PLUS transactions for a user wallet, including issuances, redemptions, staking events, and transfers.

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.

ℹ️
Verify signatures. Every webhook payload includes anX-PlusMore-Signature header containing an HMAC-SHA256 digest. Always verify this signature before processing the event.

Events Reference

reward.issuedPLUS tokens have been successfully issued and confirmed on-chain.
reward.issue_failedA PLUS issuance attempt failed. Includes failure reason.
redemption.completedA redemption has been fulfilled and the reward delivered to the user.
staking.activatedA new staking position has been created and is earning yield.
staking.maturedA staking position has reached maturity. Principal + yield unlocked.
staking.early_exitA user unstaked before maturity. Penalty applied.
pool.low_balanceYour partner reward pool balance is below the warning threshold.
user.kyc_approvedA user has completed KYC verification and is approved for full redemption.
POST/v2/webhooks
Register a webhook endpoint to receive event notifications.
JSON — Request
{
  "url": "https://api.yourapp.com/webhooks/plusmore",
  "events": [
    "reward.issued",
    "redemption.completed",
    "staking.matured",
    "pool.low_balance"
  ],
  "secret": "whsec_your_signing_secret"
}
POST/v2/webhooks/test
Send a test event to your registered webhook endpoint. Useful for verifying your integration before going live.

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

400INVALID_WALLET — The provided wallet address is not a valid Base address.
400MISSING_FIELD — A required field is missing from the request body.
401UNAUTHORIZED — Invalid or missing API key. Check your Authorization header.
402INSUFFICIENT_POOL — Your partner reward pool does not have enough funds for this issuance.
403KYC_REQUIRED — This action requires the user to have completed KYC verification.
404NOT_FOUND — The requested resource does not exist.
409DUPLICATE_TRANSACTION — A reward has already been issued for this transaction_id.
429RATE_LIMITED — Too many requests. Retry after the period indicated in Retry-After header.

Rate Limits

EndpointLimit
/v2/rewards/issue1,000 / min
/v2/rewards/issue/batch50 / min
/v2/redemption/*500 / min
/v2/staking/*300 / min
/v2/users/*500 / min
All other1,000 / min
ℹ️
Need higher limits? Enterprise partners can request custom rate limits. Contact your partner manager or email api@plusmore.xyz.

Changelog

VersionDateChanges
v2.1.02025-03-01Added batch issuance endpoint, webhook test delivery, and expanded error codes.
v2.0.02025-01-15Major release: new staking tiers, redemption catalogue API, Base mainnet migration.
v1.4.22024-11-10Bug fixes for webhook retry logic, improved rate limit headers.