← Back to Skills
Productivity

Flux Kanban

umin By umin 👁 3 views ▲ 0 votes

Flux Kanban is an OpenClaw skill that teaches AI agents to operate Flux task management through its REST API: create and move cards, manage boards and columns, assign members, toggle labels, run full-text search, and build board automations.

GitHub
---
name: flux
description: Manage Flux kanban boards, cards, columns, and labels through the Flux REST API. Create and move cards, assign members, toggle labels, search, and build board automations.
version: 1.0.0
homepage: https://flux.umin.ai
metadata:
  openclaw:
    emoji: 🗂️
    primaryEnv: FLUX_API_KEY
    envVars:
      - name: FLUX_API_KEY
        required: true
        description: Flux API key. Starts with `flux_`. Create one in Flux under Settings → API Keys.
      - name: FLUX_BASE_URL
        required: false
        description: Base URL of your Flux instance. Defaults to https://flux.umin.ai.
---

# Flux

Flux is a kanban board management platform. Use this skill to build automations, manage
cards, and organize work through the Flux REST API.

## Setup

- **`FLUX_API_KEY`** (required) — an API key beginning with `flux_`. Every request is
  authenticated with it.
- **`FLUX_BASE_URL`** (optional) — the origin of the Flux instance, e.g.
  `https://flux.umin.ai`. Defaults to `https://flux.umin.ai`.

## Authentication

Send the key as a Bearer token on every request:

```
Authorization: Bearer flux_YOUR_KEY
```

API keys carry granular scopes, so a request may succeed for reads but be rejected for
writes if the key lacks the scope. A `401` means the key is missing or invalid; a `403`
means the key is valid but not permitted for that action.

## Core concepts

- **Active workspace** — most board/card endpoints operate on the *active workspace* tied
  to the key. List workspaces with `GET /api/workspaces`, change it with
  `POST /api/workspaces/switch`.
- **Two ID formats** — boards accept either a UUID or a short URL id (`shortId`, e.g.
  `av-tX6qQ`). Cards have an internal UUID *and* a human id (`humanId`, e.g. `TB-1`) used in
  URLs. Use the UUID for write operations unless an endpoint says otherwise.
- **Cache key gotcha** — a board is keyed by its `shortId`, not by `card.boardId` (which is
  a UUID). Don't assume the two are interchangeable when matching a card to its board.
- **Soft deletes** — every `DELETE` is reversible. Deleted records are hidden, not
  destroyed, and can be restored via `POST /api/undo`.
- **Idempotency** — include `X-Idempotency-Key: <uuid>` on every write (POST/PATCH/PUT/
  DELETE). On retry, Flux returns the original result instead of duplicating the action.
- **Dates** — all timestamps are ISO 8601.

## Endpoints

### Workspaces

| Method | Path | Body / Query | Notes |
|---|---|---|---|
| GET | `/api/workspaces` | — | List your workspaces → `{ workspaces: [{ id, name, slug }] }` |
| POST | `/api/workspaces` | `{ name }` | Create a workspace |
| POST | `/api/workspaces/switch` | `{ workspaceId }` | Set the active workspace |

### Boards

| Method | Path | Body / Query | Notes |
|---|---|---|---|
| GET | `/api/boards` | — | Boards in the active workspace → `{ boards: [{ id, shortId, title, columns }] }` |
| GET | `/api/boards/all` | — | Boards across all workspaces |
| POST | `/api/boards` | `{ title, workspaceId? }` | Create a board |
| GET | `/api/boards/{boardId}` | accepts shortId or UUID | Full board → `{ board, cards: { [cardId]: card }, boardLabels, members }` |
| PATCH | `/api/boards/{boardId}` | `{ title?, settings?, doneColumnId? }` | Update a board |
| DELETE | `/api/boards/{boardId}` | — | Soft-delete a board |

### Columns

| Method | Path | Body / Query | Notes |
|---|---|---|---|
| POST | `/api/columns` | `{ boardId, title }` | Create a column |
| PATCH | `/api/columns` | `{ columnId, title?, isDone? }` | Update a column |
| DELETE | `/api/columns?columnId={id}` | — | Delete a column |
| PUT | `/api/columns/reorder` | `{ boardId, columnIds: [ordered UUIDs] }` | Reorder columns |

### Cards

| Method | Path | Body / Query | Notes |
|---|---|---|---|
| POST | `/api/cards` | `{ boardId, columnId, title, description? }` | Create a card |
| PATCH | `/api/cards` | `{ cardId, title?, description?, columnId?, assignees?, dueDate?, coverUrl?, archivedAt? }` | Update a card. `assignees` is an array of user IDs and replaces the whole set. |
| DELETE | `/api/cards?cardId={id}` | — | Soft-delete a card |
| GET | `/api/cards/{cardId}` | — | Full detail: checklist, comments, attachments, labels, assignees |
| PUT | `/api/cards/reorder` | `{ boardId, moves: [{ cardId, columnId, position }] }` | Move/reorder cards |

### Card sub-resources

**Checklist**
| Method | Path | Body / Query |
|---|---|---|
| POST | `/api/cards/{cardId}/checklist` | `{ text }` |
| PATCH | `/api/cards/{cardId}/checklist` | `{ itemId, text?, done?, position? }` |
| DELETE | `/api/cards/{cardId}/checklist?itemId={id}` | — |

**Comments**
| Method | Path | Body / Query |
|---|---|---|
| POST | `/api/cards/{cardId}/comments` | `{ content, parentId? }` |
| PATCH | `/api/cards/{cardId}/comments` | `{ commentId, content }` |
| DELETE | `/api/cards/{cardId}/comments?commentId={id}` | — |

**Labels on a card** (toggle a board-level label onto the card)
| Method | Path | Body / Query |
|---|---|---|
| POST | `/api/cards/{cardId}/labels` | `{ labelId }` |
| DELETE | `/api/cards/{cardId}/labels?labelId={id}` | — |

**Attachments**
| Method | Path | Body / Query | Notes |
|---|---|---|---|
| POST | `/api/cards/{cardId}/attachments/upload-url` | `{ fileName, mimeType }` | Returns a presigned S3 upload URL |
| POST | `/api/cards/{cardId}/attachments` | `{ fileName, fileUrl, s3Key?, mimeType? }` | Register the attachment after uploading |
| DELETE | `/api/cards/{cardId}/attachments?attachmentId={id}` | — | Delete an attachment |

### Labels (board-level definitions)

| Method | Path | Body / Query |
|---|---|---|
| POST | `/api/boards/{boardId}/labels` | `{ text, color }` |
| PATCH | `/api/boards/{boardId}/labels` | `{ labelId, text?, color? }` |
| DELETE | `/api/boards/{boardId}/labels?labelId={id}` | — |

### Search & undo

| Method | Path | Body / Query | Notes |
|---|---|---|---|
| GET | `/api/search?q={query}&workspaceId={id?}&type={card\|board?}` | — | Full-text search |
| POST | `/api/undo` | `{ boardId }` | Undo the last action on a board |

## Common workflows

### Create a card on a board
1. `GET /api/boards` — find the board by title, note its `shortId`.
2. `GET /api/boards/{shortId}` — read `board.columns` to pick the target `columnId`.
3. `POST /api/cards` with `{ boardId, columnId, title }`.

### Move a card to another column
1. `GET /api/boards/{shortId}` — find the source/target `columnId`s and the card.
2. `PUT /api/cards/reorder` with `{ boardId, moves: [{ cardId, columnId, position: 0 }] }`
   (`position: 0` drops it at the top of the target column).

### Assign members to a card
1. `GET /api/boards/{shortId}` — the response `members` array lists user IDs.
2. `PATCH /api/cards` with `{ cardId, assignees: [userId1, userId2] }`.
   Assignees are replaced wholesale — send the full desired list, not a delta.
   Note: the **write** field is `assignees`; board reads expose the same data as
   `assigneeIds`. Sending `assigneeIds` to PATCH is silently ignored and returns
   `422 "No updates provided"`.

### Add a label to a card
1. `GET /api/boards/{shortId}` — the response `boardLabels` array lists label IDs.
   (Create the label first with `POST /api/boards/{boardId}/labels` if it doesn't exist.)
2. `POST /api/cards/{cardId}/labels` with `{ labelId }`.

## Notes & gotchas

- Always send `X-Idempotency-Key: <uuid>` on writes to make retries safe.
- All deletes are soft and reversible via `POST /api/undo`.
- Board IDs accept both UUID and `shortId`; card IDs have a UUID and a `humanId` (`TB-1`).
- Resolve a board's columns and labels *before* creating or moving cards — you need their
  IDs from `GET /api/boards/{shortId}`.
- A `403` on a write usually means the API key lacks the required scope, not that the
  resource is missing.
flux kanban ai management uminai

Comments

Sign in to leave a comment

Loading comments...