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 API contracts indexed 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.
Regulatory Posture applies to this provider. Its tags matched the
Payments regime, so
Regulatory Posture carries 15 points of the composite.
If this regime is wrong for your business, say so on your
provider repo — the
applicability map is public and we will correct it.
Create-or-Update Ergonomics applies to this provider. This API accepts writes, so it
carries 10 points of the composite. It is scored from the published contracts
themselves: whether a caller can create-or-update in one call, whether the write accepts a key the caller already
holds, and whether the response says which branch ran. Without that, every write needs a search-and-branch in
front of it, and the first time that check is skipped a duplicate record is created.
Scored against the observed mean rather than raw — a provider at the catalog average is unchanged by this facet,
not penalised by it.
The six quality facets above are damped to 75 points between them,
because the conditional facet above carries the other
25. That is why each facet's contribution is shown against a damped
maximum: raising a quality facet moves the composite by 75% of its nominal
weight, not 100%. The full arithmetic is at apis.io/rating/.
Show this score on your site.
It updates itself when the score changes. Paste this where you link to your API docs:
<a href="https://apis.io/providers/lucra-sports/"><img src="https://apis.io/badge/lucra-sports/card.svg" alt="Lucra Sports on APIs.io — Kin Score by API Evangelist"></a>
Other styles, a README pill and a shields.io endpoint are on the badge page.
Raise your score.
Agent readiness — checks not met, largest first (exact, from this profile):
MCP Server+12 pts — deployment.mode + probe verdict on the mcp/ manifest, not the pointer; an unprobed slug falls back to authorship
Idempotency+9 pts — OpenAPI mutating operations declare an idempotency key — a header, a request-body property, or a named de-duplication token whose own description says so (verified); else common[].type matches /idempoten/i (documented)
A2A Agent Card+8 pts — a2a/-a2a.yml manifest, graded on conformance.grade against A2A 1.0.0
Delegated User Identity+6 pts — a served discovery document listing authorization_code in grant_types_supported (served), else an oauth2 authorizationCode flow or openIdConnect declared in an OpenAPI (documented)
5 more unmet checks in the Agent Readiness table above.
Kin Score — facets with the most composite points still available (weight × headroom):
Access Clarityscores 42.1 — up to +11.6 composite points
The Kin Score Market layer reads a provider inside its market:
its position, and how deep its integrations go. Depth is only comparable within a position. Provisional and unweighted:
not part of the Kin Score or agent readiness.
Registered MCP server and declares compatibility are report only — not weighted.
Undeclared means we found nothing we can read, so there is no number: we never infer integrations.
Standards this provider implements or carries. De facto ones are profiled and measured by the API Commons; formal ones come from the standards directory and are linked by the provider's own tags. The evidence column says how each claim was established — not that it was made.
Modular tournament management endpoints. Unlike the legacy API which returns everything in a single call, the v2 API separates concerns into dedicated resources: | Resource | Pa...
Drop-in replacement endpoints for the original tournament API operations. Request/response shapes are identical. --- ## Tournament Types ### CASH_FIXED The total prize pool is d...
Overlays applied on top of this provider's contracts. Each card says who wrote it: a document the provider publishes, or one API Evangelist derived or generated.
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'
x-docs-platform: gitbook
x-docs-platform-confidence: high
x-docs-platform-checked: 2026-10-03
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
Lucra Sports API — frequently asked questions
Does Lucra Sports have an API?
Yes. APIs.io lists 9 APIs from Lucra Sports, including Lucra Sports Health API, Lucra Sports Locations API and Lucra Sports Recreational Games API, and 6 more.
Is there an OpenAPI specification for the Lucra Sports API?
Yes. APIs.io indexes 9 OpenAPI specifications for Lucra Sports, each linked for download from this page.
How do I authenticate with the Lucra Sports API?
Lucra Sports uses bearer-token authentication (apiKey · 2 schemes). The details are profiled on APIs.io as Lucra Sports Authentication.
Is the Lucra Sports API ready for AI agents?
Lucra Sports has a Kin Score of 53.5 out of 100 (developing) and an Agent Readiness score of 40.1 (agent-ready), scored by API Evangelist on 2026-11-01.
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.