tripwire-server 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.
data/spec/openapi.json ADDED
@@ -0,0 +1,1435 @@
1
+ {
2
+ "openapi": "3.1.0",
3
+ "info": {
4
+ "title": "Tripwire Server SDK API",
5
+ "description": "Customer-facing server-side Tripwire APIs for the public SDK surface.",
6
+ "version": "1.0.0"
7
+ },
8
+ "servers": [
9
+ {
10
+ "url": "https://api.tripwirejs.com",
11
+ "description": "Managed Tripwire API"
12
+ }
13
+ ],
14
+ "paths": {
15
+ "/v1/sessions": {
16
+ "get": {
17
+ "summary": "List durable session result summaries",
18
+ "description": "Requires a secret key.",
19
+ "security": [
20
+ {
21
+ "apiKeyHeader": []
22
+ }
23
+ ],
24
+ "responses": {
25
+ "200": {
26
+ "description": "Session list",
27
+ "content": {
28
+ "application/json": {
29
+ "schema": {
30
+ "$ref": "#/components/schemas/SessionsListResponse"
31
+ }
32
+ }
33
+ }
34
+ }
35
+ },
36
+ "parameters": [
37
+ {
38
+ "name": "limit",
39
+ "in": "query",
40
+ "required": false,
41
+ "schema": {
42
+ "type": "integer",
43
+ "minimum": 1,
44
+ "maximum": 200,
45
+ "default": 50
46
+ }
47
+ },
48
+ {
49
+ "name": "cursor",
50
+ "in": "query",
51
+ "required": false,
52
+ "schema": {
53
+ "type": "string"
54
+ }
55
+ },
56
+ {
57
+ "name": "verdict",
58
+ "in": "query",
59
+ "required": false,
60
+ "schema": {
61
+ "type": "string",
62
+ "enum": [
63
+ "bot",
64
+ "human",
65
+ "inconclusive"
66
+ ]
67
+ }
68
+ },
69
+ {
70
+ "name": "search",
71
+ "in": "query",
72
+ "required": false,
73
+ "schema": {
74
+ "type": "string"
75
+ }
76
+ }
77
+ ]
78
+ }
79
+ },
80
+ "/v1/sessions/{sessionId}": {
81
+ "get": {
82
+ "summary": "Retrieve durable session detail",
83
+ "description": "Requires a secret key.",
84
+ "security": [
85
+ {
86
+ "apiKeyHeader": []
87
+ }
88
+ ],
89
+ "parameters": [
90
+ {
91
+ "name": "sessionId",
92
+ "in": "path",
93
+ "required": true,
94
+ "schema": {
95
+ "type": "string"
96
+ }
97
+ }
98
+ ],
99
+ "responses": {
100
+ "200": {
101
+ "description": "Session detail",
102
+ "content": {
103
+ "application/json": {
104
+ "schema": {
105
+ "$ref": "#/components/schemas/SessionDetailResponse"
106
+ }
107
+ }
108
+ }
109
+ },
110
+ "404": {
111
+ "description": "Session not found",
112
+ "content": {
113
+ "application/json": {
114
+ "schema": {
115
+ "$ref": "#/components/schemas/Error"
116
+ }
117
+ }
118
+ }
119
+ }
120
+ }
121
+ }
122
+ },
123
+ "/v1/fingerprints": {
124
+ "get": {
125
+ "summary": "List durable visitor fingerprints",
126
+ "description": "Requires a secret key.",
127
+ "security": [
128
+ {
129
+ "apiKeyHeader": []
130
+ }
131
+ ],
132
+ "responses": {
133
+ "200": {
134
+ "description": "Fingerprint list",
135
+ "content": {
136
+ "application/json": {
137
+ "schema": {
138
+ "$ref": "#/components/schemas/FingerprintsListResponse"
139
+ }
140
+ }
141
+ }
142
+ }
143
+ },
144
+ "parameters": [
145
+ {
146
+ "name": "limit",
147
+ "in": "query",
148
+ "required": false,
149
+ "schema": {
150
+ "type": "integer",
151
+ "minimum": 1,
152
+ "maximum": 200,
153
+ "default": 50
154
+ }
155
+ },
156
+ {
157
+ "name": "cursor",
158
+ "in": "query",
159
+ "required": false,
160
+ "schema": {
161
+ "type": "string"
162
+ }
163
+ },
164
+ {
165
+ "name": "search",
166
+ "in": "query",
167
+ "required": false,
168
+ "schema": {
169
+ "type": "string"
170
+ }
171
+ },
172
+ {
173
+ "name": "sort",
174
+ "in": "query",
175
+ "required": false,
176
+ "schema": {
177
+ "type": "string",
178
+ "enum": [
179
+ "seen_count",
180
+ "first_seen"
181
+ ]
182
+ }
183
+ }
184
+ ]
185
+ }
186
+ },
187
+ "/v1/fingerprints/{visitorId}": {
188
+ "get": {
189
+ "summary": "Retrieve durable fingerprint detail",
190
+ "description": "Requires a secret key.",
191
+ "security": [
192
+ {
193
+ "apiKeyHeader": []
194
+ }
195
+ ],
196
+ "parameters": [
197
+ {
198
+ "name": "visitorId",
199
+ "in": "path",
200
+ "required": true,
201
+ "schema": {
202
+ "type": "string"
203
+ }
204
+ }
205
+ ],
206
+ "responses": {
207
+ "200": {
208
+ "description": "Fingerprint detail",
209
+ "content": {
210
+ "application/json": {
211
+ "schema": {
212
+ "$ref": "#/components/schemas/FingerprintDetailResponse"
213
+ }
214
+ }
215
+ }
216
+ },
217
+ "404": {
218
+ "description": "Fingerprint not found",
219
+ "content": {
220
+ "application/json": {
221
+ "schema": {
222
+ "$ref": "#/components/schemas/Error"
223
+ }
224
+ }
225
+ }
226
+ }
227
+ }
228
+ }
229
+ },
230
+ "/v1/teams": {
231
+ "post": {
232
+ "summary": "Create a team",
233
+ "description": "Requires a secret key.",
234
+ "security": [
235
+ {
236
+ "apiKeyHeader": []
237
+ }
238
+ ],
239
+ "requestBody": {
240
+ "required": true,
241
+ "content": {
242
+ "application/json": {
243
+ "schema": {
244
+ "$ref": "#/components/schemas/CreateTeamRequest"
245
+ }
246
+ }
247
+ }
248
+ },
249
+ "responses": {
250
+ "201": {
251
+ "description": "Team created",
252
+ "content": {
253
+ "application/json": {
254
+ "schema": {
255
+ "$ref": "#/components/schemas/TeamResponse"
256
+ }
257
+ }
258
+ }
259
+ }
260
+ }
261
+ }
262
+ },
263
+ "/v1/teams/{teamId}": {
264
+ "get": {
265
+ "summary": "Retrieve a team",
266
+ "security": [
267
+ {
268
+ "apiKeyHeader": []
269
+ }
270
+ ],
271
+ "parameters": [
272
+ {
273
+ "name": "teamId",
274
+ "in": "path",
275
+ "required": true,
276
+ "schema": {
277
+ "type": "string"
278
+ }
279
+ }
280
+ ],
281
+ "responses": {
282
+ "200": {
283
+ "description": "Team detail",
284
+ "content": {
285
+ "application/json": {
286
+ "schema": {
287
+ "$ref": "#/components/schemas/TeamResponse"
288
+ }
289
+ }
290
+ }
291
+ }
292
+ }
293
+ },
294
+ "patch": {
295
+ "summary": "Update a team",
296
+ "security": [
297
+ {
298
+ "apiKeyHeader": []
299
+ }
300
+ ],
301
+ "parameters": [
302
+ {
303
+ "name": "teamId",
304
+ "in": "path",
305
+ "required": true,
306
+ "schema": {
307
+ "type": "string"
308
+ }
309
+ }
310
+ ],
311
+ "requestBody": {
312
+ "required": true,
313
+ "content": {
314
+ "application/json": {
315
+ "schema": {
316
+ "$ref": "#/components/schemas/UpdateTeamRequest"
317
+ }
318
+ }
319
+ }
320
+ },
321
+ "responses": {
322
+ "200": {
323
+ "description": "Team updated",
324
+ "content": {
325
+ "application/json": {
326
+ "schema": {
327
+ "$ref": "#/components/schemas/TeamResponse"
328
+ }
329
+ }
330
+ }
331
+ }
332
+ }
333
+ }
334
+ },
335
+ "/v1/teams/{teamId}/api-keys": {
336
+ "get": {
337
+ "summary": "List team API keys",
338
+ "security": [
339
+ {
340
+ "apiKeyHeader": []
341
+ }
342
+ ],
343
+ "parameters": [
344
+ {
345
+ "name": "teamId",
346
+ "in": "path",
347
+ "required": true,
348
+ "schema": {
349
+ "type": "string"
350
+ }
351
+ },
352
+ {
353
+ "name": "limit",
354
+ "in": "query",
355
+ "required": false,
356
+ "schema": {
357
+ "type": "integer",
358
+ "minimum": 1,
359
+ "maximum": 200,
360
+ "default": 50
361
+ }
362
+ },
363
+ {
364
+ "name": "cursor",
365
+ "in": "query",
366
+ "required": false,
367
+ "schema": {
368
+ "type": "string"
369
+ }
370
+ }
371
+ ],
372
+ "responses": {
373
+ "200": {
374
+ "description": "API keys",
375
+ "content": {
376
+ "application/json": {
377
+ "schema": {
378
+ "$ref": "#/components/schemas/ApiKeyListResponse"
379
+ }
380
+ }
381
+ }
382
+ }
383
+ }
384
+ },
385
+ "post": {
386
+ "summary": "Create a team API key pair",
387
+ "security": [
388
+ {
389
+ "apiKeyHeader": []
390
+ }
391
+ ],
392
+ "parameters": [
393
+ {
394
+ "name": "teamId",
395
+ "in": "path",
396
+ "required": true,
397
+ "schema": {
398
+ "type": "string"
399
+ }
400
+ }
401
+ ],
402
+ "requestBody": {
403
+ "required": true,
404
+ "content": {
405
+ "application/json": {
406
+ "schema": {
407
+ "$ref": "#/components/schemas/CreateApiKeyRequest"
408
+ }
409
+ }
410
+ }
411
+ },
412
+ "responses": {
413
+ "201": {
414
+ "description": "API key pair created",
415
+ "content": {
416
+ "application/json": {
417
+ "schema": {
418
+ "$ref": "#/components/schemas/ApiKeyResponse"
419
+ }
420
+ }
421
+ }
422
+ }
423
+ }
424
+ }
425
+ },
426
+ "/v1/teams/{teamId}/api-keys/{keyId}": {
427
+ "delete": {
428
+ "summary": "Revoke a team API key",
429
+ "security": [
430
+ {
431
+ "apiKeyHeader": []
432
+ }
433
+ ],
434
+ "parameters": [
435
+ {
436
+ "name": "teamId",
437
+ "in": "path",
438
+ "required": true,
439
+ "schema": {
440
+ "type": "string"
441
+ }
442
+ },
443
+ {
444
+ "name": "keyId",
445
+ "in": "path",
446
+ "required": true,
447
+ "schema": {
448
+ "type": "string"
449
+ }
450
+ }
451
+ ],
452
+ "responses": {
453
+ "204": {
454
+ "description": "API key revoked"
455
+ }
456
+ }
457
+ }
458
+ },
459
+ "/v1/teams/{teamId}/api-keys/{keyId}/rotations": {
460
+ "post": {
461
+ "summary": "Rotate a team API key pair",
462
+ "security": [
463
+ {
464
+ "apiKeyHeader": []
465
+ }
466
+ ],
467
+ "parameters": [
468
+ {
469
+ "name": "teamId",
470
+ "in": "path",
471
+ "required": true,
472
+ "schema": {
473
+ "type": "string"
474
+ }
475
+ },
476
+ {
477
+ "name": "keyId",
478
+ "in": "path",
479
+ "required": true,
480
+ "schema": {
481
+ "type": "string"
482
+ }
483
+ }
484
+ ],
485
+ "responses": {
486
+ "201": {
487
+ "description": "API key pair rotated",
488
+ "content": {
489
+ "application/json": {
490
+ "schema": {
491
+ "$ref": "#/components/schemas/ApiKeyResponse"
492
+ }
493
+ }
494
+ }
495
+ }
496
+ }
497
+ }
498
+ }
499
+ },
500
+ "components": {
501
+ "schemas": {
502
+ "TripwireFieldError": {
503
+ "type": "object",
504
+ "required": [
505
+ "field",
506
+ "issue"
507
+ ],
508
+ "properties": {
509
+ "field": {
510
+ "type": "string"
511
+ },
512
+ "issue": {
513
+ "type": "string"
514
+ },
515
+ "expected": {
516
+ "type": "string"
517
+ },
518
+ "received": {
519
+ "oneOf": [
520
+ {
521
+ "type": "string"
522
+ },
523
+ {
524
+ "type": "number"
525
+ },
526
+ {
527
+ "type": "boolean"
528
+ },
529
+ {
530
+ "type": "null"
531
+ }
532
+ ]
533
+ }
534
+ }
535
+ },
536
+ "TripwireErrorDetails": {
537
+ "type": "object",
538
+ "properties": {
539
+ "fieldErrors": {
540
+ "type": "array",
541
+ "items": {
542
+ "$ref": "#/components/schemas/TripwireFieldError"
543
+ }
544
+ },
545
+ "allowedValues": {
546
+ "type": "array",
547
+ "items": {
548
+ "type": "string"
549
+ }
550
+ },
551
+ "header": {
552
+ "type": "string"
553
+ },
554
+ "query": {
555
+ "type": "string"
556
+ },
557
+ "nextAction": {
558
+ "type": "string",
559
+ "enum": [
560
+ "retry",
561
+ "new_session",
562
+ "reload_bundle",
563
+ "contact_support"
564
+ ]
565
+ }
566
+ }
567
+ },
568
+ "PublicError": {
569
+ "type": "object",
570
+ "required": [
571
+ "code",
572
+ "message",
573
+ "status",
574
+ "retryable",
575
+ "requestId"
576
+ ],
577
+ "properties": {
578
+ "code": {
579
+ "type": "string",
580
+ "example": "auth.missing_api_key"
581
+ },
582
+ "message": {
583
+ "type": "string",
584
+ "example": "Missing Authorization header. Send Authorization: Bearer <token> to authenticate this request."
585
+ },
586
+ "status": {
587
+ "type": "integer",
588
+ "example": 401
589
+ },
590
+ "retryable": {
591
+ "type": "boolean",
592
+ "example": false
593
+ },
594
+ "requestId": {
595
+ "type": "string",
596
+ "example": "req_0123456789abcdef"
597
+ },
598
+ "docsUrl": {
599
+ "type": "string",
600
+ "format": "uri",
601
+ "example": "https://tripwirejs.com/docs/api-reference/introduction"
602
+ },
603
+ "details": {
604
+ "$ref": "#/components/schemas/TripwireErrorDetails"
605
+ }
606
+ }
607
+ },
608
+ "Error": {
609
+ "type": "object",
610
+ "required": [
611
+ "error"
612
+ ],
613
+ "properties": {
614
+ "error": {
615
+ "$ref": "#/components/schemas/PublicError"
616
+ }
617
+ },
618
+ "example": {
619
+ "error": {
620
+ "code": "auth.missing_api_key",
621
+ "message": "Missing Authorization header. Send Authorization: Bearer <token> to authenticate this request.",
622
+ "status": 401,
623
+ "retryable": false,
624
+ "requestId": "req_0123456789abcdef",
625
+ "docsUrl": "https://tripwirejs.com/docs/api-reference/introduction"
626
+ }
627
+ }
628
+ },
629
+ "CollectSessionResponse": {
630
+ "type": "object",
631
+ "required": [
632
+ "sessionId",
633
+ "challenge",
634
+ "serverPublicKey",
635
+ "nonce"
636
+ ],
637
+ "properties": {
638
+ "sessionId": {
639
+ "type": "string"
640
+ },
641
+ "challenge": {
642
+ "type": "string"
643
+ },
644
+ "serverPublicKey": {
645
+ "type": "string"
646
+ },
647
+ "timingNonce": {
648
+ "type": "string"
649
+ },
650
+ "nonce": {
651
+ "type": "string"
652
+ },
653
+ "canvasChallenge": {
654
+ "type": "object",
655
+ "additionalProperties": true
656
+ }
657
+ }
658
+ },
659
+ "CollectResultResponse": {
660
+ "type": "object",
661
+ "required": [
662
+ "sessionId",
663
+ "sealedToken",
664
+ "nonce"
665
+ ],
666
+ "properties": {
667
+ "sessionId": {
668
+ "type": "string"
669
+ },
670
+ "sealedToken": {
671
+ "type": "string"
672
+ },
673
+ "nonce": {
674
+ "type": "string"
675
+ },
676
+ "integrity": {
677
+ "$ref": "#/components/schemas/ResponseIntegrity"
678
+ },
679
+ "debug": {
680
+ "type": "object",
681
+ "additionalProperties": true
682
+ }
683
+ }
684
+ },
685
+ "ResultSummary": {
686
+ "type": "object",
687
+ "required": [
688
+ "eventId",
689
+ "verdict",
690
+ "riskScore",
691
+ "scoredAt"
692
+ ],
693
+ "properties": {
694
+ "eventId": {
695
+ "type": "string"
696
+ },
697
+ "verdict": {
698
+ "type": "string"
699
+ },
700
+ "riskScore": {
701
+ "type": "integer"
702
+ },
703
+ "phase": {
704
+ "type": [
705
+ "string",
706
+ "null"
707
+ ]
708
+ },
709
+ "provisional": {
710
+ "type": [
711
+ "boolean",
712
+ "null"
713
+ ]
714
+ },
715
+ "manipulationScore": {
716
+ "type": [
717
+ "integer",
718
+ "null"
719
+ ]
720
+ },
721
+ "manipulationVerdict": {
722
+ "type": [
723
+ "string",
724
+ "null"
725
+ ]
726
+ },
727
+ "evaluationDuration": {
728
+ "type": [
729
+ "integer",
730
+ "null"
731
+ ]
732
+ },
733
+ "scoredAt": {
734
+ "type": "string",
735
+ "format": "date-time"
736
+ }
737
+ }
738
+ },
739
+ "FingerprintLink": {
740
+ "type": [
741
+ "object",
742
+ "null"
743
+ ],
744
+ "properties": {
745
+ "visitorId": {
746
+ "type": "string"
747
+ },
748
+ "confidence": {
749
+ "type": "integer"
750
+ },
751
+ "timestamp": {
752
+ "type": "string"
753
+ }
754
+ }
755
+ },
756
+ "SessionSummary": {
757
+ "type": "object",
758
+ "required": [
759
+ "object",
760
+ "id",
761
+ "createdAt",
762
+ "latestEventId",
763
+ "latestResult",
764
+ "fingerprint",
765
+ "lastScoredAt"
766
+ ],
767
+ "properties": {
768
+ "object": {
769
+ "type": "string",
770
+ "enum": [
771
+ "session"
772
+ ]
773
+ },
774
+ "id": {
775
+ "type": "string"
776
+ },
777
+ "createdAt": {
778
+ "type": [
779
+ "string",
780
+ "null"
781
+ ],
782
+ "format": "date-time"
783
+ },
784
+ "latestEventId": {
785
+ "type": "string"
786
+ },
787
+ "latestResult": {
788
+ "$ref": "#/components/schemas/ResultSummary"
789
+ },
790
+ "fingerprint": {
791
+ "$ref": "#/components/schemas/FingerprintReference"
792
+ },
793
+ "lastScoredAt": {
794
+ "type": "string",
795
+ "format": "date-time"
796
+ }
797
+ }
798
+ },
799
+ "SessionDetail": {
800
+ "type": "object",
801
+ "required": [
802
+ "object",
803
+ "id",
804
+ "createdAt",
805
+ "latestEventId",
806
+ "latestResult",
807
+ "fingerprint",
808
+ "resultHistory"
809
+ ],
810
+ "properties": {
811
+ "object": {
812
+ "type": "string",
813
+ "enum": [
814
+ "session"
815
+ ]
816
+ },
817
+ "id": {
818
+ "type": "string"
819
+ },
820
+ "createdAt": {
821
+ "type": [
822
+ "string",
823
+ "null"
824
+ ],
825
+ "format": "date-time"
826
+ },
827
+ "latestEventId": {
828
+ "type": "string"
829
+ },
830
+ "latestResult": {
831
+ "$ref": "#/components/schemas/SessionLatestResultDetail"
832
+ },
833
+ "fingerprint": {
834
+ "$ref": "#/components/schemas/FingerprintReference"
835
+ },
836
+ "resultHistory": {
837
+ "type": "array",
838
+ "items": {
839
+ "$ref": "#/components/schemas/ResultSummary"
840
+ }
841
+ }
842
+ }
843
+ },
844
+ "SessionsListResponse": {
845
+ "type": "object",
846
+ "required": [
847
+ "data",
848
+ "pagination"
849
+ ],
850
+ "properties": {
851
+ "data": {
852
+ "type": "array",
853
+ "items": {
854
+ "$ref": "#/components/schemas/SessionSummary"
855
+ }
856
+ },
857
+ "pagination": {
858
+ "$ref": "#/components/schemas/CursorPagination"
859
+ }
860
+ }
861
+ },
862
+ "FingerprintSummary": {
863
+ "type": "object",
864
+ "required": [
865
+ "object",
866
+ "id",
867
+ "firstSeenAt",
868
+ "lastSeenAt",
869
+ "seenCount",
870
+ "lastUserAgent",
871
+ "lastIp",
872
+ "expiresAt"
873
+ ],
874
+ "properties": {
875
+ "object": {
876
+ "type": "string",
877
+ "enum": [
878
+ "fingerprint"
879
+ ]
880
+ },
881
+ "id": {
882
+ "type": "string"
883
+ },
884
+ "firstSeenAt": {
885
+ "type": "string",
886
+ "format": "date-time"
887
+ },
888
+ "lastSeenAt": {
889
+ "type": "string",
890
+ "format": "date-time"
891
+ },
892
+ "seenCount": {
893
+ "type": "integer"
894
+ },
895
+ "lastUserAgent": {
896
+ "type": "string"
897
+ },
898
+ "lastIp": {
899
+ "type": "string"
900
+ },
901
+ "expiresAt": {
902
+ "type": "string",
903
+ "format": "date-time"
904
+ },
905
+ "anchorWebglHash": {
906
+ "type": [
907
+ "string",
908
+ "null"
909
+ ]
910
+ },
911
+ "anchorParamsHash": {
912
+ "type": [
913
+ "string",
914
+ "null"
915
+ ]
916
+ },
917
+ "anchorAudioHash": {
918
+ "type": [
919
+ "string",
920
+ "null"
921
+ ]
922
+ },
923
+ "fingerprintVector": {
924
+ "type": "array",
925
+ "items": {
926
+ "type": "number"
927
+ }
928
+ },
929
+ "hasCookie": {
930
+ "type": "boolean"
931
+ },
932
+ "hasLs": {
933
+ "type": "boolean"
934
+ },
935
+ "hasIdb": {
936
+ "type": "boolean"
937
+ },
938
+ "hasSw": {
939
+ "type": "boolean"
940
+ },
941
+ "hasWn": {
942
+ "type": "boolean"
943
+ }
944
+ }
945
+ },
946
+ "FingerprintDetail": {
947
+ "allOf": [
948
+ {
949
+ "$ref": "#/components/schemas/FingerprintSummary"
950
+ },
951
+ {
952
+ "type": "object",
953
+ "properties": {
954
+ "sessions": {
955
+ "type": "array",
956
+ "items": {
957
+ "type": "object",
958
+ "properties": {
959
+ "eventId": {
960
+ "type": "string"
961
+ },
962
+ "verdict": {
963
+ "type": "string"
964
+ },
965
+ "riskScore": {
966
+ "type": "integer"
967
+ },
968
+ "scoredAt": {
969
+ "type": "string",
970
+ "format": "date-time"
971
+ },
972
+ "userAgent": {
973
+ "type": "string"
974
+ },
975
+ "url": {
976
+ "type": "string"
977
+ },
978
+ "clientIp": {
979
+ "type": "string"
980
+ },
981
+ "screenSize": {
982
+ "type": [
983
+ "string",
984
+ "null"
985
+ ]
986
+ },
987
+ "categoryScores": {
988
+ "type": [
989
+ "object",
990
+ "null"
991
+ ],
992
+ "additionalProperties": {
993
+ "type": "integer"
994
+ }
995
+ }
996
+ }
997
+ }
998
+ }
999
+ }
1000
+ }
1001
+ ]
1002
+ },
1003
+ "FingerprintsListResponse": {
1004
+ "type": "object",
1005
+ "required": [
1006
+ "data",
1007
+ "pagination"
1008
+ ],
1009
+ "properties": {
1010
+ "data": {
1011
+ "type": "array",
1012
+ "items": {
1013
+ "$ref": "#/components/schemas/FingerprintSummary"
1014
+ }
1015
+ },
1016
+ "pagination": {
1017
+ "$ref": "#/components/schemas/CursorPagination"
1018
+ }
1019
+ }
1020
+ },
1021
+ "CreateTeamRequest": {
1022
+ "type": "object",
1023
+ "required": [
1024
+ "name",
1025
+ "slug"
1026
+ ],
1027
+ "properties": {
1028
+ "name": {
1029
+ "type": "string"
1030
+ },
1031
+ "slug": {
1032
+ "type": "string"
1033
+ }
1034
+ }
1035
+ },
1036
+ "UpdateTeamRequest": {
1037
+ "type": "object",
1038
+ "properties": {
1039
+ "name": {
1040
+ "type": "string"
1041
+ },
1042
+ "status": {
1043
+ "type": "string"
1044
+ }
1045
+ }
1046
+ },
1047
+ "Team": {
1048
+ "type": "object",
1049
+ "required": [
1050
+ "object",
1051
+ "id",
1052
+ "name",
1053
+ "slug",
1054
+ "status",
1055
+ "createdAt",
1056
+ "updatedAt"
1057
+ ],
1058
+ "properties": {
1059
+ "object": {
1060
+ "type": "string",
1061
+ "enum": [
1062
+ "team"
1063
+ ]
1064
+ },
1065
+ "id": {
1066
+ "type": "string"
1067
+ },
1068
+ "name": {
1069
+ "type": "string"
1070
+ },
1071
+ "slug": {
1072
+ "type": "string"
1073
+ },
1074
+ "status": {
1075
+ "type": "string"
1076
+ },
1077
+ "createdAt": {
1078
+ "type": "string",
1079
+ "format": "date-time"
1080
+ },
1081
+ "updatedAt": {
1082
+ "type": [
1083
+ "string",
1084
+ "null"
1085
+ ],
1086
+ "format": "date-time"
1087
+ }
1088
+ }
1089
+ },
1090
+ "CreateApiKeyRequest": {
1091
+ "type": "object",
1092
+ "properties": {
1093
+ "name": {
1094
+ "type": "string"
1095
+ },
1096
+ "isTest": {
1097
+ "type": "boolean"
1098
+ },
1099
+ "allowedOrigins": {
1100
+ "type": "array",
1101
+ "items": {
1102
+ "type": "string"
1103
+ }
1104
+ },
1105
+ "rateLimit": {
1106
+ "type": "integer"
1107
+ }
1108
+ }
1109
+ },
1110
+ "ApiKey": {
1111
+ "type": "object",
1112
+ "required": [
1113
+ "object",
1114
+ "id",
1115
+ "key",
1116
+ "name",
1117
+ "isTest",
1118
+ "status",
1119
+ "createdAt"
1120
+ ],
1121
+ "properties": {
1122
+ "object": {
1123
+ "type": "string",
1124
+ "enum": [
1125
+ "api_key"
1126
+ ]
1127
+ },
1128
+ "id": {
1129
+ "type": "string"
1130
+ },
1131
+ "key": {
1132
+ "type": "string"
1133
+ },
1134
+ "name": {
1135
+ "type": "string"
1136
+ },
1137
+ "isTest": {
1138
+ "type": "boolean"
1139
+ },
1140
+ "allowedOrigins": {
1141
+ "type": [
1142
+ "array",
1143
+ "null"
1144
+ ],
1145
+ "items": {
1146
+ "type": "string"
1147
+ }
1148
+ },
1149
+ "rateLimit": {
1150
+ "type": [
1151
+ "integer",
1152
+ "null"
1153
+ ]
1154
+ },
1155
+ "status": {
1156
+ "type": "string"
1157
+ },
1158
+ "createdAt": {
1159
+ "type": "string",
1160
+ "format": "date-time"
1161
+ },
1162
+ "rotatedAt": {
1163
+ "type": [
1164
+ "string",
1165
+ "null"
1166
+ ],
1167
+ "format": "date-time"
1168
+ },
1169
+ "revokedAt": {
1170
+ "type": [
1171
+ "string",
1172
+ "null"
1173
+ ],
1174
+ "format": "date-time"
1175
+ }
1176
+ }
1177
+ },
1178
+ "IssuedApiKey": {
1179
+ "allOf": [
1180
+ {
1181
+ "$ref": "#/components/schemas/ApiKey"
1182
+ },
1183
+ {
1184
+ "type": "object",
1185
+ "required": [
1186
+ "secretKey"
1187
+ ],
1188
+ "properties": {
1189
+ "secretKey": {
1190
+ "type": "string"
1191
+ }
1192
+ }
1193
+ }
1194
+ ]
1195
+ },
1196
+ "ApiKeyListResponse": {
1197
+ "type": "object",
1198
+ "required": [
1199
+ "data",
1200
+ "pagination"
1201
+ ],
1202
+ "properties": {
1203
+ "data": {
1204
+ "type": "array",
1205
+ "items": {
1206
+ "$ref": "#/components/schemas/ApiKey"
1207
+ }
1208
+ },
1209
+ "pagination": {
1210
+ "$ref": "#/components/schemas/CursorPagination"
1211
+ }
1212
+ }
1213
+ },
1214
+ "ResponseIntegrity": {
1215
+ "type": "object",
1216
+ "required": [
1217
+ "responseHmac"
1218
+ ],
1219
+ "properties": {
1220
+ "responseHmac": {
1221
+ "type": "string"
1222
+ }
1223
+ }
1224
+ },
1225
+ "CursorPagination": {
1226
+ "type": "object",
1227
+ "required": [
1228
+ "limit",
1229
+ "hasMore"
1230
+ ],
1231
+ "properties": {
1232
+ "limit": {
1233
+ "type": "integer"
1234
+ },
1235
+ "hasMore": {
1236
+ "type": "boolean"
1237
+ },
1238
+ "nextCursor": {
1239
+ "type": "string"
1240
+ }
1241
+ }
1242
+ },
1243
+ "CollectBatchResponse": {
1244
+ "type": "object",
1245
+ "required": [
1246
+ "ack",
1247
+ "nonce",
1248
+ "seq"
1249
+ ],
1250
+ "properties": {
1251
+ "ack": {
1252
+ "type": "boolean"
1253
+ },
1254
+ "nonce": {
1255
+ "type": "string"
1256
+ },
1257
+ "seq": {
1258
+ "type": "integer"
1259
+ },
1260
+ "next": {
1261
+ "type": "object",
1262
+ "required": [
1263
+ "intervalMs"
1264
+ ],
1265
+ "properties": {
1266
+ "intervalMs": {
1267
+ "type": "integer"
1268
+ }
1269
+ }
1270
+ },
1271
+ "debug": {
1272
+ "type": "object",
1273
+ "properties": {
1274
+ "observeReduceMs": {
1275
+ "type": "integer"
1276
+ }
1277
+ },
1278
+ "additionalProperties": true
1279
+ }
1280
+ }
1281
+ },
1282
+ "CollectFingerprintResponse": {
1283
+ "type": "object",
1284
+ "required": [
1285
+ "ready",
1286
+ "timestamp",
1287
+ "sessionId"
1288
+ ],
1289
+ "properties": {
1290
+ "ready": {
1291
+ "type": "boolean"
1292
+ },
1293
+ "timestamp": {
1294
+ "type": "integer"
1295
+ },
1296
+ "sessionId": {
1297
+ "type": "string"
1298
+ },
1299
+ "integrity": {
1300
+ "$ref": "#/components/schemas/ResponseIntegrity"
1301
+ },
1302
+ "debug": {
1303
+ "type": "object",
1304
+ "additionalProperties": true
1305
+ }
1306
+ }
1307
+ },
1308
+ "SessionLatestResultDetail": {
1309
+ "allOf": [
1310
+ {
1311
+ "$ref": "#/components/schemas/ResultSummary"
1312
+ },
1313
+ {
1314
+ "type": "object",
1315
+ "properties": {
1316
+ "visitorId": {
1317
+ "type": [
1318
+ "string",
1319
+ "null"
1320
+ ]
1321
+ },
1322
+ "metadata": {
1323
+ "type": "object",
1324
+ "properties": {
1325
+ "userAgent": {
1326
+ "type": "string"
1327
+ },
1328
+ "url": {
1329
+ "type": "string"
1330
+ },
1331
+ "screenSize": {
1332
+ "type": [
1333
+ "string",
1334
+ "null"
1335
+ ]
1336
+ },
1337
+ "touchDevice": {
1338
+ "type": [
1339
+ "boolean",
1340
+ "null"
1341
+ ]
1342
+ },
1343
+ "clientIp": {
1344
+ "type": "string"
1345
+ }
1346
+ },
1347
+ "additionalProperties": false
1348
+ }
1349
+ }
1350
+ }
1351
+ ]
1352
+ },
1353
+ "FingerprintReference": {
1354
+ "type": [
1355
+ "object",
1356
+ "null"
1357
+ ],
1358
+ "properties": {
1359
+ "object": {
1360
+ "type": "string",
1361
+ "enum": [
1362
+ "fingerprint"
1363
+ ]
1364
+ },
1365
+ "id": {
1366
+ "type": "string"
1367
+ },
1368
+ "confidence": {
1369
+ "type": [
1370
+ "integer",
1371
+ "null"
1372
+ ]
1373
+ },
1374
+ "timestamp": {
1375
+ "type": [
1376
+ "string",
1377
+ "null"
1378
+ ],
1379
+ "format": "date-time"
1380
+ }
1381
+ }
1382
+ },
1383
+ "SessionDetailResponse": {
1384
+ "type": "object",
1385
+ "required": [
1386
+ "data"
1387
+ ],
1388
+ "properties": {
1389
+ "data": {
1390
+ "$ref": "#/components/schemas/SessionDetail"
1391
+ }
1392
+ }
1393
+ },
1394
+ "FingerprintDetailResponse": {
1395
+ "type": "object",
1396
+ "required": [
1397
+ "data"
1398
+ ],
1399
+ "properties": {
1400
+ "data": {
1401
+ "$ref": "#/components/schemas/FingerprintDetail"
1402
+ }
1403
+ }
1404
+ },
1405
+ "TeamResponse": {
1406
+ "type": "object",
1407
+ "required": [
1408
+ "data"
1409
+ ],
1410
+ "properties": {
1411
+ "data": {
1412
+ "$ref": "#/components/schemas/Team"
1413
+ }
1414
+ }
1415
+ },
1416
+ "ApiKeyResponse": {
1417
+ "type": "object",
1418
+ "required": [
1419
+ "data"
1420
+ ],
1421
+ "properties": {
1422
+ "data": {
1423
+ "$ref": "#/components/schemas/IssuedApiKey"
1424
+ }
1425
+ }
1426
+ }
1427
+ },
1428
+ "securitySchemes": {
1429
+ "apiKeyHeader": {
1430
+ "type": "http",
1431
+ "scheme": "bearer"
1432
+ }
1433
+ }
1434
+ }
1435
+ }