All nodes/Integrations/Calendar
Calendar Query
REPORT calendar-query for VEVENT or VTODO in a time range.
Type in the graph: calendar_query
Exec
An error branch can be enabled (expose_error_output) to handle failures on their own path.
Ports can be split into separate execution and data handles.
Try it
Minimal working workflow
- Execute
- Data
- Execute + Data
Pick your own connection or knowledge base first — the graph carries REPLACE_ME.
When to use it
Almost every calendar graph starts here: the other nodes work by event href, and this is the
node that produces one. When the addresses are already known, fetch the bodies in a single
request with Calendar Multiget. When all you need are busy
intervals, with no titles or attendees, use
Calendar Free/Busy.
How it works
The node queries one collection over a time range. Start and end are required, in ISO 8601
(2026-07-01T00:00:00Z); a value without a time zone is read as UTC, the end must be after the
start, and the range may not exceed 366 days. The fields are templates, so the bounds are usually
computed further up the graph.
A blank “Calendar collection URL” means the default calendar of the connection. “Component type” decides what to look for — events (VEVENT) or tasks (VTODO) — one of the two per run.
The output carries component and events: an array of records with href, etag, uid,
summary, dtstart, dtend, all_day, timezone, rrule, rdates, exdates,
recurrence_id, status, sequence and last_modified. In a template:
{{ nodes.<id>.output.events[0].href }}.
Common mistakes
- An end given as a plain date cuts off the last day.
2026-07-31reads as midnight, so events on 31 July fall outside the range. Write2026-07-31T23:59:59Z. - A recurring event is one record. The node does not expand a series into occurrences: the
rule sits in
rrule, anddtstart/dtenddescribe the resource’s first component. The full document, overrides included, comes from Get Calendar Event. - Beyond 500 events the list is truncated silently. There is no error — narrow the range or split it into chunks.
- A range longer than 366 days. The node stops with a
VALIDATIONcode before sending the request. - An empty result is a success. The node finishes with
events: []; branch on “found / not found” with an If / Else node, not with the error output.
Inputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Calendar storecalendar_store | Datadata | — | required |
Outputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Successoutput | Execute + Dataexecute_data | object | |
Erroron_error | Execute + Dataexecute_data | — | shown when expose_error_output = true |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
CalDAV connectionconnection_id | string | "" | Saved workspace CalDAV connection, so a simple calendar graph does not need a separate CalDAV Config node. A node wired to the 'calendar_store' port wins over this field. connection: caldavoverridden by port: calendar_store |
Calendar collection URLcalendar_url | string | "" | Collection URL to work with, e.g. https://cloud.example/remote.php/dav/calendars/user/personal/. Leave empty to use the default calendar URL of the connected CalDAV connection; discover URLs with the List Calendars node. supports templates |
Range starttime_start | string | "" | Start of the range, ISO 8601, inclusive. Example: 2026-07-01T00:00:00Z (a naive value is read as UTC). supports templates |
Range endtime_end | string | "" | End of the range, ISO 8601. Must be after the start; the range may not exceed 366 days. Example: 2026-07-31T23:59:59Z supports templates |
Component typecomponent | string | VEVENT | What to look for: calendar events (VEVENT) or tasks (VTODO). Options: |
Shared fields
Every node has these three — the platform adds them, not the node author.
expose_error_output— When enabled, show an execution output to connect nodes that run if this step fails.split_ports_in— Show separate execution and data input handles instead of one combined port.split_ports_out— Show separate execution and data output handles instead of one combined port.