Skip to content

# 03 — MicroDAO API Core Snapshot (MVP)

Цей документ — стисла витяжка з OpenAPI 3.1 специфікації MicroDAO. Він містить тільки ті ендпоїнти, які необхідні для реалізації MVP онбордингу, чатів, задач та приватного агента.

Повна OpenAPI: див. `microdao — API Specification (OpenAPI 3.1)`.

## 1. Auth

### POST /auth/login-email

Надсилає магічний лінк користувачу на email.

Body

    { "email": "user@example.com" }

Response `204 No Content`

### POST /auth/exchange

Обмін коду з email-лінка на JWT.

Body

    { "code": "XXXXXX" }

Response 200

    {
      "token": "jwt-string",
      "user": {
        "id": "u_123",
        "locale": "uk-UA",
        "tz": "Europe/Kyiv"
      }
    }

## 2. Teams (micro-DAO)

### POST /teams

Створює нову спільноту (micro-DAO).

Body

    { "name": "My Team" }

Response 201

    {
      "id": "t_123",
      "name": "My Team",
      "slug": "my-team",
      "mode": "public"
    }

### PATCH /teams/{teamId}

Оновлює налаштування спільноти.

Body

    { "mode": "public" | "confidential" }

Response 200

    {
      "id": "t_123",
      "name": "My Team",
      "mode": "confidential"
    }

### GET /teams

Список моїх спільнот.

Response

    {
      "items": [
        { "id": "t_1", "name": "Team 1", "mode": "public" },
        { "id": "t_2", "name": "Project Alpha", "mode": "confidential" }
      ]
    }

## 3. Channels

### POST /channels

Створює канал.

Body

    {
      "team_id": "t_123",
      "type": "public" | "group",
      "title": "general",
      "mode": "public" | "confidential"
    }

Response 201

    {
      "id": "c_123",
      "team_id": "t_123",
      "title": "general",
      "type": "public",
      "mode": "public"
    }

### GET /channels/{channelId}/messages

Отримує повідомлення каналу (cursor pagination).

Query params * `cursor` (optional) * `limit` (1–200)

Response

    {
      "items": [
        {
          "id": "m_1",
          "author_user_id": "u_123",
          "kind": "text",
          "body_plain": "Hello world",
          "created_at": "2025-01-01T12:00:00Z"
        }
      ],
      "next_cursor": "abc123"
    }

(У confidential-каналах буде `body_enc` + `key_id` замість `body_plain`.)

### POST /channels/{channelId}/messages

Надсилає повідомлення.

Body

    {
      "kind": "text",
      "body": "Привіт командо!"
    }

Response 201

    {
      "id": "m_123",
      "kind": "text",
      "author_user_id": "u_123",
      "created_at": "2025-01-01T12:00:00Z"
    }

## 4. Follow-ups

### POST /followups

Створює follow-up із повідомлення.

Body

    {
      "team_id": "t_123",
      "assignee_id": "u_123",
      "src_message_id": "m_456",
      "due": "2025-02-01T09:00:00Z"
    }

Response 201

    {
      "id": "fu_1",
      "status": "open"
    }

### GET /followups

Список follow-up.

Query * `assignee` (optional) * `status` (optional) * `cursor` (optional)

Response

    {
      "items": [
        {
          "id": "fu_1",
          "status": "open",
          "assignee_id": "u_123",
          "due": "2025-02-01T09:00:00Z"
        }
      ]
    }

## 5. Projects & Tasks

### POST /projects

Створює проєкт.

Body

    {
      "team_id": "t_123",
      "name": "Website Launch",
      "visibility": "public"
    }

Response

    {
      "id": "p_1",
      "team_id": "t_123",
      "name": "Website Launch"
    }

### GET /projects

Список проєктів.

Response

    { "items": [ { "id": "p_1", "name": "Website Launch" } ] }

### POST /projects/{projectId}/tasks

Створює задачу.

Body

    {
      "title": "Design homepage",
      "status": "backlog"
    }

Response 201

    {
      "id": "task_1",
      "project_id": "p_1",
      "status": "backlog"
    }

### GET /projects/{projectId}/tasks

Отримує задачі.

Query * `status` (optional)

Response

    {
      "items": [
        {
          "id": "task_1",
          "title": "Design homepage",
          "status": "backlog"
        }
      ]
    }

## 6. Agents

### GET /agents

Список приватних агентів.

Response

    {
      "items": [
        {
          "id": "ag_1",
          "name": "Team Assistant",
          "owner_kind": "team",
          "owner_id": "t_123"
        }
      ]
    }

### POST /agents

Створює агента.

Body

    {
      "owner_kind": "team",
      "owner_id": "t_123",
      "name": "Team Assistant",
      "role": "general",
      "scopes": ["chat"]
    }

Response

    {
      "id": "ag_1",
      "status": "created"
    }

## 7. Search

### GET /search

Глобальний пошук по команді.

Query * `q` — текст * `scope`: `messages | files | docs | tasks | people`

Response

    {
      "results": [
        {
          "type": "message",
          "id": "m_1",
          "snippet": "Hello world"
        }
      ]
    }

## 8. Errors (узагальнення)

- 400 — неправильні дані
- 401 — без авторизації
- 403 — заборонено (немає прав)
- 404 — не знайдено
- 409 — конфлікт
- 429 — rate limit
- 500 — помилка сервера

Cursor повинен обробляти помилки через toast + лог у консоль.

## 9. Примітка

Цей документ — спрощена карта API.

Він узятий з офіційної специфікації MicroDAO і адаптований для:

- автоматичної генерації типів,
- швидкої розробки фронтенду,
- мінімізації зайвих деталей.