Yesterday's list_calendars returned a list of dicts. Each dict had a calendar ID — a string like primary or a long group.calendar.google.com address. You now have the keys. What would you do with them?
I'd pass one of those IDs into something. list_calendars gave me the keys — now I want to see what's actually booked in each calendar, not just its name.
Exactly. Pass that calendar ID plus a cutoff time to GOOGLECALENDAR_FIND_EVENT and you get back every event scheduled after that moment. The cutoff is an ISO 8601 string — a format your QBR calendar invites already use under the hood:
result = toolset.execute_action(Action.GOOGLECALENDAR_FIND_EVENT, {
"calendar_id": cal_id,
"time_min": time_min,
})What does an ISO 8601 string actually look like? I've seen it mentioned but I always copied it from somewhere else.
It's just a timestamp: "2026-04-19T09:00:00Z". The T separates date from time, the Z means UTC. You can also pass "2026-04-19T09:00:00+05:30" for IST. Any calendar invite you've ever received stores its start time in this exact format — you've been reading ISO 8601 for years without knowing the name.
So the string I copy from a meeting invite is already the right format? I expected to need a datetime library or some conversion step.
No conversion needed if you start from a real timestamp. Where it matters is when you build the string in code — then datetime.utcnow().isoformat() + "Z" gives you right now. Composio reads it, your Calendar responds. Here's the full function:
def find_events(cal_id: str, time_min: str) -> list:
result = toolset.execute_action(Action.GOOGLECALENDAR_FIND_EVENT, {
"calendar_id": cal_id,
"time_min": time_min,
})
events = result.get("items", [])
print(f"Found {len(events)} events after {time_min}")
return eventsI can pass any calendar ID from list_calendars straight into find_events. That's a two-call pipeline — list the calendars, pick one, pull its events. This is already a useful Monday morning check.
And the event dicts you get back carry everything you need — title, start time, attendees, meeting link. The next function you write can read any of those fields and do something with them.
GOOGLECALENDAR_FIND_EVENT takes two parameters: a calendar ID and a time_min cutoff. Every event starting on or after that cutoff comes back in result["items"].
| Format | Example |
|---|---|
| UTC | "2026-04-19T09:00:00Z" |
| With offset | "2026-04-19T09:00:00+05:30" |
To build the cutoff in code: datetime.utcnow().isoformat() + "Z" gives the current moment in UTC.
.get("items", []) againWhen a calendar has no events after time_min, the API may omit the items key. .get("items", []) returns an empty list instead of a KeyError — the same reflex from Day 10.
Yesterday's list_calendars returned a list of dicts. Each dict had a calendar ID — a string like primary or a long group.calendar.google.com address. You now have the keys. What would you do with them?
I'd pass one of those IDs into something. list_calendars gave me the keys — now I want to see what's actually booked in each calendar, not just its name.
Exactly. Pass that calendar ID plus a cutoff time to GOOGLECALENDAR_FIND_EVENT and you get back every event scheduled after that moment. The cutoff is an ISO 8601 string — a format your QBR calendar invites already use under the hood:
result = toolset.execute_action(Action.GOOGLECALENDAR_FIND_EVENT, {
"calendar_id": cal_id,
"time_min": time_min,
})What does an ISO 8601 string actually look like? I've seen it mentioned but I always copied it from somewhere else.
It's just a timestamp: "2026-04-19T09:00:00Z". The T separates date from time, the Z means UTC. You can also pass "2026-04-19T09:00:00+05:30" for IST. Any calendar invite you've ever received stores its start time in this exact format — you've been reading ISO 8601 for years without knowing the name.
So the string I copy from a meeting invite is already the right format? I expected to need a datetime library or some conversion step.
No conversion needed if you start from a real timestamp. Where it matters is when you build the string in code — then datetime.utcnow().isoformat() + "Z" gives you right now. Composio reads it, your Calendar responds. Here's the full function:
def find_events(cal_id: str, time_min: str) -> list:
result = toolset.execute_action(Action.GOOGLECALENDAR_FIND_EVENT, {
"calendar_id": cal_id,
"time_min": time_min,
})
events = result.get("items", [])
print(f"Found {len(events)} events after {time_min}")
return eventsI can pass any calendar ID from list_calendars straight into find_events. That's a two-call pipeline — list the calendars, pick one, pull its events. This is already a useful Monday morning check.
And the event dicts you get back carry everything you need — title, start time, attendees, meeting link. The next function you write can read any of those fields and do something with them.
GOOGLECALENDAR_FIND_EVENT takes two parameters: a calendar ID and a time_min cutoff. Every event starting on or after that cutoff comes back in result["items"].
| Format | Example |
|---|---|
| UTC | "2026-04-19T09:00:00Z" |
| With offset | "2026-04-19T09:00:00+05:30" |
To build the cutoff in code: datetime.utcnow().isoformat() + "Z" gives the current moment in UTC.
.get("items", []) againWhen a calendar has no events after time_min, the API may omit the items key. .get("items", []) returns an empty list instead of a KeyError — the same reflex from Day 10.
Create a free account to get started. Paid plans unlock all tracks.