Go Scribi

The API

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, in RRULE strings, and in the parts a form ticks — plus upcoming, 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
Parameters for POST /api/v1/w/:workspace_id/notes/:note_id/repeats
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
Parameters for PATCH /api/v1/w/:workspace_id/notes/:note_id/repeats/:id
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
}