@brigadasos/nadeshiko-sdk 1.3.0 → 1.4.0-dev.28a0384

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.
Files changed (69) hide show
  1. package/README.md +105 -2
  2. package/dist/client/client.gen.d.ts.map +1 -0
  3. package/dist/client/index.d.ts.map +1 -0
  4. package/dist/client/types.gen.d.ts.map +1 -0
  5. package/dist/client/utils.gen.d.ts.map +1 -0
  6. package/dist/client.gen.d.ts.map +1 -0
  7. package/dist/core/auth.gen.d.ts.map +1 -0
  8. package/dist/core/bodySerializer.gen.d.ts.map +1 -0
  9. package/dist/core/params.gen.d.ts.map +1 -0
  10. package/dist/core/pathSerializer.gen.d.ts.map +1 -0
  11. package/dist/core/queryKeySerializer.gen.d.ts.map +1 -0
  12. package/dist/core/serverSentEvents.gen.d.ts.map +1 -0
  13. package/dist/core/types.gen.d.ts.map +1 -0
  14. package/dist/core/utils.gen.d.ts.map +1 -0
  15. package/dist/index.cjs +622 -55
  16. package/dist/index.cjs.map +5 -5
  17. package/dist/index.d.ts +6 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +629 -51
  20. package/dist/index.js.map +5 -5
  21. package/dist/internal/admin.gen.d.ts +2 -0
  22. package/dist/internal/admin.gen.d.ts.map +1 -0
  23. package/dist/internal/media.gen.d.ts +2 -0
  24. package/dist/internal/media.gen.d.ts.map +1 -0
  25. package/dist/internal/user.gen.d.ts +2 -0
  26. package/dist/internal/user.gen.d.ts.map +1 -0
  27. package/dist/internal.gen.d.ts +4 -0
  28. package/dist/internal.gen.d.ts.map +1 -0
  29. package/dist/nadeshiko.gen.d.ts +79 -0
  30. package/dist/nadeshiko.gen.d.ts.map +1 -0
  31. package/dist/sdk.gen.d.ts +660 -0
  32. package/dist/sdk.gen.d.ts.map +1 -0
  33. package/dist/types.gen.d.ts +5121 -0
  34. package/dist/types.gen.d.ts.map +1 -0
  35. package/package.json +4 -8
  36. package/dist/generated/client/client.gen.d.ts.map +0 -1
  37. package/dist/generated/client/index.d.ts.map +0 -1
  38. package/dist/generated/client/types.gen.d.ts.map +0 -1
  39. package/dist/generated/client/utils.gen.d.ts.map +0 -1
  40. package/dist/generated/client.gen.d.ts.map +0 -1
  41. package/dist/generated/core/auth.gen.d.ts.map +0 -1
  42. package/dist/generated/core/bodySerializer.gen.d.ts.map +0 -1
  43. package/dist/generated/core/params.gen.d.ts.map +0 -1
  44. package/dist/generated/core/pathSerializer.gen.d.ts.map +0 -1
  45. package/dist/generated/core/queryKeySerializer.gen.d.ts.map +0 -1
  46. package/dist/generated/core/serverSentEvents.gen.d.ts.map +0 -1
  47. package/dist/generated/core/types.gen.d.ts.map +0 -1
  48. package/dist/generated/core/utils.gen.d.ts.map +0 -1
  49. package/dist/generated/index.d.ts +0 -6
  50. package/dist/generated/index.d.ts.map +0 -1
  51. package/dist/generated/nadeshiko.gen.d.ts +0 -27
  52. package/dist/generated/nadeshiko.gen.d.ts.map +0 -1
  53. package/dist/generated/sdk.gen.d.ts +0 -257
  54. package/dist/generated/sdk.gen.d.ts.map +0 -1
  55. package/dist/generated/types.gen.d.ts +0 -2001
  56. package/dist/generated/types.gen.d.ts.map +0 -1
  57. /package/dist/{generated/client → client}/client.gen.d.ts +0 -0
  58. /package/dist/{generated/client → client}/index.d.ts +0 -0
  59. /package/dist/{generated/client → client}/types.gen.d.ts +0 -0
  60. /package/dist/{generated/client → client}/utils.gen.d.ts +0 -0
  61. /package/dist/{generated/client.gen.d.ts → client.gen.d.ts} +0 -0
  62. /package/dist/{generated/core → core}/auth.gen.d.ts +0 -0
  63. /package/dist/{generated/core → core}/bodySerializer.gen.d.ts +0 -0
  64. /package/dist/{generated/core → core}/params.gen.d.ts +0 -0
  65. /package/dist/{generated/core → core}/pathSerializer.gen.d.ts +0 -0
  66. /package/dist/{generated/core → core}/queryKeySerializer.gen.d.ts +0 -0
  67. /package/dist/{generated/core → core}/serverSentEvents.gen.d.ts +0 -0
  68. /package/dist/{generated/core → core}/types.gen.d.ts +0 -0
  69. /package/dist/{generated/core → core}/utils.gen.d.ts +0 -0
@@ -0,0 +1,5121 @@
1
+ export type ClientOptions = {
2
+ baseUrl: 'http://localhost:5000' | 'https://api.nadeshiko.co' | (string & {});
3
+ };
4
+ /**
5
+ * A media filter entry with optional episode restriction
6
+ */
7
+ export type MediaFilterItem = {
8
+ /**
9
+ * Media ID to filter
10
+ */
11
+ mediaId: number;
12
+ /**
13
+ * Specific episodes (omit for all episodes)
14
+ */
15
+ episodes?: Array<number>;
16
+ };
17
+ /**
18
+ * Media category type
19
+ */
20
+ export type Category = 'ANIME' | 'JDRAMA';
21
+ /**
22
+ * Content rating level for the segment
23
+ */
24
+ export type ContentRating = 'SAFE' | 'SUGGESTIVE' | 'QUESTIONABLE' | 'EXPLICIT';
25
+ /**
26
+ * Search filters for narrowing segment results
27
+ */
28
+ export type SearchFilters = {
29
+ /**
30
+ * Media inclusion/exclusion filters
31
+ */
32
+ media?: {
33
+ /**
34
+ * Include only segments from these media (with optional episode filter)
35
+ */
36
+ include?: Array<MediaFilterItem>;
37
+ /**
38
+ * Exclude segments from these media (with optional episode filter)
39
+ */
40
+ exclude?: Array<MediaFilterItem>;
41
+ };
42
+ /**
43
+ * Media category filter
44
+ */
45
+ category?: Array<Category>;
46
+ /**
47
+ * Content ratings to include (omit for all ratings)
48
+ */
49
+ contentRating?: Array<ContentRating>;
50
+ /**
51
+ * Segment status filter
52
+ */
53
+ status?: Array<'DELETED' | 'ACTIVE' | 'SUSPENDED' | 'VERIFIED' | 'INVALID' | 'TOO_LONG'>;
54
+ /**
55
+ * Content character count range filter
56
+ */
57
+ segmentLengthChars?: {
58
+ /**
59
+ * Minimum content length
60
+ */
61
+ min?: number;
62
+ /**
63
+ * Maximum content length
64
+ */
65
+ max?: number;
66
+ };
67
+ /**
68
+ * Segment audio duration range filter (in milliseconds)
69
+ */
70
+ segmentDurationMs?: {
71
+ /**
72
+ * Minimum duration in ms
73
+ */
74
+ min?: number;
75
+ /**
76
+ * Maximum duration in ms
77
+ */
78
+ max?: number;
79
+ };
80
+ };
81
+ /**
82
+ * Resource to expand in the response includes block
83
+ */
84
+ export type IncludeExpansion = 'media';
85
+ export type SearchRequest = {
86
+ /**
87
+ * What to search for (omit for queryless browse)
88
+ */
89
+ query?: {
90
+ /**
91
+ * Search expression (supports boolean operators, wildcards, phrase matching)
92
+ */
93
+ search?: string;
94
+ /**
95
+ * Whether to use exact phrase matching
96
+ */
97
+ exactMatch?: boolean;
98
+ };
99
+ /**
100
+ * Max amount of entries by response
101
+ */
102
+ limit?: number;
103
+ /**
104
+ * Current page of search
105
+ */
106
+ cursor?: Array<number>;
107
+ /**
108
+ * Sort configuration
109
+ */
110
+ sort?: {
111
+ /**
112
+ * Sort mode
113
+ */
114
+ mode?: 'ASC' | 'DESC' | 'NONE' | 'TIME_ASC' | 'TIME_DESC' | 'RANDOM';
115
+ /**
116
+ * Non-negative integer seed for deterministic random sorting (only used when mode is RANDOM)
117
+ */
118
+ seed?: number;
119
+ };
120
+ filters?: SearchFilters;
121
+ /**
122
+ * Resources to expand in the response includes block
123
+ */
124
+ include?: Array<IncludeExpansion>;
125
+ };
126
+ /**
127
+ * Segment with content, optional highlights, and media URLs
128
+ */
129
+ export type Segment = {
130
+ /**
131
+ * Unique identifier for the segment
132
+ */
133
+ uuid: string;
134
+ /**
135
+ * Position of the segment within the episode
136
+ */
137
+ position: number;
138
+ /**
139
+ * Segment status
140
+ */
141
+ status: 'DELETED' | 'ACTIVE' | 'SUSPENDED' | 'VERIFIED' | 'INVALID' | 'TOO_LONG';
142
+ /**
143
+ * Start time of the segment in milliseconds from the beginning of the episode
144
+ */
145
+ startTimeMs: number;
146
+ /**
147
+ * End time of the segment in milliseconds from the beginning of the episode
148
+ */
149
+ endTimeMs: number;
150
+ contentRating: ContentRating;
151
+ /**
152
+ * Episode number this segment belongs to
153
+ */
154
+ episode: number;
155
+ /**
156
+ * Media ID this segment belongs to
157
+ */
158
+ mediaId: number;
159
+ textJa: {
160
+ /**
161
+ * Original Japanese content
162
+ */
163
+ content: string;
164
+ /**
165
+ * Japanese content with search terms highlighted
166
+ */
167
+ highlight?: string;
168
+ };
169
+ textEn: {
170
+ /**
171
+ * English translation
172
+ */
173
+ content: string;
174
+ /**
175
+ * Whether the translation was machine-translated
176
+ */
177
+ isMachineTranslated: boolean;
178
+ /**
179
+ * English content with search terms highlighted
180
+ */
181
+ highlight?: string;
182
+ };
183
+ textEs: {
184
+ /**
185
+ * Spanish translation
186
+ */
187
+ content: string;
188
+ /**
189
+ * Whether the translation was machine-translated
190
+ */
191
+ isMachineTranslated: boolean;
192
+ /**
193
+ * Spanish content with search terms highlighted
194
+ */
195
+ highlight?: string;
196
+ };
197
+ /**
198
+ * URLs to media resources for this segment
199
+ */
200
+ urls: {
201
+ /**
202
+ * URL to the subtitle image snapshot
203
+ */
204
+ imageUrl: string;
205
+ /**
206
+ * URL to the audio clip for this segment
207
+ */
208
+ audioUrl: string;
209
+ /**
210
+ * URL to the video clip for this segment
211
+ */
212
+ videoUrl: string;
213
+ };
214
+ };
215
+ /**
216
+ * Map of external IDs keyed by source. Only sources with values are included.
217
+ */
218
+ export type ExternalId = {
219
+ /**
220
+ * AniList ID
221
+ */
222
+ anilist?: string;
223
+ /**
224
+ * IMDB ID
225
+ */
226
+ imdb?: string;
227
+ /**
228
+ * TVDB ID
229
+ */
230
+ tvdb?: string;
231
+ };
232
+ /**
233
+ * Japanese voice actor (seiyuu)
234
+ */
235
+ export type Seiyuu = {
236
+ /**
237
+ * AniList staff ID
238
+ */
239
+ id: number;
240
+ /**
241
+ * Japanese name of the voice actor
242
+ */
243
+ nameJa: string;
244
+ /**
245
+ * English name of the voice actor
246
+ */
247
+ nameEn: string;
248
+ /**
249
+ * Profile image URL
250
+ */
251
+ imageUrl: string;
252
+ };
253
+ /**
254
+ * Character appearing in a media with their voice actor and role
255
+ */
256
+ export type MediaCharacter = {
257
+ /**
258
+ * AniList character ID
259
+ */
260
+ id: number;
261
+ /**
262
+ * Japanese name of the character
263
+ */
264
+ nameJa: string;
265
+ /**
266
+ * English name of the character
267
+ */
268
+ nameEn: string;
269
+ /**
270
+ * Character image URL
271
+ */
272
+ imageUrl: string;
273
+ seiyuu: Seiyuu;
274
+ /**
275
+ * Character's role in the media
276
+ */
277
+ role: 'MAIN' | 'SUPPORTING' | 'BACKGROUND';
278
+ };
279
+ /**
280
+ * Media entry with full metadata
281
+ */
282
+ export type Media = {
283
+ /**
284
+ * Unique identifier for the media
285
+ */
286
+ id: number;
287
+ externalIds: ExternalId;
288
+ /**
289
+ * Original Japanese name of the media
290
+ */
291
+ nameJa: string;
292
+ /**
293
+ * Romaji transliteration of the media name
294
+ */
295
+ nameRomaji: string;
296
+ /**
297
+ * English name of the media
298
+ */
299
+ nameEn: string;
300
+ /**
301
+ * Format of the media release (e.g., TV, OVA, Movie)
302
+ */
303
+ airingFormat: string;
304
+ /**
305
+ * Current airing status (FINISHED, RELEASING, NOT_YET_RELEASED, CANCELLED)
306
+ */
307
+ airingStatus: string;
308
+ /**
309
+ * List of genres associated with the media
310
+ */
311
+ genres: Array<string>;
312
+ /**
313
+ * Full URL to the cover image
314
+ */
315
+ coverUrl: string;
316
+ /**
317
+ * Full URL to the banner image
318
+ */
319
+ bannerUrl: string;
320
+ /**
321
+ * Start date of the media (first airing/release)
322
+ */
323
+ startDate: string;
324
+ /**
325
+ * End date of the media (last airing/release)
326
+ */
327
+ endDate?: string;
328
+ category: Category;
329
+ /**
330
+ * Total number of subtitle segments available
331
+ */
332
+ segmentCount: number;
333
+ /**
334
+ * Total number of episodes available
335
+ */
336
+ episodeCount: number;
337
+ /**
338
+ * Animation studio that produced the media
339
+ */
340
+ studio: string;
341
+ /**
342
+ * Airing season label for the media
343
+ */
344
+ seasonName: string;
345
+ /**
346
+ * Airing year for the media
347
+ */
348
+ seasonYear: number;
349
+ /**
350
+ * Characters appearing in the media with their voice actors
351
+ */
352
+ characters?: Array<MediaCharacter>;
353
+ };
354
+ /**
355
+ * Pagination metadata for search results
356
+ */
357
+ export type PaginationInfo = {
358
+ /**
359
+ * Whether there are more results after this page
360
+ */
361
+ hasMore?: boolean;
362
+ /**
363
+ * Estimated total number of matching segments
364
+ */
365
+ estimatedTotalHits?: number;
366
+ /**
367
+ * Whether estimatedTotalHits is exact or a lower bound
368
+ */
369
+ estimatedTotalHitsRelation?: 'EXACT' | 'LOWER_BOUND';
370
+ /**
371
+ * Cursor for fetching the next page (undefined when hasMore is false)
372
+ */
373
+ cursor?: Array<number>;
374
+ };
375
+ export type SearchResponse = {
376
+ segments?: Array<Segment>;
377
+ includes?: {
378
+ /**
379
+ * Media objects keyed by mediaId
380
+ */
381
+ media?: {
382
+ [key: string]: Media;
383
+ };
384
+ };
385
+ pagination?: PaginationInfo;
386
+ };
387
+ /**
388
+ * Bad Request error response
389
+ */
390
+ export type Error400 = {
391
+ /**
392
+ * Specific error code for programmatic handling
393
+ */
394
+ code: 'VALIDATION_FAILED' | 'INVALID_JSON' | 'INVALID_REQUEST';
395
+ /**
396
+ * A short, human-readable summary of the problem
397
+ */
398
+ title: string;
399
+ /**
400
+ * A human-readable explanation specific to this occurrence
401
+ */
402
+ detail: string;
403
+ /**
404
+ * A URI reference that identifies the problem type (e.g., GitHub issues link)
405
+ */
406
+ type?: string;
407
+ /**
408
+ * A URI reference that identifies the specific occurrence (e.g., trace ID)
409
+ */
410
+ instance?: string;
411
+ /**
412
+ * The HTTP status code
413
+ */
414
+ status: 400;
415
+ /**
416
+ * Optional map of field names to their error messages (for validation errors)
417
+ */
418
+ errors?: {
419
+ [key: string]: string;
420
+ };
421
+ };
422
+ /**
423
+ * Unauthorized error response
424
+ */
425
+ export type Error401 = {
426
+ /**
427
+ * Specific error code for programmatic handling
428
+ */
429
+ code: 'AUTH_CREDENTIALS_REQUIRED' | 'AUTH_CREDENTIALS_INVALID' | 'AUTH_CREDENTIALS_EXPIRED' | 'EMAIL_NOT_VERIFIED';
430
+ /**
431
+ * A short, human-readable summary of the problem
432
+ */
433
+ title: string;
434
+ /**
435
+ * A human-readable explanation specific to this occurrence
436
+ */
437
+ detail: string;
438
+ /**
439
+ * A URI reference that identifies the problem type (e.g., GitHub issues link)
440
+ */
441
+ type?: string;
442
+ /**
443
+ * A URI reference that identifies the specific occurrence (e.g., trace ID)
444
+ */
445
+ instance?: string;
446
+ /**
447
+ * The HTTP status code
448
+ */
449
+ status: 401;
450
+ /**
451
+ * Optional map of field names to their error messages (for validation errors)
452
+ */
453
+ errors?: {
454
+ [key: string]: string;
455
+ };
456
+ };
457
+ /**
458
+ * Forbidden error response
459
+ */
460
+ export type Error403 = {
461
+ /**
462
+ * Specific error code for programmatic handling
463
+ */
464
+ code: 'ACCESS_DENIED' | 'INSUFFICIENT_PERMISSIONS';
465
+ /**
466
+ * A short, human-readable summary of the problem
467
+ */
468
+ title: string;
469
+ /**
470
+ * A human-readable explanation specific to this occurrence
471
+ */
472
+ detail: string;
473
+ /**
474
+ * A URI reference that identifies the problem type (e.g., GitHub issues link)
475
+ */
476
+ type?: string;
477
+ /**
478
+ * A URI reference that identifies the specific occurrence (e.g., trace ID)
479
+ */
480
+ instance?: string;
481
+ /**
482
+ * The HTTP status code
483
+ */
484
+ status: 403;
485
+ /**
486
+ * Optional map of field names to their error messages (for validation errors)
487
+ */
488
+ errors?: {
489
+ [key: string]: string;
490
+ };
491
+ };
492
+ /**
493
+ * Too Many Requests error response
494
+ */
495
+ export type Error429 = {
496
+ /**
497
+ * Specific error code for programmatic handling
498
+ */
499
+ code: 'RATE_LIMIT_EXCEEDED' | 'QUOTA_EXCEEDED';
500
+ /**
501
+ * A short, human-readable summary of the problem
502
+ */
503
+ title: string;
504
+ /**
505
+ * A human-readable explanation specific to this occurrence
506
+ */
507
+ detail: string;
508
+ /**
509
+ * A URI reference that identifies the problem type (e.g., GitHub issues link)
510
+ */
511
+ type?: string;
512
+ /**
513
+ * A URI reference that identifies the specific occurrence (e.g., trace ID)
514
+ */
515
+ instance?: string;
516
+ /**
517
+ * The HTTP status code
518
+ */
519
+ status: 429;
520
+ /**
521
+ * Optional map of field names to their error messages (for validation errors)
522
+ */
523
+ errors?: {
524
+ [key: string]: string;
525
+ };
526
+ };
527
+ /**
528
+ * Internal Server Error response
529
+ */
530
+ export type Error500 = {
531
+ /**
532
+ * Specific error code for programmatic handling
533
+ */
534
+ code: 'INTERNAL_SERVER_EXCEPTION';
535
+ /**
536
+ * A short, human-readable summary of the problem
537
+ */
538
+ title: string;
539
+ /**
540
+ * A human-readable explanation specific to this occurrence
541
+ */
542
+ detail: string;
543
+ /**
544
+ * A URI reference that identifies the problem type (e.g., GitHub issues link)
545
+ */
546
+ type?: string;
547
+ /**
548
+ * A URI reference that identifies the specific occurrence (e.g., trace ID)
549
+ */
550
+ instance?: string;
551
+ /**
552
+ * The HTTP status code
553
+ */
554
+ status: 500;
555
+ /**
556
+ * Optional map of field names to their error messages (for validation errors)
557
+ */
558
+ errors?: {
559
+ [key: string]: string;
560
+ };
561
+ };
562
+ export type SearchStatsRequest = {
563
+ /**
564
+ * What to search for (omit for queryless stats)
565
+ */
566
+ query?: {
567
+ /**
568
+ * Search expression (supports boolean operators, wildcards, phrase matching)
569
+ */
570
+ search?: string;
571
+ /**
572
+ * Whether to use exact phrase matching
573
+ */
574
+ exactMatch?: boolean;
575
+ };
576
+ filters?: SearchFilters;
577
+ /**
578
+ * Resources to expand in the response includes block
579
+ */
580
+ include?: Array<IncludeExpansion>;
581
+ };
582
+ /**
583
+ * Search hit statistics for a single media
584
+ */
585
+ export type MediaSearchStats = {
586
+ /**
587
+ * Media identifier (look up full details in includes.media)
588
+ */
589
+ mediaId: number;
590
+ /**
591
+ * Number of matching segments found in this media
592
+ */
593
+ matchCount: number;
594
+ /**
595
+ * Mapping of episode numbers to segment hit counts
596
+ */
597
+ episodeHits: {
598
+ [key: string]: number;
599
+ };
600
+ };
601
+ /**
602
+ * Count of entries grouped by media category
603
+ */
604
+ export type CategoryCount = {
605
+ category?: Category;
606
+ /**
607
+ * Number of entries in this category
608
+ */
609
+ count?: number;
610
+ };
611
+ export type SearchStatsResponse = {
612
+ media?: Array<MediaSearchStats>;
613
+ categories?: Array<CategoryCount>;
614
+ includes?: {
615
+ /**
616
+ * Media objects keyed by mediaId
617
+ */
618
+ media?: {
619
+ [key: string]: Media;
620
+ };
621
+ };
622
+ };
623
+ export type SearchMultipleRequest = {
624
+ /**
625
+ * What to search for
626
+ */
627
+ query: {
628
+ /**
629
+ * List of words to search for
630
+ */
631
+ words: Array<string>;
632
+ /**
633
+ * Whether to use exact matching
634
+ */
635
+ exactMatch?: boolean;
636
+ };
637
+ filters?: SearchFilters;
638
+ /**
639
+ * Resources to expand in the response includes block
640
+ */
641
+ include?: Array<IncludeExpansion>;
642
+ };
643
+ /**
644
+ * Media match count entry
645
+ */
646
+ export type WordMatchMedia = {
647
+ /**
648
+ * Media identifier (look up full details in includes.media)
649
+ */
650
+ mediaId: number;
651
+ /**
652
+ * Number of times the word appears in this media
653
+ */
654
+ matchCount: number;
655
+ };
656
+ /**
657
+ * Word matching result with occurrences across media
658
+ */
659
+ export type WordMatch = {
660
+ /**
661
+ * The word that was searched for
662
+ */
663
+ word?: string;
664
+ /**
665
+ * Indicates whether the word was found in any segment
666
+ */
667
+ isMatch?: boolean;
668
+ /**
669
+ * Total number of times this word appears across all media
670
+ */
671
+ matchCount?: number;
672
+ /**
673
+ * List of media containing this word
674
+ */
675
+ media?: Array<WordMatchMedia>;
676
+ };
677
+ export type SearchMultipleResponse = {
678
+ results?: Array<WordMatch>;
679
+ includes?: {
680
+ /**
681
+ * Media objects keyed by mediaId
682
+ */
683
+ media?: {
684
+ [key: string]: Media;
685
+ };
686
+ };
687
+ };
688
+ /**
689
+ * Resource to expand in media responses
690
+ */
691
+ export type MediaIncludeExpansion = 'media' | 'media.characters';
692
+ /**
693
+ * Cursor pagination metadata
694
+ */
695
+ export type CursorPagination = {
696
+ /**
697
+ * Whether more results are available
698
+ */
699
+ hasMore: boolean;
700
+ /**
701
+ * Cursor for the next page (`null` when `hasMore` is `false`)
702
+ */
703
+ cursor: number;
704
+ };
705
+ export type MediaListResponse = {
706
+ media: Array<Media>;
707
+ pagination: CursorPagination;
708
+ };
709
+ /**
710
+ * Character data for creating/updating media
711
+ */
712
+ export type CharacterInput = {
713
+ /**
714
+ * AniList character ID
715
+ */
716
+ id: number;
717
+ /**
718
+ * Japanese name of the character
719
+ */
720
+ nameJa: string;
721
+ /**
722
+ * English name of the character
723
+ */
724
+ nameEn: string;
725
+ /**
726
+ * Character image URL
727
+ */
728
+ imageUrl: string;
729
+ /**
730
+ * Character's role in the media
731
+ */
732
+ role: 'MAIN' | 'SUPPORTING' | 'BACKGROUND';
733
+ /**
734
+ * AniList staff ID for the Japanese voice actor
735
+ */
736
+ seiyuuId: number;
737
+ /**
738
+ * Japanese name of the voice actor
739
+ */
740
+ seiyuuNameJa: string;
741
+ /**
742
+ * English name of the voice actor
743
+ */
744
+ seiyuuNameEn: string;
745
+ /**
746
+ * Voice actor profile image URL
747
+ */
748
+ seiyuuImageUrl: string;
749
+ };
750
+ /**
751
+ * Request body for creating a new media entry
752
+ */
753
+ export type MediaCreateRequest = {
754
+ externalIds?: ExternalId;
755
+ /**
756
+ * Original Japanese name of the media
757
+ */
758
+ nameJa: string;
759
+ /**
760
+ * Romaji transliteration of the media name
761
+ */
762
+ nameRomaji: string;
763
+ /**
764
+ * English name of the media
765
+ */
766
+ nameEn: string;
767
+ /**
768
+ * Format of the media release (e.g., TV, OVA, Movie)
769
+ */
770
+ airingFormat: string;
771
+ /**
772
+ * Current airing status (FINISHED, RELEASING, NOT_YET_RELEASED, CANCELLED)
773
+ */
774
+ airingStatus: string;
775
+ /**
776
+ * List of genres associated with the media
777
+ */
778
+ genres: Array<string>;
779
+ /**
780
+ * Storage backend for media assets
781
+ */
782
+ storage: 'LOCAL' | 'R2';
783
+ /**
784
+ * Start date of the media (first airing/release)
785
+ */
786
+ startDate: string;
787
+ /**
788
+ * End date of the media (last airing/release)
789
+ */
790
+ endDate?: string;
791
+ /**
792
+ * Media category
793
+ */
794
+ category: 'ANIME' | 'JDRAMA';
795
+ /**
796
+ * Version of the media-sub-splitter used
797
+ */
798
+ version: string;
799
+ /**
800
+ * Hash salt used when generating the hash for the related media assets
801
+ */
802
+ hashSalt: string;
803
+ /**
804
+ * Animation studio that produced the media
805
+ */
806
+ studio: string;
807
+ /**
808
+ * Airing season label for the media
809
+ */
810
+ seasonName: string;
811
+ /**
812
+ * Airing year for the media
813
+ */
814
+ seasonYear: number;
815
+ /**
816
+ * Base path for R2/CDN storage (e.g. "media/21459")
817
+ */
818
+ storageBasePath?: string;
819
+ /**
820
+ * List of characters appearing in the media with their voice actors
821
+ */
822
+ characters?: Array<CharacterInput>;
823
+ };
824
+ /**
825
+ * Conflict error response
826
+ */
827
+ export type Error409 = {
828
+ /**
829
+ * Specific error code for programmatic handling
830
+ */
831
+ code: 'ACCOUNT_CONFLICT' | 'DUPLICATE_KEY';
832
+ /**
833
+ * A short, human-readable summary of the problem
834
+ */
835
+ title: string;
836
+ /**
837
+ * A human-readable explanation specific to this occurrence
838
+ */
839
+ detail: string;
840
+ /**
841
+ * A URI reference that identifies the problem type (e.g., GitHub issues link)
842
+ */
843
+ type?: string;
844
+ /**
845
+ * A URI reference that identifies the specific occurrence (e.g., trace ID)
846
+ */
847
+ instance?: string;
848
+ /**
849
+ * The HTTP status code
850
+ */
851
+ status: 409;
852
+ /**
853
+ * Optional map of field names to their error messages (for validation errors)
854
+ */
855
+ errors?: {
856
+ [key: string]: string;
857
+ };
858
+ };
859
+ /**
860
+ * Not Found error response
861
+ */
862
+ export type Error404 = {
863
+ /**
864
+ * Specific error code for programmatic handling
865
+ */
866
+ code: 'NOT_FOUND';
867
+ /**
868
+ * A short, human-readable summary of the problem
869
+ */
870
+ title: string;
871
+ /**
872
+ * A human-readable explanation specific to this occurrence
873
+ */
874
+ detail: string;
875
+ /**
876
+ * A URI reference that identifies the problem type (e.g., GitHub issues link)
877
+ */
878
+ type?: string;
879
+ /**
880
+ * A URI reference that identifies the specific occurrence (e.g., trace ID)
881
+ */
882
+ instance?: string;
883
+ /**
884
+ * The HTTP status code
885
+ */
886
+ status: 404;
887
+ /**
888
+ * Optional map of field names to their error messages (for validation errors)
889
+ */
890
+ errors?: {
891
+ [key: string]: string;
892
+ };
893
+ };
894
+ /**
895
+ * Request body for updating an existing media entry (all fields optional)
896
+ */
897
+ export type MediaUpdateRequest = {
898
+ externalIds?: ExternalId;
899
+ /**
900
+ * Original Japanese name of the media
901
+ */
902
+ nameJa?: string;
903
+ /**
904
+ * Romaji transliteration of the media name
905
+ */
906
+ nameRomaji?: string;
907
+ /**
908
+ * English name of the media
909
+ */
910
+ nameEn?: string;
911
+ /**
912
+ * Format of the media release (e.g., TV, OVA, Movie)
913
+ */
914
+ airingFormat?: string;
915
+ /**
916
+ * Current airing status (FINISHED, RELEASING, NOT_YET_RELEASED, CANCELLED)
917
+ */
918
+ airingStatus?: string;
919
+ /**
920
+ * List of genres associated with the media
921
+ */
922
+ genres?: Array<string>;
923
+ /**
924
+ * Storage backend for media assets
925
+ */
926
+ storage?: 'LOCAL' | 'R2';
927
+ /**
928
+ * Start date of the media (first airing/release)
929
+ */
930
+ startDate?: string;
931
+ /**
932
+ * End date of the media (last airing/release)
933
+ */
934
+ endDate?: string;
935
+ /**
936
+ * Media category
937
+ */
938
+ category?: 'ANIME' | 'JDRAMA';
939
+ /**
940
+ * Version of the media-sub-splitter used
941
+ */
942
+ version?: string;
943
+ /**
944
+ * Hash salt used when generating the hash for the related media assets
945
+ */
946
+ hashSalt?: string;
947
+ /**
948
+ * Animation studio that produced the media
949
+ */
950
+ studio?: string;
951
+ /**
952
+ * Airing season label for the media
953
+ */
954
+ seasonName?: string;
955
+ /**
956
+ * Airing year for the media
957
+ */
958
+ seasonYear?: number;
959
+ /**
960
+ * Base path for R2/CDN storage (e.g. "media/21459")
961
+ */
962
+ storageBasePath?: string;
963
+ /**
964
+ * List of characters appearing in the media with their voice actors
965
+ */
966
+ characters?: Array<CharacterInput>;
967
+ /**
968
+ * Total number of subtitle segments available
969
+ */
970
+ segmentCount?: number;
971
+ };
972
+ export type Episode = {
973
+ /**
974
+ * ID of the media this episode belongs to
975
+ */
976
+ mediaId: number;
977
+ /**
978
+ * Episode number within the media
979
+ */
980
+ episodeNumber: number;
981
+ /**
982
+ * English title of the episode
983
+ */
984
+ titleEn?: string;
985
+ /**
986
+ * Romanized title of the episode
987
+ */
988
+ titleRomaji?: string;
989
+ /**
990
+ * Japanese title of the episode
991
+ */
992
+ titleJa?: string;
993
+ /**
994
+ * Episode description or synopsis
995
+ */
996
+ description?: string;
997
+ /**
998
+ * When the episode originally aired
999
+ */
1000
+ airedAt?: string;
1001
+ /**
1002
+ * Episode duration in seconds
1003
+ */
1004
+ lengthSeconds?: number;
1005
+ /**
1006
+ * URL to episode thumbnail image
1007
+ */
1008
+ thumbnailUrl?: string;
1009
+ /**
1010
+ * Number of segments in this episode
1011
+ */
1012
+ segmentCount: number;
1013
+ };
1014
+ export type EpisodeListResponse = {
1015
+ /**
1016
+ * Array of episode objects
1017
+ */
1018
+ episodes: Array<Episode>;
1019
+ pagination: CursorPagination;
1020
+ };
1021
+ export type EpisodeCreateRequest = {
1022
+ /**
1023
+ * English title of the episode
1024
+ */
1025
+ titleEn?: string;
1026
+ /**
1027
+ * Romanized title of the episode
1028
+ */
1029
+ titleRomaji?: string;
1030
+ /**
1031
+ * Japanese title of the episode
1032
+ */
1033
+ titleJa?: string;
1034
+ /**
1035
+ * Episode description or synopsis
1036
+ */
1037
+ description?: string;
1038
+ /**
1039
+ * When the episode originally aired
1040
+ */
1041
+ airedAt?: string;
1042
+ /**
1043
+ * Episode duration in seconds
1044
+ */
1045
+ lengthSeconds?: number;
1046
+ /**
1047
+ * URL to episode thumbnail image
1048
+ */
1049
+ thumbnailUrl?: string;
1050
+ /**
1051
+ * Episode number within the media (must be unique for this media)
1052
+ */
1053
+ episodeNumber: number;
1054
+ };
1055
+ /**
1056
+ * All fields are optional for partial updates
1057
+ */
1058
+ export type EpisodeUpdateRequest = {
1059
+ /**
1060
+ * English title of the episode
1061
+ */
1062
+ titleEn?: string;
1063
+ /**
1064
+ * Romanized title of the episode
1065
+ */
1066
+ titleRomaji?: string;
1067
+ /**
1068
+ * Japanese title of the episode
1069
+ */
1070
+ titleJa?: string;
1071
+ /**
1072
+ * Episode description or synopsis
1073
+ */
1074
+ description?: string;
1075
+ /**
1076
+ * When the episode originally aired
1077
+ */
1078
+ airedAt?: string;
1079
+ /**
1080
+ * Episode duration in seconds
1081
+ */
1082
+ lengthSeconds?: number;
1083
+ /**
1084
+ * URL to episode thumbnail image
1085
+ */
1086
+ thumbnailUrl?: string;
1087
+ };
1088
+ export type SegmentCreateRequest = {
1089
+ /**
1090
+ * Position of the segment within the episode
1091
+ */
1092
+ position: number;
1093
+ /**
1094
+ * Segment status
1095
+ */
1096
+ status?: 'DELETED' | 'ACTIVE' | 'SUSPENDED' | 'VERIFIED' | 'INVALID' | 'TOO_LONG';
1097
+ /**
1098
+ * Start time of the segment in milliseconds from the beginning of the episode
1099
+ */
1100
+ startTimeMs: number;
1101
+ /**
1102
+ * End time of the segment in milliseconds from the beginning of the episode
1103
+ */
1104
+ endTimeMs: number;
1105
+ textJa: {
1106
+ /**
1107
+ * Original Japanese content of the segment
1108
+ */
1109
+ content?: string;
1110
+ };
1111
+ textEs?: {
1112
+ /**
1113
+ * Spanish translation of the segment content
1114
+ */
1115
+ content?: string;
1116
+ /**
1117
+ * Whether the Spanish translation was machine-translated
1118
+ */
1119
+ isMachineTranslated?: boolean;
1120
+ };
1121
+ textEn?: {
1122
+ /**
1123
+ * English translation of the segment content
1124
+ */
1125
+ content?: string;
1126
+ /**
1127
+ * Whether the English translation was machine-translated
1128
+ */
1129
+ isMachineTranslated?: boolean;
1130
+ };
1131
+ contentRating?: ContentRating;
1132
+ /**
1133
+ * Raw WD Tagger v3 classifier output used to derive content rating
1134
+ */
1135
+ ratingAnalysis?: {
1136
+ [key: string]: unknown;
1137
+ };
1138
+ /**
1139
+ * POS tokenization results keyed by engine (sudachi, unidic)
1140
+ */
1141
+ posAnalysis?: {
1142
+ [key: string]: unknown;
1143
+ };
1144
+ /**
1145
+ * Storage backend for segment assets
1146
+ */
1147
+ storage: 'LOCAL' | 'R2';
1148
+ /**
1149
+ * Hash identifier for the segment (from segment JSON)
1150
+ */
1151
+ hashedId: string;
1152
+ };
1153
+ /**
1154
+ * Segment with internal fields (for internal API responses)
1155
+ */
1156
+ export type SegmentInternal = Segment & {
1157
+ /**
1158
+ * Storage backend for segment assets
1159
+ */
1160
+ storage?: 'LOCAL' | 'R2';
1161
+ /**
1162
+ * Hash identifier for the segment
1163
+ */
1164
+ hashedId?: string;
1165
+ /**
1166
+ * Base path in the storage backend
1167
+ */
1168
+ storageBasePath?: string;
1169
+ /**
1170
+ * Raw WD Tagger v3 classifier output used to derive content rating
1171
+ */
1172
+ ratingAnalysis?: {
1173
+ [key: string]: unknown;
1174
+ };
1175
+ /**
1176
+ * POS tokenization results keyed by engine (sudachi, unidic)
1177
+ */
1178
+ posAnalysis?: {
1179
+ [key: string]: unknown;
1180
+ };
1181
+ };
1182
+ /**
1183
+ * All fields are optional for partial updates
1184
+ */
1185
+ export type SegmentUpdateRequest = {
1186
+ /**
1187
+ * Position of the segment within the episode
1188
+ */
1189
+ position?: number;
1190
+ /**
1191
+ * Segment status
1192
+ */
1193
+ status?: 'DELETED' | 'ACTIVE' | 'SUSPENDED' | 'VERIFIED' | 'INVALID' | 'TOO_LONG';
1194
+ /**
1195
+ * Start time of the segment in milliseconds from the beginning of the episode
1196
+ */
1197
+ startTimeMs?: number;
1198
+ /**
1199
+ * End time of the segment in milliseconds from the beginning of the episode
1200
+ */
1201
+ endTimeMs?: number;
1202
+ textJa?: {
1203
+ /**
1204
+ * Original Japanese content of the segment
1205
+ */
1206
+ content?: string;
1207
+ };
1208
+ textEs?: {
1209
+ /**
1210
+ * Spanish translation of the segment content
1211
+ */
1212
+ content?: string;
1213
+ /**
1214
+ * Whether the Spanish translation was machine-translated
1215
+ */
1216
+ isMachineTranslated?: boolean;
1217
+ };
1218
+ textEn?: {
1219
+ /**
1220
+ * English translation of the segment content
1221
+ */
1222
+ content?: string;
1223
+ /**
1224
+ * Whether the English translation was machine-translated
1225
+ */
1226
+ isMachineTranslated?: boolean;
1227
+ };
1228
+ contentRating?: ContentRating;
1229
+ /**
1230
+ * Raw WD Tagger v3 classifier output used to derive content rating
1231
+ */
1232
+ ratingAnalysis?: {
1233
+ [key: string]: unknown;
1234
+ };
1235
+ /**
1236
+ * POS tokenization results keyed by engine (sudachi, unidic)
1237
+ */
1238
+ posAnalysis?: {
1239
+ [key: string]: unknown;
1240
+ };
1241
+ /**
1242
+ * Storage backend for segment assets
1243
+ */
1244
+ storage?: 'LOCAL' | 'R2';
1245
+ /**
1246
+ * Hash identifier for the segment (from segment JSON)
1247
+ */
1248
+ hashedId?: string;
1249
+ };
1250
+ export type SegmentContextResponse = {
1251
+ segments: Array<Segment>;
1252
+ includes?: {
1253
+ /**
1254
+ * Media objects keyed by mediaId
1255
+ */
1256
+ media?: {
1257
+ [key: string]: Media;
1258
+ };
1259
+ };
1260
+ };
1261
+ /**
1262
+ * Ordered media series grouping
1263
+ */
1264
+ export type Series = {
1265
+ /**
1266
+ * Series ID
1267
+ */
1268
+ id: number;
1269
+ /**
1270
+ * Japanese name of the series
1271
+ */
1272
+ nameJa: string;
1273
+ /**
1274
+ * Romaji name of the series
1275
+ */
1276
+ nameRomaji: string;
1277
+ /**
1278
+ * English name of the series
1279
+ */
1280
+ nameEn: string;
1281
+ };
1282
+ export type SeriesListResponse = {
1283
+ series: Array<Series>;
1284
+ pagination: CursorPagination;
1285
+ };
1286
+ /**
1287
+ * Series with ordered media entries
1288
+ */
1289
+ export type SeriesWithMedia = {
1290
+ /**
1291
+ * Series ID
1292
+ */
1293
+ id: number;
1294
+ /**
1295
+ * Japanese name of the series
1296
+ */
1297
+ nameJa: string;
1298
+ /**
1299
+ * Romaji name of the series
1300
+ */
1301
+ nameRomaji: string;
1302
+ /**
1303
+ * English name of the series
1304
+ */
1305
+ nameEn: string;
1306
+ /**
1307
+ * All media in the series, sorted by position
1308
+ */
1309
+ media: Array<{
1310
+ /**
1311
+ * Position in the series (1-indexed)
1312
+ */
1313
+ position?: number;
1314
+ media?: Media;
1315
+ }>;
1316
+ };
1317
+ /**
1318
+ * Anime character
1319
+ */
1320
+ export type Character = {
1321
+ /**
1322
+ * AniList character ID
1323
+ */
1324
+ id: number;
1325
+ /**
1326
+ * Japanese name of the character
1327
+ */
1328
+ nameJa: string;
1329
+ /**
1330
+ * English name of the character
1331
+ */
1332
+ nameEn: string;
1333
+ /**
1334
+ * Character image URL
1335
+ */
1336
+ imageUrl: string;
1337
+ };
1338
+ /**
1339
+ * Character with voice actor and all media appearances
1340
+ */
1341
+ export type CharacterWithMedia = Character & {
1342
+ seiyuu: Seiyuu;
1343
+ /**
1344
+ * All media this character appears in
1345
+ */
1346
+ mediaAppearances: Array<{
1347
+ media?: Media;
1348
+ /**
1349
+ * Character role in this media
1350
+ */
1351
+ role?: 'MAIN' | 'SUPPORTING' | 'BACKGROUND';
1352
+ }>;
1353
+ };
1354
+ /**
1355
+ * Seiyuu details with optional character appearances
1356
+ */
1357
+ export type SeiyuuWithRoles = {
1358
+ /**
1359
+ * AniList staff ID
1360
+ */
1361
+ id: number;
1362
+ /**
1363
+ * Japanese name of the voice actor
1364
+ */
1365
+ nameJa: string;
1366
+ /**
1367
+ * English name of the voice actor
1368
+ */
1369
+ nameEn: string;
1370
+ /**
1371
+ * Profile image URL
1372
+ */
1373
+ imageUrl: string;
1374
+ /**
1375
+ * Characters voiced by this seiyuu with their media appearances
1376
+ */
1377
+ characters: Array<Character & {
1378
+ media: Media;
1379
+ /**
1380
+ * Character role in this media
1381
+ */
1382
+ role: 'MAIN' | 'SUPPORTING' | 'BACKGROUND';
1383
+ }>;
1384
+ };
1385
+ export type UserQuotaResponse = {
1386
+ /**
1387
+ * Number of API requests used in the current billing period.
1388
+ */
1389
+ quotaUsed: number;
1390
+ /**
1391
+ * Maximum number of API requests allowed in the current billing period.
1392
+ */
1393
+ quotaLimit: number;
1394
+ /**
1395
+ * Number of API requests remaining in the current billing period.
1396
+ */
1397
+ quotaRemaining: number;
1398
+ /**
1399
+ * Current billing period in YYYYMM format.
1400
+ */
1401
+ periodYyyymm: number;
1402
+ /**
1403
+ * Start of the current billing period (UTC).
1404
+ */
1405
+ periodStart: string;
1406
+ /**
1407
+ * End of the current billing period (UTC).
1408
+ */
1409
+ periodEnd: string;
1410
+ };
1411
+ export type ReportTargetMedia = {
1412
+ /**
1413
+ * Report target type
1414
+ */
1415
+ type: 'MEDIA';
1416
+ /**
1417
+ * Media ID this report targets
1418
+ */
1419
+ mediaId: number;
1420
+ };
1421
+ export type ReportTargetEpisode = {
1422
+ /**
1423
+ * Report target type
1424
+ */
1425
+ type: 'EPISODE';
1426
+ /**
1427
+ * Media ID this report targets
1428
+ */
1429
+ mediaId: number;
1430
+ /**
1431
+ * Episode number this report targets
1432
+ */
1433
+ episodeNumber: number;
1434
+ };
1435
+ export type ReportTargetSegment = {
1436
+ /**
1437
+ * Report target type
1438
+ */
1439
+ type: 'SEGMENT';
1440
+ /**
1441
+ * Media ID this report targets
1442
+ */
1443
+ mediaId: number;
1444
+ /**
1445
+ * Episode number containing the segment
1446
+ */
1447
+ episodeNumber?: number;
1448
+ /**
1449
+ * Segment UUID this report targets
1450
+ */
1451
+ segmentUuid: string;
1452
+ };
1453
+ export type ReportTarget = ({
1454
+ type: 'MEDIA';
1455
+ } & ReportTargetMedia) | ({
1456
+ type: 'EPISODE';
1457
+ } & ReportTargetEpisode) | ({
1458
+ type: 'SEGMENT';
1459
+ } & ReportTargetSegment);
1460
+ export type Report = {
1461
+ /**
1462
+ * Report ID
1463
+ */
1464
+ id: number;
1465
+ /**
1466
+ * Who created this report
1467
+ */
1468
+ source: 'USER' | 'AUTO';
1469
+ target: ReportTarget;
1470
+ /**
1471
+ * ID of the auto-check run that created this report (AUTO only)
1472
+ */
1473
+ reviewCheckRunId?: number;
1474
+ /**
1475
+ * Reason for the report
1476
+ */
1477
+ reason: 'WRONG_TRANSLATION' | 'WRONG_TIMING' | 'WRONG_AUDIO' | 'NSFW_NOT_TAGGED' | 'DUPLICATE_SEGMENT' | 'WRONG_METADATA' | 'MISSING_EPISODES' | 'WRONG_COVER_IMAGE' | 'INAPPROPRIATE_CONTENT' | 'OTHER' | 'LOW_SEGMENT_MEDIA' | 'EMPTY_EPISODES' | 'MISSING_EPISODES_AUTO' | 'BAD_SEGMENT_RATIO' | 'MEDIA_WITH_NO_EPISODES' | 'MISSING_TRANSLATIONS' | 'DB_ES_SYNC_ISSUES' | 'HIGH_REPORT_DENSITY';
1478
+ /**
1479
+ * Optional description with additional details
1480
+ */
1481
+ description?: string;
1482
+ /**
1483
+ * Check-specific metrics (AUTO reports) or null (USER reports)
1484
+ */
1485
+ data?: {
1486
+ [key: string]: unknown;
1487
+ };
1488
+ /**
1489
+ * Current status of the report
1490
+ */
1491
+ status: 'PENDING' | 'CONCERN' | 'ACCEPTED' | 'REJECTED' | 'RESOLVED' | 'IGNORED';
1492
+ /**
1493
+ * Notes from the admin who reviewed the report
1494
+ */
1495
+ adminNotes?: string;
1496
+ /**
1497
+ * ID of the user who submitted the report (USER reports only)
1498
+ */
1499
+ userId?: number;
1500
+ /**
1501
+ * When the report was created
1502
+ */
1503
+ createdAt: string;
1504
+ /**
1505
+ * When the report was last updated
1506
+ */
1507
+ updatedAt?: string;
1508
+ };
1509
+ export type ReportListResponse = {
1510
+ reports: Array<Report>;
1511
+ pagination: CursorPagination;
1512
+ };
1513
+ export type UserReportTarget = ({
1514
+ type: 'MEDIA';
1515
+ } & ReportTargetMedia) | ({
1516
+ type: 'SEGMENT';
1517
+ } & ReportTargetSegment);
1518
+ export type CreateReportRequest = {
1519
+ target: UserReportTarget;
1520
+ /**
1521
+ * Reason for the report
1522
+ */
1523
+ reason: 'WRONG_TRANSLATION' | 'WRONG_TIMING' | 'WRONG_AUDIO' | 'NSFW_NOT_TAGGED' | 'DUPLICATE_SEGMENT' | 'WRONG_METADATA' | 'MISSING_EPISODES' | 'WRONG_COVER_IMAGE' | 'INAPPROPRIATE_CONTENT' | 'OTHER';
1524
+ /**
1525
+ * Optional description with additional details
1526
+ */
1527
+ description?: string;
1528
+ };
1529
+ export type UserPreferences = {
1530
+ /**
1531
+ * Lab feature opt-in flags keyed by feature key
1532
+ */
1533
+ labs?: {
1534
+ [key: string]: boolean;
1535
+ };
1536
+ /**
1537
+ * Preferred language for media names display
1538
+ */
1539
+ mediaNameLanguage?: 'english' | 'japanese' | 'romaji';
1540
+ /**
1541
+ * Per-category content rating display preferences
1542
+ */
1543
+ contentRatingPreferences?: {
1544
+ suggestive?: 'show' | 'blur' | 'hide';
1545
+ explicit?: 'show' | 'blur' | 'hide';
1546
+ };
1547
+ searchHistory?: {
1548
+ /**
1549
+ * Whether activity tracking is enabled (default true)
1550
+ */
1551
+ enabled?: boolean;
1552
+ };
1553
+ /**
1554
+ * ISO timestamp of when the user last visited the blog page
1555
+ */
1556
+ blogLastVisited?: string;
1557
+ ankiProfiles?: Array<{
1558
+ id: string;
1559
+ name: string;
1560
+ deck?: string;
1561
+ model?: string;
1562
+ fields?: Array<{
1563
+ key: string;
1564
+ value: string;
1565
+ }>;
1566
+ key?: string;
1567
+ serverAddress: string;
1568
+ }>;
1569
+ /**
1570
+ * Media hidden from search results by the user
1571
+ */
1572
+ hiddenMedia?: Array<{
1573
+ mediaId: number;
1574
+ nameEn?: string;
1575
+ nameJa?: string;
1576
+ nameRomaji?: string;
1577
+ }>;
1578
+ };
1579
+ /**
1580
+ * Type of user activity
1581
+ */
1582
+ export type ActivityType = 'SEARCH' | 'ANKI_EXPORT' | 'SEGMENT_PLAY' | 'LIST_ADD_SEGMENT';
1583
+ export type UserActivity = {
1584
+ id: number;
1585
+ activityType: ActivityType;
1586
+ segmentUuid?: string;
1587
+ mediaId?: number;
1588
+ searchQuery?: string;
1589
+ createdAt: string;
1590
+ };
1591
+ /**
1592
+ * User segment collection
1593
+ */
1594
+ export type Collection = {
1595
+ /**
1596
+ * Collection ID
1597
+ */
1598
+ id: number;
1599
+ /**
1600
+ * Name of the collection
1601
+ */
1602
+ name: string;
1603
+ /**
1604
+ * User ID who owns the collection
1605
+ */
1606
+ userId: number;
1607
+ /**
1608
+ * Visibility of the collection
1609
+ */
1610
+ visibility: 'PUBLIC' | 'PRIVATE';
1611
+ };
1612
+ export type UserExportCollection = Collection & {
1613
+ /**
1614
+ * Segment UUIDs in saved order
1615
+ */
1616
+ segmentUuids: Array<string>;
1617
+ };
1618
+ /**
1619
+ * User data export payload (identifier-oriented references)
1620
+ */
1621
+ export type UserExportResponse = {
1622
+ profile: {
1623
+ id: number;
1624
+ username: string;
1625
+ email: string;
1626
+ createdAt: string;
1627
+ };
1628
+ preferences: UserPreferences;
1629
+ activity: Array<UserActivity>;
1630
+ collections: Array<UserExportCollection>;
1631
+ reports: Array<Report>;
1632
+ };
1633
+ export type UserLabFeature = {
1634
+ /**
1635
+ * Unique identifier for the lab feature
1636
+ */
1637
+ key: string;
1638
+ /**
1639
+ * Human-readable feature name
1640
+ */
1641
+ name: string;
1642
+ /**
1643
+ * Description of what the feature does
1644
+ */
1645
+ description: string;
1646
+ /**
1647
+ * Whether the feature is globally available
1648
+ */
1649
+ enabled: boolean;
1650
+ /**
1651
+ * Whether the user has opted in to this feature
1652
+ */
1653
+ userEnabled: boolean;
1654
+ };
1655
+ /**
1656
+ * Paginated collection list response
1657
+ */
1658
+ export type CollectionListResponse = {
1659
+ collections: Array<Collection>;
1660
+ pagination: CursorPagination;
1661
+ };
1662
+ /**
1663
+ * Request body for creating a new collection
1664
+ */
1665
+ export type CollectionRequests = {
1666
+ /**
1667
+ * Name of the collection
1668
+ */
1669
+ name: string;
1670
+ /**
1671
+ * Visibility of the collection
1672
+ */
1673
+ visibility?: 'PUBLIC' | 'PRIVATE';
1674
+ };
1675
+ /**
1676
+ * Collection with saved segments (search result format)
1677
+ */
1678
+ export type CollectionWithSegments = {
1679
+ /**
1680
+ * Collection ID
1681
+ */
1682
+ id: number;
1683
+ /**
1684
+ * Name of the collection
1685
+ */
1686
+ name: string;
1687
+ /**
1688
+ * User ID who owns the collection
1689
+ */
1690
+ userId: number;
1691
+ /**
1692
+ * Visibility of the collection
1693
+ */
1694
+ visibility: 'PUBLIC' | 'PRIVATE';
1695
+ /**
1696
+ * Saved segments with their search result data
1697
+ */
1698
+ segments: Array<{
1699
+ /**
1700
+ * Position in the collection
1701
+ */
1702
+ position?: number;
1703
+ /**
1704
+ * User annotation
1705
+ */
1706
+ note?: string;
1707
+ result?: Segment;
1708
+ }>;
1709
+ includes?: {
1710
+ /**
1711
+ * Media objects keyed by mediaId
1712
+ */
1713
+ media?: {
1714
+ [key: string]: Media;
1715
+ };
1716
+ };
1717
+ /**
1718
+ * Total number of segments in the collection
1719
+ */
1720
+ totalCount: number;
1721
+ pagination: CursorPagination;
1722
+ };
1723
+ /**
1724
+ * Request to reindex segments from the database into Elasticsearch
1725
+ */
1726
+ export type ReindexRequest = {
1727
+ /**
1728
+ * Array of media to reindex. If not provided, all media will be reindexed.
1729
+ * Each media can optionally specify which episodes to reindex.
1730
+ * If episodes are not specified for a media, all episodes will be reindexed.
1731
+ */
1732
+ media?: Array<{
1733
+ /**
1734
+ * The ID of the media
1735
+ */
1736
+ mediaId: number;
1737
+ /**
1738
+ * Optional array of episode numbers to reindex.
1739
+ * If not provided, all episodes for this media will be reindexed.
1740
+ */
1741
+ episodes?: Array<number>;
1742
+ }>;
1743
+ };
1744
+ /**
1745
+ * Response from the reindex operation
1746
+ */
1747
+ export type ReindexResponse = {
1748
+ /**
1749
+ * Whether the reindex operation completed successfully
1750
+ */
1751
+ success?: boolean;
1752
+ /**
1753
+ * Human-readable message about the reindex operation
1754
+ */
1755
+ message?: string;
1756
+ /**
1757
+ * Statistics about the reindex operation
1758
+ */
1759
+ stats?: {
1760
+ /**
1761
+ * Total number of segments processed
1762
+ */
1763
+ totalSegments?: number;
1764
+ /**
1765
+ * Number of segments successfully indexed
1766
+ */
1767
+ successfulIndexes?: number;
1768
+ /**
1769
+ * Number of segments that failed to index
1770
+ */
1771
+ failedIndexes?: number;
1772
+ /**
1773
+ * Number of media items processed
1774
+ */
1775
+ mediaProcessed?: number;
1776
+ };
1777
+ /**
1778
+ * Array of errors that occurred during reindexing (if any)
1779
+ */
1780
+ errors?: Array<{
1781
+ /**
1782
+ * ID of the segment that failed
1783
+ */
1784
+ segmentId?: number;
1785
+ /**
1786
+ * Error message
1787
+ */
1788
+ error?: string;
1789
+ }>;
1790
+ };
1791
+ export type AdminReport = Report & {
1792
+ /**
1793
+ * Number of reports for the same target
1794
+ */
1795
+ reportCount: number;
1796
+ /**
1797
+ * Name of the user who submitted this report
1798
+ */
1799
+ reporterName: string;
1800
+ };
1801
+ export type AdminReportListResponse = {
1802
+ reports: Array<AdminReport>;
1803
+ pagination: CursorPagination;
1804
+ };
1805
+ export type UpdateReportRequest = {
1806
+ /**
1807
+ * New status for the report
1808
+ */
1809
+ status?: 'PENDING' | 'CONCERN' | 'ACCEPTED' | 'REJECTED' | 'RESOLVED' | 'IGNORED';
1810
+ /**
1811
+ * Admin notes about the report
1812
+ */
1813
+ adminNotes?: string;
1814
+ };
1815
+ export type RunReviewResponse = {
1816
+ /**
1817
+ * Category filter used
1818
+ */
1819
+ category: string;
1820
+ checksRun: Array<{
1821
+ /**
1822
+ * Check identifier
1823
+ */
1824
+ checkName: string;
1825
+ /**
1826
+ * Human-readable check name
1827
+ */
1828
+ label: string;
1829
+ /**
1830
+ * Number of reports created
1831
+ */
1832
+ resultCount: number;
1833
+ /**
1834
+ * ID of the created run record
1835
+ */
1836
+ runId: number;
1837
+ }>;
1838
+ /**
1839
+ * Total reports created across all checks
1840
+ */
1841
+ totalReports: number;
1842
+ };
1843
+ export type ReviewCheck = {
1844
+ /**
1845
+ * Check ID
1846
+ */
1847
+ id: number;
1848
+ /**
1849
+ * Unique check identifier
1850
+ */
1851
+ name: string;
1852
+ /**
1853
+ * Human-readable label
1854
+ */
1855
+ label: string;
1856
+ /**
1857
+ * What this check does
1858
+ */
1859
+ description: string;
1860
+ /**
1861
+ * What level this check operates on
1862
+ */
1863
+ targetType: 'MEDIA' | 'EPISODE';
1864
+ /**
1865
+ * Current threshold configuration
1866
+ */
1867
+ threshold: {
1868
+ [key: string]: unknown;
1869
+ };
1870
+ /**
1871
+ * Whether this check is active
1872
+ */
1873
+ enabled: boolean;
1874
+ /**
1875
+ * Schema for threshold fields (from registry)
1876
+ */
1877
+ thresholdSchema?: Array<{
1878
+ key?: string;
1879
+ label?: string;
1880
+ type?: 'number' | 'boolean';
1881
+ default?: number | boolean;
1882
+ min?: number;
1883
+ max?: number;
1884
+ }>;
1885
+ /**
1886
+ * Latest run info for this check
1887
+ */
1888
+ latestRun?: {
1889
+ id?: number;
1890
+ resultCount?: number;
1891
+ createdAt?: string;
1892
+ };
1893
+ createdAt?: string;
1894
+ updatedAt?: string;
1895
+ };
1896
+ export type ReviewCheckRun = {
1897
+ /**
1898
+ * Run ID
1899
+ */
1900
+ id: number;
1901
+ /**
1902
+ * Name of the check that was run
1903
+ */
1904
+ checkName: string;
1905
+ /**
1906
+ * Category filter used (ANIME/JDRAMA) or null for all
1907
+ */
1908
+ category?: string;
1909
+ /**
1910
+ * Number of reports created in this run
1911
+ */
1912
+ resultCount: number;
1913
+ /**
1914
+ * Snapshot of threshold at run time
1915
+ */
1916
+ thresholdUsed: {
1917
+ [key: string]: unknown;
1918
+ };
1919
+ /**
1920
+ * When this run was executed
1921
+ */
1922
+ createdAt: string;
1923
+ };
1924
+ export type ReviewAllowlist = {
1925
+ /**
1926
+ * Allowlist entry ID
1927
+ */
1928
+ id: number;
1929
+ /**
1930
+ * Name of the check this entry applies to
1931
+ */
1932
+ checkName: string;
1933
+ /**
1934
+ * Media ID to exclude
1935
+ */
1936
+ mediaId: number;
1937
+ /**
1938
+ * Episode number to exclude (null for media-level checks)
1939
+ */
1940
+ episodeNumber?: number;
1941
+ /**
1942
+ * Why this was allowlisted
1943
+ */
1944
+ reason?: string;
1945
+ /**
1946
+ * When this entry was created
1947
+ */
1948
+ createdAt: string;
1949
+ };
1950
+ export type SearchIndexData = {
1951
+ body?: SearchRequest;
1952
+ path?: never;
1953
+ query?: never;
1954
+ url: '/v1/search';
1955
+ };
1956
+ export type SearchIndexErrors = {
1957
+ /**
1958
+ * Bad Request
1959
+ */
1960
+ 400: Error400;
1961
+ /**
1962
+ * Unauthorized
1963
+ */
1964
+ 401: Error401;
1965
+ /**
1966
+ * Forbidden
1967
+ */
1968
+ 403: Error403;
1969
+ /**
1970
+ * Too Many Requests
1971
+ */
1972
+ 429: Error429;
1973
+ /**
1974
+ * Internal Server Error
1975
+ */
1976
+ 500: Error500;
1977
+ };
1978
+ export type SearchIndexError = SearchIndexErrors[keyof SearchIndexErrors];
1979
+ export type SearchIndexResponses = {
1980
+ /**
1981
+ * OK
1982
+ */
1983
+ 200: SearchResponse;
1984
+ };
1985
+ export type SearchIndexResponse = SearchIndexResponses[keyof SearchIndexResponses];
1986
+ export type SearchStatsData = {
1987
+ body?: SearchStatsRequest;
1988
+ path?: never;
1989
+ query?: never;
1990
+ url: '/v1/search/stats';
1991
+ };
1992
+ export type SearchStatsErrors = {
1993
+ /**
1994
+ * Bad Request
1995
+ */
1996
+ 400: Error400;
1997
+ /**
1998
+ * Unauthorized
1999
+ */
2000
+ 401: Error401;
2001
+ /**
2002
+ * Forbidden
2003
+ */
2004
+ 403: Error403;
2005
+ /**
2006
+ * Too Many Requests
2007
+ */
2008
+ 429: Error429;
2009
+ /**
2010
+ * Internal Server Error
2011
+ */
2012
+ 500: Error500;
2013
+ };
2014
+ export type SearchStatsError = SearchStatsErrors[keyof SearchStatsErrors];
2015
+ export type SearchStatsResponses = {
2016
+ /**
2017
+ * OK
2018
+ */
2019
+ 200: SearchStatsResponse;
2020
+ };
2021
+ export type SearchStatsResponse2 = SearchStatsResponses[keyof SearchStatsResponses];
2022
+ export type SearchWordsData = {
2023
+ body: SearchMultipleRequest;
2024
+ path?: never;
2025
+ query?: never;
2026
+ url: '/v1/search/words';
2027
+ };
2028
+ export type SearchWordsErrors = {
2029
+ /**
2030
+ * Bad Request
2031
+ */
2032
+ 400: Error400;
2033
+ /**
2034
+ * Unauthorized
2035
+ */
2036
+ 401: Error401;
2037
+ /**
2038
+ * Forbidden
2039
+ */
2040
+ 403: Error403;
2041
+ /**
2042
+ * Too Many Requests
2043
+ */
2044
+ 429: Error429;
2045
+ /**
2046
+ * Internal Server Error
2047
+ */
2048
+ 500: Error500;
2049
+ };
2050
+ export type SearchWordsError = SearchWordsErrors[keyof SearchWordsErrors];
2051
+ export type SearchWordsResponses = {
2052
+ /**
2053
+ * OK
2054
+ */
2055
+ 200: SearchMultipleResponse;
2056
+ };
2057
+ export type SearchWordsResponse = SearchWordsResponses[keyof SearchWordsResponses];
2058
+ export type MediaIndexData = {
2059
+ body?: never;
2060
+ path?: never;
2061
+ query?: {
2062
+ /**
2063
+ * Number of results per page
2064
+ */
2065
+ limit?: number;
2066
+ /**
2067
+ * Pagination cursor offset
2068
+ */
2069
+ cursor?: number;
2070
+ /**
2071
+ * Filter by media category
2072
+ */
2073
+ category?: 'ANIME' | 'JDRAMA';
2074
+ /**
2075
+ * Search query for filtering media by name
2076
+ */
2077
+ query?: string;
2078
+ /**
2079
+ * Resources to expand in the media response (`media.characters` implies `media`)
2080
+ */
2081
+ include?: Array<MediaIncludeExpansion>;
2082
+ };
2083
+ url: '/v1/media';
2084
+ };
2085
+ export type MediaIndexErrors = {
2086
+ /**
2087
+ * Bad Request
2088
+ */
2089
+ 400: Error400;
2090
+ /**
2091
+ * Unauthorized
2092
+ */
2093
+ 401: Error401;
2094
+ /**
2095
+ * Forbidden
2096
+ */
2097
+ 403: Error403;
2098
+ /**
2099
+ * Too Many Requests
2100
+ */
2101
+ 429: Error429;
2102
+ /**
2103
+ * Internal Server Error
2104
+ */
2105
+ 500: Error500;
2106
+ };
2107
+ export type MediaIndexError = MediaIndexErrors[keyof MediaIndexErrors];
2108
+ export type MediaIndexResponses = {
2109
+ /**
2110
+ * OK
2111
+ */
2112
+ 200: MediaListResponse;
2113
+ };
2114
+ export type MediaIndexResponse = MediaIndexResponses[keyof MediaIndexResponses];
2115
+ export type MediaCreateData = {
2116
+ body: MediaCreateRequest;
2117
+ path?: never;
2118
+ query?: never;
2119
+ url: '/v1/media';
2120
+ };
2121
+ export type MediaCreateErrors = {
2122
+ /**
2123
+ * Bad Request
2124
+ */
2125
+ 400: Error400;
2126
+ /**
2127
+ * Unauthorized
2128
+ */
2129
+ 401: Error401;
2130
+ /**
2131
+ * Forbidden
2132
+ */
2133
+ 403: Error403;
2134
+ /**
2135
+ * Conflict
2136
+ */
2137
+ 409: Error409;
2138
+ /**
2139
+ * Too Many Requests
2140
+ */
2141
+ 429: Error429;
2142
+ /**
2143
+ * Internal Server Error
2144
+ */
2145
+ 500: Error500;
2146
+ };
2147
+ export type MediaCreateError = MediaCreateErrors[keyof MediaCreateErrors];
2148
+ export type MediaCreateResponses = {
2149
+ /**
2150
+ * Created
2151
+ */
2152
+ 201: Media;
2153
+ };
2154
+ export type MediaCreateResponse = MediaCreateResponses[keyof MediaCreateResponses];
2155
+ export type MediaDestroyData = {
2156
+ body?: never;
2157
+ path: {
2158
+ /**
2159
+ * Media ID
2160
+ */
2161
+ id: number;
2162
+ };
2163
+ query?: never;
2164
+ url: '/v1/media/{id}';
2165
+ };
2166
+ export type MediaDestroyErrors = {
2167
+ /**
2168
+ * Bad Request
2169
+ */
2170
+ 400: Error400;
2171
+ /**
2172
+ * Unauthorized
2173
+ */
2174
+ 401: Error401;
2175
+ /**
2176
+ * Forbidden
2177
+ */
2178
+ 403: Error403;
2179
+ /**
2180
+ * Not Found
2181
+ */
2182
+ 404: Error404;
2183
+ /**
2184
+ * Too Many Requests
2185
+ */
2186
+ 429: Error429;
2187
+ /**
2188
+ * Internal Server Error
2189
+ */
2190
+ 500: Error500;
2191
+ };
2192
+ export type MediaDestroyError = MediaDestroyErrors[keyof MediaDestroyErrors];
2193
+ export type MediaDestroyResponses = {
2194
+ /**
2195
+ * No Content
2196
+ */
2197
+ 204: void;
2198
+ };
2199
+ export type MediaDestroyResponse = MediaDestroyResponses[keyof MediaDestroyResponses];
2200
+ export type MediaShowData = {
2201
+ body?: never;
2202
+ path: {
2203
+ /**
2204
+ * Media ID
2205
+ */
2206
+ id: number;
2207
+ };
2208
+ query?: {
2209
+ /**
2210
+ * Resources to expand in the media response (`media.characters` implies `media`)
2211
+ */
2212
+ include?: Array<MediaIncludeExpansion>;
2213
+ };
2214
+ url: '/v1/media/{id}';
2215
+ };
2216
+ export type MediaShowErrors = {
2217
+ /**
2218
+ * Bad Request
2219
+ */
2220
+ 400: Error400;
2221
+ /**
2222
+ * Unauthorized
2223
+ */
2224
+ 401: Error401;
2225
+ /**
2226
+ * Forbidden
2227
+ */
2228
+ 403: Error403;
2229
+ /**
2230
+ * Not Found
2231
+ */
2232
+ 404: Error404;
2233
+ /**
2234
+ * Too Many Requests
2235
+ */
2236
+ 429: Error429;
2237
+ /**
2238
+ * Internal Server Error
2239
+ */
2240
+ 500: Error500;
2241
+ };
2242
+ export type MediaShowError = MediaShowErrors[keyof MediaShowErrors];
2243
+ export type MediaShowResponses = {
2244
+ /**
2245
+ * OK
2246
+ */
2247
+ 200: Media;
2248
+ };
2249
+ export type MediaShowResponse = MediaShowResponses[keyof MediaShowResponses];
2250
+ export type MediaUpdateData = {
2251
+ body: MediaUpdateRequest;
2252
+ path: {
2253
+ /**
2254
+ * Media ID
2255
+ */
2256
+ id: number;
2257
+ };
2258
+ query?: never;
2259
+ url: '/v1/media/{id}';
2260
+ };
2261
+ export type MediaUpdateErrors = {
2262
+ /**
2263
+ * Bad Request
2264
+ */
2265
+ 400: Error400;
2266
+ /**
2267
+ * Unauthorized
2268
+ */
2269
+ 401: Error401;
2270
+ /**
2271
+ * Forbidden
2272
+ */
2273
+ 403: Error403;
2274
+ /**
2275
+ * Not Found
2276
+ */
2277
+ 404: Error404;
2278
+ /**
2279
+ * Too Many Requests
2280
+ */
2281
+ 429: Error429;
2282
+ /**
2283
+ * Internal Server Error
2284
+ */
2285
+ 500: Error500;
2286
+ };
2287
+ export type MediaUpdateError = MediaUpdateErrors[keyof MediaUpdateErrors];
2288
+ export type MediaUpdateResponses = {
2289
+ /**
2290
+ * OK
2291
+ */
2292
+ 200: Media;
2293
+ };
2294
+ export type MediaUpdateResponse = MediaUpdateResponses[keyof MediaUpdateResponses];
2295
+ export type EpisodeIndexData = {
2296
+ body?: never;
2297
+ path: {
2298
+ /**
2299
+ * ID of the media
2300
+ */
2301
+ mediaId: number;
2302
+ };
2303
+ query?: {
2304
+ /**
2305
+ * Maximum number of episodes to return
2306
+ */
2307
+ limit?: number;
2308
+ /**
2309
+ * Episode number to start from (for pagination)
2310
+ */
2311
+ cursor?: number;
2312
+ };
2313
+ url: '/v1/media/{mediaId}/episodes';
2314
+ };
2315
+ export type EpisodeIndexErrors = {
2316
+ /**
2317
+ * Bad Request
2318
+ */
2319
+ 400: Error400;
2320
+ /**
2321
+ * Unauthorized
2322
+ */
2323
+ 401: Error401;
2324
+ /**
2325
+ * Forbidden
2326
+ */
2327
+ 403: Error403;
2328
+ /**
2329
+ * Not Found
2330
+ */
2331
+ 404: Error404;
2332
+ /**
2333
+ * Too Many Requests
2334
+ */
2335
+ 429: Error429;
2336
+ /**
2337
+ * Internal Server Error
2338
+ */
2339
+ 500: Error500;
2340
+ };
2341
+ export type EpisodeIndexError = EpisodeIndexErrors[keyof EpisodeIndexErrors];
2342
+ export type EpisodeIndexResponses = {
2343
+ /**
2344
+ * Paginated list of episodes
2345
+ */
2346
+ 200: EpisodeListResponse;
2347
+ };
2348
+ export type EpisodeIndexResponse = EpisodeIndexResponses[keyof EpisodeIndexResponses];
2349
+ export type EpisodeCreateData = {
2350
+ body: EpisodeCreateRequest;
2351
+ path: {
2352
+ /**
2353
+ * ID of the media
2354
+ */
2355
+ mediaId: number;
2356
+ };
2357
+ query?: never;
2358
+ url: '/v1/media/{mediaId}/episodes';
2359
+ };
2360
+ export type EpisodeCreateErrors = {
2361
+ /**
2362
+ * Bad Request
2363
+ */
2364
+ 400: Error400;
2365
+ /**
2366
+ * Unauthorized
2367
+ */
2368
+ 401: Error401;
2369
+ /**
2370
+ * Forbidden
2371
+ */
2372
+ 403: Error403;
2373
+ /**
2374
+ * Not Found
2375
+ */
2376
+ 404: Error404;
2377
+ /**
2378
+ * Conflict
2379
+ */
2380
+ 409: Error409;
2381
+ /**
2382
+ * Too Many Requests
2383
+ */
2384
+ 429: Error429;
2385
+ /**
2386
+ * Internal Server Error
2387
+ */
2388
+ 500: Error500;
2389
+ };
2390
+ export type EpisodeCreateError = EpisodeCreateErrors[keyof EpisodeCreateErrors];
2391
+ export type EpisodeCreateResponses = {
2392
+ /**
2393
+ * Single episode response
2394
+ */
2395
+ 201: Episode;
2396
+ };
2397
+ export type EpisodeCreateResponse = EpisodeCreateResponses[keyof EpisodeCreateResponses];
2398
+ export type EpisodeDestroyData = {
2399
+ body?: never;
2400
+ path: {
2401
+ /**
2402
+ * ID of the media
2403
+ */
2404
+ mediaId: number;
2405
+ /**
2406
+ * Episode number
2407
+ */
2408
+ episodeNumber: number;
2409
+ };
2410
+ query?: never;
2411
+ url: '/v1/media/{mediaId}/episodes/{episodeNumber}';
2412
+ };
2413
+ export type EpisodeDestroyErrors = {
2414
+ /**
2415
+ * Bad Request
2416
+ */
2417
+ 400: Error400;
2418
+ /**
2419
+ * Unauthorized
2420
+ */
2421
+ 401: Error401;
2422
+ /**
2423
+ * Forbidden
2424
+ */
2425
+ 403: Error403;
2426
+ /**
2427
+ * Not Found
2428
+ */
2429
+ 404: Error404;
2430
+ /**
2431
+ * Too Many Requests
2432
+ */
2433
+ 429: Error429;
2434
+ /**
2435
+ * Internal Server Error
2436
+ */
2437
+ 500: Error500;
2438
+ };
2439
+ export type EpisodeDestroyError = EpisodeDestroyErrors[keyof EpisodeDestroyErrors];
2440
+ export type EpisodeDestroyResponses = {
2441
+ /**
2442
+ * Episode successfully deleted
2443
+ */
2444
+ 204: void;
2445
+ };
2446
+ export type EpisodeDestroyResponse = EpisodeDestroyResponses[keyof EpisodeDestroyResponses];
2447
+ export type EpisodeShowData = {
2448
+ body?: never;
2449
+ path: {
2450
+ /**
2451
+ * ID of the media
2452
+ */
2453
+ mediaId: number;
2454
+ /**
2455
+ * Episode number
2456
+ */
2457
+ episodeNumber: number;
2458
+ };
2459
+ query?: never;
2460
+ url: '/v1/media/{mediaId}/episodes/{episodeNumber}';
2461
+ };
2462
+ export type EpisodeShowErrors = {
2463
+ /**
2464
+ * Bad Request
2465
+ */
2466
+ 400: Error400;
2467
+ /**
2468
+ * Unauthorized
2469
+ */
2470
+ 401: Error401;
2471
+ /**
2472
+ * Forbidden
2473
+ */
2474
+ 403: Error403;
2475
+ /**
2476
+ * Not Found
2477
+ */
2478
+ 404: Error404;
2479
+ /**
2480
+ * Too Many Requests
2481
+ */
2482
+ 429: Error429;
2483
+ /**
2484
+ * Internal Server Error
2485
+ */
2486
+ 500: Error500;
2487
+ };
2488
+ export type EpisodeShowError = EpisodeShowErrors[keyof EpisodeShowErrors];
2489
+ export type EpisodeShowResponses = {
2490
+ /**
2491
+ * Single episode response
2492
+ */
2493
+ 200: Episode;
2494
+ };
2495
+ export type EpisodeShowResponse = EpisodeShowResponses[keyof EpisodeShowResponses];
2496
+ export type EpisodeUpdateData = {
2497
+ body: EpisodeUpdateRequest;
2498
+ path: {
2499
+ /**
2500
+ * ID of the media
2501
+ */
2502
+ mediaId: number;
2503
+ /**
2504
+ * Episode number
2505
+ */
2506
+ episodeNumber: number;
2507
+ };
2508
+ query?: never;
2509
+ url: '/v1/media/{mediaId}/episodes/{episodeNumber}';
2510
+ };
2511
+ export type EpisodeUpdateErrors = {
2512
+ /**
2513
+ * Bad Request
2514
+ */
2515
+ 400: Error400;
2516
+ /**
2517
+ * Unauthorized
2518
+ */
2519
+ 401: Error401;
2520
+ /**
2521
+ * Forbidden
2522
+ */
2523
+ 403: Error403;
2524
+ /**
2525
+ * Not Found
2526
+ */
2527
+ 404: Error404;
2528
+ /**
2529
+ * Too Many Requests
2530
+ */
2531
+ 429: Error429;
2532
+ /**
2533
+ * Internal Server Error
2534
+ */
2535
+ 500: Error500;
2536
+ };
2537
+ export type EpisodeUpdateError = EpisodeUpdateErrors[keyof EpisodeUpdateErrors];
2538
+ export type EpisodeUpdateResponses = {
2539
+ /**
2540
+ * Single episode response
2541
+ */
2542
+ 200: Episode;
2543
+ };
2544
+ export type EpisodeUpdateResponse = EpisodeUpdateResponses[keyof EpisodeUpdateResponses];
2545
+ export type SegmentIndexData = {
2546
+ body?: never;
2547
+ path: {
2548
+ /**
2549
+ * ID of the media
2550
+ */
2551
+ mediaId: number;
2552
+ /**
2553
+ * Episode number
2554
+ */
2555
+ episodeNumber: number;
2556
+ };
2557
+ query?: {
2558
+ /**
2559
+ * Maximum number of segments to return
2560
+ */
2561
+ limit?: number;
2562
+ /**
2563
+ * Segment ID to start from (for pagination)
2564
+ */
2565
+ cursor?: number;
2566
+ };
2567
+ url: '/v1/media/{mediaId}/episodes/{episodeNumber}/segments';
2568
+ };
2569
+ export type SegmentIndexErrors = {
2570
+ /**
2571
+ * Bad Request
2572
+ */
2573
+ 400: Error400;
2574
+ /**
2575
+ * Unauthorized
2576
+ */
2577
+ 401: Error401;
2578
+ /**
2579
+ * Forbidden
2580
+ */
2581
+ 403: Error403;
2582
+ /**
2583
+ * Not Found
2584
+ */
2585
+ 404: Error404;
2586
+ /**
2587
+ * Too Many Requests
2588
+ */
2589
+ 429: Error429;
2590
+ /**
2591
+ * Internal Server Error
2592
+ */
2593
+ 500: Error500;
2594
+ };
2595
+ export type SegmentIndexError = SegmentIndexErrors[keyof SegmentIndexErrors];
2596
+ export type SegmentIndexResponses = {
2597
+ /**
2598
+ * Paginated segment list response
2599
+ */
2600
+ 200: {
2601
+ /**
2602
+ * Array of segment objects
2603
+ */
2604
+ segments: Array<Segment>;
2605
+ pagination: CursorPagination;
2606
+ };
2607
+ };
2608
+ export type SegmentIndexResponse = SegmentIndexResponses[keyof SegmentIndexResponses];
2609
+ export type SegmentCreateData = {
2610
+ body: SegmentCreateRequest;
2611
+ path: {
2612
+ /**
2613
+ * ID of the media
2614
+ */
2615
+ mediaId: number;
2616
+ /**
2617
+ * Episode number
2618
+ */
2619
+ episodeNumber: number;
2620
+ };
2621
+ query?: never;
2622
+ url: '/v1/media/{mediaId}/episodes/{episodeNumber}/segments';
2623
+ };
2624
+ export type SegmentCreateErrors = {
2625
+ /**
2626
+ * Bad Request
2627
+ */
2628
+ 400: Error400;
2629
+ /**
2630
+ * Unauthorized
2631
+ */
2632
+ 401: Error401;
2633
+ /**
2634
+ * Forbidden
2635
+ */
2636
+ 403: Error403;
2637
+ /**
2638
+ * Not Found
2639
+ */
2640
+ 404: Error404;
2641
+ /**
2642
+ * Conflict
2643
+ */
2644
+ 409: Error409;
2645
+ /**
2646
+ * Too Many Requests
2647
+ */
2648
+ 429: Error429;
2649
+ /**
2650
+ * Internal Server Error
2651
+ */
2652
+ 500: Error500;
2653
+ };
2654
+ export type SegmentCreateError = SegmentCreateErrors[keyof SegmentCreateErrors];
2655
+ export type SegmentCreateResponses = {
2656
+ /**
2657
+ * Single segment response with internal fields
2658
+ */
2659
+ 201: SegmentInternal;
2660
+ };
2661
+ export type SegmentCreateResponse = SegmentCreateResponses[keyof SegmentCreateResponses];
2662
+ export type SegmentDestroyData = {
2663
+ body?: never;
2664
+ path: {
2665
+ /**
2666
+ * ID of the media
2667
+ */
2668
+ mediaId: number;
2669
+ /**
2670
+ * Episode number
2671
+ */
2672
+ episodeNumber: number;
2673
+ /**
2674
+ * Segment ID
2675
+ */
2676
+ id: number;
2677
+ };
2678
+ query?: never;
2679
+ url: '/v1/media/{mediaId}/episodes/{episodeNumber}/segments/{id}';
2680
+ };
2681
+ export type SegmentDestroyErrors = {
2682
+ /**
2683
+ * Bad Request
2684
+ */
2685
+ 400: Error400;
2686
+ /**
2687
+ * Unauthorized
2688
+ */
2689
+ 401: Error401;
2690
+ /**
2691
+ * Forbidden
2692
+ */
2693
+ 403: Error403;
2694
+ /**
2695
+ * Not Found
2696
+ */
2697
+ 404: Error404;
2698
+ /**
2699
+ * Too Many Requests
2700
+ */
2701
+ 429: Error429;
2702
+ /**
2703
+ * Internal Server Error
2704
+ */
2705
+ 500: Error500;
2706
+ };
2707
+ export type SegmentDestroyError = SegmentDestroyErrors[keyof SegmentDestroyErrors];
2708
+ export type SegmentDestroyResponses = {
2709
+ /**
2710
+ * Segment successfully deleted
2711
+ */
2712
+ 204: void;
2713
+ };
2714
+ export type SegmentDestroyResponse = SegmentDestroyResponses[keyof SegmentDestroyResponses];
2715
+ export type SegmentShowData = {
2716
+ body?: never;
2717
+ path: {
2718
+ /**
2719
+ * ID of the media
2720
+ */
2721
+ mediaId: number;
2722
+ /**
2723
+ * Episode number
2724
+ */
2725
+ episodeNumber: number;
2726
+ /**
2727
+ * Segment ID
2728
+ */
2729
+ id: number;
2730
+ };
2731
+ query?: never;
2732
+ url: '/v1/media/{mediaId}/episodes/{episodeNumber}/segments/{id}';
2733
+ };
2734
+ export type SegmentShowErrors = {
2735
+ /**
2736
+ * Bad Request
2737
+ */
2738
+ 400: Error400;
2739
+ /**
2740
+ * Unauthorized
2741
+ */
2742
+ 401: Error401;
2743
+ /**
2744
+ * Forbidden
2745
+ */
2746
+ 403: Error403;
2747
+ /**
2748
+ * Not Found
2749
+ */
2750
+ 404: Error404;
2751
+ /**
2752
+ * Too Many Requests
2753
+ */
2754
+ 429: Error429;
2755
+ /**
2756
+ * Internal Server Error
2757
+ */
2758
+ 500: Error500;
2759
+ };
2760
+ export type SegmentShowError = SegmentShowErrors[keyof SegmentShowErrors];
2761
+ export type SegmentShowResponses = {
2762
+ /**
2763
+ * Single segment response
2764
+ */
2765
+ 200: Segment;
2766
+ };
2767
+ export type SegmentShowResponse = SegmentShowResponses[keyof SegmentShowResponses];
2768
+ export type SegmentUpdateData = {
2769
+ body: SegmentUpdateRequest;
2770
+ path: {
2771
+ /**
2772
+ * ID of the media
2773
+ */
2774
+ mediaId: number;
2775
+ /**
2776
+ * Episode number
2777
+ */
2778
+ episodeNumber: number;
2779
+ /**
2780
+ * Segment ID
2781
+ */
2782
+ id: number;
2783
+ };
2784
+ query?: never;
2785
+ url: '/v1/media/{mediaId}/episodes/{episodeNumber}/segments/{id}';
2786
+ };
2787
+ export type SegmentUpdateErrors = {
2788
+ /**
2789
+ * Bad Request
2790
+ */
2791
+ 400: Error400;
2792
+ /**
2793
+ * Unauthorized
2794
+ */
2795
+ 401: Error401;
2796
+ /**
2797
+ * Forbidden
2798
+ */
2799
+ 403: Error403;
2800
+ /**
2801
+ * Not Found
2802
+ */
2803
+ 404: Error404;
2804
+ /**
2805
+ * Too Many Requests
2806
+ */
2807
+ 429: Error429;
2808
+ /**
2809
+ * Internal Server Error
2810
+ */
2811
+ 500: Error500;
2812
+ };
2813
+ export type SegmentUpdateError = SegmentUpdateErrors[keyof SegmentUpdateErrors];
2814
+ export type SegmentUpdateResponses = {
2815
+ /**
2816
+ * Single segment response with internal fields
2817
+ */
2818
+ 200: SegmentInternal;
2819
+ };
2820
+ export type SegmentUpdateResponse = SegmentUpdateResponses[keyof SegmentUpdateResponses];
2821
+ export type SegmentShowByUuidData = {
2822
+ body?: never;
2823
+ path: {
2824
+ /**
2825
+ * Segment UUID
2826
+ */
2827
+ uuid: string;
2828
+ };
2829
+ query?: never;
2830
+ url: '/v1/media/segments/{uuid}';
2831
+ };
2832
+ export type SegmentShowByUuidErrors = {
2833
+ /**
2834
+ * Bad Request
2835
+ */
2836
+ 400: Error400;
2837
+ /**
2838
+ * Unauthorized
2839
+ */
2840
+ 401: Error401;
2841
+ /**
2842
+ * Forbidden
2843
+ */
2844
+ 403: Error403;
2845
+ /**
2846
+ * Not Found
2847
+ */
2848
+ 404: Error404;
2849
+ /**
2850
+ * Too Many Requests
2851
+ */
2852
+ 429: Error429;
2853
+ /**
2854
+ * Internal Server Error
2855
+ */
2856
+ 500: Error500;
2857
+ };
2858
+ export type SegmentShowByUuidError = SegmentShowByUuidErrors[keyof SegmentShowByUuidErrors];
2859
+ export type SegmentShowByUuidResponses = {
2860
+ 200: Segment;
2861
+ };
2862
+ export type SegmentShowByUuidResponse = SegmentShowByUuidResponses[keyof SegmentShowByUuidResponses];
2863
+ export type SegmentContextShowData = {
2864
+ body?: never;
2865
+ path: {
2866
+ /**
2867
+ * Segment UUID
2868
+ */
2869
+ uuid: string;
2870
+ };
2871
+ query?: {
2872
+ /**
2873
+ * Number of segments to return before and after the target
2874
+ */
2875
+ limit?: number;
2876
+ /**
2877
+ * Content ratings to include (omit for all ratings)
2878
+ */
2879
+ contentRating?: Array<ContentRating>;
2880
+ /**
2881
+ * Resources to expand in the response includes block
2882
+ */
2883
+ include?: Array<IncludeExpansion>;
2884
+ };
2885
+ url: '/v1/media/segments/{uuid}/context';
2886
+ };
2887
+ export type SegmentContextShowErrors = {
2888
+ /**
2889
+ * Bad Request
2890
+ */
2891
+ 400: Error400;
2892
+ /**
2893
+ * Unauthorized
2894
+ */
2895
+ 401: Error401;
2896
+ /**
2897
+ * Forbidden
2898
+ */
2899
+ 403: Error403;
2900
+ /**
2901
+ * Not Found
2902
+ */
2903
+ 404: Error404;
2904
+ /**
2905
+ * Too Many Requests
2906
+ */
2907
+ 429: Error429;
2908
+ /**
2909
+ * Internal Server Error
2910
+ */
2911
+ 500: Error500;
2912
+ };
2913
+ export type SegmentContextShowError = SegmentContextShowErrors[keyof SegmentContextShowErrors];
2914
+ export type SegmentContextShowResponses = {
2915
+ /**
2916
+ * OK
2917
+ */
2918
+ 200: SegmentContextResponse;
2919
+ };
2920
+ export type SegmentContextShowResponse = SegmentContextShowResponses[keyof SegmentContextShowResponses];
2921
+ export type SeriesIndexData = {
2922
+ body?: never;
2923
+ path?: never;
2924
+ query?: {
2925
+ /**
2926
+ * Number of results per page
2927
+ */
2928
+ limit?: number;
2929
+ /**
2930
+ * Pagination cursor offset
2931
+ */
2932
+ cursor?: number;
2933
+ /**
2934
+ * Case-insensitive search across English, Japanese, and Romaji names
2935
+ */
2936
+ query?: string;
2937
+ };
2938
+ url: '/v1/media/series';
2939
+ };
2940
+ export type SeriesIndexErrors = {
2941
+ /**
2942
+ * Bad Request
2943
+ */
2944
+ 400: Error400;
2945
+ /**
2946
+ * Unauthorized
2947
+ */
2948
+ 401: Error401;
2949
+ /**
2950
+ * Forbidden
2951
+ */
2952
+ 403: Error403;
2953
+ /**
2954
+ * Too Many Requests
2955
+ */
2956
+ 429: Error429;
2957
+ /**
2958
+ * Internal Server Error
2959
+ */
2960
+ 500: Error500;
2961
+ };
2962
+ export type SeriesIndexError = SeriesIndexErrors[keyof SeriesIndexErrors];
2963
+ export type SeriesIndexResponses = {
2964
+ /**
2965
+ * OK
2966
+ */
2967
+ 200: SeriesListResponse;
2968
+ };
2969
+ export type SeriesIndexResponse = SeriesIndexResponses[keyof SeriesIndexResponses];
2970
+ export type SeriesCreateData = {
2971
+ body: {
2972
+ /**
2973
+ * Japanese name of the series
2974
+ */
2975
+ nameJa: string;
2976
+ /**
2977
+ * Romaji name of the series
2978
+ */
2979
+ nameRomaji: string;
2980
+ /**
2981
+ * English name of the series
2982
+ */
2983
+ nameEn: string;
2984
+ };
2985
+ path?: never;
2986
+ query?: never;
2987
+ url: '/v1/media/series';
2988
+ };
2989
+ export type SeriesCreateErrors = {
2990
+ /**
2991
+ * Bad Request
2992
+ */
2993
+ 400: Error400;
2994
+ /**
2995
+ * Unauthorized
2996
+ */
2997
+ 401: Error401;
2998
+ /**
2999
+ * Forbidden
3000
+ */
3001
+ 403: Error403;
3002
+ /**
3003
+ * Too Many Requests
3004
+ */
3005
+ 429: Error429;
3006
+ /**
3007
+ * Internal Server Error
3008
+ */
3009
+ 500: Error500;
3010
+ };
3011
+ export type SeriesCreateError = SeriesCreateErrors[keyof SeriesCreateErrors];
3012
+ export type SeriesCreateResponses = {
3013
+ /**
3014
+ * Created
3015
+ */
3016
+ 201: Series;
3017
+ };
3018
+ export type SeriesCreateResponse = SeriesCreateResponses[keyof SeriesCreateResponses];
3019
+ export type SeriesDestroyData = {
3020
+ body?: never;
3021
+ path: {
3022
+ /**
3023
+ * Series ID
3024
+ */
3025
+ id: number;
3026
+ };
3027
+ query?: never;
3028
+ url: '/v1/media/series/{id}';
3029
+ };
3030
+ export type SeriesDestroyErrors = {
3031
+ /**
3032
+ * Bad Request
3033
+ */
3034
+ 400: Error400;
3035
+ /**
3036
+ * Unauthorized
3037
+ */
3038
+ 401: Error401;
3039
+ /**
3040
+ * Forbidden
3041
+ */
3042
+ 403: Error403;
3043
+ /**
3044
+ * Not Found
3045
+ */
3046
+ 404: Error404;
3047
+ /**
3048
+ * Too Many Requests
3049
+ */
3050
+ 429: Error429;
3051
+ /**
3052
+ * Internal Server Error
3053
+ */
3054
+ 500: Error500;
3055
+ };
3056
+ export type SeriesDestroyError = SeriesDestroyErrors[keyof SeriesDestroyErrors];
3057
+ export type SeriesDestroyResponses = {
3058
+ /**
3059
+ * No Content
3060
+ */
3061
+ 204: void;
3062
+ };
3063
+ export type SeriesDestroyResponse = SeriesDestroyResponses[keyof SeriesDestroyResponses];
3064
+ export type SeriesShowData = {
3065
+ body?: never;
3066
+ path: {
3067
+ /**
3068
+ * Series ID
3069
+ */
3070
+ id: number;
3071
+ };
3072
+ query?: {
3073
+ /**
3074
+ * Resources to expand in the series response (`media.characters` implies `media`)
3075
+ */
3076
+ include?: Array<MediaIncludeExpansion>;
3077
+ };
3078
+ url: '/v1/media/series/{id}';
3079
+ };
3080
+ export type SeriesShowErrors = {
3081
+ /**
3082
+ * Bad Request
3083
+ */
3084
+ 400: Error400;
3085
+ /**
3086
+ * Unauthorized
3087
+ */
3088
+ 401: Error401;
3089
+ /**
3090
+ * Forbidden
3091
+ */
3092
+ 403: Error403;
3093
+ /**
3094
+ * Not Found
3095
+ */
3096
+ 404: Error404;
3097
+ /**
3098
+ * Too Many Requests
3099
+ */
3100
+ 429: Error429;
3101
+ /**
3102
+ * Internal Server Error
3103
+ */
3104
+ 500: Error500;
3105
+ };
3106
+ export type SeriesShowError = SeriesShowErrors[keyof SeriesShowErrors];
3107
+ export type SeriesShowResponses = {
3108
+ /**
3109
+ * OK
3110
+ */
3111
+ 200: SeriesWithMedia;
3112
+ };
3113
+ export type SeriesShowResponse = SeriesShowResponses[keyof SeriesShowResponses];
3114
+ export type SeriesUpdateData = {
3115
+ body: {
3116
+ /**
3117
+ * Updated Japanese name
3118
+ */
3119
+ nameJa?: string;
3120
+ /**
3121
+ * Updated Romaji name
3122
+ */
3123
+ nameRomaji?: string;
3124
+ /**
3125
+ * Updated English name
3126
+ */
3127
+ nameEn?: string;
3128
+ };
3129
+ path: {
3130
+ /**
3131
+ * Series ID
3132
+ */
3133
+ id: number;
3134
+ };
3135
+ query?: never;
3136
+ url: '/v1/media/series/{id}';
3137
+ };
3138
+ export type SeriesUpdateErrors = {
3139
+ /**
3140
+ * Bad Request
3141
+ */
3142
+ 400: Error400;
3143
+ /**
3144
+ * Unauthorized
3145
+ */
3146
+ 401: Error401;
3147
+ /**
3148
+ * Forbidden
3149
+ */
3150
+ 403: Error403;
3151
+ /**
3152
+ * Not Found
3153
+ */
3154
+ 404: Error404;
3155
+ /**
3156
+ * Too Many Requests
3157
+ */
3158
+ 429: Error429;
3159
+ /**
3160
+ * Internal Server Error
3161
+ */
3162
+ 500: Error500;
3163
+ };
3164
+ export type SeriesUpdateError = SeriesUpdateErrors[keyof SeriesUpdateErrors];
3165
+ export type SeriesUpdateResponses = {
3166
+ /**
3167
+ * OK
3168
+ */
3169
+ 200: Series;
3170
+ };
3171
+ export type SeriesUpdateResponse = SeriesUpdateResponses[keyof SeriesUpdateResponses];
3172
+ export type SeriesAddMediaData = {
3173
+ body: {
3174
+ /**
3175
+ * Media ID to add
3176
+ */
3177
+ mediaId: number;
3178
+ /**
3179
+ * Position in the series (1-indexed)
3180
+ */
3181
+ position: number;
3182
+ };
3183
+ path: {
3184
+ /**
3185
+ * Series ID
3186
+ */
3187
+ id: number;
3188
+ };
3189
+ query?: never;
3190
+ url: '/v1/media/series/{id}/media';
3191
+ };
3192
+ export type SeriesAddMediaErrors = {
3193
+ /**
3194
+ * Bad Request
3195
+ */
3196
+ 400: Error400;
3197
+ /**
3198
+ * Unauthorized
3199
+ */
3200
+ 401: Error401;
3201
+ /**
3202
+ * Forbidden
3203
+ */
3204
+ 403: Error403;
3205
+ /**
3206
+ * Not Found
3207
+ */
3208
+ 404: Error404;
3209
+ /**
3210
+ * Too Many Requests
3211
+ */
3212
+ 429: Error429;
3213
+ /**
3214
+ * Internal Server Error
3215
+ */
3216
+ 500: Error500;
3217
+ };
3218
+ export type SeriesAddMediaError = SeriesAddMediaErrors[keyof SeriesAddMediaErrors];
3219
+ export type SeriesAddMediaResponses = {
3220
+ /**
3221
+ * No Content
3222
+ */
3223
+ 204: void;
3224
+ };
3225
+ export type SeriesAddMediaResponse = SeriesAddMediaResponses[keyof SeriesAddMediaResponses];
3226
+ export type SeriesRemoveMediaData = {
3227
+ body?: never;
3228
+ path: {
3229
+ /**
3230
+ * Series ID
3231
+ */
3232
+ id: number;
3233
+ /**
3234
+ * Media ID
3235
+ */
3236
+ mediaId: number;
3237
+ };
3238
+ query?: never;
3239
+ url: '/v1/media/series/{id}/media/{mediaId}';
3240
+ };
3241
+ export type SeriesRemoveMediaErrors = {
3242
+ /**
3243
+ * Bad Request
3244
+ */
3245
+ 400: Error400;
3246
+ /**
3247
+ * Unauthorized
3248
+ */
3249
+ 401: Error401;
3250
+ /**
3251
+ * Forbidden
3252
+ */
3253
+ 403: Error403;
3254
+ /**
3255
+ * Not Found
3256
+ */
3257
+ 404: Error404;
3258
+ /**
3259
+ * Too Many Requests
3260
+ */
3261
+ 429: Error429;
3262
+ /**
3263
+ * Internal Server Error
3264
+ */
3265
+ 500: Error500;
3266
+ };
3267
+ export type SeriesRemoveMediaError = SeriesRemoveMediaErrors[keyof SeriesRemoveMediaErrors];
3268
+ export type SeriesRemoveMediaResponses = {
3269
+ /**
3270
+ * No Content
3271
+ */
3272
+ 204: void;
3273
+ };
3274
+ export type SeriesRemoveMediaResponse = SeriesRemoveMediaResponses[keyof SeriesRemoveMediaResponses];
3275
+ export type SeriesUpdateMediaData = {
3276
+ body: {
3277
+ /**
3278
+ * New position in the series (1-indexed)
3279
+ */
3280
+ position: number;
3281
+ };
3282
+ path: {
3283
+ /**
3284
+ * Series ID
3285
+ */
3286
+ id: number;
3287
+ /**
3288
+ * Media ID
3289
+ */
3290
+ mediaId: number;
3291
+ };
3292
+ query?: never;
3293
+ url: '/v1/media/series/{id}/media/{mediaId}';
3294
+ };
3295
+ export type SeriesUpdateMediaErrors = {
3296
+ /**
3297
+ * Bad Request
3298
+ */
3299
+ 400: Error400;
3300
+ /**
3301
+ * Unauthorized
3302
+ */
3303
+ 401: Error401;
3304
+ /**
3305
+ * Forbidden
3306
+ */
3307
+ 403: Error403;
3308
+ /**
3309
+ * Not Found
3310
+ */
3311
+ 404: Error404;
3312
+ /**
3313
+ * Too Many Requests
3314
+ */
3315
+ 429: Error429;
3316
+ /**
3317
+ * Internal Server Error
3318
+ */
3319
+ 500: Error500;
3320
+ };
3321
+ export type SeriesUpdateMediaError = SeriesUpdateMediaErrors[keyof SeriesUpdateMediaErrors];
3322
+ export type SeriesUpdateMediaResponses = {
3323
+ /**
3324
+ * No Content
3325
+ */
3326
+ 204: void;
3327
+ };
3328
+ export type SeriesUpdateMediaResponse = SeriesUpdateMediaResponses[keyof SeriesUpdateMediaResponses];
3329
+ export type CharacterShowData = {
3330
+ body?: never;
3331
+ path: {
3332
+ /**
3333
+ * AniList character ID
3334
+ */
3335
+ id: number;
3336
+ };
3337
+ query?: never;
3338
+ url: '/v1/media/characters/{id}';
3339
+ };
3340
+ export type CharacterShowErrors = {
3341
+ /**
3342
+ * Bad Request
3343
+ */
3344
+ 400: Error400;
3345
+ /**
3346
+ * Unauthorized
3347
+ */
3348
+ 401: Error401;
3349
+ /**
3350
+ * Forbidden
3351
+ */
3352
+ 403: Error403;
3353
+ /**
3354
+ * Not Found
3355
+ */
3356
+ 404: Error404;
3357
+ /**
3358
+ * Too Many Requests
3359
+ */
3360
+ 429: Error429;
3361
+ /**
3362
+ * Internal Server Error
3363
+ */
3364
+ 500: Error500;
3365
+ };
3366
+ export type CharacterShowError = CharacterShowErrors[keyof CharacterShowErrors];
3367
+ export type CharacterShowResponses = {
3368
+ /**
3369
+ * OK
3370
+ */
3371
+ 200: CharacterWithMedia;
3372
+ };
3373
+ export type CharacterShowResponse = CharacterShowResponses[keyof CharacterShowResponses];
3374
+ export type SeiyuuShowData = {
3375
+ body?: never;
3376
+ path: {
3377
+ /**
3378
+ * AniList staff ID
3379
+ */
3380
+ id: number;
3381
+ };
3382
+ query?: {
3383
+ /**
3384
+ * Resources to expand in the response (`character` is included by default)
3385
+ */
3386
+ include?: Array<'character'>;
3387
+ };
3388
+ url: '/v1/media/seiyuu/{id}';
3389
+ };
3390
+ export type SeiyuuShowErrors = {
3391
+ /**
3392
+ * Bad Request
3393
+ */
3394
+ 400: Error400;
3395
+ /**
3396
+ * Unauthorized
3397
+ */
3398
+ 401: Error401;
3399
+ /**
3400
+ * Forbidden
3401
+ */
3402
+ 403: Error403;
3403
+ /**
3404
+ * Not Found
3405
+ */
3406
+ 404: Error404;
3407
+ /**
3408
+ * Too Many Requests
3409
+ */
3410
+ 429: Error429;
3411
+ /**
3412
+ * Internal Server Error
3413
+ */
3414
+ 500: Error500;
3415
+ };
3416
+ export type SeiyuuShowError = SeiyuuShowErrors[keyof SeiyuuShowErrors];
3417
+ export type SeiyuuShowResponses = {
3418
+ /**
3419
+ * OK
3420
+ */
3421
+ 200: SeiyuuWithRoles;
3422
+ };
3423
+ export type SeiyuuShowResponse = SeiyuuShowResponses[keyof SeiyuuShowResponses];
3424
+ export type UserQuotaShowData = {
3425
+ body?: never;
3426
+ path?: never;
3427
+ query?: never;
3428
+ url: '/v1/user/quota';
3429
+ };
3430
+ export type UserQuotaShowErrors = {
3431
+ /**
3432
+ * Unauthorized
3433
+ */
3434
+ 401: Error401;
3435
+ /**
3436
+ * Too Many Requests
3437
+ */
3438
+ 429: Error429;
3439
+ /**
3440
+ * Internal Server Error
3441
+ */
3442
+ 500: Error500;
3443
+ };
3444
+ export type UserQuotaShowError = UserQuotaShowErrors[keyof UserQuotaShowErrors];
3445
+ export type UserQuotaShowResponses = {
3446
+ /**
3447
+ * OK
3448
+ */
3449
+ 200: UserQuotaResponse;
3450
+ };
3451
+ export type UserQuotaShowResponse = UserQuotaShowResponses[keyof UserQuotaShowResponses];
3452
+ export type UserReportIndexData = {
3453
+ body?: never;
3454
+ path?: never;
3455
+ query?: {
3456
+ /**
3457
+ * Cursor for pagination (report ID to start after)
3458
+ */
3459
+ cursor?: number;
3460
+ /**
3461
+ * Number of results per page
3462
+ */
3463
+ limit?: number;
3464
+ /**
3465
+ * Filter by report status
3466
+ */
3467
+ status?: 'PENDING' | 'CONCERN' | 'ACCEPTED' | 'REJECTED' | 'RESOLVED' | 'IGNORED';
3468
+ };
3469
+ url: '/v1/user/reports';
3470
+ };
3471
+ export type UserReportIndexErrors = {
3472
+ /**
3473
+ * Unauthorized
3474
+ */
3475
+ 401: Error401;
3476
+ /**
3477
+ * Internal Server Error
3478
+ */
3479
+ 500: Error500;
3480
+ };
3481
+ export type UserReportIndexError = UserReportIndexErrors[keyof UserReportIndexErrors];
3482
+ export type UserReportIndexResponses = {
3483
+ /**
3484
+ * OK
3485
+ */
3486
+ 200: ReportListResponse;
3487
+ };
3488
+ export type UserReportIndexResponse = UserReportIndexResponses[keyof UserReportIndexResponses];
3489
+ export type UserReportCreateData = {
3490
+ body: CreateReportRequest;
3491
+ path?: never;
3492
+ query?: never;
3493
+ url: '/v1/user/reports';
3494
+ };
3495
+ export type UserReportCreateErrors = {
3496
+ /**
3497
+ * Bad Request
3498
+ */
3499
+ 400: Error400;
3500
+ /**
3501
+ * Unauthorized
3502
+ */
3503
+ 401: Error401;
3504
+ /**
3505
+ * Not Found
3506
+ */
3507
+ 404: Error404;
3508
+ /**
3509
+ * Internal Server Error
3510
+ */
3511
+ 500: Error500;
3512
+ };
3513
+ export type UserReportCreateError = UserReportCreateErrors[keyof UserReportCreateErrors];
3514
+ export type UserReportCreateResponses = {
3515
+ /**
3516
+ * Report created successfully
3517
+ */
3518
+ 201: Report;
3519
+ };
3520
+ export type UserReportCreateResponse = UserReportCreateResponses[keyof UserReportCreateResponses];
3521
+ export type UserPreferencesShowData = {
3522
+ body?: never;
3523
+ path?: never;
3524
+ query?: never;
3525
+ url: '/v1/user/preferences';
3526
+ };
3527
+ export type UserPreferencesShowErrors = {
3528
+ /**
3529
+ * Unauthorized
3530
+ */
3531
+ 401: Error401;
3532
+ /**
3533
+ * Internal Server Error
3534
+ */
3535
+ 500: Error500;
3536
+ };
3537
+ export type UserPreferencesShowError = UserPreferencesShowErrors[keyof UserPreferencesShowErrors];
3538
+ export type UserPreferencesShowResponses = {
3539
+ /**
3540
+ * OK
3541
+ */
3542
+ 200: UserPreferences;
3543
+ };
3544
+ export type UserPreferencesShowResponse = UserPreferencesShowResponses[keyof UserPreferencesShowResponses];
3545
+ export type UserPreferencesUpdateData = {
3546
+ body: UserPreferences;
3547
+ path?: never;
3548
+ query?: never;
3549
+ url: '/v1/user/preferences';
3550
+ };
3551
+ export type UserPreferencesUpdateErrors = {
3552
+ /**
3553
+ * Unauthorized
3554
+ */
3555
+ 401: Error401;
3556
+ /**
3557
+ * Internal Server Error
3558
+ */
3559
+ 500: Error500;
3560
+ };
3561
+ export type UserPreferencesUpdateError = UserPreferencesUpdateErrors[keyof UserPreferencesUpdateErrors];
3562
+ export type UserPreferencesUpdateResponses = {
3563
+ /**
3564
+ * OK
3565
+ */
3566
+ 200: UserPreferences;
3567
+ };
3568
+ export type UserPreferencesUpdateResponse = UserPreferencesUpdateResponses[keyof UserPreferencesUpdateResponses];
3569
+ export type UserActivityDestroyData = {
3570
+ body?: never;
3571
+ path?: never;
3572
+ query?: {
3573
+ /**
3574
+ * Only clear activities of this type
3575
+ */
3576
+ activityType?: ActivityType;
3577
+ };
3578
+ url: '/v1/user/activity';
3579
+ };
3580
+ export type UserActivityDestroyErrors = {
3581
+ /**
3582
+ * Unauthorized
3583
+ */
3584
+ 401: Error401;
3585
+ /**
3586
+ * Internal Server Error
3587
+ */
3588
+ 500: Error500;
3589
+ };
3590
+ export type UserActivityDestroyError = UserActivityDestroyErrors[keyof UserActivityDestroyErrors];
3591
+ export type UserActivityDestroyResponses = {
3592
+ /**
3593
+ * OK
3594
+ */
3595
+ 200: {
3596
+ message: string;
3597
+ deletedCount: number;
3598
+ };
3599
+ };
3600
+ export type UserActivityDestroyResponse = UserActivityDestroyResponses[keyof UserActivityDestroyResponses];
3601
+ export type UserActivityIndexData = {
3602
+ body?: never;
3603
+ path?: never;
3604
+ query?: {
3605
+ /**
3606
+ * Cursor for pagination (activity ID to start after)
3607
+ */
3608
+ cursor?: number;
3609
+ /**
3610
+ * Number of results per page
3611
+ */
3612
+ limit?: number;
3613
+ /**
3614
+ * Filter by activity type
3615
+ */
3616
+ activityType?: ActivityType;
3617
+ /**
3618
+ * Filter activities to a specific date (YYYY-MM-DD)
3619
+ */
3620
+ date?: string;
3621
+ };
3622
+ url: '/v1/user/activity';
3623
+ };
3624
+ export type UserActivityIndexErrors = {
3625
+ /**
3626
+ * Unauthorized
3627
+ */
3628
+ 401: Error401;
3629
+ /**
3630
+ * Internal Server Error
3631
+ */
3632
+ 500: Error500;
3633
+ };
3634
+ export type UserActivityIndexError = UserActivityIndexErrors[keyof UserActivityIndexErrors];
3635
+ export type UserActivityIndexResponses = {
3636
+ /**
3637
+ * OK
3638
+ */
3639
+ 200: {
3640
+ activities: Array<UserActivity>;
3641
+ pagination: CursorPagination;
3642
+ };
3643
+ };
3644
+ export type UserActivityIndexResponse = UserActivityIndexResponses[keyof UserActivityIndexResponses];
3645
+ export type UserActivityHeatmapShowData = {
3646
+ body?: never;
3647
+ path?: never;
3648
+ query?: {
3649
+ /**
3650
+ * Number of days to include in the heatmap
3651
+ */
3652
+ days?: number;
3653
+ /**
3654
+ * Filter by activity type
3655
+ */
3656
+ activityType?: ActivityType;
3657
+ };
3658
+ url: '/v1/user/activity/heatmap';
3659
+ };
3660
+ export type UserActivityHeatmapShowErrors = {
3661
+ /**
3662
+ * Unauthorized
3663
+ */
3664
+ 401: Error401;
3665
+ /**
3666
+ * Internal Server Error
3667
+ */
3668
+ 500: Error500;
3669
+ };
3670
+ export type UserActivityHeatmapShowError = UserActivityHeatmapShowErrors[keyof UserActivityHeatmapShowErrors];
3671
+ export type UserActivityHeatmapShowResponses = {
3672
+ /**
3673
+ * OK
3674
+ */
3675
+ 200: {
3676
+ /**
3677
+ * Map of YYYY-MM-DD date strings to activity counts
3678
+ */
3679
+ counts: {
3680
+ [key: string]: number;
3681
+ };
3682
+ };
3683
+ };
3684
+ export type UserActivityHeatmapShowResponse = UserActivityHeatmapShowResponses[keyof UserActivityHeatmapShowResponses];
3685
+ export type UserActivityStatsShowData = {
3686
+ body?: never;
3687
+ path?: never;
3688
+ query?: {
3689
+ /**
3690
+ * Only count activities from this date onward (YYYY-MM-DD)
3691
+ */
3692
+ since?: string;
3693
+ };
3694
+ url: '/v1/user/activity/stats';
3695
+ };
3696
+ export type UserActivityStatsShowErrors = {
3697
+ /**
3698
+ * Unauthorized
3699
+ */
3700
+ 401: Error401;
3701
+ /**
3702
+ * Internal Server Error
3703
+ */
3704
+ 500: Error500;
3705
+ };
3706
+ export type UserActivityStatsShowError = UserActivityStatsShowErrors[keyof UserActivityStatsShowErrors];
3707
+ export type UserActivityStatsShowResponses = {
3708
+ /**
3709
+ * OK
3710
+ */
3711
+ 200: {
3712
+ totalSearches: number;
3713
+ totalExports: number;
3714
+ totalPlays: number;
3715
+ totalListAdds: number;
3716
+ /**
3717
+ * Consecutive days with at least one activity
3718
+ */
3719
+ streakDays: number;
3720
+ topMedia: Array<{
3721
+ mediaId: number;
3722
+ count: number;
3723
+ }>;
3724
+ };
3725
+ };
3726
+ export type UserActivityStatsShowResponse = UserActivityStatsShowResponses[keyof UserActivityStatsShowResponses];
3727
+ export type UserExportShowData = {
3728
+ body?: never;
3729
+ path?: never;
3730
+ query?: never;
3731
+ url: '/v1/user/export';
3732
+ };
3733
+ export type UserExportShowErrors = {
3734
+ /**
3735
+ * Unauthorized
3736
+ */
3737
+ 401: Error401;
3738
+ /**
3739
+ * Internal Server Error
3740
+ */
3741
+ 500: Error500;
3742
+ };
3743
+ export type UserExportShowError = UserExportShowErrors[keyof UserExportShowErrors];
3744
+ export type UserExportShowResponses = {
3745
+ /**
3746
+ * OK
3747
+ */
3748
+ 200: UserExportResponse;
3749
+ };
3750
+ export type UserExportShowResponse = UserExportShowResponses[keyof UserExportShowResponses];
3751
+ export type UserLabsIndexData = {
3752
+ body?: never;
3753
+ path?: never;
3754
+ query?: never;
3755
+ url: '/v1/user/labs';
3756
+ };
3757
+ export type UserLabsIndexErrors = {
3758
+ /**
3759
+ * Unauthorized
3760
+ */
3761
+ 401: Error401;
3762
+ /**
3763
+ * Internal Server Error
3764
+ */
3765
+ 500: Error500;
3766
+ };
3767
+ export type UserLabsIndexError = UserLabsIndexErrors[keyof UserLabsIndexErrors];
3768
+ export type UserLabsIndexResponses = {
3769
+ /**
3770
+ * OK
3771
+ */
3772
+ 200: Array<UserLabFeature>;
3773
+ };
3774
+ export type UserLabsIndexResponse = UserLabsIndexResponses[keyof UserLabsIndexResponses];
3775
+ export type CollectionIndexData = {
3776
+ body?: never;
3777
+ path?: never;
3778
+ query?: {
3779
+ /**
3780
+ * Filter by visibility
3781
+ */
3782
+ visibility?: 'public' | 'private';
3783
+ /**
3784
+ * Cursor offset for pagination
3785
+ */
3786
+ cursor?: number;
3787
+ /**
3788
+ * Page number (1-indexed)
3789
+ *
3790
+ * @deprecated
3791
+ */
3792
+ page?: number;
3793
+ /**
3794
+ * Items per page
3795
+ */
3796
+ limit?: number;
3797
+ };
3798
+ url: '/v1/collections';
3799
+ };
3800
+ export type CollectionIndexErrors = {
3801
+ /**
3802
+ * Bad Request
3803
+ */
3804
+ 400: Error400;
3805
+ /**
3806
+ * Unauthorized
3807
+ */
3808
+ 401: Error401;
3809
+ /**
3810
+ * Forbidden
3811
+ */
3812
+ 403: Error403;
3813
+ /**
3814
+ * Too Many Requests
3815
+ */
3816
+ 429: Error429;
3817
+ /**
3818
+ * Internal Server Error
3819
+ */
3820
+ 500: Error500;
3821
+ };
3822
+ export type CollectionIndexError = CollectionIndexErrors[keyof CollectionIndexErrors];
3823
+ export type CollectionIndexResponses = {
3824
+ /**
3825
+ * OK
3826
+ */
3827
+ 200: CollectionListResponse;
3828
+ };
3829
+ export type CollectionIndexResponse = CollectionIndexResponses[keyof CollectionIndexResponses];
3830
+ export type CollectionCreateData = {
3831
+ body: CollectionRequests;
3832
+ path?: never;
3833
+ query?: never;
3834
+ url: '/v1/collections';
3835
+ };
3836
+ export type CollectionCreateErrors = {
3837
+ /**
3838
+ * Bad Request
3839
+ */
3840
+ 400: Error400;
3841
+ /**
3842
+ * Unauthorized
3843
+ */
3844
+ 401: Error401;
3845
+ /**
3846
+ * Forbidden
3847
+ */
3848
+ 403: Error403;
3849
+ /**
3850
+ * Too Many Requests
3851
+ */
3852
+ 429: Error429;
3853
+ /**
3854
+ * Internal Server Error
3855
+ */
3856
+ 500: Error500;
3857
+ };
3858
+ export type CollectionCreateError = CollectionCreateErrors[keyof CollectionCreateErrors];
3859
+ export type CollectionCreateResponses = {
3860
+ /**
3861
+ * Created
3862
+ */
3863
+ 201: Collection;
3864
+ };
3865
+ export type CollectionCreateResponse = CollectionCreateResponses[keyof CollectionCreateResponses];
3866
+ export type CollectionDestroyData = {
3867
+ body?: never;
3868
+ path: {
3869
+ /**
3870
+ * Collection ID
3871
+ */
3872
+ id: number;
3873
+ };
3874
+ query?: never;
3875
+ url: '/v1/collections/{id}';
3876
+ };
3877
+ export type CollectionDestroyErrors = {
3878
+ /**
3879
+ * Bad Request
3880
+ */
3881
+ 400: Error400;
3882
+ /**
3883
+ * Unauthorized
3884
+ */
3885
+ 401: Error401;
3886
+ /**
3887
+ * Forbidden
3888
+ */
3889
+ 403: Error403;
3890
+ /**
3891
+ * Not Found
3892
+ */
3893
+ 404: Error404;
3894
+ /**
3895
+ * Too Many Requests
3896
+ */
3897
+ 429: Error429;
3898
+ /**
3899
+ * Internal Server Error
3900
+ */
3901
+ 500: Error500;
3902
+ };
3903
+ export type CollectionDestroyError = CollectionDestroyErrors[keyof CollectionDestroyErrors];
3904
+ export type CollectionDestroyResponses = {
3905
+ /**
3906
+ * No Content
3907
+ */
3908
+ 204: void;
3909
+ };
3910
+ export type CollectionDestroyResponse = CollectionDestroyResponses[keyof CollectionDestroyResponses];
3911
+ export type CollectionShowData = {
3912
+ body?: never;
3913
+ path: {
3914
+ /**
3915
+ * Collection ID
3916
+ */
3917
+ id: number;
3918
+ };
3919
+ query?: {
3920
+ /**
3921
+ * Cursor offset for paginated segments
3922
+ */
3923
+ cursor?: number;
3924
+ /**
3925
+ * Page number (1-indexed)
3926
+ *
3927
+ * @deprecated
3928
+ */
3929
+ page?: number;
3930
+ /**
3931
+ * Items per page
3932
+ */
3933
+ limit?: number;
3934
+ };
3935
+ url: '/v1/collections/{id}';
3936
+ };
3937
+ export type CollectionShowErrors = {
3938
+ /**
3939
+ * Bad Request
3940
+ */
3941
+ 400: Error400;
3942
+ /**
3943
+ * Unauthorized
3944
+ */
3945
+ 401: Error401;
3946
+ /**
3947
+ * Forbidden
3948
+ */
3949
+ 403: Error403;
3950
+ /**
3951
+ * Not Found
3952
+ */
3953
+ 404: Error404;
3954
+ /**
3955
+ * Too Many Requests
3956
+ */
3957
+ 429: Error429;
3958
+ /**
3959
+ * Internal Server Error
3960
+ */
3961
+ 500: Error500;
3962
+ };
3963
+ export type CollectionShowError = CollectionShowErrors[keyof CollectionShowErrors];
3964
+ export type CollectionShowResponses = {
3965
+ /**
3966
+ * OK
3967
+ */
3968
+ 200: CollectionWithSegments;
3969
+ };
3970
+ export type CollectionShowResponse = CollectionShowResponses[keyof CollectionShowResponses];
3971
+ export type CollectionUpdateData = {
3972
+ body: {
3973
+ name?: string;
3974
+ visibility?: 'PUBLIC' | 'PRIVATE';
3975
+ };
3976
+ path: {
3977
+ /**
3978
+ * Collection ID
3979
+ */
3980
+ id: number;
3981
+ };
3982
+ query?: never;
3983
+ url: '/v1/collections/{id}';
3984
+ };
3985
+ export type CollectionUpdateErrors = {
3986
+ /**
3987
+ * Bad Request
3988
+ */
3989
+ 400: Error400;
3990
+ /**
3991
+ * Unauthorized
3992
+ */
3993
+ 401: Error401;
3994
+ /**
3995
+ * Forbidden
3996
+ */
3997
+ 403: Error403;
3998
+ /**
3999
+ * Not Found
4000
+ */
4001
+ 404: Error404;
4002
+ /**
4003
+ * Too Many Requests
4004
+ */
4005
+ 429: Error429;
4006
+ /**
4007
+ * Internal Server Error
4008
+ */
4009
+ 500: Error500;
4010
+ };
4011
+ export type CollectionUpdateError = CollectionUpdateErrors[keyof CollectionUpdateErrors];
4012
+ export type CollectionUpdateResponses = {
4013
+ /**
4014
+ * OK
4015
+ */
4016
+ 200: Collection;
4017
+ };
4018
+ export type CollectionUpdateResponse = CollectionUpdateResponses[keyof CollectionUpdateResponses];
4019
+ export type CollectionAddSegmentData = {
4020
+ body: {
4021
+ /**
4022
+ * UUID of the segment to add
4023
+ */
4024
+ segmentUuid: string;
4025
+ /**
4026
+ * Optional annotation
4027
+ */
4028
+ note?: string;
4029
+ };
4030
+ path: {
4031
+ /**
4032
+ * Collection ID
4033
+ */
4034
+ id: number;
4035
+ };
4036
+ query?: never;
4037
+ url: '/v1/collections/{id}/segments';
4038
+ };
4039
+ export type CollectionAddSegmentErrors = {
4040
+ /**
4041
+ * Bad Request
4042
+ */
4043
+ 400: Error400;
4044
+ /**
4045
+ * Unauthorized
4046
+ */
4047
+ 401: Error401;
4048
+ /**
4049
+ * Forbidden
4050
+ */
4051
+ 403: Error403;
4052
+ /**
4053
+ * Not Found
4054
+ */
4055
+ 404: Error404;
4056
+ /**
4057
+ * Too Many Requests
4058
+ */
4059
+ 429: Error429;
4060
+ /**
4061
+ * Internal Server Error
4062
+ */
4063
+ 500: Error500;
4064
+ };
4065
+ export type CollectionAddSegmentError = CollectionAddSegmentErrors[keyof CollectionAddSegmentErrors];
4066
+ export type CollectionAddSegmentResponses = {
4067
+ /**
4068
+ * No Content
4069
+ */
4070
+ 204: void;
4071
+ };
4072
+ export type CollectionAddSegmentResponse = CollectionAddSegmentResponses[keyof CollectionAddSegmentResponses];
4073
+ export type CollectionRemoveSegmentData = {
4074
+ body?: never;
4075
+ path: {
4076
+ /**
4077
+ * Collection ID
4078
+ */
4079
+ id: number;
4080
+ /**
4081
+ * Segment UUID
4082
+ */
4083
+ uuid: string;
4084
+ };
4085
+ query?: never;
4086
+ url: '/v1/collections/{id}/segments/{uuid}';
4087
+ };
4088
+ export type CollectionRemoveSegmentErrors = {
4089
+ /**
4090
+ * Bad Request
4091
+ */
4092
+ 400: Error400;
4093
+ /**
4094
+ * Unauthorized
4095
+ */
4096
+ 401: Error401;
4097
+ /**
4098
+ * Forbidden
4099
+ */
4100
+ 403: Error403;
4101
+ /**
4102
+ * Not Found
4103
+ */
4104
+ 404: Error404;
4105
+ /**
4106
+ * Too Many Requests
4107
+ */
4108
+ 429: Error429;
4109
+ /**
4110
+ * Internal Server Error
4111
+ */
4112
+ 500: Error500;
4113
+ };
4114
+ export type CollectionRemoveSegmentError = CollectionRemoveSegmentErrors[keyof CollectionRemoveSegmentErrors];
4115
+ export type CollectionRemoveSegmentResponses = {
4116
+ /**
4117
+ * No Content
4118
+ */
4119
+ 204: void;
4120
+ };
4121
+ export type CollectionRemoveSegmentResponse = CollectionRemoveSegmentResponses[keyof CollectionRemoveSegmentResponses];
4122
+ export type CollectionUpdateSegmentData = {
4123
+ body: {
4124
+ /**
4125
+ * New position in the collection
4126
+ */
4127
+ position?: number;
4128
+ /**
4129
+ * Updated annotation
4130
+ */
4131
+ note?: string;
4132
+ };
4133
+ path: {
4134
+ /**
4135
+ * Collection ID
4136
+ */
4137
+ id: number;
4138
+ /**
4139
+ * Segment UUID
4140
+ */
4141
+ uuid: string;
4142
+ };
4143
+ query?: never;
4144
+ url: '/v1/collections/{id}/segments/{uuid}';
4145
+ };
4146
+ export type CollectionUpdateSegmentErrors = {
4147
+ /**
4148
+ * Bad Request
4149
+ */
4150
+ 400: Error400;
4151
+ /**
4152
+ * Unauthorized
4153
+ */
4154
+ 401: Error401;
4155
+ /**
4156
+ * Forbidden
4157
+ */
4158
+ 403: Error403;
4159
+ /**
4160
+ * Not Found
4161
+ */
4162
+ 404: Error404;
4163
+ /**
4164
+ * Too Many Requests
4165
+ */
4166
+ 429: Error429;
4167
+ /**
4168
+ * Internal Server Error
4169
+ */
4170
+ 500: Error500;
4171
+ };
4172
+ export type CollectionUpdateSegmentError = CollectionUpdateSegmentErrors[keyof CollectionUpdateSegmentErrors];
4173
+ export type CollectionUpdateSegmentResponses = {
4174
+ /**
4175
+ * No Content
4176
+ */
4177
+ 204: void;
4178
+ };
4179
+ export type CollectionUpdateSegmentResponse = CollectionUpdateSegmentResponses[keyof CollectionUpdateSegmentResponses];
4180
+ export type AdminDashboardShowData = {
4181
+ body?: never;
4182
+ path?: never;
4183
+ query?: never;
4184
+ url: '/v1/admin/dashboard';
4185
+ };
4186
+ export type AdminDashboardShowErrors = {
4187
+ /**
4188
+ * Unauthorized
4189
+ */
4190
+ 401: Error401;
4191
+ /**
4192
+ * Forbidden
4193
+ */
4194
+ 403: Error403;
4195
+ /**
4196
+ * Too Many Requests
4197
+ */
4198
+ 429: Error429;
4199
+ /**
4200
+ * Internal Server Error
4201
+ */
4202
+ 500: Error500;
4203
+ };
4204
+ export type AdminDashboardShowError = AdminDashboardShowErrors[keyof AdminDashboardShowErrors];
4205
+ export type AdminDashboardShowResponses = {
4206
+ /**
4207
+ * OK
4208
+ */
4209
+ 200: {
4210
+ media: {
4211
+ totalMedia: number;
4212
+ totalEpisodes: number;
4213
+ totalSegments: number;
4214
+ totalCharacters: number;
4215
+ totalSeiyuu: number;
4216
+ };
4217
+ users: {
4218
+ totalUsers: number;
4219
+ /**
4220
+ * Users registered in the last 30 days
4221
+ */
4222
+ recentlyRegisteredCount: number;
4223
+ /**
4224
+ * Users active in the last 30 days
4225
+ */
4226
+ recentlyActiveCount: number;
4227
+ };
4228
+ activity: {
4229
+ totalSearches: number;
4230
+ totalExports: number;
4231
+ totalPlays: number;
4232
+ totalCollectionAdds: number;
4233
+ /**
4234
+ * Unique users who searched in the last 7 days
4235
+ */
4236
+ activeSearchers7d: number;
4237
+ topQueries7d: Array<{
4238
+ query: string;
4239
+ count: number;
4240
+ }>;
4241
+ dailyActivity30d: Array<{
4242
+ date: string;
4243
+ count: number;
4244
+ }>;
4245
+ };
4246
+ system: {
4247
+ status: 'healthy' | 'degraded';
4248
+ app: {
4249
+ version: string;
4250
+ };
4251
+ elasticsearch: {
4252
+ status: 'connected' | 'disconnected';
4253
+ version?: string;
4254
+ clusterName?: string;
4255
+ clusterStatus?: string;
4256
+ indexName?: string;
4257
+ documentCount?: number;
4258
+ };
4259
+ database: {
4260
+ status: 'connected' | 'disconnected';
4261
+ version?: string;
4262
+ };
4263
+ queues: Array<{
4264
+ queue: string;
4265
+ stuckCount: number;
4266
+ failedCount: number;
4267
+ }>;
4268
+ };
4269
+ };
4270
+ };
4271
+ export type AdminDashboardShowResponse = AdminDashboardShowResponses[keyof AdminDashboardShowResponses];
4272
+ export type AdminHealthShowData = {
4273
+ body?: never;
4274
+ path?: never;
4275
+ query?: never;
4276
+ url: '/v1/admin/health';
4277
+ };
4278
+ export type AdminHealthShowErrors = {
4279
+ /**
4280
+ * Unauthorized
4281
+ */
4282
+ 401: Error401;
4283
+ /**
4284
+ * Forbidden
4285
+ */
4286
+ 403: Error403;
4287
+ /**
4288
+ * Too Many Requests
4289
+ */
4290
+ 429: Error429;
4291
+ /**
4292
+ * Internal Server Error
4293
+ */
4294
+ 500: Error500;
4295
+ };
4296
+ export type AdminHealthShowError = AdminHealthShowErrors[keyof AdminHealthShowErrors];
4297
+ export type AdminHealthShowResponses = {
4298
+ /**
4299
+ * OK
4300
+ */
4301
+ 200: {
4302
+ /**
4303
+ * Overall system status
4304
+ */
4305
+ status: 'healthy' | 'degraded';
4306
+ app: {
4307
+ /**
4308
+ * API version from OpenAPI spec
4309
+ */
4310
+ version: string;
4311
+ };
4312
+ elasticsearch: {
4313
+ status: 'connected' | 'disconnected';
4314
+ version?: string;
4315
+ clusterName?: string;
4316
+ /**
4317
+ * ES cluster health (green, yellow, red)
4318
+ */
4319
+ clusterStatus?: string;
4320
+ indexName?: string;
4321
+ documentCount?: number;
4322
+ };
4323
+ database: {
4324
+ status: 'connected' | 'disconnected';
4325
+ version?: string;
4326
+ };
4327
+ };
4328
+ };
4329
+ export type AdminHealthShowResponse = AdminHealthShowResponses[keyof AdminHealthShowResponses];
4330
+ export type AdminReindexCreateData = {
4331
+ body?: ReindexRequest;
4332
+ path?: never;
4333
+ query?: never;
4334
+ url: '/v1/admin/reindex';
4335
+ };
4336
+ export type AdminReindexCreateErrors = {
4337
+ /**
4338
+ * Bad Request
4339
+ */
4340
+ 400: Error400;
4341
+ /**
4342
+ * Unauthorized
4343
+ */
4344
+ 401: Error401;
4345
+ /**
4346
+ * Forbidden
4347
+ */
4348
+ 403: Error403;
4349
+ /**
4350
+ * Too Many Requests
4351
+ */
4352
+ 429: Error429;
4353
+ /**
4354
+ * Internal Server Error
4355
+ */
4356
+ 500: Error500;
4357
+ };
4358
+ export type AdminReindexCreateError = AdminReindexCreateErrors[keyof AdminReindexCreateErrors];
4359
+ export type AdminReindexCreateResponses = {
4360
+ /**
4361
+ * Reindex operation completed
4362
+ */
4363
+ 200: ReindexResponse;
4364
+ };
4365
+ export type AdminReindexCreateResponse = AdminReindexCreateResponses[keyof AdminReindexCreateResponses];
4366
+ export type AdminQueueStatsIndexData = {
4367
+ body?: never;
4368
+ path?: never;
4369
+ query?: never;
4370
+ url: '/v1/admin/queues/stats';
4371
+ };
4372
+ export type AdminQueueStatsIndexErrors = {
4373
+ /**
4374
+ * Bad Request
4375
+ */
4376
+ 400: Error400;
4377
+ /**
4378
+ * Unauthorized
4379
+ */
4380
+ 401: Error401;
4381
+ /**
4382
+ * Forbidden
4383
+ */
4384
+ 403: Error403;
4385
+ /**
4386
+ * Too Many Requests
4387
+ */
4388
+ 429: Error429;
4389
+ /**
4390
+ * Internal Server Error
4391
+ */
4392
+ 500: Error500;
4393
+ };
4394
+ export type AdminQueueStatsIndexError = AdminQueueStatsIndexErrors[keyof AdminQueueStatsIndexErrors];
4395
+ export type AdminQueueStatsIndexResponses = {
4396
+ /**
4397
+ * Queue statistics retrieved successfully
4398
+ */
4399
+ 200: Array<{
4400
+ queue?: string;
4401
+ /**
4402
+ * Number of jobs currently pending/active
4403
+ */
4404
+ stuckCount?: number;
4405
+ /**
4406
+ * Number of failed jobs
4407
+ */
4408
+ failedCount?: number;
4409
+ }>;
4410
+ };
4411
+ export type AdminQueueStatsIndexResponse = AdminQueueStatsIndexResponses[keyof AdminQueueStatsIndexResponses];
4412
+ export type AdminQueueShowData = {
4413
+ body?: never;
4414
+ path: {
4415
+ /**
4416
+ * The name of the queue
4417
+ */
4418
+ queueName: 'es-sync-create' | 'es-sync-update' | 'es-sync-delete';
4419
+ };
4420
+ query?: never;
4421
+ url: '/v1/admin/queues/{queueName}';
4422
+ };
4423
+ export type AdminQueueShowErrors = {
4424
+ /**
4425
+ * Bad Request
4426
+ */
4427
+ 400: Error400;
4428
+ /**
4429
+ * Unauthorized
4430
+ */
4431
+ 401: Error401;
4432
+ /**
4433
+ * Forbidden
4434
+ */
4435
+ 403: Error403;
4436
+ /**
4437
+ * Not Found
4438
+ */
4439
+ 404: Error404;
4440
+ /**
4441
+ * Too Many Requests
4442
+ */
4443
+ 429: Error429;
4444
+ /**
4445
+ * Internal Server Error
4446
+ */
4447
+ 500: Error500;
4448
+ };
4449
+ export type AdminQueueShowError = AdminQueueShowErrors[keyof AdminQueueShowErrors];
4450
+ export type AdminQueueShowResponses = {
4451
+ /**
4452
+ * Queue details retrieved successfully
4453
+ */
4454
+ 200: {
4455
+ queue: string;
4456
+ stats: {
4457
+ /**
4458
+ * Jobs scheduled for future execution (`start_after > now()`)
4459
+ */
4460
+ deferred: number;
4461
+ /**
4462
+ * Jobs currently queued and waiting to be processed
4463
+ */
4464
+ queued: number;
4465
+ /**
4466
+ * Jobs currently being processed
4467
+ */
4468
+ active: number;
4469
+ /**
4470
+ * Total jobs currently stored in the queue table
4471
+ */
4472
+ total: number;
4473
+ };
4474
+ metadata: {
4475
+ policy: string;
4476
+ partition: boolean;
4477
+ deadLetter?: string;
4478
+ warningQueueSize?: number;
4479
+ retryLimit?: number;
4480
+ /**
4481
+ * Initial retry delay in seconds
4482
+ */
4483
+ retryDelay?: number;
4484
+ retryBackoff?: boolean;
4485
+ retryDelayMax?: number;
4486
+ expireInSeconds?: number;
4487
+ retentionSeconds?: number;
4488
+ deleteAfterSeconds?: number;
4489
+ createdOn: string;
4490
+ updatedOn: string;
4491
+ singletonsActive: Array<string>;
4492
+ table: string;
4493
+ };
4494
+ };
4495
+ };
4496
+ export type AdminQueueShowResponse = AdminQueueShowResponses[keyof AdminQueueShowResponses];
4497
+ export type AdminQueueFailedIndexData = {
4498
+ body?: never;
4499
+ path: {
4500
+ /**
4501
+ * The name of the queue
4502
+ */
4503
+ queueName: 'es-sync-create' | 'es-sync-update' | 'es-sync-delete';
4504
+ };
4505
+ query?: never;
4506
+ url: '/v1/admin/queues/{queueName}/failed';
4507
+ };
4508
+ export type AdminQueueFailedIndexErrors = {
4509
+ /**
4510
+ * Bad Request
4511
+ */
4512
+ 400: Error400;
4513
+ /**
4514
+ * Unauthorized
4515
+ */
4516
+ 401: Error401;
4517
+ /**
4518
+ * Forbidden
4519
+ */
4520
+ 403: Error403;
4521
+ /**
4522
+ * Too Many Requests
4523
+ */
4524
+ 429: Error429;
4525
+ /**
4526
+ * Internal Server Error
4527
+ */
4528
+ 500: Error500;
4529
+ };
4530
+ export type AdminQueueFailedIndexError = AdminQueueFailedIndexErrors[keyof AdminQueueFailedIndexErrors];
4531
+ export type AdminQueueFailedIndexResponses = {
4532
+ /**
4533
+ * Failed jobs retrieved successfully
4534
+ */
4535
+ 200: Array<{
4536
+ /**
4537
+ * Job ID
4538
+ */
4539
+ id?: string;
4540
+ /**
4541
+ * The segment ID that failed to sync
4542
+ */
4543
+ segmentId?: number;
4544
+ /**
4545
+ * Error message from the last attempt
4546
+ */
4547
+ error?: string;
4548
+ /**
4549
+ * When the job was created
4550
+ */
4551
+ createdOn?: string;
4552
+ }>;
4553
+ };
4554
+ export type AdminQueueFailedIndexResponse = AdminQueueFailedIndexResponses[keyof AdminQueueFailedIndexResponses];
4555
+ export type AdminQueueRetryCreateData = {
4556
+ body?: never;
4557
+ path: {
4558
+ /**
4559
+ * The name of the queue
4560
+ */
4561
+ queueName: 'es-sync-create' | 'es-sync-update' | 'es-sync-delete';
4562
+ };
4563
+ query?: never;
4564
+ url: '/v1/admin/queues/{queueName}/retry';
4565
+ };
4566
+ export type AdminQueueRetryCreateErrors = {
4567
+ /**
4568
+ * Bad Request
4569
+ */
4570
+ 400: Error400;
4571
+ /**
4572
+ * Unauthorized
4573
+ */
4574
+ 401: Error401;
4575
+ /**
4576
+ * Forbidden
4577
+ */
4578
+ 403: Error403;
4579
+ /**
4580
+ * Too Many Requests
4581
+ */
4582
+ 429: Error429;
4583
+ /**
4584
+ * Internal Server Error
4585
+ */
4586
+ 500: Error500;
4587
+ };
4588
+ export type AdminQueueRetryCreateError = AdminQueueRetryCreateErrors[keyof AdminQueueRetryCreateErrors];
4589
+ export type AdminQueueRetryCreateResponses = {
4590
+ /**
4591
+ * Jobs queued for retry
4592
+ */
4593
+ 200: {
4594
+ success?: boolean;
4595
+ /**
4596
+ * Number of jobs queued for retry
4597
+ */
4598
+ retriedCount?: number;
4599
+ message?: string;
4600
+ };
4601
+ };
4602
+ export type AdminQueueRetryCreateResponse = AdminQueueRetryCreateResponses[keyof AdminQueueRetryCreateResponses];
4603
+ export type AdminQueueFailedDestroyData = {
4604
+ body?: never;
4605
+ path: {
4606
+ /**
4607
+ * The name of the queue
4608
+ */
4609
+ queueName: 'es-sync-create' | 'es-sync-update' | 'es-sync-delete';
4610
+ };
4611
+ query?: never;
4612
+ url: '/v1/admin/queues/{queueName}/purge';
4613
+ };
4614
+ export type AdminQueueFailedDestroyErrors = {
4615
+ /**
4616
+ * Bad Request
4617
+ */
4618
+ 400: Error400;
4619
+ /**
4620
+ * Unauthorized
4621
+ */
4622
+ 401: Error401;
4623
+ /**
4624
+ * Forbidden
4625
+ */
4626
+ 403: Error403;
4627
+ /**
4628
+ * Too Many Requests
4629
+ */
4630
+ 429: Error429;
4631
+ /**
4632
+ * Internal Server Error
4633
+ */
4634
+ 500: Error500;
4635
+ };
4636
+ export type AdminQueueFailedDestroyError = AdminQueueFailedDestroyErrors[keyof AdminQueueFailedDestroyErrors];
4637
+ export type AdminQueueFailedDestroyResponses = {
4638
+ /**
4639
+ * Failed jobs purged successfully
4640
+ */
4641
+ 200: {
4642
+ success?: boolean;
4643
+ /**
4644
+ * Number of failed jobs deleted
4645
+ */
4646
+ purgedCount?: number;
4647
+ message?: string;
4648
+ };
4649
+ };
4650
+ export type AdminQueueFailedDestroyResponse = AdminQueueFailedDestroyResponses[keyof AdminQueueFailedDestroyResponses];
4651
+ export type AdminReportIndexData = {
4652
+ body?: never;
4653
+ path?: never;
4654
+ query?: {
4655
+ /**
4656
+ * Cursor for pagination (report ID to start after)
4657
+ */
4658
+ cursor?: number;
4659
+ /**
4660
+ * Number of results per page
4661
+ */
4662
+ limit?: number;
4663
+ /**
4664
+ * Filter by report status
4665
+ */
4666
+ status?: 'PENDING' | 'CONCERN' | 'ACCEPTED' | 'REJECTED' | 'RESOLVED' | 'IGNORED';
4667
+ /**
4668
+ * Filter by report source
4669
+ */
4670
+ source?: 'USER' | 'AUTO';
4671
+ /**
4672
+ * Filter by target type
4673
+ */
4674
+ 'target.type'?: 'SEGMENT' | 'EPISODE' | 'MEDIA';
4675
+ /**
4676
+ * Filter by target media ID
4677
+ */
4678
+ 'target.mediaId'?: number;
4679
+ /**
4680
+ * Filter by target episode number
4681
+ */
4682
+ 'target.episodeNumber'?: number;
4683
+ /**
4684
+ * Filter by target segment UUID
4685
+ */
4686
+ 'target.segmentUuid'?: string;
4687
+ /**
4688
+ * Filter by review check run ID
4689
+ */
4690
+ reviewCheckRunId?: number;
4691
+ };
4692
+ url: '/v1/admin/reports';
4693
+ };
4694
+ export type AdminReportIndexErrors = {
4695
+ /**
4696
+ * Unauthorized
4697
+ */
4698
+ 401: Error401;
4699
+ /**
4700
+ * Forbidden
4701
+ */
4702
+ 403: Error403;
4703
+ /**
4704
+ * Too Many Requests
4705
+ */
4706
+ 429: Error429;
4707
+ /**
4708
+ * Internal Server Error
4709
+ */
4710
+ 500: Error500;
4711
+ };
4712
+ export type AdminReportIndexError = AdminReportIndexErrors[keyof AdminReportIndexErrors];
4713
+ export type AdminReportIndexResponses = {
4714
+ /**
4715
+ * OK
4716
+ */
4717
+ 200: AdminReportListResponse;
4718
+ };
4719
+ export type AdminReportIndexResponse = AdminReportIndexResponses[keyof AdminReportIndexResponses];
4720
+ export type AdminReportUpdateData = {
4721
+ body: UpdateReportRequest;
4722
+ path: {
4723
+ /**
4724
+ * Report ID
4725
+ */
4726
+ id: number;
4727
+ };
4728
+ query?: never;
4729
+ url: '/v1/admin/reports/{id}';
4730
+ };
4731
+ export type AdminReportUpdateErrors = {
4732
+ /**
4733
+ * Bad Request
4734
+ */
4735
+ 400: Error400;
4736
+ /**
4737
+ * Unauthorized
4738
+ */
4739
+ 401: Error401;
4740
+ /**
4741
+ * Forbidden
4742
+ */
4743
+ 403: Error403;
4744
+ /**
4745
+ * Not Found
4746
+ */
4747
+ 404: Error404;
4748
+ /**
4749
+ * Too Many Requests
4750
+ */
4751
+ 429: Error429;
4752
+ /**
4753
+ * Internal Server Error
4754
+ */
4755
+ 500: Error500;
4756
+ };
4757
+ export type AdminReportUpdateError = AdminReportUpdateErrors[keyof AdminReportUpdateErrors];
4758
+ export type AdminReportUpdateResponses = {
4759
+ /**
4760
+ * Report updated successfully
4761
+ */
4762
+ 200: Report;
4763
+ };
4764
+ export type AdminReportUpdateResponse = AdminReportUpdateResponses[keyof AdminReportUpdateResponses];
4765
+ export type AdminReviewRunCreateData = {
4766
+ body?: never;
4767
+ path?: never;
4768
+ query?: {
4769
+ /**
4770
+ * Optional category filter
4771
+ */
4772
+ category?: 'ANIME' | 'JDRAMA';
4773
+ /**
4774
+ * Optional check name to run a single check instead of all
4775
+ */
4776
+ checkName?: string;
4777
+ };
4778
+ url: '/v1/admin/review/run';
4779
+ };
4780
+ export type AdminReviewRunCreateErrors = {
4781
+ /**
4782
+ * Unauthorized
4783
+ */
4784
+ 401: Error401;
4785
+ /**
4786
+ * Forbidden
4787
+ */
4788
+ 403: Error403;
4789
+ /**
4790
+ * Too Many Requests
4791
+ */
4792
+ 429: Error429;
4793
+ /**
4794
+ * Internal Server Error
4795
+ */
4796
+ 500: Error500;
4797
+ };
4798
+ export type AdminReviewRunCreateError = AdminReviewRunCreateErrors[keyof AdminReviewRunCreateErrors];
4799
+ export type AdminReviewRunCreateResponses = {
4800
+ /**
4801
+ * Check run completed
4802
+ */
4803
+ 200: RunReviewResponse;
4804
+ };
4805
+ export type AdminReviewRunCreateResponse = AdminReviewRunCreateResponses[keyof AdminReviewRunCreateResponses];
4806
+ export type AdminReviewCheckIndexData = {
4807
+ body?: never;
4808
+ path?: never;
4809
+ query?: never;
4810
+ url: '/v1/admin/review/checks';
4811
+ };
4812
+ export type AdminReviewCheckIndexErrors = {
4813
+ /**
4814
+ * Unauthorized
4815
+ */
4816
+ 401: Error401;
4817
+ /**
4818
+ * Forbidden
4819
+ */
4820
+ 403: Error403;
4821
+ /**
4822
+ * Too Many Requests
4823
+ */
4824
+ 429: Error429;
4825
+ /**
4826
+ * Internal Server Error
4827
+ */
4828
+ 500: Error500;
4829
+ };
4830
+ export type AdminReviewCheckIndexError = AdminReviewCheckIndexErrors[keyof AdminReviewCheckIndexErrors];
4831
+ export type AdminReviewCheckIndexResponses = {
4832
+ /**
4833
+ * OK
4834
+ */
4835
+ 200: Array<ReviewCheck>;
4836
+ };
4837
+ export type AdminReviewCheckIndexResponse = AdminReviewCheckIndexResponses[keyof AdminReviewCheckIndexResponses];
4838
+ export type AdminReviewCheckUpdateData = {
4839
+ body: {
4840
+ /**
4841
+ * New threshold values
4842
+ */
4843
+ threshold?: {
4844
+ [key: string]: unknown;
4845
+ };
4846
+ /**
4847
+ * Enable or disable this check
4848
+ */
4849
+ enabled?: boolean;
4850
+ };
4851
+ path: {
4852
+ /**
4853
+ * Check name identifier
4854
+ */
4855
+ name: string;
4856
+ };
4857
+ query?: never;
4858
+ url: '/v1/admin/review/checks/{name}';
4859
+ };
4860
+ export type AdminReviewCheckUpdateErrors = {
4861
+ /**
4862
+ * Bad Request
4863
+ */
4864
+ 400: Error400;
4865
+ /**
4866
+ * Unauthorized
4867
+ */
4868
+ 401: Error401;
4869
+ /**
4870
+ * Forbidden
4871
+ */
4872
+ 403: Error403;
4873
+ /**
4874
+ * Not Found
4875
+ */
4876
+ 404: Error404;
4877
+ /**
4878
+ * Too Many Requests
4879
+ */
4880
+ 429: Error429;
4881
+ /**
4882
+ * Internal Server Error
4883
+ */
4884
+ 500: Error500;
4885
+ };
4886
+ export type AdminReviewCheckUpdateError = AdminReviewCheckUpdateErrors[keyof AdminReviewCheckUpdateErrors];
4887
+ export type AdminReviewCheckUpdateResponses = {
4888
+ /**
4889
+ * Check updated successfully
4890
+ */
4891
+ 200: ReviewCheck;
4892
+ };
4893
+ export type AdminReviewCheckUpdateResponse = AdminReviewCheckUpdateResponses[keyof AdminReviewCheckUpdateResponses];
4894
+ export type AdminReviewRunIndexData = {
4895
+ body?: never;
4896
+ path?: never;
4897
+ query?: {
4898
+ /**
4899
+ * Filter by check name
4900
+ */
4901
+ checkName?: string;
4902
+ /**
4903
+ * Cursor for pagination
4904
+ */
4905
+ cursor?: number;
4906
+ /**
4907
+ * Number of results per page
4908
+ */
4909
+ limit?: number;
4910
+ };
4911
+ url: '/v1/admin/review/runs';
4912
+ };
4913
+ export type AdminReviewRunIndexErrors = {
4914
+ /**
4915
+ * Unauthorized
4916
+ */
4917
+ 401: Error401;
4918
+ /**
4919
+ * Forbidden
4920
+ */
4921
+ 403: Error403;
4922
+ /**
4923
+ * Too Many Requests
4924
+ */
4925
+ 429: Error429;
4926
+ /**
4927
+ * Internal Server Error
4928
+ */
4929
+ 500: Error500;
4930
+ };
4931
+ export type AdminReviewRunIndexError = AdminReviewRunIndexErrors[keyof AdminReviewRunIndexErrors];
4932
+ export type AdminReviewRunIndexResponses = {
4933
+ /**
4934
+ * OK
4935
+ */
4936
+ 200: {
4937
+ runs: Array<ReviewCheckRun>;
4938
+ pagination: CursorPagination;
4939
+ };
4940
+ };
4941
+ export type AdminReviewRunIndexResponse = AdminReviewRunIndexResponses[keyof AdminReviewRunIndexResponses];
4942
+ export type AdminReviewRunShowData = {
4943
+ body?: never;
4944
+ path: {
4945
+ /**
4946
+ * Run ID
4947
+ */
4948
+ id: number;
4949
+ };
4950
+ query?: never;
4951
+ url: '/v1/admin/review/runs/{id}';
4952
+ };
4953
+ export type AdminReviewRunShowErrors = {
4954
+ /**
4955
+ * Unauthorized
4956
+ */
4957
+ 401: Error401;
4958
+ /**
4959
+ * Forbidden
4960
+ */
4961
+ 403: Error403;
4962
+ /**
4963
+ * Not Found
4964
+ */
4965
+ 404: Error404;
4966
+ /**
4967
+ * Too Many Requests
4968
+ */
4969
+ 429: Error429;
4970
+ /**
4971
+ * Internal Server Error
4972
+ */
4973
+ 500: Error500;
4974
+ };
4975
+ export type AdminReviewRunShowError = AdminReviewRunShowErrors[keyof AdminReviewRunShowErrors];
4976
+ export type AdminReviewRunShowResponses = {
4977
+ /**
4978
+ * OK
4979
+ */
4980
+ 200: {
4981
+ run: ReviewCheckRun;
4982
+ reports: Array<Report>;
4983
+ };
4984
+ };
4985
+ export type AdminReviewRunShowResponse = AdminReviewRunShowResponses[keyof AdminReviewRunShowResponses];
4986
+ export type AdminReviewAllowlistIndexData = {
4987
+ body?: never;
4988
+ path?: never;
4989
+ query?: {
4990
+ /**
4991
+ * Filter by check name
4992
+ */
4993
+ checkName?: string;
4994
+ };
4995
+ url: '/v1/admin/review/allowlist';
4996
+ };
4997
+ export type AdminReviewAllowlistIndexErrors = {
4998
+ /**
4999
+ * Unauthorized
5000
+ */
5001
+ 401: Error401;
5002
+ /**
5003
+ * Forbidden
5004
+ */
5005
+ 403: Error403;
5006
+ /**
5007
+ * Too Many Requests
5008
+ */
5009
+ 429: Error429;
5010
+ /**
5011
+ * Internal Server Error
5012
+ */
5013
+ 500: Error500;
5014
+ };
5015
+ export type AdminReviewAllowlistIndexError = AdminReviewAllowlistIndexErrors[keyof AdminReviewAllowlistIndexErrors];
5016
+ export type AdminReviewAllowlistIndexResponses = {
5017
+ /**
5018
+ * OK
5019
+ */
5020
+ 200: Array<ReviewAllowlist>;
5021
+ };
5022
+ export type AdminReviewAllowlistIndexResponse = AdminReviewAllowlistIndexResponses[keyof AdminReviewAllowlistIndexResponses];
5023
+ export type AdminReviewAllowlistCreateData = {
5024
+ body: {
5025
+ /**
5026
+ * Check name to allowlist for
5027
+ */
5028
+ checkName: string;
5029
+ /**
5030
+ * Media ID to allowlist
5031
+ */
5032
+ mediaId: number;
5033
+ /**
5034
+ * Episode number (for episode-level checks)
5035
+ */
5036
+ episodeNumber?: number;
5037
+ /**
5038
+ * Reason for allowlisting
5039
+ */
5040
+ reason?: string;
5041
+ };
5042
+ path?: never;
5043
+ query?: never;
5044
+ url: '/v1/admin/review/allowlist';
5045
+ };
5046
+ export type AdminReviewAllowlistCreateErrors = {
5047
+ /**
5048
+ * Bad Request
5049
+ */
5050
+ 400: Error400;
5051
+ /**
5052
+ * Unauthorized
5053
+ */
5054
+ 401: Error401;
5055
+ /**
5056
+ * Forbidden
5057
+ */
5058
+ 403: Error403;
5059
+ /**
5060
+ * Conflict
5061
+ */
5062
+ 409: Error409;
5063
+ /**
5064
+ * Too Many Requests
5065
+ */
5066
+ 429: Error429;
5067
+ /**
5068
+ * Internal Server Error
5069
+ */
5070
+ 500: Error500;
5071
+ };
5072
+ export type AdminReviewAllowlistCreateError = AdminReviewAllowlistCreateErrors[keyof AdminReviewAllowlistCreateErrors];
5073
+ export type AdminReviewAllowlistCreateResponses = {
5074
+ /**
5075
+ * Added to allowlist
5076
+ */
5077
+ 201: ReviewAllowlist;
5078
+ };
5079
+ export type AdminReviewAllowlistCreateResponse = AdminReviewAllowlistCreateResponses[keyof AdminReviewAllowlistCreateResponses];
5080
+ export type AdminReviewAllowlistDestroyData = {
5081
+ body?: never;
5082
+ path: {
5083
+ /**
5084
+ * Allowlist entry ID
5085
+ */
5086
+ id: number;
5087
+ };
5088
+ query?: never;
5089
+ url: '/v1/admin/review/allowlist/{id}';
5090
+ };
5091
+ export type AdminReviewAllowlistDestroyErrors = {
5092
+ /**
5093
+ * Unauthorized
5094
+ */
5095
+ 401: Error401;
5096
+ /**
5097
+ * Forbidden
5098
+ */
5099
+ 403: Error403;
5100
+ /**
5101
+ * Not Found
5102
+ */
5103
+ 404: Error404;
5104
+ /**
5105
+ * Too Many Requests
5106
+ */
5107
+ 429: Error429;
5108
+ /**
5109
+ * Internal Server Error
5110
+ */
5111
+ 500: Error500;
5112
+ };
5113
+ export type AdminReviewAllowlistDestroyError = AdminReviewAllowlistDestroyErrors[keyof AdminReviewAllowlistDestroyErrors];
5114
+ export type AdminReviewAllowlistDestroyResponses = {
5115
+ /**
5116
+ * Removed from allowlist
5117
+ */
5118
+ 204: void;
5119
+ };
5120
+ export type AdminReviewAllowlistDestroyResponse = AdminReviewAllowlistDestroyResponses[keyof AdminReviewAllowlistDestroyResponses];
5121
+ //# sourceMappingURL=types.gen.d.ts.map