Recurring Records

Attach a repeating schedule to a record so Blue automatically generates copies on a defined cadence.


Use the createRepeatingRecord, updateRepeatingRecord, and deleteRepeatingRecord mutations to manage a repeating schedule on a record. The schedule is attached to an existing record, which acts as the template: each time the schedule fires, Blue copies the template into a target list. Records are Record objects in the API; lists are RecordList objects.

You control the cadence with a preset (DAILY, WEEKLY, MONTHLY, …) or a fully custom interval, choose when the schedule ends, and pick which elements (assignees, tags, custom fields, and more) carry over to each copy. All three mutations return Boolean.

Send these headers with every request. Company and project accept either an ID or a slug, and header names are case-insensitive.

blue-token-id: YOUR_TOKEN_ID
blue-token-secret: YOUR_TOKEN_SECRET
blue-org-id: YOUR_ORG_ID
blue-workspace-id: project_123

Request

Attach a daily repeating schedule to an existing record, copying assignees and tags to each new occurrence:

mutation CreateRecurringRecord {
  createRepeatingRecord(
    input: {
      todoId: "todo_123"
      todoListId: "list_123"
      type: DAILY
      fields: [ASSIGNEES, TAGS]
      from: "2026-06-01T09:00:00Z"
    }
  )
}

Parameters

CreateRepeatingRecordInput

ParameterTypeRequiredDescription
todoIdString!YesThe existing record to turn into a recurring template.
todoListIdString!YesThe list where each new copy is created.
typeRepeatingTodoRepeatType!YesThe repeat cadence. Use a preset, or CUSTOM with interval.
fields[RepeatingTodoAllowedField]!YesWhich elements to copy to each occurrence.
fromDateTime!YesThe first occurrence date/time the schedule starts from.
intervalRepeatingTodoIntervalInputNoCustom interval. Required when type is CUSTOM.
endRepeatingTodoEndInputNoWhen the schedule stops. Omit to repeat indefinitely.

UpdateRepeatingRecordInput

Same shape as CreateRepeatingRecordInput, plus repeatCounts.

ParameterTypeRequiredDescription
todoIdString!YesThe record whose schedule is being updated.
todoListIdString!YesThe list where each new copy is created.
typeRepeatingTodoRepeatType!YesThe repeat cadence.
fields[RepeatingTodoAllowedField]!YesWhich elements to copy to each occurrence.
fromDateTime!YesThe occurrence date/time the schedule runs from.
intervalRepeatingTodoIntervalInputNoCustom interval. Required when type is CUSTOM.
endRepeatingTodoEndInputNoWhen the schedule stops.
repeatCountsIntNoHow many times the record has already repeated.

RepeatingTodoIntervalInput

ParameterTypeRequiredDescription
countInt!YesHow many units between occurrences (e.g. 2 for “every 2 weeks”).
typeRepeatingTodoIntervalType!YesThe unit of time: DAYS, WEEKS, MONTHS, or YEARS.
days[RepeatingTodoDayType]NoDays of the week for WEEKS intervals (Sun, Mon, Tue, Wed, Thu, Fri, Sat).
monthRepeatingTodoMonthTypeNoHow to anchor MONTHS intervals: BY_DD or BY_DDDD.

RepeatingTodoEndInput

ParameterTypeRequiredDescription
typeRepeatingTodoEndType!YesHow the schedule ends: NEVER, ON, or AFTER.
onDateTimeNoEnd date. Required when type is ON.
afterIntNoNumber of occurrences. Required when type is AFTER.

RepeatingTodoRepeatType

ValueDescription
DAILYRepeats every day.
WEEKDAYSRepeats Monday through Friday.
WEEKLYRepeats every week on the same day.
MONTHLYRepeats every month on the same date.
YEARLYRepeats every year on the same date.
CUSTOMCadence defined by the interval field.

RepeatingTodoAllowedField

ValueDescription
ASSIGNEESCopy assigned users to the new record.
TAGSCopy tags to the new record.
CUSTOM_FIELDSCopy custom field values to the new record.
DESCRIPTIONCopy the description to the new record.
CHECKLISTSCopy checklists to the new record.
COMMENTSCopy comments to the new record.

RepeatingTodoIntervalType

ValueDescription
DAYSInterval measured in days.
WEEKSInterval measured in weeks.
MONTHSInterval measured in months.
YEARSInterval measured in years.

RepeatingTodoMonthType

ValueDescription
BY_DDRepeat on the same date of the month (e.g. the 15th).
BY_DDDDRepeat on the same weekday position (e.g. the 2nd Monday).

RepeatingTodoEndType

ValueDescription
NEVERRepeats indefinitely.
ONEnds on a specific date (set on).
AFTEREnds after a number of occurrences (set after).

Response

Each mutation returns a Boolean under the operation name.

{
  "data": {
    "createRepeatingRecord": true
  }
}

Returns

FieldTypeDescription
createRepeatingRecordBooleantrue when the schedule is attached.
updateRepeatingRecordBooleantrue when the schedule is updated and the next copy is created; false if creating the copy failed (see Errors).
deleteRepeatingRecordBooleantrue when the schedule is removed.

To read the active schedule’s target list back, select repeatingTodoList on the record. It is null when no schedule is set.

query RecurringTarget {
  recordQueries {
    todos(filter: { companyIds: ["company_123"], todoIds: ["todo_123"] }) {
      items {
        id
        title
        repeatingTodoList {
          id
          title
        }
      }
    }
  }
}

Full example

Repeat every 2 weeks on Monday and Wednesday, end after 10 occurrences, and copy every supported element:

mutation CreateRecurringRecordCustom {
  createRepeatingRecord(
    input: {
      todoId: "todo_123"
      todoListId: "list_123"
      type: CUSTOM
      fields: [ASSIGNEES, TAGS, CUSTOM_FIELDS, DESCRIPTION, CHECKLISTS, COMMENTS]
      from: "2026-06-01T09:00:00Z"
      interval: { count: 2, type: WEEKS, days: [Mon, Wed] }
      end: { type: AFTER, after: 10 }
    }
  )
}

Update a record’s schedule to repeat monthly by date, ending on a fixed date:

mutation UpdateRecurringRecord {
  updateRepeatingRecord(
    input: {
      todoId: "todo_123"
      todoListId: "list_123"
      type: CUSTOM
      fields: [ASSIGNEES, TAGS, DESCRIPTION]
      from: "2026-07-01T09:00:00Z"
      interval: { count: 1, type: MONTHS, month: BY_DD }
      end: { type: ON, on: "2026-12-31T23:59:59Z" }
      repeatCounts: 5
    }
  )
}

Remove a schedule from a record (the id is the record’s todoId):

mutation DeleteRecurringRecord {
  deleteRepeatingRecord(id: "todo_123")
}

How it works

  • The schedule lives on the template record; the template itself is never altered when a copy is generated.
  • Each occurrence is a fresh copy created in todoListId via the same mechanism as copying a record. The target list can be in the same workspace or a different one.
  • fields controls exactly what carries over. Anything not listed is left off the copy.
  • Preset cadences (DAILY, WEEKDAYS, WEEKLY, MONTHLY, YEARLY) need no interval. CUSTOM requires one — use interval.days to pin specific weekdays on WEEKS intervals, and interval.month to anchor MONTHS intervals to a date (BY_DD) or a weekday position (BY_DDDD).
  • When updateRepeatingRecord generates a copy, it logs a REPEAT_TODO activity, records a todo action, notifies the copy’s assignees, and publishes the new record in real time. If creating the copy fails, the mutation clears the schedule to avoid a stuck state and returns false instead of throwing — always check the return value.

Errors

CodeWhen
TODO_NOT_FOUNDtodoId (or id on delete) does not exist, or the caller cannot access the record.
FORBIDDENThe caller lacks edit-level access to the record (see Permissions).
UNAUTHENTICATEDThe request carries no valid token.

Permissions

Managing a recurring schedule requires edit-level access to the record. Only OWNER, ADMIN, and MEMBER access levels qualify; CLIENT, COMMENT_ONLY, and VIEW_ONLY cannot. A custom role with records disabled (isRecordsEnabled: false) is also denied, and the record’s workspace must be active (not archived).