@cloudfleet/sdk 0.0.1-d824507 → 0.0.1-d940b00

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.
@@ -2,6 +2,10 @@ export type ClientOptions = {
2
2
  baseUrl: 'https://api.cloudfleet.ai/v1' | (string & {});
3
3
  };
4
4
  export type BillingContact = {
5
+ /**
6
+ * Type of the organization. `business` for legal entities, `personal` for individuals.
7
+ */
8
+ type: 'business' | 'personal';
5
9
  /**
6
10
  * Name of the legal entity. This name will be used in invoices. Use your first and last name for individual accounts.
7
11
  */
@@ -129,9 +133,9 @@ export type Chart = {
129
133
  */
130
134
  chart: string;
131
135
  /**
132
- * Status of the chart deployment.
136
+ * Status of the chart deployment (Flux HelmRelease Ready condition reason, e.g. InstallSucceeded, UpgradeFailed, Progressing).
133
137
  */
134
- status: 'InstallSucceeded' | 'InstallFailed' | 'UpgradeSucceeded' | 'UpgradeFailed' | 'TestSucceeded' | 'TestFailed' | 'RollbackSucceeded' | 'RollbackFailed' | 'UninstallSucceeded' | 'UninstallFailed' | 'ArtifactFailed' | 'DependencyNotReady' | 'Progressing' | 'SourceNotReady';
138
+ status: string;
135
139
  /**
136
140
  * Current version of the chart deployment.
137
141
  */
@@ -169,13 +173,63 @@ export type ClusterCreateInput = {
169
173
  */
170
174
  tier: 'basic' | 'pro';
171
175
  /**
172
- * Cloudfleet control plane region. One of "staging-1a", "northamerica-central-1", "europe-central-1a", "northamerica-central-1a". This field can not be updated after creation.
176
+ * Cloudfleet control plane region. This field can not be updated after creation.
173
177
  */
174
- region?: 'staging-1a' | 'northamerica-central-1' | 'europe-central-1a' | 'northamerica-central-1a';
178
+ region: string;
175
179
  /**
176
180
  * Version of the kubernetes cluster.
177
181
  */
178
- version_channel?: '1.x.x-cfke.x' | '1.31.x-cfke.x' | '1.32.x-cfke.x' | '1.33.x-cfke.x';
182
+ version_channel?: string;
183
+ /**
184
+ * Release channel for the cluster's control plane.
185
+ */
186
+ release_channel?: 'rapid' | 'stable' | 'extended';
187
+ /**
188
+ * Cluster feature toggles.
189
+ */
190
+ features?: {
191
+ /**
192
+ * GPU sharing strategy.
193
+ */
194
+ gpu_sharing_strategy: 'none' | 'mps' | 'time_slicing';
195
+ /**
196
+ * Maximum number of pods that may share a single GPU.
197
+ */
198
+ gpu_max_shared_clients_per_gpu: number;
199
+ /**
200
+ * Restrict Cilium socket load-balancing to the host namespace. Required for the Tailscale operator and Istio.
201
+ */
202
+ cilium_socket_lb_host_namespace_only?: boolean;
203
+ };
204
+ /**
205
+ * Cluster networking configuration. Immutable after creation.
206
+ */
207
+ networking?: {
208
+ /**
209
+ * CIDR block for pod IPs.
210
+ */
211
+ pod_cidr?: string;
212
+ /**
213
+ * CIDR block for service IPs.
214
+ */
215
+ service_cidr?: string;
216
+ /**
217
+ * CoreDNS service IP.
218
+ */
219
+ cluster_dns?: string;
220
+ /**
221
+ * Enable IPv4+IPv6 dual-stack networking.
222
+ */
223
+ dual_stack?: boolean;
224
+ /**
225
+ * IPv6 pod CIDR. Requires dual_stack.
226
+ */
227
+ pod_cidr_v6?: string;
228
+ /**
229
+ * IPv6 service CIDR. Requires dual_stack.
230
+ */
231
+ service_cidr_v6?: string;
232
+ };
179
233
  };
180
234
  export type ClusterJoinInformation = {
181
235
  /**
@@ -190,6 +244,10 @@ export type ClusterJoinInformation = {
190
244
  * Cluster DNS IP address. This is the IP address of the kube-dns service in the cluster.
191
245
  */
192
246
  cluster_dns: string;
247
+ /**
248
+ * Pod CIDR for the cluster. Used to configure iptables rules on nodes to prevent Tailscale routing loops.
249
+ */
250
+ pod_cidr: string;
193
251
  /**
194
252
  * Authentication key for the cluster.
195
253
  */
@@ -247,18 +305,69 @@ export type Cluster = {
247
305
  */
248
306
  tier: 'basic' | 'pro';
249
307
  /**
250
- * Cloudfleet control plane region. One of "staging-1a", "northamerica-central-1", "europe-central-1a", "northamerica-central-1a". This field can not be updated after creation.
308
+ * Cloudfleet control plane region. This field can not be updated after creation.
309
+ */
310
+ region: string;
311
+ /**
312
+ * Cluster networking configuration. Immutable after creation.
313
+ */
314
+ networking?: {
315
+ /**
316
+ * CIDR block for pod IPs.
317
+ */
318
+ pod_cidr?: string;
319
+ /**
320
+ * CIDR block for service IPs.
321
+ */
322
+ service_cidr?: string;
323
+ /**
324
+ * CoreDNS service IP.
325
+ */
326
+ cluster_dns?: string;
327
+ /**
328
+ * Enable IPv4+IPv6 dual-stack networking.
329
+ */
330
+ dual_stack?: boolean;
331
+ /**
332
+ * IPv6 pod CIDR. Requires dual_stack.
333
+ */
334
+ pod_cidr_v6?: string;
335
+ /**
336
+ * IPv6 service CIDR. Requires dual_stack.
337
+ */
338
+ service_cidr_v6?: string;
339
+ };
340
+ /**
341
+ * Release channel for the cluster's control plane.
342
+ */
343
+ release_channel?: 'rapid' | 'stable' | 'extended';
344
+ /**
345
+ * Cluster feature toggles.
251
346
  */
252
- region?: 'staging-1a' | 'northamerica-central-1' | 'europe-central-1a' | 'northamerica-central-1a';
347
+ features?: {
348
+ /**
349
+ * GPU sharing strategy.
350
+ */
351
+ gpu_sharing_strategy: 'none' | 'mps' | 'time_slicing';
352
+ /**
353
+ * Maximum number of pods that may share a single GPU.
354
+ */
355
+ gpu_max_shared_clients_per_gpu: number;
356
+ /**
357
+ * Restrict Cilium socket load-balancing to the host namespace. Required for the Tailscale operator and Istio.
358
+ */
359
+ cilium_socket_lb_host_namespace_only?: boolean;
360
+ };
253
361
  /**
254
362
  * Unique identifier of the kubernetes cluster. UUID v4 string in canonical form
255
363
  */
256
364
  id: string;
257
365
  /**
258
- * Status of the cluster. When creating a new cluster, set to `active`. When deleting a clusters, set to `deleted`.
366
+ * Status of the cluster.
259
367
  */
260
- status: 'active' | 'disabled' | 'deleted' | 'creating' | 'deployed' | 'failed' | 'updating';
368
+ status: 'creating' | 'deployed' | 'updating' | 'disabled';
261
369
  endpoint?: string | '';
370
+ endpoint_public?: string | '';
262
371
  /**
263
372
  * Certificate authority data for the kubernetes cluster. This is the root certificate authority for the cluster.
264
373
  */
@@ -297,6 +406,27 @@ export type ClusterUpdateInput = {
297
406
  * Version of the kubernetes cluster.
298
407
  */
299
408
  version_channel?: string;
409
+ /**
410
+ * Release channel for the cluster's control plane.
411
+ */
412
+ release_channel?: 'rapid' | 'stable' | 'extended';
413
+ /**
414
+ * Cluster feature toggles.
415
+ */
416
+ features?: {
417
+ /**
418
+ * GPU sharing strategy.
419
+ */
420
+ gpu_sharing_strategy: 'none' | 'mps' | 'time_slicing';
421
+ /**
422
+ * Maximum number of pods that may share a single GPU.
423
+ */
424
+ gpu_max_shared_clients_per_gpu: number;
425
+ /**
426
+ * Restrict Cilium socket load-balancing to the host namespace. Required for the Tailscale operator and Istio.
427
+ */
428
+ cilium_socket_lb_host_namespace_only?: boolean;
429
+ };
300
430
  };
301
431
  export type FleetCreateInput = {
302
432
  /**
@@ -304,31 +434,56 @@ export type FleetCreateInput = {
304
434
  */
305
435
  limits?: {
306
436
  /**
307
- * CPU limit in cores.
437
+ * CPU limit in cores. Maximum 100,000.
308
438
  */
309
- cpu: number;
439
+ cpu?: number;
310
440
  };
311
441
  gcp?: {
312
- enabled?: boolean;
442
+ enabled: boolean;
313
443
  /**
314
- * Project GCP Project id to deploy instances into
444
+ * GCP project ID to deploy instances into. 6-30 chars, lowercase letters/digits/hyphens, must start with a letter and not end with a hyphen. Omit when GCP is disabled.
315
445
  */
316
- project: string;
446
+ project?: string;
317
447
  };
318
448
  hetzner?: {
319
- enabled?: boolean;
449
+ enabled: boolean;
320
450
  /**
321
- * Hetzner Cloud API key with read / write access
451
+ * Hetzner Cloud API token with read / write access (64 alphanumeric characters). Omit this field to keep the existing value.
322
452
  */
323
- apiKey: string;
453
+ apiKey?: string;
324
454
  };
325
455
  aws?: {
326
- enabled?: boolean;
456
+ enabled: boolean;
327
457
  /**
328
- * ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.
458
+ * AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.
329
459
  */
330
- controllerRoleArn: string;
460
+ controllerRoleArn?: string;
331
461
  };
462
+ /**
463
+ * Constraints define scheduling and provisioning requirements for the fleet. Each field restricts the values allowed for a given Kubernetes label key. Multiple constraints are ANDed together. Omit a field to place no restriction on that key.
464
+ */
465
+ constraints?: {
466
+ /**
467
+ * Allowed values for `karpenter.sh/capacity-type`.
468
+ */
469
+ 'karpenter.sh/capacity-type'?: Array<'on-demand' | 'spot'>;
470
+ /**
471
+ * Allowed values for `kubernetes.io/arch`.
472
+ */
473
+ 'kubernetes.io/arch'?: Array<'amd64' | 'arm64'>;
474
+ /**
475
+ * Allowed values for `cfke.io/instance-family`.
476
+ */
477
+ 'cfke.io/instance-family'?: Array<'a1' | 'a2' | 'a3' | 'a4' | 'c1' | 'c2' | 'c2d' | 'c3' | 'c3d' | 'c4' | 'c4a' | 'c4d' | 'c5' | 'c5a' | 'c5ad' | 'c5d' | 'c5n' | 'c6a' | 'c6g' | 'c6gd' | 'c6gn' | 'c6i' | 'c6id' | 'c6in' | 'c7a' | 'c7g' | 'c7gd' | 'c7gn' | 'c7i' | 'c7i-flex' | 'c8g' | 'c8gd' | 'cax' | 'ccx' | 'cpx' | 'cx' | 'd2' | 'd3' | 'd3en' | 'dl1' | 'dl2q' | 'e2' | 'f1' | 'f2' | 'g1' | 'g2' | 'g4ad' | 'g4dn' | 'g5' | 'g5g' | 'g6' | 'g6e' | 'gr6' | 'h1' | 'h3' | 'hpc6a' | 'hpc6id' | 'hpc7a' | 'hpc7g' | 'i2' | 'i3' | 'i3en' | 'i4g' | 'i4i' | 'i7i' | 'i7ie' | 'i8g' | 'im4gn' | 'inf1' | 'inf2' | 'is4gen' | 'm1' | 'm2' | 'm3' | 'm4' | 'm5' | 'm5a' | 'm5ad' | 'm5d' | 'm5dn' | 'm5n' | 'm5zn' | 'm6a' | 'm6g' | 'm6gd' | 'm6i' | 'm6id' | 'm6idn' | 'm6in' | 'm7a' | 'm7g' | 'm7gd' | 'm7i' | 'm7i-flex' | 'm8g' | 'm8gd' | 'n1' | 'n2' | 'n2d' | 'n4' | 'p3' | 'p3dn' | 'p4d' | 'p4de' | 'p5' | 'p5e' | 'p5en' | 'p6-b200' | 'r3' | 'r4' | 'r5' | 'r5a' | 'r5ad' | 'r5b' | 'r5d' | 'r5dn' | 'r5n' | 'r6a' | 'r6g' | 'r6gd' | 'r6i' | 'r6id' | 'r6idn' | 'r6in' | 'r7a' | 'r7g' | 'r7gd' | 'r7i' | 'r7iz' | 'r8g' | 'r8gd' | 't2' | 't2a' | 't2d' | 't3' | 't3a' | 't4g' | 'trn1' | 'trn1n' | 'u-3tb1' | 'u-6tb1' | 'u7i-12tb' | 'u7i-6tb' | 'u7i-8tb' | 'u7in-16tb' | 'u7in-24tb' | 'u7in-32tb' | 'vt1' | 'x1' | 'x1e' | 'x2gd' | 'x2idn' | 'x2iedn' | 'x2iezn' | 'x4' | 'x8g' | 'z1d' | 'z3'>;
478
+ /**
479
+ * Allowed values for `topology.kubernetes.io/region`.
480
+ */
481
+ 'topology.kubernetes.io/region'?: Array<'africa-south1' | 'ap-northeast-1' | 'ap-northeast-2' | 'ap-northeast-3' | 'ap-south-1' | 'ap-southeast-1' | 'ap-southeast-2' | 'ash' | 'asia-east1' | 'asia-east2' | 'asia-northeast1' | 'asia-northeast2' | 'asia-northeast3' | 'asia-south1' | 'asia-south2' | 'asia-southeast1' | 'asia-southeast2' | 'australia-southeast1' | 'australia-southeast2' | 'ca-central-1' | 'eu-central-1' | 'eu-central-2' | 'eu-north-1' | 'eu-west-1' | 'eu-west-2' | 'eu-west-3' | 'europe-central2' | 'europe-north1' | 'europe-southwest1' | 'europe-west1' | 'europe-west10' | 'europe-west12' | 'europe-west2' | 'europe-west3' | 'europe-west4' | 'europe-west6' | 'europe-west8' | 'europe-west9' | 'fsn1' | 'hel1' | 'hil' | 'me-central1' | 'me-central2' | 'me-west1' | 'nbg1' | 'northamerica-northeast1' | 'northamerica-northeast2' | 'sa-east-1' | 'sin' | 'southamerica-east1' | 'southamerica-west1' | 'us-central1' | 'us-east-1' | 'us-east-2' | 'us-east1' | 'us-east4' | 'us-east5' | 'us-south1' | 'us-west-1' | 'us-west-2' | 'us-west1' | 'us-west2' | 'us-west3' | 'us-west4'>;
482
+ };
483
+ /**
484
+ * Controls scale-up / scale-down responsiveness. `aggressive` prioritizes cost-optimization. `conservative` prioritizes stability of the fleet.
485
+ */
486
+ scalingProfile?: 'aggressive' | 'conservative';
332
487
  /**
333
488
  * Unique identifier of the kubernetes fleet.
334
489
  */
@@ -340,35 +495,76 @@ export type Fleet = {
340
495
  */
341
496
  limits?: {
342
497
  /**
343
- * CPU limit in cores.
498
+ * CPU limit in cores. Maximum 100,000.
344
499
  */
345
- cpu: number;
500
+ cpu?: number;
346
501
  };
347
502
  gcp?: {
348
- enabled?: boolean;
503
+ enabled: boolean;
349
504
  /**
350
- * Project GCP Project id to deploy instances into
505
+ * GCP project ID to deploy instances into. 6-30 chars, lowercase letters/digits/hyphens, must start with a letter and not end with a hyphen. Omit when GCP is disabled.
351
506
  */
352
- project: string;
507
+ project?: string;
353
508
  };
354
509
  hetzner?: {
355
- enabled?: boolean;
510
+ enabled: boolean;
356
511
  /**
357
- * Hetzner Cloud API key with read / write access
512
+ * Redacted Hetzner API token. Returned as 64 asterisks when a token is configured; omitted otherwise. The real value is never echoed by the API.
358
513
  */
359
- apiKey: string;
514
+ apiKey?: string;
360
515
  };
361
516
  aws?: {
362
- enabled?: boolean;
517
+ enabled: boolean;
518
+ /**
519
+ * AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.
520
+ */
521
+ controllerRoleArn?: string;
522
+ };
523
+ /**
524
+ * Constraints define scheduling and provisioning requirements for the fleet. Each field restricts the values allowed for a given Kubernetes label key. Multiple constraints are ANDed together. Omit a field to place no restriction on that key.
525
+ */
526
+ constraints?: {
527
+ /**
528
+ * Allowed values for `karpenter.sh/capacity-type`.
529
+ */
530
+ 'karpenter.sh/capacity-type'?: Array<'on-demand' | 'spot'>;
531
+ /**
532
+ * Allowed values for `kubernetes.io/arch`.
533
+ */
534
+ 'kubernetes.io/arch'?: Array<'amd64' | 'arm64'>;
535
+ /**
536
+ * Allowed values for `cfke.io/instance-family`.
537
+ */
538
+ 'cfke.io/instance-family'?: Array<'a1' | 'a2' | 'a3' | 'a4' | 'c1' | 'c2' | 'c2d' | 'c3' | 'c3d' | 'c4' | 'c4a' | 'c4d' | 'c5' | 'c5a' | 'c5ad' | 'c5d' | 'c5n' | 'c6a' | 'c6g' | 'c6gd' | 'c6gn' | 'c6i' | 'c6id' | 'c6in' | 'c7a' | 'c7g' | 'c7gd' | 'c7gn' | 'c7i' | 'c7i-flex' | 'c8g' | 'c8gd' | 'cax' | 'ccx' | 'cpx' | 'cx' | 'd2' | 'd3' | 'd3en' | 'dl1' | 'dl2q' | 'e2' | 'f1' | 'f2' | 'g1' | 'g2' | 'g4ad' | 'g4dn' | 'g5' | 'g5g' | 'g6' | 'g6e' | 'gr6' | 'h1' | 'h3' | 'hpc6a' | 'hpc6id' | 'hpc7a' | 'hpc7g' | 'i2' | 'i3' | 'i3en' | 'i4g' | 'i4i' | 'i7i' | 'i7ie' | 'i8g' | 'im4gn' | 'inf1' | 'inf2' | 'is4gen' | 'm1' | 'm2' | 'm3' | 'm4' | 'm5' | 'm5a' | 'm5ad' | 'm5d' | 'm5dn' | 'm5n' | 'm5zn' | 'm6a' | 'm6g' | 'm6gd' | 'm6i' | 'm6id' | 'm6idn' | 'm6in' | 'm7a' | 'm7g' | 'm7gd' | 'm7i' | 'm7i-flex' | 'm8g' | 'm8gd' | 'n1' | 'n2' | 'n2d' | 'n4' | 'p3' | 'p3dn' | 'p4d' | 'p4de' | 'p5' | 'p5e' | 'p5en' | 'p6-b200' | 'r3' | 'r4' | 'r5' | 'r5a' | 'r5ad' | 'r5b' | 'r5d' | 'r5dn' | 'r5n' | 'r6a' | 'r6g' | 'r6gd' | 'r6i' | 'r6id' | 'r6idn' | 'r6in' | 'r7a' | 'r7g' | 'r7gd' | 'r7i' | 'r7iz' | 'r8g' | 'r8gd' | 't2' | 't2a' | 't2d' | 't3' | 't3a' | 't4g' | 'trn1' | 'trn1n' | 'u-3tb1' | 'u-6tb1' | 'u7i-12tb' | 'u7i-6tb' | 'u7i-8tb' | 'u7in-16tb' | 'u7in-24tb' | 'u7in-32tb' | 'vt1' | 'x1' | 'x1e' | 'x2gd' | 'x2idn' | 'x2iedn' | 'x2iezn' | 'x4' | 'x8g' | 'z1d' | 'z3'>;
363
539
  /**
364
- * ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.
540
+ * Allowed values for `topology.kubernetes.io/region`.
365
541
  */
366
- controllerRoleArn: string;
542
+ 'topology.kubernetes.io/region'?: Array<'africa-south1' | 'ap-northeast-1' | 'ap-northeast-2' | 'ap-northeast-3' | 'ap-south-1' | 'ap-southeast-1' | 'ap-southeast-2' | 'ash' | 'asia-east1' | 'asia-east2' | 'asia-northeast1' | 'asia-northeast2' | 'asia-northeast3' | 'asia-south1' | 'asia-south2' | 'asia-southeast1' | 'asia-southeast2' | 'australia-southeast1' | 'australia-southeast2' | 'ca-central-1' | 'eu-central-1' | 'eu-central-2' | 'eu-north-1' | 'eu-west-1' | 'eu-west-2' | 'eu-west-3' | 'europe-central2' | 'europe-north1' | 'europe-southwest1' | 'europe-west1' | 'europe-west10' | 'europe-west12' | 'europe-west2' | 'europe-west3' | 'europe-west4' | 'europe-west6' | 'europe-west8' | 'europe-west9' | 'fsn1' | 'hel1' | 'hil' | 'me-central1' | 'me-central2' | 'me-west1' | 'nbg1' | 'northamerica-northeast1' | 'northamerica-northeast2' | 'sa-east-1' | 'sin' | 'southamerica-east1' | 'southamerica-west1' | 'us-central1' | 'us-east-1' | 'us-east-2' | 'us-east1' | 'us-east4' | 'us-east5' | 'us-south1' | 'us-west-1' | 'us-west-2' | 'us-west1' | 'us-west2' | 'us-west3' | 'us-west4'>;
367
543
  };
544
+ /**
545
+ * Controls scale-up / scale-down responsiveness. `aggressive` prioritizes cost-optimization. `conservative` prioritizes stability of the fleet.
546
+ */
547
+ scalingProfile: 'aggressive' | 'conservative';
368
548
  /**
369
549
  * Unique identifier of the kubernetes fleet.
370
550
  */
371
551
  id: string;
552
+ /**
553
+ * Indicates whether the fleet configuration is healthy.
554
+ */
555
+ ready: boolean;
556
+ /**
557
+ * Human-readable reason the fleet is not ready. Present only when `ready` is false.
558
+ */
559
+ status_message?: string;
560
+ /**
561
+ * Creation date and time of the fleet.
562
+ */
563
+ created_at: string;
564
+ /**
565
+ * Date and time the fleet was last updated.
566
+ */
567
+ updated_at: string;
372
568
  };
373
569
  export type FleetUpdateInput = {
374
570
  /**
@@ -376,31 +572,66 @@ export type FleetUpdateInput = {
376
572
  */
377
573
  limits?: {
378
574
  /**
379
- * CPU limit in cores.
575
+ * CPU limit in cores. Maximum 100,000.
380
576
  */
381
- cpu: number;
577
+ cpu?: number;
382
578
  };
383
579
  gcp?: {
384
- enabled?: boolean;
580
+ enabled: boolean;
385
581
  /**
386
- * Project GCP Project id to deploy instances into
582
+ * GCP project ID to deploy instances into. 6-30 chars, lowercase letters/digits/hyphens, must start with a letter and not end with a hyphen. Omit when GCP is disabled.
387
583
  */
388
- project: string;
584
+ project?: string;
389
585
  };
390
586
  hetzner?: {
391
- enabled?: boolean;
587
+ enabled: boolean;
392
588
  /**
393
- * Hetzner Cloud API key with read / write access
589
+ * Hetzner Cloud API token with read / write access (64 alphanumeric characters). Omit this field to keep the existing value.
394
590
  */
395
- apiKey: string;
591
+ apiKey?: string;
396
592
  };
397
593
  aws?: {
398
- enabled?: boolean;
594
+ enabled: boolean;
399
595
  /**
400
- * ControllerRoleArn is the AWS IAM role that Karpenter uses to manage resources.
596
+ * AWS IAM role ARN that Karpenter uses to manage resources. Omit when AWS is disabled.
401
597
  */
402
- controllerRoleArn: string;
598
+ controllerRoleArn?: string;
403
599
  };
600
+ /**
601
+ * Constraints define scheduling and provisioning requirements for the fleet. Each field restricts the values allowed for a given Kubernetes label key. Multiple constraints are ANDed together. Omit a field to place no restriction on that key.
602
+ */
603
+ constraints?: {
604
+ /**
605
+ * Allowed values for `karpenter.sh/capacity-type`.
606
+ */
607
+ 'karpenter.sh/capacity-type'?: Array<'on-demand' | 'spot'>;
608
+ /**
609
+ * Allowed values for `kubernetes.io/arch`.
610
+ */
611
+ 'kubernetes.io/arch'?: Array<'amd64' | 'arm64'>;
612
+ /**
613
+ * Allowed values for `cfke.io/instance-family`.
614
+ */
615
+ 'cfke.io/instance-family'?: Array<'a1' | 'a2' | 'a3' | 'a4' | 'c1' | 'c2' | 'c2d' | 'c3' | 'c3d' | 'c4' | 'c4a' | 'c4d' | 'c5' | 'c5a' | 'c5ad' | 'c5d' | 'c5n' | 'c6a' | 'c6g' | 'c6gd' | 'c6gn' | 'c6i' | 'c6id' | 'c6in' | 'c7a' | 'c7g' | 'c7gd' | 'c7gn' | 'c7i' | 'c7i-flex' | 'c8g' | 'c8gd' | 'cax' | 'ccx' | 'cpx' | 'cx' | 'd2' | 'd3' | 'd3en' | 'dl1' | 'dl2q' | 'e2' | 'f1' | 'f2' | 'g1' | 'g2' | 'g4ad' | 'g4dn' | 'g5' | 'g5g' | 'g6' | 'g6e' | 'gr6' | 'h1' | 'h3' | 'hpc6a' | 'hpc6id' | 'hpc7a' | 'hpc7g' | 'i2' | 'i3' | 'i3en' | 'i4g' | 'i4i' | 'i7i' | 'i7ie' | 'i8g' | 'im4gn' | 'inf1' | 'inf2' | 'is4gen' | 'm1' | 'm2' | 'm3' | 'm4' | 'm5' | 'm5a' | 'm5ad' | 'm5d' | 'm5dn' | 'm5n' | 'm5zn' | 'm6a' | 'm6g' | 'm6gd' | 'm6i' | 'm6id' | 'm6idn' | 'm6in' | 'm7a' | 'm7g' | 'm7gd' | 'm7i' | 'm7i-flex' | 'm8g' | 'm8gd' | 'n1' | 'n2' | 'n2d' | 'n4' | 'p3' | 'p3dn' | 'p4d' | 'p4de' | 'p5' | 'p5e' | 'p5en' | 'p6-b200' | 'r3' | 'r4' | 'r5' | 'r5a' | 'r5ad' | 'r5b' | 'r5d' | 'r5dn' | 'r5n' | 'r6a' | 'r6g' | 'r6gd' | 'r6i' | 'r6id' | 'r6idn' | 'r6in' | 'r7a' | 'r7g' | 'r7gd' | 'r7i' | 'r7iz' | 'r8g' | 'r8gd' | 't2' | 't2a' | 't2d' | 't3' | 't3a' | 't4g' | 'trn1' | 'trn1n' | 'u-3tb1' | 'u-6tb1' | 'u7i-12tb' | 'u7i-6tb' | 'u7i-8tb' | 'u7in-16tb' | 'u7in-24tb' | 'u7in-32tb' | 'vt1' | 'x1' | 'x1e' | 'x2gd' | 'x2idn' | 'x2iedn' | 'x2iezn' | 'x4' | 'x8g' | 'z1d' | 'z3'>;
616
+ /**
617
+ * Allowed values for `topology.kubernetes.io/region`.
618
+ */
619
+ 'topology.kubernetes.io/region'?: Array<'africa-south1' | 'ap-northeast-1' | 'ap-northeast-2' | 'ap-northeast-3' | 'ap-south-1' | 'ap-southeast-1' | 'ap-southeast-2' | 'ash' | 'asia-east1' | 'asia-east2' | 'asia-northeast1' | 'asia-northeast2' | 'asia-northeast3' | 'asia-south1' | 'asia-south2' | 'asia-southeast1' | 'asia-southeast2' | 'australia-southeast1' | 'australia-southeast2' | 'ca-central-1' | 'eu-central-1' | 'eu-central-2' | 'eu-north-1' | 'eu-west-1' | 'eu-west-2' | 'eu-west-3' | 'europe-central2' | 'europe-north1' | 'europe-southwest1' | 'europe-west1' | 'europe-west10' | 'europe-west12' | 'europe-west2' | 'europe-west3' | 'europe-west4' | 'europe-west6' | 'europe-west8' | 'europe-west9' | 'fsn1' | 'hel1' | 'hil' | 'me-central1' | 'me-central2' | 'me-west1' | 'nbg1' | 'northamerica-northeast1' | 'northamerica-northeast2' | 'sa-east-1' | 'sin' | 'southamerica-east1' | 'southamerica-west1' | 'us-central1' | 'us-east-1' | 'us-east-2' | 'us-east1' | 'us-east4' | 'us-east5' | 'us-south1' | 'us-west-1' | 'us-west-2' | 'us-west1' | 'us-west2' | 'us-west3' | 'us-west4'>;
620
+ };
621
+ /**
622
+ * Controls scale-up / scale-down responsiveness. `aggressive` prioritizes cost-optimization. `conservative` prioritizes stability of the fleet.
623
+ */
624
+ scalingProfile: 'aggressive' | 'conservative';
625
+ };
626
+ export type InviteCreateInput = {
627
+ /**
628
+ * Email address of the user to invite.
629
+ */
630
+ email: string;
631
+ /**
632
+ * Role the invited user will be assigned on redemption. Can be 'Administrator' or 'User'.
633
+ */
634
+ role?: 'Administrator' | 'User';
404
635
  };
405
636
  export type Invite = {
406
637
  /**
@@ -423,6 +654,10 @@ export type Invite = {
423
654
  * Generated unique invite code.
424
655
  */
425
656
  code?: string;
657
+ /**
658
+ * Role the invited user will be assigned on redemption. Can be 'Administrator' or 'User'.
659
+ */
660
+ role?: 'Administrator' | 'User';
426
661
  };
427
662
  export type Invoice = {
428
663
  /**
@@ -543,6 +778,10 @@ export type MarketplaceListing = {
543
778
  };
544
779
  };
545
780
  export type OrganizationCreateInput = {
781
+ /**
782
+ * Type of the organization. `business` for legal entities, `personal` for individuals.
783
+ */
784
+ type: 'business' | 'personal';
546
785
  /**
547
786
  * Email address used for billing as a string.
548
787
  */
@@ -564,6 +803,12 @@ export type OrganizationCreateInput = {
564
803
  */
565
804
  password: string;
566
805
  };
806
+ export type OrganizationCreateOutput = {
807
+ /**
808
+ * Unique identifier of the newly created organization. Generated by the API and safe to use for client-side tracking immediately.
809
+ */
810
+ id: string;
811
+ };
567
812
  export type Organization = {
568
813
  /**
569
814
  * Unique identifier of the organization. UUID v4 string in canonical form
@@ -573,6 +818,10 @@ export type Organization = {
573
818
  * Name of the legal entity. This name will be used in invoices. Use your first and last name for individual accounts.
574
819
  */
575
820
  name?: string;
821
+ /**
822
+ * Type of the organization. `business` for legal entities, `personal` for individuals.
823
+ */
824
+ type: 'business' | 'personal';
576
825
  /**
577
826
  * Creation date of the organization. ISO 8601 date string in UTC timezone
578
827
  */
@@ -631,36 +880,52 @@ export type Organization = {
631
880
  * Status of the organization. Can be `active` or `closed`, or `suspended`.
632
881
  */
633
882
  status: 'active' | 'closed' | 'suspended';
883
+ /**
884
+ * Verification status of the organization, which determines the assigned quota. `none` when billing information is incomplete, `submitted` when billing information is complete but the organization is not yet verified, `verified` when the organization is verified.
885
+ */
886
+ verification: 'none' | 'submitted' | 'verified';
634
887
  };
635
888
  export type PaymentMethod = {
636
889
  /**
637
- * Unique identifier of the organization. UUID v4 string in canonical form.
890
+ * Payment method identifier. Stripe payment method id for cards/SEPA; the constant `bank_transfer` for the invoice/bank-transfer method. Used to set as default or delete the payment method.
638
891
  */
639
892
  id: string;
640
893
  /**
641
- * Whether organization payment method was set up and ready to use for payments.
894
+ * Payment method type. `card`, `sepa_debit` for SEPA Direct Debit (business accounts only), or `bank_transfer` for paying invoices by bank transfer.
642
895
  */
643
- setup: boolean;
896
+ type: 'card' | 'sepa_debit' | 'bank_transfer';
644
897
  /**
645
- * Payment method type type. Only `card` payments supported at the moment.
646
- */
647
- type: 'card';
648
- /**
649
- * Last 4 digits of the payment card number.
898
+ * Last 4 digits of the payment card number, of the bank account (IBAN) for SEPA Direct Debit, or of the destination IBAN for bank transfer.
650
899
  */
651
900
  last4: string;
652
901
  /**
653
- * Two-digit number representing the card's expiration month.
902
+ * Two-digit number representing the card's expiration month. Null for SEPA Direct Debit and bank transfer.
654
903
  */
655
904
  exp_month: number;
656
905
  /**
657
- * Four-digit number representing the card's expiration year.
906
+ * Four-digit number representing the card's expiration year. May be in the past for an expired card still on file. Null for SEPA Direct Debit and bank transfer.
658
907
  */
659
908
  exp_year: number;
660
909
  /**
661
- * Payment card brand. Can be `amex`, `diners`, `discover`, `eftpos_au`, `jcb`, `mastercard`, `unionpay`, `visa`, or `unknown`.
910
+ * Payment card brand as reported by Stripe, e.g. `visa`, `mastercard`, `amex`, `cartes_bancaires`, or `unknown`. Null for SEPA Direct Debit and bank transfer.
911
+ */
912
+ brand: string;
913
+ /**
914
+ * Full destination IBAN to send bank transfers to. Set only for `bank_transfer`; null otherwise. This is Cloudfleet's virtual receiving account, shown in full so the customer can pay into it.
662
915
  */
663
- brand: 'amex' | 'diners' | 'discover' | 'eftpos_au' | 'jcb' | 'mastercard' | 'unionpay' | 'visa' | 'unknown';
916
+ iban: string;
917
+ /**
918
+ * BIC/SWIFT of the destination bank for bank transfers. Set only for `bank_transfer`; null otherwise.
919
+ */
920
+ bic: string;
921
+ /**
922
+ * Account holder name of the destination bank account for bank transfers. Set only for `bank_transfer`; null otherwise.
923
+ */
924
+ account_holder_name: string;
925
+ /**
926
+ * Whether this payment method is the default used for invoices and active subscriptions. Always false for `bank_transfer` (it cannot be a Stripe default payment method).
927
+ */
928
+ is_default: boolean;
664
929
  };
665
930
  export type PlatformQuota = {
666
931
  /**
@@ -1252,14 +1517,6 @@ export type UserCreateInput = {
1252
1517
  * User password. Must be at least 8 characters long.
1253
1518
  */
1254
1519
  password: string;
1255
- /**
1256
- * Status of the user. Can be `active` or `inactive`. Inactive users cannot log in or manage organization resources.
1257
- */
1258
- status?: 'active' | 'inactive';
1259
- /**
1260
- * User role. Can be 'Administrator', 'User'.
1261
- */
1262
- role?: 'Administrator' | 'User';
1263
1520
  };
1264
1521
  export type User = {
1265
1522
  /**
@@ -1337,44 +1594,112 @@ export type GetUsageResponses = {
1337
1594
  200: UsageResponse;
1338
1595
  };
1339
1596
  export type GetUsageResponse = GetUsageResponses[keyof GetUsageResponses];
1340
- export type GetPaymentMethodData = {
1597
+ export type GetPaymentMethodSecretData = {
1341
1598
  body?: never;
1342
1599
  path?: never;
1343
1600
  query?: never;
1344
1601
  url: '/billing/payment-method';
1345
1602
  };
1346
- export type GetPaymentMethodErrors = {
1603
+ export type GetPaymentMethodSecretResponses = {
1347
1604
  /**
1348
- * Returns 404 Not Found if the organization does not have a payment method set up.
1605
+ * The client secret. Used for client-side retrieval using a publishable key. The client secret can be used to complete a payment from your frontend. It should not be stored, logged, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret.
1606
+ *
1349
1607
  */
1350
- 404: unknown;
1608
+ 200: {
1609
+ /**
1610
+ * The client secret.
1611
+ */
1612
+ id?: string;
1613
+ };
1614
+ };
1615
+ export type GetPaymentMethodSecretResponse = GetPaymentMethodSecretResponses[keyof GetPaymentMethodSecretResponses];
1616
+ export type ListPaymentMethodsData = {
1617
+ body?: never;
1618
+ path?: never;
1619
+ query?: never;
1620
+ url: '/billing/payment-methods';
1351
1621
  };
1352
- export type GetPaymentMethodResponses = {
1622
+ export type ListPaymentMethodsErrors = {
1353
1623
  /**
1354
- * Redacted payment card information.
1624
+ * Not authenticated
1355
1625
  */
1356
- 200: PaymentMethod;
1626
+ 401: unknown;
1357
1627
  };
1358
- export type GetPaymentMethodResponse = GetPaymentMethodResponses[keyof GetPaymentMethodResponses];
1359
- export type GetPaymentMethodSecretData = {
1628
+ export type ListPaymentMethodsResponses = {
1629
+ /**
1630
+ * An array of payment methods.
1631
+ */
1632
+ 200: Array<PaymentMethod>;
1633
+ };
1634
+ export type ListPaymentMethodsResponse = ListPaymentMethodsResponses[keyof ListPaymentMethodsResponses];
1635
+ export type SetDefaultPaymentMethodData = {
1360
1636
  body?: never;
1361
- path?: never;
1637
+ path: {
1638
+ /**
1639
+ * Stripe payment method identifier.
1640
+ */
1641
+ paymentMethodId: string;
1642
+ };
1362
1643
  query?: never;
1363
- url: '/billing/payment-method';
1644
+ url: '/billing/payment-methods/{paymentMethodId}/default';
1364
1645
  };
1365
- export type GetPaymentMethodSecretResponses = {
1646
+ export type SetDefaultPaymentMethodErrors = {
1366
1647
  /**
1367
- * The client secret. Used for client-side retrieval using a publishable key. The client secret can be used to complete a payment from your frontend. It should not be stored, logged, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret.
1368
- *
1648
+ * The bank transfer payment method cannot be set as the default.
1369
1649
  */
1370
- 200: {
1650
+ 400: unknown;
1651
+ /**
1652
+ * Not authenticated
1653
+ */
1654
+ 401: unknown;
1655
+ /**
1656
+ * Payment method not found.
1657
+ */
1658
+ 404: unknown;
1659
+ };
1660
+ export type SetDefaultPaymentMethodResponses = {
1661
+ /**
1662
+ * Default payment method updated.
1663
+ */
1664
+ 204: void;
1665
+ };
1666
+ export type SetDefaultPaymentMethodResponse = SetDefaultPaymentMethodResponses[keyof SetDefaultPaymentMethodResponses];
1667
+ export type DeletePaymentMethodData = {
1668
+ body?: never;
1669
+ path: {
1371
1670
  /**
1372
- * The client secret.
1671
+ * Stripe payment method identifier.
1373
1672
  */
1374
- id?: string;
1673
+ paymentMethodId: string;
1375
1674
  };
1675
+ query?: never;
1676
+ url: '/billing/payment-methods/{paymentMethodId}';
1376
1677
  };
1377
- export type GetPaymentMethodSecretResponse = GetPaymentMethodSecretResponses[keyof GetPaymentMethodSecretResponses];
1678
+ export type DeletePaymentMethodErrors = {
1679
+ /**
1680
+ * The bank transfer payment method cannot be removed.
1681
+ */
1682
+ 400: unknown;
1683
+ /**
1684
+ * Not authenticated
1685
+ */
1686
+ 401: unknown;
1687
+ /**
1688
+ * Payment method not found.
1689
+ */
1690
+ 404: unknown;
1691
+ /**
1692
+ * Cannot delete the only remaining payment method.
1693
+ */
1694
+ 409: unknown;
1695
+ };
1696
+ export type DeletePaymentMethodResponses = {
1697
+ /**
1698
+ * Payment method deleted.
1699
+ */
1700
+ 204: void;
1701
+ };
1702
+ export type DeletePaymentMethodResponse = DeletePaymentMethodResponses[keyof DeletePaymentMethodResponses];
1378
1703
  export type ListInvoicesData = {
1379
1704
  body?: never;
1380
1705
  path?: never;
@@ -1497,6 +1822,13 @@ export type CreateChartData = {
1497
1822
  query?: never;
1498
1823
  url: '/clusters/{cluster_id}/charts';
1499
1824
  };
1825
+ export type CreateChartErrors = {
1826
+ /**
1827
+ * The cluster cannot service this operation: it is still being created, or it is suspended. Retry once it is ready, or resume the cluster first.
1828
+ */
1829
+ 409: string;
1830
+ };
1831
+ export type CreateChartError = CreateChartErrors[keyof CreateChartErrors];
1500
1832
  export type CreateChartResponses = {
1501
1833
  /**
1502
1834
  * Successfully created. Returns created Chart ID.
@@ -1519,6 +1851,13 @@ export type DeleteChartData = {
1519
1851
  query?: never;
1520
1852
  url: '/clusters/{cluster_id}/charts/{chart_name}';
1521
1853
  };
1854
+ export type DeleteChartErrors = {
1855
+ /**
1856
+ * The cluster cannot service this operation: it is still being created, or it is suspended. Retry once it is ready, or resume the cluster first.
1857
+ */
1858
+ 409: string;
1859
+ };
1860
+ export type DeleteChartError = DeleteChartErrors[keyof DeleteChartErrors];
1522
1861
  export type DeleteChartResponses = {
1523
1862
  /**
1524
1863
  * Successfully deleted.
@@ -1563,6 +1902,13 @@ export type UpdateChartData = {
1563
1902
  query?: never;
1564
1903
  url: '/clusters/{cluster_id}/charts/{chart_name}';
1565
1904
  };
1905
+ export type UpdateChartErrors = {
1906
+ /**
1907
+ * The cluster cannot service this operation: it is still being created, or it is suspended. Retry once it is ready, or resume the cluster first.
1908
+ */
1909
+ 409: string;
1910
+ };
1911
+ export type UpdateChartError = UpdateChartErrors[keyof UpdateChartErrors];
1566
1912
  export type UpdateChartResponses = {
1567
1913
  /**
1568
1914
  * Successfully updated.
@@ -1610,6 +1956,10 @@ export type CreateFleetErrors = {
1610
1956
  * Cluster quota exceeded. Maximum number of fleets per cluster allowed in this organization is reached.
1611
1957
  */
1612
1958
  402: string;
1959
+ /**
1960
+ * The cluster cannot service this operation: it is still being created, or it is suspended. Retry once it is ready, or resume the cluster first.
1961
+ */
1962
+ 409: string;
1613
1963
  };
1614
1964
  export type CreateFleetError = CreateFleetErrors[keyof CreateFleetErrors];
1615
1965
  export type CreateFleetResponses = {
@@ -1634,6 +1984,13 @@ export type DeleteFleetData = {
1634
1984
  query?: never;
1635
1985
  url: '/clusters/{cluster_id}/fleets/{fleet_name}';
1636
1986
  };
1987
+ export type DeleteFleetErrors = {
1988
+ /**
1989
+ * The cluster cannot service this operation: it is still being created, or it is suspended. Retry once it is ready, or resume the cluster first.
1990
+ */
1991
+ 409: string;
1992
+ };
1993
+ export type DeleteFleetError = DeleteFleetErrors[keyof DeleteFleetErrors];
1637
1994
  export type DeleteFleetResponses = {
1638
1995
  /**
1639
1996
  * Successfully deleted.
@@ -1683,6 +2040,10 @@ export type UpdateFleetErrors = {
1683
2040
  * Organization must have a valid payment method configured to access this endpoint.
1684
2041
  */
1685
2042
  402: string;
2043
+ /**
2044
+ * The cluster cannot service this operation: it is still being created, or it is suspended. Retry once it is ready, or resume the cluster first.
2045
+ */
2046
+ 409: string;
1686
2047
  };
1687
2048
  export type UpdateFleetError = UpdateFleetErrors[keyof UpdateFleetErrors];
1688
2049
  export type UpdateFleetResponses = {
@@ -1765,9 +2126,24 @@ export type DeleteClusterData = {
1765
2126
  query?: never;
1766
2127
  url: '/clusters/{cluster_id}';
1767
2128
  };
2129
+ export type DeleteClusterErrors = {
2130
+ /**
2131
+ * Cluster not found — it does not exist or has already been deleted.
2132
+ */
2133
+ 404: unknown;
2134
+ /**
2135
+ * The cluster cannot service this operation: it is still being created, or it is suspended. Retry once it is ready, or resume the cluster first.
2136
+ */
2137
+ 409: string;
2138
+ /**
2139
+ * Transient failure tearing down the cluster; retry the request.
2140
+ */
2141
+ 503: unknown;
2142
+ };
2143
+ export type DeleteClusterError = DeleteClusterErrors[keyof DeleteClusterErrors];
1768
2144
  export type DeleteClusterResponses = {
1769
2145
  /**
1770
- * Successfully deleted.
2146
+ * Successfully deleted. The cluster has been torn down.
1771
2147
  */
1772
2148
  200: string;
1773
2149
  };
@@ -1801,6 +2177,13 @@ export type UpdateClusterData = {
1801
2177
  query?: never;
1802
2178
  url: '/clusters/{cluster_id}';
1803
2179
  };
2180
+ export type UpdateClusterErrors = {
2181
+ /**
2182
+ * The cluster cannot service this operation: it is still being created, or it is suspended. Retry once it is ready, or resume the cluster first.
2183
+ */
2184
+ 409: string;
2185
+ };
2186
+ export type UpdateClusterError = UpdateClusterErrors[keyof UpdateClusterErrors];
1804
2187
  export type UpdateClusterResponses = {
1805
2188
  /**
1806
2189
  * Successfully updated. Returns updated cluster details.
@@ -1824,7 +2207,12 @@ export type GetJoinInformationErrors = {
1824
2207
  * Not authenticated
1825
2208
  */
1826
2209
  401: unknown;
2210
+ /**
2211
+ * The cluster cannot service this operation: it is still being created, or it is suspended. Retry once it is ready, or resume the cluster first.
2212
+ */
2213
+ 409: string;
1827
2214
  };
2215
+ export type GetJoinInformationError = GetJoinInformationErrors[keyof GetJoinInformationErrors];
1828
2216
  export type GetJoinInformationResponses = {
1829
2217
  /**
1830
2218
  * An object of cluster join information
@@ -1852,12 +2240,7 @@ export type ListInvitesResponses = {
1852
2240
  };
1853
2241
  export type ListInvitesResponse = ListInvitesResponses[keyof ListInvitesResponses];
1854
2242
  export type CreateInviteData = {
1855
- body: {
1856
- /**
1857
- * User email address
1858
- */
1859
- email?: string;
1860
- };
2243
+ body: InviteCreateInput;
1861
2244
  path?: never;
1862
2245
  query?: never;
1863
2246
  url: '/invites';
@@ -1882,9 +2265,18 @@ export type GetInviteData = {
1882
2265
  };
1883
2266
  export type GetInviteResponses = {
1884
2267
  /**
1885
- * Returns a single object containing invite details.
2268
+ * The invitation code is valid. Returns the invited email and organization.
1886
2269
  */
1887
- 200: Invite;
2270
+ 200: {
2271
+ /**
2272
+ * Email address the invite was issued to.
2273
+ */
2274
+ email?: string;
2275
+ /**
2276
+ * Identifier of the organization the invite grants access to.
2277
+ */
2278
+ organization_id?: string;
2279
+ };
1888
2280
  };
1889
2281
  export type GetInviteResponse = GetInviteResponses[keyof GetInviteResponses];
1890
2282
  export type DeleteInviteData = {
@@ -2014,10 +2406,12 @@ export type CreateOrganizationData = {
2014
2406
  };
2015
2407
  export type CreateOrganizationResponses = {
2016
2408
  /**
2017
- * Successfully created a new organization.
2409
+ * Organization signup accepted. Returns the generated organization id immediately; provisioning (billing, Keycloak realm, user) continues asynchronously in the background.
2410
+ *
2018
2411
  */
2019
- 200: unknown;
2412
+ 200: OrganizationCreateOutput;
2020
2413
  };
2414
+ export type CreateOrganizationResponse = CreateOrganizationResponses[keyof CreateOrganizationResponses];
2021
2415
  export type ListRepositoriesData = {
2022
2416
  body?: never;
2023
2417
  path?: never;