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:
idis a stable UUID;emailis the required login address. - Lifecycle:
state,created_at, andupdated_atdescribe the account. - Profile:
display_name,nickname, andpreferenceshold 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
- Set the required
emailand choose adisplay_nameof 1 to 80 characters. - Add profile preferences or up to five postal addresses as needed.
- Omit the output-only
id,created_at, andupdated_atfields 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
| Field | Number | Type | Cardinality | Validation | Description |
|---|---|---|---|---|---|
| id | 1 | string | implicit | string.uuid | Stable identifier. Never reused. Details
(buf.validate.field) = {
string: {
uuid: true
}
}
(google.api.field_behavior) = [
IDENTIFIER,
OUTPUT_ONLY
]
|
| 2 | string | implicit | string.email | Login email. PII: follow the Details
(acme.security.pii) = {
sensitive: true
redaction: REDACTION_MASK
policy: "identity/email"
}
(buf.validate.field) = {
string: {
email: true
}
}
(google.api.field_behavior) = [
REQUIRED
]
| |
| display_name | 4 | string | implicit | string.min_len=1string.max_len=80 | —Details
(buf.validate.field) = {
string: {
min_len: 1
max_len: 80
}
}
|
| nickname | 5 | string | optional | — | —Details
|
| state | 6 | acme.user.v1.UserState | implicit | — | —Details
|
| created_at | 7 | google.protobuf.Timestamp | optional | — | —Details
(google.api.field_behavior) = [ OUTPUT_ONLY ] |
| updated_at | 8 | google.protobuf.Timestamp | optional | — | —Details
(google.api.field_behavior) = [ OUTPUT_ONLY ] |
| contact oneof | — | oneof | optional | — | An optional contact channel in addition to the login email.
A |
| phone in contact | 9 | string | optional | — | —Details
(acme.security.pii) = {
sensitive: true
redaction: REDACTION_HASH
policy: "identity/phone"
}
|
| pagerdeprecated in contact | 10 | string | optional | — | —Details
deprecated = true |
| labels | 11 | map<string, string> | map | — | —Details
|
| addresses | 12 | acme.user.v1.Address | repeated | repeated.max_items=5 | —Details
(buf.validate.field) = {
repeated: {
max_items: 5
}
}
|
| preferences | 13 | acme.user.v1.User.Preferences | optional | — | —Details
|
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: ALLOWinherited from acme/user/v1/user
Used by
What will be affected if this symbol changes.