How AI is applied across API Evangelist and APIs.io. Read my AI disclosure →
API Evangelist API Evangelist
Discovery
Learnings
Guidance
Toolbox
Alignment
API Evangelist LLC

Lucra Sports Webhooks API

Manage webhook configurations to receive real-time event notifications via HTTP POST requests.---## Available Event Types| Event | Description ||-------|-------------|| `UserSignedUp` | New user registration || `UserKYCVerified` | User KYC verification completed || `FundsDeposited` | User deposited funds || `C2CWithdrawal` | Convert-to-credit withdrawal initiated || `TournamentCreated` | Tournament created || `TournamentCanceled` | Tournament canceled || `TournamentCompleted` | Tournament completed || `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. || `TournamentComplianceLimitExceeded` | Tournament completion placed on hold due to compliance payout limit || `TournamentEdited` | Tournament modified || `TournamentUserJoined` | User joined tournament || `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. || `RecreationalGameCreated` | Recreational game created || `RecreationalGameJoined` | User joined recreational game || `RecreationalGameCanceled` | Recreational game canceled || `RecreationalGameCompleted` | Recreational game completed || `RecreationalGameStarted` | Recreational game started || `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. |---## Event PayloadsAll events include an `event` field identifying the type. The remaining fields depend on the event.### Tournament EventsApplies to: `TournamentCreated`, `TournamentEdited`, `TournamentCanceled`, `TournamentCompleted`, `TournamentUserJoined`, `TournamentComplianceLimitExceeded````json{ "event": "TournamentCreated", "tenantId": "YOUR_TENANT_ID", "matchup": { }}```The `matchup` object matches the legacy tournament response shape (equivalent to the legacy `GET /api/rest/pool-tournament/{id}`)**Additional fields by event:**| Event | Extra Fields ||-------|-------------|| `TournamentCompleted` | `mode`: `"auto"` | `"manual"` | `"admin"` — how winners were determined || `TournamentUserJoined` | `newUserId`: UUID of the user who joined; `userMetadata`: their metadata || `TournamentComplianceLimitExceeded` | `complianceLimits`: compliance threshold details |**Failure events** — `TournamentCompletionFailed`, `ScoreIngestionFailed`:```json{ "event": "TournamentCompletionFailed", "tenantId": "YOUR_TENANT_ID", "entityId": "uuid", "failure": { "code": "COMPLETION_FAILED", "reason": "Human-readable description", "requestId": "uuid", "attempt": 1, "willRetry": true }}````willRetry: false` is terminal — no further delivery attempts will be made.---### Recreational Games EventsApplies to: `RecreationalGameCreated`, `RecreationalGameJoined`, `RecreationalGameCanceled`, `RecreationalGameCompleted`, `RecreationalGameStarted````json{ "event": "RecreationalGameCreated", "id": "uuid", "createdByUserId": "uuid", "gameId": "external-game-id", "status": "OPEN", "type": "RECREATIONAL_GAME", "subtype": "GROUP_VS_GROUP", "buyInAmount": 10, "isPublic": true, "winnerGroupId": null, "metadata": null, "groups": [ { "groupId": "uuid", "name": "Team Alpha", "users": [ { "userId": "uuid", "userMetadata": {}, "reward": { "type": "CASH", "value": "20.00", "metadata": null } } ] } ]}````reward.type` is `"CASH"` for buy-in games or `"TENANT_REWARD"` for reward-based games.`RecreationalGameJoined` includes an additional `joinedByUserId` field with the UUID of the user who joined.**Failure events** — `RecreationalGameCompletionFailed`, `ScoreIngestionFailed`:```json{ "event": "RecreationalGameCompletionFailed", "tenantId": "YOUR_TENANT_ID", "entityId": "uuid", "failure": { "code": "COMPLETION_FAILED", "reason": "Human-readable description", "requestId": "uuid", "attempt": 1, "willRetry": true }}````willRetry: false` is terminal — no further delivery attempts will be made.---## Configuration Limits- **Maximum 5 webhook configurations** per account- **Single-instance subscriptions**: Some events (e.g., `C2CWithdrawal`) can only exist in one configuration at a time- **Custom headers**: Optional headers added to each webhook request- **Expiration**: Optionally set an expiration date for time-limited webhooks---## Request VerificationAll webhook requests include an `X-Lucra-Signature` header containing an HMAC-SHA256 signature for payload verification.**Signature format:**```X-Lucra-Signature: sha256=```**Verification steps:**1. Extract signature from the `X-Lucra-Signature` header2. Capture the raw request body (before JSON parsing)3. Compute HMAC-SHA256 of the raw body using your sign secret4. Compare computed signature with received signature using constant-time comparison**Node.js example:**```typescriptimport crypto from 'crypto';function verifyWebhookSignature( rawBody: Buffer, signature: string, secret: string): boolean { if (!signature.startsWith('sha256=')) return false; const received = signature.substring(7); const computed = crypto .createHmac('sha256', secret) .update(rawBody) .digest('hex'); if (received.length !== computed.length) return false; return crypto.timingSafeEqual( Buffer.from(received), Buffer.from(computed) );}```---## Security Best Practices- **Use raw body** — verify signature against the raw request body before parsing JSON- **Constant-time comparison** — use timing-safe comparison functions to prevent timing attacks- **Secure secret storage** — store sign secrets in environment variables or secret managers- **HTTPS only** — only accept webhooks over HTTPS- **Idempotency** — handle duplicate webhook deliveries gracefully

Lucra Sports Webhooks API is one of 9 APIs that Lucra Sports publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

Tagged areas include Webhook. The published artifact set on APIs.io includes an OpenAPI specification, API documentation, an API reference, authentication docs, and rate-limit docs.

This API exposes 4 operations across 2 paths, and defines 6 schemas. It is described by OpenAPI 3.2.0, at version 1.0.

Requests are made against 3 base URLs: /, https://forge.lucrasports.com, https://forge.sandbox.lucrasports.com.

4 operations 2 paths 6 schemas 1 DELETE1 GET1 POST1 PUT

Metadata

The identity and technical contract details declared by the specification.

Specification
OpenAPI 3.2.0
API Version
1.0
Base URL
https://forge.lucrasports.com
Authentication
API Key
Resource Areas
1

Authentication & Security 1

Lucra Sports Webhooks API declares 1 security scheme for authenticating requests. An API key is passed in the header as X-Lucra-Api-Key (X-Lucra-Api-Key).

  • X-Lucra-Api-Key — API key for tenant authentication

Paths & Operations 4

Across 2 paths, the API surfaces 4 operations — 1 DELETE, 1 GET, 1 POST, 1 PUT. Each is listed below with its method, path, parameters, and response codes.

Webhooks 4

Manage webhook configurations to receive real-time event notifications via HTTP POST requests. --- Available Event Types | Event | Description | |-------|-------------| | UserSign…

POST
/api/rest/webhook/configs
Create Webhook Configuration
WebhooksController_createWebhook body → 201
GET
/api/rest/webhook/configs
List Webhook Configurations
WebhooksController_listWebhooks → 200
PUT
/api/rest/webhook/configs/{id}
Update Webhook Configuration
WebhooksController_updateWebhook 1 param body → 200404
DELETE
/api/rest/webhook/configs/{id}
Delete Webhook Configuration
WebhooksController_deleteWebhook 1 param → 204404

Schemas 6

The contract defines 6 schemas that model the data the API accepts and returns. The most detailed are WebhookResponseDto (8 properties), WebhookCreateObjectDto (8 properties), WebhookUpdateDto (8 properties), Error (3 properties). Each schema is shown below with its type and property counts.

WebhookCreateDto
object
1 property 1 required
WebhookUpdateDto
object
8 properties
WrappedWebhookResponseDto
object
1 property 1 required
WebhookCreateObjectDto
object
8 properties 2 required
Error
object
3 properties 3 required
WebhookResponseDto
object
8 properties 8 required

Specification

The full machine-readable OpenAPI contract behind this narrative.

Source

lucra-sports-webhooks-api-openapi.yml Raw ↑

Other APIs Lucra Sports publishes across the network.

Lucra Sports Health API
Lucra Sports Locations API
Lucra Sports Recreational Games API
Lucra Sports States API
Lucra Sports Tenant Tag Groups API
Lucra Sports Tournaments API
Lucra Sports Tournaments (Legacy) API
Lucra Sports User Score API
Where this information came from

This is an independent, third-party profile of Lucra Sports Webhooks API, published by API Evangelist. We do not operate, host, resell, or support these APIs, and we are not affiliated with or endorsed by the company unless stated above. Everything here is built from publicly available information — the company's own site, developer portal, documentation, public repositories, and the specifications it publishes for public use. Nothing is obtained by breaching a system, defeating an access control, or using credentials.

The Kin Score and Agent Readiness rating are independently calculated assessments of a company's public API artifacts, scored against a published rubric. They are not certifications, endorsements, security assessments, or audits.

Corrections, re-scores, and removal are free — no partnership or purchase required, and you do not need to justify the request. A removed company is recorded as unrated, never scored zero for having asked. Acknowledgement within one business day; removal within two.

info@apievangelist.com · Read the full data-sourcing policy →
On a security or compliance team? Put security in the subject line and you will get a person, not a form — we will tell you exactly which public URLs this profile was built from.