{"uid":"cap_FEFY3or6ber9soFVBAd_4","slug":"duo-data-utilities-rfc-5545-rrule-expander-357e44f5","name":"Duo Data Utilities – RFC 5545 RRULE Expander","description":"Expand an RFC 5545 recurrence rule into concrete occurrence timestamps. Accepts an RRULE string with DTSTART, an IANA time zone, and optional EXDATE and RDATE lists, and returns up to 200 occurrences as both local wall-clock times and UTC instants. Supports FREQ, INTERVAL, COUNT, UNTIL, BYDAY, BYMONTHDAY, BYMONTH, BYSETPOS and WKST. Occurrences moved by a DST gap carry gap: true. Rules needing over 50,000 candidate evaluations are rejected.","url":"https://api.duoleads.com/v1/time/rrule?utm_source=zero.xyz","method":"GET","headers":{},"bodySchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["input"],"properties":{"input":{"type":"object","required":["type","method"],"properties":{"type":{"type":"string","const":"http"},"method":{"enum":["GET"],"type":"string"},"queryParams":{"type":"object","required":["rrule","dtstart","zone"],"properties":{"zone":{"type":"string","maxLength":64,"description":"IANA time zone id."},"after":{"type":"string","maxLength":64,"description":"RFC 3339 instant; skip occurrences before it."},"count":{"type":"string","default":"20","pattern":"^[+-]?\\d+$","maxLength":64,"description":"Maximum occurrences to return, 1-200. Default 20."},"rdate":{"type":"string","maxLength":1024,"description":"Comma-separated local datetimes to add."},"rrule":{"type":"string","maxLength":512,"description":"RFC 5545 RRULE, e.g. FREQ=MONTHLY;BYDAY=-1FR;COUNT=6."},"exdate":{"type":"string","maxLength":1024,"description":"Comma-separated local datetimes to exclude."},"dtstart":{"type":"string","maxLength":32,"description":"First occurrence, YYYY-MM-DDTHH:MM:SS local to zone."}}}},"additionalProperties":false},"output":{"type":"object","required":["type"],"properties":{"type":{"type":"string"},"example":{"type":"object","required":["ok","route","version","data","meta"],"properties":{"ok":{"const":true},"data":{"type":"object","required":["occurrences","count","truncated","rule","zone"],"properties":{"rule":{"type":"object","required":["freq","interval","wkst"],"properties":{"freq":{"type":"string"},"wkst":{"type":"string"},"byday":{"type":"array","items":{"type":"string"}},"count":{"type":"integer"},"until":{"type":"string"},"byhour":{"type":"array","items":{"type":"integer"}},"bymonth":{"type":"array","items":{"type":"integer"}},"byminute":{"type":"array","items":{"type":"integer"}},"bysecond":{"type":"array","items":{"type":"integer"}},"bysetpos":{"type":"array","items":{"type":"integer"}},"interval":{"type":"integer"},"bymonthday":{"type":"array","items":{"type":"integer"}}}},"zone":{"type":"string"},"count":{"type":"integer"},"truncated":{"type":"boolean"},"occurrences":{"type":"array","items":{"type":"object","required":["local","instant","epoch_ms","offset","dst"],"properties":{"dst":{"type":"boolean"},"gap":{"type":"boolean"},"local":{"type":"string"},"offset":{"type":"string"},"instant":{"type":"string"},"epoch_ms":{"type":"integer"}}}}}},"meta":{"type":"object","required":["request_id","computed_at","price_usd","deterministic","disclaimer"],"properties":{"sources":{"type":"array","items":{"type":"object","required":["id","version","published"]}},"price_usd":{"type":"string"},"disclaimer":{"type":"string"},"request_id":{"type":"string"},"computed_at":{"type":"string","description":"RFC 3339 UTC with milliseconds"},"deterministic":{"type":"boolean"}}},"route":{"const":"/v1/time/rrule"},"version":{"type":"string"}}}}}}},"responseSchema":{"type":"json","example":{"ok":true,"data":{"rule":{"freq":"MONTHLY","wkst":"MO","byday":["-1FR"],"count":3,"interval":1},"zone":"Europe/Amsterdam","count":3,"truncated":false,"occurrences":[{"dst":false,"local":"2026-01-30T09:00:00","offset":"+01:00","instant":"2026-01-30T08:00:00.000Z","epoch_ms":1769760000000},{"dst":false,"local":"2026-02-27T09:00:00","offset":"+01:00","instant":"2026-02-27T08:00:00.000Z","epoch_ms":1772179200000},{"dst":false,"local":"2026-03-27T09:00:00","offset":"+01:00","instant":"2026-03-27T08:00:00.000Z","epoch_ms":1774598400000}]},"meta":{"price_usd":"0.05","disclaimer":"Factual output of a deterministic computation over public data. Provided as is, with no warranty of accuracy, completeness or availability. Not investment, financial, legal, tax, medical or any other professional advice, and not a recommendation. Verify before relying on it. Terms: https://api.duoleads.com/terms","request_id":"01K6B7Q4ZC8H3F2M9WXR5TYN0D","computed_at":"2026-09-28T12:00:00.000Z","deterministic":true},"route":"/v1/time/rrule","version":"1.0.0"}},"example":null,"exampleRequest":null,"tags":["x402"],"displayCostAmount":"0.05","displayCostAsset":"USDC","priceDynamic":false,"priceHint":null,"priceStatus":"priced","priceSource":"probe","requiresHandshake":false,"reviewCount":0,"rating":{"score":"0.00","successRate":"0.00","reviews":0,"stars":null,"state":"unrated"},"availabilityStatus":"unknown","priceObserved":null,"sessionDeposit":null,"pricing":{"kind":"static","summary":"$0.05/call","primary":{"kind":"static","protocol":"x402","network":"base","amountUsd":"0.05","per":"call","confidence":"exact"},"accepted":[{"kind":"static","protocol":"x402","network":"base","amountUsd":"0.05","per":"call","confidence":"exact"}]},"paymentMethods":[{"uid":"pm_Ofxi_pl-yNzo4-DCjIpdE","protocol":"x402","methodType":"crypto","chain":"base","mode":"charge","costAmount":"0.05","costPer":"request","priority":0,"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","unit":"request","depositMicros":null,"planRef":null}],"brandName":null,"brandSlug":null,"brandBaseUrl":null,"brandDocsUrl":null,"whatItDoes":"Expands an RFC 5545 recurrence rule (RRULE) into up to 200 concrete occurrence timestamps, returning both local wall-clock times and UTC instants with DST-shift annotations.","exampleAgentPrompt":"Can you expand this recurrence rule — FREQ=MONTHLY;BYDAY=-1FR;COUNT=6 — starting from 2026-01-30T09:00:00 in the Europe/Amsterdam timezone and give me the exact dates and UTC times for each occurrence?","exampleUseCases":[{"title":"Scheduling recurring team standup","prompt":"I have a weekly standup every Monday and Wednesday at 9am starting 2026-02-02T09:00:00 — can you expand FREQ=WEEKLY;BYDAY=MO,WE;COUNT=20 in America/New_York and list all the exact dates and UTC times, including any DST shifts?"},{"title":"Payroll run date planning","prompt":"Our payroll runs on the last Friday of every month. Can you expand FREQ=MONTHLY;BYDAY=-1FR;COUNT=12 starting 2026-01-30T17:00:00 in Europe/London and show me all 12 dates with their UTC equivalents?"},{"title":"Excluding holiday dates from reminders","prompt":"I have a daily reminder at 8am starting 2026-03-01T08:00:00 using FREQ=DAILY;COUNT=30 in Australia/Sydney, but please exclude 2026-03-09T08:00:00 and 2026-03-16T08:00:00 — can you give me the remaining occurrence dates and their UTC instants?"}],"resultDescription":"Returns a JSON object containing the parsed recurrence rule components, the IANA timezone, total occurrence count, a truncation flag, and an array of occurrences each with local datetime, UTC offset, UTC instant (ISO 8601), epoch milliseconds, and a DST boolean. Also includes metadata like request ID, computation timestamp, and price.","failureModes":["Invalid RRULE syntax returns a 400 error with a descriptive message","Unrecognized IANA timezone ID causes a validation error","DTSTART format not matching YYYY-MM-DDTHH:MM:SS causes rejection","count parameter outside 1-200 range is rejected","Unsupported RRULE components (e.g. BYWEEKNO) may be ignored or cause errors","EXDATE/RDATE values in wrong format cause parse failures","COUNT or UNTIL producing zero occurrences returns an empty array"],"whenToPreferThis":"Choose this endpoint when you need to deterministically expand an iCalendar-compatible RRULE string into concrete timestamps with full timezone and DST awareness. It is ideal for scheduling agents, calendar automation, and any workflow that needs to compute future event dates from a recurrence rule without implementing the RFC 5545 spec locally. Prefer this over generic date-math endpoints when you need support for complex patterns like BYDAY=-1FR (last Friday), BYSETPOS, or WKST, or when correct DST handling across IANA timezones is required.","instructions":null,"reviewSummary":null,"reviewSummaryHighlights":null,"reviewSummaryConcerns":null,"reviewSummaryGeneratedAt":null,"activationCount":0,"lastUsedAt":null,"lastSuccessfullyRanAt":null,"lastHealthCheckAt":"2026-10-02T00:42:42.616Z","isFirstParty":false,"canonicalSlug":"duo-data-utilities-rfc-5545-rrule-expander-357e44f5"}