User-generated content policy
Reporting, blocking and moderation requirements comparable to Apple 1.2 when users can post or share. Reviewers check that the report path exists inside the app.
AI coding agents
Apps that generate text or images with an LLM get a closer look from both review teams, and for good reason: unfiltered output, personal data flowing to a third-party model and runaway API bills have all caused removals. None of this is hard to get right in a web app you wrap with WebViewGold. Here is the checklist.
From $109 one-time per platform, or let our team do it all from $698.
Apple treats generated content like user content: you need filtering of objectionable material, a way to report it, a way to block abusive users where users interact, and published contact information. For a chat app this means moderation on prompts and responses, a Report button on every answer, and a moderation sentence in the policy.
Chats are personal data. Tell users, before the first message, that their input is processed by OpenAI or Google to generate answers, and get their consent. The guideline explicitly names sharing with third-party AI. Do not use chats for anything the user did not agree to.
If users sign up, account deletion must be available in the app and must delete the chat history too. The privacy policy must name the AI provider and the retention period.
Credits, tokens, message packs and premium tiers are digital goods: inside the app they go through in-app purchase. A Stripe form or a link to your website for credits is a rejection.
A single text box in front of an API is thin. Conversation history, saved prompts, settings, push for finished tasks and a clear purpose make it an app.
The reviewer will type something. Make sure the demo account has credits, the model responds within seconds, and errors (rate limit, provider outage) show a friendly message instead of a spinner.
Reporting, blocking and moderation requirements comparable to Apple 1.2 when users can post or share. Reviewers check that the report path exists inside the app.
Apps that generate content must prevent restricted output (sexual content involving minors, content that enables deception or harm) and must offer an in-app way to report or flag offensive AI output without leaving the app. Document your safety testing.
Chat messages sent to OpenAI or Google count as data shared with a third party. Declare it under Messages, and name the processing in the privacy policy. A mismatch between form and traffic is a rejection on its own.
The IARC questionnaire asks about user interaction, unrestricted internet access and mature content. Answer for the worst case your filters allow; a rating that is too low gets corrected by Google and can lead to removal.
A key in client JavaScript is extractable from any published app. Route every model call through your own backend (a serverless route is enough) that holds the key, checks the session and applies limits.
Run prompts through a moderation check before the model and responses after it (OpenAI offers a moderation endpoint; Gemini has safety settings and categories). Block, soften or add a notice depending on category, and log the decision.
A Report action on every generated answer that stores the conversation ID and reason, a block option wherever users see each other, and a support email in the app and in the policy.
Per-user daily message and token budgets, stricter limits for anonymous use, a hard monthly cap at the provider, alerts at 50 and 80 percent, and a graceful "limit reached" state in the UI.
A first-run notice about third-party processing with an explicit OK, a retention setting (delete chats after 30 days, for example), and account deletion that purges history.

With a good optimized version of your web app you can have a stunning mobile app within a couple of minutes. Additionally to that the customer service is very nice and very helpful! I can just recommend WebViewGold :-)
A minimal route handler that most chat apps need. Replace the budget store and the provider calls with yours.
// POST /api/chat (server only; the API key never reaches the client)
export async function POST(req) {
const user = await requireSession(req); // 401 if not signed in
const { message, conversationId } = await req.json();
const usage = await getDailyUsage(user.id); // messages and tokens today
if (usage.messages >= user.plan.dailyMessages) {
return json({ error: "limit", message: "Daily limit reached. Resets at midnight." }, 429);
}
const flagged = await moderate(message); // provider moderation endpoint
if (flagged.blocked) {
await logModeration(user.id, conversationId, flagged);
return json({ error: "moderated", message: "That request cannot be processed." }, 400);
}
const reply = await callModel({
messages: await history(conversationId, 20), // bounded context window
maxTokens: 600, // caps cost per answer
userTag: hash(user.id), // abuse attribution at the provider
});
const outFlag = await moderate(reply.text);
const text = outFlag.blocked ? "I cannot help with that." : reply.text;
await recordUsage(user.id, reply.tokens);
await saveTurn(conversationId, message, text, { reportable: true });
return json({ text, conversationId });
}| Situation | Apple age rating questionnaire | Google content rating |
|---|---|---|
| General assistant, moderation on input and output, no user-to-user features | Usually a low rating; declare that the app includes AI-generated content and unrestricted web access if answers include links | Answer the questionnaire honestly; typically a teen-level rating because of open-ended text generation |
| Companion or role-play, mature themes possible | Higher rating (16+ or 18+ in Apple's current system); the questionnaire asks about mature or suggestive content and whether controls exist | Mature rating; make sure the store listing matches |
| Medical, legal or financial advice | State the limits in the app and the listing; Apple reads claims under 2.3 and 5.1.1 | Same; add a disclaimer and avoid diagnosis or investment language |
| Children as the audience | Kids Category rules apply: no third-party AI processing of personal data without parental consent, stricter everything | Families policy: generative AI for children needs extra safeguards and is often not approved |
WebViewGold triggers an in-app purchase with one URL: window.location.href = "revenuecat://purchase?external_id=" + userId + "&product=credits_100", where the product is a consumable configured in App Store Connect, Google Play and RevenueCat, and the RevenueCat API key and project ID are set in the WebViewGold project. Your server listens to the RevenueCat webhook and adds the credits to the user's balance; never add credits on the client. Offer restoreinapppurchases:// in settings and, for subscriptions, cancelinapppurchase://, which opens the store's subscription management.
On the web, Stripe remains fine, and credits bought on the web may be used in the app. What you must not do is point app users to the website to buy credits. Both stores take 15% instead of 30% under Apple's Small Business Program and Google's 15% tier for revenue under $1M per year; the RevenueCat setup guide covers the product configuration.
Harden this AI chat app for App Store and Google Play review. 1) Verify that no provider API key reaches the client; move any direct provider call into a server route that requires a session. 2) Add moderation before the model call and on the response, with logging. 3) Add a Report action on every generated answer (stores conversation id, message id, reason) and a Block action anywhere users see each other. 4) Add per-user daily message and token budgets with a friendly limit-reached state, and stricter limits for anonymous users. 5) Add a first-run consent notice explaining that messages are processed by [OpenAI/Google] to generate answers, with an explicit Continue button, and record the consent. 6) Add a retention setting and make account deletion purge chat history. 7) When isNativeApp() is true, route credit purchases to revenuecat://purchase?external_id=USER_ID&product=PRODUCT_ID and hide web payment links; credits are granted only by the RevenueCat webhook handler. 8) Update /privacy to name the AI provider, retention and reporting. Report every change and anything that needs provider-side configuration.
In practice, yes for anything that generates open-ended text or images: reviewers test with objectionable prompts and expect filtering, a report path and contact details, following Guideline 1.2.
No. Any key shipped to the client can be extracted from a published app and used at your expense. Put the call behind your own server route with authentication and limits.
Yes. Name the provider in the privacy policy, declare the sharing in Apple's App Privacy answers and Google's Data safety form, and ask for consent in the app before the first message (Apple 5.1.2).
On the web, yes. Inside the iOS and Android apps, credits are digital goods and must go through in-app purchase, which WebViewGold handles via RevenueCat. Credits bought on the web can be used in the app.
Same result, different amount of work on your side. All three come with the approval guarantee and 24/7 human support.
$109 per platform, one-time
The WebViewGold license: a finished Xcode or Android Studio project. Paste your URL, set name and icon, switch on features, build and submit. Free updates forever.
See plans on the main page$349 per license, one-time add-on
No Mac, no Xcode, no Android Studio: configure in the browser, we build both apps in the cloud and hand them to App Store Connect and the Play Console.
How the Cloud Builder works Try the free demo$698 per platform $798
Send us your URL and icon. Our team configures, builds and delivers your app within 72 hours, white-label, with source projects. Both platforms for $1,158.
Full Service details Powered byWinter Sale prices valid until December 31, 2026.
App Store & Google Play approval guarantee – or your money back within 14 days
Rather hand it over? Full Service: we configure, build and deliver within 72 hours, from $698 per platform. Questions? Chat with us 24/7.
Refunds are granted under the conditions listed in our FAQ: a non-content rejection by Apple and/or Google, claimed within 14 days after purchase.