@noirstack/ledgerbill-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2294 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ */
5
+ export interface paths {
6
+ "/api/health": {
7
+ parameters: {
8
+ query?: never;
9
+ header?: never;
10
+ path?: never;
11
+ cookie?: never;
12
+ };
13
+ /** Health check */
14
+ get: {
15
+ parameters: {
16
+ query?: never;
17
+ header?: never;
18
+ path?: never;
19
+ cookie?: never;
20
+ };
21
+ requestBody?: never;
22
+ responses: {
23
+ /** @description Service healthy */
24
+ 200: {
25
+ headers: {
26
+ [name: string]: unknown;
27
+ };
28
+ content: {
29
+ "application/json": components["schemas"]["HealthResponse"];
30
+ };
31
+ };
32
+ };
33
+ };
34
+ put?: never;
35
+ post?: never;
36
+ delete?: never;
37
+ options?: never;
38
+ head?: never;
39
+ patch?: never;
40
+ trace?: never;
41
+ };
42
+ "/api/openapi.json": {
43
+ parameters: {
44
+ query?: never;
45
+ header?: never;
46
+ path?: never;
47
+ cookie?: never;
48
+ };
49
+ /** OpenAPI contract endpoint */
50
+ get: {
51
+ parameters: {
52
+ query?: never;
53
+ header?: never;
54
+ path?: never;
55
+ cookie?: never;
56
+ };
57
+ requestBody?: never;
58
+ responses: {
59
+ /** @description OpenAPI 3.1 document */
60
+ 200: {
61
+ headers: {
62
+ [name: string]: unknown;
63
+ };
64
+ content?: never;
65
+ };
66
+ };
67
+ };
68
+ put?: never;
69
+ post?: never;
70
+ delete?: never;
71
+ options?: never;
72
+ head?: never;
73
+ patch?: never;
74
+ trace?: never;
75
+ };
76
+ "/api/docs": {
77
+ parameters: {
78
+ query?: never;
79
+ header?: never;
80
+ path?: never;
81
+ cookie?: never;
82
+ };
83
+ /** Interactive API documentation (Redoc) */
84
+ get: {
85
+ parameters: {
86
+ query?: never;
87
+ header?: never;
88
+ path?: never;
89
+ cookie?: never;
90
+ };
91
+ requestBody?: never;
92
+ responses: {
93
+ /** @description HTML Redoc page */
94
+ 200: {
95
+ headers: {
96
+ [name: string]: unknown;
97
+ };
98
+ content?: never;
99
+ };
100
+ };
101
+ };
102
+ put?: never;
103
+ post?: never;
104
+ delete?: never;
105
+ options?: never;
106
+ head?: never;
107
+ patch?: never;
108
+ trace?: never;
109
+ };
110
+ "/api/telemetry/status": {
111
+ parameters: {
112
+ query?: never;
113
+ header?: never;
114
+ path?: never;
115
+ cookie?: never;
116
+ };
117
+ /** Telemetry runtime status */
118
+ get: {
119
+ parameters: {
120
+ query?: never;
121
+ header?: never;
122
+ path?: never;
123
+ cookie?: never;
124
+ };
125
+ requestBody?: never;
126
+ responses: {
127
+ /** @description OpenTelemetry + Prometheus runtime status */
128
+ 200: {
129
+ headers: {
130
+ [name: string]: unknown;
131
+ };
132
+ content?: never;
133
+ };
134
+ };
135
+ };
136
+ put?: never;
137
+ post?: never;
138
+ delete?: never;
139
+ options?: never;
140
+ head?: never;
141
+ patch?: never;
142
+ trace?: never;
143
+ };
144
+ "/api/auth/standards": {
145
+ parameters: {
146
+ query?: never;
147
+ header?: never;
148
+ path?: never;
149
+ cookie?: never;
150
+ };
151
+ /** Returns active security standards/policy profile */
152
+ get: {
153
+ parameters: {
154
+ query?: never;
155
+ header?: never;
156
+ path?: never;
157
+ cookie?: never;
158
+ };
159
+ requestBody?: never;
160
+ responses: {
161
+ /** @description Standards and policy posture */
162
+ 200: {
163
+ headers: {
164
+ [name: string]: unknown;
165
+ };
166
+ content?: never;
167
+ };
168
+ };
169
+ };
170
+ put?: never;
171
+ post?: never;
172
+ delete?: never;
173
+ options?: never;
174
+ head?: never;
175
+ patch?: never;
176
+ trace?: never;
177
+ };
178
+ "/.well-known/jwks.json": {
179
+ parameters: {
180
+ query?: never;
181
+ header?: never;
182
+ path?: never;
183
+ cookie?: never;
184
+ };
185
+ /** JSON Web Key Set (JWKS) */
186
+ get: {
187
+ parameters: {
188
+ query?: never;
189
+ header?: never;
190
+ path?: never;
191
+ cookie?: never;
192
+ };
193
+ requestBody?: never;
194
+ responses: {
195
+ /** @description Public verification keys */
196
+ 200: {
197
+ headers: {
198
+ [name: string]: unknown;
199
+ };
200
+ content: {
201
+ "application/json": {
202
+ keys: Record<string, never>[];
203
+ };
204
+ };
205
+ };
206
+ };
207
+ };
208
+ put?: never;
209
+ post?: never;
210
+ delete?: never;
211
+ options?: never;
212
+ head?: never;
213
+ patch?: never;
214
+ trace?: never;
215
+ };
216
+ "/api/auth/register": {
217
+ parameters: {
218
+ query?: never;
219
+ header?: never;
220
+ path?: never;
221
+ cookie?: never;
222
+ };
223
+ get?: never;
224
+ put?: never;
225
+ /** Register user account */
226
+ post: {
227
+ parameters: {
228
+ query?: never;
229
+ header?: never;
230
+ path?: never;
231
+ cookie?: never;
232
+ };
233
+ requestBody: {
234
+ content: {
235
+ "application/json": components["schemas"]["RegisterRequest"];
236
+ };
237
+ };
238
+ responses: {
239
+ /** @description User created */
240
+ 201: {
241
+ headers: {
242
+ [name: string]: unknown;
243
+ };
244
+ content?: never;
245
+ };
246
+ /** @description Validation error */
247
+ 400: {
248
+ headers: {
249
+ [name: string]: unknown;
250
+ };
251
+ content: {
252
+ "application/json": components["schemas"]["ErrorResponse"];
253
+ };
254
+ };
255
+ };
256
+ };
257
+ delete?: never;
258
+ options?: never;
259
+ head?: never;
260
+ patch?: never;
261
+ trace?: never;
262
+ };
263
+ "/api/auth/login": {
264
+ parameters: {
265
+ query?: never;
266
+ header?: never;
267
+ path?: never;
268
+ cookie?: never;
269
+ };
270
+ get?: never;
271
+ put?: never;
272
+ /** Login user */
273
+ post: {
274
+ parameters: {
275
+ query?: never;
276
+ header?: never;
277
+ path?: never;
278
+ cookie?: never;
279
+ };
280
+ requestBody: {
281
+ content: {
282
+ "application/json": components["schemas"]["LoginRequest"];
283
+ };
284
+ };
285
+ responses: {
286
+ /** @description Authenticated */
287
+ 200: {
288
+ headers: {
289
+ [name: string]: unknown;
290
+ };
291
+ content?: never;
292
+ };
293
+ /** @description Invalid credentials */
294
+ 401: {
295
+ headers: {
296
+ [name: string]: unknown;
297
+ };
298
+ content?: never;
299
+ };
300
+ };
301
+ };
302
+ delete?: never;
303
+ options?: never;
304
+ head?: never;
305
+ patch?: never;
306
+ trace?: never;
307
+ };
308
+ "/api/auth/keycloak/login": {
309
+ parameters: {
310
+ query?: never;
311
+ header?: never;
312
+ path?: never;
313
+ cookie?: never;
314
+ };
315
+ /** Start Keycloak authorization code flow */
316
+ get: {
317
+ parameters: {
318
+ query?: never;
319
+ header?: never;
320
+ path?: never;
321
+ cookie?: never;
322
+ };
323
+ requestBody?: never;
324
+ responses: {
325
+ /** @description Redirects to Keycloak login */
326
+ 302: {
327
+ headers: {
328
+ [name: string]: unknown;
329
+ };
330
+ content?: never;
331
+ };
332
+ /** @description Keycloak not configured */
333
+ 503: {
334
+ headers: {
335
+ [name: string]: unknown;
336
+ };
337
+ content?: never;
338
+ };
339
+ };
340
+ };
341
+ put?: never;
342
+ post?: never;
343
+ delete?: never;
344
+ options?: never;
345
+ head?: never;
346
+ patch?: never;
347
+ trace?: never;
348
+ };
349
+ "/api/auth/keycloak/callback": {
350
+ parameters: {
351
+ query?: never;
352
+ header?: never;
353
+ path?: never;
354
+ cookie?: never;
355
+ };
356
+ /** Handle Keycloak callback and establish LedgerBill session */
357
+ get: {
358
+ parameters: {
359
+ query?: {
360
+ code?: string;
361
+ state?: string;
362
+ };
363
+ header?: never;
364
+ path?: never;
365
+ cookie?: never;
366
+ };
367
+ requestBody?: never;
368
+ responses: {
369
+ /** @description Session established; redirected to frontend */
370
+ 302: {
371
+ headers: {
372
+ [name: string]: unknown;
373
+ };
374
+ content?: never;
375
+ };
376
+ /** @description Invalid callback state */
377
+ 400: {
378
+ headers: {
379
+ [name: string]: unknown;
380
+ };
381
+ content?: never;
382
+ };
383
+ /** @description Keycloak token exchange failed */
384
+ 502: {
385
+ headers: {
386
+ [name: string]: unknown;
387
+ };
388
+ content?: never;
389
+ };
390
+ /** @description Callback processing failed or not configured */
391
+ 503: {
392
+ headers: {
393
+ [name: string]: unknown;
394
+ };
395
+ content?: never;
396
+ };
397
+ };
398
+ };
399
+ put?: never;
400
+ post?: never;
401
+ delete?: never;
402
+ options?: never;
403
+ head?: never;
404
+ patch?: never;
405
+ trace?: never;
406
+ };
407
+ "/api/auth/keycloak/logout": {
408
+ parameters: {
409
+ query?: never;
410
+ header?: never;
411
+ path?: never;
412
+ cookie?: never;
413
+ };
414
+ /** Logout LedgerBill session and redirect through Keycloak logout */
415
+ get: {
416
+ parameters: {
417
+ query?: never;
418
+ header?: never;
419
+ path?: never;
420
+ cookie?: never;
421
+ };
422
+ requestBody?: never;
423
+ responses: {
424
+ /** @description Redirect to post-logout destination */
425
+ 302: {
426
+ headers: {
427
+ [name: string]: unknown;
428
+ };
429
+ content?: never;
430
+ };
431
+ };
432
+ };
433
+ put?: never;
434
+ post?: never;
435
+ delete?: never;
436
+ options?: never;
437
+ head?: never;
438
+ patch?: never;
439
+ trace?: never;
440
+ };
441
+ "/api/auth/logout": {
442
+ parameters: {
443
+ query?: never;
444
+ header?: never;
445
+ path?: never;
446
+ cookie?: never;
447
+ };
448
+ get?: never;
449
+ put?: never;
450
+ /** Logout user */
451
+ post: {
452
+ parameters: {
453
+ query?: never;
454
+ header?: never;
455
+ path?: never;
456
+ cookie?: never;
457
+ };
458
+ requestBody?: never;
459
+ responses: {
460
+ /** @description Logged out */
461
+ 200: {
462
+ headers: {
463
+ [name: string]: unknown;
464
+ };
465
+ content?: never;
466
+ };
467
+ };
468
+ };
469
+ delete?: never;
470
+ options?: never;
471
+ head?: never;
472
+ patch?: never;
473
+ trace?: never;
474
+ };
475
+ "/api/auth/me": {
476
+ parameters: {
477
+ query?: never;
478
+ header?: never;
479
+ path?: never;
480
+ cookie?: never;
481
+ };
482
+ /** Get current authenticated user */
483
+ get: {
484
+ parameters: {
485
+ query?: never;
486
+ header?: never;
487
+ path?: never;
488
+ cookie?: never;
489
+ };
490
+ requestBody?: never;
491
+ responses: {
492
+ /** @description User details */
493
+ 200: {
494
+ headers: {
495
+ [name: string]: unknown;
496
+ };
497
+ content?: never;
498
+ };
499
+ /** @description Authentication required */
500
+ 401: {
501
+ headers: {
502
+ [name: string]: unknown;
503
+ };
504
+ content?: never;
505
+ };
506
+ };
507
+ };
508
+ put?: never;
509
+ post?: never;
510
+ delete?: never;
511
+ options?: never;
512
+ head?: never;
513
+ patch?: never;
514
+ trace?: never;
515
+ };
516
+ "/api/tenants": {
517
+ parameters: {
518
+ query?: never;
519
+ header?: never;
520
+ path?: never;
521
+ cookie?: never;
522
+ };
523
+ get?: never;
524
+ put?: never;
525
+ /** Create tenant */
526
+ post: {
527
+ parameters: {
528
+ query?: never;
529
+ header?: never;
530
+ path?: never;
531
+ cookie?: never;
532
+ };
533
+ requestBody: {
534
+ content: {
535
+ "application/json": components["schemas"]["TenantCreateRequest"];
536
+ };
537
+ };
538
+ responses: {
539
+ /** @description Tenant created */
540
+ 201: {
541
+ headers: {
542
+ [name: string]: unknown;
543
+ };
544
+ content?: never;
545
+ };
546
+ };
547
+ };
548
+ delete?: never;
549
+ options?: never;
550
+ head?: never;
551
+ patch?: never;
552
+ trace?: never;
553
+ };
554
+ "/api/tenants/{id}": {
555
+ parameters: {
556
+ query?: never;
557
+ header?: never;
558
+ path?: never;
559
+ cookie?: never;
560
+ };
561
+ /** Get tenant by id */
562
+ get: {
563
+ parameters: {
564
+ query?: never;
565
+ header?: never;
566
+ path: {
567
+ id: string;
568
+ };
569
+ cookie?: never;
570
+ };
571
+ requestBody?: never;
572
+ responses: {
573
+ /** @description Tenant details */
574
+ 200: {
575
+ headers: {
576
+ [name: string]: unknown;
577
+ };
578
+ content?: never;
579
+ };
580
+ /** @description Access denied */
581
+ 403: {
582
+ headers: {
583
+ [name: string]: unknown;
584
+ };
585
+ content?: never;
586
+ };
587
+ /** @description Not found */
588
+ 404: {
589
+ headers: {
590
+ [name: string]: unknown;
591
+ };
592
+ content?: never;
593
+ };
594
+ };
595
+ };
596
+ put?: never;
597
+ post?: never;
598
+ delete?: never;
599
+ options?: never;
600
+ head?: never;
601
+ patch?: never;
602
+ trace?: never;
603
+ };
604
+ "/api/subscriptions/checkout": {
605
+ parameters: {
606
+ query?: never;
607
+ header?: never;
608
+ path?: never;
609
+ cookie?: never;
610
+ };
611
+ get?: never;
612
+ put?: never;
613
+ /** Create Stripe checkout session */
614
+ post: {
615
+ parameters: {
616
+ query?: never;
617
+ header: {
618
+ /** @description IETF idempotency key for safe retries on POST requests. */
619
+ "Idempotency-Key": components["parameters"]["IdempotencyKey"];
620
+ };
621
+ path?: never;
622
+ cookie?: never;
623
+ };
624
+ requestBody: {
625
+ content: {
626
+ "application/json": components["schemas"]["CheckoutRequest"];
627
+ };
628
+ };
629
+ responses: {
630
+ /** @description Checkout session url */
631
+ 200: {
632
+ headers: {
633
+ IdempotencyReplayed: components["headers"]["IdempotencyReplayed"];
634
+ [name: string]: unknown;
635
+ };
636
+ content: {
637
+ "application/json": components["schemas"]["CheckoutResponse"];
638
+ };
639
+ };
640
+ /** @description Rate limited */
641
+ 429: {
642
+ headers: {
643
+ RateLimitLimit: components["headers"]["RateLimitLimit"];
644
+ RateLimitRemaining: components["headers"]["RateLimitRemaining"];
645
+ RateLimitReset: components["headers"]["RateLimitReset"];
646
+ [name: string]: unknown;
647
+ };
648
+ content?: never;
649
+ };
650
+ };
651
+ };
652
+ delete?: never;
653
+ options?: never;
654
+ head?: never;
655
+ patch?: never;
656
+ trace?: never;
657
+ };
658
+ "/api/pricing/plans": {
659
+ parameters: {
660
+ query?: never;
661
+ header?: never;
662
+ path?: never;
663
+ cookie?: never;
664
+ };
665
+ /** Get public pricing plan catalog */
666
+ get: {
667
+ parameters: {
668
+ query?: never;
669
+ header?: never;
670
+ path?: never;
671
+ cookie?: never;
672
+ };
673
+ requestBody?: never;
674
+ responses: {
675
+ /** @description Active pricing plans and checkout eligibility */
676
+ 200: {
677
+ headers: {
678
+ [name: string]: unknown;
679
+ };
680
+ content: {
681
+ "application/json": components["schemas"]["PricingCatalogResponse"];
682
+ };
683
+ };
684
+ };
685
+ };
686
+ put?: never;
687
+ post?: never;
688
+ delete?: never;
689
+ options?: never;
690
+ head?: never;
691
+ patch?: never;
692
+ trace?: never;
693
+ };
694
+ "/api/subscriptions/plans": {
695
+ parameters: {
696
+ query?: never;
697
+ header?: never;
698
+ path?: never;
699
+ cookie?: never;
700
+ };
701
+ /** Get tenant-scoped subscription plan catalog */
702
+ get: {
703
+ parameters: {
704
+ query?: never;
705
+ header?: never;
706
+ path?: never;
707
+ cookie?: never;
708
+ };
709
+ requestBody?: never;
710
+ responses: {
711
+ /** @description Plan catalog for authenticated tenant context */
712
+ 200: {
713
+ headers: {
714
+ [name: string]: unknown;
715
+ };
716
+ content: {
717
+ "application/json": components["schemas"]["PricingCatalogResponse"] & {
718
+ tenantId: string;
719
+ };
720
+ };
721
+ };
722
+ };
723
+ };
724
+ put?: never;
725
+ post?: never;
726
+ delete?: never;
727
+ options?: never;
728
+ head?: never;
729
+ patch?: never;
730
+ trace?: never;
731
+ };
732
+ "/api/subscriptions/current": {
733
+ parameters: {
734
+ query?: never;
735
+ header?: never;
736
+ path?: never;
737
+ cookie?: never;
738
+ };
739
+ /** Get current tenant subscription projection */
740
+ get: {
741
+ parameters: {
742
+ query?: never;
743
+ header?: never;
744
+ path?: never;
745
+ cookie?: never;
746
+ };
747
+ requestBody?: never;
748
+ responses: {
749
+ /** @description Subscription state */
750
+ 200: {
751
+ headers: {
752
+ [name: string]: unknown;
753
+ };
754
+ content: {
755
+ "application/json": components["schemas"]["CurrentSubscriptionResponse"];
756
+ };
757
+ };
758
+ };
759
+ };
760
+ put?: never;
761
+ post?: never;
762
+ delete?: never;
763
+ options?: never;
764
+ head?: never;
765
+ patch?: never;
766
+ trace?: never;
767
+ };
768
+ "/api/subscriptions/portal": {
769
+ parameters: {
770
+ query?: never;
771
+ header?: never;
772
+ path?: never;
773
+ cookie?: never;
774
+ };
775
+ get?: never;
776
+ put?: never;
777
+ /**
778
+ * Create Stripe customer portal session
779
+ * @description Creates a self-service billing portal session for the tenant's Stripe customer record.
780
+ */
781
+ post: {
782
+ parameters: {
783
+ query?: never;
784
+ header?: never;
785
+ path?: never;
786
+ cookie?: never;
787
+ };
788
+ requestBody?: never;
789
+ responses: {
790
+ /** @description Billing portal URL */
791
+ 200: {
792
+ headers: {
793
+ [name: string]: unknown;
794
+ };
795
+ content: {
796
+ "application/json": {
797
+ url: string;
798
+ };
799
+ };
800
+ };
801
+ /** @description No Stripe customer mapped for tenant */
802
+ 400: {
803
+ headers: {
804
+ [name: string]: unknown;
805
+ };
806
+ content?: never;
807
+ };
808
+ };
809
+ };
810
+ delete?: never;
811
+ options?: never;
812
+ head?: never;
813
+ patch?: never;
814
+ trace?: never;
815
+ };
816
+ "/api/v1/customers": {
817
+ parameters: {
818
+ query?: never;
819
+ header?: never;
820
+ path?: never;
821
+ cookie?: never;
822
+ };
823
+ get?: never;
824
+ put?: never;
825
+ /** Create customer in canonical ledger */
826
+ post: {
827
+ parameters: {
828
+ query?: never;
829
+ header: {
830
+ /** @description IETF idempotency key for safe retries on POST requests. */
831
+ "Idempotency-Key": components["parameters"]["IdempotencyKey"];
832
+ };
833
+ path?: never;
834
+ cookie?: never;
835
+ };
836
+ requestBody: {
837
+ content: {
838
+ "application/json": components["schemas"]["CreateCustomerRequest"];
839
+ };
840
+ };
841
+ responses: {
842
+ /** @description Customer created */
843
+ 201: {
844
+ headers: {
845
+ IdempotencyReplayed: components["headers"]["IdempotencyReplayed"];
846
+ [name: string]: unknown;
847
+ };
848
+ content?: never;
849
+ };
850
+ /** @description Rate limited */
851
+ 429: {
852
+ headers: {
853
+ RateLimitLimit: components["headers"]["RateLimitLimit"];
854
+ RateLimitRemaining: components["headers"]["RateLimitRemaining"];
855
+ RateLimitReset: components["headers"]["RateLimitReset"];
856
+ [name: string]: unknown;
857
+ };
858
+ content?: never;
859
+ };
860
+ };
861
+ };
862
+ delete?: never;
863
+ options?: never;
864
+ head?: never;
865
+ patch?: never;
866
+ trace?: never;
867
+ };
868
+ "/api/v1/usage": {
869
+ parameters: {
870
+ query?: never;
871
+ header?: never;
872
+ path?: never;
873
+ cookie?: never;
874
+ };
875
+ get?: never;
876
+ put?: never;
877
+ /** Report usage and return explicit rating decision */
878
+ post: {
879
+ parameters: {
880
+ query?: never;
881
+ header: {
882
+ /** @description IETF idempotency key for safe retries on POST requests. */
883
+ "Idempotency-Key": components["parameters"]["IdempotencyKey"];
884
+ };
885
+ path?: never;
886
+ cookie?: never;
887
+ };
888
+ requestBody: {
889
+ content: {
890
+ "application/json": components["schemas"]["ReportUsageRequest"];
891
+ };
892
+ };
893
+ responses: {
894
+ /** @description Accepted with rating decision */
895
+ 200: {
896
+ headers: {
897
+ IdempotencyReplayed: components["headers"]["IdempotencyReplayed"];
898
+ [name: string]: unknown;
899
+ };
900
+ content: {
901
+ "application/json": components["schemas"]["UsageAcceptedResponse"];
902
+ };
903
+ };
904
+ /** @description Rate limited */
905
+ 429: {
906
+ headers: {
907
+ RateLimitLimit: components["headers"]["RateLimitLimit"];
908
+ RateLimitRemaining: components["headers"]["RateLimitRemaining"];
909
+ RateLimitReset: components["headers"]["RateLimitReset"];
910
+ [name: string]: unknown;
911
+ };
912
+ content?: never;
913
+ };
914
+ };
915
+ };
916
+ delete?: never;
917
+ options?: never;
918
+ head?: never;
919
+ patch?: never;
920
+ trace?: never;
921
+ };
922
+ "/api/v1/usage/preview": {
923
+ parameters: {
924
+ query?: never;
925
+ header?: never;
926
+ path?: never;
927
+ cookie?: never;
928
+ };
929
+ get?: never;
930
+ put?: never;
931
+ /** Preview usage rating decision without writing canonical events */
932
+ post: {
933
+ parameters: {
934
+ query?: never;
935
+ header?: never;
936
+ path?: never;
937
+ cookie?: never;
938
+ };
939
+ requestBody: {
940
+ content: {
941
+ "application/json": components["schemas"]["ReportUsageRequest"];
942
+ };
943
+ };
944
+ responses: {
945
+ /** @description Preview rating decision */
946
+ 200: {
947
+ headers: {
948
+ [name: string]: unknown;
949
+ };
950
+ content: {
951
+ "application/json": components["schemas"]["UsagePreviewResponse"];
952
+ };
953
+ };
954
+ };
955
+ };
956
+ delete?: never;
957
+ options?: never;
958
+ head?: never;
959
+ patch?: never;
960
+ trace?: never;
961
+ };
962
+ "/api/v1/webhooks/{source}": {
963
+ parameters: {
964
+ query?: never;
965
+ header?: never;
966
+ path?: never;
967
+ cookie?: never;
968
+ };
969
+ get?: never;
970
+ put?: never;
971
+ /**
972
+ * Ingest raw provider webhook event
973
+ * @description Stripe webhooks are deduplicated by Stripe event id via PostgreSQL transactions. Duplicate deliveries return 200 with ignored_duplicate status.
974
+ */
975
+ post: {
976
+ parameters: {
977
+ query?: never;
978
+ header?: never;
979
+ path: {
980
+ /** @description Webhook source provider (for example: stripe) */
981
+ source: string;
982
+ };
983
+ cookie?: never;
984
+ };
985
+ requestBody: {
986
+ content: {
987
+ "application/json": {
988
+ [key: string]: unknown;
989
+ };
990
+ };
991
+ };
992
+ responses: {
993
+ /** @description Duplicate Stripe event ignored idempotently */
994
+ 200: {
995
+ headers: {
996
+ [name: string]: unknown;
997
+ };
998
+ content: {
999
+ "application/json": components["schemas"]["WebhookDuplicateIgnoredResponse"];
1000
+ };
1001
+ };
1002
+ /** @description Event accepted for canonicalization */
1003
+ 202: {
1004
+ headers: {
1005
+ [name: string]: unknown;
1006
+ };
1007
+ content: {
1008
+ "application/json": components["schemas"]["WebhookAcceptedResponse"];
1009
+ };
1010
+ };
1011
+ /** @description Invalid webhook payload or signature failure */
1012
+ 400: {
1013
+ headers: {
1014
+ [name: string]: unknown;
1015
+ };
1016
+ content: {
1017
+ "application/json": components["schemas"]["ErrorResponse"];
1018
+ };
1019
+ };
1020
+ /** @description Ingestion failure */
1021
+ 500: {
1022
+ headers: {
1023
+ [name: string]: unknown;
1024
+ };
1025
+ content: {
1026
+ "application/json": components["schemas"]["ErrorResponse"];
1027
+ };
1028
+ };
1029
+ };
1030
+ };
1031
+ delete?: never;
1032
+ options?: never;
1033
+ head?: never;
1034
+ patch?: never;
1035
+ trace?: never;
1036
+ };
1037
+ "/api/api-keys": {
1038
+ parameters: {
1039
+ query?: never;
1040
+ header?: never;
1041
+ path?: never;
1042
+ cookie?: never;
1043
+ };
1044
+ /** List tenant API keys */
1045
+ get: {
1046
+ parameters: {
1047
+ query?: never;
1048
+ header?: never;
1049
+ path?: never;
1050
+ cookie?: never;
1051
+ };
1052
+ requestBody?: never;
1053
+ responses: {
1054
+ /** @description List API keys */
1055
+ 200: {
1056
+ headers: {
1057
+ [name: string]: unknown;
1058
+ };
1059
+ content?: never;
1060
+ };
1061
+ };
1062
+ };
1063
+ put?: never;
1064
+ /** Create tenant API key */
1065
+ post: {
1066
+ parameters: {
1067
+ query?: never;
1068
+ header: {
1069
+ /** @description IETF idempotency key for safe retries on POST requests. */
1070
+ "Idempotency-Key": components["parameters"]["IdempotencyKey"];
1071
+ };
1072
+ path?: never;
1073
+ cookie?: never;
1074
+ };
1075
+ requestBody: {
1076
+ content: {
1077
+ "application/json": components["schemas"]["ApiKeyCreateRequest"];
1078
+ };
1079
+ };
1080
+ responses: {
1081
+ /** @description API key created */
1082
+ 201: {
1083
+ headers: {
1084
+ [name: string]: unknown;
1085
+ };
1086
+ content?: never;
1087
+ };
1088
+ };
1089
+ };
1090
+ delete?: never;
1091
+ options?: never;
1092
+ head?: never;
1093
+ patch?: never;
1094
+ trace?: never;
1095
+ };
1096
+ "/api/admin/ledger": {
1097
+ parameters: {
1098
+ query?: never;
1099
+ header?: never;
1100
+ path?: never;
1101
+ cookie?: never;
1102
+ };
1103
+ /** Get canonical ledger events */
1104
+ get: {
1105
+ parameters: {
1106
+ query?: never;
1107
+ header?: never;
1108
+ path?: never;
1109
+ cookie?: never;
1110
+ };
1111
+ requestBody?: never;
1112
+ responses: {
1113
+ /** @description Canonical events */
1114
+ 200: {
1115
+ headers: {
1116
+ [name: string]: unknown;
1117
+ };
1118
+ content?: never;
1119
+ };
1120
+ };
1121
+ };
1122
+ put?: never;
1123
+ post?: never;
1124
+ delete?: never;
1125
+ options?: never;
1126
+ head?: never;
1127
+ patch?: never;
1128
+ trace?: never;
1129
+ };
1130
+ "/api/admin/raw": {
1131
+ parameters: {
1132
+ query?: never;
1133
+ header?: never;
1134
+ path?: never;
1135
+ cookie?: never;
1136
+ };
1137
+ /** Get raw source events */
1138
+ get: {
1139
+ parameters: {
1140
+ query?: never;
1141
+ header?: never;
1142
+ path?: never;
1143
+ cookie?: never;
1144
+ };
1145
+ requestBody?: never;
1146
+ responses: {
1147
+ /** @description Raw events */
1148
+ 200: {
1149
+ headers: {
1150
+ [name: string]: unknown;
1151
+ };
1152
+ content?: never;
1153
+ };
1154
+ };
1155
+ };
1156
+ put?: never;
1157
+ post?: never;
1158
+ delete?: never;
1159
+ options?: never;
1160
+ head?: never;
1161
+ patch?: never;
1162
+ trace?: never;
1163
+ };
1164
+ "/api/admin/customers": {
1165
+ parameters: {
1166
+ query?: never;
1167
+ header?: never;
1168
+ path?: never;
1169
+ cookie?: never;
1170
+ };
1171
+ /** Get customers projection */
1172
+ get: {
1173
+ parameters: {
1174
+ query?: never;
1175
+ header?: never;
1176
+ path?: never;
1177
+ cookie?: never;
1178
+ };
1179
+ requestBody?: never;
1180
+ responses: {
1181
+ /** @description Customers */
1182
+ 200: {
1183
+ headers: {
1184
+ [name: string]: unknown;
1185
+ };
1186
+ content?: never;
1187
+ };
1188
+ };
1189
+ };
1190
+ put?: never;
1191
+ post?: never;
1192
+ delete?: never;
1193
+ options?: never;
1194
+ head?: never;
1195
+ patch?: never;
1196
+ trace?: never;
1197
+ };
1198
+ "/api/admin/entitlements": {
1199
+ parameters: {
1200
+ query?: never;
1201
+ header?: never;
1202
+ path?: never;
1203
+ cookie?: never;
1204
+ };
1205
+ /** Get entitlement snapshots */
1206
+ get: {
1207
+ parameters: {
1208
+ query?: never;
1209
+ header?: never;
1210
+ path?: never;
1211
+ cookie?: never;
1212
+ };
1213
+ requestBody?: never;
1214
+ responses: {
1215
+ /** @description Entitlement snapshots */
1216
+ 200: {
1217
+ headers: {
1218
+ [name: string]: unknown;
1219
+ };
1220
+ content?: never;
1221
+ };
1222
+ };
1223
+ };
1224
+ put?: never;
1225
+ post?: never;
1226
+ delete?: never;
1227
+ options?: never;
1228
+ head?: never;
1229
+ patch?: never;
1230
+ trace?: never;
1231
+ };
1232
+ "/api/admin/access": {
1233
+ parameters: {
1234
+ query?: never;
1235
+ header?: never;
1236
+ path?: never;
1237
+ cookie?: never;
1238
+ };
1239
+ /** Get feature access projections */
1240
+ get: {
1241
+ parameters: {
1242
+ query?: never;
1243
+ header?: never;
1244
+ path?: never;
1245
+ cookie?: never;
1246
+ };
1247
+ requestBody?: never;
1248
+ responses: {
1249
+ /** @description Access projections */
1250
+ 200: {
1251
+ headers: {
1252
+ [name: string]: unknown;
1253
+ };
1254
+ content?: never;
1255
+ };
1256
+ };
1257
+ };
1258
+ put?: never;
1259
+ post?: never;
1260
+ delete?: never;
1261
+ options?: never;
1262
+ head?: never;
1263
+ patch?: never;
1264
+ trace?: never;
1265
+ };
1266
+ "/api/admin/auth-decisions": {
1267
+ parameters: {
1268
+ query?: never;
1269
+ header?: never;
1270
+ path?: never;
1271
+ cookie?: never;
1272
+ };
1273
+ /** Get recent authorization policy decisions (audit view) */
1274
+ get: {
1275
+ parameters: {
1276
+ query?: never;
1277
+ header?: never;
1278
+ path?: never;
1279
+ cookie?: never;
1280
+ };
1281
+ requestBody?: never;
1282
+ responses: {
1283
+ /** @description Auth policy decisions */
1284
+ 200: {
1285
+ headers: {
1286
+ [name: string]: unknown;
1287
+ };
1288
+ content?: never;
1289
+ };
1290
+ };
1291
+ };
1292
+ put?: never;
1293
+ post?: never;
1294
+ delete?: never;
1295
+ options?: never;
1296
+ head?: never;
1297
+ patch?: never;
1298
+ trace?: never;
1299
+ };
1300
+ "/api/admin/stripe/duplicates": {
1301
+ parameters: {
1302
+ query?: never;
1303
+ header?: never;
1304
+ path?: never;
1305
+ cookie?: never;
1306
+ };
1307
+ /**
1308
+ * Get duplicate Stripe webhook deliveries
1309
+ * @description Returns Stripe events where duplicate deliveries were detected by event-level idempotency.
1310
+ */
1311
+ get: {
1312
+ parameters: {
1313
+ query?: {
1314
+ limit?: number;
1315
+ };
1316
+ header?: never;
1317
+ path?: never;
1318
+ cookie?: never;
1319
+ };
1320
+ requestBody?: never;
1321
+ responses: {
1322
+ /** @description Duplicate Stripe events */
1323
+ 200: {
1324
+ headers: {
1325
+ [name: string]: unknown;
1326
+ };
1327
+ content: {
1328
+ "application/json": components["schemas"]["StripeDuplicateEvent"][];
1329
+ };
1330
+ };
1331
+ };
1332
+ };
1333
+ put?: never;
1334
+ post?: never;
1335
+ delete?: never;
1336
+ options?: never;
1337
+ head?: never;
1338
+ patch?: never;
1339
+ trace?: never;
1340
+ };
1341
+ "/api/admin/replay/{aggregateId}": {
1342
+ parameters: {
1343
+ query?: never;
1344
+ header?: never;
1345
+ path?: never;
1346
+ cookie?: never;
1347
+ };
1348
+ get?: never;
1349
+ put?: never;
1350
+ /**
1351
+ * Replay canonical events for one aggregate
1352
+ * @description Resets derived projections for the aggregate and re-enqueues canonical events so asynchronous workers rebuild materialized views from the event log.
1353
+ */
1354
+ post: {
1355
+ parameters: {
1356
+ query?: never;
1357
+ header?: never;
1358
+ path: {
1359
+ aggregateId: string;
1360
+ };
1361
+ cookie?: never;
1362
+ };
1363
+ requestBody?: never;
1364
+ responses: {
1365
+ /** @description Replay operation accepted and events re-enqueued */
1366
+ 200: {
1367
+ headers: {
1368
+ [name: string]: unknown;
1369
+ };
1370
+ content: {
1371
+ "application/json": components["schemas"]["ReplayTriggerResponse"];
1372
+ };
1373
+ };
1374
+ /** @description Admin authorization required */
1375
+ 403: {
1376
+ headers: {
1377
+ [name: string]: unknown;
1378
+ };
1379
+ content?: never;
1380
+ };
1381
+ /** @description Aggregate not found */
1382
+ 404: {
1383
+ headers: {
1384
+ [name: string]: unknown;
1385
+ };
1386
+ content?: never;
1387
+ };
1388
+ /** @description Replay failed */
1389
+ 500: {
1390
+ headers: {
1391
+ [name: string]: unknown;
1392
+ };
1393
+ content?: never;
1394
+ };
1395
+ };
1396
+ };
1397
+ delete?: never;
1398
+ options?: never;
1399
+ head?: never;
1400
+ patch?: never;
1401
+ trace?: never;
1402
+ };
1403
+ "/api/admin/stripe/replay/{eventId}": {
1404
+ parameters: {
1405
+ query?: never;
1406
+ header?: never;
1407
+ path?: never;
1408
+ cookie?: never;
1409
+ };
1410
+ get?: never;
1411
+ put?: never;
1412
+ /**
1413
+ * Replay Stripe webhook processing by Stripe event id
1414
+ * @description Requeues canonical events linked to the Stripe raw event. If canonical rows are absent, marks the raw event for re-canonicalization by the worker.
1415
+ */
1416
+ post: {
1417
+ parameters: {
1418
+ query?: never;
1419
+ header?: never;
1420
+ path: {
1421
+ eventId: string;
1422
+ };
1423
+ cookie?: never;
1424
+ };
1425
+ requestBody?: never;
1426
+ responses: {
1427
+ /** @description Stripe event replay accepted */
1428
+ 200: {
1429
+ headers: {
1430
+ [name: string]: unknown;
1431
+ };
1432
+ content: {
1433
+ "application/json": components["schemas"]["ReplayStripeEventResponse"];
1434
+ };
1435
+ };
1436
+ /** @description Admin authorization required */
1437
+ 403: {
1438
+ headers: {
1439
+ [name: string]: unknown;
1440
+ };
1441
+ content?: never;
1442
+ };
1443
+ /** @description Stripe event not found */
1444
+ 404: {
1445
+ headers: {
1446
+ [name: string]: unknown;
1447
+ };
1448
+ content?: never;
1449
+ };
1450
+ /** @description Replay failed */
1451
+ 500: {
1452
+ headers: {
1453
+ [name: string]: unknown;
1454
+ };
1455
+ content?: never;
1456
+ };
1457
+ };
1458
+ };
1459
+ delete?: never;
1460
+ options?: never;
1461
+ head?: never;
1462
+ patch?: never;
1463
+ trace?: never;
1464
+ };
1465
+ "/api/admin/replays": {
1466
+ parameters: {
1467
+ query?: never;
1468
+ header?: never;
1469
+ path?: never;
1470
+ cookie?: never;
1471
+ };
1472
+ /** List replay operation history */
1473
+ get: {
1474
+ parameters: {
1475
+ query?: {
1476
+ limit?: number;
1477
+ };
1478
+ header?: never;
1479
+ path?: never;
1480
+ cookie?: never;
1481
+ };
1482
+ requestBody?: never;
1483
+ responses: {
1484
+ /** @description Replay operation history */
1485
+ 200: {
1486
+ headers: {
1487
+ [name: string]: unknown;
1488
+ };
1489
+ content: {
1490
+ "application/json": components["schemas"]["ReplayOperation"][];
1491
+ };
1492
+ };
1493
+ /** @description Admin authorization required */
1494
+ 403: {
1495
+ headers: {
1496
+ [name: string]: unknown;
1497
+ };
1498
+ content?: never;
1499
+ };
1500
+ };
1501
+ };
1502
+ put?: never;
1503
+ post?: never;
1504
+ delete?: never;
1505
+ options?: never;
1506
+ head?: never;
1507
+ patch?: never;
1508
+ trace?: never;
1509
+ };
1510
+ "/api/admin/invoices": {
1511
+ parameters: {
1512
+ query?: never;
1513
+ header?: never;
1514
+ path?: never;
1515
+ cookie?: never;
1516
+ };
1517
+ /** List invoice projections derived from canonical billing events */
1518
+ get: {
1519
+ parameters: {
1520
+ query?: {
1521
+ customer?: string;
1522
+ subscription?: string;
1523
+ status?: string;
1524
+ limit?: number;
1525
+ };
1526
+ header?: never;
1527
+ path?: never;
1528
+ cookie?: never;
1529
+ };
1530
+ requestBody?: never;
1531
+ responses: {
1532
+ /** @description Invoice projections */
1533
+ 200: {
1534
+ headers: {
1535
+ [name: string]: unknown;
1536
+ };
1537
+ content: {
1538
+ "application/json": components["schemas"]["InvoiceProjection"][];
1539
+ };
1540
+ };
1541
+ };
1542
+ };
1543
+ put?: never;
1544
+ post?: never;
1545
+ delete?: never;
1546
+ options?: never;
1547
+ head?: never;
1548
+ patch?: never;
1549
+ trace?: never;
1550
+ };
1551
+ "/api/admin/invoices/{stripeInvoiceId}/timeline": {
1552
+ parameters: {
1553
+ query?: never;
1554
+ header?: never;
1555
+ path?: never;
1556
+ cookie?: never;
1557
+ };
1558
+ /**
1559
+ * Get canonical event timeline lineage for one invoice projection
1560
+ * @description Returns canonical event history contributing to the invoice projection, including source and replay/process metadata for explainability.
1561
+ */
1562
+ get: {
1563
+ parameters: {
1564
+ query?: never;
1565
+ header?: never;
1566
+ path: {
1567
+ stripeInvoiceId: string;
1568
+ };
1569
+ cookie?: never;
1570
+ };
1571
+ requestBody?: never;
1572
+ responses: {
1573
+ /** @description Invoice timeline explainability response */
1574
+ 200: {
1575
+ headers: {
1576
+ [name: string]: unknown;
1577
+ };
1578
+ content: {
1579
+ "application/json": components["schemas"]["InvoiceTimelineResponse"];
1580
+ };
1581
+ };
1582
+ /** @description Admin authorization required */
1583
+ 403: {
1584
+ headers: {
1585
+ [name: string]: unknown;
1586
+ };
1587
+ content?: never;
1588
+ };
1589
+ /** @description Invoice projection not found */
1590
+ 404: {
1591
+ headers: {
1592
+ [name: string]: unknown;
1593
+ };
1594
+ content?: never;
1595
+ };
1596
+ };
1597
+ };
1598
+ put?: never;
1599
+ post?: never;
1600
+ delete?: never;
1601
+ options?: never;
1602
+ head?: never;
1603
+ patch?: never;
1604
+ trace?: never;
1605
+ };
1606
+ "/api/admin/reconciliation": {
1607
+ parameters: {
1608
+ query?: never;
1609
+ header?: never;
1610
+ path?: never;
1611
+ cookie?: never;
1612
+ };
1613
+ /**
1614
+ * List recent reconciliation drift findings grouped by entity type
1615
+ * @description Returns projection drift findings detected by periodic Stripe vs internal-state reconciliation.
1616
+ */
1617
+ get: {
1618
+ parameters: {
1619
+ query?: {
1620
+ limit?: number;
1621
+ };
1622
+ header?: never;
1623
+ path?: never;
1624
+ cookie?: never;
1625
+ };
1626
+ requestBody?: never;
1627
+ responses: {
1628
+ /** @description Grouped reconciliation findings */
1629
+ 200: {
1630
+ headers: {
1631
+ [name: string]: unknown;
1632
+ };
1633
+ content: {
1634
+ "application/json": {
1635
+ totalIssues: number;
1636
+ groupedByEntityType: {
1637
+ [key: string]: components["schemas"]["ReconciliationResult"][];
1638
+ };
1639
+ };
1640
+ };
1641
+ };
1642
+ /** @description Admin authorization required */
1643
+ 403: {
1644
+ headers: {
1645
+ [name: string]: unknown;
1646
+ };
1647
+ content?: never;
1648
+ };
1649
+ };
1650
+ };
1651
+ put?: never;
1652
+ post?: never;
1653
+ delete?: never;
1654
+ options?: never;
1655
+ head?: never;
1656
+ patch?: never;
1657
+ trace?: never;
1658
+ };
1659
+ "/api/admin/reconciliation/run": {
1660
+ parameters: {
1661
+ query?: never;
1662
+ header?: never;
1663
+ path?: never;
1664
+ cookie?: never;
1665
+ };
1666
+ get?: never;
1667
+ put?: never;
1668
+ /** Trigger reconciliation worker manually */
1669
+ post: {
1670
+ parameters: {
1671
+ query?: never;
1672
+ header?: never;
1673
+ path?: never;
1674
+ cookie?: never;
1675
+ };
1676
+ requestBody?: never;
1677
+ responses: {
1678
+ /** @description Manual reconciliation run summary */
1679
+ 200: {
1680
+ headers: {
1681
+ [name: string]: unknown;
1682
+ };
1683
+ content: {
1684
+ "application/json": components["schemas"]["ReconciliationRunSummary"];
1685
+ };
1686
+ };
1687
+ /** @description Admin authorization required */
1688
+ 403: {
1689
+ headers: {
1690
+ [name: string]: unknown;
1691
+ };
1692
+ content?: never;
1693
+ };
1694
+ /** @description Reconciliation run failed */
1695
+ 500: {
1696
+ headers: {
1697
+ [name: string]: unknown;
1698
+ };
1699
+ content?: never;
1700
+ };
1701
+ };
1702
+ };
1703
+ delete?: never;
1704
+ options?: never;
1705
+ head?: never;
1706
+ patch?: never;
1707
+ trace?: never;
1708
+ };
1709
+ "/api/admin/reconciliation/{id}": {
1710
+ parameters: {
1711
+ query?: never;
1712
+ header?: never;
1713
+ path?: never;
1714
+ cookie?: never;
1715
+ };
1716
+ /**
1717
+ * Get one reconciliation drift finding with repair history
1718
+ * @description Returns full reconciliation issue details including repair action metadata for projection drift remediation workflows.
1719
+ */
1720
+ get: {
1721
+ parameters: {
1722
+ query?: never;
1723
+ header?: never;
1724
+ path: {
1725
+ id: string;
1726
+ };
1727
+ cookie?: never;
1728
+ };
1729
+ requestBody?: never;
1730
+ responses: {
1731
+ /** @description Reconciliation issue details */
1732
+ 200: {
1733
+ headers: {
1734
+ [name: string]: unknown;
1735
+ };
1736
+ content: {
1737
+ "application/json": components["schemas"]["ReconciliationResult"];
1738
+ };
1739
+ };
1740
+ /** @description Admin authorization required */
1741
+ 403: {
1742
+ headers: {
1743
+ [name: string]: unknown;
1744
+ };
1745
+ content?: never;
1746
+ };
1747
+ /** @description Reconciliation issue not found */
1748
+ 404: {
1749
+ headers: {
1750
+ [name: string]: unknown;
1751
+ };
1752
+ content?: never;
1753
+ };
1754
+ };
1755
+ };
1756
+ put?: never;
1757
+ post?: never;
1758
+ delete?: never;
1759
+ options?: never;
1760
+ head?: never;
1761
+ patch?: never;
1762
+ trace?: never;
1763
+ };
1764
+ "/api/admin/reconciliation/{id}/repair": {
1765
+ parameters: {
1766
+ query?: never;
1767
+ header?: never;
1768
+ path?: never;
1769
+ cookie?: never;
1770
+ };
1771
+ get?: never;
1772
+ put?: never;
1773
+ /**
1774
+ * Trigger derived-data repair for one reconciliation finding
1775
+ * @description Runs replay/requeue/ignore repair workflows to rebuild projections from canonical events in line with DDIA derived-state repair concepts.
1776
+ */
1777
+ post: {
1778
+ parameters: {
1779
+ query?: never;
1780
+ header?: never;
1781
+ path: {
1782
+ id: string;
1783
+ };
1784
+ cookie?: never;
1785
+ };
1786
+ requestBody: {
1787
+ content: {
1788
+ "application/json": components["schemas"]["ReconciliationRepairRequest"];
1789
+ };
1790
+ };
1791
+ responses: {
1792
+ /** @description Repair action recorded and triggered */
1793
+ 200: {
1794
+ headers: {
1795
+ [name: string]: unknown;
1796
+ };
1797
+ content: {
1798
+ "application/json": components["schemas"]["ReconciliationRepairResponse"];
1799
+ };
1800
+ };
1801
+ /** @description Invalid repair action or missing id */
1802
+ 400: {
1803
+ headers: {
1804
+ [name: string]: unknown;
1805
+ };
1806
+ content?: never;
1807
+ };
1808
+ /** @description Admin authorization required */
1809
+ 403: {
1810
+ headers: {
1811
+ [name: string]: unknown;
1812
+ };
1813
+ content?: never;
1814
+ };
1815
+ /** @description Reconciliation or canonical event not found */
1816
+ 404: {
1817
+ headers: {
1818
+ [name: string]: unknown;
1819
+ };
1820
+ content?: never;
1821
+ };
1822
+ /** @description Repair trigger failed */
1823
+ 500: {
1824
+ headers: {
1825
+ [name: string]: unknown;
1826
+ };
1827
+ content?: never;
1828
+ };
1829
+ };
1830
+ };
1831
+ delete?: never;
1832
+ options?: never;
1833
+ head?: never;
1834
+ patch?: never;
1835
+ trace?: never;
1836
+ };
1837
+ "/api/admin/drift-alerts": {
1838
+ parameters: {
1839
+ query?: never;
1840
+ header?: never;
1841
+ path?: never;
1842
+ cookie?: never;
1843
+ };
1844
+ /**
1845
+ * List drift alerts from reconciliation monitoring
1846
+ * @description Returns drift alerts generated when derived billing projections diverge from Stripe source state. Supports filtering for operational triage.
1847
+ */
1848
+ get: {
1849
+ parameters: {
1850
+ query?: {
1851
+ severity?: "INFO" | "WARNING" | "CRITICAL";
1852
+ entity_type?: "subscription" | "invoice";
1853
+ /** @description Matches alert_status or resolution_status values (for example OPEN, SENT, SEND_FAILED, RESOLVED). */
1854
+ status?: string;
1855
+ limit?: number;
1856
+ };
1857
+ header?: never;
1858
+ path?: never;
1859
+ cookie?: never;
1860
+ };
1861
+ requestBody?: never;
1862
+ responses: {
1863
+ /** @description Filtered drift alert list */
1864
+ 200: {
1865
+ headers: {
1866
+ [name: string]: unknown;
1867
+ };
1868
+ content: {
1869
+ "application/json": components["schemas"]["DriftAlertListResponse"];
1870
+ };
1871
+ };
1872
+ /** @description Admin authorization required */
1873
+ 403: {
1874
+ headers: {
1875
+ [name: string]: unknown;
1876
+ };
1877
+ content?: never;
1878
+ };
1879
+ };
1880
+ };
1881
+ put?: never;
1882
+ post?: never;
1883
+ delete?: never;
1884
+ options?: never;
1885
+ head?: never;
1886
+ patch?: never;
1887
+ trace?: never;
1888
+ };
1889
+ "/api/admin/drift-alerts/{id}/resolve": {
1890
+ parameters: {
1891
+ query?: never;
1892
+ header?: never;
1893
+ path?: never;
1894
+ cookie?: never;
1895
+ };
1896
+ get?: never;
1897
+ put?: never;
1898
+ /**
1899
+ * Resolve one drift alert
1900
+ * @description Marks drift alert as resolved after projection replay or manual operator resolution.
1901
+ */
1902
+ post: {
1903
+ parameters: {
1904
+ query?: never;
1905
+ header?: never;
1906
+ path: {
1907
+ id: string;
1908
+ };
1909
+ cookie?: never;
1910
+ };
1911
+ requestBody?: never;
1912
+ responses: {
1913
+ /** @description Resolved drift alert */
1914
+ 200: {
1915
+ headers: {
1916
+ [name: string]: unknown;
1917
+ };
1918
+ content: {
1919
+ "application/json": components["schemas"]["DriftAlert"];
1920
+ };
1921
+ };
1922
+ /** @description Missing drift alert id */
1923
+ 400: {
1924
+ headers: {
1925
+ [name: string]: unknown;
1926
+ };
1927
+ content?: never;
1928
+ };
1929
+ /** @description Admin authorization required */
1930
+ 403: {
1931
+ headers: {
1932
+ [name: string]: unknown;
1933
+ };
1934
+ content?: never;
1935
+ };
1936
+ /** @description Drift alert not found */
1937
+ 404: {
1938
+ headers: {
1939
+ [name: string]: unknown;
1940
+ };
1941
+ content?: never;
1942
+ };
1943
+ };
1944
+ };
1945
+ delete?: never;
1946
+ options?: never;
1947
+ head?: never;
1948
+ patch?: never;
1949
+ trace?: never;
1950
+ };
1951
+ "/api/admin/keys/rotate": {
1952
+ parameters: {
1953
+ query?: never;
1954
+ header?: never;
1955
+ path?: never;
1956
+ cookie?: never;
1957
+ };
1958
+ get?: never;
1959
+ put?: never;
1960
+ /** Rotate OpenBao transit signing key */
1961
+ post: {
1962
+ parameters: {
1963
+ query?: never;
1964
+ header: {
1965
+ /** @description IETF idempotency key for safe retries on POST requests. */
1966
+ "Idempotency-Key": components["parameters"]["IdempotencyKey"];
1967
+ };
1968
+ path?: never;
1969
+ cookie?: never;
1970
+ };
1971
+ requestBody?: never;
1972
+ responses: {
1973
+ /** @description Transit key rotated */
1974
+ 200: {
1975
+ headers: {
1976
+ [name: string]: unknown;
1977
+ };
1978
+ content?: never;
1979
+ };
1980
+ /** @description Rotation failed */
1981
+ 500: {
1982
+ headers: {
1983
+ [name: string]: unknown;
1984
+ };
1985
+ content?: never;
1986
+ };
1987
+ };
1988
+ };
1989
+ delete?: never;
1990
+ options?: never;
1991
+ head?: never;
1992
+ patch?: never;
1993
+ trace?: never;
1994
+ };
1995
+ }
1996
+ export type webhooks = Record<string, never>;
1997
+ export interface components {
1998
+ schemas: {
1999
+ ErrorResponse: {
2000
+ error: string;
2001
+ message?: string;
2002
+ };
2003
+ HealthResponse: {
2004
+ /** @example ok */
2005
+ status: string;
2006
+ /** Format: date-time */
2007
+ timestamp: string;
2008
+ };
2009
+ CreateCustomerRequest: {
2010
+ /** Format: email */
2011
+ email: string;
2012
+ name: string;
2013
+ externalId?: string;
2014
+ };
2015
+ ReportUsageRequest: {
2016
+ customerId: string;
2017
+ featureKey: string;
2018
+ amount: number;
2019
+ /** Format: date-time */
2020
+ timestamp?: string;
2021
+ };
2022
+ UsageRatingDecision: {
2023
+ /** @example rating.v1.events */
2024
+ ratingVersion: string;
2025
+ planId: string | null;
2026
+ featureKey: string;
2027
+ /** Format: date-time */
2028
+ periodStart: string;
2029
+ /** Format: date-time */
2030
+ periodEnd: string;
2031
+ usageReported: number;
2032
+ consumedBefore: number;
2033
+ consumedAfter: number;
2034
+ includedUnits: number | null;
2035
+ billableOverageUnits: number;
2036
+ estimatedChargeMinor: number;
2037
+ /** @example usd */
2038
+ currency: string;
2039
+ rated: boolean;
2040
+ reason?: string | null;
2041
+ };
2042
+ UsageAcceptedResponse: {
2043
+ /** @enum {string} */
2044
+ status: "accepted";
2045
+ tenantId: string;
2046
+ customerId: string;
2047
+ rating: components["schemas"]["UsageRatingDecision"];
2048
+ };
2049
+ UsagePreviewResponse: {
2050
+ /** @enum {string} */
2051
+ status: "preview";
2052
+ tenantId: string;
2053
+ customerId: string;
2054
+ rating: components["schemas"]["UsageRatingDecision"];
2055
+ };
2056
+ CheckoutRequest: {
2057
+ /** @example pro */
2058
+ planId: string;
2059
+ };
2060
+ PricingPlan: {
2061
+ /** @example pro */
2062
+ planId: string;
2063
+ /** @example Pro */
2064
+ tier: string;
2065
+ description: string;
2066
+ /** @example $99 */
2067
+ priceLabel: string;
2068
+ /** @example 9900 */
2069
+ amountMinor?: number | null;
2070
+ /** @example usd */
2071
+ currency: string;
2072
+ /** @enum {string} */
2073
+ interval: "month" | "year" | "custom";
2074
+ /** @example 2000000 */
2075
+ includedEventsMonthly?: number | null;
2076
+ /** @example 700 */
2077
+ overagePer100kMinor?: number | null;
2078
+ features: string[];
2079
+ highlighted: boolean;
2080
+ active: boolean;
2081
+ contactSales: boolean;
2082
+ stripeProductId?: string | null;
2083
+ checkoutEnabled: boolean;
2084
+ };
2085
+ PricingCatalogResponse: {
2086
+ plans: components["schemas"]["PricingPlan"][];
2087
+ checkoutEligiblePlanIds: string[];
2088
+ billingSetup: {
2089
+ ready: boolean;
2090
+ missingCheckoutPlanIds: string[];
2091
+ notes: string[];
2092
+ };
2093
+ currency?: string;
2094
+ source?: string;
2095
+ };
2096
+ CheckoutResponse: {
2097
+ url: string | null;
2098
+ sessionId: string;
2099
+ plan: components["schemas"]["PricingPlan"];
2100
+ };
2101
+ CurrentSubscriptionResponse: {
2102
+ id?: string;
2103
+ tenant_id?: string;
2104
+ stripe_customer_id?: string | null;
2105
+ stripe_subscription_id?: string | null;
2106
+ plan_id?: string | null;
2107
+ status: string;
2108
+ plan: components["schemas"]["PricingPlan"] | null;
2109
+ };
2110
+ LoginRequest: {
2111
+ /** Format: email */
2112
+ email: string;
2113
+ password: string;
2114
+ };
2115
+ RegisterRequest: {
2116
+ /** Format: email */
2117
+ email: string;
2118
+ password: string;
2119
+ name?: string;
2120
+ };
2121
+ TenantCreateRequest: {
2122
+ name: string;
2123
+ };
2124
+ ApiKeyCreateRequest: {
2125
+ name: string;
2126
+ };
2127
+ WebhookAcceptedResponse: {
2128
+ /** @description Raw event id in ingestion store */
2129
+ id: string;
2130
+ /** @enum {string} */
2131
+ status: "accepted";
2132
+ /** @description Source event id (Stripe only) */
2133
+ eventId?: string;
2134
+ };
2135
+ WebhookDuplicateIgnoredResponse: {
2136
+ /** @enum {string} */
2137
+ status: "ignored_duplicate";
2138
+ eventId: string;
2139
+ };
2140
+ StripeDuplicateEvent: {
2141
+ event_id: string;
2142
+ source: string;
2143
+ /** Format: date-time */
2144
+ received_at: string;
2145
+ processed: boolean;
2146
+ duplicate_count: number;
2147
+ /** Format: date-time */
2148
+ last_duplicate_at?: string | null;
2149
+ };
2150
+ ReplayOperation: {
2151
+ id: string;
2152
+ aggregate_id: string;
2153
+ aggregate_type: string;
2154
+ triggered_by: string;
2155
+ /** Format: date-time */
2156
+ started_at: string;
2157
+ /** Format: date-time */
2158
+ completed_at?: string | null;
2159
+ /** @enum {string} */
2160
+ status: "running" | "completed" | "failed";
2161
+ };
2162
+ ReplayTriggerResponse: {
2163
+ replayId: string;
2164
+ aggregateId: string;
2165
+ aggregateType: string;
2166
+ requeuedEvents: number;
2167
+ status: string;
2168
+ };
2169
+ ReplayStripeEventResponse: {
2170
+ replayId: string;
2171
+ /** @enum {string} */
2172
+ mode: "canonical_requeue" | "raw_recanonicalize";
2173
+ stripeEventId: string;
2174
+ rawEventId: string;
2175
+ requeuedEvents: number;
2176
+ status: string;
2177
+ };
2178
+ InvoiceProjection: {
2179
+ id: string;
2180
+ tenant_id: string;
2181
+ customer_id?: string | null;
2182
+ stripe_invoice_id: string;
2183
+ subscription_id?: string | null;
2184
+ amount_due?: number | null;
2185
+ amount_paid?: number | null;
2186
+ currency?: string | null;
2187
+ status?: string | null;
2188
+ /** Format: date-time */
2189
+ period_start?: string | null;
2190
+ /** Format: date-time */
2191
+ period_end?: string | null;
2192
+ /** Format: date-time */
2193
+ created_at: string;
2194
+ /** Format: date-time */
2195
+ updated_at: string;
2196
+ source_event_id: string;
2197
+ };
2198
+ InvoiceTimelineEvent: {
2199
+ event_type: string;
2200
+ /** Format: date-time */
2201
+ timestamp: string;
2202
+ aggregate_type: string;
2203
+ aggregate_id: string;
2204
+ payload: {
2205
+ [key: string]: unknown;
2206
+ };
2207
+ sequence: number;
2208
+ event_source: string;
2209
+ replayed: boolean;
2210
+ processing_status: string;
2211
+ };
2212
+ InvoiceTimelineResponse: {
2213
+ invoice: components["schemas"]["InvoiceProjection"];
2214
+ events: components["schemas"]["InvoiceTimelineEvent"][];
2215
+ };
2216
+ ReconciliationResult: {
2217
+ id: string;
2218
+ entity_type: string;
2219
+ entity_id: string;
2220
+ stripe_state: {
2221
+ [key: string]: unknown;
2222
+ };
2223
+ internal_state: {
2224
+ [key: string]: unknown;
2225
+ };
2226
+ /** Format: date-time */
2227
+ detected_at: string;
2228
+ status: string;
2229
+ resolution_notes?: string | null;
2230
+ /** @enum {string|null} */
2231
+ repair_action?: "REPLAY_AGGREGATE" | "REQUEUE_EVENT" | "IGNORE" | null;
2232
+ repair_triggered_by?: string | null;
2233
+ /** Format: date-time */
2234
+ repair_triggered_at?: string | null;
2235
+ repair_status?: string | null;
2236
+ };
2237
+ ReconciliationRepairRequest: {
2238
+ /** @enum {string} */
2239
+ repair_action: "REPLAY_AGGREGATE" | "REQUEUE_EVENT" | "IGNORE";
2240
+ };
2241
+ ReconciliationRepairResponse: {
2242
+ reconciliation: components["schemas"]["ReconciliationResult"];
2243
+ actionResult?: {
2244
+ [key: string]: unknown;
2245
+ } | null;
2246
+ };
2247
+ ReconciliationRunSummary: {
2248
+ started: boolean;
2249
+ skipped?: boolean;
2250
+ subscriptionChecks: number;
2251
+ invoiceChecks: number;
2252
+ issuesDetected: number;
2253
+ };
2254
+ DriftAlert: {
2255
+ id: string;
2256
+ reconciliation_id: string;
2257
+ entity_type: string;
2258
+ entity_id: string;
2259
+ /** Format: date-time */
2260
+ detected_at: string;
2261
+ /** @enum {string} */
2262
+ severity: "INFO" | "WARNING" | "CRITICAL";
2263
+ alert_status: string;
2264
+ /** Format: date-time */
2265
+ alert_sent_at?: string | null;
2266
+ resolution_status: string;
2267
+ /** Format: date-time */
2268
+ resolved_at?: string | null;
2269
+ };
2270
+ DriftAlertListResponse: {
2271
+ total: number;
2272
+ alerts: components["schemas"]["DriftAlert"][];
2273
+ };
2274
+ };
2275
+ responses: never;
2276
+ parameters: {
2277
+ /** @description IETF idempotency key for safe retries on POST requests. */
2278
+ IdempotencyKey: string;
2279
+ };
2280
+ requestBodies: never;
2281
+ headers: {
2282
+ /** @description Rate limit quota for the current policy window */
2283
+ RateLimitLimit: number;
2284
+ /** @description Remaining requests in current rate limit window */
2285
+ RateLimitRemaining: number;
2286
+ /** @description Seconds until the current rate limit window resets */
2287
+ RateLimitReset: number;
2288
+ /** @description True when a response is replayed from an existing idempotency record */
2289
+ IdempotencyReplayed: "true";
2290
+ };
2291
+ pathItems: never;
2292
+ }
2293
+ export type $defs = Record<string, never>;
2294
+ export type operations = Record<string, never>;