DEVELOPMENT JOURNAL · #001
Development Journal #001/ 281 kinds.
The day the plan was to ship an API integration, we stopped.
The fields we needed reached 281. If the model is serious, the data at the entrance cannot be a shortcut.

Today was supposed to be an API implementation day. We had contracted SportsGameOdds and planned to move straight into the build.
Along the way, I decided to look carefully at Sportmonks — a service I had been curious about for a long time.
In football APIs, almost everyone knows the name. It is one of the strongest options available to individual developers. Many companies and builders use it.
I had been interested for a long time as well.
So today I went into the dashboard and checked, one by one, the available data, the API responses, and the selectable options.
My first reaction was simple.
This is impressive.
Most developers would probably adopt it immediately. Implementation is fast. Operations look clean. The data is solid.
As a service, the quality is genuinely high.
But something felt off.
The longer I looked at the screens and responses, the stronger one feeling became.
Something is different.
Not because the data is poor. The opposite.
It was simply not quite the data EV Bet Engine actually needs. In that moment I asked myself:
Then what do I actually want?
I stopped the API implementation.
I opened a blank Notion page and started listing every field I believed EV Bet Engine needed.
I expected maybe a hundred items. Once I started writing, I could not stop.
For example:
touches_in_opposition_box
big_chances
big_chances_missed
shots_inside_box
shots_outside_box
hit_woodwork
accurate_passes
pass_accuracy_pct
accurate_long_balls
long_ball_accuracy_pct
accurate_crosses
cross_accuracy_pct
ground_duels_won
ground_duels_won_pct
aerial_duels_won
keeper_saves
...And also:
last10_xg_avg
last10_xga_avg
last10_corners_avg
last10_cards_avg
home_last5_xg_avg
home_last5_xga_avg
home_last5_corners_avg
away_last5_xg_avg
away_last5_xga_avg
away_last5_corners_avg
h2h_btts_rate
league_average_goals
market_odds_movement
exchange_volume
closing_line_value
...That is only a fragment of the 281 fields. As I reviewed each one:
- We need this.
- We should validate this.
- This can feed the model.
The list kept growing. When I finally counted:
281 kinds.
I was surprised.
What surprised me more was that every one of those 281 fields had a reason.
Not “more is better.”
Only fields I wanted to test inside the model.
Decide the data before the model
EV Bet Engine will not stop at Poisson. We will combine many features to estimate expected value.
- Home and away
- Recent form
- H2H
- Market odds
- Exchange
- Team style
- League characteristics
- Line-ups
- Absences
All of that enters the model.
So taking modelling seriously while compromising on data collection was never an option. AI is not magic.
Even the best model cannot answer beyond the data it receives. That is why I decided to settle:
What data should we collect?
before:
Which model should we use?
Today’s conclusion
One conclusion: we will not adopt Sportmonks.
That is not a criticism of Sportmonks. It is an excellent service.
It simply does not fully match the world EV Bet Engine is trying to build.
So we will combine the strengths of:
- FootyStats
- Soccerway
- FotMob
- SportsGameOdds
- Betfair Exchange
We will collect what we need ourselves, normalise it ourselves, and manage it ourselves.
That is why we decided to build the scraping infrastructure from the ground up.
It is the long way around. The engineering cost multiplies.
But if we are serious about the model, we cannot compromise the input layer only because the shortcut looks easy.
I wrote almost no code today. Still, EV Bet Engine moved forward.
The number 281 is not just a field count.
It is a measure of how deeply EV Bet Engine intends to understand football.
It is a count of commitment.
DATA DRIVEN. BET SMARTER.
Pray for Kumamoto.
The original Japanese article is also published on note.
Read on note