List events
curl --request GET \
--url https://api.yousonder.com/v1/events \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.yousonder.com/v1/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.yousonder.com/v1/events"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"success": true,
"data": [
{
"id": "evt_1042",
"type": "video.milestone_reached",
"occurred_at": "2026-09-15T12:00:00.000Z",
"recorded_at": "2026-09-15T12:21:40.000Z",
"video": {
"id": "9f3c2a71-4b6e-4d8a-a1c5-7e2b9d0f3a64",
"title": "Your kid isn't lazy. They're exhausted.",
"book": {
"id": "5b1d7c2e-8f0a-4c1b-9d3e-2a6f4b8c9e01",
"title": "The Quiet Hours"
}
},
"views": 10412,
"milestone": 10000,
"viral": null
},
{
"id": "evt_1043",
"type": "video.went_viral",
"occurred_at": "2026-09-15T14:00:00.000Z",
"recorded_at": "2026-09-15T14:22:03.000Z",
"video": {
"id": "9f3c2a71-4b6e-4d8a-a1c5-7e2b9d0f3a64",
"title": "Your kid isn't lazy. They're exhausted.",
"book": {
"id": "5b1d7c2e-8f0a-4c1b-9d3e-2a6f4b8c9e01",
"title": "The Quiet Hours"
}
},
"views": 12840,
"milestone": null,
"viral": {
"threshold": 12000,
"author_median_views": 1200,
"compared_videos": 23
}
}
],
"has_more": false,
"next_cursor": "evt_1043"
}{
"success": false,
"error": {
"code": "invalid_parameter",
"message": "after must be an event id this API returned, like evt_1234."
}
}{
"success": false,
"error": {
"code": "invalid_api_key",
"message": "That API key is not valid. Check it was copied in full, or create a new one in Sonder under Settings → API keys."
}
}{
"success": false,
"error": {
"code": "plan_inactive",
"message": "This Sonder account doesn't have an active plan, so its data isn't shared. The key works again as soon as the plan is active."
}
}{
"success": false,
"error": {
"code": "rate_limited",
"message": "Too many requests. Each key allows 60 a minute; try again after the time in the Retry-After header."
}
}Views
List events
Every time one of the author’s videos went viral or passed a view milestone, oldest first. To poll, save next_cursor and pass it as after next time: you get only what happened since.
GET
/
events
List events
curl --request GET \
--url https://api.yousonder.com/v1/events \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.yousonder.com/v1/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.yousonder.com/v1/events"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"success": true,
"data": [
{
"id": "evt_1042",
"type": "video.milestone_reached",
"occurred_at": "2026-09-15T12:00:00.000Z",
"recorded_at": "2026-09-15T12:21:40.000Z",
"video": {
"id": "9f3c2a71-4b6e-4d8a-a1c5-7e2b9d0f3a64",
"title": "Your kid isn't lazy. They're exhausted.",
"book": {
"id": "5b1d7c2e-8f0a-4c1b-9d3e-2a6f4b8c9e01",
"title": "The Quiet Hours"
}
},
"views": 10412,
"milestone": 10000,
"viral": null
},
{
"id": "evt_1043",
"type": "video.went_viral",
"occurred_at": "2026-09-15T14:00:00.000Z",
"recorded_at": "2026-09-15T14:22:03.000Z",
"video": {
"id": "9f3c2a71-4b6e-4d8a-a1c5-7e2b9d0f3a64",
"title": "Your kid isn't lazy. They're exhausted.",
"book": {
"id": "5b1d7c2e-8f0a-4c1b-9d3e-2a6f4b8c9e01",
"title": "The Quiet Hours"
}
},
"views": 12840,
"milestone": null,
"viral": {
"threshold": 12000,
"author_median_views": 1200,
"compared_videos": 23
}
}
],
"has_more": false,
"next_cursor": "evt_1043"
}{
"success": false,
"error": {
"code": "invalid_parameter",
"message": "after must be an event id this API returned, like evt_1234."
}
}{
"success": false,
"error": {
"code": "invalid_api_key",
"message": "That API key is not valid. Check it was copied in full, or create a new one in Sonder under Settings → API keys."
}
}{
"success": false,
"error": {
"code": "plan_inactive",
"message": "This Sonder account doesn't have an active plan, so its data isn't shared. The key works again as soon as the plan is active."
}
}{
"success": false,
"error": {
"code": "rate_limited",
"message": "Too many requests. Each key allows 60 a minute; try again after the time in the Retry-After header."
}
}Authorizations
An API key from Sonder → Settings → API keys, like sonder_live_….
Query Parameters
Return events after this one (next_cursor from your last call). Leave out to start from the beginning.
Events per page, 1–100.
Required range:
1 <= x <= 100