@stable_sea/sdk 0.2.20 → 0.2.23

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.
package/README.md CHANGED
@@ -142,6 +142,12 @@ Use the member client before issuing an API key. Signup uses the existing
142
142
  business-email/OTP flow. After account and authenticator setup, sign in and select
143
143
  your business using the same session flow as Terminal.
144
144
 
145
+ Where the signup bot challenge is on, `GET /identity/bot_challenge_settings`
146
+ answers `required: true`, and the screener submit and code resend refuse a
147
+ request without a Cloudflare Turnstile `challenge_token` (`bot_challenge_required`,
148
+ `bot_challenge_failed`). Turnstile issues tokens only to its widget on a hostname
149
+ the site key allows.
150
+
145
151
  Read `/onboarding/status` and `/compliance/kyb/fields` to discover the current
146
152
  requirements and saved answers. Review registry proposals before confirming
147
153
  prefilled answers. Draft writes retain their native revision checks: send the
@@ -1491,7 +1491,7 @@ export interface components {
1491
1491
  /** @enum {string} */
1492
1492
  payment_rail: "onchain_ethereum" | "onchain_stellar" | "onchain_solana";
1493
1493
  /** @enum {string} */
1494
- symbol?: "USDC" | "XLM";
1494
+ symbol?: "USDC" | "XLM" | "YLDS";
1495
1495
  };
1496
1496
  ExternalWalletHolding: {
1497
1497
  /** @description The quantity held, in the token's own units. Exact, never rounded, and always above zero. */
@@ -4,6 +4,46 @@
4
4
  */
5
5
 
6
6
  export interface paths {
7
+ "/compliance/additional_signers": {
8
+ parameters: {
9
+ query?: never;
10
+ header?: never;
11
+ path?: never;
12
+ cookie?: never;
13
+ };
14
+ /**
15
+ * List the business's additional authorized signers
16
+ * @description The authorized signers the business has beside the one on its KYB form, oldest first, each with a name, a job title and when they were added. Any member of the business may read it. Carries no email, no identity details and no WisdomTree step. The list is not paginated: has_more is always false.
17
+ */
18
+ get: operations["compliance.additional_signers.list"];
19
+ put?: never;
20
+ post?: never;
21
+ delete?: never;
22
+ options?: never;
23
+ head?: never;
24
+ patch?: never;
25
+ trace?: never;
26
+ };
27
+ "/compliance/additional_signers/{id}/remove": {
28
+ parameters: {
29
+ query?: never;
30
+ header?: never;
31
+ path?: never;
32
+ cookie?: never;
33
+ };
34
+ get?: never;
35
+ put?: never;
36
+ /**
37
+ * Remove an additional authorized signer
38
+ * @description An admin of the business (permissions_manage) removes one of the business's additional authorized signers, saying why. No Stable Sea approval is needed: the removal takes effect at once, is recorded on the audit ledger with the admin and the reason, and is emailed to Stable Sea compliance, to the business's admins and to the removed person. The signer stays on record as removed, and the same person can be added again later with a new request. The authorized signer on the KYB form (the business's controller at its custodian) cannot be removed here and is unchanged; nothing is sent to the custodian. Answers with the removed signer as they were listed. Refused when the signer is not one of the business's (additional_signer_not_found), was already removed (additional_signer_already_removed, and nothing is recorded), or the reason is blank (signer_change_invalid).
39
+ */
40
+ post: operations["compliance.additional_signers.remove"];
41
+ delete?: never;
42
+ options?: never;
43
+ head?: never;
44
+ patch?: never;
45
+ trace?: never;
46
+ };
7
47
  "/compliance/documents": {
8
48
  parameters: {
9
49
  query?: never;
@@ -666,7 +706,7 @@ export interface paths {
666
706
  put?: never;
667
707
  /**
668
708
  * Request an authorized signer change
669
- * @description An admin of the business (permissions_manage) names an active member as the new authorized signer and says why. The named member must accept, then a compliance operator approves; nothing on the KYB form changes until then. Refused when the member is not an active member of the business, is already the signer, or the business already has an open request. Opens a re-verification record that the request's approval, rejection or cancellation settles, and tells the business's admins, the outgoing signer and the new signer by email.
709
+ * @description An admin of the business (permissions_manage) names an active member as the new authorized signer, or as an additional authorized signer (kind add, beside the current one), and says why. The named member must accept, then a compliance operator approves; nothing on the KYB form changes until then. A replace (the default) changes the signer on the KYB form, who is the business's controller at its custodian. An add records a second signer, changes neither the form nor the controller, and has its KYC sent to WisdomTree by compliance. Refused when the member is not an active member of the business, the kind is neither replace nor add, the business already has an open request, the member is already the signer a replace would name (signer_change_already_signer), or the member is already an authorized signer in a way the request cannot change (signer_change_member_already_signer): for an add, the signer on the KYB form or an additional signer already; for a replace, an additional signer. Opens a re-verification record that the request's approval, rejection or cancellation settles, and tells the business's admins and the new signer by email, and, for a replace, the outgoing signer.
670
710
  */
671
711
  post: operations["compliance.signer_changes.create"];
672
712
  delete?: never;
@@ -839,6 +879,26 @@ export interface paths {
839
879
  patch?: never;
840
880
  trace?: never;
841
881
  };
882
+ "/identity/bot_challenge_settings": {
883
+ parameters: {
884
+ query?: never;
885
+ header?: never;
886
+ path?: never;
887
+ cookie?: never;
888
+ };
889
+ /**
890
+ * Get bot challenge settings
891
+ * @description Reports whether the signup screener submit and the signup code resend require a bot-challenge token, and the public site key to render the challenge widget with. Public.
892
+ */
893
+ get: operations["identity.bot_challenge_settings.get"];
894
+ put?: never;
895
+ post?: never;
896
+ delete?: never;
897
+ options?: never;
898
+ head?: never;
899
+ patch?: never;
900
+ trace?: never;
901
+ };
842
902
  "/identity/business/networks": {
843
903
  parameters: {
844
904
  query?: never;
@@ -1708,7 +1768,7 @@ export interface paths {
1708
1768
  put?: never;
1709
1769
  /**
1710
1770
  * Resend signup OTP
1711
- * @description Re-issues the OTP for an in-flight screener session by re-running registration step 1 for the supplied business email, minting a fresh OTP and re-delivering the email. Acknowledges the same way for an address that already has an account, which is then emailed a sign-in prompt rather than a code: this endpoint never reveals whether an address is registered.
1771
+ * @description Re-issues the OTP for an in-flight screener session by re-running registration step 1 for the supplied business email, minting a fresh OTP and re-delivering the email. Acknowledges the same way for an address that already has an account, which is then emailed a sign-in prompt rather than a code: this endpoint never reveals whether an address is registered. While GET /identity/bot_challenge_settings answers required=true, a request without a valid challenge_token is refused (bot_challenge_required / bot_challenge_failed) before any email.
1712
1772
  */
1713
1773
  post: operations["signup.screener.resend_otp"];
1714
1774
  delete?: never;
@@ -1728,7 +1788,7 @@ export interface paths {
1728
1788
  put?: never;
1729
1789
  /**
1730
1790
  * Submit signup screener
1731
- * @description Validates the screener payload (business email + business name) and starts an identity registration session. Answers the same way for an address that already has an account, which is then emailed a sign-in prompt rather than a code: this endpoint never reveals whether an address is registered.
1791
+ * @description Validates the screener payload (business email + business name) and starts an identity registration session. Answers the same way for an address that already has an account, which is then emailed a sign-in prompt rather than a code: this endpoint never reveals whether an address is registered. While GET /identity/bot_challenge_settings answers required=true, a request without a valid challenge_token is refused (bot_challenge_required / bot_challenge_failed) before any email or CRM lead.
1732
1792
  */
1733
1793
  post: operations["signup.screener.submit"];
1734
1794
  delete?: never;
@@ -1781,22 +1841,20 @@ export interface paths {
1781
1841
  export type webhooks = Record<string, never>;
1782
1842
  export interface components {
1783
1843
  schemas: {
1784
- Page_DocumentsView: {
1785
- data: components["schemas"]["DocumentsView"][] | null;
1844
+ Page_ComplianceAdditionalSignerBusinessView: {
1845
+ data: components["schemas"]["ComplianceAdditionalSignerBusinessView"][] | null;
1786
1846
  has_more: boolean;
1787
1847
  next_cursor: string | null;
1788
1848
  total_count?: number | null;
1789
1849
  };
1790
- DocumentsView: {
1791
- created_by?: string;
1850
+ ComplianceAdditionalSignerBusinessView: {
1792
1851
  /** Format: date-time */
1793
- created_ts?: string;
1794
- file_name?: string;
1795
- /** Format: int64 */
1796
- file_size?: number;
1797
- file_type?: string;
1798
- group_id?: string;
1799
- id?: string;
1852
+ added_ts: string;
1853
+ first_name: string;
1854
+ id: string;
1855
+ individual_id: string;
1856
+ job_title: string;
1857
+ last_name: string;
1800
1858
  };
1801
1859
  HttputilAPIError: {
1802
1860
  error?: components["schemas"]["HttputilAPIErrorBody"];
@@ -1830,6 +1888,26 @@ export interface components {
1830
1888
  /** @description RFC 6901 JSON Pointer to the offending field. */
1831
1889
  pointer?: string;
1832
1890
  };
1891
+ ComplianceRemoveAdditionalSignerBody: {
1892
+ reason: string;
1893
+ };
1894
+ Page_DocumentsView: {
1895
+ data: components["schemas"]["DocumentsView"][] | null;
1896
+ has_more: boolean;
1897
+ next_cursor: string | null;
1898
+ total_count?: number | null;
1899
+ };
1900
+ DocumentsView: {
1901
+ created_by?: string;
1902
+ /** Format: date-time */
1903
+ created_ts?: string;
1904
+ file_name?: string;
1905
+ /** Format: int64 */
1906
+ file_size?: number;
1907
+ file_type?: string;
1908
+ group_id?: string;
1909
+ id?: string;
1910
+ };
1833
1911
  DocumentsCreateInput: {
1834
1912
  contents_b64?: string[] | null;
1835
1913
  filenames?: string[] | null;
@@ -2385,6 +2463,7 @@ export interface components {
2385
2463
  group_id: string;
2386
2464
  id: string;
2387
2465
  incoming: components["schemas"]["ComplianceSignerChangeSigner"];
2466
+ kind: components["schemas"]["ComplianceSignerChangeKind"];
2388
2467
  new_signer_id: string;
2389
2468
  outgoing: components["schemas"]["ComplianceSignerChangeSigner"];
2390
2469
  reason: string;
@@ -2403,9 +2482,12 @@ export interface components {
2403
2482
  last_name: string;
2404
2483
  };
2405
2484
  /** @enum {string} */
2485
+ ComplianceSignerChangeKind: "replace" | "add";
2486
+ /** @enum {string} */
2406
2487
  ComplianceSignerChangeState: "awaiting_signer" | "awaiting_approval" | "approved" | "rejected" | "cancelled";
2407
2488
  ComplianceCreateSignerChangeInput: {
2408
2489
  job_title: string;
2490
+ kind?: components["schemas"]["ComplianceSignerChangeKind"];
2409
2491
  new_signer_id: string;
2410
2492
  reason: string;
2411
2493
  };
@@ -2491,6 +2573,12 @@ export interface components {
2491
2573
  /** @description Required for Live keys; omitted for Test keys */
2492
2574
  totp_code?: string;
2493
2575
  };
2576
+ SignupBotChallengeSettings: {
2577
+ /** @description Whether POST /signup/screener/submit and POST /signup/screener/resend_otp refuse a request without a valid challenge_token. */
2578
+ required: boolean;
2579
+ /** @description The public site key to render the challenge widget with. Empty when required is false. */
2580
+ site_key: string;
2581
+ };
2494
2582
  NetworksOutput: {
2495
2583
  networks: components["schemas"]["NetworksNetworkItem"][] | null;
2496
2584
  /** @description Whether this deployment accepts changes to the networks. */
@@ -2979,6 +3067,8 @@ export interface components {
2979
3067
  Success?: boolean;
2980
3068
  };
2981
3069
  SignupResendOTPInput: {
3070
+ /** @description The bot-challenge token the widget issued for the resend_otp action. Required while GET /identity/bot_challenge_settings answers required=true; ignored otherwise. Single use. */
3071
+ challenge_token?: string;
2982
3072
  email?: string;
2983
3073
  otp_session_id?: string;
2984
3074
  };
@@ -2987,6 +3077,8 @@ export interface components {
2987
3077
  };
2988
3078
  SignupScreenerSubmitInput: {
2989
3079
  business_name?: string;
3080
+ /** @description The bot-challenge token the widget issued for the signup action. Required while GET /identity/bot_challenge_settings answers required=true; ignored otherwise. Single use. */
3081
+ challenge_token?: string;
2990
3082
  email?: string;
2991
3083
  first_name?: string;
2992
3084
  last_name?: string;
@@ -3041,6 +3133,133 @@ export interface components {
3041
3133
  }
3042
3134
  export type $defs = Record<string, never>;
3043
3135
  export interface operations {
3136
+ "compliance.additional_signers.list": {
3137
+ parameters: {
3138
+ query?: never;
3139
+ header?: never;
3140
+ path?: never;
3141
+ cookie?: never;
3142
+ };
3143
+ requestBody?: never;
3144
+ responses: {
3145
+ /** @description OK */
3146
+ 200: {
3147
+ headers: {
3148
+ [name: string]: unknown;
3149
+ };
3150
+ content: {
3151
+ "application/json": components["schemas"]["Page_ComplianceAdditionalSignerBusinessView"];
3152
+ };
3153
+ };
3154
+ /** @description Unauthorized */
3155
+ 401: {
3156
+ headers: {
3157
+ [name: string]: unknown;
3158
+ };
3159
+ content: {
3160
+ "application/json": components["schemas"]["HttputilAPIError"];
3161
+ };
3162
+ };
3163
+ /** @description Forbidden */
3164
+ 403: {
3165
+ headers: {
3166
+ [name: string]: unknown;
3167
+ };
3168
+ content: {
3169
+ "application/json": components["schemas"]["HttputilAPIError"];
3170
+ };
3171
+ };
3172
+ /** @description Error response. */
3173
+ default: {
3174
+ headers: {
3175
+ [name: string]: unknown;
3176
+ };
3177
+ content: {
3178
+ "application/json": components["schemas"]["HttputilAPIError"];
3179
+ };
3180
+ };
3181
+ };
3182
+ };
3183
+ "compliance.additional_signers.remove": {
3184
+ parameters: {
3185
+ query?: never;
3186
+ header?: never;
3187
+ path: {
3188
+ id: string;
3189
+ };
3190
+ cookie?: never;
3191
+ };
3192
+ requestBody?: {
3193
+ content: {
3194
+ "application/json": components["schemas"]["ComplianceRemoveAdditionalSignerBody"];
3195
+ };
3196
+ };
3197
+ responses: {
3198
+ /** @description OK */
3199
+ 200: {
3200
+ headers: {
3201
+ [name: string]: unknown;
3202
+ };
3203
+ content: {
3204
+ "application/json": components["schemas"]["ComplianceAdditionalSignerBusinessView"];
3205
+ };
3206
+ };
3207
+ /** @description Bad Request */
3208
+ 400: {
3209
+ headers: {
3210
+ [name: string]: unknown;
3211
+ };
3212
+ content: {
3213
+ "application/json": components["schemas"]["HttputilAPIError"];
3214
+ };
3215
+ };
3216
+ /** @description Unauthorized */
3217
+ 401: {
3218
+ headers: {
3219
+ [name: string]: unknown;
3220
+ };
3221
+ content: {
3222
+ "application/json": components["schemas"]["HttputilAPIError"];
3223
+ };
3224
+ };
3225
+ /** @description Forbidden */
3226
+ 403: {
3227
+ headers: {
3228
+ [name: string]: unknown;
3229
+ };
3230
+ content: {
3231
+ "application/json": components["schemas"]["HttputilAPIError"];
3232
+ };
3233
+ };
3234
+ /** @description Not Found */
3235
+ 404: {
3236
+ headers: {
3237
+ [name: string]: unknown;
3238
+ };
3239
+ content: {
3240
+ "application/json": components["schemas"]["HttputilAPIError"];
3241
+ };
3242
+ };
3243
+ /** @description Conflict */
3244
+ 409: {
3245
+ headers: {
3246
+ [name: string]: unknown;
3247
+ };
3248
+ content: {
3249
+ "application/json": components["schemas"]["HttputilAPIError"];
3250
+ };
3251
+ };
3252
+ /** @description Error response. */
3253
+ default: {
3254
+ headers: {
3255
+ [name: string]: unknown;
3256
+ };
3257
+ content: {
3258
+ "application/json": components["schemas"]["HttputilAPIError"];
3259
+ };
3260
+ };
3261
+ };
3262
+ };
3044
3263
  "compliance.documents.list": {
3045
3264
  parameters: {
3046
3265
  query?: {
@@ -5903,6 +6122,35 @@ export interface operations {
5903
6122
  };
5904
6123
  };
5905
6124
  };
6125
+ "identity.bot_challenge_settings.get": {
6126
+ parameters: {
6127
+ query?: never;
6128
+ header?: never;
6129
+ path?: never;
6130
+ cookie?: never;
6131
+ };
6132
+ requestBody?: never;
6133
+ responses: {
6134
+ /** @description OK */
6135
+ 200: {
6136
+ headers: {
6137
+ [name: string]: unknown;
6138
+ };
6139
+ content: {
6140
+ "application/json": components["schemas"]["SignupBotChallengeSettings"];
6141
+ };
6142
+ };
6143
+ /** @description Error response. */
6144
+ default: {
6145
+ headers: {
6146
+ [name: string]: unknown;
6147
+ };
6148
+ content: {
6149
+ "application/json": components["schemas"]["HttputilAPIError"];
6150
+ };
6151
+ };
6152
+ };
6153
+ };
5906
6154
  "identity.business.networks.get": {
5907
6155
  parameters: {
5908
6156
  query?: never;
@@ -8064,6 +8312,33 @@ export interface operations {
8064
8312
  "application/json": components["schemas"]["SignupResendOTPAck"];
8065
8313
  };
8066
8314
  };
8315
+ /** @description Bad Request */
8316
+ 400: {
8317
+ headers: {
8318
+ [name: string]: unknown;
8319
+ };
8320
+ content: {
8321
+ "application/json": components["schemas"]["HttputilAPIError"];
8322
+ };
8323
+ };
8324
+ /** @description Too Many Requests */
8325
+ 429: {
8326
+ headers: {
8327
+ [name: string]: unknown;
8328
+ };
8329
+ content: {
8330
+ "application/json": components["schemas"]["HttputilAPIError"];
8331
+ };
8332
+ };
8333
+ /** @description Service Unavailable */
8334
+ 503: {
8335
+ headers: {
8336
+ [name: string]: unknown;
8337
+ };
8338
+ content: {
8339
+ "application/json": components["schemas"]["HttputilAPIError"];
8340
+ };
8341
+ };
8067
8342
  /** @description Error response. */
8068
8343
  default: {
8069
8344
  headers: {
@@ -8097,6 +8372,33 @@ export interface operations {
8097
8372
  "application/json": components["schemas"]["SignupScreenerSubmitOutput"];
8098
8373
  };
8099
8374
  };
8375
+ /** @description Bad Request */
8376
+ 400: {
8377
+ headers: {
8378
+ [name: string]: unknown;
8379
+ };
8380
+ content: {
8381
+ "application/json": components["schemas"]["HttputilAPIError"];
8382
+ };
8383
+ };
8384
+ /** @description Too Many Requests */
8385
+ 429: {
8386
+ headers: {
8387
+ [name: string]: unknown;
8388
+ };
8389
+ content: {
8390
+ "application/json": components["schemas"]["HttputilAPIError"];
8391
+ };
8392
+ };
8393
+ /** @description Service Unavailable */
8394
+ 503: {
8395
+ headers: {
8396
+ [name: string]: unknown;
8397
+ };
8398
+ content: {
8399
+ "application/json": components["schemas"]["HttputilAPIError"];
8400
+ };
8401
+ };
8100
8402
  /** @description Error response. */
8101
8403
  default: {
8102
8404
  headers: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable_sea/sdk",
3
- "version": "0.2.20",
3
+ "version": "0.2.23",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "files": [
@@ -35,10 +35,10 @@
35
35
  "openapi-fetch": "0.17.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@types/node": "26.6.4",
38
+ "@types/node": "26.6.5",
39
39
  "openapi-typescript": "7.13.0",
40
40
  "typescript": "5.9.3",
41
- "vitest": "5.0.3"
41
+ "vitest": "5.0.4"
42
42
  },
43
43
  "overrides": {
44
44
  "js-yaml": "^5.4.3",