@lepsto/sdk-app 91.0.1 → 92.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -122109,9 +122109,9 @@ export interface UsersApikeysCreateInput {
122109
122109
  */
122110
122110
  name: string;
122111
122111
  /**
122112
- * 'server' mints a SECRET key (usk_…) for the Product's backend — returned exactly once and stored hashed. 'publishable' mints a non-secret key (upk_…) that identifies this product in browser flows and stays readable.
122112
+ * 'publishable' mints a non-secret key (upk_…) that identifies this product in browser flows and stays readable. It is the only key type: the secret server key (usk_…) is retired.
122113
122113
  */
122114
- type: ("server" | "publishable");
122114
+ type: "publishable";
122115
122115
  }
122116
122116
  export interface UsersApikeysCreateOutput {
122117
122117
  /**
@@ -122127,15 +122127,15 @@ export interface UsersApikeysCreateOutput {
122127
122127
  */
122128
122128
  name: string;
122129
122129
  /**
122130
- * `server` for a secret backend key (usk_…), `publishable` for a browser-safe one (upk_…).
122130
+ * `publishable` — a browser-safe key (upk_…). It is the only type.
122131
122131
  */
122132
- type: ("server" | "publishable");
122132
+ type: "publishable";
122133
122133
  /**
122134
- * The full value of a publishable key, which is not a secret. Null for a server key — that value exists in exactly one response, ever.
122134
+ * The full value of the key, which is not a secret and stays readable.
122135
122135
  */
122136
122136
  value: (string | null);
122137
122137
  /**
122138
- * `usk_`/`upk_` plus six characters — enough to recognise a key, never to use one.
122138
+ * `upk_` plus six characters — enough to recognise a key, never to use one.
122139
122139
  */
122140
122140
  prefix: string;
122141
122141
  /**
@@ -122163,15 +122163,15 @@ export interface UsersApikeysGetOutput {
122163
122163
  */
122164
122164
  name: string;
122165
122165
  /**
122166
- * `server` for a secret backend key (usk_…), `publishable` for a browser-safe one (upk_…).
122166
+ * `publishable` — a browser-safe key (upk_…). It is the only type.
122167
122167
  */
122168
- type: ("server" | "publishable");
122168
+ type: "publishable";
122169
122169
  /**
122170
- * The full value of a publishable key, which is not a secret. Null for a server key — that value exists in exactly one response, ever.
122170
+ * The full value of the key, which is not a secret and stays readable.
122171
122171
  */
122172
122172
  value: (string | null);
122173
122173
  /**
122174
- * `usk_`/`upk_` plus six characters — enough to recognise a key, never to use one.
122174
+ * `upk_` plus six characters — enough to recognise a key, never to use one.
122175
122175
  */
122176
122176
  prefix: string;
122177
122177
  /**
@@ -122196,15 +122196,15 @@ export interface UsersApikeysListOutput {
122196
122196
  */
122197
122197
  name: string;
122198
122198
  /**
122199
- * `server` for a secret backend key (usk_…), `publishable` for a browser-safe one (upk_…).
122199
+ * `publishable` — a browser-safe key (upk_…). It is the only type.
122200
122200
  */
122201
- type: ("server" | "publishable");
122201
+ type: "publishable";
122202
122202
  /**
122203
- * The full value of a publishable key, which is not a secret. Null for a server key — that value exists in exactly one response, ever.
122203
+ * The full value of the key, which is not a secret and stays readable.
122204
122204
  */
122205
122205
  value: (string | null);
122206
122206
  /**
122207
- * `usk_`/`upk_` plus six characters — enough to recognise a key, never to use one.
122207
+ * `upk_` plus six characters — enough to recognise a key, never to use one.
122208
122208
  */
122209
122209
  prefix: string;
122210
122210
  /**
@@ -122363,7 +122363,7 @@ export interface UsersConfigGetOutput {
122363
122363
  */
122364
122364
  codeEnabled: boolean;
122365
122365
  /**
122366
- * Base URL magic links point at, e.g. "https://public.lessly.com/{productId}/users". Null uses the deployment default.
122366
+ * Base URL magic links point at, e.g. "https://public.lepsto.com/{productId}/users". Null uses the deployment default.
122367
122367
  */
122368
122368
  linkBaseUrl: (string | null);
122369
122369
  /**
@@ -122487,7 +122487,7 @@ export interface UsersConfigGetOutput {
122487
122487
  */
122488
122488
  doubleOptIn: boolean;
122489
122489
  /**
122490
- * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lessly Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
122490
+ * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lepsto Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
122491
122491
  */
122492
122492
  retentionDays: number;
122493
122493
  /**
@@ -122657,7 +122657,7 @@ export interface UsersConfigUpsertInput {
122657
122657
  */
122658
122658
  codeEnabled?: boolean;
122659
122659
  /**
122660
- * Base URL magic links point at, e.g. "https://public.lessly.com/{productId}/users". Null uses the deployment default.
122660
+ * Base URL magic links point at, e.g. "https://public.lepsto.com/{productId}/users". Null uses the deployment default.
122661
122661
  */
122662
122662
  linkBaseUrl?: (string | null);
122663
122663
  /**
@@ -122827,7 +122827,7 @@ export interface UsersConfigUpsertInput {
122827
122827
  */
122828
122828
  doubleOptIn?: boolean;
122829
122829
  /**
122830
- * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lessly Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
122830
+ * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lepsto Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
122831
122831
  */
122832
122832
  retentionDays?: number;
122833
122833
  /**
@@ -123039,7 +123039,7 @@ export interface UsersConfigUpsertOutput {
123039
123039
  */
123040
123040
  codeEnabled: boolean;
123041
123041
  /**
123042
- * Base URL magic links point at, e.g. "https://public.lessly.com/{productId}/users". Null uses the deployment default.
123042
+ * Base URL magic links point at, e.g. "https://public.lepsto.com/{productId}/users". Null uses the deployment default.
123043
123043
  */
123044
123044
  linkBaseUrl: (string | null);
123045
123045
  /**
@@ -123163,7 +123163,7 @@ export interface UsersConfigUpsertOutput {
123163
123163
  */
123164
123164
  doubleOptIn: boolean;
123165
123165
  /**
123166
- * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lessly Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
123166
+ * How long an UNCONVERTED waitlist entry — still pending, or invited and never registered — is kept, counted from SIGN-UP, before the sweep erases it. Default 180: Lepsto Privacy Policy §6 promises deletion 6 months from sign-up. The bound stays wide because a client Product answers to its own privacy policy, not ours.
123167
123167
  */
123168
123168
  retentionDays: number;
123169
123169
  /**
@@ -123493,11 +123493,11 @@ export interface UsersOpsRetentionGetOutput {
123493
123493
  */
123494
123494
  waitlistRetentionDays: number;
123495
123495
  /**
123496
- * What Lessly PUBLISHED, in its Privacy Policy §6: a waitlist address that never converted is deleted 6 months from sign-up. It rides along so the window above can be read against the promise it came from, rather than as a number with no provenance.
123496
+ * What Lepsto PUBLISHED, in its Privacy Policy §6: a waitlist address that never converted is deleted 6 months from sign-up. It rides along so the window above can be read against the promise it came from, rather than as a number with no provenance.
123497
123497
  */
123498
123498
  waitlistPromisedMaxDays: number;
123499
123499
  /**
123500
- * True when this product configured a window WIDER than the published 180 days. Nothing refuses such a value and nothing clamps it — §6 is Lessly’s own policy and a client Product answers to its own, under which a longer window may be perfectly lawful. This flag exists INSTEAD of that ceiling: a deliberate divergence from what Lessly published must be diagnosable in one call rather than found by comparing two numbers nobody thought to compare.
123500
+ * True when this product configured a window WIDER than the published 180 days. Nothing refuses such a value and nothing clamps it — §6 is Lepsto’s own policy and a client Product answers to its own, under which a longer window may be perfectly lawful. This flag exists INSTEAD of that ceiling: a deliberate divergence from what Lepsto published must be diagnosable in one call rather than found by comparing two numbers nobody thought to compare.
123501
123501
  */
123502
123502
  waitlistWiderThanPromised: boolean;
123503
123503
  }
@@ -123939,7 +123939,7 @@ export interface UsersStatsGetOutput {
123939
123939
  */
123940
123940
  since: string;
123941
123941
  /**
123942
- * Point-in-time directory populations by DERIVED status — `user` has no status column, these are computed from `waitlisted` and the ban/delete/erase timestamps.
123942
+ * Point-in-time directory populations by DERIVED status — `user` has no status column, these are computed from `kind`, `waitlisted` and the ban/delete/erase timestamps.
123943
123943
  */
123944
123944
  users: {
123945
123945
  /**
@@ -123947,7 +123947,7 @@ export interface UsersStatsGetOutput {
123947
123947
  */
123948
123948
  total: number;
123949
123949
  /**
123950
- * Full accounts: not waitlisted, not banned, not deleted, not erased.
123950
+ * Full accounts: kind 'account', not waitlisted, not banned, not deleted, not erased.
123951
123951
  */
123952
123952
  active: number;
123953
123953
  /**
@@ -123962,6 +123962,10 @@ export interface UsersStatsGetOutput {
123962
123962
  * SOFT-deleted and still recoverable — not erased.
123963
123963
  */
123964
123964
  deleted: number;
123965
+ /**
123966
+ * People the Product knows who have no credential and have never signed in (kind 'contact'), excluding deleted and erased ones. Never part of `active`, and never billed as retained users.
123967
+ */
123968
+ contacts: number;
123965
123969
  /**
123966
123970
  * Waitlist signups with no credential yet.
123967
123971
  */
@@ -124015,6 +124019,243 @@ export interface UsersStatsGetOutput {
124015
124019
  createdInWindow: number;
124016
124020
  };
124017
124021
  }
124022
+ export interface UsersTouchesCreateInput {
124023
+ /**
124024
+ * What was said or done, free text, 1-8192 characters. Personal data: it is whatever an operator typed about this person.
124025
+ */
124026
+ body: string;
124027
+ /**
124028
+ * The end user this interaction was with.
124029
+ */
124030
+ userId: string;
124031
+ /**
124032
+ * How the person was touched: 'message', 'call', 'meeting', 'note' (an internal observation nobody sent) or 'email' sent OUTSIDE the platform. Email this toolkit sent is not logged here — read those from the mail toolkit.
124033
+ */
124034
+ channel: ("message" | "call" | "meeting" | "note" | "email");
124035
+ /**
124036
+ * Which way it went: 'outbound' (you reached them), 'inbound' (they reached you) or 'none'. A 'note' or a 'meeting' must be 'none'.
124037
+ */
124038
+ direction: ("outbound" | "inbound" | "none");
124039
+ /**
124040
+ * When it happened (ISO 8601). Omit to mean now — pass it when logging after the fact, which may be any time in the past.
124041
+ */
124042
+ occurredAt?: string;
124043
+ }
124044
+ export interface UsersTouchesCreateOutput {
124045
+ /**
124046
+ * Id of this touch. Pass it to users_touches_update or _delete.
124047
+ */
124048
+ id: string;
124049
+ /**
124050
+ * What was said or done, free text, 1-8192 characters. Personal data: it is whatever an operator typed about this person.
124051
+ */
124052
+ body: string;
124053
+ /**
124054
+ * The end user this interaction was with.
124055
+ */
124056
+ userId: string;
124057
+ /**
124058
+ * Id of the operator or agent that logged it, verbatim.
124059
+ */
124060
+ actorId: string;
124061
+ /**
124062
+ * How the person was touched: 'message', 'call', 'meeting', 'note' (an internal observation nobody sent) or 'email' sent OUTSIDE the platform. Email this toolkit sent is not logged here — read those from the mail toolkit.
124063
+ */
124064
+ channel: ("message" | "call" | "meeting" | "note" | "email");
124065
+ /**
124066
+ * Who logged it: 'operator' (a human) or 'agent' (a workflow or agent principal).
124067
+ */
124068
+ actorType: ("operator" | "agent");
124069
+ /**
124070
+ * When the touch was logged (ISO 8601).
124071
+ */
124072
+ createdAt: string;
124073
+ /**
124074
+ * Which way it went: 'outbound' (you reached them), 'inbound' (they reached you) or 'none'. A 'note' or a 'meeting' must be 'none'.
124075
+ */
124076
+ direction: ("outbound" | "inbound" | "none");
124077
+ /**
124078
+ * Product this touch belongs to. Never an input — it comes from the calling identity.
124079
+ */
124080
+ productId: string;
124081
+ /**
124082
+ * When the touch was last edited (ISO 8601).
124083
+ */
124084
+ updatedAt: string;
124085
+ /**
124086
+ * When the interaction happened (ISO 8601) — not when it was logged.
124087
+ */
124088
+ occurredAt: string;
124089
+ }
124090
+ export interface UsersTouchesDiscardInput {
124091
+ /**
124092
+ * Act on a touch somebody else logged. Without it a touch you did not author answers 404, exactly as a touch that does not exist does — the refusal must not tell you the row is there. Every forced call is recorded in the audit trail.
124093
+ */
124094
+ force?: boolean;
124095
+ /**
124096
+ * The end user the touch belongs to.
124097
+ */
124098
+ userId: string;
124099
+ /**
124100
+ * The touch to delete, from users_touches_list.
124101
+ */
124102
+ touchId: string;
124103
+ }
124104
+ export interface UsersTouchesDiscardOutput {
124105
+ /**
124106
+ * Id of the touch that was deleted.
124107
+ */
124108
+ id: string;
124109
+ /**
124110
+ * The end user it belonged to.
124111
+ */
124112
+ userId: string;
124113
+ /**
124114
+ * Always true — a failure answers 404 instead.
124115
+ */
124116
+ deleted: true;
124117
+ }
124118
+ export interface UsersTouchesListInput {
124119
+ /**
124120
+ * Page size, 1-100. Default 50.
124121
+ */
124122
+ limit?: number;
124123
+ /**
124124
+ * Opaque cursor from a previous response's `nextCursor`. Omit for the first page.
124125
+ */
124126
+ cursor?: string;
124127
+ /**
124128
+ * The end user whose touches to list.
124129
+ */
124130
+ userId: string;
124131
+ /**
124132
+ * Only touches on this channel. Omit for all of them.
124133
+ */
124134
+ channel?: ("message" | "call" | "meeting" | "note" | "email");
124135
+ }
124136
+ export interface UsersTouchesListOutput {
124137
+ /**
124138
+ * The page of touches, newest first.
124139
+ */
124140
+ items: {
124141
+ /**
124142
+ * Id of this touch. Pass it to users_touches_update or _delete.
124143
+ */
124144
+ id: string;
124145
+ /**
124146
+ * What was said or done, free text, 1-8192 characters. Personal data: it is whatever an operator typed about this person.
124147
+ */
124148
+ body: string;
124149
+ /**
124150
+ * The end user this interaction was with.
124151
+ */
124152
+ userId: string;
124153
+ /**
124154
+ * Id of the operator or agent that logged it, verbatim.
124155
+ */
124156
+ actorId: string;
124157
+ /**
124158
+ * How the person was touched: 'message', 'call', 'meeting', 'note' (an internal observation nobody sent) or 'email' sent OUTSIDE the platform. Email this toolkit sent is not logged here — read those from the mail toolkit.
124159
+ */
124160
+ channel: ("message" | "call" | "meeting" | "note" | "email");
124161
+ /**
124162
+ * Who logged it: 'operator' (a human) or 'agent' (a workflow or agent principal).
124163
+ */
124164
+ actorType: ("operator" | "agent");
124165
+ /**
124166
+ * When the touch was logged (ISO 8601).
124167
+ */
124168
+ createdAt: string;
124169
+ /**
124170
+ * Which way it went: 'outbound' (you reached them), 'inbound' (they reached you) or 'none'. A 'note' or a 'meeting' must be 'none'.
124171
+ */
124172
+ direction: ("outbound" | "inbound" | "none");
124173
+ /**
124174
+ * Product this touch belongs to. Never an input — it comes from the calling identity.
124175
+ */
124176
+ productId: string;
124177
+ /**
124178
+ * When the touch was last edited (ISO 8601).
124179
+ */
124180
+ updatedAt: string;
124181
+ /**
124182
+ * When the interaction happened (ISO 8601) — not when it was logged.
124183
+ */
124184
+ occurredAt: string;
124185
+ }[];
124186
+ /**
124187
+ * Pass as `cursor` for the next page. Null when this was the last one.
124188
+ */
124189
+ nextCursor: (string | null);
124190
+ }
124191
+ export interface UsersTouchesUpdateInput {
124192
+ /**
124193
+ * Replacement text, 1-8192 characters. Omit to leave it unchanged.
124194
+ */
124195
+ body?: string;
124196
+ /**
124197
+ * Act on a touch somebody else logged. Without it a touch you did not author answers 404, exactly as a touch that does not exist does — the refusal must not tell you the row is there. Every forced call is recorded in the audit trail.
124198
+ */
124199
+ force?: boolean;
124200
+ /**
124201
+ * The end user the touch belongs to.
124202
+ */
124203
+ userId: string;
124204
+ /**
124205
+ * The touch to edit, from users_touches_list.
124206
+ */
124207
+ touchId: string;
124208
+ /**
124209
+ * Correct when it happened (ISO 8601). Omit to leave it unchanged.
124210
+ */
124211
+ occurredAt?: string;
124212
+ }
124213
+ export interface UsersTouchesUpdateOutput {
124214
+ /**
124215
+ * Id of this touch. Pass it to users_touches_update or _delete.
124216
+ */
124217
+ id: string;
124218
+ /**
124219
+ * What was said or done, free text, 1-8192 characters. Personal data: it is whatever an operator typed about this person.
124220
+ */
124221
+ body: string;
124222
+ /**
124223
+ * The end user this interaction was with.
124224
+ */
124225
+ userId: string;
124226
+ /**
124227
+ * Id of the operator or agent that logged it, verbatim.
124228
+ */
124229
+ actorId: string;
124230
+ /**
124231
+ * How the person was touched: 'message', 'call', 'meeting', 'note' (an internal observation nobody sent) or 'email' sent OUTSIDE the platform. Email this toolkit sent is not logged here — read those from the mail toolkit.
124232
+ */
124233
+ channel: ("message" | "call" | "meeting" | "note" | "email");
124234
+ /**
124235
+ * Who logged it: 'operator' (a human) or 'agent' (a workflow or agent principal).
124236
+ */
124237
+ actorType: ("operator" | "agent");
124238
+ /**
124239
+ * When the touch was logged (ISO 8601).
124240
+ */
124241
+ createdAt: string;
124242
+ /**
124243
+ * Which way it went: 'outbound' (you reached them), 'inbound' (they reached you) or 'none'. A 'note' or a 'meeting' must be 'none'.
124244
+ */
124245
+ direction: ("outbound" | "inbound" | "none");
124246
+ /**
124247
+ * Product this touch belongs to. Never an input — it comes from the calling identity.
124248
+ */
124249
+ productId: string;
124250
+ /**
124251
+ * When the touch was last edited (ISO 8601).
124252
+ */
124253
+ updatedAt: string;
124254
+ /**
124255
+ * When the interaction happened (ISO 8601) — not when it was logged.
124256
+ */
124257
+ occurredAt: string;
124258
+ }
124018
124259
  export interface UsersUsersBanInput {
124019
124260
  /**
124020
124261
  * The opaque user id returned by users_users_create or _list.
@@ -124026,10 +124267,22 @@ export interface UsersUsersBanOutput {
124026
124267
  * Id of this end user. Pass it to any users_users_* tool.
124027
124268
  */
124028
124269
  id: string;
124270
+ /**
124271
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
124272
+ */
124273
+ kind: ("account" | "contact");
124029
124274
  /**
124030
124275
  * The user's display name. Null when nobody set one.
124031
124276
  */
124032
124277
  name: (string | null);
124278
+ /**
124279
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
124280
+ */
124281
+ tags: string[];
124282
+ /**
124283
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
124284
+ */
124285
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
124033
124286
  /**
124034
124287
  * When the user was banned (ISO 8601). Null while they are not banned.
124035
124288
  */
@@ -124062,6 +124315,10 @@ export interface UsersUsersBanOutput {
124062
124315
  * When the user was last changed (ISO 8601).
124063
124316
  */
124064
124317
  updatedAt: string;
124318
+ /**
124319
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
124320
+ */
124321
+ mergedFrom: (string | null);
124065
124322
  /**
124066
124323
  * Whether this user is still on the waitlist and cannot sign in yet.
124067
124324
  */
@@ -124075,9 +124332,9 @@ export interface UsersUsersBanOutput {
124075
124332
  */
124076
124333
  id: string;
124077
124334
  /**
124078
- * What kind of identifier this is. Today always `email`.
124335
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
124079
124336
  */
124080
- type: "email";
124337
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x");
124081
124338
  /**
124082
124339
  * The address as the user typed it, for display.
124083
124340
  */
@@ -124099,6 +124356,10 @@ export interface UsersUsersBanOutput {
124099
124356
  */
124100
124357
  verificationStatus: ("unverified" | "verified" | "expired");
124101
124358
  }[];
124359
+ /**
124360
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
124361
+ */
124362
+ lastTouchAt: (string | null);
124102
124363
  /**
124103
124364
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
124104
124365
  */
@@ -124133,6 +124394,10 @@ export interface UsersUsersBanOutput {
124133
124394
  privateMetadata: {
124134
124395
  [k: string]: unknown;
124135
124396
  };
124397
+ /**
124398
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
124399
+ */
124400
+ mergedIntoUserId: (string | null);
124136
124401
  /**
124137
124402
  * Id of the primary identifier row. Null when there is no primary identifier.
124138
124403
  */
@@ -124143,10 +124408,22 @@ export interface UsersUsersBanOutput {
124143
124408
  emailChangeLockedUntil: (string | null);
124144
124409
  }
124145
124410
  export interface UsersUsersCreateInput {
124411
+ /**
124412
+ * What kind of person to create. 'account' (the default) can sign in. 'contact' is somebody the Product knows who has NO credential — a contact may not carry `password`, `waitlisted` or `requiresReset` (`contact_cannot_hold_credentials`), is hidden from the default users_users_list view, and is never counted as a retained user. A contact becomes an account only by proving an address, never by an operator setting this.
124413
+ */
124414
+ kind?: ("account" | "contact");
124146
124415
  /**
124147
124416
  * The user's display name.
124148
124417
  */
124149
124418
  name?: string;
124419
+ /**
124420
+ * Free labels for this person. Trimmed, lowercased and de-duplicated on write; at most 32 of at most 64 characters each.
124421
+ */
124422
+ tags?: string[];
124423
+ /**
124424
+ * The relationship stage to start them at, in funnel order: new, contacted, replied, engaged, converted, lost. Default 'new'.
124425
+ */
124426
+ stage?: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
124150
124427
  /**
124151
124428
  * URL of the user's avatar image.
124152
124429
  */
@@ -124177,7 +124454,7 @@ export interface UsersUsersCreateInput {
124177
124454
  */
124178
124455
  waitlisted?: boolean;
124179
124456
  /**
124180
- * The email addresses that reach this user. At least one is required.
124457
+ * How this user is reached: their email addresses, plus any contact channels (`phone`, `telegram`, `linkedin`, `x`). At least one is required.
124181
124458
  *
124182
124459
  * @minItems 1
124183
124460
  */
@@ -124186,13 +124463,13 @@ export interface UsersUsersCreateInput {
124186
124463
  /**
124187
124464
  * Identifier kind. Only 'email' exists in this phase.
124188
124465
  */
124189
- type: "email";
124466
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x");
124190
124467
  /**
124191
124468
  * The email address. Stored canonicalised (lowercase, NFC) plus raw for display.
124192
124469
  */
124193
124470
  value: string;
124194
124471
  /**
124195
- * Record the identifier as already verified (use for trusted imports). Only ONE verified copy of a value may exist per product; unverified duplicates are allowed. Default false.
124472
+ * Record the identifier as already verified (use for trusted imports). IGNORED for contact channels, which are always stored unverified — nothing here can prove a phone or a handle. Only ONE verified copy of an email may exist per product; unverified duplicates are allowed. Default false.
124196
124473
  */
124197
124474
  verified?: boolean;
124198
124475
  /**
@@ -124204,13 +124481,13 @@ export interface UsersUsersCreateInput {
124204
124481
  /**
124205
124482
  * Identifier kind. Only 'email' exists in this phase.
124206
124483
  */
124207
- type: "email";
124484
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x");
124208
124485
  /**
124209
124486
  * The email address. Stored canonicalised (lowercase, NFC) plus raw for display.
124210
124487
  */
124211
124488
  value: string;
124212
124489
  /**
124213
- * Record the identifier as already verified (use for trusted imports). Only ONE verified copy of a value may exist per product; unverified duplicates are allowed. Default false.
124490
+ * Record the identifier as already verified (use for trusted imports). IGNORED for contact channels, which are always stored unverified — nothing here can prove a phone or a handle. Only ONE verified copy of an email may exist per product; unverified duplicates are allowed. Default false.
124214
124491
  */
124215
124492
  verified?: boolean;
124216
124493
  /**
@@ -124249,10 +124526,22 @@ export interface UsersUsersCreateOutput {
124249
124526
  * Id of this end user. Pass it to any users_users_* tool.
124250
124527
  */
124251
124528
  id: string;
124529
+ /**
124530
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
124531
+ */
124532
+ kind: ("account" | "contact");
124252
124533
  /**
124253
124534
  * The user's display name. Null when nobody set one.
124254
124535
  */
124255
124536
  name: (string | null);
124537
+ /**
124538
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
124539
+ */
124540
+ tags: string[];
124541
+ /**
124542
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
124543
+ */
124544
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
124256
124545
  /**
124257
124546
  * When the user was banned (ISO 8601). Null while they are not banned.
124258
124547
  */
@@ -124285,6 +124574,10 @@ export interface UsersUsersCreateOutput {
124285
124574
  * When the user was last changed (ISO 8601).
124286
124575
  */
124287
124576
  updatedAt: string;
124577
+ /**
124578
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
124579
+ */
124580
+ mergedFrom: (string | null);
124288
124581
  /**
124289
124582
  * Whether this user is still on the waitlist and cannot sign in yet.
124290
124583
  */
@@ -124298,9 +124591,9 @@ export interface UsersUsersCreateOutput {
124298
124591
  */
124299
124592
  id: string;
124300
124593
  /**
124301
- * What kind of identifier this is. Today always `email`.
124594
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
124302
124595
  */
124303
- type: "email";
124596
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x");
124304
124597
  /**
124305
124598
  * The address as the user typed it, for display.
124306
124599
  */
@@ -124322,6 +124615,10 @@ export interface UsersUsersCreateOutput {
124322
124615
  */
124323
124616
  verificationStatus: ("unverified" | "verified" | "expired");
124324
124617
  }[];
124618
+ /**
124619
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
124620
+ */
124621
+ lastTouchAt: (string | null);
124325
124622
  /**
124326
124623
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
124327
124624
  */
@@ -124356,6 +124653,10 @@ export interface UsersUsersCreateOutput {
124356
124653
  privateMetadata: {
124357
124654
  [k: string]: unknown;
124358
124655
  };
124656
+ /**
124657
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
124658
+ */
124659
+ mergedIntoUserId: (string | null);
124359
124660
  /**
124360
124661
  * Id of the primary identifier row. Null when there is no primary identifier.
124361
124662
  */
@@ -124376,10 +124677,22 @@ export interface UsersUsersDeleteOutput {
124376
124677
  * Id of this end user. Pass it to any users_users_* tool.
124377
124678
  */
124378
124679
  id: string;
124680
+ /**
124681
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
124682
+ */
124683
+ kind: ("account" | "contact");
124379
124684
  /**
124380
124685
  * The user's display name. Null when nobody set one.
124381
124686
  */
124382
124687
  name: (string | null);
124688
+ /**
124689
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
124690
+ */
124691
+ tags: string[];
124692
+ /**
124693
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
124694
+ */
124695
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
124383
124696
  /**
124384
124697
  * When the user was banned (ISO 8601). Null while they are not banned.
124385
124698
  */
@@ -124412,6 +124725,10 @@ export interface UsersUsersDeleteOutput {
124412
124725
  * When the user was last changed (ISO 8601).
124413
124726
  */
124414
124727
  updatedAt: string;
124728
+ /**
124729
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
124730
+ */
124731
+ mergedFrom: (string | null);
124415
124732
  /**
124416
124733
  * Whether this user is still on the waitlist and cannot sign in yet.
124417
124734
  */
@@ -124425,9 +124742,9 @@ export interface UsersUsersDeleteOutput {
124425
124742
  */
124426
124743
  id: string;
124427
124744
  /**
124428
- * What kind of identifier this is. Today always `email`.
124745
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
124429
124746
  */
124430
- type: "email";
124747
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x");
124431
124748
  /**
124432
124749
  * The address as the user typed it, for display.
124433
124750
  */
@@ -124449,6 +124766,10 @@ export interface UsersUsersDeleteOutput {
124449
124766
  */
124450
124767
  verificationStatus: ("unverified" | "verified" | "expired");
124451
124768
  }[];
124769
+ /**
124770
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
124771
+ */
124772
+ lastTouchAt: (string | null);
124452
124773
  /**
124453
124774
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
124454
124775
  */
@@ -124483,6 +124804,10 @@ export interface UsersUsersDeleteOutput {
124483
124804
  privateMetadata: {
124484
124805
  [k: string]: unknown;
124485
124806
  };
124807
+ /**
124808
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
124809
+ */
124810
+ mergedIntoUserId: (string | null);
124486
124811
  /**
124487
124812
  * Id of the primary identifier row. Null when there is no primary identifier.
124488
124813
  */
@@ -124493,6 +124818,10 @@ export interface UsersUsersDeleteOutput {
124493
124818
  emailChangeLockedUntil: (string | null);
124494
124819
  }
124495
124820
  export interface UsersUsersExportInput {
124821
+ /**
124822
+ * Filter by kind: 'account' or 'contact'. Omit for accounts only, unless `includeContacts` is true.
124823
+ */
124824
+ kind?: ("account" | "contact");
124496
124825
  /**
124497
124826
  * Rows per page, 1-500. Default 100.
124498
124827
  */
@@ -124513,6 +124842,10 @@ export interface UsersUsersExportInput {
124513
124842
  * Include soft-deleted users. Default false.
124514
124843
  */
124515
124844
  includeDeleted?: boolean;
124845
+ /**
124846
+ * Include CONTACTS alongside accounts, so one pass exports both. Default false — the same rule this export already applies to waitlist signups and test users.
124847
+ */
124848
+ includeContacts?: boolean;
124516
124849
  }
124517
124850
  export interface UsersUsersExportOutput {
124518
124851
  count: number;
@@ -124521,10 +124854,22 @@ export interface UsersUsersExportOutput {
124521
124854
  * Id of this end user. Pass it to any users_users_* tool.
124522
124855
  */
124523
124856
  id: string;
124857
+ /**
124858
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
124859
+ */
124860
+ kind: ("account" | "contact");
124524
124861
  /**
124525
124862
  * The user's display name. Null when nobody set one.
124526
124863
  */
124527
124864
  name: (string | null);
124865
+ /**
124866
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
124867
+ */
124868
+ tags: string[];
124869
+ /**
124870
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
124871
+ */
124872
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
124528
124873
  /**
124529
124874
  * When the user was banned (ISO 8601). Null while they are not banned.
124530
124875
  */
@@ -124557,6 +124902,10 @@ export interface UsersUsersExportOutput {
124557
124902
  * When the user was last changed (ISO 8601).
124558
124903
  */
124559
124904
  updatedAt: string;
124905
+ /**
124906
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
124907
+ */
124908
+ mergedFrom: (string | null);
124560
124909
  /**
124561
124910
  * Whether this user is still on the waitlist and cannot sign in yet.
124562
124911
  */
@@ -124570,9 +124919,9 @@ export interface UsersUsersExportOutput {
124570
124919
  */
124571
124920
  id: string;
124572
124921
  /**
124573
- * What kind of identifier this is. Today always `email`.
124922
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
124574
124923
  */
124575
- type: "email";
124924
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x");
124576
124925
  /**
124577
124926
  * The address as the user typed it, for display.
124578
124927
  */
@@ -124594,6 +124943,10 @@ export interface UsersUsersExportOutput {
124594
124943
  */
124595
124944
  verificationStatus: ("unverified" | "verified" | "expired");
124596
124945
  }[];
124946
+ /**
124947
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
124948
+ */
124949
+ lastTouchAt: (string | null);
124597
124950
  /**
124598
124951
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
124599
124952
  */
@@ -124628,6 +124981,10 @@ export interface UsersUsersExportOutput {
124628
124981
  privateMetadata: {
124629
124982
  [k: string]: unknown;
124630
124983
  };
124984
+ /**
124985
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
124986
+ */
124987
+ mergedIntoUserId: (string | null);
124631
124988
  /**
124632
124989
  * Id of the primary identifier row. Null when there is no primary identifier.
124633
124990
  */
@@ -124651,10 +125008,22 @@ export interface UsersUsersGetOutput {
124651
125008
  * Id of this end user. Pass it to any users_users_* tool.
124652
125009
  */
124653
125010
  id: string;
125011
+ /**
125012
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
125013
+ */
125014
+ kind: ("account" | "contact");
124654
125015
  /**
124655
125016
  * The user's display name. Null when nobody set one.
124656
125017
  */
124657
125018
  name: (string | null);
125019
+ /**
125020
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
125021
+ */
125022
+ tags: string[];
125023
+ /**
125024
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
125025
+ */
125026
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
124658
125027
  /**
124659
125028
  * When the user was banned (ISO 8601). Null while they are not banned.
124660
125029
  */
@@ -124687,6 +125056,10 @@ export interface UsersUsersGetOutput {
124687
125056
  * When the user was last changed (ISO 8601).
124688
125057
  */
124689
125058
  updatedAt: string;
125059
+ /**
125060
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
125061
+ */
125062
+ mergedFrom: (string | null);
124690
125063
  /**
124691
125064
  * Whether this user is still on the waitlist and cannot sign in yet.
124692
125065
  */
@@ -124700,9 +125073,9 @@ export interface UsersUsersGetOutput {
124700
125073
  */
124701
125074
  id: string;
124702
125075
  /**
124703
- * What kind of identifier this is. Today always `email`.
125076
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
124704
125077
  */
124705
- type: "email";
125078
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x");
124706
125079
  /**
124707
125080
  * The address as the user typed it, for display.
124708
125081
  */
@@ -124724,6 +125097,10 @@ export interface UsersUsersGetOutput {
124724
125097
  */
124725
125098
  verificationStatus: ("unverified" | "verified" | "expired");
124726
125099
  }[];
125100
+ /**
125101
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
125102
+ */
125103
+ lastTouchAt: (string | null);
124727
125104
  /**
124728
125105
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
124729
125106
  */
@@ -124758,6 +125135,10 @@ export interface UsersUsersGetOutput {
124758
125135
  privateMetadata: {
124759
125136
  [k: string]: unknown;
124760
125137
  };
125138
+ /**
125139
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
125140
+ */
125141
+ mergedIntoUserId: (string | null);
124761
125142
  /**
124762
125143
  * Id of the primary identifier row. Null when there is no primary identifier.
124763
125144
  */
@@ -124810,6 +125191,10 @@ export interface UsersUsersImportOutput {
124810
125191
  * How many rows were passed over — an address already in the directory, typically.
124811
125192
  */
124812
125193
  skipped: number;
125194
+ /**
125195
+ * How many of the CREATED users were contacts (`kind: 'contact'`). A row that was skipped or failed is not counted.
125196
+ */
125197
+ contacts: number;
124813
125198
  /**
124814
125199
  * How many rows you submitted.
124815
125200
  */
@@ -124856,6 +125241,14 @@ export interface UsersUsersInviteOutput {
124856
125241
  expiresAt: string;
124857
125242
  }
124858
125243
  export interface UsersUsersListInput {
125244
+ /**
125245
+ * Return only people carrying this tag. ONE tag, matched against the stored (lowercased) value and ANDed with the other filters.
125246
+ */
125247
+ tag?: string;
125248
+ /**
125249
+ * Filter by kind: 'account' or 'contact'. Passing 'contact' is how you list contacts — they are hidden otherwise. Omit for accounts only, unless `includeContacts` is true.
125250
+ */
125251
+ kind?: ("account" | "contact");
124859
125252
  /**
124860
125253
  * Page size, 1-100. Default 25.
124861
125254
  */
@@ -124864,6 +125257,10 @@ export interface UsersUsersListInput {
124864
125257
  * Case-insensitive substring match against the user's identifiers (email) and name.
124865
125258
  */
124866
125259
  query?: string;
125260
+ /**
125261
+ * Filter by relationship stage: new, contacted, replied, engaged, converted or lost. Omit for every stage.
125262
+ */
125263
+ stage?: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
124867
125264
  /**
124868
125265
  * Opaque cursor from a previous response's `nextCursor`. Omit for the first page.
124869
125266
  */
@@ -124876,6 +125273,18 @@ export interface UsersUsersListInput {
124876
125273
  * Include soft-deleted users. Default false — deleted users are hidden.
124877
125274
  */
124878
125275
  includeDeleted?: boolean;
125276
+ /**
125277
+ * Only people whose most recent logged interaction happened at or after this instant (ISO 8601). People never touched are EXCLUDED by this filter — list without it to see everyone.
125278
+ */
125279
+ lastTouchAfter?: string;
125280
+ /**
125281
+ * Include CONTACTS. Default false: a contact has no credential and has never signed in, so it is not part of the directory an operator browses — the same rule waitlist signups and test users follow. Use `kind: "contact"` to see only them.
125282
+ */
125283
+ includeContacts?: boolean;
125284
+ /**
125285
+ * Only people whose most recent logged interaction happened before this instant (ISO 8601) — the "gone quiet" list. People never touched are EXCLUDED rather than treated as infinitely stale; list without this filter to see everyone.
125286
+ */
125287
+ lastTouchBefore?: string;
124879
125288
  /**
124880
125289
  * Include TEST USERS. Default false: a test user is a fixture, not a customer — it is excluded from metering and from this listing for the same reason. Ask for it explicitly when you are debugging the fixtures themselves.
124881
125290
  */
@@ -124894,10 +125303,22 @@ export interface UsersUsersListOutput {
124894
125303
  * Id of this end user. Pass it to any users_users_* tool.
124895
125304
  */
124896
125305
  id: string;
125306
+ /**
125307
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
125308
+ */
125309
+ kind: ("account" | "contact");
124897
125310
  /**
124898
125311
  * The user's display name. Null when nobody set one.
124899
125312
  */
124900
125313
  name: (string | null);
125314
+ /**
125315
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
125316
+ */
125317
+ tags: string[];
125318
+ /**
125319
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
125320
+ */
125321
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
124901
125322
  /**
124902
125323
  * When the user was banned (ISO 8601). Null while they are not banned.
124903
125324
  */
@@ -124930,6 +125351,10 @@ export interface UsersUsersListOutput {
124930
125351
  * When the user was last changed (ISO 8601).
124931
125352
  */
124932
125353
  updatedAt: string;
125354
+ /**
125355
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
125356
+ */
125357
+ mergedFrom: (string | null);
124933
125358
  /**
124934
125359
  * Whether this user is still on the waitlist and cannot sign in yet.
124935
125360
  */
@@ -124943,9 +125368,9 @@ export interface UsersUsersListOutput {
124943
125368
  */
124944
125369
  id: string;
124945
125370
  /**
124946
- * What kind of identifier this is. Today always `email`.
125371
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
124947
125372
  */
124948
- type: "email";
125373
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x");
124949
125374
  /**
124950
125375
  * The address as the user typed it, for display.
124951
125376
  */
@@ -124967,6 +125392,10 @@ export interface UsersUsersListOutput {
124967
125392
  */
124968
125393
  verificationStatus: ("unverified" | "verified" | "expired");
124969
125394
  }[];
125395
+ /**
125396
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
125397
+ */
125398
+ lastTouchAt: (string | null);
124970
125399
  /**
124971
125400
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
124972
125401
  */
@@ -125001,6 +125430,10 @@ export interface UsersUsersListOutput {
125001
125430
  privateMetadata: {
125002
125431
  [k: string]: unknown;
125003
125432
  };
125433
+ /**
125434
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
125435
+ */
125436
+ mergedIntoUserId: (string | null);
125004
125437
  /**
125005
125438
  * Id of the primary identifier row. Null when there is no primary identifier.
125006
125439
  */
@@ -125050,10 +125483,22 @@ export interface UsersUsersUnbanOutput {
125050
125483
  * Id of this end user. Pass it to any users_users_* tool.
125051
125484
  */
125052
125485
  id: string;
125486
+ /**
125487
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
125488
+ */
125489
+ kind: ("account" | "contact");
125053
125490
  /**
125054
125491
  * The user's display name. Null when nobody set one.
125055
125492
  */
125056
125493
  name: (string | null);
125494
+ /**
125495
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
125496
+ */
125497
+ tags: string[];
125498
+ /**
125499
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
125500
+ */
125501
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
125057
125502
  /**
125058
125503
  * When the user was banned (ISO 8601). Null while they are not banned.
125059
125504
  */
@@ -125086,6 +125531,10 @@ export interface UsersUsersUnbanOutput {
125086
125531
  * When the user was last changed (ISO 8601).
125087
125532
  */
125088
125533
  updatedAt: string;
125534
+ /**
125535
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
125536
+ */
125537
+ mergedFrom: (string | null);
125089
125538
  /**
125090
125539
  * Whether this user is still on the waitlist and cannot sign in yet.
125091
125540
  */
@@ -125099,9 +125548,9 @@ export interface UsersUsersUnbanOutput {
125099
125548
  */
125100
125549
  id: string;
125101
125550
  /**
125102
- * What kind of identifier this is. Today always `email`.
125551
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
125103
125552
  */
125104
- type: "email";
125553
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x");
125105
125554
  /**
125106
125555
  * The address as the user typed it, for display.
125107
125556
  */
@@ -125123,6 +125572,10 @@ export interface UsersUsersUnbanOutput {
125123
125572
  */
125124
125573
  verificationStatus: ("unverified" | "verified" | "expired");
125125
125574
  }[];
125575
+ /**
125576
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
125577
+ */
125578
+ lastTouchAt: (string | null);
125126
125579
  /**
125127
125580
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
125128
125581
  */
@@ -125157,6 +125610,10 @@ export interface UsersUsersUnbanOutput {
125157
125610
  privateMetadata: {
125158
125611
  [k: string]: unknown;
125159
125612
  };
125613
+ /**
125614
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
125615
+ */
125616
+ mergedIntoUserId: (string | null);
125160
125617
  /**
125161
125618
  * Id of the primary identifier row. Null when there is no primary identifier.
125162
125619
  */
@@ -125171,6 +125628,14 @@ export interface UsersUsersUpdateInput {
125171
125628
  * The user's display name. Pass null to clear.
125172
125629
  */
125173
125630
  name?: (string | null);
125631
+ /**
125632
+ * REPLACES the whole tag list — send every tag you want stored, not just the new ones. Trimmed, lowercased and de-duplicated on write.
125633
+ */
125634
+ tags?: string[];
125635
+ /**
125636
+ * Move the person to this relationship stage. A real change publishes `users/user.stage-changed`; a patch that changes ONLY the stage deliberately does not also publish `users/user.updated`, so a workflow that writes stages does not wake itself.
125637
+ */
125638
+ stage?: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
125174
125639
  /**
125175
125640
  * The user to update.
125176
125641
  */
@@ -125217,10 +125682,22 @@ export interface UsersUsersUpdateOutput {
125217
125682
  * Id of this end user. Pass it to any users_users_* tool.
125218
125683
  */
125219
125684
  id: string;
125685
+ /**
125686
+ * What kind of person this row is: 'account' (can sign in) or 'contact' (known to the Product, no credential, never signed in). A contact is hidden from the default users_users_list view and is never counted as a retained user.
125687
+ */
125688
+ kind: ("account" | "contact");
125220
125689
  /**
125221
125690
  * The user's display name. Null when nobody set one.
125222
125691
  */
125223
125692
  name: (string | null);
125693
+ /**
125694
+ * Free labels on this person, stored trimmed, lowercased and de-duplicated.
125695
+ */
125696
+ tags: string[];
125697
+ /**
125698
+ * The relationship stage, in funnel order: new, contacted, replied, engaged, converted, lost. A real change publishes `users/user.stage-changed`.
125699
+ */
125700
+ stage: ("new" | "contacted" | "replied" | "engaged" | "converted" | "lost");
125224
125701
  /**
125225
125702
  * When the user was banned (ISO 8601). Null while they are not banned.
125226
125703
  */
@@ -125253,6 +125730,10 @@ export interface UsersUsersUpdateOutput {
125253
125730
  * When the user was last changed (ISO 8601).
125254
125731
  */
125255
125732
  updatedAt: string;
125733
+ /**
125734
+ * Set when you asked for an id that was merged into this account — it is the id you asked for, and this is the row it now lives in. Null on every ordinary read.
125735
+ */
125736
+ mergedFrom: (string | null);
125256
125737
  /**
125257
125738
  * Whether this user is still on the waitlist and cannot sign in yet.
125258
125739
  */
@@ -125266,9 +125747,9 @@ export interface UsersUsersUpdateOutput {
125266
125747
  */
125267
125748
  id: string;
125268
125749
  /**
125269
- * What kind of identifier this is. Today always `email`.
125750
+ * What kind of identifier this is: `email`, `phone`, `telegram`, `linkedin` or `x`. Only `email` can be signed in with — the other four are contact channels, reachable but never part of the auth plane.
125270
125751
  */
125271
- type: "email";
125752
+ type: ("email" | "phone" | "telegram" | "linkedin" | "x");
125272
125753
  /**
125273
125754
  * The address as the user typed it, for display.
125274
125755
  */
@@ -125290,6 +125771,10 @@ export interface UsersUsersUpdateOutput {
125290
125771
  */
125291
125772
  verificationStatus: ("unverified" | "verified" | "expired");
125292
125773
  }[];
125774
+ /**
125775
+ * When this person was last touched — the most recent logged interaction (ISO 8601). Null when nobody has logged one. This is when the interaction HAPPENED, not when it was logged.
125776
+ */
125777
+ lastTouchAt: (string | null);
125293
125778
  /**
125294
125779
  * When a failed-attempt lockout expires (ISO 8601). Null when the user is not locked out.
125295
125780
  */
@@ -125324,6 +125809,10 @@ export interface UsersUsersUpdateOutput {
125324
125809
  privateMetadata: {
125325
125810
  [k: string]: unknown;
125326
125811
  };
125812
+ /**
125813
+ * The user this person was merged INTO, when they were merged. Null for everybody else — follow it to find where their records went.
125814
+ */
125815
+ mergedIntoUserId: (string | null);
125327
125816
  /**
125328
125817
  * Id of the primary identifier row. Null when there is no primary identifier.
125329
125818
  */