@ufcalendar/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3112 @@
1
+ /**
2
+ * Hand-written shapes for the payloads people actually consume. Field names
3
+ * come from the serializers in `apps/api/src/routes/*.ts`, not from
4
+ * imagination — if a field is not here it is because the API does not send
5
+ * it. The generated `paths` type (from the OpenAPI document) is exported
6
+ * alongside these for anything not covered.
7
+ *
8
+ * Everything is snake_case because the wire is.
9
+ */
10
+ /** `{"data": ..., "meta": ...}` — every JSON response. */
11
+ interface Envelope<T> {
12
+ data: T;
13
+ meta?: Meta;
14
+ }
15
+ interface Meta {
16
+ pagination?: {
17
+ next_cursor: string | null;
18
+ has_more: boolean;
19
+ };
20
+ [k: string]: unknown;
21
+ }
22
+ interface RateLimit {
23
+ /** Monthly quota. */
24
+ limit: string | null;
25
+ remaining: string | null;
26
+ reset: string | null;
27
+ }
28
+ interface Org {
29
+ slug: string;
30
+ name: string;
31
+ short_name: string | null;
32
+ sport: string;
33
+ country: string | null;
34
+ website: string | null;
35
+ capabilities: {
36
+ stats: boolean;
37
+ rounds: boolean;
38
+ rankings: boolean;
39
+ broadcasts: boolean;
40
+ predictions: boolean;
41
+ scorecards: boolean;
42
+ };
43
+ }
44
+ type EventStatus = 'announced' | 'scheduled' | 'live' | 'completed' | 'cancelled';
45
+ /** A row of `GET /v1/events`. The card lives on the detail route. */
46
+ interface EventSummary {
47
+ id: number;
48
+ slug: string;
49
+ title: string;
50
+ short_title: string | null;
51
+ numbering: string | null;
52
+ org: string;
53
+ sport: string;
54
+ /** UTC ISO-8601. */
55
+ starts_at: string | null;
56
+ main_card_at: string | null;
57
+ prelims_at: string | null;
58
+ early_prelims_at: string | null;
59
+ /** Venue IANA timezone, snapshotted at write time. */
60
+ tz: string | null;
61
+ status: EventStatus | string;
62
+ is_ppv: boolean;
63
+ is_title_card: boolean;
64
+ }
65
+ interface Venue {
66
+ id: number;
67
+ slug: string | null;
68
+ name: string;
69
+ city: string | null;
70
+ region: string | null;
71
+ country: string | null;
72
+ tz: string | null;
73
+ capacity: number | null;
74
+ }
75
+ interface Broadcast {
76
+ region: string | null;
77
+ provider: string | null;
78
+ kind: string | null;
79
+ url: string | null;
80
+ }
81
+ interface EventDetail extends EventSummary {
82
+ venue: Venue | null;
83
+ card: Fight[];
84
+ broadcasts: Broadcast[];
85
+ }
86
+ interface EventChange {
87
+ kind: string;
88
+ before: unknown;
89
+ after: unknown;
90
+ observed_at: string | null;
91
+ }
92
+ /** Identity fields only — the full record is on `/v1/fighters/{id}`. */
93
+ interface FighterRef {
94
+ id: number;
95
+ slug: string;
96
+ name: string;
97
+ nickname: string | null;
98
+ nationality: string | null;
99
+ }
100
+ interface FightResult {
101
+ winner_fighter_id: number | null;
102
+ method: string | null;
103
+ round: number | null;
104
+ time: string | null;
105
+ details: string | null;
106
+ }
107
+ interface Fight {
108
+ id: number;
109
+ ordering: number | null;
110
+ card_section: string | null;
111
+ sport: string;
112
+ weight_class: string | null;
113
+ is_title: boolean;
114
+ is_main: boolean;
115
+ scheduled_rounds: number | null;
116
+ status: string | null;
117
+ fighter_a: FighterRef | null;
118
+ fighter_b: FighterRef | null;
119
+ result: FightResult | null;
120
+ referee: string | null;
121
+ bonus: string | null;
122
+ }
123
+ interface ScorecardRound {
124
+ round: number;
125
+ a: number | null;
126
+ b: number | null;
127
+ }
128
+ interface Scorecard {
129
+ judge_id: number | null;
130
+ judge_name: string | null;
131
+ total_a: number | null;
132
+ total_b: number | null;
133
+ winner_fighter_id: number | null;
134
+ is_draw: boolean;
135
+ /**
136
+ * False when the commission published only the outcome: totals are a
137
+ * 1-0 / 1-1 / 0-0 placeholder and `rounds` is empty. Check it before
138
+ * charting.
139
+ */
140
+ scores_known: boolean;
141
+ rounds: ScorecardRound[];
142
+ }
143
+ interface Scorecards {
144
+ fight_id: number;
145
+ fighter_a_id: number | null;
146
+ fighter_b_id: number | null;
147
+ decision_type: string | null;
148
+ deductions: unknown[];
149
+ cards: Scorecard[];
150
+ }
151
+ interface Judge {
152
+ id: number;
153
+ name: string;
154
+ fights?: number;
155
+ rounds_scored?: number;
156
+ rounds_10_8?: number;
157
+ split_cards?: number;
158
+ lone_dissents?: number;
159
+ [k: string]: unknown;
160
+ }
161
+ interface FighterSummary {
162
+ id: number;
163
+ slug: string;
164
+ name: string;
165
+ nickname: string | null;
166
+ nationality: string | null;
167
+ /** ISO-3166 alpha-2. */
168
+ country_code: string | null;
169
+ }
170
+ /** Wikimedia Commons / Creative Commons only. Rendering one WITHOUT the
171
+ * `license` + `artist` credit violates the licence, not just our terms. */
172
+ interface FighterImage {
173
+ url: string;
174
+ width: number | null;
175
+ height: number | null;
176
+ license: string | null;
177
+ license_url: string | null;
178
+ artist: string | null;
179
+ source_page: string | null;
180
+ }
181
+ interface CareerStats {
182
+ /** `pro-mma`, `ufc-only`, … */
183
+ scope: string;
184
+ /** Which source published this row. */
185
+ source: string;
186
+ record: string | null;
187
+ slpm: number | null;
188
+ str_acc: number | null;
189
+ sapm: number | null;
190
+ str_def: number | null;
191
+ td_avg: number | null;
192
+ td_acc: number | null;
193
+ td_def: number | null;
194
+ sub_avg: number | null;
195
+ }
196
+ interface PowerIndex {
197
+ rating: number;
198
+ peak: number;
199
+ peak_at: string | null;
200
+ fights_rated: number;
201
+ last_fought_at: string | null;
202
+ }
203
+ interface Fighter extends FighterSummary {
204
+ height_inches: number | null;
205
+ weight_lbs: number | null;
206
+ reach_inches: number | null;
207
+ stance: string | null;
208
+ /** YYYY-MM-DD. */
209
+ dob: string | null;
210
+ team: string | null;
211
+ birthplace: string | null;
212
+ career_stats: CareerStats[];
213
+ power_index: PowerIndex | null;
214
+ images: FighterImage[];
215
+ }
216
+ /** One line of `GET /v1/fighters/{id}/history` — native bouts and fill-source
217
+ * rows merged into one multi-promotion timeline. */
218
+ interface CareerBout {
219
+ source: 'native' | 'history';
220
+ date: string | null;
221
+ opponent_name: string | null;
222
+ event_name?: string | null;
223
+ result: string | null;
224
+ method: string | null;
225
+ round: number | null;
226
+ time: string | null;
227
+ weight_class: string | null;
228
+ sport: string | null;
229
+ [k: string]: unknown;
230
+ }
231
+ interface RankingEntry {
232
+ /** 0 = champion. Ties are real. */
233
+ rank: number;
234
+ is_champion: boolean;
235
+ fighter_id: number;
236
+ fighter_slug: string;
237
+ name: string;
238
+ }
239
+ interface RankingDivision {
240
+ division: string;
241
+ entries: RankingEntry[];
242
+ }
243
+ /** Point-in-time board: valid until superseded. */
244
+ interface RankingsBoard {
245
+ org: string;
246
+ board: string;
247
+ snapshot_date: string;
248
+ divisions: RankingDivision[];
249
+ }
250
+ interface Plan {
251
+ key: string;
252
+ name: string;
253
+ price_monthly_usd: number | null;
254
+ price_yearly_usd: number | null;
255
+ requests_per_month: number;
256
+ rpm: number;
257
+ key_limit: number;
258
+ features: string[];
259
+ checkout_url: string;
260
+ }
261
+ interface Plans {
262
+ currency: string;
263
+ plans: Plan[];
264
+ trial: {
265
+ hours: number;
266
+ requests: number;
267
+ card_required: boolean;
268
+ per_account: number;
269
+ start_url: string;
270
+ };
271
+ enterprise: {
272
+ contact: string;
273
+ };
274
+ mcp: {
275
+ url: string;
276
+ transport: string;
277
+ auth: string[];
278
+ oauth_metadata: string;
279
+ protected_resource_metadata: string;
280
+ };
281
+ links: Record<string, string>;
282
+ }
283
+ interface BroadcastRight {
284
+ country: string;
285
+ provider: string;
286
+ kind: string | null;
287
+ url: string | null;
288
+ note_key?: string | null;
289
+ [k: string]: unknown;
290
+ }
291
+ interface WebhookEndpoint {
292
+ id: number;
293
+ url: string;
294
+ events: string[];
295
+ /** Returned ONCE, on create and on rotate. */
296
+ secret?: string;
297
+ disabled?: boolean;
298
+ created_at?: string | null;
299
+ [k: string]: unknown;
300
+ }
301
+ interface Usage {
302
+ tier: string;
303
+ requests_this_month: number;
304
+ requests_per_month: number;
305
+ [k: string]: unknown;
306
+ }
307
+
308
+ declare const DEFAULT_BASE_URL = "https://api.ufcalendar.com/v1";
309
+ interface FightAPIOptions {
310
+ /** `ufcalendar_…` key from https://www.ufcalendar.com/account/api. Falls back
311
+ * to `UFCALENDAR_API_KEY` / `UFCAL_API_KEY` in the environment. Only
312
+ * `plans()` works without one. */
313
+ apiKey?: string;
314
+ /** Override for testing; defaults to the production `/v1`. */
315
+ baseUrl?: string;
316
+ /** Inject a fetch (a test double, an instrumented fetch, undici). */
317
+ fetch?: typeof fetch;
318
+ /** Per-request timeout. Default 30s. */
319
+ timeoutMs?: number;
320
+ /** Extra headers on every request. */
321
+ headers?: Record<string, string>;
322
+ }
323
+ /** An error response from the Fight API. */
324
+ declare class FightAPIError extends Error {
325
+ readonly status: number;
326
+ readonly code: string;
327
+ readonly requestId: string | null;
328
+ constructor(status: number, code: string, message: string, requestId?: string | null);
329
+ }
330
+ type QueryValue = string | number | boolean | null | undefined;
331
+ type Query = Record<string, QueryValue>;
332
+ declare class FightAPI {
333
+ #private;
334
+ readonly baseUrl: string;
335
+ readonly apiKey: string | undefined;
336
+ /** `meta` of the most recent response (pagination cursor, generated_at …). */
337
+ lastMeta: Meta | null;
338
+ /** `X-RateLimit-*` of the most recent response. */
339
+ lastRateLimit: RateLimit;
340
+ constructor(apiKeyOrOptions?: string | FightAPIOptions, options?: FightAPIOptions);
341
+ /** Raw GET returning the `data` value. Escape hatch for new endpoints. */
342
+ get<T = unknown>(path: string, params?: Query): Promise<T>;
343
+ /** Raw GET returning the whole `{data, meta}` envelope. */
344
+ getWithMeta<T = unknown>(path: string, params?: Query): Promise<Envelope<T>>;
345
+ /**
346
+ * Plans, quotas, the free 1-day trial rule, the MCP endpoint and the doc
347
+ * links. The only endpoint that answers without a credential.
348
+ */
349
+ plans(): Promise<Plans>;
350
+ /** Launch orgs with capability flags (stats / rounds / rankings / broadcasts / predictions). */
351
+ orgs(): Promise<Org[]>;
352
+ org(slug: string): Promise<Org>;
353
+ /**
354
+ * Schedule + results. Bare call = the upcoming calendar, soonest first.
355
+ * `status: 'completed'` (or `order: 'desc'`) browses the archive
356
+ * newest-first. `from` / `to` are `YYYY-MM-DD`.
357
+ */
358
+ events(opts?: {
359
+ org?: string;
360
+ status?: string;
361
+ from?: string;
362
+ to?: string;
363
+ order?: 'asc' | 'desc';
364
+ limit?: number;
365
+ }): AsyncGenerator<EventSummary, void, void>;
366
+ /** One event with its full fight card, venue and broadcasts. */
367
+ event(idOrSlug: string | number): Promise<EventDetail>;
368
+ /** Card-change diff log (fight added/removed, opponent swapped, date moved, profile merged). */
369
+ eventChanges(idOrSlug: string | number): Promise<EventChange[]>;
370
+ fight(fightId: number | string): Promise<Fight>;
371
+ /** Per-fight totals for both corners. */
372
+ fightStats(fightId: number | string): Promise<Record<string, unknown>[]>;
373
+ /** Round-by-round stat lines for both corners. */
374
+ fightRounds(fightId: number | string): Promise<Record<string, unknown>[]>;
375
+ /**
376
+ * The judges' scorecards for a bout — the official commission record:
377
+ * decision type, point deductions, and one card per judge with every
378
+ * round, the totals and `winner_fighter_id`. Scores are oriented to
379
+ * `fighter_a_id` / `fighter_b_id`, both repeated on the payload.
380
+ *
381
+ * Check `scores_known` on a card before charting totals: when it is false
382
+ * the commission published only the outcome. Throws 404 for a bout that
383
+ * did not go to the judges.
384
+ */
385
+ fightScorecards(fightId: number | string): Promise<Scorecards>;
386
+ /**
387
+ * Every official who has scored a launch-org bout, busiest first. Rates
388
+ * mean little below ~10 fights; pass `minFights: 10`.
389
+ */
390
+ judges(opts?: {
391
+ q?: string;
392
+ org?: string;
393
+ minFights?: number;
394
+ limit?: number;
395
+ }): AsyncGenerator<Judge, void, void>;
396
+ judge(judgeId: number | string): Promise<Judge>;
397
+ /** Every card this judge has turned in, newest first. */
398
+ judgeScorecards(judgeId: number | string, opts?: {
399
+ limit?: number;
400
+ }): AsyncGenerator<Record<string, unknown>, void, void>;
401
+ fighters(opts?: {
402
+ q?: string;
403
+ org?: string;
404
+ country?: string;
405
+ limit?: number;
406
+ }): AsyncGenerator<FighterSummary, void, void>;
407
+ /** Bio, records, career stats, Power Index and CC-licensed images. */
408
+ fighter(idOrSlug: string | number): Promise<Fighter>;
409
+ /** Complete multi-promotion career timeline. */
410
+ fighterHistory(idOrSlug: string | number): Promise<CareerBout[]>;
411
+ /** Career statistics, one source-stamped row per scope (`pro-mma`, `ufc-only` …). */
412
+ fighterStats(idOrSlug: string | number): Promise<CareerStats[]>;
413
+ /** Every official ranking row the fighter ever held, newest first. */
414
+ fighterRankings(idOrSlug: string | number): Promise<Record<string, unknown>[]>;
415
+ fighterPowerIndex(idOrSlug: string | number): Promise<PowerIndex & Record<string, unknown>>;
416
+ /**
417
+ * Official board, point-in-time. `date: 'YYYY-MM-DD'` returns the board
418
+ * that was valid on that day (UFC history back to 2013; rank 0 = champion).
419
+ */
420
+ rankings(org?: string, opts?: {
421
+ date?: string;
422
+ board?: string;
423
+ }): Promise<RankingsBoard>;
424
+ divisionRankings(org: string, division: string, opts?: {
425
+ date?: string;
426
+ }): Promise<RankingsBoard>;
427
+ /** Current champions across every launch org. */
428
+ champions(): Promise<Record<string, unknown>[]>;
429
+ /** UFCalendar Power Index board. */
430
+ powerIndex(org?: string): Promise<Record<string, unknown>>;
431
+ /** Model win probabilities for upcoming UFC bouts. */
432
+ predictionsUpcoming(): Promise<Record<string, unknown>[]>;
433
+ /** Who airs the promotion, per ISO-2 country. */
434
+ broadcastRights(org?: string, opts?: {
435
+ country?: string;
436
+ }): Promise<BroadcastRight[]>;
437
+ venue(venueId: number | string): Promise<Venue>;
438
+ /** Typeahead across fighters and events. */
439
+ search(q: string): Promise<Record<string, unknown>>;
440
+ /** Your key's month-to-date quota usage. */
441
+ usage(): Promise<Usage>;
442
+ /**
443
+ * Subscribable ICS feed URL for calendar apps (authenticates via `?key=`).
444
+ *
445
+ * Throws without a key rather than returning `?key=`: that empty URL is
446
+ * pasted into a calendar app, fails there hours later, and the failure
447
+ * surfaces nowhere near this call.
448
+ */
449
+ calendarIcsUrl(org?: string): string;
450
+ webhookEndpoints(): Promise<WebhookEndpoint[]>;
451
+ /**
452
+ * Register a signed webhook (Pro and up). `events` ⊆ `event.announced`,
453
+ * `fight.result`, `card.changed`, `event.completed`. The signing secret is
454
+ * returned ONCE, in this response.
455
+ */
456
+ createWebhookEndpoint(url: string, events?: string[]): Promise<WebhookEndpoint>;
457
+ deleteWebhookEndpoint(endpointId: number | string): Promise<void>;
458
+ rotateWebhookSecret(endpointId: number | string): Promise<WebhookEndpoint>;
459
+ }
460
+
461
+ /** Kept in lockstep with package.json and the User-Agent by
462
+ * `apps/api/src/surfaces.test.ts`. Bump all three together. */
463
+ declare const VERSION = "0.1.0";
464
+
465
+ /**
466
+ * This file was auto-generated by openapi-typescript.
467
+ * Do not make direct changes to the file.
468
+ */
469
+
470
+ interface paths {
471
+ "/v1/plans": {
472
+ parameters: {
473
+ query?: never;
474
+ header?: never;
475
+ path?: never;
476
+ cookie?: never;
477
+ };
478
+ /**
479
+ * Plans, quotas and how to connect (no key required)
480
+ * @description The only endpoint that answers without a credential. Returns every plan with its monthly request quota, per-minute limit, key limit and a `checkout_url`; the terms of the free 1-day trial and the URL that starts it; the MCP endpoint with both of its auth doors; and the documentation links. Static per deploy and cached an hour — poll it never, read it once.
481
+ */
482
+ get: {
483
+ parameters: {
484
+ query?: never;
485
+ header?: never;
486
+ path?: never;
487
+ cookie?: never;
488
+ };
489
+ requestBody?: never;
490
+ responses: {
491
+ /** @description Plans, trial rule, MCP endpoint and links */
492
+ 200: {
493
+ headers: {
494
+ [name: string]: unknown;
495
+ };
496
+ content: {
497
+ /**
498
+ * @example {
499
+ * "data": {
500
+ * "currency": "USD",
501
+ * "plans": [
502
+ * {
503
+ * "key": "hobby",
504
+ * "name": "Hobby",
505
+ * "price_monthly_usd": 19,
506
+ * "price_yearly_usd": 190,
507
+ * "requests_per_month": 30000,
508
+ * "rpm": 60,
509
+ * "key_limit": 5,
510
+ * "features": [],
511
+ * "checkout_url": "https://www.ufcalendar.com/account/api?plan=hobby"
512
+ * }
513
+ * ],
514
+ * "trial": {
515
+ * "hours": 24,
516
+ * "requests": 100,
517
+ * "card_required": false,
518
+ * "per_account": 1,
519
+ * "start_url": "https://www.ufcalendar.com/account/api?trial=1"
520
+ * },
521
+ * "enterprise": {
522
+ * "contact": "api@ufcalendar.com"
523
+ * },
524
+ * "mcp": {
525
+ * "url": "https://api.ufcalendar.com/mcp",
526
+ * "transport": "streamable-http",
527
+ * "auth": [
528
+ * "bearer_api_key",
529
+ * "oauth"
530
+ * ],
531
+ * "oauth_metadata": "https://www.ufcalendar.com/.well-known/oauth-authorization-server",
532
+ * "protected_resource_metadata": "https://api.ufcalendar.com/.well-known/oauth-protected-resource"
533
+ * },
534
+ * "links": {
535
+ * "docs": "https://api.ufcalendar.com/docs",
536
+ * "openapi": "https://api.ufcalendar.com/openapi.json"
537
+ * }
538
+ * },
539
+ * "meta": {
540
+ * "generated_at": "2026-09-19T00:00:00.000Z"
541
+ * }
542
+ * }
543
+ */
544
+ "application/json": unknown;
545
+ };
546
+ };
547
+ };
548
+ };
549
+ put?: never;
550
+ post?: never;
551
+ delete?: never;
552
+ options?: never;
553
+ head?: never;
554
+ patch?: never;
555
+ trace?: never;
556
+ };
557
+ "/v1/orgs": {
558
+ parameters: {
559
+ query?: never;
560
+ header?: never;
561
+ path?: never;
562
+ cookie?: never;
563
+ };
564
+ /**
565
+ * List launch orgs with capability flags
566
+ * @description Each org carries flags (`stats`, `rounds`, `rankings`, `broadcasts`, `predictions`, `scorecards`) so clients discover coverage programmatically — plus `sport` (`mma`, `bare-knuckle-boxing`). Staged orgs (ONE, KSW, ACA) appear the day they clear the reliability bar. RIZIN publishes no official board, so its `rankings` flag is false. `scorecards` is true for UFC, PFL, OKTAGON and RIZIN; no commission covers bare-knuckle, so BKFC is false.
567
+ */
568
+ get: {
569
+ parameters: {
570
+ query?: never;
571
+ header?: never;
572
+ path?: never;
573
+ cookie?: never;
574
+ };
575
+ requestBody?: never;
576
+ responses: {
577
+ /** @description Launch orgs */
578
+ 200: {
579
+ headers: {
580
+ [name: string]: unknown;
581
+ };
582
+ content: {
583
+ /**
584
+ * @example {
585
+ * "data": [
586
+ * {
587
+ * "id": 1,
588
+ * "slug": "ufc",
589
+ * "name": "Ultimate Fighting Championship",
590
+ * "short_name": "UFC",
591
+ * "country": "United States",
592
+ * "website": "https://www.ufc.com",
593
+ * "capabilities": {
594
+ * "stats": true,
595
+ * "rounds": true,
596
+ * "rankings": true,
597
+ * "broadcasts": true,
598
+ * "predictions": true,
599
+ * "scorecards": true
600
+ * }
601
+ * }
602
+ * ]
603
+ * }
604
+ */
605
+ "application/json": unknown;
606
+ };
607
+ };
608
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
609
+ 401: {
610
+ headers: {
611
+ [name: string]: unknown;
612
+ };
613
+ content?: never;
614
+ };
615
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
616
+ 403: {
617
+ headers: {
618
+ [name: string]: unknown;
619
+ };
620
+ content?: never;
621
+ };
622
+ /** @description Not found (staged-org data 404s until the org is promoted). */
623
+ 404: {
624
+ headers: {
625
+ [name: string]: unknown;
626
+ };
627
+ content?: never;
628
+ };
629
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
630
+ 429: {
631
+ headers: {
632
+ [name: string]: unknown;
633
+ };
634
+ content?: never;
635
+ };
636
+ };
637
+ };
638
+ put?: never;
639
+ post?: never;
640
+ delete?: never;
641
+ options?: never;
642
+ head?: never;
643
+ patch?: never;
644
+ trace?: never;
645
+ };
646
+ "/v1/orgs/{slug}": {
647
+ parameters: {
648
+ query?: never;
649
+ header?: never;
650
+ path?: never;
651
+ cookie?: never;
652
+ };
653
+ /**
654
+ * One org
655
+ * @description Single org by slug.
656
+ */
657
+ get: {
658
+ parameters: {
659
+ query?: never;
660
+ header?: never;
661
+ path: {
662
+ slug: string;
663
+ };
664
+ cookie?: never;
665
+ };
666
+ requestBody?: never;
667
+ responses: {
668
+ /** @description Org */
669
+ 200: {
670
+ headers: {
671
+ [name: string]: unknown;
672
+ };
673
+ content: {
674
+ "application/json": unknown;
675
+ };
676
+ };
677
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
678
+ 401: {
679
+ headers: {
680
+ [name: string]: unknown;
681
+ };
682
+ content?: never;
683
+ };
684
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
685
+ 403: {
686
+ headers: {
687
+ [name: string]: unknown;
688
+ };
689
+ content?: never;
690
+ };
691
+ /** @description Not found (staged-org data 404s until the org is promoted). */
692
+ 404: {
693
+ headers: {
694
+ [name: string]: unknown;
695
+ };
696
+ content?: never;
697
+ };
698
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
699
+ 429: {
700
+ headers: {
701
+ [name: string]: unknown;
702
+ };
703
+ content?: never;
704
+ };
705
+ };
706
+ };
707
+ put?: never;
708
+ post?: never;
709
+ delete?: never;
710
+ options?: never;
711
+ head?: never;
712
+ patch?: never;
713
+ trace?: never;
714
+ };
715
+ "/v1/events": {
716
+ parameters: {
717
+ query?: never;
718
+ header?: never;
719
+ path?: never;
720
+ cookie?: never;
721
+ };
722
+ /**
723
+ * List events (schedule + results)
724
+ * @description A bare listing is the upcoming calendar: events from the last ~6h onward, soonest first. Ordering defaults: explicit `order` always wins; else `from=` or a forward status (`announced|scheduled|live`) → `asc`; else (`completed|cancelled|to=`) → `desc`, newest first. `order=desc` with no filters browses the full archive newest-first. Live results land within ≤5 minutes (UFC ≤2).
725
+ */
726
+ get: {
727
+ parameters: {
728
+ query?: {
729
+ /** @description Launch org slug: `ufc`, `pfl`, `oktagon`, `bkfc` or `rizin`. Staged orgs 400 until promoted. */
730
+ org?: "ufc" | "pfl" | "oktagon" | "bkfc" | "rizin";
731
+ status?: "announced" | "scheduled" | "live" | "completed" | "cancelled";
732
+ from?: string;
733
+ to?: string;
734
+ /** @description Sort by start time. Defaults are contextual — see endpoint description. */
735
+ order?: "asc" | "desc";
736
+ /** @description Opaque cursor from `meta.pagination.next_cursor`. */
737
+ cursor?: string;
738
+ limit?: number;
739
+ };
740
+ header?: never;
741
+ path?: never;
742
+ cookie?: never;
743
+ };
744
+ requestBody?: never;
745
+ responses: {
746
+ /** @description Events page */
747
+ 200: {
748
+ headers: {
749
+ [name: string]: unknown;
750
+ };
751
+ content: {
752
+ /**
753
+ * @example {
754
+ * "data": [
755
+ * {
756
+ * "id": 812,
757
+ * "slug": "ufc-320",
758
+ * "title": "UFC 320",
759
+ * "numbering": "UFC 320",
760
+ * "org": "ufc",
761
+ * "sport": "mma",
762
+ * "starts_at": "2026-10-04T02:00:00.000Z",
763
+ * "main_card_at": "2026-10-04T02:00:00.000Z",
764
+ * "tz": "America/Los_Angeles",
765
+ * "status": "scheduled",
766
+ * "is_ppv": true,
767
+ * "is_title_card": true
768
+ * }
769
+ * ],
770
+ * "meta": {
771
+ * "pagination": {
772
+ * "next_cursor": "eyJpZCI6ODEyfQ",
773
+ * "has_more": true
774
+ * }
775
+ * }
776
+ * }
777
+ */
778
+ "application/json": unknown;
779
+ };
780
+ };
781
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
782
+ 401: {
783
+ headers: {
784
+ [name: string]: unknown;
785
+ };
786
+ content?: never;
787
+ };
788
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
789
+ 403: {
790
+ headers: {
791
+ [name: string]: unknown;
792
+ };
793
+ content?: never;
794
+ };
795
+ /** @description Not found (staged-org data 404s until the org is promoted). */
796
+ 404: {
797
+ headers: {
798
+ [name: string]: unknown;
799
+ };
800
+ content?: never;
801
+ };
802
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
803
+ 429: {
804
+ headers: {
805
+ [name: string]: unknown;
806
+ };
807
+ content?: never;
808
+ };
809
+ };
810
+ };
811
+ put?: never;
812
+ post?: never;
813
+ delete?: never;
814
+ options?: never;
815
+ head?: never;
816
+ patch?: never;
817
+ trace?: never;
818
+ };
819
+ "/v1/events/{idOrSlug}": {
820
+ parameters: {
821
+ query?: never;
822
+ header?: never;
823
+ path?: never;
824
+ cookie?: never;
825
+ };
826
+ /**
827
+ * Event with full card
828
+ * @description Full fight card (both corners, results when completed), venue and event-scoped broadcast rows. Every event and card entry carries `sport` (e.g. `mma`, `bare-knuckle-boxing`). Renamed events 308-redirect from stale slugs.
829
+ */
830
+ get: {
831
+ parameters: {
832
+ query?: never;
833
+ header?: never;
834
+ path: {
835
+ /** @description Numeric id or slug of the event. Stale slugs 308-redirect to the canonical URL. */
836
+ idOrSlug: string;
837
+ };
838
+ cookie?: never;
839
+ };
840
+ requestBody?: never;
841
+ responses: {
842
+ /** @description Event detail */
843
+ 200: {
844
+ headers: {
845
+ [name: string]: unknown;
846
+ };
847
+ content: {
848
+ "application/json": unknown;
849
+ };
850
+ };
851
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
852
+ 401: {
853
+ headers: {
854
+ [name: string]: unknown;
855
+ };
856
+ content?: never;
857
+ };
858
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
859
+ 403: {
860
+ headers: {
861
+ [name: string]: unknown;
862
+ };
863
+ content?: never;
864
+ };
865
+ /** @description Not found (staged-org data 404s until the org is promoted). */
866
+ 404: {
867
+ headers: {
868
+ [name: string]: unknown;
869
+ };
870
+ content?: never;
871
+ };
872
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
873
+ 429: {
874
+ headers: {
875
+ [name: string]: unknown;
876
+ };
877
+ content?: never;
878
+ };
879
+ };
880
+ };
881
+ put?: never;
882
+ post?: never;
883
+ delete?: never;
884
+ options?: never;
885
+ head?: never;
886
+ patch?: never;
887
+ trace?: never;
888
+ };
889
+ "/v1/events/{idOrSlug}/changes": {
890
+ parameters: {
891
+ query?: never;
892
+ header?: never;
893
+ path?: never;
894
+ cookie?: never;
895
+ };
896
+ /**
897
+ * Card-change log
898
+ * @description The diff log behind "card updated": fight added/removed, opponent swapped, card order or date moved, or a fighter profile merged (`fighter-merged`: two of our fighter ids turned out to be one athlete, so a live bout now carries the surviving id — same humans, new ids). Each entry has `kind`, `before`, `after`, `observed_at`.
899
+ */
900
+ get: {
901
+ parameters: {
902
+ query?: never;
903
+ header?: never;
904
+ path: {
905
+ /** @description Numeric id or slug of the event. Stale slugs 308-redirect to the canonical URL. */
906
+ idOrSlug: string;
907
+ };
908
+ cookie?: never;
909
+ };
910
+ requestBody?: never;
911
+ responses: {
912
+ /** @description Change entries */
913
+ 200: {
914
+ headers: {
915
+ [name: string]: unknown;
916
+ };
917
+ content: {
918
+ "application/json": unknown;
919
+ };
920
+ };
921
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
922
+ 401: {
923
+ headers: {
924
+ [name: string]: unknown;
925
+ };
926
+ content?: never;
927
+ };
928
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
929
+ 403: {
930
+ headers: {
931
+ [name: string]: unknown;
932
+ };
933
+ content?: never;
934
+ };
935
+ /** @description Not found (staged-org data 404s until the org is promoted). */
936
+ 404: {
937
+ headers: {
938
+ [name: string]: unknown;
939
+ };
940
+ content?: never;
941
+ };
942
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
943
+ 429: {
944
+ headers: {
945
+ [name: string]: unknown;
946
+ };
947
+ content?: never;
948
+ };
949
+ };
950
+ };
951
+ put?: never;
952
+ post?: never;
953
+ delete?: never;
954
+ options?: never;
955
+ head?: never;
956
+ patch?: never;
957
+ trace?: never;
958
+ };
959
+ "/v1/fights/{id}": {
960
+ parameters: {
961
+ query?: never;
962
+ header?: never;
963
+ path?: never;
964
+ cookie?: never;
965
+ };
966
+ /**
967
+ * One bout
968
+ * @description Bout with corners, `sport` (bout override, else the org sport), result (method/round/time/referee) and bonus flags.
969
+ */
970
+ get: {
971
+ parameters: {
972
+ query?: never;
973
+ header?: never;
974
+ path: {
975
+ id: number;
976
+ };
977
+ cookie?: never;
978
+ };
979
+ requestBody?: never;
980
+ responses: {
981
+ /** @description Fight */
982
+ 200: {
983
+ headers: {
984
+ [name: string]: unknown;
985
+ };
986
+ content: {
987
+ "application/json": unknown;
988
+ };
989
+ };
990
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
991
+ 401: {
992
+ headers: {
993
+ [name: string]: unknown;
994
+ };
995
+ content?: never;
996
+ };
997
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
998
+ 403: {
999
+ headers: {
1000
+ [name: string]: unknown;
1001
+ };
1002
+ content?: never;
1003
+ };
1004
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1005
+ 404: {
1006
+ headers: {
1007
+ [name: string]: unknown;
1008
+ };
1009
+ content?: never;
1010
+ };
1011
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1012
+ 429: {
1013
+ headers: {
1014
+ [name: string]: unknown;
1015
+ };
1016
+ content?: never;
1017
+ };
1018
+ };
1019
+ };
1020
+ put?: never;
1021
+ post?: never;
1022
+ delete?: never;
1023
+ options?: never;
1024
+ head?: never;
1025
+ patch?: never;
1026
+ trace?: never;
1027
+ };
1028
+ "/v1/fights/{id}/stats": {
1029
+ parameters: {
1030
+ query?: never;
1031
+ header?: never;
1032
+ path?: never;
1033
+ cookie?: never;
1034
+ };
1035
+ /**
1036
+ * Per-fight totals
1037
+ * @description Both corners: knockdowns, significant/total strikes, takedowns, submission attempts, reversals, control time, and target/position splits (head/body/leg, distance/clinch/ground) where the source provides them. `distance_time_sec`, `clinch_time_sec`, `ground_time_sec` (integers, nullable) are seconds spent at distance / in the clinch / on the ground — Sofascore-sourced, and can appear alongside official strike counts on any org (Sofascore fills position time even where another source owns the rest of the row).
1038
+ */
1039
+ get: {
1040
+ parameters: {
1041
+ query?: never;
1042
+ header?: never;
1043
+ path: {
1044
+ id: number;
1045
+ };
1046
+ cookie?: never;
1047
+ };
1048
+ requestBody?: never;
1049
+ responses: {
1050
+ /** @description Stat lines */
1051
+ 200: {
1052
+ headers: {
1053
+ [name: string]: unknown;
1054
+ };
1055
+ content: {
1056
+ "application/json": unknown;
1057
+ };
1058
+ };
1059
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1060
+ 401: {
1061
+ headers: {
1062
+ [name: string]: unknown;
1063
+ };
1064
+ content?: never;
1065
+ };
1066
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1067
+ 403: {
1068
+ headers: {
1069
+ [name: string]: unknown;
1070
+ };
1071
+ content?: never;
1072
+ };
1073
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1074
+ 404: {
1075
+ headers: {
1076
+ [name: string]: unknown;
1077
+ };
1078
+ content?: never;
1079
+ };
1080
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1081
+ 429: {
1082
+ headers: {
1083
+ [name: string]: unknown;
1084
+ };
1085
+ content?: never;
1086
+ };
1087
+ };
1088
+ };
1089
+ put?: never;
1090
+ post?: never;
1091
+ delete?: never;
1092
+ options?: never;
1093
+ head?: never;
1094
+ patch?: never;
1095
+ trace?: never;
1096
+ };
1097
+ "/v1/fights/{id}/rounds": {
1098
+ parameters: {
1099
+ query?: never;
1100
+ header?: never;
1101
+ path?: never;
1102
+ cookie?: never;
1103
+ };
1104
+ /**
1105
+ * Round-by-round stats
1106
+ * @description Per-round stat lines for both corners, including target/position splits (head/body/leg, distance/clinch/ground) where the source logs them per round (BKFC for head/body/distance/clinch; Sofascore additionally for leg/ground). `distance_time_sec`, `clinch_time_sec`, `ground_time_sec` (integers, nullable) are seconds spent at distance / in the clinch / on the ground, per round — Sofascore-sourced.
1107
+ */
1108
+ get: {
1109
+ parameters: {
1110
+ query?: never;
1111
+ header?: never;
1112
+ path: {
1113
+ id: number;
1114
+ };
1115
+ cookie?: never;
1116
+ };
1117
+ requestBody?: never;
1118
+ responses: {
1119
+ /** @description Round lines */
1120
+ 200: {
1121
+ headers: {
1122
+ [name: string]: unknown;
1123
+ };
1124
+ content: {
1125
+ "application/json": unknown;
1126
+ };
1127
+ };
1128
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1129
+ 401: {
1130
+ headers: {
1131
+ [name: string]: unknown;
1132
+ };
1133
+ content?: never;
1134
+ };
1135
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1136
+ 403: {
1137
+ headers: {
1138
+ [name: string]: unknown;
1139
+ };
1140
+ content?: never;
1141
+ };
1142
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1143
+ 404: {
1144
+ headers: {
1145
+ [name: string]: unknown;
1146
+ };
1147
+ content?: never;
1148
+ };
1149
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1150
+ 429: {
1151
+ headers: {
1152
+ [name: string]: unknown;
1153
+ };
1154
+ content?: never;
1155
+ };
1156
+ };
1157
+ };
1158
+ put?: never;
1159
+ post?: never;
1160
+ delete?: never;
1161
+ options?: never;
1162
+ head?: never;
1163
+ patch?: never;
1164
+ trace?: never;
1165
+ };
1166
+ "/v1/fights/{id}/scorecards": {
1167
+ parameters: {
1168
+ query?: never;
1169
+ header?: never;
1170
+ path?: never;
1171
+ cookie?: never;
1172
+ };
1173
+ /**
1174
+ * Judges' scorecards for a bout
1175
+ * @description The official athletic-commission record: every judge, their score for each round, their card total, the decision type and any point deductions. UFC back to 1995, PFL to 2018, OKTAGON to 2025, RIZIN from March 2026 (Japan has no athletic commission — the record is published by JMOC, the officials body that runs RIZIN). UFC cards also come from ufc.com's own official scorecard images (Dana White's Contender Series and Road to UFC included, images from March 2022) — mmadecisions is preferred wherever both cover a bout, and the ufc.com extraction fills the rest.
1176
+ *
1177
+ * `total_a`/`total_b` and every round are oriented to the bout's `fighter_a_id`/`fighter_b_id`, which are repeated on the payload so you never have to fetch the fight to read a card. `winner_fighter_id` is who THAT judge gave it to.
1178
+ *
1179
+ * **Check `scores_known` before charting totals.** When it is false the commission published only the outcome, and `total_a`/`total_b` are a 1-0 / 1-1 / 0-0 placeholder rather than a score (66 fights, nearly all pre-2005); `rounds` is empty on those cards. A bout that did not go to the judges 404s.
1180
+ *
1181
+ * **Some cards carry no judge identity.** PFL's US events have no published commission scorecard, so those bouts are served from PFL's own results post: three cards with `judge_id`/`judge_name` null, `total_a`/`total_b` set and `rounds` empty. `scores_known` is still true — the totals are real. Europe/UAE PFL cards and every other org carry the named, round-by-round record.
1182
+ *
1183
+ * Media-member and fan scorecards are not part of this dataset.
1184
+ */
1185
+ get: {
1186
+ parameters: {
1187
+ query?: never;
1188
+ header?: never;
1189
+ path: {
1190
+ id: number;
1191
+ };
1192
+ cookie?: never;
1193
+ };
1194
+ requestBody?: never;
1195
+ responses: {
1196
+ /** @description Scorecards */
1197
+ 200: {
1198
+ headers: {
1199
+ [name: string]: unknown;
1200
+ };
1201
+ content: {
1202
+ /**
1203
+ * @example {
1204
+ * "data": {
1205
+ * "fight_id": 83379,
1206
+ * "fighter_a_id": 213,
1207
+ * "fighter_b_id": 1120,
1208
+ * "decision_type": "split",
1209
+ * "deductions": [],
1210
+ * "cards": [
1211
+ * {
1212
+ * "judge_id": 36,
1213
+ * "judge_name": "Vito Paolillo",
1214
+ * "total_a": 28,
1215
+ * "total_b": 29,
1216
+ * "winner_fighter_id": 1120,
1217
+ * "is_draw": false,
1218
+ * "scores_known": true,
1219
+ * "rounds": [
1220
+ * {
1221
+ * "round": 1,
1222
+ * "a": 9,
1223
+ * "b": 10
1224
+ * },
1225
+ * {
1226
+ * "round": 2,
1227
+ * "a": 10,
1228
+ * "b": 9
1229
+ * },
1230
+ * {
1231
+ * "round": 3,
1232
+ * "a": 9,
1233
+ * "b": 10
1234
+ * }
1235
+ * ]
1236
+ * },
1237
+ * {
1238
+ * "judge_id": 34,
1239
+ * "judge_name": "Clemens Werner",
1240
+ * "total_a": 29,
1241
+ * "total_b": 28,
1242
+ * "winner_fighter_id": 213,
1243
+ * "is_draw": false,
1244
+ * "scores_known": true,
1245
+ * "rounds": [
1246
+ * {
1247
+ * "round": 1,
1248
+ * "a": 9,
1249
+ * "b": 10
1250
+ * },
1251
+ * {
1252
+ * "round": 2,
1253
+ * "a": 10,
1254
+ * "b": 9
1255
+ * },
1256
+ * {
1257
+ * "round": 3,
1258
+ * "a": 10,
1259
+ * "b": 9
1260
+ * }
1261
+ * ]
1262
+ * },
1263
+ * {
1264
+ * "judge_id": 17,
1265
+ * "judge_name": "Cezary Wojciechowski",
1266
+ * "total_a": 28,
1267
+ * "total_b": 29,
1268
+ * "winner_fighter_id": 1120,
1269
+ * "is_draw": false,
1270
+ * "scores_known": true,
1271
+ * "rounds": [
1272
+ * {
1273
+ * "round": 1,
1274
+ * "a": 9,
1275
+ * "b": 10
1276
+ * },
1277
+ * {
1278
+ * "round": 2,
1279
+ * "a": 10,
1280
+ * "b": 9
1281
+ * },
1282
+ * {
1283
+ * "round": 3,
1284
+ * "a": 9,
1285
+ * "b": 10
1286
+ * }
1287
+ * ]
1288
+ * }
1289
+ * ]
1290
+ * },
1291
+ * "meta": {
1292
+ * "fight_id": 83379
1293
+ * }
1294
+ * }
1295
+ */
1296
+ "application/json": unknown;
1297
+ };
1298
+ };
1299
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1300
+ 401: {
1301
+ headers: {
1302
+ [name: string]: unknown;
1303
+ };
1304
+ content?: never;
1305
+ };
1306
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1307
+ 403: {
1308
+ headers: {
1309
+ [name: string]: unknown;
1310
+ };
1311
+ content?: never;
1312
+ };
1313
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1314
+ 404: {
1315
+ headers: {
1316
+ [name: string]: unknown;
1317
+ };
1318
+ content?: never;
1319
+ };
1320
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1321
+ 429: {
1322
+ headers: {
1323
+ [name: string]: unknown;
1324
+ };
1325
+ content?: never;
1326
+ };
1327
+ };
1328
+ };
1329
+ put?: never;
1330
+ post?: never;
1331
+ delete?: never;
1332
+ options?: never;
1333
+ head?: never;
1334
+ patch?: never;
1335
+ trace?: never;
1336
+ };
1337
+ "/v1/judges": {
1338
+ parameters: {
1339
+ query?: never;
1340
+ header?: never;
1341
+ path?: never;
1342
+ cookie?: never;
1343
+ };
1344
+ /**
1345
+ * Judge directory
1346
+ * @description Every official who has scored a launch-org bout (~550), busiest first, with their career shape: fights, rounds scored, rounds scored 10-8 or wider, three-judge cards that came back split, and `lone_dissents` — cards where this judge alone picked the other corner.
1347
+ *
1348
+ * Filter with `q` (name), `org`, and `min_fights` (the rates mean little below ~10 fights).
1349
+ */
1350
+ get: {
1351
+ parameters: {
1352
+ query?: {
1353
+ /** @description Name substring, case-insensitive. */
1354
+ q?: string;
1355
+ /** @description Launch org slug: `ufc`, `pfl`, `oktagon`, `bkfc` or `rizin`. Staged orgs 400 until promoted. */
1356
+ org?: "ufc" | "pfl" | "oktagon" | "bkfc" | "rizin";
1357
+ /** @description Only judges with at least this many scored fights. */
1358
+ min_fights?: number;
1359
+ /** @description Opaque cursor from `meta.pagination.next_cursor`. */
1360
+ cursor?: string;
1361
+ limit?: number;
1362
+ };
1363
+ header?: never;
1364
+ path?: never;
1365
+ cookie?: never;
1366
+ };
1367
+ requestBody?: never;
1368
+ responses: {
1369
+ /** @description Judges page */
1370
+ 200: {
1371
+ headers: {
1372
+ [name: string]: unknown;
1373
+ };
1374
+ content: {
1375
+ /**
1376
+ * @example {
1377
+ * "data": [
1378
+ * {
1379
+ * "id": 5,
1380
+ * "name": "Sal D'Amato",
1381
+ * "fights": 1096,
1382
+ * "rounds_scored": 3598,
1383
+ * "wide_rounds": 146,
1384
+ * "split_fights": 242,
1385
+ * "three_judge_fights": 1095,
1386
+ * "lone_dissents": 118,
1387
+ * "first_scored": "2009-04-01",
1388
+ * "last_scored": "2026-08-15",
1389
+ * "orgs": [
1390
+ * "pfl",
1391
+ * "ufc"
1392
+ * ]
1393
+ * }
1394
+ * ],
1395
+ * "meta": {
1396
+ * "total": 550,
1397
+ * "pagination": {
1398
+ * "next_cursor": "eyJpZCI6NX0",
1399
+ * "has_more": true
1400
+ * }
1401
+ * }
1402
+ * }
1403
+ */
1404
+ "application/json": unknown;
1405
+ };
1406
+ };
1407
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1408
+ 401: {
1409
+ headers: {
1410
+ [name: string]: unknown;
1411
+ };
1412
+ content?: never;
1413
+ };
1414
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1415
+ 403: {
1416
+ headers: {
1417
+ [name: string]: unknown;
1418
+ };
1419
+ content?: never;
1420
+ };
1421
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1422
+ 404: {
1423
+ headers: {
1424
+ [name: string]: unknown;
1425
+ };
1426
+ content?: never;
1427
+ };
1428
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1429
+ 429: {
1430
+ headers: {
1431
+ [name: string]: unknown;
1432
+ };
1433
+ content?: never;
1434
+ };
1435
+ };
1436
+ };
1437
+ put?: never;
1438
+ post?: never;
1439
+ delete?: never;
1440
+ options?: never;
1441
+ head?: never;
1442
+ patch?: never;
1443
+ trace?: never;
1444
+ };
1445
+ "/v1/judges/{id}": {
1446
+ parameters: {
1447
+ query?: never;
1448
+ header?: never;
1449
+ path?: never;
1450
+ cookie?: never;
1451
+ };
1452
+ /**
1453
+ * One judge
1454
+ * @description A single official's career aggregates. Same shape as a directory row.
1455
+ */
1456
+ get: {
1457
+ parameters: {
1458
+ query?: never;
1459
+ header?: never;
1460
+ path: {
1461
+ id: number;
1462
+ };
1463
+ cookie?: never;
1464
+ };
1465
+ requestBody?: never;
1466
+ responses: {
1467
+ /** @description Judge */
1468
+ 200: {
1469
+ headers: {
1470
+ [name: string]: unknown;
1471
+ };
1472
+ content: {
1473
+ "application/json": unknown;
1474
+ };
1475
+ };
1476
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1477
+ 401: {
1478
+ headers: {
1479
+ [name: string]: unknown;
1480
+ };
1481
+ content?: never;
1482
+ };
1483
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1484
+ 403: {
1485
+ headers: {
1486
+ [name: string]: unknown;
1487
+ };
1488
+ content?: never;
1489
+ };
1490
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1491
+ 404: {
1492
+ headers: {
1493
+ [name: string]: unknown;
1494
+ };
1495
+ content?: never;
1496
+ };
1497
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1498
+ 429: {
1499
+ headers: {
1500
+ [name: string]: unknown;
1501
+ };
1502
+ content?: never;
1503
+ };
1504
+ };
1505
+ };
1506
+ put?: never;
1507
+ post?: never;
1508
+ delete?: never;
1509
+ options?: never;
1510
+ head?: never;
1511
+ patch?: never;
1512
+ trace?: never;
1513
+ };
1514
+ "/v1/judges/{id}/scorecards": {
1515
+ parameters: {
1516
+ query?: never;
1517
+ header?: never;
1518
+ path?: never;
1519
+ cookie?: never;
1520
+ };
1521
+ /**
1522
+ * Everything a judge has scored
1523
+ * @description This judge's card for every launch-org bout they worked, newest first — the bout, its event, the decision type, and their own card only (the full panel is on `/v1/fights/{id}/scorecards`). Cursor-paginated.
1524
+ */
1525
+ get: {
1526
+ parameters: {
1527
+ query?: {
1528
+ /** @description Opaque cursor from `meta.pagination.next_cursor`. */
1529
+ cursor?: string;
1530
+ limit?: number;
1531
+ };
1532
+ header?: never;
1533
+ path: {
1534
+ id: number;
1535
+ };
1536
+ cookie?: never;
1537
+ };
1538
+ requestBody?: never;
1539
+ responses: {
1540
+ /** @description Cards, newest first */
1541
+ 200: {
1542
+ headers: {
1543
+ [name: string]: unknown;
1544
+ };
1545
+ content: {
1546
+ /**
1547
+ * @example {
1548
+ * "data": [
1549
+ * {
1550
+ * "fight_id": 83379,
1551
+ * "event": {
1552
+ * "id": 2507,
1553
+ * "slug": "ufc-fight-night-2026-08-29",
1554
+ * "title": "UFC Fight Night: Nurmagomedov vs Song",
1555
+ * "org": "ufc",
1556
+ * "starts_at": "2026-08-29T07:00:00.000Z"
1557
+ * },
1558
+ * "fighter_a_id": 213,
1559
+ * "fighter_b_id": 1120,
1560
+ * "decision_type": "split",
1561
+ * "card": {
1562
+ * "judge_id": 36,
1563
+ * "judge_name": "Vito Paolillo",
1564
+ * "total_a": 28,
1565
+ * "total_b": 29,
1566
+ * "winner_fighter_id": 1120,
1567
+ * "is_draw": false,
1568
+ * "scores_known": true,
1569
+ * "rounds": [
1570
+ * {
1571
+ * "round": 1,
1572
+ * "a": 9,
1573
+ * "b": 10
1574
+ * }
1575
+ * ]
1576
+ * }
1577
+ * }
1578
+ * ],
1579
+ * "meta": {
1580
+ * "judge": {
1581
+ * "id": 36,
1582
+ * "name": "Vito Paolillo"
1583
+ * },
1584
+ * "pagination": {
1585
+ * "next_cursor": null,
1586
+ * "has_more": false
1587
+ * }
1588
+ * }
1589
+ * }
1590
+ */
1591
+ "application/json": unknown;
1592
+ };
1593
+ };
1594
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1595
+ 401: {
1596
+ headers: {
1597
+ [name: string]: unknown;
1598
+ };
1599
+ content?: never;
1600
+ };
1601
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1602
+ 403: {
1603
+ headers: {
1604
+ [name: string]: unknown;
1605
+ };
1606
+ content?: never;
1607
+ };
1608
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1609
+ 404: {
1610
+ headers: {
1611
+ [name: string]: unknown;
1612
+ };
1613
+ content?: never;
1614
+ };
1615
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1616
+ 429: {
1617
+ headers: {
1618
+ [name: string]: unknown;
1619
+ };
1620
+ content?: never;
1621
+ };
1622
+ };
1623
+ };
1624
+ put?: never;
1625
+ post?: never;
1626
+ delete?: never;
1627
+ options?: never;
1628
+ head?: never;
1629
+ patch?: never;
1630
+ trace?: never;
1631
+ };
1632
+ "/v1/fighters": {
1633
+ parameters: {
1634
+ query?: never;
1635
+ header?: never;
1636
+ path?: never;
1637
+ cookie?: never;
1638
+ };
1639
+ /**
1640
+ * Roster search
1641
+ * @description Fighters with at least one launch-org fight (~4.5k). `q` is accent-insensitive.
1642
+ */
1643
+ get: {
1644
+ parameters: {
1645
+ query?: {
1646
+ q?: string;
1647
+ /** @description Launch org slug: `ufc`, `pfl`, `oktagon`, `bkfc` or `rizin`. Staged orgs 400 until promoted. */
1648
+ org?: "ufc" | "pfl" | "oktagon" | "bkfc" | "rizin";
1649
+ /** @description ISO-2 code or country name. */
1650
+ country?: string;
1651
+ /** @description Opaque cursor from `meta.pagination.next_cursor`. */
1652
+ cursor?: string;
1653
+ limit?: number;
1654
+ };
1655
+ header?: never;
1656
+ path?: never;
1657
+ cookie?: never;
1658
+ };
1659
+ requestBody?: never;
1660
+ responses: {
1661
+ /** @description Fighters page */
1662
+ 200: {
1663
+ headers: {
1664
+ [name: string]: unknown;
1665
+ };
1666
+ content: {
1667
+ "application/json": unknown;
1668
+ };
1669
+ };
1670
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1671
+ 401: {
1672
+ headers: {
1673
+ [name: string]: unknown;
1674
+ };
1675
+ content?: never;
1676
+ };
1677
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1678
+ 403: {
1679
+ headers: {
1680
+ [name: string]: unknown;
1681
+ };
1682
+ content?: never;
1683
+ };
1684
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1685
+ 404: {
1686
+ headers: {
1687
+ [name: string]: unknown;
1688
+ };
1689
+ content?: never;
1690
+ };
1691
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1692
+ 429: {
1693
+ headers: {
1694
+ [name: string]: unknown;
1695
+ };
1696
+ content?: never;
1697
+ };
1698
+ };
1699
+ };
1700
+ put?: never;
1701
+ post?: never;
1702
+ delete?: never;
1703
+ options?: never;
1704
+ head?: never;
1705
+ patch?: never;
1706
+ trace?: never;
1707
+ };
1708
+ "/v1/fighters/{idOrSlug}": {
1709
+ parameters: {
1710
+ query?: never;
1711
+ header?: never;
1712
+ path?: never;
1713
+ cookie?: never;
1714
+ };
1715
+ /**
1716
+ * Fighter profile
1717
+ * @description Bio, per-scope career records (one row per scope, `source`-stamped), UFCalendar Power Index summary, and CC-licensed images with attribution metadata (displaying the credit is a license requirement).
1718
+ */
1719
+ get: {
1720
+ parameters: {
1721
+ query?: never;
1722
+ header?: never;
1723
+ path: {
1724
+ /** @description Numeric id or slug of the fighter. Stale slugs 308-redirect to the canonical URL. */
1725
+ idOrSlug: string;
1726
+ };
1727
+ cookie?: never;
1728
+ };
1729
+ requestBody?: never;
1730
+ responses: {
1731
+ /** @description Fighter detail */
1732
+ 200: {
1733
+ headers: {
1734
+ [name: string]: unknown;
1735
+ };
1736
+ content: {
1737
+ "application/json": unknown;
1738
+ };
1739
+ };
1740
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1741
+ 401: {
1742
+ headers: {
1743
+ [name: string]: unknown;
1744
+ };
1745
+ content?: never;
1746
+ };
1747
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1748
+ 403: {
1749
+ headers: {
1750
+ [name: string]: unknown;
1751
+ };
1752
+ content?: never;
1753
+ };
1754
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1755
+ 404: {
1756
+ headers: {
1757
+ [name: string]: unknown;
1758
+ };
1759
+ content?: never;
1760
+ };
1761
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1762
+ 429: {
1763
+ headers: {
1764
+ [name: string]: unknown;
1765
+ };
1766
+ content?: never;
1767
+ };
1768
+ };
1769
+ };
1770
+ put?: never;
1771
+ post?: never;
1772
+ delete?: never;
1773
+ options?: never;
1774
+ head?: never;
1775
+ patch?: never;
1776
+ trace?: never;
1777
+ };
1778
+ "/v1/fighters/{idOrSlug}/history": {
1779
+ parameters: {
1780
+ query?: never;
1781
+ header?: never;
1782
+ path?: never;
1783
+ cookie?: never;
1784
+ };
1785
+ /**
1786
+ * Complete career timeline
1787
+ * @description The fighter's FULL multi-promotion career: native tracked bouts (richest data, `source: "native"`) merged with fill-source history rows (`source: "history"`). Spans every promotion they fought in — not just launch orgs.
1788
+ */
1789
+ get: {
1790
+ parameters: {
1791
+ query?: never;
1792
+ header?: never;
1793
+ path: {
1794
+ /** @description Numeric id or slug of the fighter. Stale slugs 308-redirect to the canonical URL. */
1795
+ idOrSlug: string;
1796
+ };
1797
+ cookie?: never;
1798
+ };
1799
+ requestBody?: never;
1800
+ responses: {
1801
+ /** @description Timeline entries, newest first */
1802
+ 200: {
1803
+ headers: {
1804
+ [name: string]: unknown;
1805
+ };
1806
+ content: {
1807
+ "application/json": unknown;
1808
+ };
1809
+ };
1810
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1811
+ 401: {
1812
+ headers: {
1813
+ [name: string]: unknown;
1814
+ };
1815
+ content?: never;
1816
+ };
1817
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1818
+ 403: {
1819
+ headers: {
1820
+ [name: string]: unknown;
1821
+ };
1822
+ content?: never;
1823
+ };
1824
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1825
+ 404: {
1826
+ headers: {
1827
+ [name: string]: unknown;
1828
+ };
1829
+ content?: never;
1830
+ };
1831
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1832
+ 429: {
1833
+ headers: {
1834
+ [name: string]: unknown;
1835
+ };
1836
+ content?: never;
1837
+ };
1838
+ };
1839
+ };
1840
+ put?: never;
1841
+ post?: never;
1842
+ delete?: never;
1843
+ options?: never;
1844
+ head?: never;
1845
+ patch?: never;
1846
+ trace?: never;
1847
+ };
1848
+ "/v1/fighters/{idOrSlug}/stats": {
1849
+ parameters: {
1850
+ query?: never;
1851
+ header?: never;
1852
+ path?: never;
1853
+ cookie?: never;
1854
+ };
1855
+ /**
1856
+ * Career statistics
1857
+ * @description Per-scope career stats (`pro-mma`, `amateur-mma`, …): record, strikes landed/absorbed per minute, accuracy/defense, takedown and submission averages. Exactly ONE row per scope; `source` names the publisher it came from (`tapology` — the complete multi-promotion career — is preferred, then `sofascore`, then the promotion's own site). A Tapology record is a crawl-time snapshot advanced by every settled bout UFCalendar tracked after it, so it matches the record on ufcalendar.com. Org-scoped rows (`ufc-only`, `bkfc-only`, `one-only`, `oktagon-only`, `aca-only`) are the fighter's record INSIDE that promotion, not a career record. Scope `tracked` rows are computed by UFCalendar from per-fight totals when no scraped panel carries data (e.g. Contender Series debutants, PFL/OKTAGON rosters); their `record` is always null.
1858
+ */
1859
+ get: {
1860
+ parameters: {
1861
+ query?: never;
1862
+ header?: never;
1863
+ path: {
1864
+ /** @description Numeric id or slug of the fighter. Stale slugs 308-redirect to the canonical URL. */
1865
+ idOrSlug: string;
1866
+ };
1867
+ cookie?: never;
1868
+ };
1869
+ requestBody?: never;
1870
+ responses: {
1871
+ /** @description Career stat rows */
1872
+ 200: {
1873
+ headers: {
1874
+ [name: string]: unknown;
1875
+ };
1876
+ content: {
1877
+ "application/json": unknown;
1878
+ };
1879
+ };
1880
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1881
+ 401: {
1882
+ headers: {
1883
+ [name: string]: unknown;
1884
+ };
1885
+ content?: never;
1886
+ };
1887
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1888
+ 403: {
1889
+ headers: {
1890
+ [name: string]: unknown;
1891
+ };
1892
+ content?: never;
1893
+ };
1894
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1895
+ 404: {
1896
+ headers: {
1897
+ [name: string]: unknown;
1898
+ };
1899
+ content?: never;
1900
+ };
1901
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1902
+ 429: {
1903
+ headers: {
1904
+ [name: string]: unknown;
1905
+ };
1906
+ content?: never;
1907
+ };
1908
+ };
1909
+ };
1910
+ put?: never;
1911
+ post?: never;
1912
+ delete?: never;
1913
+ options?: never;
1914
+ head?: never;
1915
+ patch?: never;
1916
+ trace?: never;
1917
+ };
1918
+ "/v1/fighters/{idOrSlug}/rankings": {
1919
+ parameters: {
1920
+ query?: never;
1921
+ header?: never;
1922
+ path?: never;
1923
+ cookie?: never;
1924
+ };
1925
+ /**
1926
+ * Ranking history
1927
+ * @description Official-board rows over time (org, board, division, snapshot_date, rank). Rank 0 = champion.
1928
+ */
1929
+ get: {
1930
+ parameters: {
1931
+ query?: never;
1932
+ header?: never;
1933
+ path: {
1934
+ /** @description Numeric id or slug of the fighter. Stale slugs 308-redirect to the canonical URL. */
1935
+ idOrSlug: string;
1936
+ };
1937
+ cookie?: never;
1938
+ };
1939
+ requestBody?: never;
1940
+ responses: {
1941
+ /** @description Ranking rows */
1942
+ 200: {
1943
+ headers: {
1944
+ [name: string]: unknown;
1945
+ };
1946
+ content: {
1947
+ "application/json": unknown;
1948
+ };
1949
+ };
1950
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
1951
+ 401: {
1952
+ headers: {
1953
+ [name: string]: unknown;
1954
+ };
1955
+ content?: never;
1956
+ };
1957
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
1958
+ 403: {
1959
+ headers: {
1960
+ [name: string]: unknown;
1961
+ };
1962
+ content?: never;
1963
+ };
1964
+ /** @description Not found (staged-org data 404s until the org is promoted). */
1965
+ 404: {
1966
+ headers: {
1967
+ [name: string]: unknown;
1968
+ };
1969
+ content?: never;
1970
+ };
1971
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
1972
+ 429: {
1973
+ headers: {
1974
+ [name: string]: unknown;
1975
+ };
1976
+ content?: never;
1977
+ };
1978
+ };
1979
+ };
1980
+ put?: never;
1981
+ post?: never;
1982
+ delete?: never;
1983
+ options?: never;
1984
+ head?: never;
1985
+ patch?: never;
1986
+ trace?: never;
1987
+ };
1988
+ "/v1/fighters/{idOrSlug}/power-index": {
1989
+ parameters: {
1990
+ query?: never;
1991
+ header?: never;
1992
+ path?: never;
1993
+ cookie?: never;
1994
+ };
1995
+ /**
1996
+ * Power Index trajectory
1997
+ * @description Per-bout rating history from the UFCalendar Power Index engine (rating before/after, model win probability, outcome).
1998
+ */
1999
+ get: {
2000
+ parameters: {
2001
+ query?: never;
2002
+ header?: never;
2003
+ path: {
2004
+ /** @description Numeric id or slug of the fighter. Stale slugs 308-redirect to the canonical URL. */
2005
+ idOrSlug: string;
2006
+ };
2007
+ cookie?: never;
2008
+ };
2009
+ requestBody?: never;
2010
+ responses: {
2011
+ /** @description Rating points */
2012
+ 200: {
2013
+ headers: {
2014
+ [name: string]: unknown;
2015
+ };
2016
+ content: {
2017
+ "application/json": unknown;
2018
+ };
2019
+ };
2020
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2021
+ 401: {
2022
+ headers: {
2023
+ [name: string]: unknown;
2024
+ };
2025
+ content?: never;
2026
+ };
2027
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
2028
+ 403: {
2029
+ headers: {
2030
+ [name: string]: unknown;
2031
+ };
2032
+ content?: never;
2033
+ };
2034
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2035
+ 404: {
2036
+ headers: {
2037
+ [name: string]: unknown;
2038
+ };
2039
+ content?: never;
2040
+ };
2041
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2042
+ 429: {
2043
+ headers: {
2044
+ [name: string]: unknown;
2045
+ };
2046
+ content?: never;
2047
+ };
2048
+ };
2049
+ };
2050
+ put?: never;
2051
+ post?: never;
2052
+ delete?: never;
2053
+ options?: never;
2054
+ head?: never;
2055
+ patch?: never;
2056
+ trace?: never;
2057
+ };
2058
+ "/v1/rankings/{org}": {
2059
+ parameters: {
2060
+ query?: never;
2061
+ header?: never;
2062
+ path?: never;
2063
+ cookie?: never;
2064
+ };
2065
+ /**
2066
+ * Official board (point-in-time)
2067
+ * @description **The time machine**: pass `?date=YYYY-MM-DD` for the board as it stood on any date (UFC official back to 2013, 543 snapshots). A snapshot is valid until superseded. Rank 0 = champion; P4P has no rank 0.
2068
+ */
2069
+ get: {
2070
+ parameters: {
2071
+ query?: {
2072
+ date?: string;
2073
+ /** @description Default `official` (for UFC that is the media-panel vote ufc.com publishes). UFC additionally has `meta`. */
2074
+ board?: string;
2075
+ };
2076
+ header?: never;
2077
+ path: {
2078
+ org: "ufc" | "pfl" | "oktagon" | "bkfc";
2079
+ };
2080
+ cookie?: never;
2081
+ };
2082
+ requestBody?: never;
2083
+ responses: {
2084
+ /** @description Board grouped by division */
2085
+ 200: {
2086
+ headers: {
2087
+ [name: string]: unknown;
2088
+ };
2089
+ content: {
2090
+ /**
2091
+ * @example {
2092
+ * "data": {
2093
+ * "org": "ufc",
2094
+ * "board": "official",
2095
+ * "snapshot_date": "2016-11-14",
2096
+ * "divisions": [
2097
+ * {
2098
+ * "division": "Lightweight",
2099
+ * "entries": [
2100
+ * {
2101
+ * "rank": 0,
2102
+ * "is_champion": true,
2103
+ * "fighter_id": 3021,
2104
+ * "fighter_slug": "conor-mcgregor",
2105
+ * "name": "Conor McGregor"
2106
+ * }
2107
+ * ]
2108
+ * }
2109
+ * ]
2110
+ * }
2111
+ * }
2112
+ */
2113
+ "application/json": unknown;
2114
+ };
2115
+ };
2116
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2117
+ 401: {
2118
+ headers: {
2119
+ [name: string]: unknown;
2120
+ };
2121
+ content?: never;
2122
+ };
2123
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
2124
+ 403: {
2125
+ headers: {
2126
+ [name: string]: unknown;
2127
+ };
2128
+ content?: never;
2129
+ };
2130
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2131
+ 404: {
2132
+ headers: {
2133
+ [name: string]: unknown;
2134
+ };
2135
+ content?: never;
2136
+ };
2137
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2138
+ 429: {
2139
+ headers: {
2140
+ [name: string]: unknown;
2141
+ };
2142
+ content?: never;
2143
+ };
2144
+ };
2145
+ };
2146
+ put?: never;
2147
+ post?: never;
2148
+ delete?: never;
2149
+ options?: never;
2150
+ head?: never;
2151
+ patch?: never;
2152
+ trace?: never;
2153
+ };
2154
+ "/v1/rankings/{org}/{division}": {
2155
+ parameters: {
2156
+ query?: never;
2157
+ header?: never;
2158
+ path?: never;
2159
+ cookie?: never;
2160
+ };
2161
+ /**
2162
+ * One division
2163
+ * @description Same as the board endpoint, filtered to a division (`lightweight`, `womens-strawweight`, `pound-for-pound`, …).
2164
+ */
2165
+ get: {
2166
+ parameters: {
2167
+ query?: {
2168
+ date?: string;
2169
+ };
2170
+ header?: never;
2171
+ path: {
2172
+ org: string;
2173
+ division: string;
2174
+ };
2175
+ cookie?: never;
2176
+ };
2177
+ requestBody?: never;
2178
+ responses: {
2179
+ /** @description Division entries */
2180
+ 200: {
2181
+ headers: {
2182
+ [name: string]: unknown;
2183
+ };
2184
+ content: {
2185
+ "application/json": unknown;
2186
+ };
2187
+ };
2188
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2189
+ 401: {
2190
+ headers: {
2191
+ [name: string]: unknown;
2192
+ };
2193
+ content?: never;
2194
+ };
2195
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
2196
+ 403: {
2197
+ headers: {
2198
+ [name: string]: unknown;
2199
+ };
2200
+ content?: never;
2201
+ };
2202
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2203
+ 404: {
2204
+ headers: {
2205
+ [name: string]: unknown;
2206
+ };
2207
+ content?: never;
2208
+ };
2209
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2210
+ 429: {
2211
+ headers: {
2212
+ [name: string]: unknown;
2213
+ };
2214
+ content?: never;
2215
+ };
2216
+ };
2217
+ };
2218
+ put?: never;
2219
+ post?: never;
2220
+ delete?: never;
2221
+ options?: never;
2222
+ head?: never;
2223
+ patch?: never;
2224
+ trace?: never;
2225
+ };
2226
+ "/v1/champions": {
2227
+ parameters: {
2228
+ query?: never;
2229
+ header?: never;
2230
+ path?: never;
2231
+ cookie?: never;
2232
+ };
2233
+ /**
2234
+ * Current champions
2235
+ * @description Rank-0 rows of each launch org's latest official board.
2236
+ */
2237
+ get: {
2238
+ parameters: {
2239
+ query?: never;
2240
+ header?: never;
2241
+ path?: never;
2242
+ cookie?: never;
2243
+ };
2244
+ requestBody?: never;
2245
+ responses: {
2246
+ /** @description Champions */
2247
+ 200: {
2248
+ headers: {
2249
+ [name: string]: unknown;
2250
+ };
2251
+ content: {
2252
+ "application/json": unknown;
2253
+ };
2254
+ };
2255
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2256
+ 401: {
2257
+ headers: {
2258
+ [name: string]: unknown;
2259
+ };
2260
+ content?: never;
2261
+ };
2262
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
2263
+ 403: {
2264
+ headers: {
2265
+ [name: string]: unknown;
2266
+ };
2267
+ content?: never;
2268
+ };
2269
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2270
+ 404: {
2271
+ headers: {
2272
+ [name: string]: unknown;
2273
+ };
2274
+ content?: never;
2275
+ };
2276
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2277
+ 429: {
2278
+ headers: {
2279
+ [name: string]: unknown;
2280
+ };
2281
+ content?: never;
2282
+ };
2283
+ };
2284
+ };
2285
+ put?: never;
2286
+ post?: never;
2287
+ delete?: never;
2288
+ options?: never;
2289
+ head?: never;
2290
+ patch?: never;
2291
+ trace?: never;
2292
+ };
2293
+ "/v1/power-index/{org}": {
2294
+ parameters: {
2295
+ query?: never;
2296
+ header?: never;
2297
+ path?: never;
2298
+ cookie?: never;
2299
+ };
2300
+ /**
2301
+ * Power Index board
2302
+ * @description Top-rated active fighters whose latest bout was in this org, by the UFCalendar Power Index (our own rating engine, hourly refresh).
2303
+ */
2304
+ get: {
2305
+ parameters: {
2306
+ query?: {
2307
+ limit?: number;
2308
+ };
2309
+ header?: never;
2310
+ path: {
2311
+ org: "ufc" | "pfl" | "oktagon" | "bkfc" | "rizin";
2312
+ };
2313
+ cookie?: never;
2314
+ };
2315
+ requestBody?: never;
2316
+ responses: {
2317
+ /** @description Board rows */
2318
+ 200: {
2319
+ headers: {
2320
+ [name: string]: unknown;
2321
+ };
2322
+ content: {
2323
+ "application/json": unknown;
2324
+ };
2325
+ };
2326
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2327
+ 401: {
2328
+ headers: {
2329
+ [name: string]: unknown;
2330
+ };
2331
+ content?: never;
2332
+ };
2333
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
2334
+ 403: {
2335
+ headers: {
2336
+ [name: string]: unknown;
2337
+ };
2338
+ content?: never;
2339
+ };
2340
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2341
+ 404: {
2342
+ headers: {
2343
+ [name: string]: unknown;
2344
+ };
2345
+ content?: never;
2346
+ };
2347
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2348
+ 429: {
2349
+ headers: {
2350
+ [name: string]: unknown;
2351
+ };
2352
+ content?: never;
2353
+ };
2354
+ };
2355
+ };
2356
+ put?: never;
2357
+ post?: never;
2358
+ delete?: never;
2359
+ options?: never;
2360
+ head?: never;
2361
+ patch?: never;
2362
+ trace?: never;
2363
+ };
2364
+ "/v1/predictions/upcoming": {
2365
+ parameters: {
2366
+ query?: never;
2367
+ header?: never;
2368
+ path?: never;
2369
+ cookie?: never;
2370
+ };
2371
+ /**
2372
+ * Model win probabilities (UFC)
2373
+ * @description UFCalendar model win probabilities for upcoming UFC bouts, refreshed every 30 minutes. Corner-guarded: a probability is only served while the stored pair matches the bout's current pair — a late opponent swap removes the row rather than mislabeling it. Not betting advice.
2374
+ */
2375
+ get: {
2376
+ parameters: {
2377
+ query?: never;
2378
+ header?: never;
2379
+ path?: never;
2380
+ cookie?: never;
2381
+ };
2382
+ requestBody?: never;
2383
+ responses: {
2384
+ /** @description Predictions */
2385
+ 200: {
2386
+ headers: {
2387
+ [name: string]: unknown;
2388
+ };
2389
+ content: {
2390
+ "application/json": unknown;
2391
+ };
2392
+ };
2393
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2394
+ 401: {
2395
+ headers: {
2396
+ [name: string]: unknown;
2397
+ };
2398
+ content?: never;
2399
+ };
2400
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
2401
+ 403: {
2402
+ headers: {
2403
+ [name: string]: unknown;
2404
+ };
2405
+ content?: never;
2406
+ };
2407
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2408
+ 404: {
2409
+ headers: {
2410
+ [name: string]: unknown;
2411
+ };
2412
+ content?: never;
2413
+ };
2414
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2415
+ 429: {
2416
+ headers: {
2417
+ [name: string]: unknown;
2418
+ };
2419
+ content?: never;
2420
+ };
2421
+ };
2422
+ };
2423
+ put?: never;
2424
+ post?: never;
2425
+ delete?: never;
2426
+ options?: never;
2427
+ head?: never;
2428
+ patch?: never;
2429
+ trace?: never;
2430
+ };
2431
+ "/v1/broadcast-rights/{org}": {
2432
+ parameters: {
2433
+ query?: never;
2434
+ header?: never;
2435
+ path?: never;
2436
+ cookie?: never;
2437
+ };
2438
+ /**
2439
+ * Who airs it, per country
2440
+ * @description Org-level standing media rights per country (PFL harvested weekly across 212 countries; UFC ~110 curated). `WORLD` rows apply globally.
2441
+ */
2442
+ get: {
2443
+ parameters: {
2444
+ query?: {
2445
+ /** @description ISO-2 country code. */
2446
+ country?: string;
2447
+ };
2448
+ header?: never;
2449
+ path: {
2450
+ org: string;
2451
+ };
2452
+ cookie?: never;
2453
+ };
2454
+ requestBody?: never;
2455
+ responses: {
2456
+ /** @description Rights rows */
2457
+ 200: {
2458
+ headers: {
2459
+ [name: string]: unknown;
2460
+ };
2461
+ content: {
2462
+ "application/json": unknown;
2463
+ };
2464
+ };
2465
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2466
+ 401: {
2467
+ headers: {
2468
+ [name: string]: unknown;
2469
+ };
2470
+ content?: never;
2471
+ };
2472
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
2473
+ 403: {
2474
+ headers: {
2475
+ [name: string]: unknown;
2476
+ };
2477
+ content?: never;
2478
+ };
2479
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2480
+ 404: {
2481
+ headers: {
2482
+ [name: string]: unknown;
2483
+ };
2484
+ content?: never;
2485
+ };
2486
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2487
+ 429: {
2488
+ headers: {
2489
+ [name: string]: unknown;
2490
+ };
2491
+ content?: never;
2492
+ };
2493
+ };
2494
+ };
2495
+ put?: never;
2496
+ post?: never;
2497
+ delete?: never;
2498
+ options?: never;
2499
+ head?: never;
2500
+ patch?: never;
2501
+ trace?: never;
2502
+ };
2503
+ "/v1/venues/{id}": {
2504
+ parameters: {
2505
+ query?: never;
2506
+ header?: never;
2507
+ path?: never;
2508
+ cookie?: never;
2509
+ };
2510
+ /**
2511
+ * Venue
2512
+ * @description Venue with city, country, coordinates, capacity and IANA tz.
2513
+ */
2514
+ get: {
2515
+ parameters: {
2516
+ query?: never;
2517
+ header?: never;
2518
+ path: {
2519
+ id: number;
2520
+ };
2521
+ cookie?: never;
2522
+ };
2523
+ requestBody?: never;
2524
+ responses: {
2525
+ /** @description Venue */
2526
+ 200: {
2527
+ headers: {
2528
+ [name: string]: unknown;
2529
+ };
2530
+ content: {
2531
+ "application/json": unknown;
2532
+ };
2533
+ };
2534
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2535
+ 401: {
2536
+ headers: {
2537
+ [name: string]: unknown;
2538
+ };
2539
+ content?: never;
2540
+ };
2541
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
2542
+ 403: {
2543
+ headers: {
2544
+ [name: string]: unknown;
2545
+ };
2546
+ content?: never;
2547
+ };
2548
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2549
+ 404: {
2550
+ headers: {
2551
+ [name: string]: unknown;
2552
+ };
2553
+ content?: never;
2554
+ };
2555
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2556
+ 429: {
2557
+ headers: {
2558
+ [name: string]: unknown;
2559
+ };
2560
+ content?: never;
2561
+ };
2562
+ };
2563
+ };
2564
+ put?: never;
2565
+ post?: never;
2566
+ delete?: never;
2567
+ options?: never;
2568
+ head?: never;
2569
+ patch?: never;
2570
+ trace?: never;
2571
+ };
2572
+ "/v1/search": {
2573
+ parameters: {
2574
+ query?: never;
2575
+ header?: never;
2576
+ path?: never;
2577
+ cookie?: never;
2578
+ };
2579
+ /**
2580
+ * Typeahead search
2581
+ * @description Accent-insensitive search across roster fighters and events. Great for building pickers.
2582
+ */
2583
+ get: {
2584
+ parameters: {
2585
+ query: {
2586
+ q: string;
2587
+ };
2588
+ header?: never;
2589
+ path?: never;
2590
+ cookie?: never;
2591
+ };
2592
+ requestBody?: never;
2593
+ responses: {
2594
+ /** @description Matches */
2595
+ 200: {
2596
+ headers: {
2597
+ [name: string]: unknown;
2598
+ };
2599
+ content: {
2600
+ "application/json": unknown;
2601
+ };
2602
+ };
2603
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2604
+ 401: {
2605
+ headers: {
2606
+ [name: string]: unknown;
2607
+ };
2608
+ content?: never;
2609
+ };
2610
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
2611
+ 403: {
2612
+ headers: {
2613
+ [name: string]: unknown;
2614
+ };
2615
+ content?: never;
2616
+ };
2617
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2618
+ 404: {
2619
+ headers: {
2620
+ [name: string]: unknown;
2621
+ };
2622
+ content?: never;
2623
+ };
2624
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2625
+ 429: {
2626
+ headers: {
2627
+ [name: string]: unknown;
2628
+ };
2629
+ content?: never;
2630
+ };
2631
+ };
2632
+ };
2633
+ put?: never;
2634
+ post?: never;
2635
+ delete?: never;
2636
+ options?: never;
2637
+ head?: never;
2638
+ patch?: never;
2639
+ trace?: never;
2640
+ };
2641
+ "/v1/calendar/{org}.ics": {
2642
+ parameters: {
2643
+ query?: never;
2644
+ header?: never;
2645
+ path?: never;
2646
+ cookie?: never;
2647
+ };
2648
+ /**
2649
+ * ICS calendar feed
2650
+ * @description Subscribe your calendar app to an org's schedule. Calendar apps can't send headers, so pass the key as `?key=`. Refresh hourly at most.
2651
+ */
2652
+ get: {
2653
+ parameters: {
2654
+ query: {
2655
+ key: string;
2656
+ };
2657
+ header?: never;
2658
+ path: {
2659
+ /** @description `ufc.ics`, `pfl.ics`, `oktagon.ics`, `bkfc.ics` or `rizin.ics` */
2660
+ "org.ics": string;
2661
+ };
2662
+ cookie?: never;
2663
+ };
2664
+ requestBody?: never;
2665
+ responses: {
2666
+ /** @description text/calendar VEVENT feed of upcoming events */
2667
+ 200: {
2668
+ headers: {
2669
+ [name: string]: unknown;
2670
+ };
2671
+ content?: never;
2672
+ };
2673
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2674
+ 401: {
2675
+ headers: {
2676
+ [name: string]: unknown;
2677
+ };
2678
+ content?: never;
2679
+ };
2680
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
2681
+ 403: {
2682
+ headers: {
2683
+ [name: string]: unknown;
2684
+ };
2685
+ content?: never;
2686
+ };
2687
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2688
+ 404: {
2689
+ headers: {
2690
+ [name: string]: unknown;
2691
+ };
2692
+ content?: never;
2693
+ };
2694
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2695
+ 429: {
2696
+ headers: {
2697
+ [name: string]: unknown;
2698
+ };
2699
+ content?: never;
2700
+ };
2701
+ };
2702
+ };
2703
+ put?: never;
2704
+ post?: never;
2705
+ delete?: never;
2706
+ options?: never;
2707
+ head?: never;
2708
+ patch?: never;
2709
+ trace?: never;
2710
+ };
2711
+ "/v1/webhook-endpoints": {
2712
+ parameters: {
2713
+ query?: never;
2714
+ header?: never;
2715
+ path?: never;
2716
+ cookie?: never;
2717
+ };
2718
+ /**
2719
+ * List your webhook endpoints
2720
+ * @description Pro and above. Counts as one request against your quota; the deliveries themselves do not.
2721
+ */
2722
+ get: {
2723
+ parameters: {
2724
+ query?: never;
2725
+ header?: never;
2726
+ path?: never;
2727
+ cookie?: never;
2728
+ };
2729
+ requestBody?: never;
2730
+ responses: {
2731
+ /** @description Endpoints */
2732
+ 200: {
2733
+ headers: {
2734
+ [name: string]: unknown;
2735
+ };
2736
+ content: {
2737
+ "application/json": unknown;
2738
+ };
2739
+ };
2740
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2741
+ 401: {
2742
+ headers: {
2743
+ [name: string]: unknown;
2744
+ };
2745
+ content?: never;
2746
+ };
2747
+ /** @description Requires Pro or above */
2748
+ 403: {
2749
+ headers: {
2750
+ [name: string]: unknown;
2751
+ };
2752
+ content?: never;
2753
+ };
2754
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2755
+ 404: {
2756
+ headers: {
2757
+ [name: string]: unknown;
2758
+ };
2759
+ content?: never;
2760
+ };
2761
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2762
+ 429: {
2763
+ headers: {
2764
+ [name: string]: unknown;
2765
+ };
2766
+ content?: never;
2767
+ };
2768
+ };
2769
+ };
2770
+ put?: never;
2771
+ /**
2772
+ * Register a webhook endpoint
2773
+ * @description Pro+. Body: `{"url": "https://...", "events": ["event.announced", "fight.result", "card.changed", "event.completed"]}`. Subscribe to `event.announced` and you do not need to poll `/v1/events` to discover new cards — it fires once, within a minute of a card first landing in our data, and carries the same event object the list endpoint returns. The response contains the signing `secret` ONCE. Deliveries carry `X-UFCalendar-Signature: t=<unix>,v1=<hmac>` where the HMAC-SHA256 input is `"<t>.<rawBody>"`. **Verify the timestamp too**: reject anything where `|now - t|` exceeds 300 seconds, otherwise a captured delivery can be replayed at you forever with a valid HMAC. Delivery is at-least-once — deduplicate on the event body, and expect a retry roughly every 60s until your endpoint returns 2xx. Endpoints auto-disable after 20 consecutive failures, and you may hold at most 3 active endpoints. Latency: results are dispatched within ~1 minute of our scrapers writing them. `event.announced` only fires for cards that have not started yet, so archive backfills never reach you as new-card noise. `card.changed` is filtered the same way: a change whose before and after read identically (a venue row re-minted for the same arena, a source dropping a sub-time it never knew) is never delivered, and when a source flip-flops a value we deliver the move and its undo once, not the twentieth repeat. Deliveries are free — they never count against your monthly request quota, only the calls you make to manage endpoints do.
2774
+ */
2775
+ post: {
2776
+ parameters: {
2777
+ query?: never;
2778
+ header?: never;
2779
+ path?: never;
2780
+ cookie?: never;
2781
+ };
2782
+ requestBody?: never;
2783
+ responses: {
2784
+ /** @description Created — includes the one-time secret */
2785
+ 201: {
2786
+ headers: {
2787
+ [name: string]: unknown;
2788
+ };
2789
+ content?: never;
2790
+ };
2791
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2792
+ 401: {
2793
+ headers: {
2794
+ [name: string]: unknown;
2795
+ };
2796
+ content?: never;
2797
+ };
2798
+ /** @description Requires Pro or above */
2799
+ 403: {
2800
+ headers: {
2801
+ [name: string]: unknown;
2802
+ };
2803
+ content?: never;
2804
+ };
2805
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2806
+ 404: {
2807
+ headers: {
2808
+ [name: string]: unknown;
2809
+ };
2810
+ content?: never;
2811
+ };
2812
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2813
+ 429: {
2814
+ headers: {
2815
+ [name: string]: unknown;
2816
+ };
2817
+ content?: never;
2818
+ };
2819
+ };
2820
+ };
2821
+ delete?: never;
2822
+ options?: never;
2823
+ head?: never;
2824
+ patch?: never;
2825
+ trace?: never;
2826
+ };
2827
+ "/v1/webhook-endpoints/{id}": {
2828
+ parameters: {
2829
+ query?: never;
2830
+ header?: never;
2831
+ path?: never;
2832
+ cookie?: never;
2833
+ };
2834
+ get?: never;
2835
+ put?: never;
2836
+ post?: never;
2837
+ /**
2838
+ * Delete a webhook endpoint
2839
+ * @description Pro and above.
2840
+ */
2841
+ delete: {
2842
+ parameters: {
2843
+ query?: never;
2844
+ header?: never;
2845
+ path: {
2846
+ id: number;
2847
+ };
2848
+ cookie?: never;
2849
+ };
2850
+ requestBody?: never;
2851
+ responses: {
2852
+ /** @description Deleted */
2853
+ 200: {
2854
+ headers: {
2855
+ [name: string]: unknown;
2856
+ };
2857
+ content: {
2858
+ "application/json": unknown;
2859
+ };
2860
+ };
2861
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2862
+ 401: {
2863
+ headers: {
2864
+ [name: string]: unknown;
2865
+ };
2866
+ content?: never;
2867
+ };
2868
+ /** @description Requires Pro or above */
2869
+ 403: {
2870
+ headers: {
2871
+ [name: string]: unknown;
2872
+ };
2873
+ content?: never;
2874
+ };
2875
+ /** @description Not found (staged-org data 404s until the org is promoted). */
2876
+ 404: {
2877
+ headers: {
2878
+ [name: string]: unknown;
2879
+ };
2880
+ content?: never;
2881
+ };
2882
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2883
+ 429: {
2884
+ headers: {
2885
+ [name: string]: unknown;
2886
+ };
2887
+ content?: never;
2888
+ };
2889
+ };
2890
+ };
2891
+ options?: never;
2892
+ head?: never;
2893
+ patch?: never;
2894
+ trace?: never;
2895
+ };
2896
+ "/v1/webhook-endpoints/{id}/rotate-secret": {
2897
+ parameters: {
2898
+ query?: never;
2899
+ header?: never;
2900
+ path?: never;
2901
+ cookie?: never;
2902
+ };
2903
+ get?: never;
2904
+ put?: never;
2905
+ /**
2906
+ * Rotate an endpoint signing secret
2907
+ * @description Pro and above. Issues a fresh `whsec_` secret for the endpoint and returns it ONCE, keeping the endpoint id and its delivery history. The previous secret stops verifying the moment this returns, so deploy the new one to your receiver first (or accept both during the cutover). Use this instead of delete-and-recreate when a secret leaks.
2908
+ */
2909
+ post: {
2910
+ parameters: {
2911
+ query?: never;
2912
+ header?: never;
2913
+ path: {
2914
+ id: number;
2915
+ };
2916
+ cookie?: never;
2917
+ };
2918
+ requestBody?: never;
2919
+ responses: {
2920
+ /** @description Rotated — includes the new one-time secret */
2921
+ 200: {
2922
+ headers: {
2923
+ [name: string]: unknown;
2924
+ };
2925
+ content?: never;
2926
+ };
2927
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2928
+ 401: {
2929
+ headers: {
2930
+ [name: string]: unknown;
2931
+ };
2932
+ content?: never;
2933
+ };
2934
+ /** @description Requires Pro or above */
2935
+ 403: {
2936
+ headers: {
2937
+ [name: string]: unknown;
2938
+ };
2939
+ content?: never;
2940
+ };
2941
+ /** @description No such endpoint on this account */
2942
+ 404: {
2943
+ headers: {
2944
+ [name: string]: unknown;
2945
+ };
2946
+ content?: never;
2947
+ };
2948
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
2949
+ 429: {
2950
+ headers: {
2951
+ [name: string]: unknown;
2952
+ };
2953
+ content?: never;
2954
+ };
2955
+ };
2956
+ };
2957
+ delete?: never;
2958
+ options?: never;
2959
+ head?: never;
2960
+ patch?: never;
2961
+ trace?: never;
2962
+ };
2963
+ "/v1/bulk/{kind}": {
2964
+ parameters: {
2965
+ query?: never;
2966
+ header?: never;
2967
+ path?: never;
2968
+ cookie?: never;
2969
+ };
2970
+ /**
2971
+ * Bulk snapshot (Enterprise only)
2972
+ * @description Enterprise only — the full dataset is licensed, not self-serve; contact api@ufcalendar.com. Downloads the full launch-scope dataset as gzipped JSON: `events.json.gz`, `fights.json.gz` or `fighters.json.gz`. Responds 302 to a presigned URL; snapshots regenerate at most every 6 hours. One request per download (the redirect is free).
2973
+ */
2974
+ get: {
2975
+ parameters: {
2976
+ query?: never;
2977
+ header?: never;
2978
+ path: {
2979
+ kind: "events.json.gz" | "fights.json.gz" | "fighters.json.gz";
2980
+ };
2981
+ cookie?: never;
2982
+ };
2983
+ requestBody?: never;
2984
+ responses: {
2985
+ /** @description Redirect to a time-limited download URL */
2986
+ 302: {
2987
+ headers: {
2988
+ [name: string]: unknown;
2989
+ };
2990
+ content?: never;
2991
+ };
2992
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
2993
+ 401: {
2994
+ headers: {
2995
+ [name: string]: unknown;
2996
+ };
2997
+ content?: never;
2998
+ };
2999
+ /** @description Requires an Enterprise agreement */
3000
+ 403: {
3001
+ headers: {
3002
+ [name: string]: unknown;
3003
+ };
3004
+ content?: never;
3005
+ };
3006
+ /** @description Not found (staged-org data 404s until the org is promoted). */
3007
+ 404: {
3008
+ headers: {
3009
+ [name: string]: unknown;
3010
+ };
3011
+ content?: never;
3012
+ };
3013
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
3014
+ 429: {
3015
+ headers: {
3016
+ [name: string]: unknown;
3017
+ };
3018
+ content?: never;
3019
+ };
3020
+ };
3021
+ };
3022
+ put?: never;
3023
+ post?: never;
3024
+ delete?: never;
3025
+ options?: never;
3026
+ head?: never;
3027
+ patch?: never;
3028
+ trace?: never;
3029
+ };
3030
+ "/v1/usage": {
3031
+ parameters: {
3032
+ query?: never;
3033
+ header?: never;
3034
+ path?: never;
3035
+ cookie?: never;
3036
+ };
3037
+ /**
3038
+ * Your quota usage
3039
+ * @description Current-month usage for the calling key: tier, requests used/limit, rpm limit, reset.
3040
+ */
3041
+ get: {
3042
+ parameters: {
3043
+ query?: never;
3044
+ header?: never;
3045
+ path?: never;
3046
+ cookie?: never;
3047
+ };
3048
+ requestBody?: never;
3049
+ responses: {
3050
+ /** @description Usage */
3051
+ 200: {
3052
+ headers: {
3053
+ [name: string]: unknown;
3054
+ };
3055
+ content: {
3056
+ /**
3057
+ * @example {
3058
+ * "data": {
3059
+ * "tier": "pro",
3060
+ * "month": "202608",
3061
+ * "requests_used": 1204,
3062
+ * "requests_limit": 200000,
3063
+ * "rpm_limit": 300,
3064
+ * "reset": 1756684800
3065
+ * }
3066
+ * }
3067
+ */
3068
+ "application/json": unknown;
3069
+ };
3070
+ };
3071
+ /** @description Missing/invalid API key. `{"error":{"code":"unauthorized",...}}` */
3072
+ 401: {
3073
+ headers: {
3074
+ [name: string]: unknown;
3075
+ };
3076
+ content?: never;
3077
+ };
3078
+ /** @description No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api. */
3079
+ 403: {
3080
+ headers: {
3081
+ [name: string]: unknown;
3082
+ };
3083
+ content?: never;
3084
+ };
3085
+ /** @description Not found (staged-org data 404s until the org is promoted). */
3086
+ 404: {
3087
+ headers: {
3088
+ [name: string]: unknown;
3089
+ };
3090
+ content?: never;
3091
+ };
3092
+ /** @description Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`. */
3093
+ 429: {
3094
+ headers: {
3095
+ [name: string]: unknown;
3096
+ };
3097
+ content?: never;
3098
+ };
3099
+ };
3100
+ };
3101
+ put?: never;
3102
+ post?: never;
3103
+ delete?: never;
3104
+ options?: never;
3105
+ head?: never;
3106
+ patch?: never;
3107
+ trace?: never;
3108
+ };
3109
+ }
3110
+ type operations = Record<string, never>;
3111
+
3112
+ export { type Broadcast, type BroadcastRight, type CareerBout, type CareerStats, DEFAULT_BASE_URL, type Envelope, type EventChange, type EventDetail, type EventStatus, type EventSummary, type Fight, FightAPI, FightAPIError, type FightAPIOptions, type FightResult, type Fighter, type FighterImage, type FighterRef, type FighterSummary, type Judge, type Meta, type Org, type Plan, type Plans, type PowerIndex, type Query, type QueryValue, type RankingDivision, type RankingEntry, type RankingsBoard, type RateLimit, type Scorecard, type ScorecardRound, type Scorecards, type Usage, VERSION, type Venue, type WebhookEndpoint, type operations, type paths };