Automations

Automate work in a workspace — list automations and reach their create, edit, copy, and delete operations.


Automations run actions automatically when something happens in a workspace — for example, moving a record to a list when it’s marked complete, or assigning the person who triggered the change. Each automation is project-scoped and pairs one trigger (the event to watch) with one or more actions (what to do).

Workspaces are Workspace objects in the API; records are Record objects. Every automation belongs to a single workspace, identified by the X-Bloo-Project-ID header or the projectId filter argument.

Operations

OperationGraphQLDescription
List automationsautomationList queryDocumented on this page
Create an automationcreateAutomation mutationDefine a trigger and its actions
Edit an automationeditAutomation mutationChange the trigger, actions, or active state
Copy an automationcopyAutomation mutationDuplicate an automation, optionally into another project
Delete an automationdeleteAutomation mutationRemove an automation

Request

Use the automationList query to retrieve the automations for a project. With no arguments it returns the current project’s automations (from the blue-workspace-id header), newest first.

query ListAutomations {
  automationList {
    items {
      id
      isActive
      trigger {
        type
      }
      actions {
        type
      }
      createdAt
    }
    pageInfo {
      totalItems
      hasNextPage
    }
    totalCount
  }
}

Parameters

automationList takes pagination arguments plus an optional filter input.

ArgumentTypeRequiredDescription
filterAutomationFilterInputNoNarrows the result set. See below.
skipIntNoNumber of items to skip. Default 0.
takeIntNoNumber of items to return. Default 20.

AutomationFilterInput

FieldTypeRequiredDescription
projectIdStringNoList automations from a specific project by id or slug instead of the header context. Access is re-validated against the caller.
customFieldIds[String]NoOnly return automations whose trigger references one of these custom field ids.
customFieldIdStringNoDeprecated. Single-field version of customFieldIds. Use customFieldIds instead.
skip and take are ignored when filtering by custom field

When customFieldIds (or the deprecated customFieldId) is supplied, the query returns every matching automation and ignores skip/take. Pagination only applies to the unfiltered listing.

Response

{
  "data": {
    "automationList": {
      "items": [
        {
          "id": "clm4n8qwx000008l0g4oxdqn7",
          "isActive": true,
          "trigger": { "type": "TODO_MARKED_AS_COMPLETE" },
          "actions": [{ "type": "CHANGE_TODO_LIST" }],
          "createdAt": "2026-05-20T14:32:10.000Z"
        }
      ],
      "pageInfo": {
        "totalItems": 1,
        "hasNextPage": false
      },
      "totalCount": 1
    }
  }
}

AutomationPagination

FieldTypeDescription
items[Automation!]!The automations for this page, newest first.
pageInfoPageInfo!Pagination metadata (totalItems, totalPages, page, perPage, hasNextPage, hasPreviousPage).
totalCountInt!Total automations matching the filter, ignoring pagination.

Automation

FieldTypeDescription
idID!Unique identifier.
triggerAutomationTrigger!The event that starts this automation.
actions[AutomationAction!]!Ordered list of actions to run when the trigger fires.
isActiveBoolean!Whether the automation is currently enabled.
createdByUser!The user who created the automation.
projectWorkspace!The workspace this automation belongs to.
createdAtDateTime!When the automation was created.
updatedAtDateTime!When the automation was last changed.

AutomationTrigger

FieldTypeDescription
idID!Unique identifier.
typeAutomationTriggerType!The kind of event to watch. See Trigger types.
metadataAutomationTriggerMetadataTrigger-specific config. Currently AutomationTriggerMetadataRecordOverdue (incompleteOnly, offset).
customFieldCustomFieldThe custom field this trigger watches, when applicable.
customFieldOptions[CustomFieldOption!]The select options the trigger reacts to.
todos(first: Int, skip: Int)[CustomFieldReferenceTodo!]Referenced records, with optional pagination args.
todoListRecordListA single related list.
todoLists[RecordList!]!Related lists for the trigger.
tags[Tag!]Related tags.
assignees[User!]Related assignees.
colorStringA single related color (hex).
colors[String!]Related colors (hex).
dueStartDateTimeStart of the due-date window the trigger matches.
dueEndDateTimeEnd of the due-date window the trigger matches.
showCompletedBooleanWhether completed records are included.
fieldsJSONRaw field-condition config for filter-based triggers.
opFilterLogicalOperatorHow filter conditions combine (AND / OR).
conditionModeConditionalAutomationModeFor CONDITIONAL triggers: STARTS_MATCHING or STOPS_MATCHING.
filterGroupsJSONRaw grouped filter conditions.
filterGroupLinksJSONRaw links between filter groups.
scheduleAutomationTriggerScheduleSchedule config for SCHEDULED triggers. See AutomationTriggerSchedule.
createdAtDateTime!When the trigger was created.
updatedAtDateTime!When the trigger was last changed.

AutomationAction

FieldTypeDescription
idID!Unique identifier.
typeAutomationActionType!The action to perform. See Action types.
duedInIntDays from execution to set as the due date (for due-date actions).
customFieldCustomFieldThe target custom field.
customFieldOptions[CustomFieldOption!]Select options to set.
todoListRecordListThe destination list (for CHANGE_TODO_LIST).
metadataAutomationActionMetadataAction-specific config (email, checklist, copy, or custom-field value).
tags[Tag!]Tags to add or remove.
assignees[User!]Assignees to add or remove.
projects[Workspace!]Target workspaces (for ADD_PROJECT).
colorStringColor to add or remove (hex).
assigneeTriggererStringIdentifier for the user who triggered the automation (for ADD_ASSIGNEE_TRIGGERER / REMOVE_ASSIGNEE_TRIGGERER).
portableDocumentPortableDocumentThe document template used by GENERATE_PDF.
httpOptionAutomationActionHttpOptionRequest config for MAKE_HTTP_REQUEST.
createdAtDateTime!When the action was created.
updatedAtDateTime!When the action was last changed.

AutomationTriggerSchedule

Returned on AutomationTrigger.schedule for SCHEDULED triggers.

FieldTypeDescription
idID!Unique identifier.
typeAutomationScheduleType!DAILY, WEEKLY, WEEKDAYS, MONTHLY, YEARLY, or CUSTOM.
hourInt!Hour of day (0–23) the schedule fires.
minuteInt!Minute of the hour the schedule fires.
timezoneString!IANA timezone the schedule is evaluated in.
days[Int!]Specific days the schedule runs.
dayOfWeek[Int!]Days of the week for WEEKLY schedules.
dayOfMonthIntDay of the month for MONTHLY schedules.
monthIntMonth for YEARLY schedules.
cronExpressionStringCron expression for CUSTOM schedules.
lastExecutedAtDateTimeWhen the schedule last ran.
nextExecutionAtDateTimeWhen the schedule will next run.
isActiveBoolean!Whether the schedule is enabled.
createdAtDateTime!When the schedule was created.
updatedAtDateTime!When the schedule was last changed.

Trigger types

AutomationTriggerType enumerates the events that can start an automation.

ValueFires when
TODO_CREATEDA record is created.
TODO_LIST_CHANGEDA record moves between lists.
TODO_MARKED_AS_COMPLETEA record is marked complete.
TODO_MARKED_AS_INCOMPLETEA record is marked incomplete.
ASSIGNEE_ADDEDAn assignee is added to a record.
ASSIGNEE_REMOVEDAn assignee is removed from a record.
DUE_DATE_CHANGEDA record’s due date is set or changed.
DUE_DATE_REMOVEDA record’s due date is cleared.
DUE_DATE_EXPIREDA record’s due date passes.
TAG_ADDEDA tag is added to a record.
TAG_REMOVEDA tag is removed from a record.
CHECKLIST_ITEM_MARKED_AS_DONEA checklist item is completed.
CHECKLIST_ITEM_MARKED_AS_UNDONEA checklist item is uncompleted.
TODO_COPIED_OR_MOVED_FROM_OTHER_PROJECTA record is copied or moved in from another project.
CUSTOM_FIELD_ADDEDA custom field value is set on a record.
CUSTOM_FIELD_REMOVEDA custom field value is cleared on a record.
CUSTOM_FIELD_BUTTON_CLICKEDA button custom field is clicked.
COLOR_ADDEDA color is applied to a record.
COLOR_REMOVEDA color is removed from a record.
PROJECT_ADDED_TO_TODOA project is added to a record.
SCHEDULEDA time-based schedule fires. Requires schedule config.
CONDITIONALA record starts or stops matching a filter (see conditionMode).

Action types

AutomationActionType enumerates what an automation can do when its trigger fires.

ValueEffect
CHANGE_TODO_LISTMove the record to a different list.
MARK_AS_COMPLETEMark the record complete.
MARK_AS_INCOMPLETEMark the record incomplete.
ADD_ASSIGNEEAdd one or more assignees.
REMOVE_ASSIGNEERemove one or more assignees.
ADD_ASSIGNEE_TRIGGERERAdd the user who triggered the automation.
REMOVE_ASSIGNEE_TRIGGERERRemove the user who triggered the automation.
CHANGE_DUE_DATESet or update the due date.
REMOVE_DUE_DATEClear the due date.
ADD_TAGAdd one or more tags.
REMOVE_TAGRemove one or more tags.
ADD_COLORApply a color.
REMOVE_COLORRemove a color.
ADD_CUSTOM_FIELDSet a custom field value.
REMOVE_CUSTOM_FIELDClear a custom field value.
ADD_PROJECTAdd the record to another project.
CREATE_CHECKLISTCreate a checklist on the record.
MARK_CHECKLIST_ITEM_AS_DONEComplete checklist items.
MARK_CHECKLIST_ITEM_AS_UNDONEUncomplete checklist items.
COPY_TODODuplicate the record.
SEND_EMAILSend an email.
GENERATE_PDFGenerate a PDF from a document template.
MAKE_HTTP_REQUESTCall an external API.

Full example

This selects the full trigger and action detail, including the metadata unions, the schedule, and the creator.

query ListAutomationsDetailed {
  automationList(filter: { projectId: "project_123" }, skip: 0, take: 50) {
    items {
      id
      isActive
      createdAt
      updatedAt
      createdBy {
        id
        fullName
        email
      }
      trigger {
        id
        type
        color
        op
        conditionMode
        customField {
          id
          name
          type
        }
        customFieldOptions {
          id
          title
          color
        }
        todoLists {
          id
          title
        }
        tags {
          id
          title
          color
        }
        assignees {
          id
          fullName
          email
        }
        schedule {
          id
          type
          hour
          minute
          timezone
          nextExecutionAt
          isActive
        }
        metadata {
          ... on AutomationTriggerMetadataRecordOverdue {
            incompleteOnly
            offset
          }
        }
      }
      actions {
        id
        type
        color
        duedIn
        assigneeTriggerer
        todoList {
          id
          title
        }
        tags {
          id
          title
        }
        assignees {
          id
          fullName
        }
        projects {
          id
          name
        }
        portableDocument {
          id
          name
        }
        metadata {
          ... on AutomationActionMetadataSendEmail {
            email {
              subject
              to
              from
              content
            }
          }
          ... on AutomationActionMetadataCreateChecklist {
            checklists {
              title
              checklistItems {
                title
                duedIn
              }
            }
          }
        }
      }
    }
    pageInfo {
      totalItems
      totalPages
      hasNextPage
      hasPreviousPage
    }
    totalCount
  }
}

Errors

CodeWhen
UNAUTHENTICATEDThe request has no valid credentials. Message: You are not authenticated.
PROJECT_NOT_FOUNDA projectId filter was supplied but no project matches that id or slug. Message: Project was not found.
FORBIDDENA projectId filter resolved to a project the caller is not a member of. Message: You are not authorized.
{
  "errors": [
    {
      "message": "Project was not found.",
      "extensions": { "code": "PROJECT_NOT_FOUND" }
    }
  ]
}

Permissions

Any member of the project can list its automations, regardless of access level — OWNER, ADMIN, MEMBER, CLIENT, COMMENT_ONLY, and VIEW_ONLY all return the full list. When you pass a projectId filter, the caller must be a member of that project or the query fails with FORBIDDEN.