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

Rewards-as-a-Service
Developer Docs

Integrate tokenised loyalty rewards into any fintech product in hours. Issue PLUS tokens on-chain, connect to 500+ global redemption brands, and deliver USDC staking yield — all via a single REST API.

Platform is live $1M+ in real savings delivered during B2B beta. All endpoints below are production-ready. Sandbox mirrors production with test tokens.
💳
Crypto Card Rewards
Issue PLUS automatically on every card transaction. Rewards settle on-chain in real time to any connected wallet.
🛍️
500+ Redemption Brands
Amazon, Apple, Netflix, Uber, Airbnb, Tesco, Starbucks and hundreds more. One API call handles the full redemption.
🔒
USDC Staking Yield
Stake PLUS for 10–50% APY in USDC, paid from merchant-funded pools. Non-inflationary — no new tokens minted.
🏗️
Built on Base
Non-custodial. Rewards settle directly to user wallets on Coinbase's Base L2. Low gas, fast finality.
🤖
Open Banking AI
Link bank accounts for hyper-targeted offers powered by spending data. Privacy-first and UK/EU regulated.
📊
White-Label Dashboard
Embed PlusMore's rewards UI into your product. Branded, customisable, and no-KYC for basic accounts.

How RaaS works end-to-end

1
Partner FundsMerchant funds PLUS pool via dashboard or API
2
User SpendsCard transaction triggers your system
3
Issue PLUSPOST /v2/rewards/issue → wallet receives PLUS
4
Stake / RedeemUser chooses USDC yield or brand redemption
5
Buyback LoopRedemptions feed Auto Buyback → scarcity

Authentication

All API requests must be authenticated with your partner API key passed in the Authorization header. Keys are environment-scoped — a sandbox key never touches production.

🔑
Bearer Token Authentication
Include your key as Authorization: Bearer pm_live_xxxxxxxxxxxxxxxx on every request. Never expose keys client-side.
HTTP
POST https://api.plusmore.xyz/v2/rewards/issue Authorization: Bearer pm_live_sk_4a9f3d2e8b1c7f05 Content-Type: application/json X-Partner-ID: partner_8bx29fj
⚠️
Keep keys secret Sandbox keys begin with pm_test_. Live keys begin with pm_live_. Rotate keys immediately in the Partner Dashboard if compromised. Keys cannot be recovered — store them securely at creation time.

Base URL & Versioning

The API is versioned in the URL path. The current stable version is v2. We maintain backward compatibility within a major version and give 90 days notice before deprecating any endpoint.

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

Test before you ship

Full production parity. Use test PLUS tokens, mock card transactions, and webhook delivery testing. Free with no rate limits in sandbox.

ℹ️
Sandbox PLUS tokens have no real value. All blockchain operations in sandbox use Base Sepolia testnet. Staking yields and redemptions are simulated but follow identical logic to production.

PLUS Issuance

PLUS issuance is the core RaaS flow. When a user makes a qualifying purchase via a partner card or platform, you call the issuance endpoint to mint and deliver PLUS tokens to their wallet. Tokens are funded from your pre-loaded partner pool — no new supply is created at issuance.

Non-inflationary by design PLUS issued via RaaS is drawn from merchant-funded treasury allocations. Each release is matched 1:1 with $10 of Aerodrome DEX liquidity. Issuance never dilutes existing holders.
ConceptDescription
partner_poolYour pre-funded PLUS balance. Must be topped up before issuance calls will succeed.
wallet_addressThe user's Base-compatible wallet. PLUS settles here instantly on confirmation.
reward_ratePLUS per USD spent. Configurable per merchant or global. Default set in partner dashboard.
transaction_idYour unique reference. Prevents duplicate issuance — idempotency is enforced by this field.
POST/v2/rewards/issueIssue PLUS to a user wallet

Request body

ParameterTypeDescription
wallet_addressrequiredstringRecipient's Base wallet address (0x…)
amount_usdrequirednumberTransaction value in USD. PLUS is calculated from your configured reward rate.
transaction_idrequiredstringYour unique transaction reference. Used for idempotency — duplicate IDs are rejected with 409.
merchant_idoptionalstringOverride the reward rate for a specific merchant. Defaults to your global partner rate.
metadataoptionalobjectArbitrary key-value pairs stored against the issuance for your records (max 10 keys).

Example request

JSON
{ "wallet_address": "0x4Cf2eB8CeF9e1A25D3F07b9D1E3A8B2C5F0E6D7", "amount_usd": 124.50, "transaction_id": "txn_a9f3b2e8c1d07f45", "merchant_id": "merch_amazon_uk", "metadata": { "card_last4": "4291", "user_tier": "gold" } }

Response

201 Success
400 Bad Request
409 Duplicate
JSON — 201 Created
{ "issuance_id": "iss_7f2a9c4b3d8e1f06", "status": "confirmed", "plus_issued": 1.245, "usd_value_locked": 12.45, "wallet_address": "0x4Cf2eB8CeF9e1A25D3F07b9D1E3A8B2C5F0E6D7", "tx_hash": "0xb9f4a2c8d3e1f0b56a7c2d4e9f0a3b1c", "block_number": 18427043, "chain": "base", "issued_at": "2025-03-12T14:22:08Z", "partner_pool_remaining": 4821.75 }
JSON — 400 Bad Request
{ "error": "INVALID_WALLET", "message": "wallet_address is not a valid Base-compatible address", "field": "wallet_address", "request_id": "req_2d9f0b4c7e3a1f85" }
JSON — 409 Conflict
{ "error": "DUPLICATE_TRANSACTION", "message": "transaction_id already processed", "existing_issuance_id": "iss_7f2a9c4b3d8e1f06" }
POST/v2/rewards/issue/batchIssue PLUS to multiple wallets in one call

Send up to 500 issuances in a single request. Each item follows the same schema as a single issuance. Partial success is supported — failed items return per-item errors while successful ones confirm immediately.

JSON
{ "rewards": [ { "wallet_address": "0x4Cf2...D7", "amount_usd": 55.00, "transaction_id": "txn_batch_001" }, { "wallet_address": "0xB3Aa...F2", "amount_usd": 210.00, "transaction_id": "txn_batch_002" } ] }
GET/v2/rewards/issue/{issuance_id}Fetch status of an issuance

Returns the full issuance object including on-chain confirmation status. Useful for polling if your webhook delivery was delayed.

Status valueMeaning
pendingSubmitted to Base, awaiting block confirmation (usually <5 seconds)
confirmedOn-chain and settled to user wallet
failedRejected — check failure_reason in response

Redemption

PLUS holders can exchange tokens for real-world rewards via our 500+ brand catalogue. Redemptions are funded entirely by merchant margin — no new tokens are minted, keeping PLUS non-inflationary. The API handles fulfilment; your UI simply calls the endpoint.

ℹ️
KYC requirement Basic PLUS earning and staking is available without KYC. Fiat-equivalent redemptions (cashback top-up, gift cards above £50 equivalent) require the user to have completed full Plutus KYC. The requires_kyc flag on each catalogue item indicates this.
GET/v2/redemption/catalogueList available reward items

Returns paginated catalogue of redeemable items. Filter by category, region, or search by brand name.

Query paramTypeDescription
categoryoptionalstringgift_card · cashback · subscription · travel
regionoptionalstringISO 3166-1 alpha-2. Filters brands available in that market.
searchoptionalstringBrand name full-text search (e.g. amazon)
pageoptionalintegerPage number, default 1. Page size is 50.
JSON — 200 OK (truncated)
{ "items": [ { "item_id": "red_amazon_uk_10", "brand": "Amazon", "category": "gift_card", "face_value_usd": 10.00, "plus_cost": 1.0, "region": "GB", "requires_kyc": false, "logo_url": "https://cdn.plusmore.xyz/brands/amazon.png" } ], "total": 527, "page": 1 }
POST/v2/redemption/redeemExchange PLUS for a reward
ParameterTypeDescription
wallet_addressrequiredstringWallet holding the PLUS to be redeemed
item_idrequiredstringCatalogue item ID from GET /catalogue
quantityoptionalintegerNumber of units to redeem. Default 1.
delivery_emailoptionalstringFor gift cards, the email to deliver the code to. Defaults to user's registered email.
🔁
Auto Buyback contribution A portion of every redemption feeds the Supply Shock Demand Engine. Redeemed PLUS enters the Auto Buyback mechanism, supporting token scarcity and long-term network sustainability automatically.

Staking

Partners can expose PLUS staking directly within their product UI. Users lock PLUS for a chosen duration and earn USDC rewards paid from merchant-funded pools. Yield is calculated on the USD value locked at time of staking — predictable from day one.

10%
APY · Flex
No lock period
20%
APY · 3 months
90-day lock
35%
APY · 6 months
180-day lock
50%
APY · 12 months
365-day lock
ℹ️
USDC rewards are non-inflationaryStaking rewards come entirely from merchant-funded pools — not from newly minted PLUS. Your users' holdings are never diluted by reward emissions. Early withdrawal may reduce or forfeit accrued USDC; the dashboard shows the exact penalty before confirmation.
POST/v2/staking/stakeStake PLUS from a wallet
ParameterTypeDescription
wallet_addressrequiredstringWallet staking the PLUS
plus_amountrequirednumberAmount of PLUS to stake
tierrequiredstringflex · 3m · 6m · 12m
auto_compoundoptionalbooleanEnable Auto Buyback compounding. Default false.
JSON — Request
{ "wallet_address": "0x4Cf2eB8CeF9e1A25D3F07b9D1E3A8B2C5F0E6D7", "plus_amount": 10.0, "tier": "12m", "auto_compound": true }
JSON — 201 Created
{ "stake_id": "stk_3b8c9f2a1d7e4f06", "status": "active", "plus_staked": 10.0, "usd_value_locked": 100.00, "apy": 0.50, "usdc_at_maturity": 50.00, "maturity_date": "2026-03-12T00:00:00Z", "auto_compound": true }
GET/v2/staking/{stake_id}Fetch a staking position

Returns full position details including accrued USDC rewards to date, days remaining, and early withdrawal penalty if applicable.

DEL/v2/staking/{stake_id}Unstake early (penalty may apply)
⚠️
Always fetch the staking position first and display the early_exit_penalty_usdc to your user before calling this endpoint. Unstaking is irreversible.

User & Wallet

PlusMore accounts are non-custodial. Basic earning and staking requires no KYC — users are registered as Plutus Lite accounts automatically. Full KYC unlocks fiat redemptions and higher transaction limits.

POST/v2/users/registerRegister a user on PlusMore Lite
ParameterTypeDescription
wallet_addressrequiredstringUser's Base wallet address
emailoptionalstringRequired for gift card and cashback delivery
external_user_idoptionalstringYour internal user ID for cross-referencing
regionoptionalstringISO 3166-1 alpha-2. Sets catalogue defaults.
GET/v2/users/{wallet_address}/balanceGet PLUS balance and staking summary
JSON — 200 OK
{ "wallet_address": "0x4Cf2eB8CeF9e1A25D3F07b9D1E3A8B2C5F0E6D7", "plus_available": 23.45, "plus_staked": 10.0, "plus_total": 33.45, "usdc_earned": 4.27, "usdc_claimable": 1.10, "platform_price_usd": 10.00, "dex_price_usd": 12.40, "kyc_status": "lite" }

Webhooks

PlusMore sends signed POST requests to your registered endpoint for all key platform events. Verify the X-PlusMore-Signature header using your webhook secret to ensure authenticity.

🔐
Signature verification Compute HMAC-SHA256(raw_body, webhook_secret) and compare to the header value. Reject events that fail verification. Replay protection: reject events where timestamp is more than 5 minutes old.

Event types

reward.issued
PLUS successfully issued and confirmed on-chain. Contains issuance_id, plus_issued, tx_hash.
reward.issue_failed
Issuance attempt failed. Check failure_reason. Common cause: insufficient partner pool balance.
redemption.completed
PLUS redeemed for a reward. Gift card codes are delivered to user's email. Contains redemption_id, item_id, plus_spent.
staking.activated
New staking position confirmed on-chain. Contains stake_id, tier, usdc_at_maturity.
staking.matured
Staking period ended. USDC rewards are claimable. PLUS is unlocked and returned to plus_available.
staking.early_exit
User unstaked before maturity. Contains penalty_usdc forfeited.
pool.low_balance
Your partner pool balance has dropped below your configured threshold. Top up required to continue issuance.
user.kyc_approved
User completed full Plutus KYC. Fiat redemptions and higher limits are now unlocked for this wallet.
POST/v2/webhooksRegister a webhook endpoint
JSON — Request
{ "url": "https://yourapp.com/webhooks/plusmore", "events": ["reward.issued", "redemption.completed", "pool.low_balance"], "pool_low_threshold_usd": 500 }

Error Codes

All errors follow a consistent JSON shape with a machine-readable error code, human-readable message, and a request_id for support escalation.

400
INVALID_WALLET
·
MISSING_FIELD

Request body is malformed or a required field is absent/invalid.

401
UNAUTHORIZED

API key missing, invalid, or revoked. Check your Authorization header.

402
INSUFFICIENT_POOL

Your partner pool balance is too low to cover this issuance. Top up via the Partner Dashboard.

403
KYC_REQUIRED

This redemption requires the user to have completed full KYC. Direct them to the PlusMore KYC flow.

404
NOT_FOUND

Resource not found — check the ID in the path parameter.

409
DUPLICATE_TRANSACTION

transaction_id has already been processed. The existing issuance ID is returned.

429
RATE_LIMITED

Too many requests. Check the Retry-After header. See rate limits below.

Rate Limits

Limits are enforced per partner API key. Batch endpoints count as one request regardless of items. Sandbox has no rate limits.

Endpoint groupLimitWindow
/v2/rewards/issue1,000 requestsPer minute
/v2/rewards/issue/batch50 requestsPer minute
/v2/redemption/*500 requestsPer minute
/v2/staking/*300 requestsPer minute
/v2/users/*500 requestsPer minute
All other endpoints1,000 requestsPer minute
📈
Enterprise partners can request elevated limits. Contact partners.plusmore.xyz with your expected transaction volume.

Changelog

VersionDateChanges
v2.1.02025-03-01Added batch issuance endpoint. Auto Buyback flag on staking. plus_staked field on balance response.
v2.0.02025-01-15Major version — Base L2 migration. Staking tiers restructured. Webhook signature verification added. v1 deprecated (EOL 2025-07-15).
v1.4.22024-11-10Catalogue region filtering. KYC status on user object. Rate limit headers standardised.