Lucra Sports
Lucra (Lucra Sports, Inc.) is a competitive-loyalty and gamification platform that embeds real-money, free-to-play and peer-to-peer contests into third-party consumer apps and websites through a white-label SDK. Partners integrate Games You Play (head-to-head recreational matchups), Sports You Watch (prediction contests), Tournaments, Mini Games and Achievements without building the regulated infrastructure themselves: Lucra acts as merchant of record and operates the KYC, geolocation, age verification, payments, fraud monitoring, prize settlement and responsible-gaming controls behind the experience. The developer surface is a tenant-scoped server-to-server REST API (the Forge gateway) plus iOS, Android, React Native and JavaScript client SDKs, a signed webhook event stream, and a sandbox environment.
Lucra Sports publishes 9 APIs on the APIs.io network, including Health API, Locations API, Recreational Games API, and 6 more. Tagged areas include Gaming, Sports, Gamification, Loyalty, and Tournaments.
The Lucra Sports catalog on APIs.io includes 1 event-driven AsyncAPI specification.
Lucra Sports’ developer surface includes documentation, API reference, getting-started guide, support, engineering blog, signup flow, changelog, and 29 more developer resources.
1 APIs
1 MCP Servers
Business capabilities this provider's published APIs can perform, derived from its own
contracts. Browse all capabilities →
Individual APIs this provider publishes, each with its own machine-readable definition.
Model Context Protocol servers that expose these APIs to AI agents.
Published pricing tiers and plan structures.
Documented rate limits and quota policies.
AsyncAPI definitions for this provider's event-driven and streaming APIs.
Authentication, domain security, vulnerability disclosure, and trust-center signals.
aid: lucra-sports
name: Lucra Sports
description: 'Lucra (Lucra Sports, Inc.) is a competitive-loyalty and gamification platform that embeds real-money, free-to-play
and peer-to-peer contests into third-party consumer apps and websites through a white-label SDK. Partners integrate Games
You Play (head-to-head recreational matchups), Sports You Watch (prediction contests), Tournaments, Mini Games and Achievements
without building the regulated infrastructure themselves: Lucra acts as merchant of record and operates the KYC, geolocation,
age verification, payments, fraud monitoring, prize settlement and responsible-gaming controls behind the experience. The
developer surface is a tenant-scoped server-to-server REST API (the Forge gateway) plus iOS, Android, React Native and JavaScript
client SDKs, a signed webhook event stream, and a sandbox environment.'
deliveryModel:
model: saas
open_source: false
commercial: true
callable_host: false
label: Hosted service · you call their endpoint
confidence: medium
source:
- pricing
generated: '2026-08-28'
method: derived
image: https://framerusercontent.com/images/ig8OHgXmBzrkMRo5krWVBCgcrhI.png
url: https://raw.githubusercontent.com/api-evangelist/lucra-sports/refs/heads/main/apis.yml
x-type: company
x-source: harvest:secondary-market
specificationVersion: '0.20'
created: '2026-08-25'
modified: '2026-08-25'
tags:
- Gaming
- Sports
- Gamification
- Loyalty
- Tournaments
- Contests
- Payments
- Wagering
- Embedded Finance
- SDK
- Webhook
- Compliance
tags_raw:
- Gaming
- Sports
- Gamification
- Loyalty
- Tournaments
- Contests
- Payments
- Wagering
- Embedded Finance
- SDKs
- Webhooks
- Compliance
apis:
- aid: lucra-sports:lucra-sports-health-api
name: Lucra Sports Health API
description: The Health API from Lucra Sports — 1 operation(s) for health.
humanURL: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
baseURL: https://forge.lucrasports.com
tags:
- Health
properties:
- type: OpenAPI
url: openapi/lucra-sports-health-api-openapi.yml
- type: Documentation
url: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
- type: APIReference
url: https://forge.lucrasports.com/docs/
- type: Console
url: https://forge.lucrasports.com/docs/
- type: Authentication
url: authentication/lucra-sports-authentication.yml
- type: ErrorCatalog
url: errors/lucra-sports-problem-types.yml
- type: RateLimits
url: rate-limits/lucra-sports-rate-limits.yml
- type: DataModel
url: data-model/lucra-sports-data-model.yml
- type: Webhooks
url: asyncapi/lucra-sports-webhooks.yml
- type: Sandbox
url: sandbox/lucra-sports-sandbox.yml
- aid: lucra-sports:lucra-sports-locations-api
name: Lucra Sports Locations API
description: The Locations API from Lucra Sports — 1 operation(s) for locations.
humanURL: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
baseURL: https://forge.lucrasports.com
tags:
- Locations
properties:
- type: OpenAPI
url: openapi/lucra-sports-locations-api-openapi.yml
- type: Documentation
url: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
- type: APIReference
url: https://forge.lucrasports.com/docs/
- type: Console
url: https://forge.lucrasports.com/docs/
- type: Authentication
url: authentication/lucra-sports-authentication.yml
- type: ErrorCatalog
url: errors/lucra-sports-problem-types.yml
- type: RateLimits
url: rate-limits/lucra-sports-rate-limits.yml
- type: DataModel
url: data-model/lucra-sports-data-model.yml
- type: Webhooks
url: asyncapi/lucra-sports-webhooks.yml
- type: Sandbox
url: sandbox/lucra-sports-sandbox.yml
- aid: lucra-sports:lucra-sports-recreational-games-api
name: Lucra Sports Recreational Games API
description: The Recreational Games API from Lucra Sports — 5 operation(s) for recreational games.
humanURL: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
baseURL: https://forge.lucrasports.com
tags:
- Recreational Games
properties:
- type: OpenAPI
url: openapi/lucra-sports-recreational-games-api-openapi.yml
- type: Documentation
url: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
- type: APIReference
url: https://forge.lucrasports.com/docs/
- type: Console
url: https://forge.lucrasports.com/docs/
- type: Authentication
url: authentication/lucra-sports-authentication.yml
- type: ErrorCatalog
url: errors/lucra-sports-problem-types.yml
- type: RateLimits
url: rate-limits/lucra-sports-rate-limits.yml
- type: DataModel
url: data-model/lucra-sports-data-model.yml
- type: Webhooks
url: asyncapi/lucra-sports-webhooks.yml
- type: Sandbox
url: sandbox/lucra-sports-sandbox.yml
- aid: lucra-sports:lucra-sports-states-api
name: Lucra Sports States API
description: The States API from Lucra Sports — 1 operation(s) for states.
humanURL: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
baseURL: https://forge.lucrasports.com
tags:
- States
properties:
- type: OpenAPI
url: openapi/lucra-sports-states-api-openapi.yml
- type: Documentation
url: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
- type: APIReference
url: https://forge.lucrasports.com/docs/
- type: Console
url: https://forge.lucrasports.com/docs/
- type: Authentication
url: authentication/lucra-sports-authentication.yml
- type: ErrorCatalog
url: errors/lucra-sports-problem-types.yml
- type: RateLimits
url: rate-limits/lucra-sports-rate-limits.yml
- type: DataModel
url: data-model/lucra-sports-data-model.yml
- type: Webhooks
url: asyncapi/lucra-sports-webhooks.yml
- type: Sandbox
url: sandbox/lucra-sports-sandbox.yml
- aid: lucra-sports:lucra-sports-tenanttaggroups-api
name: Lucra Sports Tenant Tag Groups API
description: The TenantTagGroups API from Lucra Sports — 4 operation(s) for tenanttaggroups.
humanURL: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
baseURL: https://forge.lucrasports.com
tags:
- TenantTagGroups
properties:
- type: OpenAPI
url: openapi/lucra-sports-tenanttaggroups-api-openapi.yml
- type: Documentation
url: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
- type: APIReference
url: https://forge.lucrasports.com/docs/
- type: Console
url: https://forge.lucrasports.com/docs/
- type: Authentication
url: authentication/lucra-sports-authentication.yml
- type: ErrorCatalog
url: errors/lucra-sports-problem-types.yml
- type: RateLimits
url: rate-limits/lucra-sports-rate-limits.yml
- type: DataModel
url: data-model/lucra-sports-data-model.yml
- type: Webhooks
url: asyncapi/lucra-sports-webhooks.yml
- type: Sandbox
url: sandbox/lucra-sports-sandbox.yml
- aid: lucra-sports:lucra-sports-tournaments-api
name: Lucra Sports Tournaments API
description: "Modular tournament management endpoints. Unlike the legacy API which returns everything in a single call,\n\
the v2 API separates concerns into dedicated resources:\n\n| Resource | Path | Purpose |\n|----------|------|---------|\n\
| **Tournaments** | `/tournaments` | CRUD operations, cancel, complete |\n| **Leaderboard** | `/tournaments/:id/leaderboard`\
\ | Paginated participant rankings and scores |\n| **Rewards** | `/tournaments/:id/rewards` | Prize tier configuration\
\ and winner assignment |\n\n---\n\n## Key Differences from Legacy API\n\n### Separate Resources\nThe legacy `GET /pool-tournament/:id`\
\ returns the tournament, reward structure, and full user leaderboard in one response.\nThe v2 API splits these into three\
\ independent endpoints so clients only fetch what they need.\n\n### Update and Complete are Separate\nThe legacy complete\
\ endpoint accepts tournament field updates (title, fee, etc.) in the same request body as the completion action.\nIn\
\ v2, update the tournament first via `PATCH /tournaments/:id`, then complete via `POST /tournaments/:id/complete`.\n\n\
### Reward Assignment is Explicit\nThe legacy complete endpoint accepts a `paymentStructure` with `userId` to assign winners\
\ and complete in one step.\nIn v2, assign rewards first via `PUT /tournaments/:id/rewards`, then complete the tournament\
\ separately.\n\n---\n\n## Tournament Types\n\n### CASH_FIXED\nPrize pool is defined upfront. Values in the reward tiers\
\ represent absolute monetary amounts.\n\n### CASH_PERCENTAGE\nPrize pool is calculated from total entry fees. Values\
\ in reward tiers represent percentages that must sum to exactly 100.\n\n---\n\n## Sign-Up Window\n\nTournaments can optionally\
\ define a sign-up window using `signUpStart` and `signUpEnd`.\nWhen set, participants can only join during this window.\
\ If omitted, sign-ups follow the\ndefault behavior (open from creation until the tournament expires).\n\n| Constraint\
\ | Rule |\n|-----------|------|\n| `signUpEnd` ≤ `expiresAt` | Sign-ups must close before tournament expiration |\n|\
\ `signUpStart` < `signUpEnd` | Window must have a positive duration |\n\n---\n\n## Simplified Status Model\n\nThe v2\
\ API exposes three statuses instead of the full internal status set:\n\n| Status | Meaning |\n|--------|---------|\n\
| `ACTIVE` | Tournament is open or in progress |\n| `COMPLETED` | Tournament is closed and rewards distributed |\n| `CANCELED`\
\ | Tournament was canceled and participants refunded |\n\n---\n\n## Pagination\n\nList endpoints (`GET /tournaments`,\
\ `GET /tournaments/:id/leaderboard`) support pagination via query parameters:\n\n| Parameter | Type | Default | Description\
\ |\n|-----------|------|---------|-------------|\n| `limit` | number | 25 | Number of items per page (1–100) |\n| `offset`\
\ | number | 0 | Number of items to skip |\n\nThe response body is a **flat array** of items. Pagination metadata is returned\
\ in the `Link` HTTP header following [RFC 5988](https://tools.ietf.org/html/rfc5988).\n\n**Example response headers:**\n\
\n```\nLink: </api/tournaments?limit=25&offset=25>; rel=\"next\", </api/tournaments?limit=25&offset=0>; rel=\"first\"\n\
```\n\n**Available link relations:**\n\n| Rel | Description |\n|-----|-------------|\n| `next` | Next page of results\
\ (omitted on the last page) |\n| `prev` | Previous page of results (omitted on the first page) |\n| `first` | First page\
\ of results |\n\n**Parsing the Link header:**\n\n```typescript\nfunction parseLinkHeader(header: string): Record<string,\
\ string> {\n return Object.fromEntries(\n header.split(', ').map((part) => {\n const [url, rel] = part.split(';\
\ ');\n return [\n rel.replace('rel=\"', '').replace('\"', ''),\n url.slice(1, -1),\n ];\n \
\ }),\n );\n}\n\n// Usage\nconst links = parseLinkHeader(response.headers.link);\nif (links.next) {\n // fetch next\
\ page\n}\n```"
humanURL: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
baseURL: https://forge.lucrasports.com
tags:
- Tournaments
properties:
- type: OpenAPI
url: openapi/lucra-sports-tournaments-api-openapi.yml
- type: Documentation
url: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
- type: APIReference
url: https://forge.lucrasports.com/docs/
- type: Console
url: https://forge.lucrasports.com/docs/
- type: Authentication
url: authentication/lucra-sports-authentication.yml
- type: ErrorCatalog
url: errors/lucra-sports-problem-types.yml
- type: RateLimits
url: rate-limits/lucra-sports-rate-limits.yml
- type: DataModel
url: data-model/lucra-sports-data-model.yml
- type: Webhooks
url: asyncapi/lucra-sports-webhooks.yml
- type: Sandbox
url: sandbox/lucra-sports-sandbox.yml
- aid: lucra-sports:lucra-sports-tournaments-legacy-api
name: Lucra Sports Tournaments (Legacy) API
description: "Drop-in replacement endpoints for the original tournament API operations.\nRequest/response shapes are identical.\n\
\n---\n\n## Tournament Types\n\n### CASH_FIXED\n\nThe total prize pool is defined upfront and has no relation to the amount\
\ collected from buy-ins.\n\n- Reward amounts are fixed regardless of how many participants join\n- The tenant bears the\
\ financial risk — if insufficient participants join, the tenant may pay out more in prizes than collected in entry fees\n\
- Prize values in `paymentStructure` represent absolute monetary amounts\n\n### CASH_PERCENTAGE\n\nThe prize pool is calculated\
\ from the total amount collected from entry fees, distributed according to percentage allocations.\n\n- The `value` in\
\ `paymentStructure` represents a percentage (e.g., 60 for 60%)\n- **The sum of all percentage values must equal exactly\
\ 100**\n- Actual payout amounts are calculated after fees are deducted from the collected pool\n\n**Payout Calculation:**\n\
\n```\nPool Net Amount = MAX((Total Collected - Fee%), Min Payout Amount)\nPrize Amount = Pool Net Amount × (Tier Percentage\
\ ÷ 100)\n```\n\n---\n\n## Replayable Tournaments\n\nReplayable tournaments allow participants to join the same tournament\
\ multiple times, submitting new scores in an attempt to improve their standing. Each time a user rejoins, they pay the\
\ buy-in amount again (if applicable) and start a new attempt.\n\n| Attribute | Type | Default | Description |\n|-----------|------|---------|-------------|\n\
| `maxAttempts` | number | 1 | Maximum number of times a user can join/rebuy |\n| `attemptFinished` | boolean | false\
\ | When submitting scores, marks the attempt as completed |\n| `omitAttemptCompletedCheck` | boolean | false | If true,\
\ allows rebuys even when the current attempt is not finished |\n\n**How It Works:**\n\n1. **Initial Entry** — Users join\
\ by paying the buy-in amount (first attempt)\n2. **Submitting Scores** — While an attempt is active, users can submit/update\
\ scores. Set `attemptFinished: true` to lock the attempt\n3. **Rebuying** — Users can rejoin if they haven't reached\
\ `maxAttempts` and their current attempt is finished (unless `omitAttemptCompletedCheck: true`)\n4. **Leaderboard** —\
\ The user's best score across all attempts determines their final position\n\nUse the `canSubmitNewScore` field in the\
\ leaderboard response to check if a user can submit scores or needs to rebuy.\n\n---\n\n## Position and Ranking\n\n|\
\ Field | Type | Description |\n|-------|------|-------------|\n| `position` | number | Automatically calculated rank\
\ based on scores (1, 2, 3, …) |\n| `positionOverride` | number | Optional manual position that overrides automatic ranking\
\ for reward distribution |\n\n**Automatic Position** is calculated based on scores and `scoringType` (`HIGHEST_SCORE`\
\ or `LOWEST_SCORE`). Always unique — no ties.\n\n**Position Override** uses rank-based logic that handles ties (1, 2,\
\ 2, 4, …). Can also be manually set during tournament completion. Returns `null` when it equals `position`.\n\nWhen completing\
\ without specifying winners (auto-complete), the system:\n1. Sorts users by score according to `scoringType`\n2. Calculates\
\ `position` using sequential numbering (1, 2, 3, …)\n3. Calculates override position handling ties (1, 2, 2, 4, …)\n\
4. Sets `positionOverride` to non-null only when it differs from `position`\n5. Distributes rewards based on final positions\n\
\n**Best Practice:** Always use `positionOverride ?? position` to display a user's final ranking.\n\n---\n\n## Scoring\
\ Types\n\n- **HIGHEST_SCORE** — Higher scores rank better (e.g., points-based games)\n- **LOWEST_SCORE** — Lower scores\
\ rank better (e.g., golf, racing)\n\n---\n\n## Sign-Up Window\n\nTournaments can optionally define a sign-up window using\
\ `signUpStart` and `signUpEnd`.\nWhen set, participants can only join during this window. If omitted, sign-ups follow\
\ the\ndefault behavior (open from creation until the tournament expires).\n\n| Constraint | Rule |\n|-----------|------|\n\
| `signUpEnd` ≤ `expiresAt` | Sign-ups must close before tournament expiration |\n| `signUpStart` < `signUpEnd` | Window\
\ must have a positive duration |\n\n---\n\n## Tournament Lifecycle\n\n```\nOPEN → CONFIRMED → CLOSED\n ↓ ↓\n\
\ CANCELED ← ←\n```"
humanURL: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
baseURL: https://forge.lucrasports.com
tags:
- Tournaments (Legacy)
properties:
- type: OpenAPI
url: openapi/lucra-sports-tournaments-legacy-api-openapi.yml
- type: Documentation
url: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
- type: APIReference
url: https://forge.lucrasports.com/docs/
- type: Console
url: https://forge.lucrasports.com/docs/
- type: Authentication
url: authentication/lucra-sports-authentication.yml
- type: ErrorCatalog
url: errors/lucra-sports-problem-types.yml
- type: RateLimits
url: rate-limits/lucra-sports-rate-limits.yml
- type: DataModel
url: data-model/lucra-sports-data-model.yml
- type: Webhooks
url: asyncapi/lucra-sports-webhooks.yml
- type: Sandbox
url: sandbox/lucra-sports-sandbox.yml
- aid: lucra-sports:lucra-sports-user-score-api
name: Lucra Sports User Score API
description: The User Score API from Lucra Sports — 1 operation(s) for user score.
humanURL: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
baseURL: https://forge.lucrasports.com
tags:
- User Score
properties:
- type: OpenAPI
url: openapi/lucra-sports-user-score-api-openapi.yml
- type: Documentation
url: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
- type: APIReference
url: https://forge.lucrasports.com/docs/
- type: Console
url: https://forge.lucrasports.com/docs/
- type: Authentication
url: authentication/lucra-sports-authentication.yml
- type: ErrorCatalog
url: errors/lucra-sports-problem-types.yml
- type: RateLimits
url: rate-limits/lucra-sports-rate-limits.yml
- type: DataModel
url: data-model/lucra-sports-data-model.yml
- type: Webhooks
url: asyncapi/lucra-sports-webhooks.yml
- type: Sandbox
url: sandbox/lucra-sports-sandbox.yml
- aid: lucra-sports:lucra-sports-webhooks-api
name: Lucra Sports Webhooks API
description: "Manage webhook configurations to receive real-time event notifications via HTTP POST requests.\n\n---\n\n\
## Available Event Types\n\n| Event | Description |\n|-------|-------------|\n| `UserSignedUp` | New user registration\
\ |\n| `UserKYCVerified` | User KYC verification completed |\n| `FundsDeposited` | User deposited funds |\n| `C2CWithdrawal`\
\ | Convert-to-credit withdrawal initiated |\n| `TournamentCreated` | Tournament created |\n| `TournamentCanceled` | Tournament\
\ canceled |\n| `TournamentCompleted` | Tournament completed |\n| `TournamentCompletionFailed` | Tournament completion\
\ failed (async processing error). Payload contains `failure: { code, reason, requestId, attempt, willRetry }`. `willRetry:\
\ false` is terminal — subscribe to be notified when a completion request cannot be processed. |\n| `TournamentComplianceLimitExceeded`\
\ | Tournament completion placed on hold due to compliance payout limit |\n| `TournamentEdited` | Tournament modified\
\ |\n| `TournamentUserJoined` | User joined tournament |\n| `ScoreIngestionFailed` | Score ingestion failed (async processing\
\ error). Payload contains `failure: { code, reason, requestId, attempt, willRetry }`. `willRetry: false` is terminal\
\ — subscribe to be notified when a score submission cannot be processed. |\n| `RecreationalGameCreated` | Recreational\
\ game created |\n| `RecreationalGameJoined` | User joined recreational game |\n| `RecreationalGameCanceled` | Recreational\
\ game canceled |\n| `RecreationalGameCompleted` | Recreational game completed |\n| `RecreationalGameStarted` | Recreational\
\ game started |\n| `RecreationalGameCompletionFailed` | Recreational game completion failed (async processing error).\
\ Payload contains `failure: { code, reason, requestId, attempt, willRetry }`. `willRetry: false` is terminal — subscribe\
\ to be notified when a completion request cannot be processed. |\n\n---\n\n## Event Payloads\n\nAll events include an\
\ `event` field identifying the type. The remaining fields depend on the event.\n\n### Tournament Events\n\nApplies to:\
\ `TournamentCreated`, `TournamentEdited`, `TournamentCanceled`, `TournamentCompleted`, `TournamentUserJoined`, `TournamentComplianceLimitExceeded`\n\
\n```json\n{\n \"event\": \"TournamentCreated\",\n \"tenantId\": \"YOUR_TENANT_ID\",\n \"matchup\": { }\n}\n```\n\n\
The `matchup` object matches the legacy tournament response shape (equivalent to the legacy `GET /api/rest/pool-tournament/{id}`)\n\
\n**Additional fields by event:**\n\n| Event | Extra Fields |\n|-------|-------------|\n| `TournamentCompleted` | `mode`:\
\ `\"auto\"` | `\"manual\"` | `\"admin\"` — how winners were determined |\n| `TournamentUserJoined` | `newUserId`: UUID\
\ of the user who joined; `userMetadata`: their metadata |\n| `TournamentComplianceLimitExceeded` | `complianceLimits`:\
\ compliance threshold details |\n\n**Failure events** — `TournamentCompletionFailed`, `ScoreIngestionFailed`:\n\n```json\n\
{\n \"event\": \"TournamentCompletionFailed\",\n \"tenantId\": \"YOUR_TENANT_ID\",\n \"entityId\": \"uuid\",\n \"\
failure\": {\n \"code\": \"COMPLETION_FAILED\",\n \"reason\": \"Human-readable description\",\n \"requestId\"\
: \"uuid\",\n \"attempt\": 1,\n \"willRetry\": true\n }\n}\n```\n\n`willRetry: false` is terminal — no further\
\ delivery attempts will be made.\n\n---\n\n### Recreational Games Events\n\nApplies to: `RecreationalGameCreated`, `RecreationalGameJoined`,\
\ `RecreationalGameCanceled`, `RecreationalGameCompleted`, `RecreationalGameStarted`\n\n```json\n{\n \"event\": \"RecreationalGameCreated\"\
,\n \"id\": \"uuid\",\n \"createdByUserId\": \"uuid\",\n \"gameId\": \"external-game-id\",\n \"status\": \"OPEN\"\
,\n \"type\": \"RECREATIONAL_GAME\",\n \"subtype\": \"GROUP_VS_GROUP\",\n \"buyInAmount\": 10,\n \"isPublic\": true,\n\
\ \"winnerGroupId\": null,\n \"metadata\": null,\n \"groups\": [\n {\n \"groupId\": \"uuid\",\n \"name\"\
: \"Team Alpha\",\n \"users\": [\n {\n \"userId\": \"uuid\",\n \"userMetadata\": {},\n \
\ \"reward\": {\n \"type\": \"CASH\",\n \"value\": \"20.00\",\n \"metadata\"\
: null\n }\n }\n ]\n }\n ]\n}\n```\n\n`reward.type` is `\"CASH\"` for buy-in games or `\"TENANT_REWARD\"\
` for reward-based games.\n\n`RecreationalGameJoined` includes an additional `joinedByUserId` field with the UUID of the\
\ user who joined.\n\n**Failure events** — `RecreationalGameCompletionFailed`, `ScoreIngestionFailed`:\n\n```json\n{\n\
\ \"event\": \"RecreationalGameCompletionFailed\",\n \"tenantId\": \"YOUR_TENANT_ID\",\n \"entityId\": \"uuid\",\n\
\ \"failure\": {\n \"code\": \"COMPLETION_FAILED\",\n \"reason\": \"Human-readable description\",\n \"requestId\"\
: \"uuid\",\n \"attempt\": 1,\n \"willRetry\": true\n }\n}\n```\n\n`willRetry: false` is terminal — no further\
\ delivery attempts will be made.\n\n---\n\n## Configuration Limits\n\n- **Maximum 5 webhook configurations** per account\n\
- **Single-instance subscriptions**: Some events (e.g., `C2CWithdrawal`) can only exist in one configuration at a time\n\
- **Custom headers**: Optional headers added to each webhook request\n- **Expiration**: Optionally set an expiration date\
\ for time-limited webhooks\n\n---\n\n## Request Verification\n\nAll webhook requests include an `X-Lucra-Signature` header\
\ containing an HMAC-SHA256 signature for payload verification.\n\n**Signature format:**\n\n```\nX-Lucra-Signature: sha256=<hex-encoded-signature>\n\
```\n\n**Verification steps:**\n\n1. Extract signature from the `X-Lucra-Signature` header\n2. Capture the raw request\
\ body (before JSON parsing)\n3. Compute HMAC-SHA256 of the raw body using your sign secret\n4. Compare computed signature\
\ with received signature using constant-time comparison\n\n**Node.js example:**\n\n```typescript\nimport crypto from\
\ 'crypto';\n\nfunction verifyWebhookSignature(\n rawBody: Buffer, signature: string, secret: string\n): boolean {\n\
\ if (!signature.startsWith('sha256=')) return false;\n const received = signature.substring(7);\n const computed =\
\ crypto\n .createHmac('sha256', secret)\n .update(rawBody)\n .digest('hex');\n if (received.length !== computed.length)\
\ return false;\n return crypto.timingSafeEqual(\n Buffer.from(received), Buffer.from(computed)\n );\n}\n```\n\n\
---\n\n## Security Best Practices\n\n- **Use raw body** — verify signature against the raw request body before parsing\
\ JSON\n- **Constant-time comparison** — use timing-safe comparison functions to prevent timing attacks\n- **Secure secret\
\ storage** — store sign secrets in environment variables or secret managers\n- **HTTPS only** — only accept webhooks\
\ over HTTPS\n- **Idempotency** — handle duplicate webhook deliveries gracefully"
humanURL: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
baseURL: https://forge.lucrasports.com
tags:
- Webhook
tags_raw:
- Webhooks
properties:
- type: OpenAPI
url: openapi/lucra-sports-webhooks-api-openapi.yml
- type: Documentation
url: https://docs.lucrasports.com/lucra-sdk/sdks-and-apis/api-reference
- type: APIReference
url: https://forge.lucrasports.com/docs/
- type: Console
url: https://forge.lucrasports.com/docs/
- type: Authentication
url: authentication/lucra-sports-authentication.yml
- type: ErrorCatalog
url: errors/lucra-sports-problem-types.yml
- type: RateLimits
url: rate-limits/lucra-sports-rate-limits.yml
- type: DataModel
url: data-model/lucra-sports-data-model.yml
- type: Webhooks
url: asyncapi/lucra-sports-webhooks.yml
- type: Sandbox
url: sandbox/lucra-sports-sandbox.yml
maintainers:
- FN: Kin Lane
email: kin@apievangelist.com
- FN: APIs.json
email: info@apis.io
common:
- type: CapabilityMap
url: capabilities/lucra-sports-capability-edges.yml
name: Lucra Sports Business Capability Map
- type: Overlay
url: overlays/lucra-sports-forge-overlay.yaml
- type: Website
url: https://www.playlucra.com/
- type: DeveloperPortal
url: https://docs.lucrasports.com/lucra-sdk
- type: Documentation
url: https://docs.lucrasports.com/lucra-sdk/readme
- type: APIReference
url: https://forge.lucrasports.com/docs/
- type: GettingStarted
url: https://docs.lucrasports.com/lucra-sdk/games-you-play-gyp/gyp-sdks
- type: GitHubOrganization
url: https://github.com/Lucra-Sports
- type: Support
url: https://www.playlucra.com/contact
- type: HelpCenter
url: https://www.playlucra.com/faq
- type: Blog
url: https://www.playlucra.com/newsroom
- type: SignUp
url: https://www.playlucra.com/contact
- type: TermsOfService
url: https://www.playlucra.com/legal/terms-of-service
- type: PrivacyPolicy
url: https://www.playlucra.com/legal/privacy-policy
- type: ResponsibleGaming
url: https://www.playlucra.com/legal/responsible-gaming
- type: CaseStudies
url: https://www.playlucra.com/case-studies
- type: Plans
url: plans/lucra-sports-plans-pricing.yml
- type: RateLimits
url: rate-limits/lucra-sports-rate-limits.yml
- type: Packages
url: packages/lucra-sports-packages.yml
- type: SDKs
url: packages/lucra-sports-packages.yml
- type: LLMsTxt
url: llms/lucra-sports-llms.txt
- type: AgentSkill
url: skills/_index.yml
- type: MCPServer
url: mcp/lucra-sports-mcp.yml
- type: ToolCrosswalk
url: mcp/lucra-sports-tool-crosswalk.yml
- type: Conventions
url: conventions/lucra-sports-conventions.yml
- type: Conformance
url: conformance/lucra-sports-conformance.yml
- type: Compliance
url: conformance/lucra-sports-conformance.yml
- type: Lifecycle
url: lifecycle/lucra-sports-lifecycle.yml
- type: ChangeLog
url: changelog/lucra-sports-changelog.yml
- type: Components
url: components/lucra-sports-components.yml
- type: DataModel
url: data-model/lucra-sports-data-model.yml
- type: Sandbox
url: sandbox/lucra-sports-sandbox.yml
- type: ErrorCatalog
url: errors/lucra-sports-problem-types.yml
- type: Webhooks
url: asyncapi/lucra-sports-webhooks.yml
- type: Authentication
url: authentication/lucra-sports-authentication.yml
- type: DomainSecurity
url: security/lucra-sports-domain-security.yml
x-enrichment:
date: '2026-08-25'
status: enriched
artifacts_added: 31
pass: local-v1
Every provider here is available over the APIs.io API and to AI agents over MCP.