Skip to main content

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.

Subscribe your endpoint to this event

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

FieldTypeRequiredDescription
eventTypestringyesAlways "Screentime.OverrideResult"
dataobjectyesOverride result data
data.idstring (UUID)yesOverride request ID, matching the id returned by /screentime/request-override
data.sessionIdstring (UUID)yesSession ID the override was requested for
data.productIdnumberyesProduct ID
data.statusstringyesgranted, denied, or expired
data.stateobjectyesScreentime 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

statusMeaning
grantedThe parent approved the request. Extra minutes were added to today's allowance.
deniedThe parent declined the request. Today's rules are unchanged.
expiredThe 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.