Repeating tasks
What comes back, and when. Rules are RFC 5545 `RRULE` strings — the ones every calendar exchanges — so a rule you already have can be handed over unchanged, and one you are given can be fed to a calendar.
Every call here carries Authorization: Bearer <key> and
answers JSON. What is true of every call,
and what every refusal means.
GET
/api/v1/w/:workspace_id/notes/:note_id/repeats
What repeats in this note.
- needs
- read on the thing it touches
- answers
repeats, each with its rule in words, inRRULEstrings, and in the parts a form ticks — plusupcoming, the next dates it will actually fall on.- refusals
- unauthorized, not_found, too_many_requests
upcoming accounts for occurrences that have been MOVED, so it is when things happen rather than what the rule says. moved lists them.
An example
curl -X GET https://goscribi.com/api/v1/w/729/notes/823/repeats \
-H "Authorization: Bearer $GO_SCRIBI_KEY"
Answers 200:
{
"repeats": [
{
"id": 284,
"kind": "card",
"mode": "calendar",
"patterns": [
"FREQ=MONTHLY;BYDAY=3MO"
],
"says": "every month on the third Monday",
"parts": [
{
"every": 1,
"unit": "month",
"ordinal": 3,
"of_what": "MO"
}
],
"starts_on": "2026-02-01",
"next_on": "2026-02-16",
"paused": false,
"ends_on": null,
"ends_after": null,
"remind_at": null,
"moved": [],
"upcoming": [
"2026-02-16",
"2026-03-16",
"2026-04-20"
]
}
]
}
GET
/api/v1/w/:workspace_id/notes/:note_id/repeats/:id
One of them.
- needs
- read on the thing it touches
- answers
- The repeat.
- refusals
- unauthorized, not_found
An example
curl -X GET https://goscribi.com/api/v1/w/715/notes/797/repeats/274 \
-H "Authorization: Bearer $GO_SCRIBI_KEY"
Answers 200:
{
"id": 274,
"kind": "card",
"mode": "calendar",
"patterns": [
"FREQ=MONTHLY;BYDAY=3MO"
],
"says": "every month on the third Monday",
"parts": [
{
"every": 1,
"unit": "month",
"ordinal": 3,
"of_what": "MO"
}
],
"starts_on": "2026-02-01",
"next_on": "2026-02-16",
"paused": false,
"ends_on": null,
"ends_after": null,
"remind_at": null,
"moved": [
{
"from": "2026-02-16",
"to": "2026-02-20"
}
],
"upcoming": [
"2026-02-20",
"2026-03-16",
"2026-04-20"
]
}
POST
/api/v1/w/:workspace_id/notes/:note_id/repeats
Say that a card or a checklist row comes back.
- needs
- write on the thing it touches
- answers
- **201**, and the repeat.
- refusals
- unauthorized, not_found, forbidden, read_only_key, workspace_locked, limit_reached, invalid
| Parameter | In | Type | Description |
|---|---|---|---|
card_id
|
body | integer | Which card. Or item_id for a row. |
item_id
|
body | integer | |
patterns
|
body | array | RRULE strings. Any of them firing brings it back. |
mode
|
body | string | calendar, or after_done to count from the day the last one was FINISHED. That mode has no calendar: use after_every and after_unit. |
after_every
|
body | integer | |
after_unit
|
body | string | |
starts_on
|
body | string | A date, as 2026-03-14. Today if left out. |
ends_on
|
body | string | A date it stops on. |
ends_after
|
body | integer | Or a number of times, counted across every pattern rather than by each. |
remind_at
|
body | string | Local time, as 09:00, on the day each one is due. It goes to whoever set it up and to nobody else. |
Rules are RFC 5545 RRULE strings. FREQ=WEEKLY;INTERVAL=2;BYDAY=MO is every other Monday; FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR is every weekday; FREQ=MONTHLY;BYDAY=3MO is the third Monday; FREQ=MONTHLY;BYDAY=-1FR is the last Friday; FREQ=MONTHLY;BYMONTHDAY=-1 is the last day of the month. Give SEVERAL and it comes back on any of them — a day two of them name brings one task.
A month without the day you name is SKIPPED, which the calendar standard requires: BYMONTHDAY=31 does not happen in February and is not moved to the 28th. Use BYMONTHDAY=-1 when you mean the end of the month.
The card or row you name counts as the FIRST occurrence: nothing new is made until the next date comes round.
Rules outside what this application writes are refused rather than stored, and so is a day no year has — the 30th of February. Dates are ISO 8601 and nothing else: a program that writes next Tuesday is told, rather than given a date somebody guessed at.
An example
curl -X POST https://goscribi.com/api/v1/w/712/notes/791/repeats \
-H "Authorization: Bearer $GO_SCRIBI_KEY" \
-H "Content-Type: application/json" \
-d '"{\"card_id\":433,\"patterns\":[\"FREQ=MONTHLY;BYDAY=3MO\"],\"starts_on\":\"2026-02-01\"}"'
Answers 201:
{
"id": 273,
"kind": "card",
"mode": "calendar",
"patterns": [
"FREQ=MONTHLY;BYDAY=3MO"
],
"says": "every month on the third Monday",
"parts": [
{
"every": 1,
"unit": "month",
"ordinal": 3,
"of_what": "MO"
}
],
"starts_on": "2026-02-01",
"next_on": "2026-02-16",
"paused": false,
"ends_on": null,
"ends_after": null,
"remind_at": null,
"moved": [],
"upcoming": [
"2026-02-16",
"2026-03-16",
"2026-04-20"
]
}
PATCH
PUT
/api/v1/w/:workspace_id/notes/:note_id/repeats/:id
Change the rule, or pause it.
- needs
- write on the thing it touches
- answers
- The repeat.
- refusals
- unauthorized, not_found, forbidden, read_only_key, workspace_locked, invalid
| Parameter | In | Type | Description |
|---|---|---|---|
patterns
|
body | array | |
mode
|
body | string | |
starts_on
|
body | string | |
ends_on
|
body | string | |
ends_after
|
body | integer | |
remind_at
|
body | string | |
paused
|
body | boolean | Stop it making things, or start it again. |
Only what you name changes. A request that sets ends_on and says nothing about patterns leaves the rule exactly as it was.
paused is a field rather than a verb, so asking twice is safe and a retry cannot toggle what it just set.
An example
curl -X PATCH https://goscribi.com/api/v1/w/721/notes/807/repeats/277 \
-H "Authorization: Bearer $GO_SCRIBI_KEY" \
-H "Content-Type: application/json" \
-d '"{\"ends_on\":\"2026-12-31\"}"'
Answers 200:
{
"id": 277,
"kind": "card",
"mode": "calendar",
"patterns": [
"FREQ=MONTHLY;BYDAY=3MO"
],
"says": "every month on the third Monday",
"parts": [
{
"every": 1,
"unit": "month",
"ordinal": 3,
"of_what": "MO"
}
],
"starts_on": "2026-02-01",
"next_on": "2026-02-16",
"paused": false,
"ends_on": "2026-12-31",
"ends_after": null,
"remind_at": null,
"moved": [],
"upcoming": [
"2026-02-16",
"2026-03-16",
"2026-04-20"
]
}
DELETE
/api/v1/w/:workspace_id/notes/:note_id/repeats/:id
Stop it repeating.
- needs
- write on the thing it touches
- answers
{ "stopped": true }.- refusals
- unauthorized, not_found, forbidden, read_only_key, workspace_locked
Everything it already made stays where it is. The instances are the history — what was done and when — and a task that stops repeating has not stopped having happened.
An example
curl -X DELETE https://goscribi.com/api/v1/w/728/notes/821/repeats/283 \
-H "Authorization: Bearer $GO_SCRIBI_KEY" \
-H "Content-Type: application/json" \
-d '"{}"'
Answers 200:
{
"stopped": true
}