Viewing v4.0.0rc6 · release candidate · v3 stable / main · v4 preview / next

OPEN-SOURCE SCORING INFRASTRUCTURE

Make raw data
easier to understand.

Data takes a lot of inference to understand.
We make it easier.

Reusable adapters. Configurable profiles. Explainable results. One scoring engine, wherever you need it.

Read the docs
Open sourcePython 3.10–3.14On PyPI
THE SCORER, AT WORKv4.0.0rc6
Raw data
Adapter
Scorer
↗Result
01 / INPUT
PLAYER"GoatedRahim"PPG31.909APG14.909RPG2.273
eba.players18 required fields · 4 profiles
✓
02 / EXPLAINABLE OUTPUT

GoatedRahim

Houston Hornets

99PRI SCORE
Shooting Efficiency0.565
Scoring Gravity0.596
Helios0.943
Source-verified example · no browser scoring
REAL DATA. REAL WORKFLOWS.

Built from competition. Built to go further.

EBABasketball data & scoring
Elevate302Adapter-backed workflows
Explore the examples

THERE'S MORE THAN ONE WAY IN

One scorer.
Three ways to use it.

Whether you want a tool, a library, or a service, you're working with the same StatLine scoring model.

INFRASTRUCTURE, NOT A CEILING

The scorer is the product.
The rest is up to you.

Turn a scoring model into something people can use. Your interface. Your context. Your next idea.

LESS READING. MORE EXPLORING.

Don't take our word for it.

Inspect engine-verified examples, or connect your key and send a real request to the StatLine API.

StatLine playground ENGINE-VERIFIED EXAMPLE
eba.players

01 / RAW INPUT

SELECTED ROW · ORIGINAL FIELDS
{
  "PLAYER": "GoatedRahim",
  "TEAM": "Houston Hornets",
  "CONFERENCE": "Western",
  "POSITION": "N/A",
  "LEAGUE": "EBA",
  "GP": 11,
  "PPG": 31.909,
  "RPG": 2.273,
  "APG": 14.909,
  "SPG": 3.545,
  "BPG": 0,
  "TPG": 3.273,
  "PA": 0,
  "PF": 1.182,
  "3PMPG": 5.182,
  "3PAPG": 8.727,
  "FGMPG": 13.364,
  "FGAPG": 20.182,
  "WIN": 7,
  "LOSS": 4
}

This record was scored in the full 103-row batch. Switching records inspects saved output; it doesn't recalculate the cohort.

Download the input CSV

02 / SAVED ENGINE OUTPUT

GoatedRahim

Houston Hornets

99PRI

Why 99?

Helped: Helios Score, Vers Score, Scoreless Impact

Limited: Handle Load, Bpg Sig, Net Pos Ppp

Compared with every normalized metric at its midpoint (0.5). These are influences on the raw sum. Affine scaling of the clipped raw aggregate, followed by rounding.

Trace inputs, weights & calculation

Normalization: batch_extrema. Effective weights include the run’s penalties and overrides. Bucket bars are means, not additive score points.

MetricMappedNormalizedWeightContributionRelative influence
Helios Score1.1583660.943240.1181820.1114740.052383
Vers Score0.6147740.9260230.0818180.0757650.034856
Scoreless Impact0.6430790.918470.0545450.0500980.022826
Two Way Score1.03409810.0454550.0454550.022727
Eff Usage1.4504550.7537850.0848480.0639580.021533
Stocks Boost1.1078120.8851440.0454550.0402340.017507
Tov Scaled0.8663790.8663790.0363640.0315050.013323
Scoring Gravity0.830150.5958910.1272730.0758410.012204
Gp Share110.0227270.0227270.011364
Handle Load0.9692370.2326490.0363640.00846-0.009722
Bpg Sig000.0181820-0.009091
Vol Gap010.0151520.0151520.007576
Shot Diet Gap010.0151520.0151520.007576
Spg Sig2.9541670.9089740.0181820.0165270.007436
Net Pos Ppp1.0243230.4151890.0848480.035228-0.007196
Pps Gap0.1155560.8599320.0151520.0130290.005454
Ast To Bonus0.4258580.3784040.0363640.01376-0.004422
Wl Share0.6363640.6363640.0227270.0144630.003099
Pps Fg1.5811120.5270370.0848480.0447180.002294
Ast To Credit4.5551480.5204430.0363640.0189250.000743
Gp111000
Real Gp111000
Real Gp11000-0
No Real0000-0
Rel Gp11000
Ppg31.9090.747861000
Rpg2.2730.21997500-0
Apg14.9090.84389000
Spg3.5450.908974000
Bpg0000-0
Tov3.2730.595091000
Fgm13.3640.742444000
Fga20.1820.738375000
Tpm5.1820.618746000
Tpa8.7270.692619000
Win70.777778000
Loss40.8000
Orpg0.795550.21997500-0
Drpg1.477450.21997500-0
Stat Total103.3640.920157000
Stat Active11000
Scoreable11000
No Score0000-0

Weighted sum 0.71247 → raw aggregate 0.71247 → 99.135007 → 99.

Python round: nearest integer, ties to even. A model-based evaluation under this adapter, weights and cohort.

Raw inputs & adapter transforms
{
  "input": {
    "PLAYER": "GoatedRahim",
    "TEAM": "Houston Hornets",
    "CONFERENCE": "Western",
    "POSITION": "N/A",
    "LEAGUE": "EBA",
    "GP": 11,
    "PPG": 31.909,
    "RPG": 2.273,
    "APG": 14.909,
    "SPG": 3.545,
    "BPG": 0,
    "TPG": 3.273,
    "PA": 0,
    "PF": 1.182,
    "3PMPG": 5.182,
    "3PAPG": 8.727,
    "FGMPG": 13.364,
    "FGAPG": 20.182,
    "WIN": 7,
    "LOSS": 4
  },
  "metrics": {
    "gp": {
      "key": "gp",
      "source": {
        "kind": "field",
        "field": "GP",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        16
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Gp",
      "bucket_label": "Telemetry"
    },
    "real_gp": {
      "key": "real_gp",
      "source": {
        "kind": "expr",
        "field": null,
        "expr": "gp",
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        16
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Real Gp",
      "bucket_label": "Telemetry"
    },
    "real_gp1": {
      "key": "real_gp1",
      "source": {
        "kind": "expr",
        "field": null,
        "expr": "min(1.0, real_gp)",
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        1
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Real Gp1",
      "bucket_label": "Telemetry"
    },
    "no_real": {
      "key": "no_real",
      "source": {
        "kind": "expr",
        "field": null,
        "expr": "1.0 - real_gp1",
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        1
      ],
      "bucket": "telem",
      "invert": false,
      "label": "No Real",
      "bucket_label": "Telemetry"
    },
    "rel_gp": {
      "key": "rel_gp",
      "source": {
        "kind": "expr",
        "field": null,
        "expr": "min(1.0, real_gp / max(1.0, dataset_max(\"GP\") * 0.65))",
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        1
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Rel Gp",
      "bucket_label": "Telemetry"
    },
    "ppg": {
      "key": "ppg",
      "source": {
        "kind": "field",
        "field": "PPG",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        32
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Ppg",
      "bucket_label": "Telemetry"
    },
    "rpg": {
      "key": "rpg",
      "source": {
        "kind": "field",
        "field": "RPG",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        14
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Rpg",
      "bucket_label": "Telemetry"
    },
    "apg": {
      "key": "apg",
      "source": {
        "kind": "field",
        "field": "APG",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        9
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Apg",
      "bucket_label": "Telemetry"
    },
    "spg": {
      "key": "spg",
      "source": {
        "kind": "field",
        "field": "SPG",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        2.2
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Spg",
      "bucket_label": "Telemetry"
    },
    "bpg": {
      "key": "bpg",
      "source": {
        "kind": "field",
        "field": "BPG",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        3
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Bpg",
      "bucket_label": "Telemetry"
    },
    "tov": {
      "key": "tov",
      "source": {
        "kind": "field",
        "field": "TPG",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        3.5
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Tov",
      "bucket_label": "Telemetry"
    },
    "fgm": {
      "key": "fgm",
      "source": {
        "kind": "field",
        "field": "FGMPG",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        15
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Fgm",
      "bucket_label": "Telemetry"
    },
    "fga": {
      "key": "fga",
      "source": {
        "kind": "field",
        "field": "FGAPG",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        25
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Fga",
      "bucket_label": "Telemetry"
    },
    "tpm": {
      "key": "tpm",
      "source": {
        "kind": "field",
        "field": "3PMPG",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        8
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Tpm",
      "bucket_label": "Telemetry"
    },
    "tpa": {
      "key": "tpa",
      "source": {
        "kind": "field",
        "field": "3PAPG",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        14
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Tpa",
      "bucket_label": "Telemetry"
    },
    "win": {
      "key": "win",
      "source": {
        "kind": "field",
        "field": "WIN",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        16
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Win",
      "bucket_label": "Telemetry"
    },
    "loss": {
      "key": "loss",
      "source": {
        "kind": "field",
        "field": "LOSS",
        "expr": null,
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        16
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Loss",
      "bucket_label": "Telemetry"
    },
    "orpg": {
      "key": "orpg",
      "source": {
        "kind": "expr",
        "field": null,
        "expr": "0.35 * rpg",
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        5
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Orpg",
      "bucket_label": "Telemetry"
    },
    "drpg": {
      "key": "drpg",
      "source": {
        "kind": "expr",
        "field": null,
        "expr": "0.65 * rpg",
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        10
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Drpg",
      "bucket_label": "Telemetry"
    },
    "stat_total": {
      "key": "stat_total",
      "source": {
        "kind": "expr",
        "field": null,
        "expr": "ppg + rpg + apg + spg + bpg + tov + fgm + fga + tpm + tpa",
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        999
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Stat Total",
      "bucket_label": "Telemetry"
    },
    "stat_active": {
      "key": "stat_active",
      "source": {
        "kind": "expr",
        "field": null,
        "expr": "min(1.0, stat_total)",
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        1
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Stat Active",
      "bucket_label": "Telemetry"
    },
    "scoreable": {
      "key": "scoreable",
      "source": {
        "kind": "expr",
        "field": null,
        "expr": "min(real_gp1, stat_active)",
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        1
      ],
      "bucket": "telem",
      "invert": false,
      "label": "Scoreable",
      "bucket_label": "Telemetry"
    },
    "no_score": {
      "key": "no_score",
      "source": {
        "kind": "expr",
        "field": null,
        "expr": "1.0 - scoreable",
        "const": null
      },
      "transform": null,
      "clamp": [
        0,
        1
      ],
      "bucket": "telem",
      "invert": false,
      "label": "No Score",
      "bucket_label": "Telemetry"
    },
    "gp_share": {
      "key": "gp_share",
      "make": "scoreable * rel_gp",
      "attempt": "1",
      "bucket": "gp",
      "min_den": 1,
      "clamp": [
        0,
        1
      ],
      "invert": false,
      "transform": null,
      "label": "Gp Share",
      "bucket_label": "Games Played"
    },
    "pps_fg": {
      "key": "pps_fg",
      "make": "scoreable * (2.0 * (fgm + 0.5*tpm))",
      "attempt": "max(1.0, fga)",
      "bucket": "aefg",
      "min_den": 1,
      "clamp": [
        0,
        1.45
      ],
      "invert": false,
      "transform": null,
      "label": "Pps Fg",
      "bucket_label": "Shooting Efficiency"
    },
    "scoring_gravity": {
      "key": "scoring_gravity",
      "make": "scoreable * min(1.20, ppg / 36.0) * min(1.15, pps_fg / 1.35) * min(1.10, fga / 22.0) * (1 - 0.12 * min(1, tov / 3.5))",
      "attempt": "1",
      "bucket": "scoring_gravity",
      "min_den": 1,
      "clamp": [
        0,
        1.25
      ],
      "invert": false,
      "transform": null,
      "label": "Scoring Gravity",
      "bucket_label": "Scoring Gravity"
    },
    "spg_sig": {
      "key": "spg_sig",
      "make": "scoreable * spg",
      "attempt": "1.2",
      "bucket": "spg_sig",
      "min_den": 1,
      "clamp": [
        0,
        1.8
      ],
      "invert": false,
      "transform": null,
      "label": "Spg Sig",
      "bucket_label": "Steal Signature"
    },
    "bpg_sig": {
      "key": "bpg_sig",
      "make": "scoreable * ((min(bpg, 2.0) + 0.25*max(0, bpg-2.0)) / max(0.85, 1.0 + 0.06*drpg))",
      "attempt": "2.2",
      "bucket": "bpg_sig",
      "min_den": 1,
      "clamp": [
        0,
        1.1
      ],
      "invert": false,
      "transform": null,
      "label": "Bpg Sig",
      "bucket_label": "Block Signature"
    },
    "eff_usage": {
      "key": "eff_usage",
      "make": "scoreable * pps_fg * fga",
      "attempt": "22",
      "bucket": "aefg",
      "min_den": 1,
      "clamp": [
        0,
        1.55
      ],
      "invert": false,
      "transform": null,
      "label": "Eff Usage",
      "bucket_label": "Shooting Efficiency"
    },
    "net_pos_ppp": {
      "key": "net_pos_ppp",
      "make": "scoreable * (ppg - 1.1*tov)",
      "attempt": "max(1.0, fga + 0.5*apg)",
      "bucket": "aefg",
      "min_den": 1,
      "clamp": [
        0,
        1.25
      ],
      "invert": false,
      "transform": null,
      "label": "Net Pos Ppp",
      "bucket_label": "Shooting Efficiency"
    },
    "pps_gap": {
      "key": "pps_gap",
      "make": "no_score * 0.60 + scoreable * (\n  max(0, 1.08 - pps_fg)\n  + 0.50*max(0, pps_fg - 1.35)\n)",
      "attempt": "1",
      "bucket": "effloor",
      "min_den": 1,
      "clamp": [
        0,
        0.6
      ],
      "invert": true,
      "transform": null,
      "label": "Pps Gap",
      "bucket_label": "Efficiency Floor"
    },
    "vol_gap": {
      "key": "vol_gap",
      "make": "no_score * 2.0 + scoreable * max(0, 14 - ppg)",
      "attempt": "1",
      "bucket": "effloor",
      "min_den": 1,
      "clamp": [
        0,
        2
      ],
      "invert": true,
      "transform": null,
      "label": "Vol Gap",
      "bucket_label": "Efficiency Floor"
    },
    "shot_diet_gap": {
      "key": "shot_diet_gap",
      "make": "no_score * 0.60 + scoreable * max(0, (tpa/max(1e-6,fga)) - 0.70) * max(0, 1.28 - ((fga - tpa))) / 1.28 * max(0, pps_fg - 1.22) * min(1, 10/max(1e-6,fga))",
      "attempt": "1",
      "bucket": "effloor",
      "min_den": 1,
      "clamp": [
        0,
        0.6
      ],
      "invert": true,
      "transform": null,
      "label": "Shot Diet Gap",
      "bucket_label": "Efficiency Floor"
    },
    "stocks_boost": {
      "key": "stocks_boost",
      "make": "scoreable * (spg + 1.05*min(bpg, 2.0) + 0.35*max(0, bpg - 2.0))",
      "attempt": "3.2",
      "bucket": "stocks",
      "min_den": 1,
      "clamp": [
        0,
        1.5
      ],
      "invert": false,
      "transform": null,
      "label": "Stocks Boost",
      "bucket_label": "Stocks"
    },
    "scoreless_impact": {
      "key": "scoreless_impact",
      "make": "scoreable * (0.55*min(1, apg/10) + 0.45*min(1, (1.3*orpg+0.7*drpg)/10))",
      "attempt": "1.0",
      "bucket": "offball",
      "min_den": 1,
      "clamp": [
        0,
        1
      ],
      "invert": false,
      "transform": null,
      "label": "Scoreless Impact",
      "bucket_label": "Off-Ball Impact"
    },
    "vers_score": {
      "key": "vers_score",
      "make": "scoreable * ((0.65*((min(1, ppg/24) + min(1, (1.6*orpg+drpg)/10) + min(1, apg/10))/3)) + (0.45*((min(1, ppg/24)*min(1, (1.6*orpg+drpg)/10) + min(1, ppg/24)*min(1, apg/10) + min(1, (1.6*orpg+drpg)/10)*min(1, apg/10))/3)))",
      "attempt": "1.18",
      "bucket": "vers",
      "min_den": 1,
      "clamp": [
        0,
        1
      ],
      "invert": false,
      "transform": null,
      "label": "Vers Score",
      "bucket_label": "Versatility"
    },
    "handle_load": {
      "key": "handle_load",
      "make": "scoreable * (apg / max(1.0, 0.6*fga + tov))",
      "attempt": "1",
      "bucket": "handle",
      "min_den": 1,
      "clamp": [
        0,
        1.1
      ],
      "invert": false,
      "transform": null,
      "label": "Handle Load",
      "bucket_label": "Handle"
    },
    "helios_score": {
      "key": "helios_score",
      "make": "scoreable * (ppg + 0.9*apg - 0.4*tov)",
      "attempt": "38",
      "bucket": "helios",
      "min_den": 1,
      "clamp": [
        0,
        0.9
      ],
      "invert": false,
      "transform": null,
      "label": "Helios Score",
      "bucket_label": "Helios"
    },
    "tov_scaled": {
      "key": "tov_scaled",
      "make": "scoreable * (1 - (tov / max(3, 0.80*(fga + 0.7*apg))))",
      "attempt": "1",
      "bucket": "tov_eff",
      "min_den": 1,
      "clamp": [
        0,
        0.95
      ],
      "invert": false,
      "transform": null,
      "label": "Tov Scaled",
      "bucket_label": "Turnovers"
    },
    "ast_to_credit": {
      "key": "ast_to_credit",
      "make": "scoreable * apg",
      "attempt": "max(1.0, tov)",
      "bucket": "tov_eff",
      "min_den": 1,
      "clamp": [
        0,
        2.5
      ],
      "invert": false,
      "transform": null,
      "label": "Ast To Credit",
      "bucket_label": "Turnovers"
    },
    "ast_to_bonus": {
      "key": "ast_to_bonus",
      "make": "scoreable * max(0, (apg / max(1.0, tov)) - 2.0)",
      "attempt": "6.0",
      "bucket": "tov_eff",
      "min_den": 1,
      "clamp": [
        0,
        0.08
      ],
      "invert": false,
      "transform": null,
      "label": "Ast To Bonus",
      "bucket_label": "Turnovers"
    },
    "two_way_score": {
      "key": "two_way_score",
      "make": "scoreable * min(2, (2 * ((ppg+0.9*apg)/42) * ((0.7*spg+0.4*bpg)/2.5)) / max(0.0001, ((ppg+0.9*apg)/42) + ((0.7*spg+0.4*bpg)/2.5)))",
      "attempt": "1",
      "bucket": "two_way",
      "min_den": 1,
      "clamp": [
        0,
        0.8
      ],
      "invert": false,
      "transform": null,
      "label": "Two Way Score",
      "bucket_label": "Two-Way"
    },
    "wl_share": {
      "key": "wl_share",
      "make": "scoreable * win",
      "attempt": "max(1.0, win + loss)",
      "bucket": "wl",
      "min_den": 0.5,
      "clamp": [
        0,
        1
      ],
      "invert": false,
      "transform": null,
      "label": "Wl Share",
      "bucket_label": "Win-Loss"
    }
  },
  "normalization": {
    "gp": {
      "leader": 11,
      "floor": 3
    },
    "real_gp": {
      "leader": 11,
      "floor": 3
    },
    "real_gp1": {
      "leader": 1,
      "floor": 1
    },
    "no_real": {
      "leader": 0,
      "floor": 0
    },
    "rel_gp": {
      "leader": 1,
      "floor": 0.4195804195804196
    },
    "ppg": {
      "leader": 42.667,
      "floor": 0
    },
    "rpg": {
      "leader": 10.333,
      "floor": 0
    },
    "apg": {
      "leader": 17.667,
      "floor": 0
    },
    "spg": {
      "leader": 3.9,
      "floor": 0
    },
    "bpg": {
      "leader": 4.5,
      "floor": 0
    },
    "tov": {
      "leader": 5.5,
      "floor": 0
    },
    "fgm": {
      "leader": 18,
      "floor": 0
    },
    "fga": {
      "leader": 27.333,
      "floor": 0
    },
    "tpm": {
      "leader": 8.375,
      "floor": 0
    },
    "tpa": {
      "leader": 12.6,
      "floor": 0
    },
    "win": {
      "leader": 9,
      "floor": 0
    },
    "loss": {
      "leader": 5,
      "floor": 0
    },
    "orpg": {
      "leader": 3.6165499999999997,
      "floor": 0
    },
    "drpg": {
      "leader": 6.71645,
      "floor": 0
    },
    "stat_total": {
      "leader": 112.333,
      "floor": 0
    },
    "stat_active": {
      "leader": 1,
      "floor": 0
    },
    "scoreable": {
      "leader": 1,
      "floor": 0
    },
    "no_score": {
      "leader": 1,
      "floor": 0
    },
    "gp_share": {
      "leader": 1,
      "floor": 0
    },
    "pps_fg": {
      "leader": 3,
      "floor": 0
    },
    "scoring_gravity": {
      "leader": 1.3931241622975015,
      "floor": 0
    },
    "spg_sig": {
      "leader": 3.25,
      "floor": 0
    },
    "bpg_sig": {
      "leader": 1.015041955067476,
      "floor": 0
    },
    "eff_usage": {
      "leader": 1.9242272727272727,
      "floor": 0
    },
    "net_pos_ppp": {
      "leader": 2.4671238748392623,
      "floor": 0
    },
    "pps_gap": {
      "leader": 0,
      "floor": 0.825
    },
    "vol_gap": {
      "leader": 0,
      "floor": 12.667
    },
    "shot_diet_gap": {
      "leader": 0,
      "floor": 0.6
    },
    "stocks_boost": {
      "leader": 1.2515625,
      "floor": 0
    },
    "scoreless_impact": {
      "leader": 0.70016365,
      "floor": 0
    },
    "vers_score": {
      "leader": 0.6638870056497176,
      "floor": 0
    },
    "handle_load": {
      "leader": 4.166083391660834,
      "floor": 0
    },
    "helios_score": {
      "leader": 1.228071052631579,
      "floor": 0
    },
    "tov_scaled": {
      "leader": 1,
      "floor": 0
    },
    "ast_to_credit": {
      "leader": 8.752438109527382,
      "floor": 0
    },
    "ast_to_bonus": {
      "leader": 1.1254063515878971,
      "floor": 0
    },
    "two_way_score": {
      "leader": 1.034097737090637,
      "floor": 0
    },
    "wl_share": {
      "leader": 1,
      "floor": 0
    }
  },
  "profile": {
    "kind": "affine",
    "weights_profile": "pri",
    "model": null,
    "value": null,
    "lo": 40,
    "hi": 123,
    "out_lo": null,
    "out_hi": null,
    "pct_lo": null,
    "pct_hi": null
  },
  "baseline": {
    "kind": "normalized_midpoint",
    "normalized_value": 0.5,
    "description": "Each normalized metric at 0.5; a reference, not the cohort average."
  }
}
PRI99
PRI-ALT98
PRI-W99
PRI-W-ALT99
Games Played1.0000
Scoring Gravity0.5959
Shooting Efficiency0.5653
Efficiency Floor0.9533

4 profiles · 18 required input fields · v4.0.0rc6

Saved source v4.0.0rc6. Verified against Python, Gateway, and StatPack output. No request is sent when you explore these results.
Open the full playground

ADAPTERS

Your data doesn't
have to look like ours.

Different names. Different exports. Different definitions of a good result. Adapters describe how your data becomes something the scorer understands.

Make your schema understood
PPG · APG · RPGgoals · assists · savesyour_schema
Your adapterMap · transform · configure
A canonical scoring model
your-model.statpackPORTABLE
01metadata.yaml
02schema / sections
03dataset / your-data.csv
04runner.py
Package once. Reproduce the workflow.

STATPACKS

Take the rules
with you.

A scoring configuration should travel as easily as the data. StatPacks bundle metadata, adapter sections, datasets, and a runner into a package you can inspect and share.

Unpack StatPacks

YOU'RE INCLUDED, TOO

Don't write Python?
That's fine.

StatLine is built for developers, but the outcome isn't. If your organization has data and a scoring problem, let's figure out where it fits.

Let's get your organization set up
Start with the problem you want to solve.Bring the data you're already working with.Choose the workflow that fits your team.

BUILT IN PUBLIC

Inspect it yourself.

The source, the package, and the contract are all there. Start small. Understand what you're running.

INSTALL THIS V4 PREVIEW
python -m pip install "statline==4.0.0rc6"
THE PUBLIC PYTHON SDK
from statline import load_dataset, score

rows = load_dataset('EBA_Elevate302/eba_players_gp3_plus.csv')
results = score('eba.players', rows, mode='batch', weights='pri')

SCORING YOU CAN INSPECT, REPRODUCE, AND TEST

Typed public SDKGenerated OpenAPIAdapter validationPortable StatPacksPython ↔ Gateway ↔ StatPack verification
How it fits together

HOSTED STATLINE API

Run the Gateway yourself.
Or let us handle it.

Hosted access is invite-only while we work with early organizations on capacity and pricing. Self-hosting is available today.

Talk about API access