Conclusion
Through comprehensive on-device processing, advanced neural network architectures, and negligible data transmission, the Private Identity® Facial Age Estimation Portal eases the burden of global regulatory compliance while providing a frictionless user experience. Its modular deployment options—spanning from mobile and web to embedded edge devices—empower businesses in regulated markets (gaming, e-commerce, streaming media, etc.) to confidently manage age verification at scale.
By combining cutting-edge deep learning at the edge, encrypted data exchange, and stringent privacy-by-design principles, the Portal establishes a new industry benchmark for ethical, accurate, and resilient age estimation technology.
For further customization or specialized deployments (e.g., government ID checks, KYC integrations, or unique enterprise workflows), please contact support@privateid.com.
Frequently Asked Questions
Question:
Do you support web-hook callbacks to let us know the estimation result instead of us polling for it?
Answer:
Absolutely. We provide web-hook callbacks so you can receive the final estimation results in real-time, without needing to poll our system.
Question:
Can the Age Estimation result include the age or age range that has been determined and the confidence score?
Answer:
Yes, we can include both the derived age (or age range) and its corresponding confidence score in the results.
Question:
What does the result for the POST /session API look like?
Answer:
Below is an example of the JSON payload returned by the POST /session endpoint:
{
"token": "7d014351-6d6f-4202-8e8f-1d692b52409e",
"url": "https://g.devel.privateid.com/estimate?token=7d0143-8f-1d09e",
"expiresAt": "2025-01-03T13:52:36.721Z"
}
- Name
token
- Type
- string
- Description
A unique identifier for the session
- Name
url
- Type
- string
- Description
The URL where facial age estimation can be performed for this session
- Name
expiresAt
- Type
- string
- Description
The time and date when the session token expires
Question:
What does the Webhook data format look like, and how does one configure a webhook?
Answer:
The webhook data format includes the age estimation result for the session ID, and additional session validation metadata. To configure a webhook, you need to pass a callback object, which includes the following:
- Name
url
- Type
- string
- Description
The target URL where the webhook data will be sent.
- Name
headers
- Description
Additional request headers to include in the webhook call (for authentication).
At the end of the session, the system sends the event data (including the age estimation result) to the specified URL. We added this to the documentation above for session creation.
Sample Webhook Payload (customizable):
{
category: "PrivateID FAE Response",
description: "Customizable Facial Age Estimation Response",
// Unique identifier for the session
sessionId: null,
// Returns the estimated age result
estimatedAge: null,
// Indicates whether the age estimate is over or under a predefined threshold
thresholdStatus: null,
// last screen user visited, if session abandoned
lastScreen: null,
// Counts the number of spoofing attempts detected during the session
spoofAttemptCount: null,
// Details about the user's device, browser, and interactions (not PII)
deviceDetails: {
// Information about the user's system and device
systemInfo: {
// The user agent string representing the browser and system
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
// The type or architecture of the device being used
deviceType: "MacIntel",
// Information about the device's screen
screen: {
// The width of the screen in pixels
width: 1728,
// The height of the screen in pixels
height: 1117,
// The current orientation of the screen
orientation: "landscape-primary",
},
// Number of touch points supported by the device
touchPoints: 0,
},
// Details about the browser environment being used
browserDetails: {
// The name of the browser
name: "Chrome",
// The rendering engine powering the browser
engine: "Blink",
// The operating system platform
platform: "Mac OS",
},
// Hardware and system resource details
hardwareStatus: {
battery: {
// Current battery level as a percentage
level: 100,
// Indicates if the device is charging
charging: true,
},
},
// Environmental context about the user's session
environment: {
// The locale setting of the user (language and region)
locale: "en-US",
// Geographic location of the user, if available
location: {
latitude: null,
longitude: null,
},
// Timezone information for the user's session
timezone: {
// The offset from UTC in hours
offset: 8,
// The name of the timezone
name: "America/Los_Angeles",
},
},
// Metrics related to the user's interactions during the session
interactionMetrics: {
// Number of mouse clicks detected
mouseClicks: 2,
// Number of mouse movements detected
mouseMovements: 168,
// Number of key presses detected
keyPresses: 0,
// Number of touch interactions detected
touchInteractions: 0,
// Indicates if the developer tools were opened
devToolsUsage: false,
},
// Indicators for security checks and session validation
securityIndicators: {
isHeadless: {
// Indicates if WebDriver (automation tool) is detected
webdriver: false,
// Indicates if the user agent string has been modified
userAgentModified: false,
// Indicates if WebGL is disabled (can signify headless mode)
webGLDisabled: false,
},
},
},
};
Question:
What does the Age Estimation result look like?
Answer
The Age Estimation result is the estimated age output from the model. This estimated age is then compared to a predefined threshold value to determine if the subject meets the age requirement (“above threshold” or “under threshold”).
The age estimation itself (for example, “33.055858”) is not considered personal information under the privacy laws. This is because there are many people who are 33 years old, so this number does not identify an individual person.
We can also provide an indication of whether the age meets your specified threshold without directly sharing the exact age value. (e.g. “Below threshold”, or “Above threshold”)
Question:
What sort of liveness detection do you have?
Answer:
Our patented on-device advanced AI/ML algorithms provide high confidence passive liveness checks that function effectively under varying lighting conditions and on a diverse set of devices and web browsers to detect spoofing attempts including paper, digital and even deep fakes. Active liveness checks can be made available upon request.
Our liveness detection models operate directly on the user's device, ensuring that no images or personally identifiable information (PII) leave the device. This approach safeguards user privacy, mitigates the risk of sensitive data exposure in the event of a breach, and eliminates the need for consent to capture data, as all processing, including facial age estimation, is performed locally on the user's device.
Question:
Can you detect face swap attempts, spoofing attempts etc? If so, how?
Answer:
Our passive liveness anti-spoof models, which run on the device, ensure that the person capturing the selfie in the UI/UX is a live human being, effectively preventing paper, digital, and deepfake spoofing attempts. Our liveness models include the ability to detect spoofing in both static images as well as live video streaming.
Question:
Can the API return a unique face identifier for the person who verified themselves?
Answer:
Yes, PrivateID can return a unique face identifier (UUID and GUID) for a verified individual using our patented, privacy-preserving homomorphic tokenization techniques. This identifier is consistent across verifications and devices, enabling PrivateID to recognize the same person across multiple sessions while maintaining privacy and security.
Error Codes
Facial Age Estimation General Error Codes
Category | Status Code | Workstation Error Code Message |
---|---|---|
New | -2000 | Camera unavailable (Camera failed to start or permissions were not given) |
Decision - Fail | -1 | Invalid image (No face found) |
Decision - Pass | 0 | Valid face (Success) |
Fraud Signal | 1 | Image spoof |
Fraud Signal | 2 | Video spoof |
Dynamic Feedback | 3 | Too Close |
Dynamic Feedback | 4 | Too far |
Dynamic Feedback | 5 | Close to right edge |
Dynamic Feedback | 6 | Close to left edge |
Dynamic Feedback | 7 | Close to top edge |
Dynamic Feedback | 8 | Close to bottom edge |
Dynamic Feedback | 9 | Too blurry |
Dynamic Feedback | 10 | Eyeglasses detected |
Dynamic Feedback | 11 | Facemask detected |
Dynamic Feedback | 12 | Chin too far left |
Dynamic Feedback | 13 | Chin too far right |
Dynamic Feedback | 14 | Chin too far up |
Dynamic Feedback | 15 | Chin too far down |
Dynamic Feedback | 16 | Image too dim |
Dynamic Feedback | 17 | Image too bright |
Dynamic Feedback | 18 | Face low confidence value (used for selfie Compare to another image, photo on ID) |
Dynamic Feedback | 19 | Invalid face background |
Dynamic Feedback | 20 | Eyes closed |
Dynamic Feedback | 21 | Mouth open |
Dynamic Feedback | 22 | Face tilted right |
Dynamic Feedback | 23 | Face tilted left |
Facial Age Estimation Spoof Error Codes
Status Code (Property) | Error Code Message |
---|---|
-100 | Invalid Image |
-5 | Triggered if a desktop or otherwise disallowed device attempts to connect under a mobile-only configuration. |
-4 | Invalid Face |
-3 | Face Too Close To Edge |
-2 | Mobile Phone Detected |
-1 | No Face Detected |
0 | Real |
1 | Spoof Detected |
Document Capture Error Codes (Optional: Compare selfie to photo on ID with DOB extraction)
Category | Status Code (Property) | Workstation Error Code Message |
---|---|---|
Front DL Scan | -2 | Internal Error |
Front DL Scan | -1 | Invalid Image (No document) |
Front DL Scan | 0 | Success |
Front DL Scan | 3 | ALMOST DONE . . . (Found document but unable to parse hold still) |
Front DL Scan | 4 | MOVE JUST A LITTLE CLOSER |
Front DL Scan | 18 | Not valid document |
Back DL Scan | -2 | Internal Error |
Back DL Scan | -1 | No Document Found |
Back DL Scan | 0 | Success |
Back DL Scan | 3 | ALMOST DONE . . .(Found document but unable to parse hold still) |
Back DL Scan | 4 | MOVE JUST A LITTLE CLOSER |
Back DL Scan | 9 | TOO BLURRY or Finger is blocking document |
Back DL Scan | 10 | MOVE CLOSER TO BARCODE |
Back DL Scan | 18 | No BARCODE found |