agentleFS
beydemirfurkanbeydemirfurkan/appstore-release/skills/app-store-age-rating/SKILL.md

app-store-age-rating

Skill4 starsChanged 36 days agoMITView on GitHub

Answer Apple's App Store age-rating questionnaire (the 2025–2026 version with 13+, 16+ and 18+ tiers, age assurance, and the social media questions required since September 2026) and write it through the App Store Connect API in one complete, valid declaration. Use when the user asks "what age rating will my app get", "fill out the age rating", "content descriptions", "social media questions", "age assurance", "rating is 409ing", or when an App Store readiness check reports rating.* findings.

The file

We split this skill into the rules it gives an agent

2 rules. About 0 are common, 1 is distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈1

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Ask about what the app actually contains.

    line 30
  2. Very specific:

    Only what is not NONE/false needs to be written — everything omitted is sent as NONE or false:

    line 38

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Age rating

You say: "What age rating should my app get?" · "Answer the new social media questions."

It does: Walks the 2026 questionnaire with you in plain words, then writes the complete declaration App Store Connect requires — 4+, 9+, 13+, 16+ or 18+.

Apple derives the rating (4+, 9+, 13+, 16+, 18+) from a questionnaire. The API stores the answers as one ageRatingDeclaration on the app's App Info, and it only accepts a complete set — a partial PATCH 409s. This tool always sends every attribute; you only decide the answers.

Running the CLI

node <skill-dir>/scripts/asc.mjs <command> [flags]

<skill-dir> is the directory you loaded this SKILL.md from. Below, asc means that line. Credentials come from the environment only.

1. Interview the user — in their words, not Apple's

Ask about what the app actually contains; never guess "NONE" for content you have not seen. The questions, and the config key each answer sets, are in references/questionnaire.md. Ask in batches:

  1. Content — violence, sexual content, profanity, horror, drugs/alcohol, mature themes, medical information, weapons, simulated gambling, contests. Each is NONE, INFREQUENT or FREQUENT.
  2. Capabilities — user-generated content, messaging or chat, social media features (profiles, following, feeds), unrestricted web browsing, advertising, loot boxes, real-money gambling, health or wellness topics.
  3. Controls — parental controls, age assurance (does the app verify age?), and whether social features are restricted by age.

2. Write the config

Only what is not NONE/false needs to be written — everything omitted is sent as NONE or false:

"ageRating": {
  "profanityOrCrudeHumor": "INFREQUENT",
  "userGeneratedContent": true,
  "messagingAndChat": true,
  "socialMedia": true,
  "socialMediaAgeRestricted": true,
  "parentalControls": false,
  "ageAssurance": false
}
  • override forces a higher rating than the answers produce: NINE_PLUS, THIRTEEN_PLUS, SIXTEEN_PLUS, EIGHTEEN_PLUS, or UNRATED; NONE means no override. It is sent as ageRatingOverrideV2 — never the deprecated ageRatingOverride, and never both (409).
  • INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE from older configs are accepted and mapped to INFREQUENT / FREQUENT.
  • kidsAgeBand is deprecated by Apple and no longer sent. Apps in the Kids category set it in App Store Connect.
  • ageRating4Plus: true from v1 configs still means "everything NONE/false".

3. Apply and verify

asc age-rating --dry-run   # the full declaration that would be sent, and what differs
asc age-rating
asc check                  # rating.declaration.missing should be gone

Tell the user the resulting tier. App Store Connect shows it per territory (App Information → Age Rating); some territories (Korea, Brazil, Vietnam) rate separately.

Judgement calls

  • User-generated content or chat → Apple also expects moderation: a way to report content, block users, and filter objectionable material (guideline 1.2). Ask whether the app has them; if not, that is a likely rejection, not an age-rating question.
  • AI chat or generated content counts as user-generated content and unrestricted content unless the output is filtered — answer conservatively.
  • Health or wellness topics is true for fitness, diet, meditation, period tracking; medicalOrTreatmentInformation is for diagnosis or treatment content. Apps in Health & Fitness or Medical may also need the EU/UK/US regulated-medical-device declaration in App Store Connect (UI only).
  • Web views that can reach arbitrary sites → unrestrictedWebAccess: true, which rates 18+ unless restricted.
  • Loot boxes are lootBox: true; simulated casino games are gamblingSimulated; real-money gambling is gambling: true and needs licensing (guideline 5.3).

When it fails

ErrorFix
409 naming a missing attribute (e.g. socialMedia)Apple added a question. Update this tool; meanwhile it is a config-key gap, report it.
409 on ageRatingOverride and ageRatingOverrideV2Something else sent the old key. This tool only sends V2.
404 on appStoreVersions/{id}/ageRatingDeclarationThat path was removed in API 4.3; the declaration lives on appInfos.
Rating higher than expectedCheck unrestrictedWebAccess, gambling and override first.

Checked against the App Store Review Guidelines of June 8, 2026.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.