SSO Data Sharer Webhook

Real-time information about SSO users can be pushed to a third party system via the data sharer webhooks described in this document.

Introduction

This service notifies an external third party system about users, sharing information such as user details and contact preferences etc. Third parties can then use this to ingest data about SSO users and keep user details up to date. This service will share updates whenever a user performs an action, e.g. when they update their first name or opt in or out of a contact method.

The service can be configured to point to a given endpoint, along with a secured key which can be used to identify and validate the request. The JSON body detailed below will be sent to this endpoint whenever the user updates their SSO account.

Example

An example webhook request for a configured service. All webhooks requests will contain the full user profile, regardless of what was changed.

FieldTypeDefinition
idNumberThe user's unique SSO ID
versionNumberThe model version for this webhook payload
recordRevokedBooleanTrue if the user has requested their account be deleted under GDPR. You must either delete the user record from your system or remove all PII data associated with this user's SSO ID.
clientIdStringThe ID associated with this client e.g. CORTEX
registerMetadata.registerSourceStringThe source location the user first registered
registerMetadata.registerTypeStringThe type of registration
registerMetadata.registerPlatformStringThe platform the user registered on
userProfile.idNumberThe user's unique SSO ID
userProfile.emailStringThe user's email address
userProfile.emailVerifiedBooleanTrue if the user's email is verified - false otherwise
userProfile.guardianEmailStringThe email address of their guardian if the user is a minor
userProfile.minorIdStringIf the user is a minor this is their username/nickname
userProfile.firstNameStringThe user's first name
userProfile.otherNamesStringThe user's middle name
userProfile.lastNameStringThe user's last name
userProfile.titleStringThe user's title, e.g. Mr, Mrs, Dr
userProfile.birthDateISO 8601 DatetimeThe user's date of birth
userProfile.genderStringThe user's gender. Based on RFC 6350: M = Male, F = Female, O = Other, N = None or not applicable, U = Unknown
userProfile.address1StringThe user's address line 1
userProfile.address2StringThe user's address line 2
userProfile.townStringThe user's town
userProfile.regionStringThe user's region / county
userProfile.countryStringThe user's country
userProfile.postcodeStringThe user's postcode
userProfile.contactNumberStringThe user's phone number
userProfile.screenNameStringThe user's screen name / display name
userProfile.screenNameApprovedBooleanTrue if the user's screen name has been approved through moderation
userProfile.profilePictureStringURL to the user's profile picture
userProfile.profilePictureApprovedBooleanTrue if the user's profile picture has been approved through moderation
userProfile.companyNameStringThe user's company name
userProfile.companyPhoneNumberStringThe user's company phone number
userProfile.companyAddressOneStringThe user's company address line 1
userProfile.companyAddressTwoStringThe user's company address line 2
userProfile.companyTownStringThe user's company town
userProfile.companyCountryStringThe user's company country
userProfile.companyPostcodeStringThe user's company postcode
userProfile.lastUpdatedISO 8601 DatetimeThe last time the user updated their profile information
userProfile.createdAtISO 8601 DatetimeThe date and time the user created their SSO account
userProfile.metadataJSONUnstructured JSON object that contains additional information about the user, for example: "metadata": { "object": {}, "key": "value", "number": 1, "array": [1, "value"], "boolean": false }
userProfile.suspensionObjectIf the user's account has been suspended this field will contain information about it. If the user is not suspended then this field will be null.
userProfile.suspension.typeStringThe type of account suspension
userProfile.suspension.expiresAtISO 8601 DatetimeThe date and time this suspension will elapse. If null this account is suspended indefinitely.
userProfile.suspension.reasonStringA free text field providing additional context for suspension reason. This field can be null.
userProfile.passwordResetBooleanTrue if the user has reset their password. This field may be absent if no password reset has occurred.
userProfile.lastPasswordResetISO 8601 DatetimeThe date and time of the user's most recent password reset. Only present if a password reset has occurred.
userProfile.firstLoginISO 8601 DatetimeThe date and time the user first logged in
userProfile.lastLoginISO 8601 DatetimeThe date and time the user most recently logged in
clientPreferencesArrayThis contains the list of account preferences available to the user
clientPreferences.clientIdStringThe ID associated with this client i.e. CORTEX
clientPreferences.nameStringThe display name of the preference
clientPreferences.descriptionStringThe description of the preference
clientPreferences.keyStringThe unique key for this preference. Note: this is unique per client ID, not per user.
clientPreferences.setBooleanIf true this indicates that the user has responded to this preference. This is useful for some preferences where the user is not obliged to select an option i.e. a checkbox preference. In this case we know the user has acknowledged the preference but not chosen any options.
clientPreferences.optionsArrayA list of options available to the user for this preference
clientPreferences.options.idNumberThe globally unique ID of this option
clientPreferences.options.valueStringThe display text for this option
clientPreferences.options.metadataObjectKey / value pairs of additional metadata associated with this option. Both keys and values are strings.
clientPreferences.options.selectedBooleanTrue if the user has selected this option - false otherwise
entitlementsArrayA list of active entitlements this user has. Expired entitlements are excluded. Version 3 only — this field is not present in version 2 payloads.
entitlements.idStringThe ID of this entitlement
entitlements.nameStringThe name of this entitlement
entitlements.validFromISO 8601 DatetimeThe date and time this entitlement is valid from
entitlements.validToISO 8601 DatetimeThe date and time this entitlement is valid to. This will be null for entitlements that are open ended or never expire i.e. a lifetime membership or staff entitlement.
accountLinksArrayA list of account IDs linked to this SSO account. Version 3 only — this field is not present in version 2 payloads.
accountLinks.sourceSystemIdStringThe system this account link relates to e.g. cortex_VM for Ticketmaster
accountLinks.sourceSystemUserIdStringThe ID of the user's account within that system
accountLinks.sourceSystemCreatedAtISO 8601 DatetimeThe date and time this account link was created at the source, i.e. at Ticketmaster.
accountLinks.createdAtISO 8601 DatetimeThe date and time this account link was created
accountLinks.lastModifiedISO 8601 DatetimeThe date and time this account link was last updated
accountLinks.primaryBooleanTrue if this is the primary account link for this source system
accountLinks.secondaryLinksArrayA list of secondary account links associated with this primary link. Each entry has the same structure as an accountLink. This field is only present when secondary account links are enabled for the client configuration.

Model Versions

The webhook supports multiple model versions.

Version 2 includes: id, version, recordRevoked, clientId, registerMetadata, userProfile, and clientPreferences.

Version 3 includes everything in Version 2, plus:

  • entitlements — the user's active entitlements

  • accountLinks — external accounts linked to this SSO account (with optional secondary links)

Example:

{
  "id": 6688176,
  "version": 3,
  "clientId": "CLIENT",
  "registerMetadata": {
    "registerSource": "XX",
    "registerType": "XX",
    "registerPlatform": "XX"
  },
  "entitlements": [
    {
      "id": "68623c8e5fab911b5396d1a9",
      "name": "pre season bundle 2026",
      "validFrom": "2026-03-18T17:51:20Z",
      "validTo": "2026-03-31T10:00:00Z"
    }
  ],
  "accountLinks": [
    {
      "sourceSystemId": "System4",
      "sourceSystemUserId": "fTVOpxDMyUmOwVXXX",
      "createdAt": "2021-06-20T15:29:57.58203Z",
      "lastModified": "2021-06-20T15:29:57.58203Z"
    },
    {
      "sourceSystemId": "XXXX_SG",
      "sourceSystemUserId": "718863",
      "createdAt": "2023-06-23T10:00:33.115011Z",
      "lastModified": "2023-06-23T10:00:33.115011Z"
    },
    {
      "sourceSystemId": "YYYY_VM",
      "sourceSystemUserId": "718863",
      "sourceSystemCreatedAt": "2024-12-03T09:09:27.445024Z",
      "createdAt": "2023-06-29T15:02:19.905433Z",
      "lastModified": "2024-12-03T09:09:27.463658Z"
    }
  ],
  "clientPreferences": [
    {
      "clientId": "CLIENT",
      "name": "Highlights, news, and videos",
      "description": "Send me the latest news and videos from the club, including transfers and match highlights",
      "set": true,
      "key": "001-highlights-news-videos",
      "options": [
        {
          "id": 958,
          "value": "Yes",
          "metadata": {
            "hidden": "false",
            "order": "1",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        },
        {
          "id": 959,
          "value": "No",
          "metadata": {
            "hidden": "false",
            "order": "2",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        }
      ]
    },
    {
     "clientId": "CLIENT",
      "name": "Tickets and Memberships",
      "description": "Send me ticket announcements and availability, Memberships, and Season Ticket information",
      "set": true,
      "key": "002-tickets-memberships",
      "options": [
        {
          "id": 960,
          "value": "Yes",
          "metadata": {
            "hidden": "false",
            "order": "1",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        },
        {
          "id": 961,
          "value": "No",
          "metadata": {
            "hidden": "false",
            "order": "2",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        }
      ]
    },
    {
      "clientId": "CLIENT",
      "name": "Club Shop",
      "description": "Send me the latest from the club shop",
      "set": true,
      "key": "003-club-shop",
      "options": [
        {
          "id": 962,
          "value": "Yes",
          "metadata": {
            "hidden": "false",
            "order": "1",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        },
        {
          "id": 963,
          "value": "No",
          "metadata": {
            "hidden": "false",
            "order": "2",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        }
      ]
    },
    {
      "clientId": "CLIENT",
      "name": "Premium Hospitality and commercial opportunities",
      "description": "Send me Premium hospitality news and offers, and commercial opportunities",
      "set": true,
      "key": "004-premium-hospitality-commercial",
      "options": [
        {
          "id": 964,
          "value": "Yes",
          "metadata": {
            "hidden": "false",
            "order": "1",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        },
        {
          "id": 965,
          "value": "No",
          "metadata": {
            "hidden": "false",
            "order": "2",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        }
      ]
    },
    {
      "clientId": "CLIENT",
      "name": "Selhurst Park venue hire and events",
      "description": "Send me club events and venue hire communications from Selhurst Park",
      "set": true,
      "key": "005-venue-hire-events",
      "options": [
        {
          "id": 966,
          "value": "Yes",
          "metadata": {
            "hidden": "false",
            "order": "1",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        },
        {
          "id": 967,
          "value": "No",
          "metadata": {
            "hidden": "false",
            "order": "2",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        }
      ]
    },
    {
     "clientId": "CLIENT",
      "name": "Partners and sponsors",
      "description": "Send me news and promotions from Palace partners",
      "set": true,
      "key": "006-partners-sponsors",
      "options": [
        {
          "id": 968,
          "value": "Yes",
          "metadata": {
            "hidden": "false",
            "order": "1",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        },
        {
          "id": 969,
          "value": "No",
          "metadata": {
            "hidden": "false",
            "order": "2",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        }
      ]
    },
    {
      "clientId": "CLIENT",
      "name": "Palace for Life Foundation",
      "description": "Send me the latest news and updates from the Palace for Life Foundation",
      "set": true,
      "key": "007-palace-life-foundation",
      "options": [
        {
          "id": 970,
          "value": "Yes",
          "metadata": {
            "hidden": "false",
            "order": "1",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        },
        {
          "id": 971,
          "value": "No",
          "metadata": {
            "hidden": "false",
            "order": "2",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        }
      ]
    },
    {
     "clientId": "CLIENT",
      "name": "Palace Women's Team",
      "description": "Send me the latest news and updates from the Palace Women's team",
      "set": true,
      "key": "008-palace-womens-team",
      "options": [
        {
          "id": 972,
          "value": "Yes",
          "metadata": {
            "hidden": "false",
            "order": "1",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        },
        {
          "id": 973,
          "value": "No",
          "metadata": {
            "hidden": "false",
            "order": "2",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        }
      ]
    },
    {
    "clientId": "CLIENT",
      "name": "I am also happy to hear from the Club via SMS",
      "set": true,
      "key": "009-other-contact-methods-sms",
      "options": [
        {
          "id": 974,
          "value": "Yes",
          "metadata": {
            "hidden": "false",
            "order": "1",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        },
        {
          "id": 975,
          "value": "No",
          "metadata": {
            "hidden": "false",
            "order": "2",
            "type": "opt-in",
            "visualType": "radio"
          },
          "selected": false
        }
      ]
    }
  ],
  "userProfile": {
    "id": 6688176,
    "email": "[email protected]",
    "firstName": "Bob",
    "lastName": "Fisher",
    "birthDate": "1988-01-01T00:00:00Z",
    "gender": "M",
    "address1": "line1",
    "address2": "line2",
    "town": "London",
    "region": "Sussex",
    "country": "United Kingdom",
    "postcode": "BNX YYY",
    "contactNumber": "0797777",
    "lastUpdated": "2026-03-18T17:51:52.4Z",
    "metadata": {},
    "createdAt": "2021-06-20T12:12:08.178Z",
    "passwordReset": true,
    "lastPasswordReset": "2026-03-03T14:25:51.557038Z",
    "firstLogin": "2021-06-29T11:14:07.162229Z",
    "lastLogin": "2026-03-18T17:41:28.364391Z"
  }
}

Preferences webhook

In addition to the profile webhook described above, the data sharer supports a separate preferences webhook. This is a dedicated channel for receiving real-time preference change notifications with a richer preference data model.

The preferences webhook fires whenever a user updates their preference selections (e.g. opting in or out of a contact method, changing a preference option).

The preferences webhook is configured as a separate pipeline. A client can receive both webhooks.

The profile webhook described above includes a clientPreferences section with basic preference data. The preferences webhook provides a richer, dedicated preference payload with additional fields.

CapabilityProfile WebhookPreferences Webhook
Triggered byAny SSO profile updatePreference selection changes only
Preference key & nameYesYes
Option id, value, selectedYesYes
Preference descriptionNoYes
Preference type (OptIn, Global)NoYes
Visual type (Radio, Checkbox, Select)NoYes
Preference deprecated flagNoYes
Last updated timestampNoYes
Option index (display ordering)NoYes
Option metadata (key/value pairs)NoYes
Option linked IDs (external system refs)NoYes
Option deprecated flagNoYes
User profile data (name, address, etc.)Yes (full profile)No
EntitlementsYes (v3 only)No
Account linksYes (v3 only)No

Example payloads

Anonymous user

{
  "clientId": "XXX",
  "userId": 27146712,
  "anonymous": true,
  "email": "[email protected]",
  "uuid": "8b4d1f52-6499-41e2-a6f4-26d8616988df",
  "preferences": [
    {
      "key": "001-highlights-news-videos",
      "name": "Highlights, news, and videos",
      "description": "Send me the latest news and videos from the club, including transfers and match highlights",
      "set": false,
      "type": "OptIn",
      "visualType": "Radio",
      "deprecated": false,
      "lastUpdated": null,
      "options": [
        {
          "id": 958,
          "index": 1,
          "value": "Yes",
          "metadata": {},
          "linkedIds": [],
          "selected": false,
          "deprecated": false
        },
        {
          "id": 959,
          "index": 2,
          "value": "No",
          "metadata": {},
          "linkedIds": [],
          "selected": false,
          "deprecated": false
        }
      ]
    },
    {
      "key": "002-tickets-memberships",
      "name": "Tickets and Memberships",
      "description": "Send me ticket announcements and availability, Memberships, and Season Ticket information",
      "set": false,
      "type": "OptIn",
      "visualType": "Radio",
      "deprecated": false,
      "lastUpdated": null,
      "options": [
        {
          "id": 960,
          "index": 1,
          "value": "Yes",
          "metadata": {},
          "linkedIds": [],
          "selected": false,
          "deprecated": false
        },
        {
          "id": 961,
          "index": 2,
          "value": "No",
          "metadata": {},
          "linkedIds": [],
          "selected": false,
          "deprecated": false
        }
      ]
    },
    {
      "key": "003-club-shop",
      "name": "Club Shop",
      "description": "Send me the latest from the club shop",
      "set": false,
      "type": "OptIn",
      "visualType": "Radio",
      "deprecated": false,
      "lastUpdated": null,
      "options": [
        {
          "id": 962,
          "index": 1,
          "value": "Yes",
          "metadata": {},
          "linkedIds": [],
          "selected": false,
          "deprecated": false
        },
        {
          "id": 963,
          "index": 2,
          "value": "No",
          "metadata": {},
          "linkedIds": [],
          "selected": false,
          "deprecated": false
        }
      ]
    }
  ],
  "version": 1,
  "createdAt": "2026-03-18T17:41:02.949459786Z"
}

Real SSO user

{
  "clientId": "XXX",
  "userId": 6688176,
  "anonymous": false,
  "email": "[email protected]",
  "uuid": "1ed05d06-c7e2-4637-a184-1fd0073b7727",
  "preferences": [
    {
      "key": "001-highlights-news-videos",
      "name": "Highlights, news, and videos",
      "description": "Send me the latest news and videos from the club, including transfers and match highlights",
      "set": true,
      "type": "OptIn",
      "visualType": "Radio",
      "deprecated": false,
      "lastUpdated": "2026-03-18T17:41:48.769214Z",
      "options": [
        {
          "id": 958,
          "index": 1,
          "value": "Yes",
          "metadata": {},
          "linkedIds": [],
          "selected": false,
          "deprecated": false
        },
        {
          "id": 959,
          "index": 2,
          "value": "No",
          "metadata": {},
          "linkedIds": [],
          "selected": true,
          "deprecated": false
        }
      ]
    },
    {
      "key": "002-tickets-memberships",
      "name": "Tickets and Memberships",
      "description": "Send me ticket announcements and availability, Memberships, and Season Ticket information",
      "set": true,
      "type": "OptIn",
      "visualType": "Radio",
      "deprecated": false,
      "lastUpdated": "2026-03-18T17:41:48.769214Z",
      "options": [
        {
          "id": 960,
          "index": 1,
          "value": "Yes",
          "metadata": {},
          "linkedIds": [],
          "selected": false,
          "deprecated": false
        },
        {
          "id": 961,
          "index": 2,
          "value": "No",
          "metadata": {},
          "linkedIds": [],
          "selected": true,
          "deprecated": false
        }
      ]
    },
    {
      "key": "003-club-shop",
      "name": "Club Shop",
      "description": "Send me the latest from the club shop",
      "set": true,
      "type": "OptIn",
      "visualType": "Radio",
      "deprecated": false,
      "lastUpdated": "2026-03-18T17:41:48.769214Z",
      "options": [
        {
          "id": 962,
          "index": 1,
          "value": "Yes",
          "metadata": {},
          "linkedIds": [],
          "selected": false,
          "deprecated": false
        },
        {
          "id": 963,
          "index": 2,
          "value": "No",
          "metadata": {},
          "linkedIds": [],
          "selected": true,
          "deprecated": false
        }
      ]
    }
  ],
  "version": 1,
  "createdAt": "2026-03-18T17:41:48.805845172Z"
}

Payload fields

FieldTypeRequiredDefinition
clientIdStringYesThe ID associated with this client
userIdNumberYesThe user's unique SSO ID
anonymousBooleanYesWhether this is an anonymous user
emailStringYesThe user's email address
minorIdStringOptionalIf the user is a minor, this is their username/nickname
guardianEmailStringOptionalThe email address of their guardian if the user is a minor
uuidStringYesA unique identifier for this user's account
versionNumberYesThe payload version
createdAtISO 8601 DatetimeYesThe timestamp of this webhook event
preferencesArrayYesThe user's current preference selections
preferences.keyStringYesThe unique key identifying this preference
preferences.nameStringYesThe display name of the preference
preferences.descriptionStringOptionalA description of the preference
preferences.setBooleanOptionalTrue if the user has responded to this preference, even if no options were selected. May be null.
preferences.typeStringOptionalThe preference classification, e.g. OptIn, Global. May be null.
preferences.visualTypeStringYesThe UI display type: Radio, Checkbox, or Select
preferences.deprecatedBooleanYesTrue if this preference has been deprecated
preferences.lastUpdatedISO 8601 DatetimeOptionalThe last time this specific preference was updated. May be null.
preferences.optionsArrayYesThe available options for this preference
preferences.options.idNumberYesThe globally unique ID of this option
preferences.options.indexNumberYesThe display order index for this option
preferences.options.valueStringYesThe display text for this option
preferences.options.metadataObjectYesKey / value pairs of additional metadata associated with this option
preferences.options.linkedIdsArrayYesExternal system references linked to this option (e.g. OPTA football team IDs)
preferences.options.linkedIds.textStringOptionalDisplay text for this linked ID. May be null.
preferences.options.linkedIds.sourceSystemStringYesThe external system this ID relates to
preferences.options.linkedIds.sourceSystemIdStringYesThe ID within that external system
preferences.options.selectedBooleanOptionalTrue if the user has selected this option. May be null.
preferences.options.deprecatedBooleanYesTrue if this option has been deprecated

Which webhook should I use?

  • Use the profile webhook if you need the full user profile (name, email, address, etc.) alongside basic preference data, entitlements, and account links.
  • Use the preferences webhook if you need detailed, real-time preference change data with enriched metadata (type, visual type, option metadata, linked IDs, deprecation flags).
  • Use both if you need full coverage — the profile webhook for identity and account data, and the preferences webhook for rich preference data.