Event catalog
Every webhook request contains one or more events in a JSON array. Each event
uses the same envelope; eventType determines the shape and meaning of data.
Use this page for the common contract and the summary of supported events. The family pages contain payload examples and reconciliation guidance.
The event object
Section titled “The event object”[ { "id": "example-athlete-updated-event", "topic": "club-100001-events", "subject": "Athletes/300001", "data": { "UserId": 300001 }, "eventType": "Athlete.Updated", "eventTime": "2026-09-07T10:30:00Z", "dataVersion": "1.0", "metadataVersion": null }]The outer value is always an array, even when it contains one event. Current subscriptions request one event per delivery, but consumers must iterate every element so they remain compatible with batching.
| Property | Meaning |
|---|---|
id |
Unique delivery event identifier. Store it with a unique constraint to deduplicate retries. |
topic |
Identifies the club event stream and normally ends with club-<clubId>-events. Lifecycle events may use a different format; treat the complete value as opaque. |
subject |
Logical resource identifier for the event. It is not guaranteed to be a public API path. |
data |
Event-specific payload. Select its schema using eventType. |
eventType |
Case-sensitive discriminator such as Athlete.Updated. |
eventTime |
UTC ISO 8601 timestamp associated with the change. |
dataVersion |
Version of the event-specific data contract. Current Uptivo business events use 1.0. |
metadataVersion |
Webhook envelope version when supplied; it is independent from dataVersion. |
Do not use topic, subject, or event data as proof that a request came from
Uptivo. See
Security and test endpoints
for the current delivery-authentication limitation.
Compatibility rules
Section titled “Compatibility rules”Treat the envelope and data as forward-compatible contracts:
- ignore properties you do not recognize, both in the envelope and in
data; - route known events using the exact, case-sensitive
eventTypevalue; - safely record and acknowledge an unknown event type, then investigate it asynchronously instead of returning a retryable response forever;
- select a parser by both
eventTypeanddataVersionwhen supporting more than one data version; - do not assume JSON property order;
- keep deserializers tolerant of nullable or omitted optional properties.
Adding an optional property does not require a new event type. A breaking
change to the meaning or required structure of data requires a new
dataVersion.
Reconcile event data
Section titled “Reconcile event data”An event tells you that something changed; the authenticated Club API remains the authoritative source for current state.
| Subject pattern | Recommended lookup |
|---|---|
Athletes/{userId} |
GET /Athletes/{userId} |
Athletes/{userId}/Levels |
GET /Athletes/{userId}/EngagementSummary for the current level snapshot. |
Athletes/{userId}/Badges/{achievedBadgeId} |
GET /Athletes/{userId}/EngagementSummary for awards in the athlete’s current local month. |
Contacts/{userId} |
GET /Contacts/{userId} |
Trainings/{trainingId} |
GET /Trainings/{trainingId} |
UserSubscriptions/{userSubscriptionId} |
GET /UserSubscriptions/{userSubscriptionId} |
Classes/{classId}/Participants/{userId} |
GET /Classes/{classId}/Participants/{userId} |
Classes |
Reload the affected class IDs through the appropriate calendar window. |
Subscriptions/{subscriptionId} |
Reload the paginated GET /Subscriptions catalog. |
Subscriptions/{subscriptionId}/Plans |
Reload the product with withPlans=true. |
Do not append subject blindly to the base URL. Some subject names, casing,
and lookup shapes differ from public routes, and deleted resources can no
longer be read.
Uptivo events
Section titled “Uptivo events”Use these exact values in EventTypes when creating or updating a webhook
subscription.
| Event type | Family | Meaning |
|---|---|---|
Athlete.Created |
Athletes | An athlete joined the club. |
Athlete.Updated |
Athletes | Athlete profile or club-specific state changed. |
Athlete.LevelChanged |
Athletes | An athlete’s Uptivo or brand level changed. |
Athlete.Deleted |
Athletes | An athlete left the club or was deleted. |
Contact.Created |
Contacts | A user became a contact of the club. |
Contact.Updated |
Contacts | A user’s profile or club-specific commercial stage was updated. |
Contact.Deleted |
Contacts | A contact relationship ended, including conversion to Athlete. |
Training.Created |
Trainings | A completed training was created. |
Badge.Awarded |
Athletes | An athlete earned a challenge badge. |
UserSubscription.Created |
UserSubscriptions | A product was assigned to an athlete. |
UserSubscription.Updated |
UserSubscriptions | An athlete’s assignment changed. |
UserSubscription.Deleted |
UserSubscriptions | An athlete’s assignment was deleted. |
ClassParticipant.Created |
Class participants | An athlete was booked or queued. |
ClassParticipant.Updated |
Class participants | Participation or queue state changed. |
ClassParticipant.Deleted |
Class participants | Participation was removed. |
Class.Updated |
Classes | One or more classes changed. |
Class.Deleted |
Classes | One or more classes were deleted. |
Class.Published |
Classes | One or more classes were published. |
Class.Unpublished |
Classes | One or more classes were unpublished. |
Subscription.Created |
Subscriptions | A catalog product was created. |
Subscription.Updated |
Subscriptions | A catalog product changed. |
Subscription.Deleted |
Subscriptions | A catalog product was deleted. |
Subscription.Plans.Updated |
Subscriptions | Commercial plans were added, changed, or removed. |
Subscription.Published |
Subscriptions | A product became published. |
Subscription.Unpublished |
Subscriptions | A product became unpublished. |
Only these Uptivo business events are accepted in EventTypes. The lifecycle
events below are sent automatically and must not be added to a subscription
filter.
System events
Section titled “System events”Subscription validation
Section titled “Subscription validation”This event verifies control of the destination while a subscription is being
created or its URL is changed. Return data.validationCode unchanged as
validationResponse, or perform a GET to the supplied validationUrl.
[ { "id": "00000000-0000-0000-0000-000000000101", "topic": "club-100001-events", "subject": "", "data": { "validationCode": "example-validation-code", "validationUrl": "https://example.invalid/eventsubscriptions/example-subscription/validate?token=redacted" }, "eventType": "Microsoft.EventGrid.SubscriptionValidationEvent", "eventTime": "2026-09-07T10:30:00Z", "metadataVersion": "1", "dataVersion": "2" }]The values are intentionally fictitious. Never construct either validation value yourself. See Endpoint validation for the complete handshake and code example.
Subscription deleted
Section titled “Subscription deleted”This lifecycle event indicates that the subscription was deleted and no further business events will be delivered through it.
[ { "id": "00000000-0000-0000-0000-000000000102", "topic": "club-100001-events", "subject": "", "data": { "eventSubscriptionId": "example-webhook-subscription" }, "eventType": "Microsoft.EventGrid.SubscriptionDeletedEvent", "eventTime": "2026-09-07T10:35:00Z", "metadataVersion": "1", "dataVersion": "1" }]Do not confuse this notification with the synchronous 200 OK returned by
DELETE /Webhooks/Subscriptions/{subscriptionId}.