API

The same numbers, inside your own tools

Every call takes a key. The first one is free.

Pricing

What a key buys

Call volume, not reserved data. Cancel in one click.

Before you pay

What you are committing to

Stop whenever you like
One click in your billing page, no mail to write and no notice to give. You keep the allowance until the end of the period you have already paid for.
Stopping breaks nothing
Your key is never revoked and never suspended. It goes back to the free plan and keeps answering the same routes, with nothing to change in your code.
We never see your card
Payment happens on Stripe's own page. No number, no token and no last four digits ever reach this product.
A failed card is not a cut-off
An expired card is retried for two weeks and we write to you. Your full allowance runs throughout, and you are never charged twice.

Manage your subscription

How it works

One key. Your own allowance

When the free key runs short, you buy a larger one: the data is the same at every price.

Every answer carries your allowance and your usage for the month.

What is served

The routes, and where to start

The same data the site's pages show, at the same addresses.

The catalogue, to start with
Every published discipline with its slug, its bases and its views. Every other call starts here.
/catalog
Ratings and rankings
Every published ranking, per discipline, with the rules it was settled under.
/rankings
The ledger behind a rating
Each change with its cause and its before-and-after values, the same rows the site shows.
/competitors/{id}/rating-changes
Matches as read
The results the engine ingested, with their source and the date precision it was given.
/competitors/{id}/matches

Every route, with its parameters and the values it takes: API docs

What it looks like

One request, and what comes back

JSON over HTTP. Nothing to install, nothing to generate.

Request

# what is published, and under which slugs:
curl -H "Authorization: Bearer arpelo_7f3a91c2.<secret>" \
  "http://api:8000/catalog"

# one of them, ranked:
curl -H "Authorization: Bearer arpelo_7f3a91c2.<secret>" \
  "http://api:8000/rankings?sport=darts&view=current&per_page=2"

Response, trimmed to one entry

{
  "sport": "darts-pdc-singles",
  "view": "current",
  "model_version": "elo@1",
  "cutoff_at": "2026-09-07T00:00:00Z",
  "published_at": "2026-09-08T04:12:31Z",
  "rules": {
    "minimum_matches": 20,
    "include_provisional": false,
    "include_inactive": false,
    "activity_window_days": 730
  },
  "total": 412,
  "page": 1,
  "per_page": 2,
  "entries": [
    {
      "rank": 1,
      "competitor": "c-4d21f8",
      "name": "...",
      "rating": 2118.4,
      "matches_played": 183,
      "status": "active",
      "last_match": "2026-09-06T00:00:00Z",
      "previous_rank": 2
    }
  ]
}

Every ranking comes with the rule it was settled under (match threshold, activity window) and its three dates: source checked, latest data, published.

Tell us what you are building.

What you need, at what rate, and for which disciplines.