← FighterAPICONTENT HISTORY

Update to FighterAPI

Snapshot Oct 30, 2026 · 00:06 UTC · version 1.0.0

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save FighterAPI and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Reads and uses FighterAPI's Elo fighter ratings by weight class: leaderboards of active fighters, rating gaps as win probabilities, peak vs current, rating change per fight, and strength of schedule. Use when the user asks who is rated highest at a weight, how big a rating gap is, who is underrated or overrated, or how a fighter's rating moved. Do not use for official rankings -- those are not in the data. Do not use for market prices -- see odds-explorer. Do not use to check calibration -- see probability-calibration.",
  "included_files": [],
  "name": "elo-by-weight-class",
  "skill_md_contents": "---\nname: elo-by-weight-class\ndescription: \"Reads and uses FighterAPI's Elo fighter ratings by weight class: leaderboards of active fighters, rating gaps as win probabilities, peak vs current, rating change per fight, and strength of schedule. Use when the user asks who is rated highest at a weight, how big a rating gap is, who is underrated or overrated, or how a fighter's rating moved. Do not use for official rankings -- those are not in the data. Do not use for market prices -- see odds-explorer. Do not use to check calibration -- see probability-calibration.\"\nmetadata:\n  version: 1.0.0\n  author: FighterAPI\n---\n\n# Elo by Weight Class\n\n> **Default data tool:** FighterAPI (`fighterapi-tool`).\n> Use `get_ratings` (2 credits) for a ranked list. Use `get_fighter_fights` (5 credits) for rating before and after every fight, which is the only leak-free history.\n\nYou are an expert in rating systems for combat sports. Your goal is to use the ratings honestly: as a transparent prior built from results, not as a rival to the betting market, and not as an official ranking.\n\n## When to Use\n\n- \"Top 10 welterweights by rating\"\n- \"How far ahead is A of B?\" and what that implies\n- \"Who has risen fastest in the last year?\"\n- Strength of schedule: the ratings of a fighter's opponents\n- Building a rating-based feature for a model\n\n## When NOT to Use\n\n- Official promotion rankings -- not in the data; say so\n- Odds and prices -- see `odds-explorer`\n- Testing whether the ratings are calibrated -- see `probability-calibration`\n- PFL or Bellator comparisons across promotions -- ratings are built per promotion\n\n## Commands Available\n\n| Command | What It Does | Credits |\n|---------|-------------|---------|\n| `get_ratings` | Elo leaderboard, highest first, for fighters active since a year | 2 |\n| `get_fighter` | `rating.current` and `rating.peak` for one fighter | 5 |\n| `get_fighter_fights` | `rating_before` and `rating_after` for every fight | 5 per page |\n| `get_fight` | `fighters[].elo.before` and `after` for both sides of one fight | 5 |\n\n## Commands That Do NOT Exist\n\n| Not Available | Use Instead |\n|--------------|-------------|\n| `get_rankings` | `get_ratings` (our Elo) |\n| `get_ratings_history` or `get_ratings_as_of` | `get_fighter_fights`, which has `rating_before` per fight |\n| `get_pound_for_pound` | Sort `get_ratings` without a `weight_class` and say it mixes divisions |\n| `get_win_probability` | Compute from the rating gap (formula below) |\n\n## How the Ratings Are Built\n\nThe response states the method. Read `data.method` in the live reply: Elo from UFC results alone, start 1500, K 40 for a fighter's first five bouts then 24, finishes weighted 1.15, draws 0.5, no contests unrated. Quote the method from the response rather than from memory, because it can change.\n\nWhat that implies:\n\n- A fighter's first fights move the rating more (K 40). Early ratings are noisy.\n- Finishes move the rating more than decisions.\n- There is no opponent-weight-class adjustment. A rating belongs to a fighter, not to a division. A fighter who moves weight keeps the rating.\n- Ratings carry no layoff decay, injuries or age.\n\n## Parameters\n\n`get_ratings`: `weight_class` (for example Welterweight or Women's Strawweight), `active_since` (a year, default is last year), `limit` (default 25, up to 200), `league`. Rows: `rank`, `fighter_id`, `name`, `weight_class`, `rating`, `last_fight`, `fights`, `ufc_fights`.\n\nReal call (Lightweight, top 3 active since 2025): first place Max Holloway at 1684 with 33 fights. The `weight_class` on a row is the fighter's current class.\n\n## Rating Gap to Probability\n\nFor fighters with ratings `R_a` and `R_b`:\n\n```python\ndef p_win(r_a, r_b, scale=400):\n    return 1 / (1 + 10 ** (-(r_a - r_b) / scale))\n```\n\nThe standard Elo form uses a 400 scale. That is an assumption about how this rating behaves. Fit it: collect `rating_before` for each side of many past fights (from `get_fighter_fights`), compute `p_win`, compare with outcomes, and adjust `scale` until calibration is good (`probability-calibration`). If the market is better calibrated, the market wins. Use the rating as a prior to be shrunk toward the market.\n\n## Strength of Schedule\n\n1. `get_fighter_fights` for the fighter.\n2. For each row, the opponent is whichever of `fighter_a` or `fighter_b` is not the fighter. Pull their rating at the time through `get_fight` (`fighters[].elo.before`, 5 credits) when you need exactness, or approximate with the opponent's current rating from `get_ratings` and label it approximate.\n3. Mean opponent rating, weighted by recency.\n\nOpponent ratings are more informative than record. A 9-1 fighter whose opponents averaged 1480 should be read differently from a 9-3 fighter whose opponents averaged 1600.\n\n## Rating Change as a Surprise Score\n\nFor each fight, `rating_after - rating_before`. A big drop for a favourite is the model's surprise. Large positive moves for a fighter in a short span signal a surge, but with K 40 early on, check the fight count.\n\n## Leak-free Rules\n\n- Never use `get_ratings` or `rating.current` as a feature for a fight in the past. They include that fight and everything after. Use `rating_before` from the fight row.\n- For a live fight, current ratings are correct inputs.\n\n## Worked Example\n\nRequest: \"Is a 45-point rating gap meaningful at lightweight?\"\n\n```\nget_ratings(weight_class=\"Lightweight\", active_since=2025, limit=3)\n```\n\nWith the standard scale, a gap of 45 is `p_win` of about 0.56. That is a small edge, a little over a coin flip. Show the user how many active lightweights sit within 45 points of each other, then show a calibration check if they want to trust it.\n\n## Output Format\n\n```\nWelterweight, active since 2025, top 5 by Elo\n1  Name  1690  (fights 18, last fight 2026-03-08)\n...\nGap 1 vs 2: 24 points -> 53.4% (scale 400, unfitted)\nMethod: Elo from UFC results alone (read from data.method)\n```\n\n## Anti-patterns\n\n| What the Model Might Do | Why It Is Wrong | Do This Instead |\n|---------------------|----------------|-----------------|\n| Call it \"the rankings\" | It is our rating, not the UFC's | Say \"our Elo rating\" |\n| Use current rating for a past fight | Leaks the future | `rating_before` |\n| Compare ratings across promotions | Built from different results | Compare within a promotion |\n| Treat a rating gap as a betting edge | Market already prices it | Compare to the devigged close |\n| Trust a fighter with 3 fights | K 40 swings | Flag early ratings as noisy |\n\n## What to Do Next\n\n| Finding | Next Skill |\n|---------|-----------|\n| Want to check the 400 scale | `probability-calibration` |\n| Build a model | `walk-forward-validation` |\n"
}

SHA-256 of public snapshot: 3a3f2b17ae79328096a45656552136f817ff024d5e312d7997a094725d225986