pixellint

Mixpanel Engage checks identity and profile operations in captured requests.

The /engage operation updates user profiles. $token is the project token, and $distinct_id identifies the profile associated with events. Each record needs $set or another documented operator. $time uses Unix seconds, $ip is an address, and verbose=1 is recommended for an observable response. Live token validity and identity history remain external.

The selected built-in Engage pack inspects the SDK's recognized text/plain data= string body on POST to exact /engage or /engage/ endpoints. One strict outer decode can expose the existing raw-JSON or Base64 profile records. The owning pack receives that interpretation while the observed header, original body and generic HTTP representation remain unchanged.

Repeated or extra form members, competing query data, unknown or redacted evidence and the verified paired-CESU-8 Base64 boundary remain information deferrals. Local evaluator bounds also leave dependent payload rules unvalidated when exceeded. Existing compression contracts are preserved. Custom, excluded and replacement plugins receive no built-in body capability.

A token and distinct_id are not an update

Mixpanel documents an operation object on every record. $set writes properties. The other operators increment, union, unset, or delete.

Rule: vendor.mixpanel-engage.body.operation_required

A local inspection limit keeps profile checks unvalidated.

The newly supported SDK plain-text form path bounds decoded text, JSON structure, projected finding text and rule work before running profile contracts. Exceeding a bound produces information rather than an invented Mixpanel quota error. Available endpoint and query evidence can still run.

Rule: core.request.sdk_body_limit

What this pack matches

Hosts
mixpanel.com
Paths
…/engage…
Vendor docs
docs.mixpanel.com/reference/profile-set

Rules

Codes are stable. A finding in CI, MCP, or the playground lands on the same id.

Field Required What it checks Rule ids Source
verbose recommended Mixpanel documents `verbose=1` so the 200 body says whether the update was accepted. Fix: Send `verbose=1` on `/engage` while you are implementing. vendor.mixpanel-engage.param.verbose.missing
vendor.mixpanel-engage.param.verbose.empty
vendor.mixpanel-engage.param.verbose.invalid
docs
strict optional Mixpanel documents `strict=1` so failed records are named in the response. Fix: Send `strict=1` to see per-record validation errors. vendor.mixpanel-engage.param.strict.empty
vendor.mixpanel-engage.param.strict.invalid
docs
ip optional Mixpanel documents `ip=0` on server-side calls so the profile is not geolocated to your server. Fix: Send `ip=0` from a server. vendor.mixpanel-engage.param.ip.empty
vendor.mixpanel-engage.param.ip.invalid
docs
data optional The official browser SDK encodes the event or profile update in data for the legacy base64 transport. vendor.mixpanel-engage.param.data.empty docs
https_required required Mixpanel explicitly rejects non-HTTPS API requests. vendor.mixpanel-engage.https_required docs
root optional The JSON body is a nonempty array of records. Native JSON type: array. Minimum array items: 1. vendor.mixpanel-engage.body.root.invalid docs
$token required Mixpanel documents `$token` as required. It is the project token. Body scope: []. Native JSON type: string. Fix: Send the project token from Mixpanel project settings as `$token`. vendor.mixpanel-engage.body.$token.missing
vendor.mixpanel-engage.body.$token.empty
vendor.mixpanel-engage.body.$token.invalid
docs
$distinct_id required Mixpanel documents `$distinct_id` as required. It must be the same id you send on events. Body scope: []. Native JSON type: string. Fix: Send the same `distinct_id` you use on `/track` for this user. vendor.mixpanel-engage.body.$distinct_id.missing
vendor.mixpanel-engage.body.$distinct_id.empty
vendor.mixpanel-engage.body.$distinct_id.invalid
docs
$set optional Sets profile properties, creating the profile if needed. Mixpanel documents it as required for the profile-set call. Body scope: []. Native JSON type: object. vendor.mixpanel-engage.body.$set.invalid docs
$set_once optional Sets profile properties only when they are not already set. Body scope: []. Native JSON type: object. vendor.mixpanel-engage.body.$set_once.invalid docs
$add optional Increments numeric profile properties. Body scope: []. Native JSON type: object. vendor.mixpanel-engage.body.$add.invalid docs
$union optional Unions list profile properties. Body scope: []. Native JSON type: object. vendor.mixpanel-engage.body.$union.invalid docs
$append optional Appends to list profile properties. Body scope: []. Native JSON type: object. vendor.mixpanel-engage.body.$append.invalid docs
$remove optional Removes values from list profile properties. Body scope: []. Native JSON type: object. vendor.mixpanel-engage.body.$remove.invalid docs
$unset optional Unsets named profile properties. Body scope: []. Native JSON type: array. vendor.mixpanel-engage.body.$unset.invalid docs
$delete optional Deletes the profile. Body scope: []. Native JSON type: string. vendor.mixpanel-engage.body.$delete.invalid docs
$ip optional Mixpanel uses `$ip` to geolocate the profile. Send a raw address, not a digest. Body scope: []. Native JSON type: string. vendor.mixpanel-engage.body.$ip.empty
vendor.mixpanel-engage.body.$ip.invalid
docs
$time optional Mixpanel documents `$time` as seconds since epoch for the profile update. Body scope: []. Native JSON type: integer. Fix: Send a Unix timestamp in seconds, not milliseconds and not an ISO string. vendor.mixpanel-engage.body.$time.empty
vendor.mixpanel-engage.body.$time.invalid
docs
$ignore_time optional Mixpanel documents `$ignore_time` as a boolean. `true` leaves Last Seen unchanged. Body scope: []. Native JSON type: boolean. vendor.mixpanel-engage.body.$ignore_time.empty
vendor.mixpanel-engage.body.$ignore_time.invalid
docs
root optional The vendor documents `` in the request contract. Body scope: []. Native JSON type: object. vendor.mixpanel-engage.body.root.invalid docs
$unset[] optional The vendor documents `$unset[]` in the request contract. Body scope: []. Native JSON type: string. vendor.mixpanel-engage.body.$unset[].invalid docs
increment… optional The vendor documents `increment` in the request contract. Body scope: []. Native JSON type: number. vendor.mixpanel-engage.body.increment.invalid docs
union… optional The vendor documents `union` in the request contract. Body scope: []. Native JSON type: array. vendor.mixpanel-engage.body.union.invalid docs
body.hashed_plaintext_field required `$ip` looks like a SHA-256 digest, but Mixpanel documents it as an IP address used for geolocation. Body scope: []. Fix: Send the raw IP address, or omit `$ip`. vendor.mixpanel-engage.body.hashed_plaintext_field docs
body.operation_required required The profile update has no operation. Mixpanel documents `$set`, `$set_once`, `$add`, `$union`, `$append`, `$remove`, `$unset`, or `$delete`. Body scope: []. Fix: Send `$set` with the properties to write, or another documented engage operator. vendor.mixpanel-engage.body.operation_required docs
root optional The JSON body is a nonempty array of records. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: object or array. Minimum array items: 1. vendor.mixpanel-engage.body.root.invalid docs
$token required Mixpanel documents `$token` as required. It is the project token. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: string. Fix: Send the project token from Mixpanel project settings as `$token`. vendor.mixpanel-engage.body.$token.missing
vendor.mixpanel-engage.body.$token.empty
vendor.mixpanel-engage.body.$token.invalid
docs
$distinct_id required Mixpanel documents `$distinct_id` as required. It must be the same id you send on events. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: string. Fix: Send the same `distinct_id` you use on `/track` for this user. vendor.mixpanel-engage.body.$distinct_id.missing
vendor.mixpanel-engage.body.$distinct_id.empty
vendor.mixpanel-engage.body.$distinct_id.invalid
docs
$set optional Sets profile properties, creating the profile if needed. Mixpanel documents it as required for the profile-set call. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: object. vendor.mixpanel-engage.body.$set.invalid docs
$set_once optional Sets profile properties only when they are not already set. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: object. vendor.mixpanel-engage.body.$set_once.invalid docs
$add optional Increments numeric profile properties. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: object. vendor.mixpanel-engage.body.$add.invalid docs
$union optional Unions list profile properties. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: object. vendor.mixpanel-engage.body.$union.invalid docs
$append optional Appends to list profile properties. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: object. vendor.mixpanel-engage.body.$append.invalid docs
$remove optional Removes values from list profile properties. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: object. vendor.mixpanel-engage.body.$remove.invalid docs
$unset optional Unsets named profile properties. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: array. vendor.mixpanel-engage.body.$unset.invalid docs
$delete optional Deletes the profile. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: string. vendor.mixpanel-engage.body.$delete.invalid docs
$ip optional Mixpanel uses `$ip` to geolocate the profile. Send a raw address, not a digest. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: string. vendor.mixpanel-engage.body.$ip.empty
vendor.mixpanel-engage.body.$ip.invalid
docs
$time optional Mixpanel documents `$time` as seconds since epoch for the profile update. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: integer. Fix: Send a Unix timestamp in seconds, not milliseconds and not an ISO string. vendor.mixpanel-engage.body.$time.empty
vendor.mixpanel-engage.body.$time.invalid
docs
$ignore_time optional Mixpanel documents `$ignore_time` as a boolean. `true` leaves Last Seen unchanged. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: boolean. vendor.mixpanel-engage.body.$ignore_time.empty
vendor.mixpanel-engage.body.$ignore_time.invalid
docs
root optional The vendor documents `` in the request contract. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: object. vendor.mixpanel-engage.body.root.invalid docs
$unset[] optional The vendor documents `$unset[]` in the request contract. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: string. vendor.mixpanel-engage.body.$unset[].invalid docs
increment… optional The vendor documents `increment` in the request contract. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: number. vendor.mixpanel-engage.body.increment.invalid docs
union… optional The vendor documents `union` in the request contract. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Native JSON type: array. vendor.mixpanel-engage.body.union.invalid docs
body.hashed_plaintext_field required `$ip` looks like a SHA-256 digest, but Mixpanel documents it as an IP address used for geolocation. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Fix: Send the raw IP address, or omit `$ip`. vendor.mixpanel-engage.body.hashed_plaintext_field docs
body.operation_required required The profile update has no operation. Mixpanel documents `$set`, `$set_once`, `$add`, `$union`, `$append`, `$remove`, `$unset`, or `$delete`. Body scope: ["[]",""]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Fix: Send `$set` with the properties to write, or another documented engage operator. vendor.mixpanel-engage.body.operation_required docs
root optional Body scope: [].$set.**. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$set.**. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$set.*. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$set.**[]. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$set_once.**. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$set_once.**. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$set_once.*. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$set_once.**[]. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$append.**. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$append.**. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$append.*. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$append.**[]. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$remove.**. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$remove.**. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$remove.*. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$remove.**[]. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$union.**. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$union.**. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$union.*. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: [].$union.**[]. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set.**","$set.**"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set.**","$set.**"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set.*","$set.*"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set.**[]","$set.**[]"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set_once.**","$set_once.**"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set_once.**","$set_once.**"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set_once.*","$set_once.*"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set_once.**[]","$set_once.**[]"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$append.**","$append.**"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$append.**","$append.**"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$append.*","$append.*"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$append.**[]","$append.**[]"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$remove.**","$remove.**"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$remove.**","$remove.**"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$remove.*","$remove.*"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$remove.**[]","$remove.**[]"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$union.**","$union.**"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$union.**","$union.**"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$union.*","$union.*"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$union.**[]","$union.**[]"]. Decoded body source: data. Encoding: base64_json. Applies when {"kind":"not","condition":{"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional The JSON body is a nonempty array of records. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: object or array. Minimum array items: 1. vendor.mixpanel-engage.body.root.invalid docs
$token required Mixpanel documents `$token` as required. It is the project token. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: string. Fix: Send the project token from Mixpanel project settings as `$token`. vendor.mixpanel-engage.body.$token.missing
vendor.mixpanel-engage.body.$token.empty
vendor.mixpanel-engage.body.$token.invalid
docs
$distinct_id required Mixpanel documents `$distinct_id` as required. It must be the same id you send on events. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: string. Fix: Send the same `distinct_id` you use on `/track` for this user. vendor.mixpanel-engage.body.$distinct_id.missing
vendor.mixpanel-engage.body.$distinct_id.empty
vendor.mixpanel-engage.body.$distinct_id.invalid
docs
$set optional Sets profile properties, creating the profile if needed. Mixpanel documents it as required for the profile-set call. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: object. vendor.mixpanel-engage.body.$set.invalid docs
$set_once optional Sets profile properties only when they are not already set. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: object. vendor.mixpanel-engage.body.$set_once.invalid docs
$add optional Increments numeric profile properties. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: object. vendor.mixpanel-engage.body.$add.invalid docs
$union optional Unions list profile properties. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: object. vendor.mixpanel-engage.body.$union.invalid docs
$append optional Appends to list profile properties. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: object. vendor.mixpanel-engage.body.$append.invalid docs
$remove optional Removes values from list profile properties. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: object. vendor.mixpanel-engage.body.$remove.invalid docs
$unset optional Unsets named profile properties. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: array. vendor.mixpanel-engage.body.$unset.invalid docs
$delete optional Deletes the profile. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: string. vendor.mixpanel-engage.body.$delete.invalid docs
$ip optional Mixpanel uses `$ip` to geolocate the profile. Send a raw address, not a digest. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: string. vendor.mixpanel-engage.body.$ip.empty
vendor.mixpanel-engage.body.$ip.invalid
docs
$time optional Mixpanel documents `$time` as seconds since epoch for the profile update. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: integer. Fix: Send a Unix timestamp in seconds, not milliseconds and not an ISO string. vendor.mixpanel-engage.body.$time.empty
vendor.mixpanel-engage.body.$time.invalid
docs
$ignore_time optional Mixpanel documents `$ignore_time` as a boolean. `true` leaves Last Seen unchanged. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: boolean. vendor.mixpanel-engage.body.$ignore_time.empty
vendor.mixpanel-engage.body.$ignore_time.invalid
docs
root optional The vendor documents `` in the request contract. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: object. vendor.mixpanel-engage.body.root.invalid docs
$unset[] optional The vendor documents `$unset[]` in the request contract. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: string. vendor.mixpanel-engage.body.$unset[].invalid docs
increment… optional The vendor documents `increment` in the request contract. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: number. vendor.mixpanel-engage.body.increment.invalid docs
union… optional The vendor documents `union` in the request contract. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Native JSON type: array. vendor.mixpanel-engage.body.union.invalid docs
body.hashed_plaintext_field required `$ip` looks like a SHA-256 digest, but Mixpanel documents it as an IP address used for geolocation. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Fix: Send the raw IP address, or omit `$ip`. vendor.mixpanel-engage.body.hashed_plaintext_field docs
body.operation_required required The profile update has no operation. Mixpanel documents `$set`, `$set_once`, `$add`, `$union`, `$append`, `$remove`, `$unset`, or `$delete`. Body scope: ["[]",""]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Fix: Send `$set` with the properties to write, or another documented engage operator. vendor.mixpanel-engage.body.operation_required docs
root optional Body scope: ["[].$set.**","$set.**"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set.**","$set.**"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set.*","$set.*"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set.**[]","$set.**[]"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set_once.**","$set_once.**"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set_once.**","$set_once.**"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set_once.*","$set_once.*"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$set_once.**[]","$set_once.**[]"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$append.**","$append.**"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$append.**","$append.**"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$append.*","$append.*"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$append.**[]","$append.**[]"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$remove.**","$remove.**"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$remove.**","$remove.**"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$remove.*","$remove.*"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$remove.**[]","$remove.**[]"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$union.**","$union.**"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum object properties: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$union.**","$union.**"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum decoded UTF-8 bytes: 255. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$union.*","$union.*"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 3. vendor.mixpanel-engage.body.root.invalid docs
root optional Body scope: ["[].$union.**[]","$union.**[]"]. Decoded body source: data. Encoding: json. Applies when {"kind":"value_pattern","param":"data","pattern":"^\\s*[\\[{]"}. Applies when {"kind":"json_type","param":"","json_type":"object"}. Presence diagnostic severity: error. Value diagnostic severity: warning. Native JSON type: string or number or boolean or object or array or null. Maximum container depth: 1. vendor.mixpanel-engage.body.root.invalid docs
method required The official SDK uses POST or GET fallback for this operation. Complete HTTP capture contract. Native JSON type: string. vendor.mixpanel-engage.http.method.missing
vendor.mixpanel-engage.http.method.empty
vendor.mixpanel-engage.http.method.invalid
docs
content_type optional Published native JSON, XHR form and sendBeacon text representations are retained. Complete HTTP capture contract. Applies when {"kind":"value_in","param":"method","values":["POST"]}. Presence diagnostic severity: warning. Value diagnostic severity: warning. Native JSON type: string. vendor.mixpanel-engage.http.content_type.empty
vendor.mixpanel-engage.http.content_type.invalid
docs
headers.content-encoding optional HTTP content encoding, when supplied. This endpoint documents its own gzip policy. Complete HTTP capture contract. Native JSON type: string. vendor.mixpanel-engage.http.headers.content-encoding.empty
vendor.mixpanel-engage.http.headers.content-encoding.invalid
docs
http.gzip_unsupported required This profile endpoint explicitly does not support gzip. Complete HTTP capture contract. vendor.mixpanel-engage.http.gzip_unsupported docs

Validate a payload

Use an explicit request capture to retain the SDK body, method and observed headers.

pixellint validate request @request.json --rulepack vendor/mixpanel-engage
pixellint validate json @payload.json --rulepack vendor/mixpanel-engage

Try this failing payload in the playground. Mixpanel engage with a hashed $ip.

[{"$token":"project-token","$distinct_id":"user-13793","$ip":"a85e9ca18f34935ab9b0381b25bfad2455444112b0149270fd88e3da172fe196","$set":{"$email":"user@example.com","$name":"Ada"}}]

cargo install pixellint · npm install pixellint