LystBot API docs: REST, MCP server and CLI

The list app your AI can actually use. CLI v0.4.1

Quick start

Four ways to connect. Pick one:

MethodBest forSetup time
CLIOpenClaw, Grok Bot, agents with a shell, scripts1 minute
MCP serverClaude Desktop, Claude Code, Codex, Cursor, Devin Desktop, Antigravity2 minutes
REST APICopilot Studio, Gemini and xAI function calling, your own code5 minutes
AlexaAdding things by voice on Echo devices1 minute

ChatGPT connects with an app pairing code instead of an API key: ChatGPT setup.

Step 1: Install the LystBot app (iOS / Android)

Step 2: Copy your API key from Settings β†’ AI Agents

Step 3: Pick a way to connect below

REST API reference

Base URL: https://lystbot.com/api/v1

Unless stated otherwise, request and response bodies use Content-Type: application/json. Image uploads use multipart/form-data; image and thumbnail GETs return authenticated binary image responses. New lists, items and favorites need a client-generated UUID v4 as id. For reminders, id is optional on creation, generated by the server when omitted or empty. A supplied non-empty ID must be a valid UUID.

Authentication

MethodHeaderUsed by
Bearer tokenAuthorization: Bearer YOUR_API_KEYAI agents, CLI, MCP server, automations
Bearer token with app contextAuthorization: Bearer YOUR_API_KEY
X-LystBot-Client: app
The mobile app from version 1.0.8

X-Device-UUID is legacy-only and is rejected with bearer_required after the device migrates to Bearer authentication.

Agents only need the API key. The user finds it in the app under Settings β†’ AI Agents. Bearer responses redact member device_uuid and item created_by to null. Use is_me and role to identify your own membership and display permissions. Agents do not need the app context header.


Endpoints overview

MethodEndpointDescription
GET/api/v1/healthHealth check (no auth)
GET/api/v1/listsGet all lists
POST/api/v1/listsCreate a list
GET/api/v1/lists/{id}Get a list with items, sections and members
PUT/api/v1/lists/{id}Update a list
DELETE/api/v1/lists/{id}Delete a list
PUT/api/v1/lists/reorderSet the caller's list order
POST/api/v1/lists/{id}/itemsAdd an item
PUT/api/v1/lists/{id}/items/{itemId}Update an item
DELETE/api/v1/lists/{id}/items/{itemId}Delete an item
DELETE/api/v1/lists/{id}/items/checkedDelete all checked items
POST/api/v1/lists/{id}/categoriesCreate a section
PUT/api/v1/lists/{id}/categories/{categoryId}Rename a section
PUT/api/v1/lists/{id}/categories/reorderReorder sections
DELETE/api/v1/lists/{id}/categories/{categoryId}Delete a section (items move to Other)
POST/api/v1/items/{itemId}/attachments/imagesAttach an image
POST/api/v1/items/{itemId}/attachments/urlsAttach a link
GET/api/v1/items/{itemId}/attachmentsList attachments
DELETE/api/v1/attachments/{attachmentId}Delete an attachment
POST/api/v1/lists/{id}/shareGet a share code
POST/api/v1/lists/joinJoin a shared list
POST/api/v1/lists/{id}/leaveLeave a shared list
GET/api/v1/remindersGet all reminders
POST/api/v1/remindersCreate a reminder
GET/api/v1/reminders/{id}Get one reminder
PUT/api/v1/reminders/{id}Update a reminder
DELETE/api/v1/reminders/{id}Delete a reminder
GET/api/v1/favoritesGet favorites
POST/api/v1/favoritesCreate a favorite
PUT/api/v1/favorites/{id}Update a favorite
DELETE/api/v1/favorites/{id}Delete a favorite
POST/api/v1/favorites/{id}/useCount a favorite as used
PATCH/api/v1/agents/meSet the agent's name and emoji

Health check

GET /api/v1/health

No authentication required.

curl https://lystbot.com/api/v1/health
{
  "status": "ok"
}

Lists

Get all lists

GET /api/v1/lists
curl https://lystbot.com/api/v1/lists \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "lists": [
    {
      "id": "list-uuid",
      "title": "Groceries",
      "type": "shopping",
      "emoji": "πŸ›’",
      "is_shared": true,
      "share_code": "ABC123",
      "member_count": 2,
      "item_count": 5,
      "unchecked_count": 3,
      "updated_at": "2026-04-14T11:00:00Z"
    }
  ]
}

Create a list

POST /api/v1/lists
curl -X POST https://lystbot.com/api/v1/lists \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id": "NEW_LIST_UUID", "title": "Groceries", "type": "shopping", "emoji": "πŸ›’"}'
{
  "id": "NEW_LIST_UUID",
  "created_at": "2026-04-14T11:05:00Z"
}

id and title are required. List types: shopping, todo, packing, generic (default).

Get a list with items

GET /api/v1/lists/{id}
curl https://lystbot.com/api/v1/lists/LIST_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "id": "list-uuid",
  "title": "Groceries",
  "type": "shopping",
  "emoji": "πŸ›’",
  "is_shared": true,
  "share_code": "ABC123",
  "members": [ ... ],
  "bot_members": [ ... ],
  "categories": [
    { "id": "cat-fruit", "name": "Fruit", "position": 0 }
  ],
  "items": [
    {
      "id": "item-uuid",
      "category_id": "cat-fruit",
      "text": "Bananas",
      "checked": false,
      "quantity": 2,
      "unit": null,
      "position": 0,
      "updated_at": "2026-04-14T10:05:00Z"
    }
  ]
}

Update a list

PUT /api/v1/lists/{id}
curl -X PUT https://lystbot.com/api/v1/lists/LIST_ID \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Weekly Groceries", "emoji": "πŸ›’", "hide_completed": false}'

Delete a list

DELETE /api/v1/lists/{id}
curl -X DELETE https://lystbot.com/api/v1/lists/LIST_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Returns {"success": true}.

Reorder lists

PUT /api/v1/lists/reorder
curl -X PUT https://lystbot.com/api/v1/lists/reorder \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"order": [{"list_id": "LIST_ID_1", "position": 0}, {"list_id": "LIST_ID_2", "position": 1}]}'

Set the caller's list order. Include every current list exactly once, in array order with consecutive integer positions starting at zero. This example assumes the caller has exactly two lists; replace the IDs with the complete current set. Invalid shape returns 400, inaccessible lists 403, and an incomplete or stale set 409. Returns {"success": true}.


Items

Add an item

POST /api/v1/lists/{id}/items
curl -X POST https://lystbot.com/api/v1/lists/LIST_ID/items \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id": "NEW_ITEM_UUID", "text": "Flour", "quantity": 1, "unit": "500g"}'
{
  "id": "NEW_ITEM_UUID"
}

id and text are required. CLI and local MCP counts are integers in 1..99. REST quantity handling depends on unit: creation validates the applicable range, while updates clamp values to it. Do not infer REST limits from CLI limits. Weights and volumes go into unit, so 250 g of flour is "unit": "250g", not "quantity": 250. Set category_id to put the item into a section; without it, the item goes to Other. A list holds up to 300 items.

Update an item (check, uncheck, edit)

PUT /api/v1/lists/{id}/items/{itemId}

Send any of text, checked, quantity, unit, position, category_id.

curl -X PUT https://lystbot.com/api/v1/lists/LIST_ID/items/ITEM_ID \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"checked": true}'

Delete an item

DELETE /api/v1/lists/{id}/items/{itemId}
curl -X DELETE https://lystbot.com/api/v1/lists/LIST_ID/items/ITEM_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Returns {"success": true}. To clear all checked items at once, use DELETE /api/v1/lists/{id}/items/checked.


Sections and attachments

Sections (categories in the API) split a list into groups like Produce or Dairy. Create one with POST /lists/{id}/categories and {"id": "NEW_CATEGORY_UUID", "name": "Fruit"}. Deleting a section moves its items to Other.

Items can carry images and links: POST /items/{itemId}/attachments/images takes a multipart/form-data field file, POST /items/{itemId}/attachments/urls takes {"url": "https://...", "title": "Recipe"}. Do not set Content-Type manually for the upload; the boundary must come from the client.

Images accept JPEG, PNG or WebP up to 5 MiB. The server converts them to JPEG with a maximum long edge of 1600 px and creates thumbnails with a maximum long edge of 300 px. URL attachments accept http/https links up to 2048 bytes and optional titles up to 255 characters; links are stored without fetching or unfurling.


Sharing

Get a share code

POST /api/v1/lists/{id}/share
curl -X POST https://lystbot.com/api/v1/lists/LIST_ID/share \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "share_code": "ABC123"
}

Join a shared list

POST /api/v1/lists/join
curl -X POST https://lystbot.com/api/v1/lists/join \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"code": "ABC123"}'
{
  "list_id": "list-uuid",
  "title": "Groceries",
  "emoji": "πŸ›’",
  "members": [ ... ]
}

Leave a shared list

POST /api/v1/lists/{id}/leave
curl -X POST https://lystbot.com/api/v1/lists/LIST_ID/leave \
  -H "Authorization: Bearer YOUR_API_KEY"

Returns {"success": true}.


Reminders

One-time or recurring reminders with a push notification. repeat is one of none, daily, weekly, biweekly, monthly, yearly. The API accepts one-time reminders ("repeat": "none") with a timestamp in the past. Replace scheduled_at with a future local date and time in the specified timezone.

curl -X POST https://lystbot.com/api/v1/reminders \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id": "NEW_REMINDER_UUID", "title": "Take vitamins", "scheduled_at": "2027-01-15 09:00",
       "timezone": "Europe/Berlin", "repeat": "none", "is_enabled": true}'

GET /reminders lists them, PUT /reminders/{id} changes any field, DELETE /reminders/{id} deletes one.


Favorites

Items the user adds often, like the milk that goes on the grocery list every week.

Get all favorites

GET /api/v1/favorites
curl "https://lystbot.com/api/v1/favorites?type=shopping" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "favorites": [
    {
      "id": "fav-uuid",
      "text": "Milk",
      "list_type": "shopping",
      "category": "Dairy",
      "use_count": 12,
      "updated_at": "2026-04-14T10:30:00Z"
    }
  ]
}

Create a favorite

POST /api/v1/favorites
curl -X POST https://lystbot.com/api/v1/favorites \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id": "NEW_FAVORITE_UUID", "text": "Milk", "list_type": "shopping", "category": "Dairy"}'

Count a favorite as used

POST /api/v1/favorites/{id}/use

Raises use_count, which sorts favorites. It doesn't add anything to a list; add the item with POST /lists/{id}/items.

Update / delete a favorite

PUT /api/v1/favorites/{id}     # {"text": "Oat milk", "category": "Dairy"}
DELETE /api/v1/favorites/{id}  # returns {"success": true}

Agent profile

Sets the name and emoji other members see next to your changes in shared lists.

PATCH /api/v1/agents/me
curl -X PATCH https://lystbot.com/api/v1/agents/me \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "TARS", "signature_emoji": "πŸ€–"}'

MCP server

The CLI includes an MCP server. It runs locally over stdio, so it works with any MCP client that can start a local server. A remote OAuth MCP endpoint is also available at https://lystbot.com/api/v1/mcp. The remote endpoint uses OAuth rather than the local server's API key; client compatibility and available tools differ. Listed in the official MCP Registry.

Setup

  1. Install the LystBot app and copy your API key (Settings β†’ AI Agents)
  2. Log in:
    npx lystbot login YOUR_API_KEY
  3. Add the server to your client:

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows), then restart Claude Desktop:

{
  "mcpServers": {
    "lystbot": {
      "command": "npx",
      "args": ["lystbot", "mcp"]
    }
  }
}

Claude Code, Codex, Grok Build, OpenClaw:

claude mcp add lystbot -- npx lystbot mcp
codex mcp add lystbot -- npx lystbot mcp
grok mcp add lystbot -- npx lystbot mcp
openclaw mcp add lystbot -- npx lystbot mcp

Cursor, Devin Desktop, Antigravity, Cline: the same JSON as above, in .cursor/mcp.json (Cursor), ~/.config/devin/mcp_config.json (Devin Desktop, formerly Windsurf) or ~/.gemini/config/mcp_config.json (Antigravity). Cline has its own MCP settings screen.

Hermes Agent: add the server under mcp_servers in ~/.hermes/config.yaml with command npx and args ["lystbot", "mcp"]. Devin CLI: devin mcp add. CrewAI: stdio via MCPServerAdapter.

Local stdio MCP tools (26)

ToolDescription
list_listsGet all lists
get_listGet one list with its items
create_listCreate a list
delete_listDelete a list
add_itemsAdd items as plain text (250g flour, 3x milk) or as {text, quantity?, unit?}
check_itemCheck off an item
uncheck_itemUncheck an item
remove_itemRemove an item
clear_checkedRemove all checked items
share_listGet a share code
join_listJoin a shared list
list_categoriesList the sections of a list
create_categoryCreate a section
rename_categoryRename a section
delete_categoryDelete a section
reorder_categoriesReorder sections
move_itemMove an item to a section or to Other
add_item_imageAttach an image (local path or base64)
add_item_urlAttach a link
list_item_attachmentsList the attachments of an item
delete_item_attachmentDelete an attachment
list_remindersGet all reminders
get_reminderGet one reminder
create_reminderCreate a reminder
update_reminderChange, enable or disable a reminder
delete_reminderDelete a reminder

Remote ChatGPT MCP tools (7)

list_lists, get_list, list_reminders, create_list, add_items, update_item, create_reminder. Use update_item to check or uncheck an item. Delete and sharing tools are unavailable.

Supported clients

CLI

Manage lists from the terminal, yourself or through an AI agent.

Install

# Run directly (no install)
npx lystbot

# Or install globally
npm install -g lystbot

Log in

npx lystbot login YOUR_API_KEY

The key is stored in ~/.lystbot/config.json. For several agents on one machine, give each its own file with --config <path> or LYSTBOT_CONFIG.

Commands

# Lists
npx lystbot lists                              # all lists
npx lystbot create "Groceries" --type shopping --emoji "πŸ›’"
npx lystbot show "Groceries"                   # one list with items
npx lystbot delete "Groceries" --force

# Items
npx lystbot add "Groceries" "Milk, Eggs, Bread"
npx lystbot add "Groceries" "Flour" --quantity 2 --unit "500g"
npx lystbot check "Groceries" "Milk"
npx lystbot uncheck "Groceries" "Milk"
npx lystbot remove "Groceries" "Milk"

# Sections
npx lystbot categories "Groceries"
npx lystbot category add "Groceries" "Fruit"
npx lystbot move "Groceries" "Bananas" --category "Fruit"

# Attachments
npx lystbot attach-image "Groceries" "Milk" ./photo.jpg
npx lystbot attach-url "Groceries" "Milk" "https://example.com" "Recipe"

# Reminders
npx lystbot reminders
npx lystbot remind "Take vitamins" --at "tomorrow 09:00" --timezone "Europe/Berlin"
npx lystbot reminder-update <id> --disabled
npx lystbot reminder-delete <id> --yes

# Sharing
npx lystbot share "Groceries"                  # get a share code
npx lystbot join ABC123                        # join a shared list

# Agent name and emoji in shared lists
npx lystbot profile --name "TARS" --emoji "πŸ€–"

# JSON output (for scripts and AI agents)
npx lystbot show "Groceries" --json | jq '.items'

# MCP server mode
npx lystbot mcp

Options

FlagDescription
--jsonOutput as JSON (on lists, show, categories and the reminder commands)
--config <path>Use a different config file
--api <url>Use a different API base URL
--versionShow the version
--helpShow help

Alexa

LystBot has an official Alexa skill. Alexa handles the wake word and speech-to-text, then forwards the spoken command to the LystBot voice endpoint. That endpoint uses the same command layer as the API, the MCP server and the CLI.

Setup

  1. Enable the LystBot skill for Alexa.
  2. LystBot gives you a pairing code. Say it to Alexa once.
  3. Talk to your lists: "Alexa, tell LystBot to add milk to my shopping list."

How the pairing works

The pairing code links your (hashed) Alexa user id to your LystBot user/device. That link is the only account association LystBot creates for Alexa.

Intent model

RawCommandIntent
  command : AMAZON.SearchQuery   # the free-form spoken command

  -> LystBot voice/command endpoint
  -> same command layer as API / MCP / CLI
What is processed. Amazon converts your speech to text; only the recognized command text is transmitted to LystBot, never audio recordings. LystBot processes that text together with the hashed Alexa user id to carry out the list action. See the Privacy Policy for the full data handling description.

Agent system prompt

Copy this into your agent's system prompt or context file:

System prompt block

You have access to the user's LystBot lists.

## MCP (preferred)
If the LystBot MCP tools are available, use them: list_lists, get_list,
create_list, add_items, check_item, uncheck_item, remove_item, share_list,
join_list, plus the category and reminder tools.
Use only tools advertised by the connected MCP server. For ChatGPT remote MCP,
use update_item with checked: true or checked: false to check or uncheck
items. Deletion, sharing and category tools are not available through this
connection.

## CLI
npx lystbot lists | show | create | add | check | uncheck | remove | share | join

## REST API
Base URL: https://lystbot.com/api/v1
Auth: Authorization: Bearer API_KEY
New lists and items need a client-generated UUID v4 as "id".

- GET    /lists                    - All lists
- POST   /lists                    - Create list {"id": "<uuid>", "title": "...", "type": "shopping|todo|packing|generic"}
- GET    /lists/:id                - One list with its items
- PUT    /lists/:id                - Update list {"title": "...", "emoji": "..."}
- DELETE /lists/:id                - Delete list
- POST   /lists/:id/items          - Add item {"id": "<uuid>", "text": "...", "quantity": 1-99 (1-9999 with unit), "unit": "..."}
- PUT    /lists/:id/items/:itemId  - Change item {"checked": true}
- DELETE /lists/:id/items/:itemId  - Remove item
- POST   /lists/:id/share          - Get share code
- POST   /lists/join               - Join list {"code": "..."}

When the user asks to add something to a list, add it.
When the user asks what's on a list, read the list first.
Tell the user what you changed.

Errors

Errors come back as JSON with a machine-readable code and a message:

{
  "error": "not_found",
  "message": "List not found"
}
StatusCommon codes
400missing_fields, invalid_type, invalid_category
401invalid_api_key
403forbidden (not a member, or owner-only action)
404not_found, invalid_code
409conflict, already_member
422max_items_reached (300 items per list)
Tips for AI agents: Keep the API key and reuse it. Check items off instead of deleting them, so people can see what's done. Branch on the error code, not on the message text.

© 2026 TourAround UG (haftungsbeschränkt) · Privacy · Imprint