> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreflux.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Trello

> Client-mode REST API connector for Trello: open maintenance cards from plant events, move them across lists as work progresses, comment, label, assign, tick checklists and set custom fields, read boards back for andon screens, and register webhooks to a Coreflux server connector

Technical Preview

## Overview

A client-mode connector for the [Trello REST API](https://developer.atlassian.com/cloud/trello/rest/) that turns plant events into visible work. A typical flow opens a card on the maintenance board when an alarm fires, moves it from **To do** to **In progress** to **Done** as the work order progresses, adds comments with live readings, labels it by line, assigns a technician, attaches a dashboard link, ticks lockout checklist items and records asset or downtime values in custom fields. The same connector reads boards, lists and cards back into the broker for andon screens and shift reports, and registers Trello webhooks that post board changes to a Coreflux server connector.

One connector carries 38 events (21 GET, 11 POST, 6 PUT; 17 writes, no DELETE). Topics use `devops/trello/<object>/<verb>`; each response is published on `<source topic>/response`.

> [!NOTE]
>
> The template was checked against Trello's [OpenAPI definition](https://developer.atlassian.com/cloud/trello/swagger.v3.json) and a local mock. Thirteen read events were called live, without credentials, against Trello's public roadmap board, and every event was probed on `api.trello.com` with a dummy key (each answers `invalid key`, while unknown paths answer 404). Writes have **not** run with a real key and token yet, so status stays blocked until an authenticated smoke passes.

## Setup

1. Create a Power-Up in the [Trello Power-Up admin portal](https://trello.com/power-ups/admin) and generate its API key.
2. Generate a user token for that key (the **Token** link next to the key, or `https://trello.com/1/authorize?expiration=never&scope=read,write&response_type=token&key=<key>`). The token acts as the user who approved it, so use a service account that is a member of the boards you automate.
3. Keep both in broker secrets (for example `TRELLO_API_KEY` and `TRELLO_TOKEN`) and build the header value in a LoT action with `GET SECRET`. Never retain topics that carry it.

## Authentication

Trello takes the key and token either as `key` and `token` query parameters or in an `Authorization` header. This connector uses the header so credentials never appear in URLs or logs. Pass the whole header value in `authorization`:

```json theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
{"authorization": "OAuth oauth_consumer_key=\"YOUR_KEY\", oauth_token=\"YOUR_TOKEN\""}
```

Public boards can be read with an empty `authorization`.

## Query parameters and bodies

Trello reads create and update fields from query parameters, so writes pass them URL-encoded in `query` (for example `idList=<listId>&name=Press%207%20overtemperature&pos=top`). Reads use `query` for `fields`, `filter` and limits; leave it empty for defaults. Only `CardCustomFieldSet` takes a JSON `body`. Values are sent as given, so URL-encode them yourself.

## Examples

Open a maintenance card when a press overheats (`devops/trello/cards/create`):

```json theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
{"authorization": "<header value>", "query": "idList=5abbe4b7ddc1b351ef961414&name=Press%207%20overtemperature&desc=94%20C%20on%20line%202&pos=top&due=2026-10-06T08:00:00.000Z"}
```

Trello answers with the new card, including `id` and `shortUrl`.

Move it to **In progress** when a technician accepts the work order (`devops/trello/cards/update`):

```json theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
{"authorization": "<header value>", "card": "<cardId>", "query": "idList=<inProgressListId>&pos=top"}
```

Record downtime minutes in a number custom field (`devops/trello/cards/custom-fields/set`):

```json theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
{"authorization": "<header value>", "card": "<cardId>", "custom_field": "<fieldId>", "body": {"value": {"number": "42"}}}
```

Read the open maintenance queue for an andon screen (`devops/trello/lists/cards/list`):

```json theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
{"authorization": "<header value>", "list": "<listId>", "query": "fields=name,due,labels,idMembers,shortUrl"}
```

Send board changes to a Coreflux server connector (`devops/trello/webhooks/create`):

```json theme={"theme":"css-variables","languages":{"custom":["/languages/lot.json"]}}
{"authorization": "<header value>", "query": "callbackURL=https%3A%2F%2Fbroker.example.com%2Ftrello%2Fevents&idModel=<boardId>&description=Porto%20maintenance"}
```

> [!WARNING]
>
> Trello sends a `HEAD` request to `callbackURL` when you create a webhook and only creates it if that answers 200. Each delivery carries an `X-Trello-Webhook` signature (HMAC-SHA1 of the body plus the callback URL, keyed with your Power-Up secret); check it in the receiving server connector.

## Events

| Event | Method | Endpoint | Source topic | Write | Notes |
| - | - | - | - | - | - |
| `MemberMe` | `GET` | `/1/members/me?{value.json.query}` | `devops/trello/members/me` | | Smoke: the member who owns the token (id, username, fullName, idBoards). query e.g. fields=username,fullName,idBoards (or empty). |
| `MemberBoardsList` | `GET` | `/1/members/{value.json.member}/boards?{value.json.query}` | `devops/trello/members/boards/list` | | Boards a member can see. member = me or a member id/username. query e.g. filter=open\&fields=name,url,idOrganization. |
| `OrganizationBoardsList` | `GET` | `/1/organizations/{value.json.org}/boards?{value.json.query}` | `devops/trello/organizations/boards/list` | | Boards in a Workspace. org = Workspace id or name. query e.g. filter=open\&fields=name,url. |
| `BoardGet` | `GET` | `/1/boards/{value.json.board}?{value.json.query}` | `devops/trello/boards/get` | | One board. board = board id or short link. query e.g. fields=name,url,closed\&lists=open\&labels=all (or empty). Public boards work with an empty authorization. |
| `BoardCreate` | `POST` | `/1/boards/?{value.json.query}` | `devops/trello/boards/create` | Yes | Create a board. query: name=Porto%20Line%202%20Maintenance\&idOrganization=\<workspaceId>\&defaultLists=true\&prefs\_permissionLevel=org (or idBoardSource=\<templateBoardId> to copy a template board). |
| `BoardUpdate` | `PUT` | `/1/boards/{value.json.board}?{value.json.query}` | `devops/trello/boards/update` | Yes | Rename, describe or close a board. query e.g. desc=Owned%20by%20Porto%20maintenance or closed=true. |
| `BoardListsList` | `GET` | `/1/boards/{value.json.board}/lists?{value.json.query}` | `devops/trello/boards/lists/list` | | Lists on a board (get list ids for CardCreate and CardUpdate). query e.g. filter=open\&fields=name,pos. |
| `BoardCardsList` | `GET` | `/1/boards/{value.json.board}/cards?{value.json.query}` | `devops/trello/boards/cards/list` | | Cards on a board. query e.g. fields=name,idList,due,dueComplete,labels,shortUrl (or empty). |
| `BoardLabelsList` | `GET` | `/1/boards/{value.json.board}/labels?{value.json.query}` | `devops/trello/boards/labels/list` | | Labels on a board (ids for CardLabelAdd). query e.g. fields=name,color\&limit=50. |
| `BoardMembersList` | `GET` | `/1/boards/{value.json.board}/members` | `devops/trello/boards/members/list` | | Members of a board (ids for CardMemberAdd). |
| `BoardCustomFieldsList` | `GET` | `/1/boards/{value.json.board}/customFields` | `devops/trello/boards/custom-fields/list` | | Custom field definitions on a board (ids and types for CardCustomFieldSet). Needs the Custom Fields Power-Up on the board. |
| `BoardActionsList` | `GET` | `/1/boards/{value.json.board}/actions?{value.json.query}` | `devops/trello/boards/actions/list` | | Board activity (audit trail). query e.g. filter=createCard,updateCard:idList,commentCard\&limit=50\&since=2026-10-05T00:00:00Z. |
| `ListGet` | `GET` | `/1/lists/{value.json.list}?{value.json.query}` | `devops/trello/lists/get` | | One list. query e.g. fields=name,closed,idBoard,pos (or empty). |
| `ListCardsList` | `GET` | `/1/lists/{value.json.list}/cards?{value.json.query}` | `devops/trello/lists/cards/list` | | Catalog 'GET lists/\{id}/cards'. Cards in a list, e.g. the open maintenance queue for an andon screen. query e.g. fields=name,due,labels,idMembers,shortUrl. |
| `ListCreate` | `POST` | `/1/lists?{value.json.query}` | `devops/trello/lists/create` | Yes | Add a list to a board. query: name=Waiting%20for%20parts\&idBoard=\<boardId>\&pos=bottom. |
| `ListUpdate` | `PUT` | `/1/lists/{value.json.list}?{value.json.query}` | `devops/trello/lists/update` | Yes | Rename, reorder, move or archive a list. query e.g. name=Done%20this%20week or closed=true or pos=top. |
| `CardGet` | `GET` | `/1/cards/{value.json.card}?{value.json.query}` | `devops/trello/cards/get` | | One card. query e.g. fields=name,desc,idList,due,dueComplete,labels,shortUrl\&checklists=all\&customFieldItems=true. |
| `CardCreate` | `POST` | `/1/cards?{value.json.query}` | `devops/trello/cards/create` | Yes | Catalog 'POST cards'. query: idList=\<listId> (required), name, desc, pos=top, due=2026-10-06T08:00:00.000Z, idLabels=\<id1>,\<id2>, idMembers=\<id>, urlSource=\<link> (attach a dashboard URL). Returns the card with id and shortUrl. |
| `CardUpdate` | `PUT` | `/1/cards/{value.json.card}?{value.json.query}` | `devops/trello/cards/update` | Yes | Catalog 'PUT cards/\{id} (move list)'. query e.g. idList=\<inProgressListId>\&pos=top, or dueComplete=true, or name/desc/due, or closed=true to archive. idBoard plus idList moves it to another board. |
| `CardActionsList` | `GET` | `/1/cards/{value.json.card}/actions?{value.json.query}` | `devops/trello/cards/actions/list` | | Card history and comments. query e.g. filter=commentCard,updateCard:idList. |
| `CardCommentAdd` | `POST` | `/1/cards/{value.json.card}/actions/comments?{value.json.query}` | `devops/trello/cards/comments/add` | Yes | Comment on a card. query: text=Temperature%20back%20to%2071%20C%20at%2014%3A20. |
| `CardLabelAdd` | `POST` | `/1/cards/{value.json.card}/idLabels?{value.json.query}` | `devops/trello/cards/labels/add` | Yes | Add an existing label to a card. query: value=\<labelId>. |
| `CardMemberAdd` | `POST` | `/1/cards/{value.json.card}/idMembers?{value.json.query}` | `devops/trello/cards/members/add` | Yes | Assign a member to a card. query: value=\<memberId>. |
| `CardAttachmentsList` | `GET` | `/1/cards/{value.json.card}/attachments?{value.json.query}` | `devops/trello/cards/attachments/list` | | Attachments on a card. query e.g. fields=name,url,date (or empty). |
| `CardAttachmentAddUrl` | `POST` | `/1/cards/{value.json.card}/attachments?{value.json.query}` | `devops/trello/cards/attachments/add-url` | Yes | Attach a link (no file upload). query: url=https%3A%2F%2Fbroker.example.com%2Fpanels%2Fpress7\&name=Press%207%20trend. |
| `CardChecklistsList` | `GET` | `/1/cards/{value.json.card}/checklists?{value.json.query}` | `devops/trello/cards/checklists/list` | | Checklists and their items on a card. query e.g. checkItems=all\&fields=name. |
| `ChecklistCreate` | `POST` | `/1/checklists?{value.json.query}` | `devops/trello/checklists/create` | Yes | Add a checklist to a card. query: idCard=\<cardId>\&name=Lockout%20tagout (or idChecklistSource=\<id> to copy a standard procedure). |
| `ChecklistItemAdd` | `POST` | `/1/checklists/{value.json.checklist}/checkItems?{value.json.query}` | `devops/trello/checklists/items/add` | Yes | Add an item to a checklist. query: name=Isolate%20hydraulic%20supply\&pos=bottom\&checked=false. |
| `CardCheckItemUpdate` | `PUT` | `/1/cards/{value.json.card}/checkItem/{value.json.check_item}?{value.json.query}` | `devops/trello/cards/check-items/update` | Yes | Tick or rename a checklist item on a card. query: state=complete (or incomplete), or name=... |
| `CardCustomFieldItemsList` | `GET` | `/1/cards/{value.json.card}/customFieldItems` | `devops/trello/cards/custom-fields/list` | | Custom field values set on a card. |
| `CardCustomFieldSet` | `PUT` | `/1/cards/{value.json.card}/customField/{value.json.custom_field}/item` | `devops/trello/cards/custom-fields/set` | Yes | Set a custom field value. body (JSON): \{"value":\{"number":"42"}} (or text, date, checked "true"), or \{"idValue":"\<optionId>"} for a dropdown. Empty value clears it. |
| `LabelCreate` | `POST` | `/1/labels?{value.json.query}` | `devops/trello/labels/create` | Yes | Create a label on a board. query: name=Line%202\&color=orange\&idBoard=\<boardId>. |
| `Search` | `GET` | `/1/search?{value.json.query}` | `devops/trello/search` | | Search cards, boards and more. query: query=press%207\&modelTypes=cards\&idBoards=\<boardId>\&cards\_limit=10\&partial=true. |
| `TokenWebhooksList` | `GET` | `/1/tokens/{value.json.token}/webhooks` | `devops/trello/webhooks/list` | | Webhooks owned by a token. token = the same Trello token used in authorization; do not retain this topic. |
| `WebhookCreate` | `POST` | `/1/webhooks/?{value.json.query}` | `devops/trello/webhooks/create` | Yes | Point board, list or card changes at a Coreflux ENABLE\_SERVER REST\_API connector. query: callbackURL=https%3A%2F%2Fbroker.example.com%2Ftrello%2Fevents\&idModel=\<boardId>\&description=Porto%20maintenance. Trello sends a HEAD request to callbackURL first and needs a 200. |
| `WebhookGet` | `GET` | `/1/webhooks/{value.json.webhook}` | `devops/trello/webhooks/get` | | One webhook (callbackURL, idModel, active, consecutiveFailures). |
| `WebhookUpdate` | `PUT` | `/1/webhooks/{value.json.webhook}?{value.json.query}` | `devops/trello/webhooks/update` | Yes | Pause, resume or retarget a webhook. query e.g. active=false or callbackURL=... |
| `Batch` | `GET` | `/1/batch?{value.json.query}` | `devops/trello/batch` | | Up to 10 GET calls in one request. query: urls=/boards/\<boardId>/lists,/lists/\<listId>/cards (paths without /1). |

## Limits

Trello allows 300 requests per 10 seconds per API key and 100 requests per 10 seconds per token, and answers `429` above that. `Batch` folds up to 10 GET calls into one request. Custom fields need the Custom Fields Power-Up on the board.

## Not packaged

* All DELETE endpoints (boards, lists, cards, labels, checklists, attachments, webhooks) on purpose; archive with `closed=true` instead.
* File uploads to cards (multipart); `CardAttachmentAddUrl` attaches links only.
* Board membership and Workspace administration, enterprise endpoints, Power-Up plugin data, stickers, emoji, notifications and saved searches.
* The incoming webhook direction: Trello posts change events to a separate `ENABLE_SERVER` REST\_API connector, which must answer the creation `HEAD` request and verify `X-Trello-Webhook`.

## Suggested branches

`feat/rest-api-route-trello` for the broker template and `feat/docs-rest-api-trello` for this page.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.