- What is ball possession in football and how is it counted in statistics
- Why a high percentage of ball possession does not guarantee a team’s victory
- What statistical indicators more accurately reflect a team’s strength than ball possession
- What data on ball possession and shots can be obtained through the sports statistics API
- How to use the football match API for tactical and analytical game analysis
- Integration of sports event APIs into websites, applications, and analytics dashboards
What is ball possession in football and how is it counted in statistics
Ball possession in football is the share of playing time during which a team controls the ball compared to the opponent. On the scoreboard, we see the familiar 60% against 40%, but behind these numbers lies a rather complex counting methodology. Professional data providers use either a model based on the number and quality of passes or tracking data: they record which team has possession of the ball at each moment in time and then aggregate the result by halves and the entire match.
It is important to understand that ball possession is a contextual indicator. It does not directly indicate the strength of a team, but only shows who more often gets the ball in the phase of positional play. For example, during long clearances, throw-ins, set pieces, and contested duels, possession can quickly switch from one team to another, and over short periods of time, the statistics can be quite «noisy.» Therefore, analysts always consider this parameter together with shots, dangerous moments, entries into the final third, and other metrics.
Through the sports events API api-sport.ru the possession indicator is available in the structure estadísticasDelPartido. For each football match, you can obtain aggregated possession for the entire match and by periods (1st and 2nd half), which is convenient for advanced dashboards and custom models. Below is an example of a simple request that retrieves match statistics for football and extracts possession for both teams:
const MATCH_ID = 14570728;
fetch(`https://api.api-sport.ru/v2/football/matches/${MATCH_ID}`, {
headers: {
Authorization: 'YOUR_API_KEY'
}
})
.then(res => res.json())
.then(data => {
const match = data.match || data;
const statsAll = match.matchStatistics
.find(period => period.period === 'ALL');
const possessionItem = statsAll.groups
.find(group => group.groupName === 'Match overview')
.statisticsItems
.find(item => item.key === 'ballPossession');
console.log('Владение, хозяева:', possessionItem.home);
console.log('Владение, гости:', possessionItem.away);
});
This approach allows you to go beyond a table on the broadcast website and directly work with «raw» statistical data: build your own visualizations, compare possession from matches of different tournaments and seasons, as well as link it to bookmaker market odds and other metrics within your analytical system.
Why a high percentage of ball possession does not guarantee a team’s victory
High possession is traditionally associated with dominance; however, in reality, this is not always the case. A team may have long possessions in safe areas, passing the ball between defenders and holding midfielders, but create almost no goal-scoring opportunities. On the other hand, an opponent playing on quick transitions and counterattacks may take fewer shots but from more advantageous positions. Statistics from professional leagues show many matches where a team with 35–40% possession won comfortably due to the quality, not quantity, of attacks.
The tactical context also greatly influences possession. A team that is leading often consciously gives the ball to the opponent, shifting the game into a lower block and betting on counterattacks. In such situations, possession increases for the losing side, but this is not a sign of its superiority — it is a consequence of the match scenario. Even at the top league level, analysts have long abandoned assessing a team’s strength solely by possession: much more important are the indicators for shots, «big chances,» entries into the penalty area, and the effectiveness of converting opportunities.
Using data from the sports events API, you can clearly show why possession is just part of the picture. Through /v2/fútbol/partidos on the side api-sport.ru you receive not only ballPossession, but also detailed groups of statistics on shots, attacks, passes, and duels. Below is an example of code that selects matches where the team had more possession but lost on the score — such cases are excellent for demonstrating illusory dominance:
async function findMisleadingPossession(date) {
const res = await fetch(`https://api.api-sport.ru/v2/football/matches?date=${date}`, {
headers: { Authorization: 'YOUR_API_KEY' }
});
const json = await res.json();
const examples = json.matches.filter(match => {
const statsAll = match.matchStatistics
.find(p => p.period === 'ALL');
if (!statsAll) return false;
const possessionItem = statsAll.groups
.find(g => g.groupName === 'Match overview')
.statisticsItems
.find(i => i.key === 'ballPossession');
const homePossession = possessionItem.homeValue;
const awayPossession = possessionItem.awayValue;
const homeScore = match.homeScore.current;
const awayScore = match.awayScore.current;
return (homePossession > awayPossession && homeScore < awayScore) ||
(awayPossession > homePossession && awayScore < homeScore);
});
console.log('Матчи, где высокое владение не помогло выиграть:', examples.length);
}
findMisleadingPossession('2025-09-03');
Such analytics allows you to visually prove to users of your websites, applications, or betting services that ball possession is not a self-sufficient indicator of strength. And by linking this data with bookmaker odds, you can find situations where the market overestimates teams with «beautiful» possession numbers but weak real threats to the opponent’s goal.
What statistical indicators more accurately reflect a team’s strength than ball possession
To adequately assess a team’s strength, analysts rely on a set of metrics rather than possession in isolation from context. First and foremost, indicators directly related to creating and preventing goal-scoring opportunities are considered. These include total shots, shots on target, «big chances,» touches in the penalty area, entries into the final third, passing accuracy in the final third, as well as defensive metrics: interceptions, tackles, won duels, and goalkeeper saves. Together, this data much better describes true on-field superiority.
Advanced composite indices are also increasingly used, which can be calculated independently based on the raw statistics. For example, a simple «dominance index» can take into account the weight of shots (shots from the penalty area and on goal), the number of «big chances,» and the share of won duels. Unlike possession, such indices are tied to real actions that directly lead to goals. That is why professional scouts, coaching staffs, and betting analysts always analyze several groups of indicators simultaneously, building a holistic picture of the game.
API of sports events from the service api-sport.ru (personal account) provides detailed data on most key metrics: from groups Disparos и Ataque to Defending и Duels. Below is an example of a function that, based on estadísticasDelPartido calculates a simple user rating of a team’s strength in a specific match. This rating can be used for internal scouting, filtering matches, or as a feature in prediction models:
function buildTeamStrengthIndex(match) {
const statsAll = match.matchStatistics.find(p => p.period === 'ALL');
if (!statsAll) return null;
const byGroup = name => statsAll.groups.find(g => g.groupName === name);
const shotsGroup = byGroup('Shots');
const attackGroup = byGroup('Attack');
const duelsGroup = byGroup('Duels');
const getItem = (group, key) => group.statisticsItems.find(i => i.key === key);
const totalShots = getItem(shotsGroup, 'totalShotsOnGoal');
const shotsOnTarget = getItem(shotsGroup, 'shotsOnGoal');
const bigChances = getItem(attackGroup, 'bigChanceCreated');
const duelsWon = getItem(duelsGroup, 'duelWonPercent');
const homeIndex = (
totalShots.homeValue * 0.3 +
shotsOnTarget.homeValue * 0.4 +
bigChances.homeValue * 0.2 +
duelsWon.homeValue * 0.1
);
const awayIndex = (
totalShots.awayValue * 0.3 +
shotsOnTarget.awayValue * 0.4 +
bigChances.awayValue * 0.2 +
duelsWon.awayValue * 0.1
);
return { homeIndex, awayIndex };
}
Such user indices do not replace the score on the scoreboard, but allow for a sober assessment of how confidently the team acted during the match. Unlike simple ball possession percentage, they take into account both attacking power and defensive quality, providing a more objective and practical assessment of the team’s strength in a specific game or over the course of a tournament.
What data on ball possession and shots can be obtained through the sports statistics API
The modern sports API should provide not only the score and authors of goals but also detailed statistics on possession and shots. In the endpoints /v2/{sportSlug}/partidos и /v2/{sportSlug}/matches/{matchId} on the platform side api-sport.ru for football, you receive an array estadísticasDelPartido. Inside it, the data is grouped by periods (ALL, 1ST, 2ND) and by thematic groups: Resumen del partido, Disparos, Ataque, Passes etc. This is where the metrics for ball possession (ballPossession), total and accurate passes, as well as a complete set of metrics for shots are located.
In the group Disparos such parameters as total number of shots (totalDisparosALaPortería), shots on target (disparosALaPortería), shots off target, blocked shots, shots from inside the penalty area and from outside it are available. In the group Ataque — «big chances,» realized and missed goal moments, the number of touches in the penalty area, and offsides. This allows you to see not only how many times the team shot on goal but also how dangerous their attacks were. Combined with ball possession, you can accurately assess the style and effectiveness of the game: whether the team takes many shots from advantageous positions or limits itself to long-range shots with high possession.
Below is an example of a query that retrieves all completed football matches for a specific date and extracts key possession and shot metrics from them. This data can immediately be stored in a database for building historical samples, predictive models, and reports:
async function loadPossessionAndShots(date) {
const res = await fetch(`https://api.api-sport.ru/v2/football/matches?date=${date}&status=finished`, {
headers: { Authorization: 'YOUR_API_KEY' }
});
const json = await res.json();
return json.matches.map(match => {
const statsAll = match.matchStatistics.find(p => p.period === 'ALL');
const overview = statsAll.groups.find(g => g.groupName === 'Match overview');
const shots = statsAll.groups.find(g => g.groupName === 'Shots');
const possession = overview.statisticsItems
.find(i => i.key === 'ballPossession');
const totalShots = shots.statisticsItems
.find(i => i.key === 'totalShotsOnGoal');
const shotsOnTarget = shots.statisticsItems
.find(i => i.key === 'shotsOnGoal');
return {
matchId: match.id,
homeTeam: match.homeTeam.name,
awayTeam: match.awayTeam.name,
homePossession: possession.homeValue,
awayPossession: possession.awayValue,
homeTotalShots: totalShots.homeValue,
awayTotalShots: totalShots.awayValue,
homeShotsOnTarget: shotsOnTarget.homeValue,
awayShotsOnTarget: shotsOnTarget.awayValue
};
});
}
Based on this data, advanced models can be built: from assessing attacking efficiency (the ratio of goals to shots and shots on target) to simplified analogs of xG based on shot zones and the frequency of «big chances.» And considering that the API supports other sports — basketball, hockey, tennis, table tennis, and esports — you can develop a unified analytical approach to «having the initiative» across different disciplines, relying on related possession and attacking action metrics.
How to use the football match API for tactical and analytical game analysis
For a quality tactical analysis, it is important not only to know the final percentage of ball possession but also to understand, how it was formed: through which game segments, at what score, and against which opponent. The football match API allows you to build this context based on match events and periodized statistics. Through the endpoint /v2/football/matches/{matchId}/events you receive a timeline of goals, cards, substitutions, and other key episodes, and in estadísticasDelPartido — the distribution of possession, shots, and duels by halves. Together, this allows you to link the tactical decisions of coaches with changes in statistics.
For example, you can analyze how substituting an attacking midfielder for an additional defensive midfielder affected possession and the number of shots. Up to a certain minute, the team could dominate possession and regularly get into shooting positions, but after the substitution, they might start playing defensively, conceding the initiative. With the API, these transitions are easily recorded and visualized in your own dashboards: possession charts by segments, shot dynamics, frequency of entries into the penalty area, and the number of «big chances» before and after key tactical decisions.
Below is a simplified example of how to combine match events and statistics to form a basic tactical report via the API. In practice, such code is supplemented with visualizations (graphs, timelines) and exported to reporting PDFs or internal BI systems:
async function buildTacticalReport(matchId) {
const [matchRes, eventsRes] = await Promise.all([
fetch(`https://api.api-sport.ru/v2/football/matches/${matchId}`, {
headers: { Authorization: 'YOUR_API_KEY' }
}),
fetch(`https://api.api-sport.ru/v2/football/matches/${matchId}/events`, {
headers: { Authorization: 'YOUR_API_KEY' }
})
]);
const match = await matchRes.json();
const eventsJson = await eventsRes.json();
const stats1st = match.matchStatistics.find(p => p.period === '1ST');
const stats2nd = match.matchStatistics.find(p => p.period === '2ND');
const possession1st = stats1st.groups
.find(g => g.groupName === 'Match overview')
.statisticsItems.find(i => i.key === 'ballPossession');
const possession2nd = stats2nd.groups
.find(g => g.groupName === 'Match overview')
.statisticsItems.find(i => i.key === 'ballPossession');
const keySubs = eventsJson.events.filter(e => e.type === 'substitution');
return {
score: `${match.homeTeam.name} ${match.homeScore.current} : ${match.awayScore.current} ${match.awayTeam.name}`,
possessionByHalf: {
first: possession1st,
second: possession2nd
},
substitutions: keySubs
};
}
By expanding such a report, you can add bookmaker coefficients (through betting market fields), related tournaments and seasons, as well as in the future — data from WebSocket connections and AI algorithms. All this turns a static figure of ball possession into a living match story, where the evolution of tactics, dynamics of initiative, and the real strength of the team in each game segment are visible.
Integration of sports event APIs into websites, applications, and analytics dashboards
For the figures on ball possession and shots to truly work for your business, they need to be skillfully integrated into digital products: websites, mobile applications, internal analytical dashboards, and betting tools. Integration with sports event APIs allows displaying not only the score and basic statistics on the frontend but also advanced metrics, club strength indices, connections with bookmaker coefficients, and market dynamics. At the same time, all the logic for collecting, storing, and updating data remains on your side, while the API service is responsible for the relevance and completeness of statistics across multiple sports.
In practice, this may look like this: the frontend requests aggregated data from your backend, and the backend retrieves it from the Sport Events API on a schedule or in near real time. Through fields estadísticasDelPartido you take possession, shots, and «big chances,» through oddsBase — bookmaker coefficients for 1X2 markets, totals, and handicaps. All this is then sent to the visualization component: possession graphs, comparative tables for shots, strength indices, and probabilities of match outcomes. With the emergence of WebSocket support and AI modules on the provider’s side, such dashboards can be updated almost instantly and automatically adjust forecasts to the current course of the game.
A simple example of integration: your server requests a list of today’s football matches, extracts key statistics, and forms a compact JSON for the frontend. This is how many live centers and analytics sections on professional sports and betting websites are built:
async function loadTodayFootballSummary() {
const res = await fetch('https://api.api-sport.ru/v2/football/matches', {
headers: { Authorization: 'YOUR_API_KEY' }
});
const json = await res.json();
return json.matches.map(match => {
const statsAll = match.matchStatistics.find(p => p.period === 'ALL');
const overview = statsAll.groups.find(g => g.groupName === 'Match overview');
const shots = statsAll.groups.find(g => g.groupName === 'Shots');
const possession = overview.statisticsItems.find(i => i.key === 'ballPossession');
const shotsOnTarget = shots.statisticsItems.find(i => i.key === 'shotsOnGoal');
return {
id: match.id,
tournament: match.tournament.name,
home: match.homeTeam.name,
away: match.awayTeam.name,
score: `${match.homeScore.current}:${match.awayScore.current}`,
possession,
shotsOnTarget,
odds: match.oddsBase || []
};
});
}
By deploying such a scheme for other sports (basketball, hockey, tennis, table tennis, esports), you get a unified analytical layer for your entire ecosystem. Just register and get a key in tu cuenta personal en api-sport.ru, after which you will be able to scale reporting, enrich betting models, and build unique visual products that show the real indicators of team strength, not just a pretty percentage of ball possession.




