Skip to content
Sections

Guest portal

Update guest-owned marketing preferences

PATCH/guest-portal/marketing-preferences

Updates the capability-owned venue marketing channels at the expected revision while preserving immutable consent history.

Authentication

x-guest-portal-token: <HALLIFY_GUEST_PORTAL_TOKEN>

Guest-owned portal session token.

Connection guide

Parameters

No path, query or ordinary header parameters. See authentication and request body below.

Request body

Required

Expected preference revision plus frequency, channels, topics, and suppression deadline used by guest-owned and venue-managed preference updates.

application/json

UpdateGuestMarketingPreferenceDto
Full definition
{
  "$ref": "#/components/schemas/UpdateGuestMarketingPreferenceDto"
}

Responses

200Returns current consent and the updated marketing preferences.
GuestConsentWorkspaceDto
Full definition
{
  "$ref": "#/components/schemas/GuestConsentWorkspaceDto"
}
Example response · 200 · application/json
{
  "identityRevision": 1,
  "policyVersion": "example",
  "consents": [
    {
      "id": "4aebbd5f-0775-4a9f-8cdf-18303bfc76dd",
      "purpose": "MARKETING_EMAIL",
      "status": "UNKNOWN",
      "captureSource": "STAFF",
      "policyVersion": "example",
      "effectiveAt": "2026-01-15T12:00:00.000Z"
    }
  ],
  "marketingPreference": {
    "frequency": "TRANSACTIONAL_ONLY",
    "preferredChannels": [
      "EMAIL"
    ],
    "topics": [
      "example"
    ],
    "revision": 1
  }
}
401Rejects a missing, malformed, expired, revoked, or invalid guestPortalToken credential at the owning domain boundary.
TranslatedErrorDto
Full definition
{
  "$ref": "#/components/schemas/TranslatedErrorDto"
}
Example response · 401 · application/json
{
  "statusCode": 401,
  "error": "errors:http.unauthorized",
  "code": "HTTP_UNAUTHORIZED",
  "message": "errors:http.unauthorized",
  "translationKey": "errors:http.unauthorized"
}

Schemas

UpdateGuestMarketingPreferenceDto

Expected preference revision plus frequency, channels, topics, and suppression deadline used by guest-owned and venue-managed preference updates.

expectedRevisionRequired

Current integer revision read by the caller; a stale value rejects the mutation. Accepted values enforce minimum 0.

integer
Full definition
{
  "type": "integer",
  "minimum": 0,
  "description": "Current integer revision read by the caller; a stale value rejects the mutation. Accepted values enforce minimum 0.",
  "example": 1
}
frequencyRequired

Allowed frequency for guest marketing preference: TRANSACTIONAL_ONLY, OCCASIONAL, WEEKLY, MONTHLY.

string
Full definition
{
  "type": "string",
  "enum": [
    "TRANSACTIONAL_ONLY",
    "OCCASIONAL",
    "WEEKLY",
    "MONTHLY"
  ],
  "description": "Allowed frequency for guest marketing preference: TRANSACTIONAL_ONLY, OCCASIONAL, WEEKLY, MONTHLY.",
  "example": "TRANSACTIONAL_ONLY"
}
preferredChannelsRequired

Preferred channels values included as preferred channels in guest marketing preference.

array
Full definition
{
  "type": "array",
  "items": {
    "type": "string",
    "enum": [
      "EMAIL",
      "SMS",
      "PHONE",
      "WHATSAPP"
    ],
    "example": "EMAIL"
  },
  "description": "Preferred channels values included as preferred channels in guest marketing preference.",
  "example": [
    "EMAIL"
  ]
}
topicsRequired

Topics values included as topics in guest marketing preference.

array
Full definition
{
  "maxItems": 20,
  "type": "array",
  "items": {
    "type": "string",
    "example": "example"
  },
  "description": "Topics values included as topics in guest marketing preference.",
  "example": [
    "example"
  ]
}
suppressedUntilOptional

RFC 3339 timestamp for suppressed until; offsets represent the same absolute instant. Null means no value is recorded for this representation.

string · date-time · null
Full definition
{
  "type": "string",
  "format": "date-time",
  "nullable": true,
  "description": "RFC 3339 timestamp for suppressed until; offsets represent the same absolute instant. Null means no value is recorded for this representation.",
  "example": "2026-12-31T18:00:00.000Z"
}
Full definition
{
  "type": "object",
  "properties": {
    "expectedRevision": {
      "type": "integer",
      "minimum": 0,
      "description": "Current integer revision read by the caller; a stale value rejects the mutation. Accepted values enforce minimum 0.",
      "example": 1
    },
    "frequency": {
      "type": "string",
      "enum": [
        "TRANSACTIONAL_ONLY",
        "OCCASIONAL",
        "WEEKLY",
        "MONTHLY"
      ],
      "description": "Allowed frequency for guest marketing preference: TRANSACTIONAL_ONLY, OCCASIONAL, WEEKLY, MONTHLY.",
      "example": "TRANSACTIONAL_ONLY"
    },
    "preferredChannels": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "EMAIL",
          "SMS",
          "PHONE",
          "WHATSAPP"
        ],
        "example": "EMAIL"
      },
      "description": "Preferred channels values included as preferred channels in guest marketing preference.",
      "example": [
        "EMAIL"
      ]
    },
    "topics": {
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "example": "example"
      },
      "description": "Topics values included as topics in guest marketing preference.",
      "example": [
        "example"
      ]
    },
    "suppressedUntil": {
      "type": "string",
      "format": "date-time",
      "nullable": true,
      "description": "RFC 3339 timestamp for suppressed until; offsets represent the same absolute instant. Null means no value is recorded for this representation.",
      "example": "2026-12-31T18:00:00.000Z"
    }
  },
  "required": [
    "expectedRevision",
    "frequency",
    "preferredChannels",
    "topics"
  ],
  "description": "Expected preference revision plus frequency, channels, topics, and suppression deadline used by guest-owned and venue-managed preference updates.",
  "example": {
    "expectedRevision": 1,
    "frequency": "TRANSACTIONAL_ONLY",
    "preferredChannels": [
      "EMAIL"
    ],
    "topics": [
      "example"
    ]
  }
}
GuestConsentWorkspaceDto

Returns current consent, channel preferences, sources, and decision timestamps.

identityRevisionRequired

Monotonic optimistic-concurrency revision for guest portal consents.

integer
Full definition
{
  "type": "integer",
  "description": "Monotonic optimistic-concurrency revision for guest portal consents.",
  "example": 1
}
policyVersionRequired

Policy version for guest portal consents.

string
Full definition
{
  "type": "string",
  "description": "Policy version for guest portal consents.",
  "example": "example"
}
consentsRequired

Consents included as consents in guest portal consents.

array
Full definition
{
  "type": "array",
  "items": {
    "type": "object",
    "required": [
      "id",
      "purpose",
      "status",
      "captureSource",
      "policyVersion",
      "effectiveAt"
    ],
    "properties": {
      "id": {
        "type": "string",
        "format": "uuid",
        "description": "Hallify UUID identifying guest portal consents item.",
        "example": "4aebbd5f-0775-4a9f-8cdf-18303bfc76dd"
      },
      "purpose": {
        "type": "string",
        "enum": [
          "MARKETING_EMAIL",
          "MARKETING_SMS",
          "MARKETING_PHONE",
          "MARKETING_WHATSAPP",
          "PROFILING"
        ],
        "description": "Allowed purpose for guest portal consents item: MARKETING_EMAIL, MARKETING_SMS, MARKETING_PHONE, MARKETING_WHATSAPP, PROFILING.",
        "example": "MARKETING_EMAIL"
      },
      "status": {
        "type": "string",
        "enum": [
          "UNKNOWN",
          "OPTED_IN",
          "OPTED_OUT"
        ],
        "description": "Current lifecycle status of guest portal consents item; allowed values are UNKNOWN, OPTED_IN, OPTED_OUT.",
        "example": "UNKNOWN"
      },
      "captureSource": {
        "type": "string",
        "enum": [
          "STAFF",
          "GUEST_PORTAL",
          "RESERVATION",
          "IMPORT",
          "PROVIDER"
        ],
        "description": "Allowed capture source for guest portal consents item: STAFF, GUEST_PORTAL, RESERVATION, IMPORT, PROVIDER.",
        "example": "STAFF"
      },
      "policyVersion": {
        "type": "string",
        "description": "Policy version for guest portal consents item.",
        "example": "example"
      },
      "evidence": {
        "type": "string",
        "nullable": true,
        "description": "Human-entered evidence retained with guest portal consents item for audit or later review. Null means no value is recorded for this representation.",
        "example": "example"
      },
      "effectiveAt": {
        "type": "string",
        "format": "date-time",
        "description": "RFC 3339 timestamp for effective at; offsets represent the same absolute instant.",
        "example": "2026-01-15T12:00:00.000Z"
      },
      "expiresAt": {
        "type": "string",
        "format": "date-time",
        "nullable": true,
        "description": "RFC 3339 timestamp for expires at; offsets represent the same absolute instant. Null means no value is recorded for this representation.",
        "example": "2026-12-31T18:00:00.000Z"
      }
    },
    "example": {
      "id": "4aebbd5f-0775-4a9f-8cdf-18303bfc76dd",
      "purpose": "MARKETING_EMAIL",
      "status": "UNKNOWN",
      "captureSource": "STAFF",
      "policyVersion": "example",
      "effectiveAt": "2026-01-15T12:00:00.000Z"
    }
  },
  "description": "Consents included as consents in guest portal consents.",
  "example": [
    {
      "id": "4aebbd5f-0775-4a9f-8cdf-18303bfc76dd",
      "purpose": "MARKETING_EMAIL",
      "status": "UNKNOWN",
      "captureSource": "STAFF",
      "policyVersion": "example",
      "effectiveAt": "2026-01-15T12:00:00.000Z"
    }
  ]
}
marketingPreferenceRequired

Marketing preference details embedded in guest portal consents containing frequency, preferred channels, topics, suppressed until, and revision.

object
Full definition
{
  "type": "object",
  "required": [
    "frequency",
    "preferredChannels",
    "topics",
    "revision"
  ],
  "properties": {
    "frequency": {
      "type": "string",
      "enum": [
        "TRANSACTIONAL_ONLY",
        "OCCASIONAL",
        "WEEKLY",
        "MONTHLY"
      ],
      "description": "Allowed frequency for guest portal consents marketing preference: TRANSACTIONAL_ONLY, OCCASIONAL, WEEKLY, MONTHLY.",
      "example": "TRANSACTIONAL_ONLY"
    },
    "preferredChannels": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "EMAIL",
          "SMS",
          "PHONE",
          "WHATSAPP"
        ],
        "example": "EMAIL"
      },
      "description": "Preferred channels values included as preferred channels in guest portal consents marketing preference.",
      "example": [
        "EMAIL"
      ]
    },
    "topics": {
      "type": "array",
      "items": {
        "type": "string",
        "example": "example"
      },
      "description": "Topics values included as topics in guest portal consents marketing preference.",
      "example": [
        "example"
      ]
    },
    "suppressedUntil": {
      "type": "string",
      "format": "date-time",
      "nullable": true,
      "description": "RFC 3339 timestamp for suppressed until; offsets represent the same absolute instant. Null means no value is recorded for this representation.",
      "example": "2026-12-31T18:00:00.000Z"
    },
    "revision": {
      "type": "integer",
      "description": "Monotonic optimistic-concurrency revision for guest portal consents marketing preference.",
      "example": 1
    }
  },
  "description": "Marketing preference details embedded in guest portal consents containing frequency, preferred channels, topics, suppressed until, and revision.",
  "example": {
    "frequency": "TRANSACTIONAL_ONLY",
    "preferredChannels": [
      "EMAIL"
    ],
    "topics": [
      "example"
    ],
    "revision": 1
  }
}
Full definition
{
  "type": "object",
  "required": [
    "identityRevision",
    "policyVersion",
    "consents",
    "marketingPreference"
  ],
  "properties": {
    "identityRevision": {
      "type": "integer",
      "description": "Monotonic optimistic-concurrency revision for guest portal consents.",
      "example": 1
    },
    "policyVersion": {
      "type": "string",
      "description": "Policy version for guest portal consents.",
      "example": "example"
    },
    "consents": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "purpose",
          "status",
          "captureSource",
          "policyVersion",
          "effectiveAt"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Hallify UUID identifying guest portal consents item.",
            "example": "4aebbd5f-0775-4a9f-8cdf-18303bfc76dd"
          },
          "purpose": {
            "type": "string",
            "enum": [
              "MARKETING_EMAIL",
              "MARKETING_SMS",
              "MARKETING_PHONE",
              "MARKETING_WHATSAPP",
              "PROFILING"
            ],
            "description": "Allowed purpose for guest portal consents item: MARKETING_EMAIL, MARKETING_SMS, MARKETING_PHONE, MARKETING_WHATSAPP, PROFILING.",
            "example": "MARKETING_EMAIL"
          },
          "status": {
            "type": "string",
            "enum": [
              "UNKNOWN",
              "OPTED_IN",
              "OPTED_OUT"
            ],
            "description": "Current lifecycle status of guest portal consents item; allowed values are UNKNOWN, OPTED_IN, OPTED_OUT.",
            "example": "UNKNOWN"
          },
          "captureSource": {
            "type": "string",
            "enum": [
              "STAFF",
              "GUEST_PORTAL",
              "RESERVATION",
              "IMPORT",
              "PROVIDER"
            ],
            "description": "Allowed capture source for guest portal consents item: STAFF, GUEST_PORTAL, RESERVATION, IMPORT, PROVIDER.",
            "example": "STAFF"
          },
          "policyVersion": {
            "type": "string",
            "description": "Policy version for guest portal consents item.",
            "example": "example"
          },
          "evidence": {
            "type": "string",
            "nullable": true,
            "description": "Human-entered evidence retained with guest portal consents item for audit or later review. Null means no value is recorded for this representation.",
            "example": "example"
          },
          "effectiveAt": {
            "type": "string",
            "format": "date-time",
            "description": "RFC 3339 timestamp for effective at; offsets represent the same absolute instant.",
            "example": "2026-01-15T12:00:00.000Z"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "RFC 3339 timestamp for expires at; offsets represent the same absolute instant. Null means no value is recorded for this representation.",
            "example": "2026-12-31T18:00:00.000Z"
          }
        },
        "example": {
          "id": "4aebbd5f-0775-4a9f-8cdf-18303bfc76dd",
          "purpose": "MARKETING_EMAIL",
          "status": "UNKNOWN",
          "captureSource": "STAFF",
          "policyVersion": "example",
          "effectiveAt": "2026-01-15T12:00:00.000Z"
        }
      },
      "description": "Consents included as consents in guest portal consents.",
      "example": [
        {
          "id": "4aebbd5f-0775-4a9f-8cdf-18303bfc76dd",
          "purpose": "MARKETING_EMAIL",
          "status": "UNKNOWN",
          "captureSource": "STAFF",
          "policyVersion": "example",
          "effectiveAt": "2026-01-15T12:00:00.000Z"
        }
      ]
    },
    "marketingPreference": {
      "type": "object",
      "required": [
        "frequency",
        "preferredChannels",
        "topics",
        "revision"
      ],
      "properties": {
        "frequency": {
          "type": "string",
          "enum": [
            "TRANSACTIONAL_ONLY",
            "OCCASIONAL",
            "WEEKLY",
            "MONTHLY"
          ],
          "description": "Allowed frequency for guest portal consents marketing preference: TRANSACTIONAL_ONLY, OCCASIONAL, WEEKLY, MONTHLY.",
          "example": "TRANSACTIONAL_ONLY"
        },
        "preferredChannels": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "EMAIL",
              "SMS",
              "PHONE",
              "WHATSAPP"
            ],
            "example": "EMAIL"
          },
          "description": "Preferred channels values included as preferred channels in guest portal consents marketing preference.",
          "example": [
            "EMAIL"
          ]
        },
        "topics": {
          "type": "array",
          "items": {
            "type": "string",
            "example": "example"
          },
          "description": "Topics values included as topics in guest portal consents marketing preference.",
          "example": [
            "example"
          ]
        },
        "suppressedUntil": {
          "type": "string",
          "format": "date-time",
          "nullable": true,
          "description": "RFC 3339 timestamp for suppressed until; offsets represent the same absolute instant. Null means no value is recorded for this representation.",
          "example": "2026-12-31T18:00:00.000Z"
        },
        "revision": {
          "type": "integer",
          "description": "Monotonic optimistic-concurrency revision for guest portal consents marketing preference.",
          "example": 1
        }
      },
      "description": "Marketing preference details embedded in guest portal consents containing frequency, preferred channels, topics, suppressed until, and revision.",
      "example": {
        "frequency": "TRANSACTIONAL_ONLY",
        "preferredChannels": [
          "EMAIL"
        ],
        "topics": [
          "example"
        ],
        "revision": 1
      }
    }
  },
  "description": "Returns current consent, channel preferences, sources, and decision timestamps.",
  "example": {
    "identityRevision": 1,
    "policyVersion": "example",
    "consents": [
      {
        "id": "4aebbd5f-0775-4a9f-8cdf-18303bfc76dd",
        "purpose": "MARKETING_EMAIL",
        "status": "UNKNOWN",
        "captureSource": "STAFF",
        "policyVersion": "example",
        "effectiveAt": "2026-01-15T12:00:00.000Z"
      }
    ],
    "marketingPreference": {
      "frequency": "TRANSACTIONAL_ONLY",
      "preferredChannels": [
        "EMAIL"
      ],
      "topics": [
        "example"
      ],
      "revision": 1
    }
  }
}
TranslatedErrorDto

Stable error envelope emitted by the global HTTP exception boundary. Domain-specific machine data, when present, is nested under details.

statusCodeRequired

HTTP status code repeated from the response.

integer
Full definition
{
  "type": "integer",
  "description": "HTTP status code repeated from the response.",
  "example": 400
}
errorRequired

Translation key for the HTTP category, such as errors:http.conflict. The specific cause is identified by code and translationKey.

string
Full definition
{
  "type": "string",
  "description": "Translation key for the HTTP category, such as errors:http.conflict. The specific cause is identified by code and translationKey.",
  "example": "errors.request.invalid"
}
codeRequired

Stable machine-readable domain code, or an HTTP_* fallback when no domain code is provided. Branch on this field and the HTTP status; localized wording never controls retries or business decisions.

string
Full definition
{
  "type": "string",
  "example": "HTTP_BAD_REQUEST",
  "description": "Stable machine-readable domain code, or an HTTP_* fallback when no domain code is provided. Branch on this field and the HTTP status; localized wording never controls retries or business decisions."
}
messageRequired

Translation key, identical to translationKey. The API does not return localized display text. Resolve the key and translationValues in the consuming application.

string
Full definition
{
  "type": "string",
  "example": "errors:http.badRequest",
  "description": "Translation key, identical to translationKey. The API does not return localized display text. Resolve the key and translationValues in the consuming application."
}
translationKeyRequired

Canonical translation key, identical to message. Status-specific errors:http.* keys cover unspecified failures. Public keys and EN/RU explanations are listed in Developers; unknown keys require a localized client fallback.

string
Full definition
{
  "type": "string",
  "example": "errors:http.badRequest",
  "description": "Canonical translation key, identical to message. Status-specific errors:http.* keys cover unspecified failures. Public keys and EN/RU explanations are listed in Developers; unknown keys require a localized client fallback."
}
translationValuesOptional

Optional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.

object
Full definition
{
  "type": "object",
  "additionalProperties": {
    "oneOf": [
      {
        "type": "string",
        "example": "example"
      },
      {
        "type": "number",
        "example": 0
      },
      {
        "type": "boolean",
        "example": true
      }
    ],
    "example": "example"
  },
  "description": "Optional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.",
  "example": {
    "exampleKey": "example"
  }
}
validationErrorsOptional

Field validation failures with translation keys and stable validator codes. Submitted values and raw validator text are not included.

array
Full definition
{
  "description": "Field validation failures with translation keys and stable validator codes. Submitted values and raw validator text are not included.",
  "type": "array",
  "items": {
    "$ref": "#/components/schemas/ValidationErrorDto"
  },
  "example": [
    {
      "field": "email",
      "translationKey": "validation:isEmail",
      "code": "isEmail",
      "message": "validation:isEmail"
    }
  ]
}
detailsOptional

Optional domain-specific blocker or validation details

oneOf
Full definition
{
  "description": "Optional domain-specific blocker or validation details",
  "oneOf": [
    {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/JsonValue"
      },
      "example": [
        "example"
      ]
    },
    {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/components/schemas/JsonValue"
      },
      "example": {
        "exampleKey": "example"
      }
    }
  ],
  "example": [
    "example"
  ]
}
Full definition
{
  "type": "object",
  "properties": {
    "statusCode": {
      "type": "integer",
      "description": "HTTP status code repeated from the response.",
      "example": 400
    },
    "error": {
      "type": "string",
      "description": "Translation key for the HTTP category, such as errors:http.conflict. The specific cause is identified by code and translationKey.",
      "example": "errors.request.invalid"
    },
    "code": {
      "type": "string",
      "example": "HTTP_BAD_REQUEST",
      "description": "Stable machine-readable domain code, or an HTTP_* fallback when no domain code is provided. Branch on this field and the HTTP status; localized wording never controls retries or business decisions."
    },
    "message": {
      "type": "string",
      "example": "errors:http.badRequest",
      "description": "Translation key, identical to translationKey. The API does not return localized display text. Resolve the key and translationValues in the consuming application."
    },
    "translationKey": {
      "type": "string",
      "example": "errors:http.badRequest",
      "description": "Canonical translation key, identical to message. Status-specific errors:http.* keys cover unspecified failures. Public keys and EN/RU explanations are listed in Developers; unknown keys require a localized client fallback."
    },
    "translationValues": {
      "type": "object",
      "additionalProperties": {
        "oneOf": [
          {
            "type": "string",
            "example": "example"
          },
          {
            "type": "number",
            "example": 0
          },
          {
            "type": "boolean",
            "example": true
          }
        ],
        "example": "example"
      },
      "description": "Optional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.",
      "example": {
        "exampleKey": "example"
      }
    },
    "validationErrors": {
      "description": "Field validation failures with translation keys and stable validator codes. Submitted values and raw validator text are not included.",
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ValidationErrorDto"
      },
      "example": [
        {
          "field": "email",
          "translationKey": "validation:isEmail",
          "code": "isEmail",
          "message": "validation:isEmail"
        }
      ]
    },
    "details": {
      "description": "Optional domain-specific blocker or validation details",
      "oneOf": [
        {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/JsonValue"
          },
          "example": [
            "example"
          ]
        },
        {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/components/schemas/JsonValue"
          },
          "example": {
            "exampleKey": "example"
          }
        }
      ],
      "example": [
        "example"
      ]
    }
  },
  "required": [
    "statusCode",
    "error",
    "code",
    "message",
    "translationKey"
  ],
  "description": "Stable error envelope emitted by the global HTTP exception boundary. Domain-specific machine data, when present, is nested under details.",
  "example": {
    "statusCode": 400,
    "error": "errors:http.badRequest",
    "code": "HTTP_BAD_REQUEST",
    "message": "errors:http.badRequest",
    "translationKey": "errors:http.badRequest"
  }
}
ValidationErrorDto

Field validation failure with a field path, stable validator code and a translation key. Human-readable text belongs to the consuming application.

fieldRequired

Public field path. Nested properties and array indices are separated by dots.

string
Full definition
{
  "type": "string",
  "example": "email",
  "description": "Public field path. Nested properties and array indices are separated by dots."
}
translationKeyRequired

Translation key for this validator, identical to message. Resolve it using a client dictionary; see the public Developers error catalog.

string
Full definition
{
  "type": "string",
  "example": "validation:isEmail",
  "description": "Translation key for this validator, identical to message. Resolve it using a client dictionary; see the public Developers error catalog."
}
codeRequired

Stable validator identifier for this field failure. Custom validators may define additional identifiers.

string
Full definition
{
  "type": "string",
  "example": "isEmail",
  "description": "Stable validator identifier for this field failure. Custom validators may define additional identifiers."
}
messageRequired

Translation key describing this field validation failure, identical to translationKey. Submitted values and validator prose are not included.

string
Full definition
{
  "type": "string",
  "example": "validation:isEmail",
  "description": "Translation key describing this field validation failure, identical to translationKey. Submitted values and validator prose are not included."
}
translationValuesOptional

Optional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.

object
Full definition
{
  "type": "object",
  "additionalProperties": {
    "oneOf": [
      {
        "type": "string",
        "example": "example"
      },
      {
        "type": "number",
        "example": 0
      },
      {
        "type": "boolean",
        "example": true
      }
    ],
    "example": "example"
  },
  "description": "Optional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.",
  "example": {
    "exampleKey": "example"
  }
}
Full definition
{
  "type": "object",
  "properties": {
    "field": {
      "type": "string",
      "example": "email",
      "description": "Public field path. Nested properties and array indices are separated by dots."
    },
    "translationKey": {
      "type": "string",
      "example": "validation:isEmail",
      "description": "Translation key for this validator, identical to message. Resolve it using a client dictionary; see the public Developers error catalog."
    },
    "code": {
      "type": "string",
      "example": "isEmail",
      "description": "Stable validator identifier for this field failure. Custom validators may define additional identifiers."
    },
    "message": {
      "type": "string",
      "example": "validation:isEmail",
      "description": "Translation key describing this field validation failure, identical to translationKey. Submitted values and validator prose are not included."
    },
    "translationValues": {
      "type": "object",
      "additionalProperties": {
        "oneOf": [
          {
            "type": "string",
            "example": "example"
          },
          {
            "type": "number",
            "example": 0
          },
          {
            "type": "boolean",
            "example": true
          }
        ],
        "example": "example"
      },
      "description": "Optional scalar values for placeholders in the translation. Treat values as data, escape them when rendering, and never use them as translation options.",
      "example": {
        "exampleKey": "example"
      }
    }
  },
  "required": [
    "field",
    "translationKey",
    "code",
    "message"
  ],
  "description": "Field validation failure with a field path, stable validator code and a translation key. Human-readable text belongs to the consuming application.",
  "example": {
    "field": "email",
    "translationKey": "validation:isEmail",
    "code": "isEmail",
    "message": "validation:isEmail"
  }
}
JsonValue

Recursively JSON-safe value used only where the owning contract intentionally allows free-form structured data.

Full definition
{
  "oneOf": [
    {
      "type": "string",
      "nullable": true,
      "example": "example"
    },
    {
      "type": "number",
      "example": 0
    },
    {
      "type": "boolean",
      "example": true
    },
    {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/JsonValue"
      },
      "example": [
        "example"
      ]
    },
    {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/components/schemas/JsonValue"
      },
      "example": {
        "exampleKey": "example"
      }
    }
  ],
  "description": "Recursively JSON-safe value used only where the owning contract intentionally allows free-form structured data.",
  "example": "example"
}

Hallify uses essential cookies and optional analytics.

Essential cookies keep sign-in, locale, and theme preferences working. Analytics is off until you choose to allow it.