Every request and response on this page
Each drawer is closed. Open one to see the HTTP request, the trimmed response, and the script that makes the call.
Calendar and events
Developer: Calendar feed request and response
GetSchedule: request
GET https://api.awsevents.com/v1/events/reinvent2026/schedule
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"schedule": {
"favorites": [
"1790358246739001ipkp",
"1780441498719001G3Dy"
],
"personalTime": [],
"reserved": [
"1780442252767001cb2W",
"1780441496076001GRZY"
]
}
}
On this page: export_week.py reads these ids, resolves each one against the session catalog, and writes week.json, the file this page reads for held sessions, shortlist rows, and open windows.
At re:Invent: Your reserved seats and your favorites arrive in one request, so you see what is booked before you plan anything else at re:Invent.
Script: cli/reinvent26/export_week.py
Developer: ListEvents and GetEvent request and response
ListEvents (no token): request
GET https://api.awsevents.com/v1/events
Accept: application/json
Response, trimmed to the fields this page uses
{
"items": [
{
"eventId": "reinvent2026"
}
]
}
GetEvent: request
GET https://api.awsevents.com/v1/events/reinvent2026
Accept: application/json
Response, trimmed to the fields this page uses
{
"event": {
"eventId": "reinvent2026",
"eventName": "re:Invent",
"timeZone": "America/Los_Angeles"
}
}
On this page: eventId goes into every later path, and timeZone is why every time on this page reads as Las Vegas time.
At re:Invent: You know which clock the schedule runs on before you set a meeting time with someone outside Las Vegas.
Script: cli/reinvent26/api.py
Monday, November 30
Developer: ListSessions request and response
ListSessions, first page: request
GET https://api.awsevents.com/v1/events/reinvent2026/sessions?includeAbstracts=false&maxResults=100
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"nextToken": "$NEXT_TOKEN",
"sessions": [
{
"abbreviation": "STG363",
"level": "300 – Advanced",
"room": "Level 3 | Room 306",
"sessionId": "1780442252767001cb2W",
"sessionTime": {
"date": "2026-11-30",
"length": "60",
"time": "08:30"
},
"title": "Modernizing VMware workloads with Amazon FSx for NetApp ONTAP",
"type": "Chalk talk",
"venue": "MGM Grand"
},
{
"abbreviation": "INV530-R1",
"level": "500 – Distinguished",
"room": "Level 3 | Room 350",
"sessionId": "1780441496076001GRZY",
"sessionTime": {
"date": "2026-11-30",
"length": "60",
"time": "11:30"
},
"title": "EC2 at 20: Rebuilding the control plane while it is running",
"type": "Chalk talk",
"venue": "MGM Grand"
}
]
}
On this page: Each reserved id from GetSchedule is matched to a row here by sessionId; abbreviation, title, venue, room, and sessionTime become the Time, What, and Where cells of the Monday table.
At re:Invent: Every session carries its room and start time, so you see what sits next to your seat before you walk over.
Script: cli/reinvent26/api.py
Developer: GetSession request and response
GetSession: request
GET https://api.awsevents.com/v1/events/reinvent2026/sessions/1780442252767001cb2W
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"session": {
"abbreviation": "STG363",
"seatAvailability": "unavailable",
"sessionId": "1780442252767001cb2W"
}
}
On this page: seatAvailability is the one field only GetSession returns; week.json stores it as seat, and STG363 reads unavailable there.
At re:Invent: You learn whether a session still has seats before you spend time walking to its room.
Script: cli/reinvent26/seats.py
Developer: CreatePersonalTime request and response
CreatePersonalTime: request
POST https://api.awsevents.com/v1/events/reinvent2026/personal-time
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Content-Type: application/json
{
"description": "Open window near MGM Grand",
"endDateTime": "2026-11-30T11:30:00",
"location": "MGM Grand",
"startDateTime": "2026-11-30T09:30:00",
"title": "Open window, morning"
}
Response
Empty body. The new personalTimeId is read back from GetSchedule.
On this page: The 09:30 to 11:30 open row in the Monday table is this window; the call writes the same span onto the attendee calendar.
At re:Invent: Free time shows as busy on your re:Invent schedule, so nothing else gets booked into it.
Script: cli/reinvent26/api.py
Tuesday, December 1
Developer: GetSchedule request and response
GetSchedule: request
GET https://api.awsevents.com/v1/events/reinvent2026/schedule
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"schedule": {
"favorites": [],
"personalTime": [],
"reserved": [
"1790358232199001iAvH",
"1780442244219001cHBq",
"1790358240915001ipNX"
]
}
}
On this page: schedule.py turns each reserved id into a start and an end and flags any pair that overlaps; the three Tuesday rows (IND359-R1, IND322-R, IND3304-R1) come from these ids.
At re:Invent: A clash between two seats shows up before you arrive at a room you cannot sit in.
Script: cli/reinvent26/schedule.py
Developer: ListSessions request and response
ListSessions, next page: request
GET https://api.awsevents.com/v1/events/reinvent2026/sessions?includeAbstracts=false&maxResults=100&nextToken=$NEXT_TOKEN
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"nextToken": "$NEXT_TOKEN",
"sessions": [
{
"abbreviation": "IND322-R",
"level": "300 – Advanced",
"room": "Level 1 | Academy 414",
"sessionId": "1780442244219001cHBq",
"sessionTime": {
"date": "2026-12-01",
"length": "60",
"time": "15:00"
},
"title": "Physical AI in Telecom: A Framework for Workload Placement",
"type": "Chalk talk",
"venue": "Caesars Forum"
}
]
}
On this page: iter_sessions repeats this call until nextToken is missing, because a short page is not the last page; the cards for IND322-R and the other Tuesday sessions are read from the full catalog it builds.
At re:Invent: You can browse the whole catalog, not the first hundred sessions, to find talks at the venue you are already in.
Script: cli/reinvent26/api.py
Developer: UpdatePersonalTime request and response
UpdatePersonalTime: request
PUT https://api.awsevents.com/v1/events/reinvent2026/personal-time/$BLOCK_ID
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Content-Type: application/json
{
"description": "Open window near Caesars Forum",
"endDateTime": "2026-12-01T15:00:00",
"location": "Caesars Forum",
"startDateTime": "2026-12-01T13:00:00",
"title": "Open window, lunch"
}
Response
No fields read. The call replaces every field of the block; omitting location sends null and clears it.
On this page: The Tuesday 13:00 to 15:00 open row is this block; a second sync sends a PUT to the stored personalTimeId instead of creating a duplicate.
At re:Invent: Changing a plan edits one calendar block, so you never end up with two.
Script: cli/reinvent26/personal_time.py
Wednesday, December 2
Developer: ListSessions request and response
ListSessions, first page: request
GET https://api.awsevents.com/v1/events/reinvent2026/sessions?includeAbstracts=false&maxResults=100
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"nextToken": "$NEXT_TOKEN",
"sessions": [
{
"abbreviation": "CMP353-R",
"level": "300 – Advanced",
"room": "Level 1 | Boulevard 167",
"sessionId": "1780441498886001Gubu",
"sessionTime": {
"date": "2026-12-02",
"length": "60",
"time": "10:00"
},
"title": "EC2 Spot: Capacity patterns and strategies from the team that runs it",
"type": "Chalk talk",
"venue": "MGM Grand"
},
{
"abbreviation": "INV527",
"level": "500 – Distinguished",
"room": "Level 3 | Room 353",
"sessionId": "1780441494886001G2fr",
"sessionTime": {
"date": "2026-12-02",
"length": "60",
"time": "10:30"
},
"title": "World models for indoor robots: what breaks and why",
"type": "Chalk talk",
"venue": "MGM Grand"
}
]
}
The window filter runs in the script. The request carries no time parameter.
On this page: The slots search keeps rows whose sessionTime sits inside the Wednesday 10:00 to 13:30 window and clashes with no held seat; that is how the planner finds backups for the open row.
At re:Invent: You see which sessions fit a gap in your day without checking each start time by hand.
Script: cli/reinvent26/cli.py
Developer: CancelReservation request and response
CancelReservation: request
DELETE https://api.awsevents.com/v1/events/reinvent2026/reservations/$SESSION_ID
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response
No fields read. A 404 means the seat is already released, and the planner treats that as done.
On this page: A card stays under Held only while its id is in reserved, so cancelling removes the id from GetSchedule and the card drops out on the next export.
At re:Invent: A seat you will not use goes back to the pool for another attendee.
Script: cli/reinvent26/api.py
Developer: DeletePersonalTime request and response
DeletePersonalTime: request
DELETE https://api.awsevents.com/v1/events/reinvent2026/personal-time/$BLOCK_ID
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response
No fields read. A 404 means the block is already gone.
On this page: The Wednesday open window stays in the table above; the delete clears only the calendar entry the planner created, tracked by personalTimeId, and leaves hand-made entries alone.
At re:Invent: A block you no longer need leaves your schedule without touching anything else on it.
Script: cli/reinvent26/personal_time.py
Thursday, December 3
Developer: CreateReservations request and response
CreateReservations: request
POST https://api.awsevents.com/v1/events/reinvent2026/reservations
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Content-Type: application/json
{
"sessionIds": [
"$SESSION_ID"
]
}
Response, trimmed to the fields this page uses
{
"result": {
"failed": [
{
"code": "sessionFull",
"sessionId": "1780442234745001cUk8"
}
],
"successful": []
}
}
On this page: fill.py sends one id per call and reads result.successful; a session joins reserved only when its id lands there, which is how a row becomes held in the Thursday table.
At re:Invent: A booking you can confirm: sessionFull tells you to move to the next option at once.
Script: cli/reinvent26/fill.py
Developer: ListSessions with abstracts request and response
ListSessions with abstracts: request
GET https://api.awsevents.com/v1/events/reinvent2026/sessions?includeAbstracts=true&maxResults=100
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"nextToken": "$NEXT_TOKEN",
"sessions": [
{
"abbreviation": "STG412",
"abstract": "(abstract text)",
"level": "400 – Expert",
"sessionId": "1780442286150001czBp",
"title": "Find and fix storage bottlenecks for self-managed OLTP on EC2 with EBS"
},
{
"abbreviation": "MAM416",
"abstract": "(abstract text)",
"level": "400 – Expert",
"sessionId": "1780442282512001ctMv",
"title": "Free your .NET app from Windows licensing with AI-powered portability"
}
]
}
On this page: The shortlist keeps rows whose level starts with 400 and reads the abstract field; STG412, SEC401, and MAM416 below are all 400 Expert.
At re:Invent: An abstract lets you judge a two-hour workshop before you commit the time.
Script: cli/reinvent26/cli.py
Developer: GetSchedule request and response
GetSchedule, read personal time back: request
GET https://api.awsevents.com/v1/events/reinvent2026/schedule
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"schedule": {
"personalTime": [
{
"endDateTime": "2026-12-03T15:30:00",
"personalTimeId": "$BLOCK_ID",
"startDateTime": "2026-12-03T14:00:00",
"title": "Open window, afternoon"
}
]
}
}
On this page: Create returns no body, so the planner takes personalTimeId from here and uses it for later PUT and DELETE calls on the Thursday 14:00 to 15:30 window.
At re:Invent: Calendar blocks and sessions sit in one list, so you see free time and booked time together.
Script: cli/reinvent26/personal_time.py
Friday, December 4
Developer: GetSchedule request and response
GetSchedule: request
GET https://api.awsevents.com/v1/events/reinvent2026/schedule
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"schedule": {
"favorites": [
"1790358246739001ipkp"
],
"personalTime": [],
"reserved": [
"1790358236486001iasR"
]
}
}
On this page: findme.py sorts the reserved sessions by start and lists every gap of 60 minutes or more as an open window a visitor can use.
At re:Invent: A person who wants to meet you at re:Invent sees when you are between sessions.
Script: cli/reinvent26/findme.py
Developer: ListSessions and CreateFavorites request and response
ListSessions: request
GET https://api.awsevents.com/v1/events/reinvent2026/sessions?includeAbstracts=false&maxResults=100
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"nextToken": "$NEXT_TOKEN",
"sessions": [
{
"abbreviation": "CMP318-R1",
"services": [
"Amazon Elastic Compute Cloud (Amazon EC2)"
],
"sessionId": "1790358246739001ipkp",
"title": "Build your iOS CI/CD pipeline with AI agents on EC2 Mac",
"topics": [
"Compute",
"Developer Tools"
]
}
]
}
CreateFavorites, optional last step: request
POST https://api.awsevents.com/v1/events/reinvent2026/favorites
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Content-Type: application/json
{
"sessionIds": [
"1790358246739001ipkp"
]
}
Response, trimmed to the fields this page uses
{
"result": {
"failed": [],
"successful": [
"1790358246739001ipkp"
]
}
}
The service list comes from your own AWS account, not from the Events API. The API has no keyword parameter in api.py: the script lists the catalog and matches keywords itself.
On this page: Services such as Amazon EC2 map to keywords in the script, sessions whose title, topics, or services match rank first, and the Friday shortlist row for CMP318-R1 comes from that ranking.
At re:Invent: You get sessions picked for the services you run, without reading thousands of titles.
Script: cli/reinvent26/cli.py
Developer: CreatePersonalTime request and response
CreatePersonalTime: request
POST https://api.awsevents.com/v1/events/reinvent2026/personal-time
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Content-Type: application/json
{
"description": "back at the Venetian after the session: last hallway window",
"endDateTime": "2026-12-04T11:00:00",
"startDateTime": "2026-12-04T10:00:00",
"title": "Brunch"
}
Response
Empty body. The planner reads the new personalTimeId from GetSchedule and stores it for the next run.
On this page: The Friday 10:00 brunch block on the calendar is this entry; held sessions are skipped and times round to 5 minutes, starts down and ends up.
At re:Invent: Meals, windows, and travel sit on your own calendar next to your sessions.
Script: cli/reinvent26/personal_time.py
Seats
Developer: GetSession, CreateReservations and CancelReservation request and response
GetSession: request
GET https://api.awsevents.com/v1/events/reinvent2026/sessions/$SESSION_ID
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response, trimmed to the fields this page uses
{
"session": {
"abbreviation": "IND322-R",
"seatAvailability": "veryLimited",
"sessionId": "1780442244219001cHBq"
}
}
CreateReservations: request
POST https://api.awsevents.com/v1/events/reinvent2026/reservations
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Content-Type: application/json
{
"sessionIds": [
"$SESSION_ID"
]
}
Response, trimmed to the fields this page uses
{
"result": {
"failed": [
{
"code": "sessionFull",
"sessionId": "1780442234745001cUk8"
}
],
"successful": []
}
}
CancelReservation: request
DELETE https://api.awsevents.com/v1/events/reinvent2026/reservations/$SESSION_ID
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response
No fields read. A 404 means the seat is already released.
HTTP 200 on a reservation does not mean the session was booked. Read result.failed and result.successful, then confirm with GetSchedule.
On this page: The first list below holds sessions whose seatAvailability reads available, limited, or veryLimited, and the second holds sessions that are not reservable (walk-up); GetSession is the call that produces that value.
At re:Invent: You see the seat state before you walk over, and you reserve the moment a seat opens.
Script: cli/reinvent26/seats.py
Community favorites
Developer: CreateFavorites and RemoveFavorite request and response
CreateFavorites: request
POST https://api.awsevents.com/v1/events/reinvent2026/favorites
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Content-Type: application/json
{
"sessionIds": [
"$SESSION_ID_1",
"$SESSION_ID_2"
]
}
Response, trimmed to the fields this page uses
{
"result": {
"failed": [],
"successful": [
"1790358246739001ipkp",
"1780441498719001G3Dy"
]
}
}
RemoveFavorite: request
DELETE https://api.awsevents.com/v1/events/reinvent2026/favorites/$SESSION_ID_1
Accept: application/json
Authorization: Bearer $ACCESS_TOKEN
Response
No fields read. A 404 means the favorite is already gone.
One call takes up to 10 session ids.
On this page: The community picks above are stored as favorites, so they appear in GetSchedule under favorites and never under reserved.
At re:Invent: You mark sessions to revisit without holding a seat from anyone else.
Script: cli/reinvent26/api.py