Custom-field values keyed by label (the human-readable name you gave the field). Labels are matched case-insensitively after trimming whitespace. Per-label merge: only labels present in the payload are touched. Send customFields: null to clear all values; send an individual label with null to clear that value; send "" to clear TEXT values; send [] to clear MULTI_SELECT values. Discover labels, types, and select options via GET /v1/contacts/custom-fields/schema. Value shape per schema field type: TEXT → string, NUMBER → number, BOOLEAN → boolean, DATE → YYYY-MM-DD string, SINGLE_SELECT → string matching one of options, MULTI_SELECT → array of strings each matching one of options. Unknown labels are rejected with 33033 InvalidCustomField and details.reason: "unknown_label".