Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.flashnet.xyz/llms.txt

Use this file to discover all available pages before exploring further.

REST API for querying user rewards, configuring reward endorsements, reading Flashpoints data, and checking system stats.

Base URL

https://rewards.flashnet.xyz
All endpoints are prefixed with /v1. Swagger docs are available at /docs.

Rewards

Get Rewards Leaderboard

Returns list of users sorted by USDB balance with their rewards info.
GET /v1/rewards/?limit=100&offset=0
Parameters:
  • limit - Max results (default 100, max 500)
  • offset - Pagination offset
Response:
{
  "rewards": [
    {
      "pubkey": "02abc...def",
      "usdbBalance": {
        "raw": "10000000000",
        "display": "10000"
      },
      "volumeUtcToday": {
        "swapSats": 5000000,
        "swapCount": 12
      },
      "rewardsBracket": 3,
      "rewardsPercent": 5.0,
      "estimatedSatsToday": 1370
    }
  ],
  "meta": {
    "total": 830,
    "limit": 100,
    "offset": 0
  }
}

Get User Summary

Returns current USDB balance, today’s volume, rewards bracket, and projected rewards.
GET /v1/rewards/:pubkey
Response:
{
  "pubkey": "02abc...def",
  "usdbBalance": {
    "raw": "10000000000",
    "display": "10000"
  },
  "volumeUtcToday": {
    "swapSats": 5000000,
    "swapCount": 12
  },
  "rewardsBracket": 3,
  "rewardsPercent": 5.0,
  "estimatedSatsToday": 1370
}
Excluded addresses (LP pools, burn addresses) return a 400 status with { "reason": "This address is excluded and does not earn rewards" }. Rewards Brackets:
BracketvolumeUtcToday.swapSats ThresholdRewards
0>= 03.5%
1>= 5000004.0%
2>= 25000004.5%
3>= 50000005.0%
4>= 100000005.5%
5>= 250000006.0%

Get Payout History

Returns paginated list of rewards payouts for a user.
GET /v1/rewards/:pubkey/payouts?limit=30&offset=0
Parameters:
  • limit - Max results (default 30)
  • offset - Pagination offset
Response:
{
  "pubkey": "02abc...def",
  "payouts": [
    {
      "day": "2026-02-09",
      "usdbBalance": {
        "raw": 10000000000,
        "display": 10000
      },
      "volume": {
        "swapSats": 5000000
      },
      "rewardsBracket": 3,
      "annualRewardsBps": 500,
      "rewardsPayoutSats": 1020,
      "endorsementsPayoutSats": 350,
      "payoutSats": 1370,
      "status": "paid",
      "txId": "abc123...",
      "createdAt": "2026-02-09T00:05:00Z",
      "paidAt": "2026-02-10T00:05:00Z"
    }
  ],
  "pagination": { "total": 45, "limit": 30, "offset": 0 }
}
payoutSats is the sum of rewardsPayoutSats and endorsementsPayoutSats.

Endorsements

Endorsements let a pubkey direct part of its future daily rewards payout to one or more recipient pubkeys.

Canonical YAML Templates (for Signing)

Create and update both use action: upsert. The API creates a new record or updates the existing (endorser, to) pair. Create endorsement template:
kind: rewards_endorsement
version: 1
action: upsert
endorser: "<endorser_pubkey_hex_66_chars>"
to: "<recipient_pubkey_hex_66_chars>"
ratioBps: <1_to_10000>
timestampNonce: "<uuidv7>"
Update endorsement template:
kind: rewards_endorsement
version: 1
action: upsert
endorser: "<endorser_pubkey_hex_66_chars>"
to: "<existing_recipient_pubkey_hex_66_chars>"
ratioBps: <new_ratio_1_to_10000>
timestampNonce: "<uuidv7>"
Delete endorsement template:
kind: rewards_endorsement
version: 1
action: delete
endorser: "<endorser_pubkey_hex_66_chars>"
to: "<recipient_pubkey_hex_66_chars>"
timestampNonce: "<uuidv7>"
The client signs the SHA-256 hash of the YAML payload with the endorser private key and sends that signature as hex.

Get Endorsements

GET /v1/rewards/:pubkey/endorsements
Response:
{
  "endorser": "02abc...def",
  "endorsements": [
    {
      "to": "03fed...cba",
      "ratioBps": 3000
    },
    {
      "to": "02012...999",
      "ratioBps": 2000
    }
  ]
}

Create or Update Endorsement

Creates or updates one endorsement rule for to under the endorser.
POST /v1/rewards/:pubkey/endorsements
Request body:
{
  "endorser": "02abc...def",
  "to": "03fed...cba",
  "ratioBps": 3000,
  "timestampNonce": "01958d67-2d1a-7a8a-bf8a-5b0a947f8f11",
  "signature": "30440220..."
}
Signing payload (canonical YAML):
kind: rewards_endorsement
version: 1
action: upsert
endorser: "02abc...def"
to: "03fed...cba"
ratioBps: 3000
timestampNonce: "01958d67-2d1a-7a8a-bf8a-5b0a947f8f11"
The API verifies the signature against the endorser pubkey using secp256k1 over the SHA-256 hash of this YAML payload. Response:
{
  "endorser": "02abc...def",
  "endorsements": [
    {
      "to": "03fed...cba",
      "ratioBps": 3000
    }
  ]
}

Delete Endorsement

Deletes one endorsement mapping for the endorser.
DELETE /v1/rewards/:pubkey/endorsements/:toPubkey
Request body:
{
  "timestampNonce": "01958d67-41c1-7dd4-8aa3-ef3575a84ab5",
  "signature": "30450221..."
}
Signing payload (canonical YAML):
kind: rewards_endorsement
version: 1
action: delete
endorser: "02abc...def"
to: "03fed...cba"
timestampNonce: "01958d67-41c1-7dd4-8aa3-ef3575a84ab5"
Response:
{
  "ok": true
}

Endorsement Rules and Validation

  • pubkey, endorser, and to must be 66-char compressed pubkey hex strings.
  • endorser in body must match :pubkey in the route.
  • ratioBps must be between 1 and 10000.
  • Sum of all active endorsement ratios for an endorser cannot exceed 10000.
  • Endorser cannot endorse to the same pubkey.
  • timestampNonce must be UUIDv7 and within a 5-minute window.
  • Each nonce can only be used once (replay protected).
Common 400 errors:
  • { "error": "Body endorser must match route pubkey" }
  • { "error": "Cannot endorse to the same pubkey. Use rewards payee reassignment instead." }
  • { "error": "Total endorsement ratio cannot exceed 10000 bps" }
  • { "error": "Nonce has already been used" }
  • { "error": "Signature verification failed" }

Flashpoints

Get Points Leaderboard

Returns list of users sorted by current Flashpoints with their point balances and volume.
GET /v1/points/?limit=100&offset=0
Parameters:
  • limit - Max results (default 100, max 500)
  • offset - Pagination offset
Response:
{
  "points": [
    {
      "pubkey": "02abc...def",
      "currentPoints": 1250000,
      "lifetimePoints": 1500000,
      "rank": 1,
      "projectedDailyPoints": 1236,
      "volumeUtcToday": {
        "swapSats": 5000000,
        "liquiditySats": 0
      }
    }
  ],
  "meta": {
    "total": 830,
    "limit": 100,
    "offset": 0
  }
}

Get User Points

Returns Flashpoints balance, rank, and projected daily earnings.
GET /v1/points/:pubkey
Response:
{
  "pubkey": "02abc...def",
  "currentPoints": 1250000,
  "lifetimePoints": 1500000,
  "rank": 42,
  "projectedDailyPoints": 1236,
  "volumeUtcToday": {
    "swapSats": 5000000,
    "liquiditySats": 0
  }
}

Get Points History

Returns paginated list of point earning events.
GET /v1/points/:pubkey/history?limit=30&offset=0
Parameters:
  • limit - Max results (default 30)
  • offset - Pagination offset
Response:
{
  "pubkey": "02abc...def",
  "events": [
    {
      "type": "daily_award",
      "points": 1236,
      "day": "2026-02-09",
      "metadata": {},
      "createdAt": "2026-02-10T00:05:00Z"
    }
  ],
  "pagination": { "total": 45, "limit": 30, "offset": 0 }
}

Stats

Get Global Stats

Returns system-wide statistics.
GET /v1/stats
Response:
{
  "usdb": {
    "totalHolders": 830,
    "totalBalanceRaw": 2500000000000,
    "totalBalanceUsdb": 2500000.00
  },
  "volume24h": {
    "activeTraders": 145,
    "totalVolumeSats": 850000000,
    "totalSwaps": 2340
  },
  "payouts": {
    "pendingCount": 12,
    "pendingSats": 140000,
    "totalPaidSats": 5000000
  },
  "processor": {
    "lastPointsDay": "2026-02-09",
    "lastPayoutDay": "2026-02-09"
  },
  "updatedAt": "2026-02-10T12:34:56Z"
}

Health Check

GET /v1/stats/health
Response:
{
  "status": "healthy",
  "lastPayoutDay": "2026-02-09",
  "lastPointsDay": "2026-02-09"
}
Returns "status": "degraded" if either payout or points processing is behind.

Error Handling

Validation errors usually return:
{
  "error": "Invalid pubkey format. Expected 66 character hex string."
}
Excluded pubkeys on GET /v1/rewards/:pubkey return:
{
  "reason": "This address is excluded and does not earn rewards"
}
Server-side errors may return:
{
  "error": "INTERNAL_SERVER_ERROR",
  "message": "..."
}
Common status codes:
  • 400 - Bad request (validation errors, excluded addresses)
  • 404 - Not found
  • 500 - Internal server error