DEV Community

Cover image for Building a Wrestling Title History API with Laravel
Ish D
Ish D

Posted on

Building a Wrestling Title History API with Laravel

I recently launched PopDropkick.dev, a REST API for professional wrestling data — specifically focused on tracking wrestlers, promotions, championships, and detailed title reigns.

It started as a fun Laravel side project to explore API design and relationship modeling, but it’s grown into something more structured and (hopefully) useful to others.

The API handles:

  • Wrestler profiles (with slugs, aliases, and debut dates)
  • Promotions and cross-promotion affiliations
  • Championship title reigns — including vacated titles and multi-reign tracking

I’ve populated it with a full history of the NXT Championship for now, and it’s ready for expansion into more titles and promotions (AEW, WWE, NJPW, etc.).

🔗 Links

Live API

GitHub Repo

Why I Built This

We consume and test with a lot of APIs at place my work but that data is never fun. Most wrestling stat sources are either static HTML, heavily scraped, or organized in a way that isn't developer-friendly. I wanted something:

  • JSON-first
  • RESTful and linkable
  • Easy to query for reign history, current champions and something highly flexible

Each Title Reign ties to a Wrestler and a Championship, and includes:

won_on, lost_on

won_at, lost_at (events or shows)

reign_number

vacated logic

Human-readable reign length (like 6mos and 3w) is generated automatically based on date intervals.

Example: Tommaso Ciampa

Calling this endpoint:

GET /api/wrestlers/tommaso-ciampa

Returns:

{
  "data": {
    "id": "f05533f7-0ef1-4b65-b130-b12504f08852",
    "slug": "tommaso-ciampa",
    "ring_name": "Tommaso Ciampa",
    "real_name": "Tommaso Whitney",
    "also_known_as": [],
    "active_title_reigns": [],
    "promotions": [
      {
        "id": "5095d51e-adee-4173-824f-ecdad2b755ee",
        "name": "NXT",
        "slug": "nxt",
        "detail_url": "https://popdropkick.dev/api/promotions/nxt",
        "abbreviation": "NXT"
      }
    ],
    "active_promotions": [
      {
        "id": "5095d51e-adee-4173-824f-ecdad2b755ee",
        "name": "NXT",
        "slug": "nxt",
        "detail_url": "https://popdropkick.dev/api/promotions/nxt",
        "abbreviation": "NXT"
      }
    ],
    "debut_date": "2005-01-01",
    "title_reigns": [
      {
        "championship_id": "395280ec-7cf0-42c7-ad50-b8da0c3ba6ba",
        "championship_name": "NXT Championship",
        "won_on": "2021-09-14",
        "won_at": "NXT 2.0 (premiere)",
        "lost_on": "2022-01-04",
        "lost_at": "NXT New Year's Evil 2022",
        "reign_number": 1,
        "win_type": null,
        "reign_length": 112,
        "reign_length_human": "3mos and 3w"
      },
      {
        "championship_id": "395280ec-7cf0-42c7-ad50-b8da0c3ba6ba",
        "championship_name": "NXT Championship",
        "won_on": "2018-07-25",
        "won_at": "NXT (TV)",
        "lost_on": "2019-02-20",
        "lost_at": "vacated",
        "reign_number": 1,
        "win_type": null,
        "reign_length": 210,
        "reign_length_human": "6mos and 3w"
      }
    ],
    "created_at": "2025-07-10T14:59:36+00:00",
    "updated_at": "2025-07-10T14:59:36+00:00"
  },
  "meta": {
    "status": 200,
    "counts": {
      "title_reigns": 2,
      "active_title_reigns": 0,
      "promotions": 1,
      "active_promotions": 1
    },
    "timestamps": {
      "timestamp": "2025-07-10T16:01:03+00:00",
      "response_time_ms": 61.45
    }
  },
  "message": null
}        

Enter fullscreen mode Exit fullscreen mode

What's Next

  • Add more championships and wrestlers (want to help?)
  • Handle tag team title reigns (with multiple wrestlers per reign)
  • Add pagination and filtering for title reigns
  • More metadata: Longest/Shortest reign, Most reigns, Total Championships Held, Days as Champion <-- done
  • Open up POST/PATCH endpoints for contributors

Want to Try It?

You can hit the live API at https://popdropkick.dev, or check out the source code on GitHub:

https://github.com/outofjam/popdropkickv1

The auto generated docs are at https://popdropkick.dev/docs/api

If you want to mess with protected routes (POST, PATCH), ping me and I’ll send over an API token.

Thanks for reading! Feedback is more than welcome.

Top comments (0)