message

User

acme.user.v1.User

A user account in the Acme identity platform.

Users are the primary subject of authentication, billing, and support workflows. Changing the shape of this message is a PACKAGE-breaking change.

Reading a user

  • Identity: id is a stable UUID; email is the required login address.
  • Lifecycle: state, created_at, and updated_at describe the account.
  • Profile: display_name, nickname, and preferences hold presentation choices. Postal details use the Address message.

Example JSON

This response uses the ProtoJSON mapping: field names become lower camel case and enum values remain strings.

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "email": "alex@example.com",
  "displayName": "Alex Chen",
  "state": "USER_STATE_ACTIVE",
  "createdAt": "2026-01-15T09:30:00Z",
  "preferences": {
    "marketingOptIn": false,
    "locale": "en-GB",
    "timeZone": "Europe/London"
  }
}

Creating an account

  1. Set the required email and choose a display_name of 1 to 80 characters.
  2. Add profile preferences or up to five postal addresses as needed.
  3. Omit the output-only id, created_at, and updated_at fields from input.

Privacy: email and phone fields carry PII annotations. Their masking and hashing policies describe how consumers should handle sensitive data; the schema itself does not redact values.

Fields

FieldNumberTypeCardinalityValidationDescription
id1stringimplicit
string.uuid

Stable identifier. Never reused.

Details
  • JSON name: id
  • Presence: IMPLICIT
  • Annotations: IDENTIFIER, OUTPUT_ONLY
(buf.validate.field) = {
  string: {
    uuid: true
  }
}
(google.api.field_behavior) = [
  IDENTIFIER,
  OUTPUT_ONLY
]
email2stringimplicit
string.email

Login email. PII: follow the identity/email masking policy.

Details
  • JSON name: email
  • Presence: IMPLICIT
  • Annotations: REQUIRED
(acme.security.pii) = {
  sensitive: true
  redaction: REDACTION_MASK
  policy: "identity/email"
}
(buf.validate.field) = {
  string: {
    email: true
  }
}
(google.api.field_behavior) = [
  REQUIRED
]
display_name4stringimplicit
string.min_len=1string.max_len=80
—
Details
  • JSON name: displayName
  • Presence: IMPLICIT
(buf.validate.field) = {
  string: {
    min_len: 1
    max_len: 80
  }
}
nickname5stringoptional——
Details
  • JSON name: nickname
  • Presence: EXPLICIT
state6acme.user.v1.UserStateimplicit——
Details
  • JSON name: state
  • Presence: IMPLICIT
created_at7google.protobuf.Timestampoptional——
Details
  • JSON name: createdAt
  • Presence: EXPLICIT
  • Annotations: OUTPUT_ONLY
(google.api.field_behavior) = [
  OUTPUT_ONLY
]
updated_at8google.protobuf.Timestampoptional——
Details
  • JSON name: updatedAt
  • Presence: EXPLICIT
  • Annotations: OUTPUT_ONLY
(google.api.field_behavior) = [
  OUTPUT_ONLY
]
contact
oneof
—oneofoptional—

An optional contact channel in addition to the login email.

  • phone carries the identity/phone hashing policy.
  • pager is deprecated and remains only for compatibility.

A oneof can contain at most one of these values at a time.

At most one of phone, pager.

phone9stringoptional——
Details
  • JSON name: phone
  • Presence: EXPLICIT
(acme.security.pii) = {
  sensitive: true
  redaction: REDACTION_HASH
  policy: "identity/phone"
}
pagerdeprecated10stringoptional——
Details
  • JSON name: pager
  • Presence: EXPLICIT
  • Annotations: deprecated
deprecated = true
labels11map<string, string>map——
Details
  • JSON name: labels
  • Presence: IMPLICIT
addresses12acme.user.v1.Addressrepeated
repeated.max_items=5
—
Details
  • JSON name: addresses
  • Presence: IMPLICIT
  • Packed: false
(buf.validate.field) = {
  repeated: {
    max_items: 5
  }
}
preferences13acme.user.v1.User.Preferencesoptional——
Details
  • JSON name: preferences
  • Presence: EXPLICIT

Nested messages

Reserved

3 to 3, 15 to 20, legacy_id

Example JSON

{
  "id": "string",
  "email": "string",
  "displayName": "string",
  "nickname": "string",
  "state": "USER_STATE_UNSPECIFIED",
  "createdAt": "2026-09-18T17:30:00Z",
  "updatedAt": "2026-09-18T17:30:00Z",
  "phone": "string",
  "labels": {
    "key": "string"
  },
  "addresses": [
    {
      "line1": "string",
      "line2": "string",
      "city": "string",
      "region": "string",
      "postalCode": "string",
      "countryCode": "string"
    }
  ],
  "preferences": {
    "marketingOptIn": true,
    "locale": "string",
    "timeZone": "string"
  }
}

Options

(acme.security.audit_required)

Defined by acme.security.audit_required

(acme.security.audit_required) = true

Effective features

  • json_format: ALLOW
    inherited from acme/user/v1/user

Used by

What will be affected if this symbol changes.