@isnap/sdk 1.1.0-next.55 → 1.1.0-next.57

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.
@@ -862,152 +862,6 @@ export interface paths {
862
862
  patch?: never;
863
863
  trace?: never;
864
864
  };
865
- "/demo/start": {
866
- parameters: {
867
- query?: never;
868
- header?: never;
869
- path?: never;
870
- cookie?: never;
871
- };
872
- get?: never;
873
- put?: never;
874
- post: {
875
- parameters: {
876
- query?: never;
877
- header?: never;
878
- path?: never;
879
- cookie?: never;
880
- };
881
- requestBody?: never;
882
- responses: {
883
- /** @description Demo session started */
884
- 200: {
885
- headers: {
886
- [name: string]: unknown;
887
- };
888
- content: {
889
- "application/json": components["schemas"]["DemoStart"];
890
- };
891
- };
892
- };
893
- };
894
- delete?: never;
895
- options?: never;
896
- head?: never;
897
- patch?: never;
898
- trace?: never;
899
- };
900
- "/demo/send-test": {
901
- parameters: {
902
- query?: never;
903
- header?: never;
904
- path?: never;
905
- cookie?: never;
906
- };
907
- get?: never;
908
- put?: never;
909
- post: {
910
- parameters: {
911
- query?: never;
912
- header?: never;
913
- path?: never;
914
- cookie?: never;
915
- };
916
- requestBody?: {
917
- content: {
918
- "application/json": {
919
- to_number: string;
920
- };
921
- };
922
- };
923
- responses: {
924
- /** @description Test message sent */
925
- 200: {
926
- headers: {
927
- [name: string]: unknown;
928
- };
929
- content: {
930
- "application/json": components["schemas"]["DemoSendTest"];
931
- };
932
- };
933
- };
934
- };
935
- delete?: never;
936
- options?: never;
937
- head?: never;
938
- patch?: never;
939
- trace?: never;
940
- };
941
- "/demo/session": {
942
- parameters: {
943
- query?: never;
944
- header?: never;
945
- path?: never;
946
- cookie?: never;
947
- };
948
- get: {
949
- parameters: {
950
- query?: never;
951
- header?: never;
952
- path?: never;
953
- cookie?: never;
954
- };
955
- requestBody?: never;
956
- responses: {
957
- /** @description Current demo session */
958
- 200: {
959
- headers: {
960
- [name: string]: unknown;
961
- };
962
- content: {
963
- "application/json": components["schemas"]["DemoSession"];
964
- };
965
- };
966
- };
967
- };
968
- put?: never;
969
- post?: never;
970
- delete?: never;
971
- options?: never;
972
- head?: never;
973
- patch?: never;
974
- trace?: never;
975
- };
976
- "/demo/api-key": {
977
- parameters: {
978
- query?: never;
979
- header?: never;
980
- path?: never;
981
- cookie?: never;
982
- };
983
- get?: never;
984
- put?: never;
985
- post: {
986
- parameters: {
987
- query?: never;
988
- header?: never;
989
- path?: never;
990
- cookie?: never;
991
- };
992
- requestBody?: never;
993
- responses: {
994
- /** @description Demo API key generated */
995
- 200: {
996
- headers: {
997
- [name: string]: unknown;
998
- };
999
- content: {
1000
- "application/json": components["schemas"]["DemoApiKey"];
1001
- };
1002
- };
1003
- };
1004
- };
1005
- delete?: never;
1006
- options?: never;
1007
- head?: never;
1008
- patch?: never;
1009
- trace?: never;
1010
- };
1011
865
  "/analytics/message-volume": {
1012
866
  parameters: {
1013
867
  query?: never;
@@ -2692,7 +2546,7 @@ export interface paths {
2692
2546
  content: {
2693
2547
  "application/json": {
2694
2548
  /** @enum {string} */
2695
- status: "available" | "ordered" | "shipped" | "received" | "setup_in_progress" | "ready" | "deployed" | "offline" | "decommissioned";
2549
+ status: "available" | "ordered" | "received" | "setup_in_progress" | "ready" | "deployed" | "offline" | "decommissioned";
2696
2550
  };
2697
2551
  };
2698
2552
  };
@@ -2761,7 +2615,7 @@ export interface paths {
2761
2615
  get: {
2762
2616
  parameters: {
2763
2617
  query?: {
2764
- billing_tier?: "rental_iphone" | "rental_android" | "byod_imessage" | "byod_android" | "shared_pool";
2618
+ billing_tier?: "rental_iphone" | "rental_android" | "byod_imessage" | "byod_android" | "shared_pool" | "shared_imessage";
2765
2619
  status?: string;
2766
2620
  assigned?: boolean | null;
2767
2621
  fulfillment?: "pending" | "fulfilled";
@@ -2803,7 +2657,7 @@ export interface paths {
2803
2657
  query?: {
2804
2658
  page?: number;
2805
2659
  limit?: number;
2806
- billing_tier?: "rental_iphone" | "rental_android" | "byod_imessage" | "byod_android" | "shared_pool";
2660
+ billing_tier?: "rental_iphone" | "rental_android" | "byod_imessage" | "byod_android" | "shared_pool" | "shared_imessage";
2807
2661
  };
2808
2662
  header?: never;
2809
2663
  path?: never;
@@ -2924,14 +2778,16 @@ export interface paths {
2924
2778
  };
2925
2779
  get: {
2926
2780
  parameters: {
2927
- query?: never;
2781
+ query?: {
2782
+ purpose?: "trial" | "shared";
2783
+ };
2928
2784
  header?: never;
2929
2785
  path?: never;
2930
2786
  cookie?: never;
2931
2787
  };
2932
2788
  requestBody?: never;
2933
2789
  responses: {
2934
- /** @description Pool fleet summary + per-line trial/usage metrics */
2790
+ /** @description Pool fleet summary + per-line trial/binding/quota metrics + per-scope virtual/physical overcommit */
2935
2791
  200: {
2936
2792
  headers: {
2937
2793
  [name: string]: unknown;
@@ -2973,6 +2829,82 @@ export interface paths {
2973
2829
  patch?: never;
2974
2830
  trace?: never;
2975
2831
  };
2832
+ "/admin/lines/shared": {
2833
+ parameters: {
2834
+ query?: never;
2835
+ header?: never;
2836
+ path?: never;
2837
+ cookie?: never;
2838
+ };
2839
+ get?: never;
2840
+ put?: never;
2841
+ post: {
2842
+ parameters: {
2843
+ query?: never;
2844
+ header?: never;
2845
+ path?: never;
2846
+ cookie?: never;
2847
+ };
2848
+ requestBody?: {
2849
+ content: {
2850
+ "application/json": components["schemas"]["AdminMintSharedLineBody"];
2851
+ };
2852
+ };
2853
+ responses: {
2854
+ /** @description Virtual shared line minted for the target customer */
2855
+ 201: {
2856
+ headers: {
2857
+ [name: string]: unknown;
2858
+ };
2859
+ content: {
2860
+ "application/json": components["schemas"]["Line"];
2861
+ };
2862
+ };
2863
+ };
2864
+ };
2865
+ delete?: never;
2866
+ options?: never;
2867
+ head?: never;
2868
+ patch?: never;
2869
+ trace?: never;
2870
+ };
2871
+ "/admin/pool-lines/{id}/demote": {
2872
+ parameters: {
2873
+ query?: never;
2874
+ header?: never;
2875
+ path?: never;
2876
+ cookie?: never;
2877
+ };
2878
+ get?: never;
2879
+ put?: never;
2880
+ post: {
2881
+ parameters: {
2882
+ query?: never;
2883
+ header?: never;
2884
+ path: {
2885
+ id: string;
2886
+ };
2887
+ cookie?: never;
2888
+ };
2889
+ requestBody?: never;
2890
+ responses: {
2891
+ /** @description Pool line demoted to a rental line (blocked while live trials or active bindings exist) */
2892
+ 200: {
2893
+ headers: {
2894
+ [name: string]: unknown;
2895
+ };
2896
+ content: {
2897
+ "application/json": components["schemas"]["DemotePoolLine"];
2898
+ };
2899
+ };
2900
+ };
2901
+ };
2902
+ delete?: never;
2903
+ options?: never;
2904
+ head?: never;
2905
+ patch?: never;
2906
+ trace?: never;
2907
+ };
2976
2908
  "/admin/activation-codes/{code}/status": {
2977
2909
  parameters: {
2978
2910
  query?: never;
@@ -3490,7 +3422,7 @@ export interface paths {
3490
3422
  patch?: never;
3491
3423
  trace?: never;
3492
3424
  };
3493
- "/va/devices": {
3425
+ "/va/performance": {
3494
3426
  parameters: {
3495
3427
  query?: never;
3496
3428
  header?: never;
@@ -3499,71 +3431,68 @@ export interface paths {
3499
3431
  };
3500
3432
  get: {
3501
3433
  parameters: {
3502
- query?: {
3503
- page?: number;
3504
- limit?: number;
3505
- type?: "iphone" | "android";
3506
- status?: string;
3507
- availableForEsim?: boolean | null;
3508
- };
3434
+ query?: never;
3509
3435
  header?: never;
3510
3436
  path?: never;
3511
3437
  cookie?: never;
3512
3438
  };
3513
3439
  requestBody?: never;
3514
3440
  responses: {
3515
- /** @description Device inventory */
3441
+ /** @description VA performance KPIs */
3516
3442
  200: {
3517
3443
  headers: {
3518
3444
  [name: string]: unknown;
3519
3445
  };
3520
3446
  content: {
3521
- "application/json": components["schemas"]["VADeviceInventory"];
3447
+ "application/json": components["schemas"]["VAPerformance"];
3522
3448
  };
3523
3449
  };
3524
3450
  };
3525
3451
  };
3526
3452
  put?: never;
3527
- post: {
3453
+ post?: never;
3454
+ delete?: never;
3455
+ options?: never;
3456
+ head?: never;
3457
+ patch?: never;
3458
+ trace?: never;
3459
+ };
3460
+ "/va/mac-minis": {
3461
+ parameters: {
3462
+ query?: never;
3463
+ header?: never;
3464
+ path?: never;
3465
+ cookie?: never;
3466
+ };
3467
+ get: {
3528
3468
  parameters: {
3529
3469
  query?: never;
3530
3470
  header?: never;
3531
3471
  path?: never;
3532
3472
  cookie?: never;
3533
3473
  };
3534
- requestBody?: {
3535
- content: {
3536
- "application/json": {
3537
- model: string;
3538
- /** @enum {string} */
3539
- type: "iphone" | "android";
3540
- imei?: string;
3541
- purchaseDate?: string;
3542
- /** Format: uuid */
3543
- farmId: string;
3544
- notes?: string;
3545
- };
3546
- };
3547
- };
3474
+ requestBody?: never;
3548
3475
  responses: {
3549
- /** @description Device created */
3476
+ /** @description Fleet Mac Minis with session counts */
3550
3477
  200: {
3551
3478
  headers: {
3552
3479
  [name: string]: unknown;
3553
3480
  };
3554
3481
  content: {
3555
- "application/json": components["schemas"]["VADevice"];
3482
+ "application/json": components["schemas"]["VAMacMinis"];
3556
3483
  };
3557
3484
  };
3558
3485
  };
3559
3486
  };
3487
+ put?: never;
3488
+ post?: never;
3560
3489
  delete?: never;
3561
3490
  options?: never;
3562
3491
  head?: never;
3563
3492
  patch?: never;
3564
3493
  trace?: never;
3565
3494
  };
3566
- "/va/esims": {
3495
+ "/va/mac-minis/next": {
3567
3496
  parameters: {
3568
3497
  query?: never;
3569
3498
  header?: never;
@@ -3572,11 +3501,249 @@ export interface paths {
3572
3501
  };
3573
3502
  get: {
3574
3503
  parameters: {
3575
- query?: {
3576
- page?: number;
3577
- limit?: number;
3578
- areaCode?: string;
3579
- status?: string;
3504
+ query?: never;
3505
+ header?: never;
3506
+ path?: never;
3507
+ cookie?: never;
3508
+ };
3509
+ requestBody?: never;
3510
+ responses: {
3511
+ /** @description Preview the least-loaded Mac Mini (no commit) */
3512
+ 200: {
3513
+ headers: {
3514
+ [name: string]: unknown;
3515
+ };
3516
+ content: {
3517
+ "application/json": components["schemas"]["VANextMacMini"];
3518
+ };
3519
+ };
3520
+ };
3521
+ };
3522
+ put?: never;
3523
+ post?: never;
3524
+ delete?: never;
3525
+ options?: never;
3526
+ head?: never;
3527
+ patch?: never;
3528
+ trace?: never;
3529
+ };
3530
+ "/va/macos-sessions": {
3531
+ parameters: {
3532
+ query?: never;
3533
+ header?: never;
3534
+ path?: never;
3535
+ cookie?: never;
3536
+ };
3537
+ get?: never;
3538
+ put?: never;
3539
+ post: {
3540
+ parameters: {
3541
+ query?: never;
3542
+ header?: never;
3543
+ path?: never;
3544
+ cookie?: never;
3545
+ };
3546
+ requestBody?: {
3547
+ content: {
3548
+ "application/json": {
3549
+ /** Format: uuid */
3550
+ appleAccountId: string;
3551
+ login: string;
3552
+ password: string;
3553
+ };
3554
+ };
3555
+ };
3556
+ responses: {
3557
+ /** @description macOS session created (or pending_provisioning) */
3558
+ 200: {
3559
+ headers: {
3560
+ [name: string]: unknown;
3561
+ };
3562
+ content: {
3563
+ "application/json": components["schemas"]["VAMacosSession"];
3564
+ };
3565
+ };
3566
+ };
3567
+ };
3568
+ delete?: never;
3569
+ options?: never;
3570
+ head?: never;
3571
+ patch?: never;
3572
+ trace?: never;
3573
+ };
3574
+ "/va/devices": {
3575
+ parameters: {
3576
+ query?: never;
3577
+ header?: never;
3578
+ path?: never;
3579
+ cookie?: never;
3580
+ };
3581
+ get: {
3582
+ parameters: {
3583
+ query?: {
3584
+ page?: number;
3585
+ limit?: number;
3586
+ type?: "iphone" | "android";
3587
+ status?: string;
3588
+ availableForEsim?: boolean | null;
3589
+ };
3590
+ header?: never;
3591
+ path?: never;
3592
+ cookie?: never;
3593
+ };
3594
+ requestBody?: never;
3595
+ responses: {
3596
+ /** @description Device inventory */
3597
+ 200: {
3598
+ headers: {
3599
+ [name: string]: unknown;
3600
+ };
3601
+ content: {
3602
+ "application/json": components["schemas"]["VADeviceInventory"];
3603
+ };
3604
+ };
3605
+ };
3606
+ };
3607
+ put?: never;
3608
+ post: {
3609
+ parameters: {
3610
+ query?: never;
3611
+ header?: never;
3612
+ path?: never;
3613
+ cookie?: never;
3614
+ };
3615
+ requestBody?: {
3616
+ content: {
3617
+ "application/json": {
3618
+ model: string;
3619
+ /** @enum {string} */
3620
+ type: "iphone" | "android";
3621
+ imei?: string;
3622
+ purchaseDate?: string;
3623
+ /** Format: uuid */
3624
+ farmId: string;
3625
+ notes?: string;
3626
+ unitCostCents?: number;
3627
+ };
3628
+ };
3629
+ };
3630
+ responses: {
3631
+ /** @description Device created */
3632
+ 200: {
3633
+ headers: {
3634
+ [name: string]: unknown;
3635
+ };
3636
+ content: {
3637
+ "application/json": components["schemas"]["VADevice"];
3638
+ };
3639
+ };
3640
+ };
3641
+ };
3642
+ delete?: never;
3643
+ options?: never;
3644
+ head?: never;
3645
+ patch?: never;
3646
+ trace?: never;
3647
+ };
3648
+ "/va/devices/{id}": {
3649
+ parameters: {
3650
+ query?: never;
3651
+ header?: never;
3652
+ path?: never;
3653
+ cookie?: never;
3654
+ };
3655
+ get?: never;
3656
+ put?: never;
3657
+ post?: never;
3658
+ delete?: never;
3659
+ options?: never;
3660
+ head?: never;
3661
+ patch: {
3662
+ parameters: {
3663
+ query?: never;
3664
+ header?: never;
3665
+ path: {
3666
+ id: string;
3667
+ };
3668
+ cookie?: never;
3669
+ };
3670
+ requestBody?: {
3671
+ content: {
3672
+ "application/json": {
3673
+ model?: string;
3674
+ imei?: string | null;
3675
+ notes?: string;
3676
+ unitCostCents?: number | null;
3677
+ /** Format: uuid */
3678
+ farmId?: string;
3679
+ };
3680
+ };
3681
+ };
3682
+ responses: {
3683
+ /** @description Device updated */
3684
+ 200: {
3685
+ headers: {
3686
+ [name: string]: unknown;
3687
+ };
3688
+ content: {
3689
+ "application/json": components["schemas"]["VADevice"];
3690
+ };
3691
+ };
3692
+ };
3693
+ };
3694
+ trace?: never;
3695
+ };
3696
+ "/va/device-models": {
3697
+ parameters: {
3698
+ query?: never;
3699
+ header?: never;
3700
+ path?: never;
3701
+ cookie?: never;
3702
+ };
3703
+ get: {
3704
+ parameters: {
3705
+ query?: {
3706
+ platform?: "iphone" | "android";
3707
+ };
3708
+ header?: never;
3709
+ path?: never;
3710
+ cookie?: never;
3711
+ };
3712
+ requestBody?: never;
3713
+ responses: {
3714
+ /** @description VA-readable device-model catalogue */
3715
+ 200: {
3716
+ headers: {
3717
+ [name: string]: unknown;
3718
+ };
3719
+ content: {
3720
+ "application/json": components["schemas"]["VADeviceModels"];
3721
+ };
3722
+ };
3723
+ };
3724
+ };
3725
+ put?: never;
3726
+ post?: never;
3727
+ delete?: never;
3728
+ options?: never;
3729
+ head?: never;
3730
+ patch?: never;
3731
+ trace?: never;
3732
+ };
3733
+ "/va/esims": {
3734
+ parameters: {
3735
+ query?: never;
3736
+ header?: never;
3737
+ path?: never;
3738
+ cookie?: never;
3739
+ };
3740
+ get: {
3741
+ parameters: {
3742
+ query?: {
3743
+ page?: number;
3744
+ limit?: number;
3745
+ areaCode?: string;
3746
+ status?: string;
3580
3747
  };
3581
3748
  header?: never;
3582
3749
  path?: never;
@@ -3723,7 +3890,7 @@ export interface paths {
3723
3890
  query?: {
3724
3891
  page?: number;
3725
3892
  limit?: number;
3726
- type?: "buy_device" | "buy_esim" | "create_apple_account" | "assemble_line" | "ship_device";
3893
+ type?: "buy_device" | "buy_esim" | "create_apple_account" | "assemble_line";
3727
3894
  status?: string;
3728
3895
  };
3729
3896
  header?: never;
@@ -3755,7 +3922,7 @@ export interface paths {
3755
3922
  content: {
3756
3923
  "application/json": {
3757
3924
  /** @enum {string} */
3758
- type: "buy_device" | "buy_esim" | "create_apple_account" | "assemble_line" | "ship_device";
3925
+ type: "buy_device" | "buy_esim" | "create_apple_account" | "assemble_line";
3759
3926
  /** @default 3 */
3760
3927
  priority?: number;
3761
3928
  dueAt?: string;
@@ -3877,54 +4044,42 @@ export interface paths {
3877
4044
  patch?: never;
3878
4045
  trace?: never;
3879
4046
  };
3880
- "/va/devices/{id}/ship": {
4047
+ "/va/farms": {
3881
4048
  parameters: {
3882
4049
  query?: never;
3883
4050
  header?: never;
3884
4051
  path?: never;
3885
4052
  cookie?: never;
3886
4053
  };
3887
- get?: never;
3888
- put?: never;
3889
- post: {
4054
+ get: {
3890
4055
  parameters: {
3891
4056
  query?: never;
3892
4057
  header?: never;
3893
- path: {
3894
- id: string;
3895
- };
4058
+ path?: never;
3896
4059
  cookie?: never;
3897
4060
  };
3898
- requestBody?: {
3899
- content: {
3900
- "application/json": {
3901
- trackingNumber?: string;
3902
- carrier?: string;
3903
- trackingUrl?: string;
3904
- expectedArrivalDate?: string;
3905
- notes?: string;
3906
- };
3907
- };
3908
- };
4061
+ requestBody?: never;
3909
4062
  responses: {
3910
- /** @description Device shipped */
4063
+ /** @description Farms list */
3911
4064
  200: {
3912
4065
  headers: {
3913
4066
  [name: string]: unknown;
3914
4067
  };
3915
4068
  content: {
3916
- "application/json": components["schemas"]["VADevice"];
4069
+ "application/json": components["schemas"]["FarmsList"];
3917
4070
  };
3918
4071
  };
3919
4072
  };
3920
4073
  };
4074
+ put?: never;
4075
+ post?: never;
3921
4076
  delete?: never;
3922
4077
  options?: never;
3923
4078
  head?: never;
3924
4079
  patch?: never;
3925
4080
  trace?: never;
3926
4081
  };
3927
- "/va/farms": {
4082
+ "/va/carriers": {
3928
4083
  parameters: {
3929
4084
  query?: never;
3930
4085
  header?: never;
@@ -3940,13 +4095,13 @@ export interface paths {
3940
4095
  };
3941
4096
  requestBody?: never;
3942
4097
  responses: {
3943
- /** @description Farms list */
4098
+ /** @description Carriers */
3944
4099
  200: {
3945
4100
  headers: {
3946
4101
  [name: string]: unknown;
3947
4102
  };
3948
4103
  content: {
3949
- "application/json": components["schemas"]["FarmsList"];
4104
+ "application/json": components["schemas"]["Carriers"];
3950
4105
  };
3951
4106
  };
3952
4107
  };
@@ -3959,7 +4114,7 @@ export interface paths {
3959
4114
  patch?: never;
3960
4115
  trace?: never;
3961
4116
  };
3962
- "/va/carriers": {
4117
+ "/va/carrier-plans/{carrierName}": {
3963
4118
  parameters: {
3964
4119
  query?: never;
3965
4120
  header?: never;
@@ -3970,18 +4125,20 @@ export interface paths {
3970
4125
  parameters: {
3971
4126
  query?: never;
3972
4127
  header?: never;
3973
- path?: never;
4128
+ path: {
4129
+ carrierName: string;
4130
+ };
3974
4131
  cookie?: never;
3975
4132
  };
3976
4133
  requestBody?: never;
3977
4134
  responses: {
3978
- /** @description Carriers */
4135
+ /** @description Carrier plans */
3979
4136
  200: {
3980
4137
  headers: {
3981
4138
  [name: string]: unknown;
3982
4139
  };
3983
4140
  content: {
3984
- "application/json": components["schemas"]["Carriers"];
4141
+ "application/json": components["schemas"]["CarrierPlans"];
3985
4142
  };
3986
4143
  };
3987
4144
  };
@@ -3994,44 +4151,42 @@ export interface paths {
3994
4151
  patch?: never;
3995
4152
  trace?: never;
3996
4153
  };
3997
- "/va/carrier-plans/{carrierName}": {
4154
+ "/va/generate-email": {
3998
4155
  parameters: {
3999
4156
  query?: never;
4000
4157
  header?: never;
4001
4158
  path?: never;
4002
4159
  cookie?: never;
4003
4160
  };
4004
- get: {
4161
+ get?: never;
4162
+ put?: never;
4163
+ post: {
4005
4164
  parameters: {
4006
4165
  query?: never;
4007
4166
  header?: never;
4008
- path: {
4009
- carrierName: string;
4010
- };
4167
+ path?: never;
4011
4168
  cookie?: never;
4012
4169
  };
4013
4170
  requestBody?: never;
4014
4171
  responses: {
4015
- /** @description Carrier plans */
4172
+ /** @description Stalwart email generated */
4016
4173
  200: {
4017
4174
  headers: {
4018
4175
  [name: string]: unknown;
4019
4176
  };
4020
4177
  content: {
4021
- "application/json": components["schemas"]["CarrierPlans"];
4178
+ "application/json": components["schemas"]["StalwartEmail"];
4022
4179
  };
4023
4180
  };
4024
4181
  };
4025
4182
  };
4026
- put?: never;
4027
- post?: never;
4028
4183
  delete?: never;
4029
4184
  options?: never;
4030
4185
  head?: never;
4031
4186
  patch?: never;
4032
4187
  trace?: never;
4033
4188
  };
4034
- "/va/generate-email": {
4189
+ "/va/fetch-activation-code": {
4035
4190
  parameters: {
4036
4191
  query?: never;
4037
4192
  header?: never;
@@ -4047,34 +4202,142 @@ export interface paths {
4047
4202
  path?: never;
4048
4203
  cookie?: never;
4049
4204
  };
4205
+ requestBody?: {
4206
+ content: {
4207
+ "application/json": {
4208
+ /** Format: email */
4209
+ email: string;
4210
+ password: string;
4211
+ };
4212
+ };
4213
+ };
4214
+ responses: {
4215
+ /** @description eSIM activation code */
4216
+ 200: {
4217
+ headers: {
4218
+ [name: string]: unknown;
4219
+ };
4220
+ content: {
4221
+ "application/json": components["schemas"]["EsimActivationCode"];
4222
+ };
4223
+ };
4224
+ };
4225
+ };
4226
+ delete?: never;
4227
+ options?: never;
4228
+ head?: never;
4229
+ patch?: never;
4230
+ trace?: never;
4231
+ };
4232
+ "/va/esim-email/{preOrderId}": {
4233
+ parameters: {
4234
+ query?: never;
4235
+ header?: never;
4236
+ path?: never;
4237
+ cookie?: never;
4238
+ };
4239
+ get: {
4240
+ parameters: {
4241
+ query?: never;
4242
+ header?: never;
4243
+ path: {
4244
+ preOrderId: string;
4245
+ };
4246
+ cookie?: never;
4247
+ };
4050
4248
  requestBody?: never;
4051
4249
  responses: {
4052
- /** @description Stalwart email generated */
4250
+ /** @description eSIM email for pre-order */
4053
4251
  200: {
4054
4252
  headers: {
4055
4253
  [name: string]: unknown;
4056
4254
  };
4057
4255
  content: {
4058
- "application/json": components["schemas"]["StalwartEmail"];
4256
+ "application/json": components["schemas"]["EsimEmail"];
4059
4257
  };
4060
4258
  };
4061
4259
  };
4062
4260
  };
4261
+ put?: never;
4262
+ post?: never;
4063
4263
  delete?: never;
4064
4264
  options?: never;
4065
4265
  head?: never;
4066
4266
  patch?: never;
4067
4267
  trace?: never;
4068
4268
  };
4069
- "/va/fetch-activation-code": {
4269
+ "/v1/api-keys": {
4070
4270
  parameters: {
4071
4271
  query?: never;
4072
4272
  header?: never;
4073
4273
  path?: never;
4074
4274
  cookie?: never;
4075
4275
  };
4076
- get?: never;
4276
+ /**
4277
+ * List API keys
4278
+ * @description Return every non-revoked API key for the authenticated user. Includes the key prefix, scope, line allowlist, and last-used timestamp — never the plaintext (which is only emitted once at create time).
4279
+ */
4280
+ get: {
4281
+ parameters: {
4282
+ query?: never;
4283
+ header?: never;
4284
+ path?: never;
4285
+ cookie?: never;
4286
+ };
4287
+ requestBody?: never;
4288
+ responses: {
4289
+ /** @description API key list */
4290
+ 200: {
4291
+ headers: {
4292
+ [name: string]: unknown;
4293
+ };
4294
+ content: {
4295
+ "application/json": components["schemas"]["ApiKeyList"];
4296
+ };
4297
+ };
4298
+ /** @description Bad request — validation failed */
4299
+ 400: {
4300
+ headers: {
4301
+ [name: string]: unknown;
4302
+ };
4303
+ content: {
4304
+ "application/json": components["schemas"]["ErrorEnvelope"];
4305
+ };
4306
+ };
4307
+ /** @description Unauthenticated — missing or invalid bearer token */
4308
+ 401: {
4309
+ headers: {
4310
+ [name: string]: unknown;
4311
+ };
4312
+ content: {
4313
+ "application/json": components["schemas"]["ErrorEnvelope"];
4314
+ };
4315
+ };
4316
+ /** @description Too many requests — rate limit exceeded */
4317
+ 429: {
4318
+ headers: {
4319
+ [name: string]: unknown;
4320
+ };
4321
+ content: {
4322
+ "application/json": components["schemas"]["ErrorEnvelope"];
4323
+ };
4324
+ };
4325
+ /** @description Internal server error */
4326
+ 500: {
4327
+ headers: {
4328
+ [name: string]: unknown;
4329
+ };
4330
+ content: {
4331
+ "application/json": components["schemas"]["ErrorEnvelope"];
4332
+ };
4333
+ };
4334
+ };
4335
+ };
4077
4336
  put?: never;
4337
+ /**
4338
+ * Create an API key
4339
+ * @description Mint a new API key for the authenticated user. The plaintext key is returned ONCE in this response — store it; the server only keeps a hash. Optional `line_ids` array scopes the key to specific lines; omit or pass `[]` for account-wide access.
4340
+ */
4078
4341
  post: {
4079
4342
  parameters: {
4080
4343
  query?: never;
@@ -4085,20 +4348,60 @@ export interface paths {
4085
4348
  requestBody?: {
4086
4349
  content: {
4087
4350
  "application/json": {
4088
- /** Format: email */
4089
- email: string;
4090
- password: string;
4351
+ name?: string;
4352
+ /**
4353
+ * @default live
4354
+ * @enum {string}
4355
+ */
4356
+ scope?: "test" | "live";
4357
+ line_ids?: string[];
4091
4358
  };
4092
4359
  };
4093
4360
  };
4094
4361
  responses: {
4095
- /** @description eSIM activation code */
4096
- 200: {
4362
+ /** @description API key created */
4363
+ 201: {
4097
4364
  headers: {
4098
4365
  [name: string]: unknown;
4099
4366
  };
4100
4367
  content: {
4101
- "application/json": components["schemas"]["EsimActivationCode"];
4368
+ "application/json": components["schemas"]["ApiKeyCreate"];
4369
+ };
4370
+ };
4371
+ /** @description Bad request — validation failed */
4372
+ 400: {
4373
+ headers: {
4374
+ [name: string]: unknown;
4375
+ };
4376
+ content: {
4377
+ "application/json": components["schemas"]["ErrorEnvelope"];
4378
+ };
4379
+ };
4380
+ /** @description Unauthenticated — missing or invalid bearer token */
4381
+ 401: {
4382
+ headers: {
4383
+ [name: string]: unknown;
4384
+ };
4385
+ content: {
4386
+ "application/json": components["schemas"]["ErrorEnvelope"];
4387
+ };
4388
+ };
4389
+ /** @description Too many requests — rate limit exceeded */
4390
+ 429: {
4391
+ headers: {
4392
+ [name: string]: unknown;
4393
+ };
4394
+ content: {
4395
+ "application/json": components["schemas"]["ErrorEnvelope"];
4396
+ };
4397
+ };
4398
+ /** @description Internal server error */
4399
+ 500: {
4400
+ headers: {
4401
+ [name: string]: unknown;
4402
+ };
4403
+ content: {
4404
+ "application/json": components["schemas"]["ErrorEnvelope"];
4102
4405
  };
4103
4406
  };
4104
4407
  };
@@ -4109,31 +4412,172 @@ export interface paths {
4109
4412
  patch?: never;
4110
4413
  trace?: never;
4111
4414
  };
4112
- "/va/esim-email/{preOrderId}": {
4415
+ "/v1/api-keys/{id}": {
4113
4416
  parameters: {
4114
4417
  query?: never;
4115
4418
  header?: never;
4116
4419
  path?: never;
4117
4420
  cookie?: never;
4118
4421
  };
4119
- get: {
4422
+ get?: never;
4423
+ put?: never;
4424
+ post?: never;
4425
+ /**
4426
+ * Revoke an API key
4427
+ * @description Mark the API key as revoked. Subsequent requests presenting this key receive 401. Revocation is irreversible — issue a fresh key via `POST /v1/api-keys` to regain access.
4428
+ */
4429
+ delete: {
4120
4430
  parameters: {
4121
4431
  query?: never;
4122
4432
  header?: never;
4123
4433
  path: {
4124
- preOrderId: string;
4434
+ id: string;
4125
4435
  };
4126
4436
  cookie?: never;
4127
4437
  };
4128
4438
  requestBody?: never;
4129
4439
  responses: {
4130
- /** @description eSIM email for pre-order */
4440
+ /** @description API key revoked */
4131
4441
  200: {
4132
4442
  headers: {
4133
4443
  [name: string]: unknown;
4134
4444
  };
4135
4445
  content: {
4136
- "application/json": components["schemas"]["EsimEmail"];
4446
+ "application/json": components["schemas"]["ApiKeyRevoke"];
4447
+ };
4448
+ };
4449
+ /** @description Bad request — validation failed */
4450
+ 400: {
4451
+ headers: {
4452
+ [name: string]: unknown;
4453
+ };
4454
+ content: {
4455
+ "application/json": components["schemas"]["ErrorEnvelope"];
4456
+ };
4457
+ };
4458
+ /** @description Unauthenticated — missing or invalid bearer token */
4459
+ 401: {
4460
+ headers: {
4461
+ [name: string]: unknown;
4462
+ };
4463
+ content: {
4464
+ "application/json": components["schemas"]["ErrorEnvelope"];
4465
+ };
4466
+ };
4467
+ /** @description Forbidden — caller authenticated but not allowed */
4468
+ 403: {
4469
+ headers: {
4470
+ [name: string]: unknown;
4471
+ };
4472
+ content: {
4473
+ "application/json": components["schemas"]["ErrorEnvelope"];
4474
+ };
4475
+ };
4476
+ /** @description Not found */
4477
+ 404: {
4478
+ headers: {
4479
+ [name: string]: unknown;
4480
+ };
4481
+ content: {
4482
+ "application/json": components["schemas"]["ErrorEnvelope"];
4483
+ };
4484
+ };
4485
+ /** @description Too many requests — rate limit exceeded */
4486
+ 429: {
4487
+ headers: {
4488
+ [name: string]: unknown;
4489
+ };
4490
+ content: {
4491
+ "application/json": components["schemas"]["ErrorEnvelope"];
4492
+ };
4493
+ };
4494
+ /** @description Internal server error */
4495
+ 500: {
4496
+ headers: {
4497
+ [name: string]: unknown;
4498
+ };
4499
+ content: {
4500
+ "application/json": components["schemas"]["ErrorEnvelope"];
4501
+ };
4502
+ };
4503
+ };
4504
+ };
4505
+ options?: never;
4506
+ head?: never;
4507
+ patch?: never;
4508
+ trace?: never;
4509
+ };
4510
+ "/v1/lines": {
4511
+ parameters: {
4512
+ query?: never;
4513
+ header?: never;
4514
+ path?: never;
4515
+ cookie?: never;
4516
+ };
4517
+ /**
4518
+ * List available lines (public marketplace)
4519
+ * @description Browse the marketplace inventory of unassigned lines. Filter by billing tier, area code, country code, status. Returns only `status: available` and never the iSnap-internal `shared_pool` tier. Unauthenticated — partners use this in prospecting / quote flows.
4520
+ */
4521
+ get: {
4522
+ parameters: {
4523
+ query?: {
4524
+ billing_tier?: "rental_iphone" | "rental_android" | "byod_imessage" | "byod_android" | "shared_pool" | "shared_imessage";
4525
+ area_code?: string;
4526
+ country_code?: string;
4527
+ /** @description US state filter — 2-letter code or full name. */
4528
+ state?: string;
4529
+ /** @description Country filter — ISO alpha-2 code or country name. */
4530
+ country?: string;
4531
+ status?: string;
4532
+ page?: number;
4533
+ limit?: number;
4534
+ };
4535
+ header?: never;
4536
+ path?: never;
4537
+ cookie?: never;
4538
+ };
4539
+ requestBody?: never;
4540
+ responses: {
4541
+ /** @description Available lines */
4542
+ 200: {
4543
+ headers: {
4544
+ [name: string]: unknown;
4545
+ };
4546
+ content: {
4547
+ "application/json": {
4548
+ /** @enum {boolean} */
4549
+ success: true;
4550
+ data: components["schemas"]["LineList"];
4551
+ trace_id: string;
4552
+ request_id: string;
4553
+ };
4554
+ };
4555
+ };
4556
+ /** @description Bad request — validation failed */
4557
+ 400: {
4558
+ headers: {
4559
+ [name: string]: unknown;
4560
+ };
4561
+ content: {
4562
+ "application/json": components["schemas"]["ErrorEnvelope"];
4563
+ };
4564
+ };
4565
+ /** @description Too many requests — rate limit exceeded */
4566
+ 429: {
4567
+ headers: {
4568
+ [name: string]: unknown;
4569
+ };
4570
+ content: {
4571
+ "application/json": components["schemas"]["ErrorEnvelope"];
4572
+ };
4573
+ };
4574
+ /** @description Internal server error */
4575
+ 500: {
4576
+ headers: {
4577
+ [name: string]: unknown;
4578
+ };
4579
+ content: {
4580
+ "application/json": components["schemas"]["ErrorEnvelope"];
4137
4581
  };
4138
4582
  };
4139
4583
  };
@@ -4146,7 +4590,7 @@ export interface paths {
4146
4590
  patch?: never;
4147
4591
  trace?: never;
4148
4592
  };
4149
- "/v1/api-keys": {
4593
+ "/v1/lines/my": {
4150
4594
  parameters: {
4151
4595
  query?: never;
4152
4596
  header?: never;
@@ -4154,8 +4598,8 @@ export interface paths {
4154
4598
  cookie?: never;
4155
4599
  };
4156
4600
  /**
4157
- * List API keys
4158
- * @description Return every non-revoked API key for the authenticated user. Includes the key prefix, scope, line allowlist, and last-used timestamp never the plaintext (which is only emitted once at create time).
4601
+ * List the caller's own lines
4602
+ * @description Return every line owned by the authenticated user that's in `active` or `reserved` status. Includes a `fulfillment_status` hint for lines whose hardware is still being procured. Accepts an API key (`isnap_*`) or a dashboard JWT.
4159
4603
  */
4160
4604
  get: {
4161
4605
  parameters: {
@@ -4166,13 +4610,19 @@ export interface paths {
4166
4610
  };
4167
4611
  requestBody?: never;
4168
4612
  responses: {
4169
- /** @description API key list */
4613
+ /** @description User lines */
4170
4614
  200: {
4171
4615
  headers: {
4172
4616
  [name: string]: unknown;
4173
4617
  };
4174
4618
  content: {
4175
- "application/json": components["schemas"]["ApiKeyList"];
4619
+ "application/json": {
4620
+ /** @enum {boolean} */
4621
+ success: true;
4622
+ data: components["schemas"]["MyLines"];
4623
+ trace_id: string;
4624
+ request_id: string;
4625
+ };
4176
4626
  };
4177
4627
  };
4178
4628
  /** @description Bad request — validation failed */
@@ -4214,38 +4664,48 @@ export interface paths {
4214
4664
  };
4215
4665
  };
4216
4666
  put?: never;
4667
+ post?: never;
4668
+ delete?: never;
4669
+ options?: never;
4670
+ head?: never;
4671
+ patch?: never;
4672
+ trace?: never;
4673
+ };
4674
+ "/v1/lines/{id}": {
4675
+ parameters: {
4676
+ query?: never;
4677
+ header?: never;
4678
+ path?: never;
4679
+ cookie?: never;
4680
+ };
4217
4681
  /**
4218
- * Create an API key
4219
- * @description Mint a new API key for the authenticated user. The plaintext key is returned ONCE in this response — store it; the server only keeps a hash. Optional `line_ids` array scopes the key to specific lines; omit or pass `[]` for account-wide access.
4682
+ * Get line details (public marketplace)
4683
+ * @description Fetch a single line by its `line_<base62>` id. Available unauthenticated for the marketplace browsing flow; partner-private metadata still requires API key access via `GET /v1/lines/my`.
4220
4684
  */
4221
- post: {
4685
+ get: {
4222
4686
  parameters: {
4223
4687
  query?: never;
4224
4688
  header?: never;
4225
- path?: never;
4226
- cookie?: never;
4227
- };
4228
- requestBody?: {
4229
- content: {
4230
- "application/json": {
4231
- name?: string;
4232
- /**
4233
- * @default live
4234
- * @enum {string}
4235
- */
4236
- scope?: "test" | "live";
4237
- line_ids?: string[];
4238
- };
4689
+ path: {
4690
+ id: string;
4239
4691
  };
4692
+ cookie?: never;
4240
4693
  };
4694
+ requestBody?: never;
4241
4695
  responses: {
4242
- /** @description API key created */
4243
- 201: {
4696
+ /** @description Line */
4697
+ 200: {
4244
4698
  headers: {
4245
4699
  [name: string]: unknown;
4246
4700
  };
4247
4701
  content: {
4248
- "application/json": components["schemas"]["ApiKeyCreate"];
4702
+ "application/json": {
4703
+ /** @enum {boolean} */
4704
+ success: true;
4705
+ data: components["schemas"]["Line"];
4706
+ trace_id: string;
4707
+ request_id: string;
4708
+ };
4249
4709
  };
4250
4710
  };
4251
4711
  /** @description Bad request — validation failed */
@@ -4257,8 +4717,8 @@ export interface paths {
4257
4717
  "application/json": components["schemas"]["ErrorEnvelope"];
4258
4718
  };
4259
4719
  };
4260
- /** @description Unauthenticated missing or invalid bearer token */
4261
- 401: {
4720
+ /** @description Not found */
4721
+ 404: {
4262
4722
  headers: {
4263
4723
  [name: string]: unknown;
4264
4724
  };
@@ -4286,27 +4746,16 @@ export interface paths {
4286
4746
  };
4287
4747
  };
4288
4748
  };
4749
+ put?: never;
4750
+ post?: never;
4289
4751
  delete?: never;
4290
4752
  options?: never;
4291
4753
  head?: never;
4292
- patch?: never;
4293
- trace?: never;
4294
- };
4295
- "/v1/api-keys/{id}": {
4296
- parameters: {
4297
- query?: never;
4298
- header?: never;
4299
- path?: never;
4300
- cookie?: never;
4301
- };
4302
- get?: never;
4303
- put?: never;
4304
- post?: never;
4305
4754
  /**
4306
- * Revoke an API key
4307
- * @description Mark the API key as revoked. Subsequent requests presenting this key receive 401. Revocation is irreversible issue a fresh key via `POST /v1/api-keys` to regain access.
4755
+ * Update line metadata
4756
+ * @description Merge-patch the line's free-form `metadata` tag object. Pass `null` for a key to delete it; pass a new value to overwrite. Metadata is echoed on every `line.*` webhook so partners can attribute events back to their own customer IDs.
4308
4757
  */
4309
- delete: {
4758
+ patch: {
4310
4759
  parameters: {
4311
4760
  query?: never;
4312
4761
  header?: never;
@@ -4315,15 +4764,25 @@ export interface paths {
4315
4764
  };
4316
4765
  cookie?: never;
4317
4766
  };
4318
- requestBody?: never;
4767
+ requestBody?: {
4768
+ content: {
4769
+ "application/json": components["schemas"]["PatchLine"];
4770
+ };
4771
+ };
4319
4772
  responses: {
4320
- /** @description API key revoked */
4773
+ /** @description Line with merged metadata */
4321
4774
  200: {
4322
4775
  headers: {
4323
4776
  [name: string]: unknown;
4324
4777
  };
4325
4778
  content: {
4326
- "application/json": components["schemas"]["ApiKeyRevoke"];
4779
+ "application/json": {
4780
+ /** @enum {boolean} */
4781
+ success: true;
4782
+ data: components["schemas"]["Line"];
4783
+ trace_id: string;
4784
+ request_id: string;
4785
+ };
4327
4786
  };
4328
4787
  };
4329
4788
  /** @description Bad request — validation failed */
@@ -4382,43 +4841,35 @@ export interface paths {
4382
4841
  };
4383
4842
  };
4384
4843
  };
4385
- options?: never;
4386
- head?: never;
4387
- patch?: never;
4388
4844
  trace?: never;
4389
4845
  };
4390
- "/v1/lines": {
4846
+ "/v1/lines/assign": {
4391
4847
  parameters: {
4392
4848
  query?: never;
4393
4849
  header?: never;
4394
4850
  path?: never;
4395
4851
  cookie?: never;
4396
4852
  };
4853
+ get?: never;
4854
+ put?: never;
4397
4855
  /**
4398
- * List available lines (public marketplace)
4399
- * @description Browse the marketplace inventory of unassigned lines. Filter by billing tier, area code, country code, status. Returns only `status: available` and never the iSnap-internal `shared_pool` tier. Unauthenticatedpartners use this in prospecting / quote flows.
4856
+ * Atomically reserve + activate a line
4857
+ * @description Find an available line matching `billing_tier` (and optional `area_code`), reserve it, and activate it in a single round-trip. Useful when the partner doesn't care which specific number they getsaves the reserve→checkout→activate dance. Scoped API keys are rejected (cannot assign lines outside their allowlist).
4400
4858
  */
4401
- get: {
4859
+ post: {
4402
4860
  parameters: {
4403
- query?: {
4404
- billing_tier?: "rental_iphone" | "rental_android" | "byod_imessage" | "byod_android" | "shared_pool";
4405
- area_code?: string;
4406
- country_code?: string;
4407
- /** @description US state filter — 2-letter code or full name. */
4408
- state?: string;
4409
- /** @description Country filter — ISO alpha-2 code or country name. */
4410
- country?: string;
4411
- status?: string;
4412
- page?: number;
4413
- limit?: number;
4414
- };
4861
+ query?: never;
4415
4862
  header?: never;
4416
4863
  path?: never;
4417
4864
  cookie?: never;
4418
4865
  };
4419
- requestBody?: never;
4866
+ requestBody?: {
4867
+ content: {
4868
+ "application/json": components["schemas"]["AssignLine"];
4869
+ };
4870
+ };
4420
4871
  responses: {
4421
- /** @description Available lines */
4872
+ /** @description Line assigned and activated */
4422
4873
  200: {
4423
4874
  headers: {
4424
4875
  [name: string]: unknown;
@@ -4427,7 +4878,7 @@ export interface paths {
4427
4878
  "application/json": {
4428
4879
  /** @enum {boolean} */
4429
4880
  success: true;
4430
- data: components["schemas"]["LineList"];
4881
+ data: components["schemas"]["Line"];
4431
4882
  trace_id: string;
4432
4883
  request_id: string;
4433
4884
  };
@@ -4442,8 +4893,8 @@ export interface paths {
4442
4893
  "application/json": components["schemas"]["ErrorEnvelope"];
4443
4894
  };
4444
4895
  };
4445
- /** @description Too many requests rate limit exceeded */
4446
- 429: {
4896
+ /** @description Unauthenticated missing or invalid bearer token */
4897
+ 401: {
4447
4898
  headers: {
4448
4899
  [name: string]: unknown;
4449
4900
  };
@@ -4451,8 +4902,8 @@ export interface paths {
4451
4902
  "application/json": components["schemas"]["ErrorEnvelope"];
4452
4903
  };
4453
4904
  };
4454
- /** @description Internal server error */
4455
- 500: {
4905
+ /** @description Forbidden caller authenticated but not allowed */
4906
+ 403: {
4456
4907
  headers: {
4457
4908
  [name: string]: unknown;
4458
4909
  };
@@ -4460,53 +4911,8 @@ export interface paths {
4460
4911
  "application/json": components["schemas"]["ErrorEnvelope"];
4461
4912
  };
4462
4913
  };
4463
- };
4464
- };
4465
- put?: never;
4466
- post?: never;
4467
- delete?: never;
4468
- options?: never;
4469
- head?: never;
4470
- patch?: never;
4471
- trace?: never;
4472
- };
4473
- "/v1/lines/my": {
4474
- parameters: {
4475
- query?: never;
4476
- header?: never;
4477
- path?: never;
4478
- cookie?: never;
4479
- };
4480
- /**
4481
- * List the caller's own lines
4482
- * @description Return every line owned by the authenticated user that's in `active` or `reserved` status. Includes a `fulfillment_status` hint for lines whose hardware is still being procured. Accepts an API key (`isnap_*`) or a dashboard JWT.
4483
- */
4484
- get: {
4485
- parameters: {
4486
- query?: never;
4487
- header?: never;
4488
- path?: never;
4489
- cookie?: never;
4490
- };
4491
- requestBody?: never;
4492
- responses: {
4493
- /** @description User lines */
4494
- 200: {
4495
- headers: {
4496
- [name: string]: unknown;
4497
- };
4498
- content: {
4499
- "application/json": {
4500
- /** @enum {boolean} */
4501
- success: true;
4502
- data: components["schemas"]["MyLines"];
4503
- trace_id: string;
4504
- request_id: string;
4505
- };
4506
- };
4507
- };
4508
- /** @description Bad request — validation failed */
4509
- 400: {
4914
+ /** @description Not found */
4915
+ 404: {
4510
4916
  headers: {
4511
4917
  [name: string]: unknown;
4512
4918
  };
@@ -4514,8 +4920,8 @@ export interface paths {
4514
4920
  "application/json": components["schemas"]["ErrorEnvelope"];
4515
4921
  };
4516
4922
  };
4517
- /** @description Unauthenticatedmissing or invalid bearer token */
4518
- 401: {
4923
+ /** @description Conflictconcurrent or terminal state */
4924
+ 409: {
4519
4925
  headers: {
4520
4926
  [name: string]: unknown;
4521
4927
  };
@@ -4543,38 +4949,40 @@ export interface paths {
4543
4949
  };
4544
4950
  };
4545
4951
  };
4546
- put?: never;
4547
- post?: never;
4548
4952
  delete?: never;
4549
4953
  options?: never;
4550
4954
  head?: never;
4551
4955
  patch?: never;
4552
4956
  trace?: never;
4553
4957
  };
4554
- "/v1/lines/{id}": {
4958
+ "/v1/lines/shared": {
4555
4959
  parameters: {
4556
4960
  query?: never;
4557
4961
  header?: never;
4558
4962
  path?: never;
4559
4963
  cookie?: never;
4560
4964
  };
4965
+ get?: never;
4966
+ put?: never;
4561
4967
  /**
4562
- * Get line details (public marketplace)
4563
- * @description Fetch a single line by its `line_<base62>` id. Available unauthenticated for the marketplace browsing flow; partner-private metadata still requires API key access via `GET /v1/lines/my`.
4968
+ * Mint a virtual shared-outbound line
4969
+ * @description Mint a customer-owned VIRTUAL line on the shared-outbound plan (billing_tier `shared_imessage`): no dedicated hardware, no phone number of its own — sends are proxied onto the shared physical iMessage fleet, with a per-contact physical number resolved at send time. Minted directly `active` with no per-line Stripe subscription (wholesale is metered end-of-month on the active virtual-line count). Wholesale-partner only in v1; direct-customer callers get 402 until self-serve checkout ships (an admin can provision one for them in the meantime). Optional `metadata` is persisted and echoed on `line.*` webhooks. Supports `Idempotency-Key` — every mint creates a fresh billable line, so retries MUST carry the same key to avoid double-minting.
4564
4970
  */
4565
- get: {
4971
+ post: {
4566
4972
  parameters: {
4567
4973
  query?: never;
4568
4974
  header?: never;
4569
- path: {
4570
- id: string;
4571
- };
4975
+ path?: never;
4572
4976
  cookie?: never;
4573
4977
  };
4574
- requestBody?: never;
4978
+ requestBody?: {
4979
+ content: {
4980
+ "application/json": components["schemas"]["MintSharedLine"];
4981
+ };
4982
+ };
4575
4983
  responses: {
4576
- /** @description Line */
4577
- 200: {
4984
+ /** @description Virtual shared line minted */
4985
+ 201: {
4578
4986
  headers: {
4579
4987
  [name: string]: unknown;
4580
4988
  };
@@ -4597,8 +5005,35 @@ export interface paths {
4597
5005
  "application/json": components["schemas"]["ErrorEnvelope"];
4598
5006
  };
4599
5007
  };
4600
- /** @description Not found */
4601
- 404: {
5008
+ /** @description Unauthenticated missing or invalid bearer token */
5009
+ 401: {
5010
+ headers: {
5011
+ [name: string]: unknown;
5012
+ };
5013
+ content: {
5014
+ "application/json": components["schemas"]["ErrorEnvelope"];
5015
+ };
5016
+ };
5017
+ /** @description Payment required — no billing relationship entitles this call */
5018
+ 402: {
5019
+ headers: {
5020
+ [name: string]: unknown;
5021
+ };
5022
+ content: {
5023
+ "application/json": components["schemas"]["ErrorEnvelope"];
5024
+ };
5025
+ };
5026
+ /** @description Forbidden — caller authenticated but not allowed */
5027
+ 403: {
5028
+ headers: {
5029
+ [name: string]: unknown;
5030
+ };
5031
+ content: {
5032
+ "application/json": components["schemas"]["ErrorEnvelope"];
5033
+ };
5034
+ };
5035
+ /** @description Conflict — concurrent or terminal state */
5036
+ 409: {
4602
5037
  headers: {
4603
5038
  [name: string]: unknown;
4604
5039
  };
@@ -4626,16 +5061,26 @@ export interface paths {
4626
5061
  };
4627
5062
  };
4628
5063
  };
4629
- put?: never;
4630
- post?: never;
4631
5064
  delete?: never;
4632
5065
  options?: never;
4633
5066
  head?: never;
5067
+ patch?: never;
5068
+ trace?: never;
5069
+ };
5070
+ "/v1/lines/{id}/reserve": {
5071
+ parameters: {
5072
+ query?: never;
5073
+ header?: never;
5074
+ path?: never;
5075
+ cookie?: never;
5076
+ };
5077
+ get?: never;
5078
+ put?: never;
4634
5079
  /**
4635
- * Update line metadata
4636
- * @description Merge-patch the line's free-form `metadata` tag object. Pass `null` for a key to delete it; pass a new value to overwrite. Metadata is echoed on every `line.*` webhook so partners can attribute events back to their own customer IDs.
5080
+ * Reserve an available line
5081
+ * @description Move a specific line from `available` to `reserved` for 15 minutes. After that window a background worker auto-releases the reservation. Call `POST /v1/billing/checkout` next to convert the reservation into an active subscription.
4637
5082
  */
4638
- patch: {
5083
+ post: {
4639
5084
  parameters: {
4640
5085
  query?: never;
4641
5086
  header?: never;
@@ -4644,13 +5089,9 @@ export interface paths {
4644
5089
  };
4645
5090
  cookie?: never;
4646
5091
  };
4647
- requestBody?: {
4648
- content: {
4649
- "application/json": components["schemas"]["PatchLine"];
4650
- };
4651
- };
5092
+ requestBody?: never;
4652
5093
  responses: {
4653
- /** @description Line with merged metadata */
5094
+ /** @description Line reserved */
4654
5095
  200: {
4655
5096
  headers: {
4656
5097
  [name: string]: unknown;
@@ -4701,6 +5142,15 @@ export interface paths {
4701
5142
  "application/json": components["schemas"]["ErrorEnvelope"];
4702
5143
  };
4703
5144
  };
5145
+ /** @description Conflict — concurrent or terminal state */
5146
+ 409: {
5147
+ headers: {
5148
+ [name: string]: unknown;
5149
+ };
5150
+ content: {
5151
+ "application/json": components["schemas"]["ErrorEnvelope"];
5152
+ };
5153
+ };
4704
5154
  /** @description Too many requests — rate limit exceeded */
4705
5155
  429: {
4706
5156
  headers: {
@@ -4721,9 +5171,13 @@ export interface paths {
4721
5171
  };
4722
5172
  };
4723
5173
  };
5174
+ delete?: never;
5175
+ options?: never;
5176
+ head?: never;
5177
+ patch?: never;
4724
5178
  trace?: never;
4725
5179
  };
4726
- "/v1/lines/assign": {
5180
+ "/v1/lines/{id}/activate": {
4727
5181
  parameters: {
4728
5182
  query?: never;
4729
5183
  header?: never;
@@ -4733,23 +5187,25 @@ export interface paths {
4733
5187
  get?: never;
4734
5188
  put?: never;
4735
5189
  /**
4736
- * Atomically reserve + activate a line
4737
- * @description Find an available line matching `billing_tier` (and optional `area_code`), reserve it, and activate it in a single round-trip. Useful when the partner doesn't care which specific number they get saves the reserve→checkout→activate dance. Scoped API keys are rejected (cannot assign lines outside their allowlist).
5190
+ * Activate a reserved line
5191
+ * @description Commit a `reserved` line to `active`. Wholesale partners (no Stripe checkout surface) use this as the second phase of reserve→activate — they reserve, bill their own end-user, then activate within the 15-minute window with no per-line Stripe sub (EOM-metered), and may pick the inbound-only rental variant via `inbound_only`. Direct callers get the test/dev mock-sub shortcut (production direct activation happens via the Stripe webhook on `checkout.session.completed`); `inbound_only` is ignored for them (theirs comes from the checkout price).
4738
5192
  */
4739
5193
  post: {
4740
5194
  parameters: {
4741
5195
  query?: never;
4742
5196
  header?: never;
4743
- path?: never;
5197
+ path: {
5198
+ id: string;
5199
+ };
4744
5200
  cookie?: never;
4745
5201
  };
4746
5202
  requestBody?: {
4747
5203
  content: {
4748
- "application/json": components["schemas"]["AssignLine"];
5204
+ "application/json": components["schemas"]["ActivateLine"];
4749
5205
  };
4750
5206
  };
4751
5207
  responses: {
4752
- /** @description Line assigned and activated */
5208
+ /** @description Line activated */
4753
5209
  200: {
4754
5210
  headers: {
4755
5211
  [name: string]: unknown;
@@ -4835,7 +5291,7 @@ export interface paths {
4835
5291
  patch?: never;
4836
5292
  trace?: never;
4837
5293
  };
4838
- "/v1/lines/{id}/reserve": {
5294
+ "/v1/lines/{id}/transfer-ownership": {
4839
5295
  parameters: {
4840
5296
  query?: never;
4841
5297
  header?: never;
@@ -4845,8 +5301,8 @@ export interface paths {
4845
5301
  get?: never;
4846
5302
  put?: never;
4847
5303
  /**
4848
- * Reserve an available line
4849
- * @description Move a specific line from `available` to `reserved` for 15 minutes. After that window a background worker auto-releases the reservation. Call `POST /v1/billing/checkout` next to convert the reservation into an active subscription.
5304
+ * Transfer a line to another iSnap user
5305
+ * @description Move ownership of a line to a different iSnap user. By default the paired device session stays attached so messaging continues uninterrupted; pass `preserve_device_session: false` to force the new owner to re-pair. See `/concepts/billing` for how the cutover handles the in-flight Stripe subscription.
4850
5306
  */
4851
5307
  post: {
4852
5308
  parameters: {
@@ -4857,9 +5313,13 @@ export interface paths {
4857
5313
  };
4858
5314
  cookie?: never;
4859
5315
  };
4860
- requestBody?: never;
5316
+ requestBody?: {
5317
+ content: {
5318
+ "application/json": components["schemas"]["TransferOwnership"];
5319
+ };
5320
+ };
4861
5321
  responses: {
4862
- /** @description Line reserved */
5322
+ /** @description Ownership transferred */
4863
5323
  200: {
4864
5324
  headers: {
4865
5325
  [name: string]: unknown;
@@ -4945,7 +5405,7 @@ export interface paths {
4945
5405
  patch?: never;
4946
5406
  trace?: never;
4947
5407
  };
4948
- "/v1/lines/{id}/activate": {
5408
+ "/v1/lines/{id}/convert-to-test": {
4949
5409
  parameters: {
4950
5410
  query?: never;
4951
5411
  header?: never;
@@ -4955,8 +5415,8 @@ export interface paths {
4955
5415
  get?: never;
4956
5416
  put?: never;
4957
5417
  /**
4958
- * Activate a reserved line
4959
- * @description Commit a `reserved` line to `active`. Wholesale partners (no Stripe checkout surface) use this as the second phase of reserveactivate they reserve, bill their own end-user, then activate within the 15-minute window with no per-line Stripe sub (EOM-metered), and may pick the inbound-only rental variant via `inbound_only`. Direct callers get the test/dev mock-sub shortcut (production direct activation happens via the Stripe webhook on `checkout.session.completed`); `inbound_only` is ignored for them (theirs comes from the checkout price).
5418
+ * Convert an owned rental line into a test line
5419
+ * @description Flip a rental line you own into an owned test line that backs trials in your own pool (ownershippool; the monthly price stays the rental-equivalent, not the $0 global-pool rate). Rejected on byod lines, lines you do not own, and lines carrying an active subscription.
4960
5420
  */
4961
5421
  post: {
4962
5422
  parameters: {
@@ -4967,13 +5427,9 @@ export interface paths {
4967
5427
  };
4968
5428
  cookie?: never;
4969
5429
  };
4970
- requestBody?: {
4971
- content: {
4972
- "application/json": components["schemas"]["ActivateLine"];
4973
- };
4974
- };
5430
+ requestBody?: never;
4975
5431
  responses: {
4976
- /** @description Line activated */
5432
+ /** @description Line converted to a test line */
4977
5433
  200: {
4978
5434
  headers: {
4979
5435
  [name: string]: unknown;
@@ -5059,7 +5515,7 @@ export interface paths {
5059
5515
  patch?: never;
5060
5516
  trace?: never;
5061
5517
  };
5062
- "/v1/lines/{id}/transfer-ownership": {
5518
+ "/v1/lines/{id}/convert-from-test": {
5063
5519
  parameters: {
5064
5520
  query?: never;
5065
5521
  header?: never;
@@ -5069,8 +5525,8 @@ export interface paths {
5069
5525
  get?: never;
5070
5526
  put?: never;
5071
5527
  /**
5072
- * Transfer a line to another iSnap user
5073
- * @description Move ownership of a line to a different iSnap user. By default the paired device session stays attached so messaging continues uninterrupted; pass `preserve_device_session: false` to force the new owner to re-pair. See `/concepts/billing` for how the cutover handles the in-flight Stripe subscription.
5528
+ * Revert an owned test line back to a rental line
5529
+ * @description Symmetric to convert-to-test: flip an owned test line back to a rental line (ownership rental, rental price re-stamped). Rejected while the test line still hosts live trials, since reverting would strand them.
5074
5530
  */
5075
5531
  post: {
5076
5532
  parameters: {
@@ -5081,13 +5537,9 @@ export interface paths {
5081
5537
  };
5082
5538
  cookie?: never;
5083
5539
  };
5084
- requestBody?: {
5085
- content: {
5086
- "application/json": components["schemas"]["TransferOwnership"];
5087
- };
5088
- };
5540
+ requestBody?: never;
5089
5541
  responses: {
5090
- /** @description Ownership transferred */
5542
+ /** @description Line reverted to a rental line */
5091
5543
  200: {
5092
5544
  headers: {
5093
5545
  [name: string]: unknown;
@@ -8321,28 +8773,194 @@ export interface paths {
8321
8773
  */
8322
8774
  get: {
8323
8775
  parameters: {
8324
- query?: never;
8325
- header?: never;
8326
- path: {
8327
- id: string;
8776
+ query?: never;
8777
+ header?: never;
8778
+ path: {
8779
+ id: string;
8780
+ };
8781
+ cookie?: never;
8782
+ };
8783
+ requestBody?: never;
8784
+ responses: {
8785
+ /** @description Attachment record + fresh signed download URL */
8786
+ 200: {
8787
+ headers: {
8788
+ [name: string]: unknown;
8789
+ };
8790
+ content: {
8791
+ "application/json": {
8792
+ /** @enum {boolean} */
8793
+ success: true;
8794
+ data: components["schemas"]["Attachment"];
8795
+ trace_id: string;
8796
+ request_id: string;
8797
+ };
8798
+ };
8799
+ };
8800
+ /** @description Bad request — validation failed */
8801
+ 400: {
8802
+ headers: {
8803
+ [name: string]: unknown;
8804
+ };
8805
+ content: {
8806
+ "application/json": components["schemas"]["ErrorEnvelope"];
8807
+ };
8808
+ };
8809
+ /** @description Unauthenticated — missing or invalid bearer token */
8810
+ 401: {
8811
+ headers: {
8812
+ [name: string]: unknown;
8813
+ };
8814
+ content: {
8815
+ "application/json": components["schemas"]["ErrorEnvelope"];
8816
+ };
8817
+ };
8818
+ /** @description Not found */
8819
+ 404: {
8820
+ headers: {
8821
+ [name: string]: unknown;
8822
+ };
8823
+ content: {
8824
+ "application/json": components["schemas"]["ErrorEnvelope"];
8825
+ };
8826
+ };
8827
+ /** @description Too many requests — rate limit exceeded */
8828
+ 429: {
8829
+ headers: {
8830
+ [name: string]: unknown;
8831
+ };
8832
+ content: {
8833
+ "application/json": components["schemas"]["ErrorEnvelope"];
8834
+ };
8835
+ };
8836
+ /** @description Internal server error */
8837
+ 500: {
8838
+ headers: {
8839
+ [name: string]: unknown;
8840
+ };
8841
+ content: {
8842
+ "application/json": components["schemas"]["ErrorEnvelope"];
8843
+ };
8844
+ };
8845
+ };
8846
+ };
8847
+ put?: never;
8848
+ post?: never;
8849
+ delete?: never;
8850
+ options?: never;
8851
+ head?: never;
8852
+ patch?: never;
8853
+ trace?: never;
8854
+ };
8855
+ "/v1/lookup": {
8856
+ parameters: {
8857
+ query?: never;
8858
+ header?: never;
8859
+ path?: never;
8860
+ cookie?: never;
8861
+ };
8862
+ get?: never;
8863
+ put?: never;
8864
+ /**
8865
+ * Look up a recipient capability
8866
+ * @description Check whether a phone number or email is iMessage-capable. Returns `imessage: true | false | null`; `null` means we have no cached probe result yet and the caller should fall back to SMS-safe behaviour. Rate-limited per line and per account.
8867
+ */
8868
+ post: {
8869
+ parameters: {
8870
+ query?: never;
8871
+ header?: never;
8872
+ path?: never;
8873
+ cookie?: never;
8874
+ };
8875
+ requestBody?: {
8876
+ content: {
8877
+ "application/json": components["schemas"]["LookupRequest"];
8878
+ };
8879
+ };
8880
+ responses: {
8881
+ /** @description Lookup result */
8882
+ 200: {
8883
+ headers: {
8884
+ [name: string]: unknown;
8885
+ };
8886
+ content: {
8887
+ "application/json": components["schemas"]["LookupEnvelope"];
8888
+ };
8889
+ };
8890
+ /** @description Bad request — validation failed */
8891
+ 400: {
8892
+ headers: {
8893
+ [name: string]: unknown;
8894
+ };
8895
+ content: {
8896
+ "application/json": components["schemas"]["ErrorEnvelope"];
8897
+ };
8898
+ };
8899
+ /** @description Unauthenticated — missing or invalid bearer token */
8900
+ 401: {
8901
+ headers: {
8902
+ [name: string]: unknown;
8903
+ };
8904
+ content: {
8905
+ "application/json": components["schemas"]["ErrorEnvelope"];
8906
+ };
8907
+ };
8908
+ /** @description Too many requests — rate limit exceeded */
8909
+ 429: {
8910
+ headers: {
8911
+ [name: string]: unknown;
8912
+ };
8913
+ content: {
8914
+ "application/json": components["schemas"]["ErrorEnvelope"];
8915
+ };
8916
+ };
8917
+ /** @description Internal server error */
8918
+ 500: {
8919
+ headers: {
8920
+ [name: string]: unknown;
8921
+ };
8922
+ content: {
8923
+ "application/json": components["schemas"]["ErrorEnvelope"];
8924
+ };
8925
+ };
8926
+ };
8927
+ };
8928
+ delete?: never;
8929
+ options?: never;
8930
+ head?: never;
8931
+ patch?: never;
8932
+ trace?: never;
8933
+ };
8934
+ "/v1/area-codes": {
8935
+ parameters: {
8936
+ query?: never;
8937
+ header?: never;
8938
+ path?: never;
8939
+ cookie?: never;
8940
+ };
8941
+ /**
8942
+ * List selectable area codes (public)
8943
+ * @description Enumerate the area codes a customer can request as `preferred_area_codes` on `POST /v1/pre-orders`, for rendering a pre-order area-code picker. Optional `?country=US` filters the list. Also returns the selectable countries so the same response can drive a country dropdown. Unauthenticated — mirrors `GET /v1/lines` and `GET /pricing`. The list is the *selectable* set (a curated subset of NANP), not a guarantee of immediate inventory: pre-orders are precisely for tiers with no in-stock line.
8944
+ */
8945
+ get: {
8946
+ parameters: {
8947
+ query?: {
8948
+ /** @description ISO 3166-1 alpha-2 country filter (case-insensitive). Omit for all countries. */
8949
+ country?: string;
8328
8950
  };
8951
+ header?: never;
8952
+ path?: never;
8329
8953
  cookie?: never;
8330
8954
  };
8331
8955
  requestBody?: never;
8332
8956
  responses: {
8333
- /** @description Attachment record + fresh signed download URL */
8957
+ /** @description Selectable area codes + countries */
8334
8958
  200: {
8335
8959
  headers: {
8336
8960
  [name: string]: unknown;
8337
8961
  };
8338
8962
  content: {
8339
- "application/json": {
8340
- /** @enum {boolean} */
8341
- success: true;
8342
- data: components["schemas"]["Attachment"];
8343
- trace_id: string;
8344
- request_id: string;
8345
- };
8963
+ "application/json": components["schemas"]["AreaCodesEnvelope"];
8346
8964
  };
8347
8965
  };
8348
8966
  /** @description Bad request — validation failed */
@@ -8354,24 +8972,6 @@ export interface paths {
8354
8972
  "application/json": components["schemas"]["ErrorEnvelope"];
8355
8973
  };
8356
8974
  };
8357
- /** @description Unauthenticated — missing or invalid bearer token */
8358
- 401: {
8359
- headers: {
8360
- [name: string]: unknown;
8361
- };
8362
- content: {
8363
- "application/json": components["schemas"]["ErrorEnvelope"];
8364
- };
8365
- };
8366
- /** @description Not found */
8367
- 404: {
8368
- headers: {
8369
- [name: string]: unknown;
8370
- };
8371
- content: {
8372
- "application/json": components["schemas"]["ErrorEnvelope"];
8373
- };
8374
- };
8375
8975
  /** @description Too many requests — rate limit exceeded */
8376
8976
  429: {
8377
8977
  headers: {
@@ -8400,39 +9000,39 @@ export interface paths {
8400
9000
  patch?: never;
8401
9001
  trace?: never;
8402
9002
  };
8403
- "/v1/lookup": {
9003
+ "/v1/chats": {
8404
9004
  parameters: {
8405
9005
  query?: never;
8406
9006
  header?: never;
8407
9007
  path?: never;
8408
9008
  cookie?: never;
8409
9009
  };
8410
- get?: never;
8411
- put?: never;
8412
9010
  /**
8413
- * Look up a recipient capability
8414
- * @description Check whether a phone number or email is iMessage-capable. Returns `imessage: true | false | null`; `null` means we have no cached probe result yet and the caller should fall back to SMS-safe behaviour. Rate-limited per line and per account.
9011
+ * List chats
9012
+ * @description Cursor-paginated list of the caller's conversations, newest activity first. Filter by `line_id`. On shared-plan (virtual) lines each chat carries `outbound_number` the physical number currently serving that contact (null once the binding is released; the next outbound is assigned a fresh number). Non-shared lines always carry `outbound_number: null`. Accepts an API key (`isnap_*`) or a dashboard JWT; line-scoped API keys only see chats of the lines in their allowlist.
8415
9013
  */
8416
- post: {
9014
+ get: {
8417
9015
  parameters: {
8418
- query?: never;
9016
+ query?: {
9017
+ line_id?: string;
9018
+ limit?: number;
9019
+ cursor?: string;
9020
+ since?: string;
9021
+ until?: string;
9022
+ };
8419
9023
  header?: never;
8420
9024
  path?: never;
8421
9025
  cookie?: never;
8422
9026
  };
8423
- requestBody?: {
8424
- content: {
8425
- "application/json": components["schemas"]["LookupRequest"];
8426
- };
8427
- };
9027
+ requestBody?: never;
8428
9028
  responses: {
8429
- /** @description Lookup result */
9029
+ /** @description Chat list */
8430
9030
  200: {
8431
9031
  headers: {
8432
9032
  [name: string]: unknown;
8433
9033
  };
8434
9034
  content: {
8435
- "application/json": components["schemas"]["LookupEnvelope"];
9035
+ "application/json": components["schemas"]["ChatListEnvelope"];
8436
9036
  };
8437
9037
  };
8438
9038
  /** @description Bad request — validation failed */
@@ -8473,13 +9073,15 @@ export interface paths {
8473
9073
  };
8474
9074
  };
8475
9075
  };
9076
+ put?: never;
9077
+ post?: never;
8476
9078
  delete?: never;
8477
9079
  options?: never;
8478
9080
  head?: never;
8479
9081
  patch?: never;
8480
9082
  trace?: never;
8481
9083
  };
8482
- "/v1/area-codes": {
9084
+ "/v1/chats/{chat_id}": {
8483
9085
  parameters: {
8484
9086
  query?: never;
8485
9087
  header?: never;
@@ -8487,28 +9089,27 @@ export interface paths {
8487
9089
  cookie?: never;
8488
9090
  };
8489
9091
  /**
8490
- * List selectable area codes (public)
8491
- * @description Enumerate the area codes a customer can request as `preferred_area_codes` on `POST /v1/pre-orders`, for rendering a pre-order area-code picker. Optional `?country=US` filters the list. Also returns the selectable countries so the same response can drive a country dropdown. Unauthenticated — mirrors `GET /v1/lines` and `GET /pricing`. The list is the *selectable* set (a curated subset of NANP), not a guarantee of immediate inventory: pre-orders are precisely for tiers with no in-stock line.
9092
+ * Get a chat
9093
+ * @description Fetch a single conversation by its `chat_<base62>` id. Same shape as the list items, including `outbound_number` for shared-plan lines. Cross-account and out-of-scope ids resolve 404 (no existence leak).
8492
9094
  */
8493
9095
  get: {
8494
9096
  parameters: {
8495
- query?: {
8496
- /** @description ISO 3166-1 alpha-2 country filter (case-insensitive). Omit for all countries. */
8497
- country?: string;
8498
- };
9097
+ query?: never;
8499
9098
  header?: never;
8500
- path?: never;
9099
+ path: {
9100
+ chat_id: string;
9101
+ };
8501
9102
  cookie?: never;
8502
9103
  };
8503
9104
  requestBody?: never;
8504
9105
  responses: {
8505
- /** @description Selectable area codes + countries */
9106
+ /** @description Chat */
8506
9107
  200: {
8507
9108
  headers: {
8508
9109
  [name: string]: unknown;
8509
9110
  };
8510
9111
  content: {
8511
- "application/json": components["schemas"]["AreaCodesEnvelope"];
9112
+ "application/json": components["schemas"]["ChatEnvelope"];
8512
9113
  };
8513
9114
  };
8514
9115
  /** @description Bad request — validation failed */
@@ -8520,6 +9121,24 @@ export interface paths {
8520
9121
  "application/json": components["schemas"]["ErrorEnvelope"];
8521
9122
  };
8522
9123
  };
9124
+ /** @description Unauthenticated — missing or invalid bearer token */
9125
+ 401: {
9126
+ headers: {
9127
+ [name: string]: unknown;
9128
+ };
9129
+ content: {
9130
+ "application/json": components["schemas"]["ErrorEnvelope"];
9131
+ };
9132
+ };
9133
+ /** @description Not found */
9134
+ 404: {
9135
+ headers: {
9136
+ [name: string]: unknown;
9137
+ };
9138
+ content: {
9139
+ "application/json": components["schemas"]["ErrorEnvelope"];
9140
+ };
9141
+ };
8523
9142
  /** @description Too many requests — rate limit exceeded */
8524
9143
  429: {
8525
9144
  headers: {
@@ -8946,7 +9565,7 @@ export interface paths {
8946
9565
  put?: never;
8947
9566
  /**
8948
9567
  * Start a trial session
8949
- * @description Create a pairing-pending trial session against the caller's API key. Returns a one-time pairing token the partner embeds in their onboarding UI; the recipient claims it by sending an inbound message that links them to a shared-pool line.
9568
+ * @description Create a pairing-pending trial session owned by the caller (dashboard JWT for direct self-serve, or an API key for wholesale/SDK). Returns a one-time pairing token the partner embeds in their onboarding UI; the recipient claims it by sending an inbound message that links them to a pool line. Direct accounts may hold only one live trial at a time.
8950
9569
  */
8951
9570
  post: {
8952
9571
  parameters: {
@@ -8988,6 +9607,15 @@ export interface paths {
8988
9607
  "application/json": components["schemas"]["ErrorEnvelope"];
8989
9608
  };
8990
9609
  };
9610
+ /** @description Conflict — concurrent or terminal state */
9611
+ 409: {
9612
+ headers: {
9613
+ [name: string]: unknown;
9614
+ };
9615
+ content: {
9616
+ "application/json": components["schemas"]["ErrorEnvelope"];
9617
+ };
9618
+ };
8991
9619
  /** @description Too many requests — rate limit exceeded */
8992
9620
  429: {
8993
9621
  headers: {
@@ -10197,45 +10825,6 @@ export interface components {
10197
10825
  LineWatchList: {
10198
10826
  watches: components["schemas"]["LineWatch"][];
10199
10827
  };
10200
- DemoStart: {
10201
- /** Format: uuid */
10202
- session_id: string;
10203
- line: {
10204
- /** Format: uuid */
10205
- id: string;
10206
- phone_number: string;
10207
- billing_tier: string;
10208
- };
10209
- api_key: string | null;
10210
- };
10211
- DemoSendTest: {
10212
- success: boolean;
10213
- /** Format: uuid */
10214
- message_id: string;
10215
- };
10216
- DemoSession: {
10217
- /** Format: uuid */
10218
- session_id: string;
10219
- line: {
10220
- /** Format: uuid */
10221
- id: string;
10222
- phone_number: string;
10223
- billing_tier: string;
10224
- };
10225
- messages_sent: number;
10226
- daily_limit: number;
10227
- test_number: string | null;
10228
- completed: boolean;
10229
- expires_at: string | null;
10230
- created_at: string;
10231
- has_api_key: boolean;
10232
- };
10233
- DemoApiKey: {
10234
- key: string;
10235
- /** Format: uuid */
10236
- id: string;
10237
- prefix: string;
10238
- };
10239
10828
  MessageVolume: {
10240
10829
  dates: string[];
10241
10830
  counts: number[];
@@ -10676,6 +11265,10 @@ export interface components {
10676
11265
  /** @enum {string} */
10677
11266
  ownership: "pool";
10678
11267
  /** @enum {string} */
11268
+ pool_purpose: "trial" | "shared";
11269
+ /** Format: uuid */
11270
+ owner_user_id: string | null;
11271
+ /** @enum {string} */
10679
11272
  platform: "imessage";
10680
11273
  status: string;
10681
11274
  monthly_price: number;
@@ -10688,10 +11281,53 @@ export interface components {
10688
11281
  CreatePoolLineBody: {
10689
11282
  /** Format: uuid */
10690
11283
  line_id?: string;
11284
+ /**
11285
+ * @default trial
11286
+ * @enum {string}
11287
+ */
11288
+ purpose: "trial" | "shared";
11289
+ /** Format: uuid */
11290
+ owner_user_id?: string;
10691
11291
  phone_number?: string;
10692
11292
  area_code?: string;
10693
11293
  country_code?: string;
10694
11294
  };
11295
+ Line: {
11296
+ id: string;
11297
+ phone_number: string;
11298
+ area_code: string | null;
11299
+ country_code: string | null;
11300
+ state: string | null;
11301
+ state_name: string | null;
11302
+ /** @enum {string} */
11303
+ billing_tier: "rental_iphone" | "rental_android" | "byod_imessage" | "byod_android" | "shared_pool" | "shared_imessage";
11304
+ /** @description True when the customer owns the underlying hardware (BYOD billing tiers). BYOD lines expose the full line-health surface (offline/degraded events, GET /v1/lines/{id}/health). Rental lines (false) only emit durable, actionable events to keep customers out of transient infrastructure noise they cannot act on. */
11305
+ byod: boolean;
11306
+ /** @description True when the line is inbound-only: it may only message a handle that has messaged it first (a recipient who has never contacted the line is rejected with 403 outbound_first_forbidden). Inbound-only is a cheaper rental-tier variant (Bloo parity); always false on BYOD/pool lines. */
11307
+ inbound_only: boolean;
11308
+ capabilities?: unknown;
11309
+ status: string;
11310
+ monthly_price: number;
11311
+ stripe_subscription_id: string | null;
11312
+ activated_at: string | null;
11313
+ expires_at: string | null;
11314
+ created_at: string;
11315
+ metadata: {
11316
+ [key: string]: unknown;
11317
+ } | null;
11318
+ /** @description True when the line is an owner-provisioned test line (ownership=pool with a set owner) that backs the owner's own trial pool. Its monthly_price is the rental-equivalent, not the $0 global pool rate. */
11319
+ test_line: boolean;
11320
+ /** @description True when the line is a virtual shared-plan line (billing_tier shared_imessage): customer-owned, no dedicated hardware, phone_number empty — sends are proxied onto the shared physical iMessage fleet. Line-scoped API keys, webhooks and per-line quota apply to it like any other line. */
11321
+ shared: boolean;
11322
+ fulfillment_status?: string | null;
11323
+ };
11324
+ AdminMintSharedLineBody: {
11325
+ metadata?: {
11326
+ [key: string]: unknown;
11327
+ };
11328
+ /** Format: uuid */
11329
+ user_id: string;
11330
+ };
10695
11331
  PoolLinesMonitor: {
10696
11332
  summary: {
10697
11333
  total_lines: number;
@@ -10700,14 +11336,20 @@ export interface components {
10700
11336
  active_trials: number;
10701
11337
  dormant_trials: number;
10702
11338
  pairing_pending_trials: number;
11339
+ active_bindings: number;
10703
11340
  };
10704
11341
  lines: components["schemas"]["PoolLineMonitorItem"][];
11342
+ overcommit: components["schemas"]["PoolOvercommitScope"][];
10705
11343
  };
10706
11344
  PoolLineMonitorItem: {
10707
11345
  /** Format: uuid */
10708
11346
  id: string;
10709
11347
  public_id: string;
10710
11348
  phone_number: string | null;
11349
+ /** @enum {string} */
11350
+ purpose: "trial" | "shared";
11351
+ /** Format: uuid */
11352
+ owner_user_id: string | null;
10711
11353
  status: string;
10712
11354
  health_state: string;
10713
11355
  /** Format: uuid */
@@ -10716,9 +11358,36 @@ export interface components {
10716
11358
  active_trials: number;
10717
11359
  dormant_trials: number;
10718
11360
  pairing_pending_trials: number;
11361
+ active_bindings: number;
11362
+ daily_new_used: number;
11363
+ daily_new_limit: number;
11364
+ daily_new_headroom: number;
11365
+ last_activity_at: string | null;
10719
11366
  messages_24h: number;
10720
11367
  created_at: string;
10721
11368
  };
11369
+ PoolOvercommitScope: {
11370
+ /** @enum {string} */
11371
+ scope: "global" | "partner";
11372
+ /** Format: uuid */
11373
+ owner_user_id: string | null;
11374
+ active_virtual_lines: number;
11375
+ physical_lines: number;
11376
+ ratio: number | null;
11377
+ };
11378
+ DemotePoolLine: {
11379
+ /** Format: uuid */
11380
+ id: string;
11381
+ public_id: string;
11382
+ /** @enum {string} */
11383
+ ownership: "rental";
11384
+ pool_purpose: unknown;
11385
+ status: string;
11386
+ monthly_price: number;
11387
+ /** Format: uuid */
11388
+ owner_user_id: string | null;
11389
+ updated_at: string;
11390
+ };
10722
11391
  ActivationCodeStatus: {
10723
11392
  consumed: boolean;
10724
11393
  consumedAt: string | null;
@@ -10867,9 +11536,6 @@ export interface components {
10867
11536
  devices: {
10868
11537
  available: number;
10869
11538
  ordered: number;
10870
- shipped: number;
10871
- received: number;
10872
- ready: number;
10873
11539
  total: number;
10874
11540
  };
10875
11541
  esims: {
@@ -10886,6 +11552,51 @@ export interface components {
10886
11552
  pendingAssembly: number;
10887
11553
  pendingTasks: number;
10888
11554
  };
11555
+ VAPerformance: {
11556
+ throughput: {
11557
+ today: number;
11558
+ week: number;
11559
+ total: number;
11560
+ };
11561
+ speed: {
11562
+ avgCompletionMins: number;
11563
+ onTimeRate: number;
11564
+ };
11565
+ backlog: {
11566
+ open: number;
11567
+ overdue: number;
11568
+ };
11569
+ };
11570
+ VAMacMinis: {
11571
+ macMinis: components["schemas"]["VAMacMini"][];
11572
+ };
11573
+ VAMacMini: {
11574
+ /** Format: uuid */
11575
+ id: string;
11576
+ name: string;
11577
+ hostname: string | null;
11578
+ status: string;
11579
+ capacity: number;
11580
+ sessionCount: number;
11581
+ };
11582
+ VANextMacMini: {
11583
+ /** Format: uuid */
11584
+ macMiniId: string | null;
11585
+ hostname: string | null;
11586
+ /** @enum {string} */
11587
+ status: "available" | "pending_provisioning";
11588
+ };
11589
+ VAMacosSession: {
11590
+ /** Format: uuid */
11591
+ sessionId: string;
11592
+ /** Format: uuid */
11593
+ macMiniId: string;
11594
+ macMiniName: string;
11595
+ macMiniHostname: string | null;
11596
+ /** @enum {string} */
11597
+ status: "created" | "pending_provisioning";
11598
+ ordered: boolean;
11599
+ };
10889
11600
  VADevice: {
10890
11601
  /** Format: uuid */
10891
11602
  id: string;
@@ -10896,6 +11607,8 @@ export interface components {
10896
11607
  /** Format: uuid */
10897
11608
  farmId: string | null;
10898
11609
  farmName: string | null;
11610
+ unitCostCents?: number | null;
11611
+ invoiceUrl?: string | null;
10899
11612
  createdAt: string;
10900
11613
  taskCompleted?: boolean;
10901
11614
  };
@@ -10903,6 +11616,15 @@ export interface components {
10903
11616
  devices: components["schemas"]["VADevice"][];
10904
11617
  total: number;
10905
11618
  };
11619
+ VADeviceModels: {
11620
+ models: {
11621
+ /** Format: uuid */
11622
+ id: string;
11623
+ name: string;
11624
+ /** @enum {string} */
11625
+ platform: "iphone" | "android";
11626
+ }[];
11627
+ };
10906
11628
  VAEsim: {
10907
11629
  /** Format: uuid */
10908
11630
  id: string;
@@ -10943,6 +11665,8 @@ export interface components {
10943
11665
  /** Format: uuid */
10944
11666
  assigneeId: string | null;
10945
11667
  /** Format: uuid */
11668
+ completedBy: string | null;
11669
+ /** Format: uuid */
10946
11670
  deviceId: string | null;
10947
11671
  /** Format: uuid */
10948
11672
  esimId: string | null;
@@ -11038,31 +11762,6 @@ export interface components {
11038
11762
  page: number;
11039
11763
  limit: number;
11040
11764
  };
11041
- Line: {
11042
- id: string;
11043
- phone_number: string;
11044
- area_code: string | null;
11045
- country_code: string | null;
11046
- state: string | null;
11047
- state_name: string | null;
11048
- /** @enum {string} */
11049
- billing_tier: "rental_iphone" | "rental_android" | "byod_imessage" | "byod_android" | "shared_pool";
11050
- /** @description True when the customer owns the underlying hardware (BYOD billing tiers). BYOD lines expose the full line-health surface (offline/degraded events, GET /v1/lines/{id}/health). Rental lines (false) only emit durable, actionable events to keep customers out of transient infrastructure noise they cannot act on. */
11051
- byod: boolean;
11052
- /** @description True when the line is inbound-only: it may only message a handle that has messaged it first (a recipient who has never contacted the line is rejected with 403 outbound_first_forbidden). Inbound-only is a cheaper rental-tier variant (Bloo parity); always false on BYOD/pool lines. */
11053
- inbound_only: boolean;
11054
- capabilities?: unknown;
11055
- status: string;
11056
- monthly_price: number;
11057
- stripe_subscription_id: string | null;
11058
- activated_at: string | null;
11059
- expires_at: string | null;
11060
- created_at: string;
11061
- metadata: {
11062
- [key: string]: unknown;
11063
- } | null;
11064
- fulfillment_status?: string | null;
11065
- };
11066
11765
  MyLines: {
11067
11766
  lines: components["schemas"]["Line"][];
11068
11767
  };
@@ -11071,6 +11770,12 @@ export interface components {
11071
11770
  billing_tier: "rental_iphone" | "rental_android" | "byod_imessage" | "byod_android";
11072
11771
  area_code?: string;
11073
11772
  inbound_only?: boolean;
11773
+ as_test_line?: boolean;
11774
+ metadata?: {
11775
+ [key: string]: unknown;
11776
+ };
11777
+ };
11778
+ MintSharedLine: {
11074
11779
  metadata?: {
11075
11780
  [key: string]: unknown;
11076
11781
  };
@@ -11489,7 +12194,7 @@ export interface components {
11489
12194
  * @description A concrete event type (e.g. `message.received`), a family wildcard (`line.*`), or the catch-all `*`.
11490
12195
  * @enum {string}
11491
12196
  */
11492
- WebhookEventName: "message.queued" | "message.sent" | "message.delivered" | "message.read" | "message.failed" | "message.received" | "message.scheduled" | "message.cancelled" | "message.fallback_triggered" | "reaction.added" | "reaction.received" | "reaction.removed" | "line.connected" | "line.disconnected" | "line.offline" | "line.degraded" | "line.apple_id_flagged" | "line.quota_warning" | "line.quota_exceeded" | "line.capability_changed" | "typing_indicator.started" | "typing_indicator.stopped" | "trial.linked" | "trial.dormant" | "trial.reactivated" | "pre_order.fulfilled" | "pre_order.cancelled" | "pre_order.refunded" | "webhook.test" | "*" | "message.*" | "reaction.*" | "line.*" | "typing_indicator.*" | "trial.*" | "webhook.*";
12197
+ WebhookEventName: "message.queued" | "message.sent" | "message.delivered" | "message.read" | "message.failed" | "message.received" | "message.scheduled" | "message.cancelled" | "message.fallback_triggered" | "reaction.added" | "reaction.received" | "reaction.removed" | "line.connected" | "line.disconnected" | "line.offline" | "line.degraded" | "line.apple_id_flagged" | "line.quota_warning" | "line.quota_exceeded" | "line.capability_changed" | "typing_indicator.started" | "typing_indicator.stopped" | "trial.linked" | "trial.dormant" | "trial.reactivated" | "trial.bind_conflict" | "binding.released" | "pre_order.fulfilled" | "pre_order.cancelled" | "pre_order.refunded" | "webhook.test" | "*" | "message.*" | "reaction.*" | "line.*" | "typing_indicator.*" | "trial.*" | "binding.*" | "webhook.*";
11493
12198
  WebhookList: {
11494
12199
  webhooks: components["schemas"]["Webhook"][];
11495
12200
  };
@@ -11662,6 +12367,38 @@ export interface components {
11662
12367
  /** @example 1 */
11663
12368
  calling_code: string;
11664
12369
  };
12370
+ ChatListEnvelope: {
12371
+ /** @enum {boolean} */
12372
+ success: true;
12373
+ data: components["schemas"]["ChatList"];
12374
+ trace_id: string;
12375
+ request_id: string;
12376
+ };
12377
+ ChatList: {
12378
+ items: components["schemas"]["Chat"][];
12379
+ has_more: boolean;
12380
+ next_cursor: string | null;
12381
+ };
12382
+ Chat: {
12383
+ /** @example chat_5h7FqK2mNpQ8rT3vW9xY1zA4b */
12384
+ id: string;
12385
+ line_id: string;
12386
+ contact_handle: string;
12387
+ /** @description Shared-plan lines only: the physical number currently serving this contact (the active binding). Null when no binding is active — e.g. after inactivity release, in which case the next outbound is assigned a fresh number — and always null on non-shared lines. */
12388
+ outbound_number: string | null;
12389
+ last_message_at: string;
12390
+ message_count: number;
12391
+ unread_count: number;
12392
+ created_at: string;
12393
+ updated_at: string;
12394
+ };
12395
+ ChatEnvelope: {
12396
+ /** @enum {boolean} */
12397
+ success: true;
12398
+ data: components["schemas"]["Chat"];
12399
+ trace_id: string;
12400
+ request_id: string;
12401
+ };
11665
12402
  ShareContactCardEnvelope: {
11666
12403
  /** @enum {boolean} */
11667
12404
  success: true;