shipcheck

Guideline 1.2: the four UGC requirements, and why AI apps trip it

Updated September 7, 2026 · published by Baker Ventures LLC · sources cited inline

If a user of your app can see content another user created, four things are required. Not three.

  1. A method for filtering objectionable material before it is posted.
  2. A mechanism to report offensive content, with timely responses.
  3. The ability to block abusive users.
  4. Published contact information so users can reach you.

The rejection almost always comes from blocking, which is the one teams skip. Reporting feels like the safety feature, so it gets built; blocking is a data-model change, so it gets deferred.

AI output is treated as content your app is responsible for. An app whose model can produce text a user did not write should expect these requirements to be applied to it, even with no other users involved. That surprises people building single-player AI apps, and it is the reason a chat feature added late is a submission risk rather than a small feature.

What each requirement means in practice

Filtering. Something that runs before content becomes visible. A moderation API, a blocklist, a model check, a human queue for a small enough volume. What fails review is nothing at all, or a filter that only exists in the marketing copy.

Reporting. A control the user can reach from the content itself, that reaches a destination you actually monitor. "Timely" is not defined numerically in the guideline. What is checkable is whether the control exists, whether it goes anywhere, and whether you can describe your process. Put that description in the review notes rather than making a reviewer guess. Review notes that work.

Blocking. In the app, at the point of contact, and it must actually stop the contact. This is where it gets structural: blocking means your content queries need a block relationship to filter against, in both directions, in every place content is fetched. Retrofitting it after launch is a data-layer change touching every feed query, which is exactly why it should be built with the feature rather than after the rejection.

Contact information. Discoverable, and functional. Reviewers check.

Why AI apps get caught

Three ways.

A model can produce content. If your app displays text a user did not write, Apple's position is that you are responsible for it, and the safeguards it expects for user content are the safeguards it expects here.

One user's input becomes another's content. Shared prompts, community galleries, exported conversations, a leaderboard of results. This is unambiguous UGC and it usually gets added as a growth feature by someone who has not read 1.2.

Screenshots and uploads. An app that accepts an image and returns a response is processing content the user supplied. If any of that becomes visible to anyone else, 1.2 applies.

Related and separate: Guideline 5.1.2 covers what you may do with data sent to a third-party AI service, and 4.3 covers apps that are one of many near-identical wrappers. An AI app with a social feature can be evaluated under all three in a single review.

The React Native specifics

Nothing here is RN-specific in policy. Two things are, in practice:

A moderation call needs a server. Doing it in the client means shipping an API key in an app bundle, which is both a security failure and, when found, a separate problem. Route moderation through your backend. Why RN apps fail differently.

Blocking needs to survive offline sync. Apps with an offline queue can locally re-render content from a blocked user after a reconnect, because the block was applied to the fetch and not to the cache. A reviewer will not find this. Your users will.

The pre-submission check

# do the four controls exist in the UI at all
grep -rniE 'report|block|flag' src app --include=*.tsx --include=*.ts | grep -iE 'user|content|post|message' | head

# is a moderation step actually called before content is shown
grep -rniE 'moderat|toxicity|classif' src server 2>/dev/null | head

# is contact information reachable in-app and in the listing
grep -rniE 'support@|contact|mailto:' src app fastlane/metadata 2>/dev/null | head

Then answer honestly: can a user, inside the app, stop seeing a specific other person? If the answer involves email, the answer is no.

Where it sits with the other content guidelines

GuidelineCovers
1.1 Objectionable contentWhat may not be in an app at all
1.2 User-generated contentThe four safeguards when users can see each other's content
5.1.2 Third-party AIDisclosure and consent when data goes to an AI service
4.3 SpamNear-duplicate apps in a saturated category
2.1 CompletenessWhere a broken safeguard is actually reported

shipcheck reports whether report, block and contact affordances exist in the shipped UI, and cites the guideline text alongside each gap. It cannot judge whether your moderation is good, and it says so rather than implying otherwise. What it checks. · The first-submission checklist.

About shipcheck

shipcheck is a pre-submission checker from Baker Ventures LLC that runs inside Claude Code. It reads your React Native or Expo project, finds the things that get apps rejected or blocked at upload, cites the exact App Store Review Guideline or Google Play policy clause, and names the file and line to fix.

It exists because React Native and Expo apps fail for reasons that are invisible in the code you wrote: capability arriving through a dependency, purpose strings added by a config plugin, a privacy manifest missing from an SDK you never chose directly, and a generated ios/ directory that discards your edits on the next prebuild. shipcheck checks what the binary and the config actually declare, not what you intended. The rejection references on this site are free, need no account, and link to the primary Apple or Google document for every claim.

Questions and answers

What does App Store Guideline 1.2 require?

Apps with user-generated content must include a method for filtering objectionable material, a mechanism for users to report offensive content with timely responses, the ability to block abusive users, and published contact information so users can reach the developer. All four, not a selection.

Does Guideline 1.2 apply to an AI chat app?

Apple's guidance treats AI chatbot output as content the app is responsible for, and apps that generate content have been asked for the same safeguards. If your app can display text a user did not write and a model did, plan for 1.2 to be applied to it.

Do I need moderation if only two users can see each other's messages?

Yes. Private messaging between users is still user-generated content the app displays. One-to-one visibility narrows the audience for a problem, it does not remove the requirement to let someone report and block.

What counts as a timely response to a report?

Apple does not publish a number in the guideline. What gets apps rejected is having no mechanism at all, or one that goes nowhere. Have a real destination for reports, and be able to describe your process in the review notes.

Does blocking have to be in the app?

Yes. A block that requires emailing support is not a mechanism for blocking abusive users; it is a support queue. The action has to be available to the user in the app, at the point where they encounter the person.

What contact information has to be published?

A way for users to reach you, easily discoverable, that works. An address that bounces is worse than none, because it is checkable and reviewers check it.

Cite this pageshipcheck. “Guideline 1.2: the four UGC requirements, and why AI apps trip it.” Baker Ventures LLC, September 7, 2026. https://shipcheck.bakerventuresstudio.com/rejections/guideline-1-2-user-generated-content/