{"openapi":"3.1.0","info":{"title":"Recurrence Rule API","version":"1.0.0","description":"Expand and describe RFC 5545 recurrence rules — the RRULE that powers calendar repeats. The expand endpoint takes an RRULE and a start date-time and returns the next occurrence dates, correctly handling FREQ (daily, weekly, monthly, yearly and the finer hourly/minutely/secondly), INTERVAL (every 2 weeks…), COUNT and UNTIL, BYDAY including ordinals like 2MO or -1FR (so \"the last Friday of the month\" or \"the third Sunday of June\"), BYMONTHDAY including negatives (-1 for the last day of the month), BYMONTH and WKST. The describe endpoint turns a rule into a plain-English sentence such as \"every week on Monday, Wednesday and Friday, 10 times\". Everything is computed locally in UTC and deterministically, so it is instant, private and identical on every machine. Ideal for scheduling and booking systems, calendar and reminder apps, billing and subscription cycles, job and report scheduling, and showing customers when something next happens. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 3 endpoints. This expands the recurrence rule; to build a downloadable .ics calendar event use an iCalendar API, and for plain date arithmetic use a date-time API.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/rrule-api","description":"oanor gateway"}],"tags":[{"name":"Recurrence"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/describe":{"get":{"operationId":"get_v1_describe","tags":["Recurrence"],"summary":"Describe a recurrence rule","description":"","parameters":[{"name":"rrule","in":"query","required":true,"description":"The RRULE","schema":{"type":"string"},"example":"FREQ=MONTHLY;BYDAY=-1FR"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"text":"every month on last Friday","rrule":"FREQ=MONTHLY;BYDAY=-1FR"},"meta":{"timestamp":"2026-06-03T09:24:58.998Z","request_id":"6adebe59-86b8-4002-a204-8c1998f5ec95"},"status":"ok","message":"Describe a recurrence rule","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/expand":{"get":{"operationId":"get_v1_expand","tags":["Recurrence"],"summary":"Expand a recurrence rule","description":"","parameters":[{"name":"rrule","in":"query","required":true,"description":"The RRULE","schema":{"type":"string"},"example":"FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=10"},{"name":"start","in":"query","required":true,"description":"Start date-time (ISO 8601 UTC)","schema":{"type":"string"},"example":"2026-01-05T09:00:00Z"},{"name":"count","in":"query","required":false,"description":"Max occurrences (default 10, max 1000)","schema":{"type":"string"},"example":"10"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"count":10,"rrule":"FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=10","start":"2026-01-05T09:00:00.000Z","finite":true,"occurrences":["2026-01-05T09:00:00.000Z","2026-01-07T09:00:00.000Z","2026-01-09T09:00:00.000Z","2026-01-12T09:00:00.000Z","2026-01-14T09:00:00.000Z","2026-01-16T09:00:00.000Z","2026-01-19T09:00:00.000Z","2026-01-21T09:00:00.000Z","2026-01-23T09:00:00.000Z","2026-01-26T09:00:00.000Z"]},"meta":{"timestamp":"2026-06-03T09:24:59.094Z","request_id":"bd815b7e-2beb-4bd9-a594-5f163d06aec9"},"status":"ok","message":"Expand a recurrence rule","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Spec","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"name":"Recurrence Rule API","notes":"Dates are handled in UTC. An infinite rule (no COUNT or UNTIL) is capped by the count parameter. This expands the recurrence rule; to build a full .ics calendar event use an iCalendar API and for plain date arithmetic use a date-time API. Nothing is stored.","version":"v1","endpoints":[{"path":"/v1/expand","params":{"count":"max occurrences to return (default 10, max 1000)","rrule":"the RRULE, e.g. FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=10 (required)","start":"the start date-time, ISO 8601 UTC (required)"},"returns":"the list of occurrence date-times"},{"path":"/v1/describe","params":{"rrule":"the RRULE (required)"},"returns":"a plain-English description of the rule"},{"path":"/v1/meta","params":[],"returns":"this document"}],"description":"Expand and describe RFC 5545 recurrence rules (the RRULE behind calendar repeats). The expand endpoint takes an RRULE and a start date-time and returns the next occurrence dates — handling FREQ (daily, weekly, monthly, yearly and finer), INTERVAL, COUNT, UNTIL, BYDAY (including ordinals like 2MO or -1FR for 'last Friday'), BYMONTHDAY (including negatives for 'last day'), BYMONTH and WKST. The describe endpoint turns a rule into a plain-English sentence. Everything is computed locally in UTC and deterministically, so it is instant and private. Pure local, no key."},"meta":{"timestamp":"2026-06-03T09:24:59.199Z","request_id":"f532404e-261f-4210-a09d-d8d050877e35"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":3835,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":535,"monthly_call_quota":13350,"rps_limit":8,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":2525,"monthly_call_quota":184500,"rps_limit":20,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":6325,"monthly_call_quota":965000,"rps_limit":50,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/rrule-api"}