Skip to content

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.

[
{
"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.

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 eventType value;
  • safely record and acknowledge an unknown event type, then investigate it asynchronously instead of returning a retryable response forever;
  • select a parser by both eventType and dataVersion when 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.

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.

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.

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.

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}.