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
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.
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
accessModel:
pricing: unknown
onboarding: unknown
trial: false
try_now: false
public: false
label: Unknown
confidence: low
source:
- authentication
- rate-limits
- security
- sandbox
generated: '2026-09-03'
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:
- Location
tags_raw:
- 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: X-MCPServerCandidate
url: mcp/lucra-sports-mcp.yml
note: 'Renamed from MCPServer 2026-09-03 (roadmap#247): the manifest self-describes as status: candidate — a tool list derived
from the published API contracts, not an existing server. The scorer already read the manifest and reported mcp_server
correctly; the MCPServer type was crediting the artifact-type surfaces with a server that does not exist.'
- 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.