Skip to content

Create or update a card's recurrence rule

POST
/boards/{board}/cards/{card}/recurrence
curl --request POST \
--url https://projects.work.optidata.cloud/api/boards/1/cards/1/recurrence \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "target_column_id": 301, "frequency": "weekly", "interval": 1, "by_day": [ "MO", "TH" ] }'

Defines how often a new occurrence of this card is generated and into which column. If the card already has a rule (even a stopped one), it is updated; otherwise a new rule is created. iCal-style refinements are supported: weekdays (by_day), month days (by_month_day), months (by_month) and monthly positions such as “first Monday” (by_set_pos).

board
required
integer

Board id.

card
required
integer

Card id (must belong to the board).

Media typeapplication/json
object
target_column_id
required

Column of this board where generated occurrences are placed.

integer
frequency
required
string
Allowed values: daily weekly monthly yearly
interval

Repeat every N periods (default 1).

integer | null
>= 1 <= 99
by_day

Weekdays the rule fires on.

Array<string> | null
Allowed values: SU MO TU WE TH FR SA
by_month_day

Days of the month the rule fires on.

Array<integer> | null
by_month

Months the rule fires in (1 = January).

Array<integer> | null
by_set_pos

Position within the month (1 = first … -1 = last), combined with by_day.

Array<integer> | null
Allowed values: 1 2 3 4 -1
Example
{
"target_column_id": 301,
"frequency": "weekly",
"interval": 1,
"by_day": [
"MO",
"TH"
]
}

The stored rule.

Media typeapplication/json
object
message
string
recurrence

Repeat rule for a card.

object
id
integer
original_card_id
integer
target_column_id
integer
frequency
string
Allowed values: daily weekly monthly yearly
interval
integer | null
>= 1 <= 99
by_day
Array<string> | null
Allowed values: SU MO TU WE TH FR SA
by_month_day
Array<integer> | null
by_month
Array<integer> | null
by_set_pos
Array<integer> | null
Allowed values: 1 2 3 4 -1
last_occurrence_at
string | null format: date-time
next_occurrence_at
string | null format: date-time
created_at
string format: date-time
updated_at
string format: date-time
deleted_at
string | null format: date-time
Example
{
"message": "Card repetition created successfully.",
"recurrence": {
"id": 15,
"original_card_id": 9001,
"target_column_id": 301,
"frequency": "weekly",
"interval": 1,
"by_day": [
"MO",
"TH"
],
"by_month_day": null,
"by_month": null,
"by_set_pos": null,
"last_occurrence_at": null,
"next_occurrence_at": "2026-07-27T00:00:00.000000Z"
}
}

Missing, invalid or expired bearer passport.

Media typeapplication/json
object
error
string
Example
{
"error": "JWT passport exception: Missing bearer token in request"
}

The authenticated user lacks the required board permission.

Media typeapplication/json
object
message
string
Example
{
"message": "This action is unauthorized."
}

Resource not found, or a nested resource does not belong to its parent in the path.

Media typeapplication/json
object
message
string
Example
{
"message": "Not found."
}

Validation failed.

Media typeapplication/json
object
message

First validation error message.

string
errors

Map of field name → list of error messages.

object
key
additional properties
Array<string>
Example
{
"message": "The name field is required.",
"errors": {
"name": [
"The name field is required."
]
}
}