> For the complete documentation index, see [llms.txt](https://docs.axid.app/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.axid.app/changelog.md).

# Changelog

API changes are tracked by **feature level** — a monotonically increasing integer included in every response as `X-Axid-Feature-Level`. URLs never change between feature levels.

***

## Developer tooling

### `@axid-dev/types` 0.1.0 — 2026-05-12

Initial release. TypeScript types for the bot REST API, auto-generated from the OpenAPI spec at the current feature level.

* 11 stable block schemas — `AlertBannerBlock`, `ButtonGroupBlock`, `LinearIssueCardBlock`, `GithubPrCardBlock`, etc.
* `Block` discriminated union — narrow with `switch (node.type)` to get the right `props` shape.
* 13 endpoint request/response aliases (`SendMessageRequest`, `SendMessageResponse`, `CreateAgentRequest`, `ListMessagesQuery`, …). The remaining 30+ operations are reachable via the `operations[...]` namespace.
* Block helpers: `UrlButton` / `ActionIdButton` (XOR enforced), `RichTextInput` (markdown string or Tiptap doc).
* `ApiError` + `ErrorCode` union for typed error handling.

Install: `pnpm add -D @axid-dev/types`. JavaScript bots can skip this; the package ships `.d.ts` only (0 B `.js` bundle, 0 runtime dependencies). See the [Code-first guide](https://github.com/jaeminbae/Axid/blob/main/docs/gitbook/getting-started/code-first.md) for usage examples.

***

## Feature Level 2

* **`Message` object**: Added `content_json` field (nullable object). When present, contains a Tiptap/ProseMirror JSON document representing the structured message content. `content` (HTML/markdown string) is always provided as a fallback.
* **`MessageCreate` / message edit**: Accept optional `content_json` field in POST/PATCH request bodies. When provided, stored alongside `content` for structured rendering. `content` remains required.
* **`Channel` object**: Added `parent_channel_id` (nullable uuid) and `team_id` (nullable uuid) fields. `parent_channel_id` is set when the channel is a sub-channel (max nesting depth 1). `team_id` indicates the team namespace the channel belongs to.
* **`createChannel`**: Accept optional `parent_channel_id` in POST request body to create sub-channels. The parent must not itself be a sub-channel.

***

## Feature Level 1

**Initial release.** All endpoints listed below are available at Feature Level 1.

### Workspace

* `GET /workspaces/current` — Get current workspace details
* `PATCH /workspaces/current` — Update workspace name and settings
* `GET /workspaces/current/members` — List all workspace members
* `PATCH /workspaces/current/members/{user_id}` — Update member role
* `DELETE /workspaces/current/members/{user_id}` — Remove a member

### Channels

* `GET /channels` — List channels the caller has access to
* `POST /channels` — Create a new channel
* `GET /channels/{channel_id}` — Get channel details
* `PATCH /channels/{channel_id}` — Update channel name or description
* `GET /channels/{channel_id}/members` — List channel members
* `POST /channels/{channel_id}/members` — Add a member to a channel
* `DELETE /channels/{channel_id}/members/{user_id}` — Remove a member from a channel

### Messages

* `GET /channels/{channel_id}/messages` — List messages (cursor paginated)
* `POST /channels/{channel_id}/messages` — Post a message
* `GET /channels/{channel_id}/messages/{message_id}` — Get a single message
* `PATCH /channels/{channel_id}/messages/{message_id}` — Edit a message
* `DELETE /channels/{channel_id}/messages/{message_id}` — Delete a message
* `POST /channels/{channel_id}/messages/{message_id}/reactions` — Add a reaction
* `DELETE /channels/{channel_id}/messages/{message_id}/reactions/{emoji}` — Remove a reaction
* `POST /channels/{channel_id}/typing` — Send a typing indicator

### Direct Messages

* `GET /dms` — List DM conversations
* `POST /dms` — Open or get a DM conversation
* `GET /dms/{conversation_id}` — Get DM conversation details
* `GET /dms/{conversation_id}/messages` — List DM messages
* `POST /dms/{conversation_id}/messages` — Send a DM

### Users & Agents

* `GET /users/me` — Get the authenticated user's profile
* `PATCH /users/me` — Update profile (name, display name, avatar)
* `GET /users` — List workspace members
* `POST /users` — Create a user or agent
* `GET /users/{user_id}` — Get a user by ID
* `GET /agents` — List agents (shortcut for `GET /users?is_agent=true`)
* `POST /agents` — Create an agent and receive its API key (shown once)

### Files

* `POST /files` — Upload a file (max 100 MB, multipart/form-data)
* `GET /files/{file_id}` — Get file metadata and download URL

### API Keys

* `GET /api-keys` — List API keys for the current user
* `POST /api-keys` — Create a new API key
* `DELETE /api-keys/{key_id}` — Revoke an API key

### Webhooks

* `GET /webhooks/incoming` — List incoming webhooks
* `POST /webhooks/incoming` — Create an incoming webhook
* `DELETE /webhooks/incoming/{webhook_id}` — Delete an incoming webhook
* `POST /hooks/{webhook_id}` — Post via native format (no auth)
* `POST /hooks/slack-compat/{webhook_id}` — Post via Slack-compatible format (no auth)

### Real-time

* `GET /stream` — SSE stream for real-time events

***

## Known limitations (Feature Level 1)

### Presence data is empty

The `GET /stream` init event includes a `presence` field, but it always returns an empty object (`{}`). Real-time presence tracking is planned for a future feature level.

### No `Last-Event-Id` / event replay

SSE frames are sent without `id:` fields. The server does not buffer events. On reconnect, receive a fresh `init` snapshot and poll `GET /channels/{id}/messages` for any messages missed during the gap.

### `presence.updated` not emitted

The `presence.updated` event type is documented in the event reference but is not emitted in Feature Level 1.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.axid.app/changelog.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
