Screentime.OverrideResult
Emitted when a screentime override request is resolved: the parent granted it, the parent denied it, or it expired unanswered. This is the answer to a /screentime/request-override call, and it's the only way your product learns the outcome.
k-ID delivers Screentime.OverrideResult only to endpoints subscribed to it, and drops it for the rest without a delivery attempt or an error. Select it for your endpoint on the product's Developer Settings page. See Before you start.
One request produces exactly one Screentime.OverrideResult. Correlate it with the request through data.id, which is the id that /screentime/request-override returned.
Fields
| Field | Type | Required | Description |
|---|---|---|---|
eventType | string | yes | Always "Screentime.OverrideResult" |
data | object | yes | Override result data |
data.id | string (UUID) | yes | Override request ID, matching the id returned by /screentime/request-override |
data.sessionId | string (UUID) | yes | Session ID the override was requested for |
data.productId | number | yes | Product ID |
data.status | string | yes | granted, denied, or expired |
data.state | object | yes | Screentime state after the decision, in the same shape as the GET /screentime/get-state response |
Example
{
"eventType": "Screentime.OverrideResult",
"data": {
"id": "2e9b7c41-8d6a-4f23-bc15-3a8e9d0f1b62",
"sessionId": "b1a6482d-5242-4b4a-aa88-3fa52595a672",
"productId": 42,
"status": "granted",
"state": {
"enabled": true,
"access": {
"allowed": true
},
"state": {
"timeUsedTodayMinutes": 120,
"continuousUsageMinutes": 45,
"timeLimitTodayMinutes": 150,
"timeRemainingTodayMinutes": 30,
"dayResetsAt": "2026-06-25T00:00:00Z"
},
"schedule": {
"timezone": "UTC",
"breakReminderIntervalMinutes": 45,
"dailyLimits": [
{ "day": "mon", "limitMinutes": 120 },
{ "day": "sat", "limitMinutes": 180 }
],
"quietHours": [
{
"name": "Bedtime",
"days": ["mon", "tue", "wed", "thu", "fri"],
"start": "21:00",
"end": "07:00"
}
]
}
}
}
}
A denied result carries the same shape with the rules unchanged:
{
"eventType": "Screentime.OverrideResult",
"data": {
"id": "2e9b7c41-8d6a-4f23-bc15-3a8e9d0f1b62",
"sessionId": "b1a6482d-5242-4b4a-aa88-3fa52595a672",
"productId": 42,
"status": "denied",
"state": {
"enabled": true,
"access": {
"allowed": false,
"details": {
"reason": "limit_reached",
"resumesAt": "2026-06-25T00:00:00Z"
}
},
"state": {
"timeUsedTodayMinutes": 120,
"continuousUsageMinutes": 45,
"timeLimitTodayMinutes": 120,
"timeRemainingTodayMinutes": 0,
"dayResetsAt": "2026-06-25T00:00:00Z"
}
}
}
}
Statuses
status | Meaning |
|---|---|
granted | The parent approved the request. Extra minutes were added to today's allowance. |
denied | The parent declined the request. Today's rules are unchanged. |
expired | The parent didn't answer within 24 hours of the request. Today's rules are unchanged. |
expired isn't an error and isn't a delivery failure. A player can submit a fresh request after one expires.
The state is in the payload
data.state carries the same shape as the GET /screentime/get-state response, computed after the decision was applied. You don't need a follow-up fetch to discover whether the player can play again: read state.access.allowed and, on a grant, the raised state.state.timeLimitTodayMinutes and state.state.timeRemainingTodayMinutes.
A granted override raises today's limit, so access.allowed can flip back to true without any further event. There is no second Screentime.LimitReached when the player uses up the extra time and hits the raised limit, because that event fires at most once per player per day.