Skip to content
MMA Calendar
MMA Fight Data API · Code guide

How do I get RIZIN results and schedule from an API?

Use org=rizin on the MMA Fight Data API. GET /v1/events?org=rizin returns upcoming RIZIN cards with UTC times and the venue's time zone, status=completed returns past cards newest first, and each card's event endpoint lists every bout with the winner, method, round and time. It is the same JSON as for the UFC, so one integration covers both.

Free plan: 1,000 requests a month, no card. Paid plans from $19/mo.

Endpoints used

Endpoints used
Method & pathWhat it returnsPlan
GET /v1/events?org=rizinMMA schedule + results API: full fight cards, venues, broadcasts, and a card-change diff log for late reshuffles.All plans
GET /v1/events/{slug}One event with its full fight card (both corners, results when completed), venue and event-level broadcasts.All plans
GET /v1/fighters/{slug}/historyRoster search, bios, records · and complete multi-promotion career timelines, merged and deduplicated.All plans
GET /v1/orgsEvery covered promotion with its sport and capability flags: stats, rounds, rankings, broadcasts, predictions, scorecards and odds.All plans

The code

curl lists the two latest RIZIN cards. The Python block prints upcoming cards in Japan time and the results of the latest card; the JavaScript block lists the last five cards with each main event's winner.

Every block runs as shown with your API key in the UFCAL_API_KEY environment variable. Python uses pip install ufcalendar and JavaScript or TypeScript uses npm install @ufcalendar/sdk; any HTTP client works too.

curl
curl "https://api.ufcalendar.com/v1/events?org=rizin&status=completed&limit=2" \
  -H "Authorization: Bearer $UFCAL_API_KEY"
Python
# pip install ufcalendar
from datetime import datetime
from zoneinfo import ZoneInfo

from ufcalendar import FightAPI

api = FightAPI()  # reads UFCAL_API_KEY from the environment

# Upcoming RIZIN cards, shown in the venue's own time zone
for ev in api.events("rizin", limit=3):
    start = datetime.fromisoformat(ev["starts_at"].replace("Z", "+00:00"))
    print(start.astimezone(ZoneInfo(ev["tz"])).strftime("%Y-%m-%d %H:%M %Z"), ev["title"])

# Results of the latest completed RIZIN card
last = next(api.events("rizin", status="completed", limit=1))
print(last["title"])
for f in api.event(last["slug"])["card"]:
    r, a, b = f["result"], f["fighter_a"], f["fighter_b"]
    if not r:
        continue
    if r["winner_fighter_id"] == a["id"]:
        line = f"{a['name']} def. {b['name']}"
    elif r["winner_fighter_id"] == b["id"]:
        line = f"{b['name']} def. {a['name']}"
    else:
        line = f"{a['name']} vs {b['name']}: no winner"
    print(f"  {line} - {r['method']}, R{r['round']} {r['time']}")
JavaScript
// npm install @ufcalendar/sdk
import { FightAPI } from "@ufcalendar/sdk";

const api = new FightAPI(); // reads UFCAL_API_KEY from the environment

// The last five RIZIN cards, each with its main event result
for await (const ev of api.events({ org: "rizin", status: "completed", limit: 5, include: ["headline"] })) {
  const h = ev.headline;
  if (!h) { console.log(ev.starts_at.slice(0, 10), ev.title); continue; }
  const winner = [h.fighter_a, h.fighter_b].find((c) => c.id === h.winner_fighter_id);
  console.log(ev.starts_at.slice(0, 10), ev.title, "|", `${h.fighter_a.name} vs ${h.fighter_b.name}`, "->", winner?.name ?? "no winner", h.method ?? "");
}

Sample response

A real response from the live API, trimmed for length. … marks removed fields.

GET /v1/events?org=rizin&status=completed&limit=2
{
  "data": [
    {
      "id": 2521,
      "slug": "rizin-2026-10-03",
      "title": "RIZIN LANDMARK 16 in NAGASAKI",
      "short_title": "RIZIN LANDMARK 16",
      "numbering": "RIZIN LANDMARK 16",
      "org": "rizin",
      "sport": "mma",
      "starts_at": "2026-10-03T03:30:00.000Z",
      "main_card_at": "2026-10-03T07:00:00.000Z",
      "prelims_at": "2026-10-03T05:00:00.000Z",
      "early_prelims_at": null,
      "tz": "Asia/Tokyo",
      "status": "completed",
      "is_ppv": false,
      "is_title_card": false
    },
    …
  ],
  "meta": {
    "pagination": { "next_cursor": "eyJpZCI6MTQxM30", "has_more": true, "limit": 2 }
  }
}

Notes and pitfalls

  • RIZIN cards usually start in the afternoon in Japan, which is the early morning or the night before in Europe and the Americas. Convert starts_at with the event's tz instead of assuming a date.
  • Each bout carries its own sport, and weight_class is RIZIN's own label, often a weight in pounds or a catchweight. Group bouts by division_slug, which can be null, rather than by the label.
  • Method strings follow the promotion's own wording, for example TKO (Elbow and Punches). Use method_normalized (ko_tko, submission, decision_unanimous) in your logic.
  • RIZIN publishes no rankings, so the rankings endpoints do not cover it. Per-round stats start in 2023 and judges' cards cover 2019 to 2022 and March 2026 onward; capabilities on GET /v1/orgs is the source of truth.

Related pages

More code guides

All code guides →

UFCalendar is an independent publication, not affiliated with UFC/Zuffa/TKO, PFL, OKTAGON MMA, BKFC, RIZIN FF or any promotion. Organization names are used to describe the data. Terms of service · Refund Policy

How do I get RIZIN results and schedule from an API? | UFCalendar