DEV Community

Aleksei Martiushin
Aleksei Martiushin

Posted on

How we built an open dataset of kids' app and game risk flags (CC BY 4.0, DOI)

Disclosure: I'm Aleksei Martiushin. I run Raising Stoics, a site for parents of kids ages 4–8, and I built the dataset described below.

Parents of young kids keep asking the same question about games, apps, and shows: "Is this OK for my 6-year-old?" The facts that answer it are public, but they are scattered. The ESRB rating sits on one site, PEGI on another, in-app purchases on the store listing, a loot box mechanic in the rating descriptors, and an FTC settlement in a press release.

We pulled those facts into two small datasets and published them on Zenodo under CC BY 4.0 with DOIs. This post covers how they're structured, how the values were chosen, what a row looks like, and where the data is weak.

The two datasets

1. Official age ratings, October 2026 — doi.org/10.5281/zenodo.23619760
461 titles (127 games, 65 apps, 24 YouTube channels, 87 movies, 112 shows, 44 toys) and 1,210 rating records across MPA, US TV Parental Guidelines, ESRB, PEGI, BBFC, FSK/USK, Apple App Store, Google Play (IARC), manufacturer age labels, Roblox content labels, and minimum ages in company terms. 1,136 of those records link to their source.

2. Kids' Media Risk Index, October 2026 edition — doi.org/10.5281/zenodo.23619163
259 titles, each checked against six yes/no flags. Data frozen on 2026-10-18; this version won't change.

Both are snapshots. The per-title pages on the site keep updating, but the files on Zenodo don't, so a number you cite today will still match the file later.

File layout

kids-media-official-age-ratings-2026-10-titles.csv    # one row per title
kids-media-official-age-ratings-2026-10-ratings.csv   # one row per rating record
kids-media-official-age-ratings-2026-10.json          # both tables + metadata

kids-media-risk-index-2026-10.csv                     # one row per title, flags 1–6
kids-media-risk-index-2026-10-evidence.csv            # one row per title × flag (1,554 rows)
kids-media-risk-index-2026-10.json                    # everything + flag definitions
Enter fullscreen mode Exit fullscreen mode

slug is the join key across all files. Each slug also maps to a page at https://raisingstoics.com/is-it-good-for-kids/<slug> that lists the sources for that title.

What a row looks like

Ratings file (one title can have many rows, one per rating system):

slug,name,type,system,official,label_in_guide,rating_as_recorded,source_url,checked
roblox,Roblox,game,ESRB (US & Canada),yes,US & Canada (ESRB),"T for Teen (ages 13 and up) — Diverse Content: Discretion Advised; Users Interact; In-Game Purchases (Includes Random Items)",https://www.esrb.org/news/what-parents-need-to-know-about-roblox,October 2026
roblox,Roblox,game,PEGI (Europe & UK),yes,Europe & UK (PEGI),Parental Guidance Recommended (no age number) — In-game purchases,https://pegi.info/search-pegi?q=roblox,October 2026
Enter fullscreen mode Exit fullscreen mode

Risk index (one row per title):

slug,name,type,flag_set,official_rating,rating_source,age_level,flag_1,flag_2,flag_3,flag_4,flag_5,flag_6,flag_count,checked,url
minecraft,Minecraft,game,interactive,10+,ESRB: E10+,3,1,1,1,0,1,0,4,October 2026,https://raisingstoics.com/is-it-good-for-kids/minecraft
bluey,Bluey,show,media,All ages,TV-Y,0,0,0,0,0,0,0,0,October 2026,https://raisingstoics.com/is-it-good-for-kids/bluey
Enter fullscreen mode Exit fullscreen mode

Evidence (why a flag is 1):

slug,name,flag_set,flag_number,flag_name,value,evidence
roblox,Roblox,interactive,2,Contact with other players or strangers,1,ESRB: Users Interact
Enter fullscreen mode Exit fullscreen mode

Design decisions

One age scale across rating systems. ESRB, PEGI, the MPA, and app stores all use different labels. We map every title to a 0–6 age_level (0 = all ages, 1 = 5–7+, 2 = 7–8+ / PG, 3 = 9–10+, 4 = 12–13+, 5 = 15–16+, 6 = 17–18+). Only official ratings set the level, in a fixed order of precedence for each type. Movies use the MPA, then the BBFC. Games use the ESRB, then the app stores for mobile-only games. Roblox experiences take the platform rating. Toys use the maker's label. When official sources disagree, we use the stricter rating and keep both in the ratings file.

Common Sense Media is kept but labeled. It's a review, not an official rating, so those rows have official = no and don't set age_level. The one exception is 17 titles in the risk index that have no official rating at all. For some of them, flag 1 uses Common Sense Media's age guidance, and the README says so.

Three flag sets, not one. A loot-box flag makes no sense for a movie, and "rated 12+ in the UK or Germany" makes no sense for a toy. So flag_set is interactive (games, apps, YouTube channels), media (movies, shows), or toy, and each set has its own six flags. If you compare flag_count across sets, you're mixing different questions.

"Mild" doesn't count. When a rating body describes content as "mild" (for example "Mild Fantasy Violence"), it doesn't trigger the violence, scary-content, language, or sex/drugs flags in the media set.

Lawsuits are claims. Flag 6 for interactive titles and toys counts government lawsuits, fines, and safety warnings, reported as filed rather than proven. Private lawsuits aren't counted.

Zero means "not found". A 0 says we couldn't document the flag from public sources by the check date. It doesn't prove the thing is absent.

Quick look with pandas

import pandas as pd

idx = pd.read_csv("kids-media-risk-index-2026-10.csv")
games = idx[idx.flag_set == "interactive"]  # 157 titles

names = ["rating > 7", "contact", "purchases", "loot boxes",
         "violence/scary", "gov. action"]
counts = games[[f"flag_{i}" for i in range(1, 7)]].sum()
print(dict(zip(names, counts)))
# {'rating > 7': 121, 'contact': 107, 'purchases': 122,
#  'loot boxes': 42, 'violence/scary': 104, 'gov. action': 28}
Enter fullscreen mode Exit fullscreen mode

Of the 157 games, apps, and YouTube channels, 122 have real-money purchases, and 121 carry an official rating above age 7, even though they're among the titles US parents of 4–8-year-olds search for most.

How the data was made

The titles are the ones in our per-title guides, which were picked because parents search for them. That makes them a convenience sample, not a random sample of children's media, so the counts describe this list and nothing more. The guides are drafted with AI assistance, and a separate reviewer then checks each one against its sources. The ratings and flags come from the official sources linked in each row, not from the model's memory. Our editorial standards are at raisingstoics.com/editorial-standards.

Limitations

  • Ratings vary by release (cinema vs. home video, season, edited version), by country, and by platform. rating_as_recorded names the release where we could.
  • Some streaming ratings were read from the service's listing as indexed by search, and are marked that way.
  • Store listings and company practices change. This is an October 2026 snapshot.
  • The index counts documented facts. It is not a safety score, and it doesn't weight one flag against another.

Using it

The license is CC BY 4.0, so you can use the data for anything as long as you credit the source. The citation is in each README. Charts and the method page are at raisingstoics.com/kids-media-risk-index. If you find a wrong rating, email hello@raisingstoics.com with the source and I'll fix it in the next edition.

I'd especially like feedback on the age-level mapping. Collapsing ESRB, PEGI, IARC, and the MPA onto one 0–6 scale involves judgment calls, and other people may draw the lines differently.

Top comments (0)