POST /assess-age
Two-phase age assessment with Signal Fusion and evidence trail.
Endpoint
/v1/assurance/assess-ageRequest Body
os_signal (required)
| Parameter | Type | Required | Description |
|---|---|---|---|
os_signal | enum | Required | OS-provided age bracket per AB 1043 §1798.501(a)(2). One of: under-13, 13-15, 16-17, 18-plus, or not-available (§1798.502 transition period). |
user_country_code (required)
| Parameter | Type | Required | Description |
|---|---|---|---|
user_country_code | string (ISO 3166-1 alpha-2) | Required | Two-letter country code of the user's current jurisdiction (e.g., 'US'). Age-threshold laws are geographic — California uses 13/16/18 brackets and other US states may define different thresholds. The fusion engine cannot produce a legally defensible verdict without knowing which regulatory regime applies. **Note:** The A3 API is currently available in the United States only. EU/EEA/UK country codes will receive a `403 Forbidden` response. |
interaction_mode (optional)
| Parameter | Type | Required | Description |
|---|---|---|---|
interaction_mode | enum | Optional | Interaction mode describing how the user interacts with the application. One of: touch (mobile/tablet), pointer (desktop/laptop with mouse/trackpad), or hybrid (convertible device with both). When omitted, the engine infers the mode from the behavioral signals provided. Explicitly setting this field ensures correct threshold calibration — for example, scroll velocity thresholds differ between touch flick (0–5000+ px/s) and mouse wheel (0–1500 px/s). |
Desktop and web users: Set interaction_mode: "pointer" and use the pointer-mode behavioral signals (avg_click_precision, mouse_velocity_mean, etc.) instead of touch signals. The engine automatically applies pointer-calibrated thresholds for scroll velocity and other metrics.
behavioral_metrics (optional)
Anonymized behavioral biometrics — the hardest signals to fake. Qualifies as "internal" evidence under §1798.501(b)(2)(B).
The behavioral metrics category supports both touch-mode (mobile/tablet) and pointer-mode (desktop/laptop) signals. All fields are optional — the engine scores whichever signals are present and ignores the rest. The interaction_mode field (or auto-inference) determines which thresholds are applied.
Touch-mode signals
| Parameter | Type | Required | Description |
|---|---|---|---|
behavioral_metrics.avg_touch_precision | number (0–1) | Optional | Average touch-target precision. Children's developing motor skills yield lower values. Touch-mode only — omit for pointer-mode (desktop/laptop) interactions. |
behavioral_metrics.scroll_velocity | number (px/s) | Optional | Average scroll/flick velocity. Minors tend to scan and flick at much higher speeds. The engine applies different thresholds for touch-mode (0–5000+ px/s) versus pointer-mode (0–1500 px/s). |
behavioral_metrics.form_completion_time_ms | number (ms) | Optional | Average form-field completion time. Very fast times suggest impulsive interaction. Works identically for both touch and pointer modes. |
behavioral_metrics.is_autofill_detected | boolean | Optional | Whether browser or OS autofill was detected during form completion (e.g., Chrome Autofill, 1Password, iOS AutoFill). When true, the engine neutralizes the form_completion_time_ms signal because autofill produces sub-2-second completions indistinguishable from impulsive minor interaction — but is overwhelmingly an adult 'power user' pattern. |
behavioral_metrics.touch_pressure_variance | number (0–1) | Optional | Normalized variance of touch pressure. Children exert highly inconsistent pressure due to developing fine-motor control; adults are stable and uniform. Touch-mode only. |
behavioral_metrics.multi_touch_frequency | number (events/min) | Optional | Accidental multi-touch events per minute. Minors trigger palm/extra-finger touches at 2–4× adult rates (2025 HCI research). Touch-mode only. |
Pointer-mode signals (desktop/laptop)
| Parameter | Type | Required | Description |
|---|---|---|---|
behavioral_metrics.avg_click_precision | number (0–1) | Optional | Average click-target precision — the pointer-mode equivalent of avg_touch_precision. Children overshoot targets and click off-center due to developing motor control. Pointer-mode only. |
behavioral_metrics.mouse_velocity_mean | number (px/s) | Optional | Average mouse/trackpad cursor velocity. Children move the cursor in fast, erratic bursts; adults exhibit smoother, deliberate movements. Pointer-mode only. |
behavioral_metrics.mouse_path_straightness | number (0–1) | Optional | Average mouse path straightness (ratio of direct distance to actual path distance). Children produce curved, corrective paths; adults move in efficient near-straight lines. Pointer-mode only. |
behavioral_metrics.hover_dwell_time_ms | number (ms) | Optional | Average hover-to-click dwell time — the time between the cursor entering a clickable target and the click. Adults deliberate before clicking; children click impulsively. Pointer-mode only. |
behavioral_metrics.typing_speed_wpm | number | Optional | Average typing speed in words per minute. Adults type 40–80 WPM on physical keyboards; children 10–25 WPM. Strongest on desktop; can also be used in touch-mode. |
behavioral_metrics.keystroke_interval_variance | number (0–1) | Optional | Variance of inter-keystroke intervals (0 = uniform rhythm, 1 = maximally erratic). Adults develop consistent typing rhythms; children exhibit highly variable timing. Can be used in both modes. |
Face estimation fallback
| Parameter | Type | Required | Description |
|---|---|---|---|
behavioral_metrics.face_estimation_result | object | Optional | Result of a privacy-preserving selfie-to-age face-estimation scan. Used as a fallback when the OS signal is not-available (Web browsers, Windows 10 desktops, legacy Android). The fusion engine blends this score with behavioral metrics to produce a Fallback Verdict. |
behavioral_metrics.face_estimation_result.estimation_provider | enum | ConditionalRequired if face_estimation_result is provided | Provider that performed the scan. One of: yoti, privado, or facetec. |
behavioral_metrics.face_estimation_result.estimated_age_lower | number (0–150) | ConditionalRequired if face_estimation_result is provided | Provider-estimated lower bound of the user's age range. |
behavioral_metrics.face_estimation_result.estimated_age_upper | number (0–150) | ConditionalRequired if face_estimation_result is provided | Provider-estimated upper bound of the user's age range. |
behavioral_metrics.face_estimation_result.confidence | number (0–1) | ConditionalRequired if face_estimation_result is provided | Provider confidence score. The fusion engine uses this to weight the face-estimation signal against behavioral and contextual signals. |
device_context (optional)
Device and OS metadata that correlates with age demographics. Also qualifies as "internal" evidence.
When device_model is provided, the engine detects the hardware tier (HIGH, MID,
or LOW) and applies a contextual normalization offset to touch-precision scoring.
This prevents false "Precision Delta" flags on budget devices whose lower-quality
touchscreens produce inherently lower precision readings — even for adult users.
| Parameter | Type | Required | Description |
|---|---|---|---|
device_context.os_version | string | Required | OS version string (e.g., 'iOS 18.2'). Legacy versions may indicate a hand-me-down device. Also used for hardware-tier inference when device_model is absent. |
device_context.device_model | string | Optional | Device model identifier reported by the hardware (e.g., 'iPhone 15 Pro', 'Galaxy A14', 'Pixel 8'). Used for hardware-tier detection to apply contextual normalization to touch-precision scoring. Budget devices get a small positive offset to compensate for lower-quality touchscreens. When omitted, the engine falls back to OS-based inference. |
device_context.is_high_contrast_enabled | boolean | Required | Whether bold-text / high-contrast accessibility is enabled. Correlates with 50+ demographic. |
device_context.screen_scale_factor | number (0.5–5.0) | Required | Display scale factor. Values >= 2.0 (enlarged text) correlate with older users. |
contextual_signals (optional)
Environmental and network context. Some fields may require external databases
and will set internal_evidence_only: false in the response.
| Parameter | Type | Required | Description |
|---|---|---|---|
contextual_signals.ip_type | enum | Optional | IP classification: residential, education, datacenter, or corporate. Education networks strongly correlate with minors. |
contextual_signals.timezone_offset_delta_minutes | number | Optional | Client timezone offset in minutes from UTC (e.g., -480 for US Pacific). The server compares against expected geographic timezone — mismatch > 60 min flags spoofing. The [`@a3api/signals` SDK](/docs/integration/sdks#browser-sdk-a3apisignals) sends this automatically. |
contextual_signals.referrer_category | enum | Optional | Referring source: direct, social_minor, social_general, parental_control, search_engine, or unknown. |
account_longevity (optional)
Account and app longevity signals — temporal provenance of the user's relationship with the platform. A freshly-created account paired with immature behavioral metrics is a red flag; a years-old account is a strong adult corroborator. Qualifies as "internal" evidence under §1798.501(b)(2)(B) because the platform possesses the account-creation timestamp natively.
| Parameter | Type | Required | Description |
|---|---|---|---|
account_longevity.account_age_days | number (days) | Required | Days since account creation. Accounts < 7 days old reduce adult confidence when other signals are ambiguous. Accounts > 1,825 days (≈ 5 years) are a strong adult corroborator. |
input_complexity (optional)
Language and text-input complexity statistics — on-device typing patterns that differ reliably between minors and adults. No raw text is transmitted, preserving privacy. Qualifies as "internal" evidence under §1798.501(b)(2)(B) because the keyboard SDK generates these metrics on-device.
| Parameter | Type | Required | Description |
|---|---|---|---|
input_complexity.keyboard_autocorrect_rate | number (0–1) | Required | Ratio of autocorrect-modified keystrokes over total keystrokes. Minors rely on autocorrect at significantly higher rates than adult typists. |
input_complexity.average_word_complexity_score | number (0–1) | Required | Average word complexity derived from word length and estimated syllable count. Adults trend higher; minors cluster at the lower end. Computed on-device — no raw text transmitted. |
Consent Synchronizer (optional)
Parental consent lifecycle state and provenance per AB 1043 §1798.501(c). Consent is a "living" signal — a parent may revoke at any time via the Apple/Google "Significant Change API." When the verdict is "Minor," these fields tell the developer whether the parent has already approved access, eliminating the need for a separate consent-tracking system.
consent_source is required whenever parental_consent_status is provided.
A consent status without a verifiable source is inadmissible under §1798.501(c)(2).
| Parameter | Type | Required | Description |
|---|---|---|---|
parental_consent_status | enum | Optional | Current parental consent lifecycle state. One of: pending, approved, denied, or revoked. Omit when the user is 18+ or when no consent flow has been initiated. |
consent_source | enum | ConditionalRequired if parental_consent_status is provided | Origin of the parental consent record. One of: os-system (Apple Screen Time / Google Family Link — highest trust), third-party-wallet (CLEAR, Yoti Guardian — mid-tier), or in-app (developer's own prompt — lowest trust). |
Example Request
curl -X POST https://api.a3api.io/v1/assurance/assess-age \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"os_signal": "18-plus",
"user_country_code": "US",
"behavioral_metrics": {
"avg_touch_precision": 0.25,
"scroll_velocity": 4000,
"form_completion_time_ms": 1500,
"touch_pressure_variance": 0.82,
"multi_touch_frequency": 9.3
},
"device_context": {
"os_version": "iOS 14.0",
"device_model": "iPhone 13",
"is_high_contrast_enabled": false,
"screen_scale_factor": 1.0
},
"contextual_signals": {
"ip_type": "education",
"timezone_offset_delta_minutes": 240
},
"account_longevity": {
"account_age_days": 2
},
"input_complexity": {
"keyboard_autocorrect_rate": 0.42,
"average_word_complexity_score": 0.21
}
}'Response
Success (201 Created)
{
"confidence_score": 0.96,
"verdict": "OVERRIDE",
"os_signal_age_bracket": "18-plus",
"assessed_age_bracket": "under-13",
"signal_overridden": true,
"internal_evidence_only": false,
"evidence_tags": [
"low_touch_precision",
"high_motor_precision_delta",
"rapid_scroll_velocity",
"rapid_form_completion",
"erratic_touch_pressure",
"high_multi_touch_frequency",
"device_normalization_applied:mid",
"legacy_device_detected",
"known_education_network_ip",
"inconsistent_timezone_offset",
"very_new_account",
"high_autocorrect_rate",
"low_word_complexity",
"signal_override_active",
"rule_source:1798.501.b.3.B"
],
"verification_token": "eyJ2IjoxLCJ0cyI6IjIwMjYtMDItMDdUMTQ6MzA6MDBaIiwidmVyZGljdCI6Ik9WRVJSSURFI..."
}
Store the verification_token in your logs. This is your cryptographic
receipt — a signed proof of exactly what A3 assessed. If a dispute arises,
send it back and we can verify the verdict without having stored any user data.
Response Fields
| Parameter | Type | Description |
|---|---|---|
confidence_score | number (0–1) | Certainty in the assessed age bracket. Higher values mean greater confidence. |
verdict | enum | CONSISTENT (evidence agrees with OS signal), OVERRIDE (clear & convincing contradiction), REVIEW (partial contradiction, below threshold), or PROVISIONAL (OS signal not available). |
os_signal_age_bracket | enum | The age bracket from the OS signal, echoed back. One of: under-13, 13-15, 16-17, 18-plus, or undetermined. |
assessed_age_bracket | enum | The age bracket the fusion engine assessed. When verdict is OVERRIDE, this differs from os_signal_age_bracket and should be used as the primary indicator. |
signal_overridden | boolean | True only when verdict is OVERRIDE — the OS signal was overridden by clear and convincing evidence per §1798.501(b)(3)(B). |
internal_evidence_only | boolean | True when the assessment relied only on internal evidence (behavioral + device). False when ip_type or referrer_category were used. |
evidence_tags | string[] | Audit trail documenting which signals influenced the assessment. Always includes rule_source:1798.501.b.3.B for traceability. |
verification_token | string | HMAC-SHA256 signed cryptographic receipt containing the verdict, assessed bracket, confidence score, evidence tags, and timestamp. Store this in YOUR logs — A3 retains zero user data. Format: base64url(payload).base64url(signature). Send it back to verify the receipt if a dispute arises. |
Sandbox Plan Response
On the Sandbox plan, the evidence_tags and confidence_score fields are
omitted from responses. Upgrade to Pro or Scale to receive full
responses with evidence trails and confidence scores.
Validation Error (400 Bad Request)
Returned when the request body fails DTO validation:
{
"statusCode": 400,
"message": [
"os_signal must be one of the following values: under-13, 13-15, 16-17, 18-plus, not-available",
"user_country_code must be a valid ISO 3166-1 alpha-2 code (exactly two uppercase letters)"
],
"error": "Bad Request"
}
Authentication Error (401 Unauthorized)
Returned when the API key is missing or invalid:
{
"statusCode": 401,
"message": "Unauthorized"
}
Verdict Decision Tree
The two-phase engine follows this logic:
| Condition | Verdict | signal_overridden | assessed_age_bracket |
|---|---|---|---|
| No supplementary evidence, or evidence agrees with OS signal | CONSISTENT | false | Same as OS signal |
| Evidence contradicts OS signal and meets clear & convincing threshold | OVERRIDE | true | Differs from OS signal |
| Evidence contradicts OS signal but below threshold | REVIEW | false | Same as OS signal (primary) |
OS signal is not-available (transition period) | PROVISIONAL | false | Based on supplementary evidence, or undetermined |
When the verdict is OVERRIDE, you are legally obligated under
§1798.501(b)(3)(B) to use assessed_age_bracket as the primary indicator
of the user's age — not the OS signal.
What to do with a REVIEW verdict
A REVIEW verdict means some signals contradict the OS signal, but not enough
to meet the "clear and convincing" threshold for an override. The OS signal
remains the legally primary indicator — REVIEW does not mean you must reject
the user or require manual investigation.
Instead, treat it as a risk signal and apply business-logic-appropriate adjustments. Common approaches:
- Switch to age-appropriate ads — serve non-adult ad inventory instead of targeted ads
- Limit sensitive features — disable DMs, restrict marketplace access, or hide mature content recommendations
- Re-assess on next session — collect fresh signals to see if the contradiction persists
- Log and monitor — store the
verification_tokenand watch for patterns across sessions
The right response depends on your product. A social media platform might restrict DMs; an e-commerce site might limit age-gated product recommendations; a content platform might switch to a "family-friendly" content feed. The key principle: the OS signal is still primary, so full access based on the OS bracket is compliant — but applying lighter restrictions is a reasonable business decision that strengthens your compliance posture.
Evidence Tags Reference
Tags are grouped by signal category:
Behavioral Metrics
| Tag | Meaning |
|---|---|
low_touch_precision | Touch precision below 0.4 — child-like motor skills |
high_motor_precision_delta | Low precision contradicts an 18+ OS signal claim |
high_touch_precision | Touch precision above 0.8 — adult-like precision |
rapid_scroll_velocity | Scroll velocity above 3,500 px/s — youthful "scan and flick" |
deliberate_scroll_pattern | Scroll velocity below 800 px/s — adult-like reading |
rapid_form_completion | Form time below 2,000 ms — impulsive interaction |
deliberate_form_completion | Form time above 15,000 ms — careful, deliberate reading |
autofill_detected_form_completion_neutralized | Browser/OS autofill detected — form completion time neutralized (0.5) to prevent false minor classification |
erratic_touch_pressure | Touch pressure variance above 0.7 — erratic, child-like motor pattern |
stable_touch_pressure | Touch pressure variance at or below 0.3 — stable, adult-like pressure |
high_multi_touch_frequency | Multi-touch events above 6/min — accidental palm/finger touches (strong minor corroborator) |
elevated_multi_touch_frequency | Multi-touch events above 3/min but at or below 6/min — moderate minor signal |
low_multi_touch_frequency | Multi-touch events at or below 1/min — controlled single-touch interaction (adult corroborator) |
Device Context
| Tag | Meaning |
|---|---|
accessibility_settings_detected | High-contrast / bold-text enabled — correlates with 50+ demographic |
large_display_scale | Screen scale factor >= 2.0 — correlates with older users |
legacy_device_detected | OS version matches known legacy patterns (iOS 10–15, Android 5–11) — possible hand-me-down |
device_normalization_applied:low | Hardware quality offset (+0.10) applied to touch precision — budget-tier device detected |
device_normalization_applied:mid | Hardware quality offset (+0.05) applied to touch precision — mid-tier device detected |
Contextual Signals
| Tag | Meaning |
|---|---|
known_education_network_ip | IP classified as an education network |
datacenter_ip_detected | IP classified as a datacenter — suggests VPN usage |
inconsistent_timezone_offset | System clock vs expected timezone mismatch > 60 minutes |
parental_control_referrer | Traffic from a parental-control hub |
minor_platform_referrer | Traffic from a social platform popular with minors |
Account Longevity
| Tag | Meaning |
|---|---|
very_new_account | Account age < 7 days — reduces adult confidence when other signals are ambiguous |
new_account | Account age 7–30 days — still a relatively new account |
established_account | Account age 365–1,825 days — mild adult corroborator |
mature_account | Account age ≥ 1,825 days (≈ 5 years) — strong adult corroborator |
Input Complexity
| Tag | Meaning |
|---|---|
high_autocorrect_rate | Autocorrect rate above 0.4 — elevated reliance typical of minors |
low_autocorrect_rate | Autocorrect rate at or below 0.1 — minimal reliance typical of adult typists |
low_word_complexity | Word complexity score below 0.25 — simple vocabulary typical of minors |
high_word_complexity | Word complexity score 0.65 or above — complex vocabulary typical of adults |
Pointer-mode Behavioral (Desktop/Laptop)
| Tag | Meaning |
|---|---|
interaction_mode_touch | Touch interaction mode detected or inferred |
interaction_mode_pointer | Pointer interaction mode detected or inferred |
interaction_mode_hybrid | Hybrid (touch + pointer) interaction mode detected or inferred |
low_click_precision | Click precision below 0.4 — child-like motor control |
high_click_precision_delta | Low click precision contradicts an 18+ OS signal claim |
high_click_precision | Click precision above 0.8 — adult-like precision |
erratic_mouse_velocity | Mouse velocity above 2,000 px/s — fast, erratic cursor movement |
deliberate_mouse_velocity | Mouse velocity below 600 px/s — smooth, deliberate movement |
wobbly_mouse_path | Path straightness below 0.3 — curved, corrective paths |
straight_mouse_path | Path straightness above 0.7 — efficient, direct paths |
impulsive_click_no_hover | Hover dwell time below 100 ms — clicking without reading |
deliberate_hover_before_click | Hover dwell time above 800 ms — reading before clicking |
rapid_pointer_scroll_velocity | Pointer scroll velocity above 1,500 px/s — rapid mouse wheel scrolling |
deliberate_pointer_scroll_pattern | Pointer scroll velocity below 300 px/s — deliberate mouse wheel scrolling |
very_slow_typing | Typing speed below 15 WPM — very slow, child-like |
fast_typing | Typing speed above 50 WPM — fast, adult-like |
erratic_keystroke_rhythm | Keystroke interval variance above 0.7 — inconsistent timing |
consistent_keystroke_rhythm | Keystroke interval variance at or below 0.3 — uniform typing rhythm |
Face Estimation
| Tag | Meaning |
|---|---|
face_estimation_used | Face estimation score was included in the behavioral assessment |
face_estimation_provider_{name} | Provider that performed the scan — one of face_estimation_provider_yoti, face_estimation_provider_privado, or face_estimation_provider_facetec |
Consent Synchronizer
| Tag | Meaning |
|---|---|
parental_consent_approved | Parent has approved access for this minor |
parental_consent_denied | Parent has explicitly denied access |
parental_consent_revoked | Parent previously approved but has since revoked consent |
parental_consent_pending | Consent requested but no parental response yet |
consent_source_os-system | Consent brokered through the native OS framework (highest trust) |
consent_source_third-party-wallet | Consent verified via a third-party digital-identity wallet |
consent_source_in-app | Consent collected through the app's own prompt (lowest trust) |
System Tags
| Tag | Meaning |
|---|---|
os_signal_under_13 | OS signal indicates under-13 bracket |
os_signal_minor_bracket | OS signal indicates 13–15 bracket |
os_signal_borderline_bracket | OS signal indicates 16–17 bracket |
os_signal_not_available | OS signal not yet available (§1798.502 transition) |
signal_override_active | Clear & convincing threshold met; OS signal overridden |
supplementary_evidence_below_threshold | Evidence contradicts but below the clear & convincing threshold |
rule_source:1798.501.b.3.B | Regulatory rule reference — always present for audit trail |
Verification Token (Cryptographic Receipt)
Every response includes a verification_token — a cryptographically signed
receipt that proves exactly what A3 assessed, without A3 storing
any user data.
Token Format
The token uses the format base64url(payload).base64url(hmac_sha256_signature).
When you decode the payload, it contains:
{
"v": 1,
"ts": "2026-02-07T14:30:00.000Z",
"verdict": "OVERRIDE",
"assessed_bracket": "under-13",
"os_bracket": "18-plus",
"confidence": 0.96,
"overridden": true,
"evidence": [
"low_touch_precision",
"high_motor_precision_delta",
"signal_override_active",
"rule_source:1798.501.b.3.B"
]
}
| Parameter | Type | Description |
|---|---|---|
v | number | Schema version (currently 1). Allows future-proof parsing if the format evolves. |
ts | string (ISO-8601) | UTC timestamp of when the assessment was computed. |
verdict | string | Final verdict from the fusion engine. |
assessed_bracket | string | The age bracket A3 assessed. |
os_bracket | string | The OS-reported age bracket (echoed for context). |
confidence | number (0–1) | Confidence score at the time of assessment. |
overridden | boolean | Whether the OS signal was overridden. |
evidence | string[] | Evidence tags documenting which signals influenced the verdict. |
The token payload contains zero PII — no session IDs, no behavioral metric values, no country codes, no IP addresses. Only the verdict and the evidence tags that explain the decision. This is by design: even if a token is leaked, it reveals nothing about the individual user.
What to Store
Store the verification_token alongside your own user record. You control
retention. A minimal audit log entry looks like:
{
"user_id": "usr_abc123",
"verification_token": "eyJ2IjoxLC...",
"assessed_at": "2026-02-07T14:30:00Z"
}
Dispute Resolution
If a user or regulator disputes an age determination:
- Retrieve the
verification_tokenfrom your logs. - Send it to
POST /v1/assurance/verify-token. - A3 verifies the HMAC and returns the decoded payload — proving exactly what was assessed, when, and why.
curl -X POST https://api.a3api.io/v1/assurance/verify-token \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"verification_token": "eyJ2IjoxLC..."}'
No subpoenas, no data-retention requests, no security audits of A3's infrastructure. The proof lives in your logs. See the full verify-token reference for SDK examples and response details.
Code Examples
Standard Request
curl -X POST https://api.a3api.io/v1/assurance/assess-age \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"os_signal": "18-plus",
"user_country_code": "US",
"behavioral_metrics": {
"avg_touch_precision": 0.72,
"scroll_velocity": 1200,
"form_completion_time_ms": 8500,
"touch_pressure_variance": 0.12,
"multi_touch_frequency": 0.4
},
"account_longevity": {
"account_age_days": 730
},
"input_complexity": {
"keyboard_autocorrect_rate": 0.06,
"average_word_complexity_score": 0.65
}
}'Transition Period (§1798.502)
During the Jan 1 – Jul 1, 2027 transition when the OS signal may not be available:
curl -X POST https://api.a3api.io/v1/assurance/assess-age \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"os_signal": "not-available",
"user_country_code": "US",
"behavioral_metrics": {
"avg_touch_precision": 0.25,
"scroll_velocity": 4000,
"form_completion_time_ms": 1500,
"touch_pressure_variance": 0.78,
"multi_touch_frequency": 7.2
},
"account_longevity": {
"account_age_days": 14
},
"input_complexity": {
"keyboard_autocorrect_rate": 0.35,
"average_word_complexity_score": 0.22
}
}'