Skip to content

REST API

Conversations, groups & channels

Private chats, groups and channels: creation, members, roles, settings, invite links, pins, drafts.

Three conversation types: private (1-on-1, including Saved Messages), group and channel (broadcast — only owner/admin/moderator post). Roles: owner, admin, moderator, member. Public channels have a username and a page at /c/{username}; private ones are reachable only via invite links.

Endpoints#

GET /api/conversations #

List conversations

Bearer token

All conversations of the user (no pagination), newest activity first. type: private, group, channel; Saved Messages is a private chat with yourself. Includes the last message preview, unread and unread-mention counters, mute state, draft and number of scheduled messages.

Parameters

No parameters.

Request

curl
curl 'https://minchatapp.com/api/conversations' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
[
  {
    "id": 1,
    "name": "Design team",
    "type": "group",
    "peer_user_id": null,
    "history_ttl": 0,
    "noforwards": false,
    "my_noforwards": false,
    "peer_noforwards": false,
    "blocked": false,
    "avatar": null,
    "can_send_messages": true,
    "username": null,
    "visibility": "public",
    "share_url": null,
    "last_message": {
      "id": 28,
      "content": "OK",
      "body": "OK",
      "attachments": [],
      "created_at": "2026-10-21T06:46:11.000000Z",
      "user": "Gleb Orlov",
      "user_id": 4,
      "type": "text",
      "preview_code": null,
      "card": null
    },
    "unread_count": 0,
    "unread_mentions_count": 0,
    "muted_until": null,
    "joined_at": "2026-10-20T11:12:46+00:00",
    "draft": null,
    "scheduled_count": 3
  },
  {
    "id": 2,
    "name": "MinChat News",
    "type": "channel",
    "peer_user_id": null,
    "history_ttl": 0,
    "noforwards": false,
    "my_noforwards": false,
    "peer_noforwards": false,
    "blocked": false,
    "avatar": null,
    "can_send_messages": true,
    "username": "minchat_news",
    "visibility": "public",
    "share_url": "https://minchatapp.com/c/minchat_news",
    "last_message": {
      "id": 13,
      "content": "Version 1.0.41 is out: more stable calls and chat folders 📁",
      "body": "Version 1.0.41 is out: more stable calls and chat folders 📁",
      "attachments": [],
      "created_at": "2026-10-20T11:12:47.000000Z",
      "user": "MinChat News",
      "user_id": 1,
      "type": "text",
      "preview_code": null,
      "card": null
    },
    "unread_count": 0,
    "unread_mentions_count": 0,
    "muted_until": null,
    "joined_at": "2026-10-20T11:12:47+00:00",
    "draft": null,
    "scheduled_count": 0
  }
]
GET /api/conversations/{conversation} #

Get a conversation with messages

Bearer token

Conversation card plus a page of messages (cursor pagination, ascending by id). Without cursors returns the latest limit messages and marks the chat read (unless peek is passed). before_id — older history; after_id — catch-up after being offline (does not mark read; loop while has_more is true moving the cursor to the max id); around_id — a window centred on a message (jump to reply / search hit).

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
limit
optional query
integer
Page size (default 50).
1–100
before_id
optional query
integer
Messages with id < before_id.
after_id
optional query
integer
Messages with id > after_id.
around_id
optional query
integer
Window around this message.
peek
optional query
boolean
Do not mark the chat as read.

Request

curl
curl 'https://minchatapp.com/api/conversations/12' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "conversation": {
    "id": 1,
    "name": "Design team",
    "type": "group",
    "avatar": null,
    "user_role": "admin",
    "is_owner": true,
    "can_send_messages": true,
    "members_can_pin": false,
    "can_pin": true,
    "can_manage_subscribers": false,
    "username": null,
    "visibility": "public",
    "share_url": null,
    "pinned_messages": [],
    "peer_user_id": null,
    "unread_count": 0,
    "unread_mentions_count": 0,
    "active_call": null,
    "joined_at": "2026-10-20T11:12:46+00:00",
    "history_ttl": 0,
    "noforwards": false,
    "my_noforwards": false,
    "peer_noforwards": false,
    "blocked": false,
    "can_change_policy": true,
    "members_read_at": {
      "1": "2026-10-22T09:06:13+00:00",
      "2": null,
      "3": null,
      "4": null
    }
  },
  "messages": [
    {
      "id": 41,
      "content": "Font is slightly bolder on Windows",
      "type": "text",
      "attachments": [],
      "link_previews": null,
      "reply_to": null,
      "user": {
        "id": 3,
        "name": "Vera Kotova",
        "avatar": null,
        "is_channel": false,
        "is_bot": false,
        "username": null
      },
      "created_at": "2026-10-21T06:46:11.000000Z",
      "edited_at": null,
      "can_delete": false,
      "is_own": false,
      "read_receipt": null,
      "client_id": null,
      "forwarded_from": null,
      "permalink": null,
      "system": null,
      "card": null,
      "group_id": null,
      "mentions": [],
      "silent": false,
      "expires_at": null,
      "reply_markup": null,
      "reactions": []
    },
    {
      "id": 42,
      "content": "Will fix",
      "type": "text",
      "attachments": [],
      "link_previews": null,
      "reply_to": null,
      "user": {
        "id": 2,
        "name": "Boris Petrov",
        "avatar": null,
        "is_channel": false,
        "is_bot": false,
        "username": "boris_p"
      },
      "created_at": "2026-10-21T06:46:11.000000Z",
      "edited_at": null,
      "can_delete": false,
      "is_own": false,
      "read_receipt": null,
      "client_id": null,
      "forwarded_from": null,
      "permalink": null,
      "system": null,
      "card": null,
      "group_id": null,
      "mentions": [],
      "silent": false,
      "expires_at": null,
      "reply_markup": null,
      "reactions": []
    },
    {
      "id": 43,
      "content": "Thanks everyone!",
      "type": "text",
      "attachments": [],
      "link_previews": null,
      "reply_to": null,
      "user": {
        "id": 4,
        "name": "Gleb Orlov",
        "avatar": null,
        "is_channel": false,
        "is_bot": false,
        "username": null
      },
      "created_at": "2026-10-21T06:46:11.000000Z",
      "edited_at": null,
      "can_delete": false,
      "is_own": false,
      "read_receipt": null,
      "client_id": null,
      "forwarded_from": null,
      "permalink": null,
      "system": null,
      "card": null,
      "group_id": null,
      "mentions": [],
      "silent": false,
      "expires_at": null,
      "reply_markup": null,
      "reactions": []
    }
  ],
  "has_more": true
}
404 404
HTTP 404 · 404
{
  "success": false,
  "code": "common.not_found",
  "error": "Not found",
  "message": "Not found"
}
POST /api/conversations #

Create a group or channel

Bearer token Rate limit: 20/min

Creator becomes owner. A public channel requires username; a private one is joined only through invite links. Realtime: ConversationCreated.

Parameters

Name Type Description
name
required body
string
Title.
max 255 chars
description
optional body
string
Description.
max 500 chars
type
required body
string
group or channel.
one of: group, channel
visibility
optional body
string
public (default) or private.
one of: public, private
username
optional body
string
Public @username (required for a public channel).
max 32 chars

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"name": "Release notes", "type": "channel", "visibility": "public", "username": "release_notes", "description": "Changelog"}'

Response

HTTP 200
{
  "success": true,
  "conversation": {
    "id": 6,
    "name": "Release notes",
    "type": "channel",
    "avatar": null,
    "description": "Changelog",
    "username": "release_notes",
    "visibility": "public",
    "share_url": "https://minchatapp.com/c/release_notes",
    "last_message": null,
    "unread_count": 0
  }
}
POST /api/conversations/group #

Create a group with members

Bearer token Rate limit: 20/min

Adds the listed users and posts a system message.

Parameters

Name Type Description
name
required body
string
Name / title.
max 255 chars
description
optional body
string
Description.
max 500 chars
user_ids
required body
array
Members to add.
min 1 items
user_ids.*
optional body
integer
User id.
must exist (users)

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/group' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"name": "Weekend", "user_ids": [2, 3]}'

Response

HTTP 200
{
  "success": true,
  "conversation": {
    "id": 7,
    "name": "Weekend",
    "type": "group",
    "avatar": null
  }
}
POST /api/conversations/private #

Open a private chat

Bearer token Rate limit: 30/min

Creates or returns the 1-on-1 chat with user_id. 400 for yourself (use /saved).

Parameters

Name Type Description
user_id
required body
integer
Peer user id.
must exist (users)

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/private' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"user_id": 2}'

Response

HTTP 200
{
  "success": true,
  "conversation": {
    "id": 3,
    "name": "Boris Petrov",
    "type": "private",
    "avatar": null
  }
}
POST /api/conversations/saved #

Open Saved Messages

Bearer token Rate limit: 30/min

Creates or returns your Saved Messages chat.

Parameters

No parameters.

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/saved' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "success": true,
  "conversation": {
    "id": 4,
    "name": "Saved Messages",
    "type": "saved",
    "peer_user_id": 1,
    "avatar": null
  }
}
GET /api/conversations/random-channels #

Popular channels (alias)

Bearer token

Same as /popular-channels.

Parameters

No parameters.

Request

curl
curl 'https://minchatapp.com/api/conversations/random-channels' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
[
  {
    "id": 2,
    "name": "MinChat News",
    "type": "channel",
    "description": "Product updates",
    "avatar": null,
    "username": "minchat_news",
    "visibility": "public",
    "members_count": 3,
    "is_joined": false,
    "share_url": "https://minchatapp.com/c/minchat_news",
    "last_activity_at": "2026-10-20T11:12:47+00:00"
  }
]
GET /api/conversations/username-available #

Check a channel username

Bearer token Rate limit: 60/min

Parameters

Name Type Description
username
required query
string
Username.
max 32 chars

Request

curl
curl 'https://minchatapp.com/api/conversations/username-available?username=…' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "username": "design_news",
  "available": true,
  "reason": null,
  "code": null
}
GET /api/conversations/resolve/{username} #

Resolve a channel by username

Bearer token

Public channel card. 404 for private/hidden channels.

Parameters

Name Type Description
username
required path
string
Channel username.

Request

curl
curl 'https://minchatapp.com/api/conversations/resolve/minchat_news' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "id": 2,
  "name": "MinChat News",
  "type": "channel",
  "description": "Product updates",
  "avatar": null,
  "username": "minchat_news",
  "visibility": "public",
  "members_count": 3,
  "is_joined": true,
  "share_url": "https://minchatapp.com/c/minchat_news",
  "last_activity_at": "2026-10-20T11:12:47+00:00"
}
GET /api/conversations/{conversation}/preview #

Preview a channel without joining

Bearer token

404 for private channels you are not in, 403 when banned.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.

Request

curl
curl 'https://minchatapp.com/api/conversations/12/preview' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "id": 2,
  "name": "MinChat News",
  "type": "channel",
  "description": "Product updates",
  "avatar": null,
  "username": "minchat_news",
  "visibility": "public",
  "members_count": 3,
  "is_joined": true,
  "share_url": "https://minchatapp.com/c/minchat_news",
  "last_activity_at": "2026-10-20T11:12:47+00:00"
}
GET /api/conversations/{conversation}/info #

Conversation details and members

Bearer token

Metadata, owner, members (up to 50 per page, members_has_more), message stats, pinned messages. In channels subscribers see only staff. Pagination: after (last member id) + after_role; filter with q.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
after
optional query
integer
Cursor: last member id of the previous page.
after_role
optional query
string
Role of that member (cursor part).
q
optional query
string
Filter members by name.

Request

curl
curl 'https://minchatapp.com/api/conversations/12/info' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "id": 1,
  "name": "Design team",
  "description": "Release discussions",
  "type": "group",
  "avatar": null,
  "is_owner": true,
  "user_role": "admin",
  "members_can_pin": false,
  "can_pin": true,
  "can_manage_subscribers": false,
  "username": null,
  "visibility": "public",
  "share_url": null,
  "pinned_messages": [],
  "owner": {
    "id": 1,
    "name": "Anna Smith",
    "avatar": null
  },
  "members": [
    {
      "id": 1,
      "name": "Anna Smith",
      "avatar": null,
      "role": "admin",
      "joined_at": "2026-10-20 11:12:46",
      "last_seen_at": "2026-10-22T09:06:13+00:00",
      "status_hidden": false,
      "last_seen_bucket": null
    },
    {
      "id": 2,
      "name": "Boris Petrov",
      "avatar": null,
      "role": "member",
      "joined_at": "2026-10-20 11:12:46",
      "last_seen_at": "2026-10-21T06:46:11+00:00",
      "status_hidden": false,
      "last_seen_bucket": null
    }
  ],
  "members_count": 4,
  "members_has_more": false,
  "message_stats": {
    "total": 34,
    "text": 26,
    "media": 3,
    "files": 2
  },
  "created_at": "2026-10-20T11:12:46.000000Z",
  "peer_phone": null,
  "peer_about": null,
  "peer_birthday": null,
  "history_ttl": 0,
  "noforwards": false,
  "my_noforwards": false,
  "peer_noforwards": false,
  "blocked": false,
  "can_change_policy": true
}
POST /api/conversations/{conversation} #

Edit group/channel settings

Bearer token multipart/form-data

Owner or admin. Multipart when sending avatar. avatar_clear=1 removes the avatar. A channel username can change once per 14 days. Private chats → 400. Realtime: ConversationUpdated to every member.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
name
optional body
string
Name / title.
max 255 chars
description
optional body
string
Description.
max 500 chars
avatar
optional body
file
Image file (multipart).
max 5 MB
avatar_clear
optional body
string
1 to remove the avatar.
members_can_pin
optional body
boolean
Groups: members may pin messages.
visibility
optional body
string
public / private.
one of: public, private
username
optional body
string
Public @username.
max 32 chars

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"description": "Product updates"}'

Response

HTTP 200
{
  "success": true,
  "conversation": {
    "id": 2,
    "name": "MinChat News",
    "avatar": null,
    "description": "Product updates",
    "type": "channel",
    "user_role": "admin",
    "is_owner": true,
    "can_send_messages": true,
    "members_can_pin": false,
    "can_pin": true,
    "can_manage_subscribers": true,
    "username": "minchat_news",
    "visibility": "public",
    "share_url": "https://minchatapp.com/c/minchat_news",
    "hidden_from_discovery": false,
    "history_ttl": 604800
  }
}
DELETE /api/conversations/{conversation} #

Delete a group/channel

Bearer token

Owner only, requires confirm=DELETE. Realtime: ConversationDeleted.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
confirm
required body
string
Literal DELETE.
one of: DELETE

Request

curl
curl -X DELETE 'https://minchatapp.com/api/conversations/12' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"confirm": "DELETE"}'

Response

Responds with HTTP 200.

POST /api/conversations/{conversation}/join #

Subscribe to a public channel

Bearer token Rate limit: 30/min

400 for non-channels, 404 for private, 403 when banned.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/join' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "success": true,
  "conversation": {
    "id": 2,
    "name": "MinChat News",
    "type": "channel",
    "avatar": null,
    "description": "Product updates",
    "username": "minchat_news",
    "visibility": "public",
    "share_url": "https://minchatapp.com/c/minchat_news",
    "last_message": null,
    "unread_count": 0
  }
}
DELETE /api/conversations/{conversation}/leave #

Leave a conversation

Bearer token

Channel: subscribers leave; an owner with other members gets 409 (transfer first); a sole owner deletes the channel. Private: delete_for_all=1 deletes the chat for both. Group: if the owner leaves, ownership passes to an admin/moderator.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
delete_for_all
optional query
boolean
Private chats: delete for both sides.

Request

curl
curl -X DELETE 'https://minchatapp.com/api/conversations/12/leave' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "success": true
}
POST /api/conversations/{conversation}/members #

Add a member

Bearer token Rate limit: 60/min

Groups, or channel staff. Bots are added the same way (by the bot's user id). In channels this also lifts a ban.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
user_id
required body
integer
User id.
must exist (users)

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/members' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"user_id": 42}'

Response

HTTP 400
{
  "success": false,
  "code": "conversation.already_member",
  "error": "User is already in the conversation",
  "message": "User is already in the conversation"
}
DELETE /api/conversations/{conversation}/members/{userId} #

Remove a member

Bearer token

Cannot remove the owner or someone with an equal/higher role. In channels a kick also bans.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
userId
required path
integer
User id.

Request

curl
curl -X DELETE 'https://minchatapp.com/api/conversations/12/members/2' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "success": true
}
PATCH /api/conversations/{conversation}/members/{userId}/role #

Change a member role

Bearer token

Owner can grant admin/moderator; admin can grant moderator only.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
userId
required path
integer
User id.
role
required body
string
member, moderator or admin.
one of: member, moderator, admin

Request

curl
curl -X PATCH 'https://minchatapp.com/api/conversations/12/members/2/role' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"role": "moderator"}'

Response

HTTP 200
{
  "success": true,
  "role": "moderator"
}
POST /api/conversations/{conversation}/owner #

Transfer ownership

Bearer token

Current owner only; the new owner must be a member. The old owner stays admin.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
user_id
required body
integer
User id.
must exist (users)

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/owner' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"user_id": 2}'

Response

Responds with HTTP 200.

GET /api/conversations/{conversation}/bans #

Channel bans

Bearer token

Staff only. Pagination: after = ban_id of the last item, limit 1–50.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
after
optional query
integer
Cursor (ban_id).
limit
optional query
integer
Page size, default 50.
1–50

Request

curl
curl 'https://minchatapp.com/api/conversations/12/bans' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "bans": [],
  "bans_has_more": false
}
DELETE /api/conversations/{conversation}/bans/{userId} #

Unban

Bearer token

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
userId
required path
integer
User id.

Request

curl
curl -X DELETE 'https://minchatapp.com/api/conversations/12/bans/2' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

Responds with HTTP 200.

POST /api/conversations/{conversation}/mute #

Mute / unmute

Bearer token

Exactly one of duration (1h, 8h, forever) or until (ISO 8601, ≤ 1 year). Empty body unmutes. Mentions and replies to you still notify. Realtime: ConversationMuted to your other devices.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
duration
optional body
string
1h, 8h, forever or null.
until
optional body
date-time
Mute until this moment.

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/mute' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"duration": "8h"}'

Response

HTTP 200
{
  "conversation_id": 1,
  "muted_until": "2026-10-22T17:06:13+00:00"
}
200 unmute
HTTP 200 · unmute
{
  "conversation_id": 1,
  "muted_until": null
}
POST /api/conversations/{conversation}/ttl #

Set the auto-delete timer

Bearer token

New messages expire after period seconds (0 = off). A system message is posted.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
period
required body
integer
Seconds.
≥ 0≤ 31536000

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/ttl' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"period": 86400}'

Response

HTTP 200
{
  "conversation_id": 1,
  "history_ttl": 86400
}
POST /api/conversations/{conversation}/noforwards #

Restrict forwarding

Bearer token

Disables forwarding/saving of messages from this chat.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
enabled
required body
boolean
Turn on / off.

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/noforwards' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"enabled": true}'

Response

HTTP 200
{
  "conversation_id": 1,
  "enabled": true,
  "scope": "chat"
}
POST /api/conversations/{conversation}/read #

Mark as read

Bearer token

Updates last_read_at; realtime ParticipantRead. In channels also counts views.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/read' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "success": true
}
POST /api/conversations/{conversation}/activity #

Send typing / recording status

Bearer token Rate limit: 120/min

action: typing, record_audio (repeat while active) or cancel. Not available in channels. Realtime: UserActivity.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
action
required body
string
Activity type.
one of: typing, record_audio, cancel

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/activity' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"action": "typing"}'

Response

HTTP 200
{
  "success": true
}
PUT /api/conversations/{conversation}/draft #

Save a draft

Bearer token Rate limit: 120/min

Synced across devices; content:null clears. Realtime: DraftUpdated to your other devices.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
content
required body
string
Message text.
present (may be null)max 4000 chars
reply_to_message_id
optional body
integer
Message being replied to.
≥ 1

Request

curl
curl -X PUT 'https://minchatapp.com/api/conversations/12/draft' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"content": "Draft text", "reply_to_message_id": null}'

Response

HTTP 200
{
  "conversation_id": 1,
  "draft": {
    "content": "Draft text",
    "reply_to_message_id": null,
    "updated_at": "2026-10-22T09:06:13+00:00"
  }
}
GET /api/conversations/{conversation}/stats #

Channel statistics

Bearer token

Staff only: subscribers, joins for 7/30 days, views, top posts.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.

Request

curl
curl 'https://minchatapp.com/api/conversations/12/stats' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "subscribers": 3,
  "joined_7d": 3,
  "joined_30d": 3,
  "views_7d": 0,
  "top_posts": [
    {
      "id": 13,
      "content": "Version 1.0.41 is out: more stable calls and chat folders 📁",
      "views_count": 0,
      "created_at": "2026-10-20T11:12:47.000000Z"
    },
    {
      "id": 14,
      "content": "What should we build next?",
      "views_count": 0,
      "created_at": "2026-10-20T11:12:47.000000Z"
    }
  ]
}
GET /api/conversations/{conversation}/media #

Shared media

Bearer token

Gallery of attachments. type: image, video, media (photo+video), file (documents and non-voice audio), voice, link. Offset pagination counted in attachments: use next_offset.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
type
optional query
string
Filter.
one of: image, video, file, media, voice, link
limit
optional query
integer
Page size (default 20).
1–200
offset
optional query
integer
Offset in attachments.
≥ 0

Request

curl
curl 'https://minchatapp.com/api/conversations/12/media' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "media": [
    {
      "id": "f6cbddbe-fc10-4ab0-a406-b839184ffd08",
      "type": "image",
      "url": "https://minchatapp.com/storage/media/be/d0/bed02c0b4bd0799b771b43ef5e5abb4e52eab27d447472966263f53e53afbbe8.jpg",
      "name": "photo3.jpg",
      "size": 13485,
      "mime_type": "image/jpeg",
      "is_voice": false,
      "message_id": 6,
      "created_at": "2026-10-20T11:12:46.000000Z",
      "user": {
        "id": 3,
        "name": "Vera Kotova",
        "avatar": null
      }
    },
    {
      "id": "08c33049-f1a1-4e88-9e44-79a6bcb8f8e6",
      "type": "image",
      "url": "https://minchatapp.com/storage/media/32/fd/32fdfe2a3c825ea2d281066b119b3c12a06b9ed06a640e64eb748baf8ffee54f.jpg",
      "name": "photo1.jpg",
      "size": 24374,
      "mime_type": "image/jpeg",
      "is_voice": false,
      "message_id": 5,
      "created_at": "2026-10-20T11:12:46.000000Z",
      "user": {
        "id": 2,
        "name": "Boris Petrov",
        "avatar": null
      }
    }
  ],
  "has_more": true,
  "next_offset": 2
}
POST /api/conversations/{conversation}/pins #

Pin a message

Bearer token

Up to 5 pins. notify posts a notification. Realtime: ConversationPinsUpdated.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
message_id
required body
integer
Message id.
must exist (messages)
notify
optional body
string
Notify members.

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/pins' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"message_id": 45}'

Response

HTTP 200
{
  "pinned_messages": [
    {
      "id": 45,
      "content": "Hello @Boris Petrov! (edited)",
      "type": "text",
      "attachments": [],
      "user": {
        "id": 1,
        "name": "Anna Smith",
        "avatar": null
      },
      "created_at": "2026-10-22T09:06:13.000000Z",
      "pinned_at": "2026-10-22T09:06:13+00:00",
      "pinned_by": 1
    }
  ]
}
DELETE /api/conversations/{conversation}/pins/{message} #

Unpin a message

Bearer token

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
message
required path
integer
Message id.

Request

curl
curl -X DELETE 'https://minchatapp.com/api/conversations/12/pins/4521' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "pinned_messages": []
}
POST /api/conversations/{conversation}/invite-links #

Create an invite link

Bearer token Rate limit: 20/min

max_uses 0 = unlimited. Use either expires_at or expires_in (seconds, 60 s – 1 year).

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
max_uses
optional body
integer
Maximum number of uses.
≥ 0≤ 100000
expires_at
optional body
date-time
Expiry moment (ISO 8601).
after now
expires_in
optional body
integer
Lifetime in seconds.
≥ 60≤ 31536000
name
optional body
string
Name / title.
max 64 chars

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/invite-links' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"name": "Friends", "max_uses": 10, "expires_in": 86400}'

Response

HTTP 201
{
  "id": 3,
  "code": "p4rkrskpstdq",
  "name": "Friends",
  "url": "https://minchatapp.com/join/p4rkrskpstdq",
  "max_uses": 10,
  "uses_count": 0,
  "expires_at": "2026-10-23T09:06:13+00:00",
  "revoked_at": null,
  "created_at": "2026-10-22T09:06:13+00:00",
  "is_usable": true
}
POST /api/conversations/{conversation}/invite-links/{inviteLink}/regenerate #

Regenerate an invite link

Bearer token Rate limit: 20/min

Revokes the link and creates a new code with the same settings.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
inviteLink
required path
integer
Invite link id.

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/invite-links/3/regenerate' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 201
{
  "id": 4,
  "code": "wqbefok5d6op",
  "name": "Friends",
  "url": "https://minchatapp.com/join/wqbefok5d6op",
  "max_uses": 10,
  "uses_count": 0,
  "expires_at": "2026-10-23T09:06:13+00:00",
  "revoked_at": null,
  "created_at": "2026-10-22T09:12:50+00:00",
  "is_usable": true
}
POST /api/conversations/join/{code} #

Join by invite link

Bearer token Rate limit: 30/min

Parameters

Name Type Description
code
required path
string
Invite code.

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/join/p4rkrskpstdq' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "success": true,
  "already_member": true,
  "conversation": {
    "id": 1,
    "name": "Design team",
    "type": "group",
    "avatar": null,
    "description": "Release discussions",
    "username": null,
    "visibility": "public",
    "share_url": null,
    "last_message": null,
    "unread_count": 0
  }
}
GET /api/conversations/{conversation}/mention-targets #

Mention suggestions

Bearer token

Members to suggest after @ (channels: staff only). q filters by name/username.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
q
optional query
string
Filter.

Request

curl
curl 'https://minchatapp.com/api/conversations/12/mention-targets' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "members": [
    {
      "id": 2,
      "name": "Boris Petrov",
      "username": "boris_p",
      "avatar": null,
      "role": "member"
    }
  ]
}
GET /api/conversations/{conversation}/mentions/unread #

Unread mentions

Bearer token

Ids of messages that mention you and are not read yet (for the “@” jump button).

Parameters

Name Type Description
conversation
required path
integer
Conversation id.

Request

curl
curl 'https://minchatapp.com/api/conversations/12/mentions/unread' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json'

Response

HTTP 200
{
  "message_ids": [],
  "unread_mentions_count": 0
}
POST /api/conversations/{conversation}/mentions/read #

Mark mentions read

Bearer token Rate limit: 120/min

Without message_ids marks all. Realtime: MentionsUpdated.

Parameters

Name Type Description
conversation
required path
integer
Conversation id.
message_ids
optional body
array
Message ids; omit to mark all.
max 200 items
message_ids.*
optional body
integer
Message id.

Request

curl
curl -X POST 'https://minchatapp.com/api/conversations/12/mentions/read' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"message_ids": [23]}'

Response

HTTP 200
{
  "unread_mentions_count": 0
}