Your age gate shouldn't compare the estimate to 18 A developer working with ROC's age estimation API outlined a buffer-zone approach to facial age gating, arguing that comparing a model's estimated age directly against 18 lets minors through because every model has an error margin. The proposed routing function allows users estimated at 22 or older, sends those under 16 to a minor experience, and routes the band in between to document verification, so only users near the threshold pay for a check. The post cites the amended COPPA Rule effective April 2026, which treats a child's selfie as personal information, along with tightening age rules in California and the EU. Since April 2026 the amended COPPA Rule treats a child's selfie as personal information. California and the EU are tightening age rules too. So a lot of teams are adding facial age estimation to signup right now. The most common mistake I see is this: if estimatedAge = 18 allow ; Every model has an error margin. A 17-year-old estimated at 18.4 walks straight through. Use a buffer zone instead: function route age: number { if age = 22 return "allow"; // clearly adult if age < 16 return "minor experience"; // clearly a minor return "verify document"; // near the threshold } Most users clear instantly. Only the narrow band near your threshold pays for a document check. A few rules that keep this compliant: I've been testing this with ROC's age estimation API https://roc.ai/age-estimation-api/ . It's NIST-ranked, it doesn't retain images, and you get 100 free production credits to find where your buffer should sit. How do you set your bounds? Disclosure: I work with ROC.