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#
List conversations
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 'https://minchatapp.com/api/conversations' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
[
{
"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 a conversation with messages
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 'https://minchatapp.com/api/conversations/12' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"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
{
"success": false,
"code": "common.not_found",
"error": "Not found",
"message": "Not found"
}
Create a group or channel
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 -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
{
"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
}
}
Create a group with members
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 -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
{
"success": true,
"conversation": {
"id": 7,
"name": "Weekend",
"type": "group",
"avatar": null
}
}
Open a private chat
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 -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
{
"success": true,
"conversation": {
"id": 3,
"name": "Boris Petrov",
"type": "private",
"avatar": null
}
}
Open Saved Messages
Creates or returns your Saved Messages chat.
Parameters
No parameters.
Request
curl -X POST 'https://minchatapp.com/api/conversations/saved' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"success": true,
"conversation": {
"id": 4,
"name": "Saved Messages",
"type": "saved",
"peer_user_id": 1,
"avatar": null
}
}
Popular channels
Up to 10 discoverable public channels the user is not in. Alias: /random-channels.
Parameters
No parameters.
Request
curl 'https://minchatapp.com/api/conversations/popular-channels' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
[
{
"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"
}
]
Popular channels (alias)
Same as /popular-channels.
Parameters
No parameters.
Request
curl 'https://minchatapp.com/api/conversations/random-channels' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
[
{
"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"
}
]
Search public channels
Exact @username first, then by name. Up to 20.
Parameters
| Name | Type | Description |
|---|---|---|
query
required query
|
string |
Search string. min 2 chars
|
Request
curl 'https://minchatapp.com/api/conversations/search?query=…' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
[
{
"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"
}
]
Check a channel username
Parameters
| Name | Type | Description |
|---|---|---|
username
required query
|
string |
Username. max 32 chars
|
Request
curl 'https://minchatapp.com/api/conversations/username-available?username=…' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"username": "design_news",
"available": true,
"reason": null,
"code": null
}
Resolve a channel by username
Public channel card. 404 for private/hidden channels.
Parameters
| Name | Type | Description |
|---|---|---|
username
required path
|
string |
Channel username. |
Request
curl 'https://minchatapp.com/api/conversations/resolve/minchat_news' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"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"
}
Preview a channel without joining
404 for private channels you are not in, 403 when banned.
Parameters
| Name | Type | Description |
|---|---|---|
conversation
required path
|
integer |
Conversation id. |
Request
curl 'https://minchatapp.com/api/conversations/12/preview' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"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"
}
Conversation details and members
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 'https://minchatapp.com/api/conversations/12/info' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"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
}
Edit group/channel settings
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 -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
{
"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 a group/channel
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 -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.
Subscribe to a public channel
400 for non-channels, 404 for private, 403 when banned.
Parameters
| Name | Type | Description |
|---|---|---|
conversation
required path
|
integer |
Conversation id. |
Request
curl -X POST 'https://minchatapp.com/api/conversations/12/join' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"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
}
}
Leave a conversation
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 -X DELETE 'https://minchatapp.com/api/conversations/12/leave' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"success": true
}
Add a member
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 -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
{
"success": false,
"code": "conversation.already_member",
"error": "User is already in the conversation",
"message": "User is already in the conversation"
}
Remove a member
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 -X DELETE 'https://minchatapp.com/api/conversations/12/members/2' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"success": true
}
Change a member role
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 -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
{
"success": true,
"role": "moderator"
}
Transfer ownership
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 -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.
Channel bans
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 'https://minchatapp.com/api/conversations/12/bans' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"bans": [],
"bans_has_more": false
}
Unban
Parameters
| Name | Type | Description |
|---|---|---|
conversation
required path
|
integer |
Conversation id. |
userId
required path
|
integer |
User id. |
Request
curl -X DELETE 'https://minchatapp.com/api/conversations/12/bans/2' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
Responds with HTTP 200.
Mute / unmute
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 -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
{
"conversation_id": 1,
"muted_until": "2026-10-22T17:06:13+00:00"
}
200 unmute
{
"conversation_id": 1,
"muted_until": null
}
Set the auto-delete timer
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 -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
{
"conversation_id": 1,
"history_ttl": 86400
}
Restrict forwarding
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 -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
{
"conversation_id": 1,
"enabled": true,
"scope": "chat"
}
Mark as read
Updates last_read_at; realtime ParticipantRead. In channels also counts views.
Parameters
| Name | Type | Description |
|---|---|---|
conversation
required path
|
integer |
Conversation id. |
Request
curl -X POST 'https://minchatapp.com/api/conversations/12/read' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"success": true
}
Send typing / recording status
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 -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
{
"success": true
}
Save a draft
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 -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
{
"conversation_id": 1,
"draft": {
"content": "Draft text",
"reply_to_message_id": null,
"updated_at": "2026-10-22T09:06:13+00:00"
}
}
Channel statistics
Staff only: subscribers, joins for 7/30 days, views, top posts.
Parameters
| Name | Type | Description |
|---|---|---|
conversation
required path
|
integer |
Conversation id. |
Request
curl 'https://minchatapp.com/api/conversations/12/stats' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"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"
}
]
}
Shared media
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 'https://minchatapp.com/api/conversations/12/media' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"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
}
Pin a message
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 -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
{
"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
}
]
}
Unpin a message
Parameters
| Name | Type | Description |
|---|---|---|
conversation
required path
|
integer |
Conversation id. |
message
required path
|
integer |
Message id. |
Request
curl -X DELETE 'https://minchatapp.com/api/conversations/12/pins/4521' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"pinned_messages": []
}
List invite links
Staff of groups/channels.
Parameters
| Name | Type | Description |
|---|---|---|
conversation
required path
|
integer |
Conversation id. |
Request
curl 'https://minchatapp.com/api/conversations/12/invite-links' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"links": [
{
"id": 2,
"code": "z8qxbjlhmblg",
"name": null,
"url": "https://minchatapp.com/join/z8qxbjlhmblg",
"max_uses": 0,
"uses_count": 0,
"expires_at": null,
"revoked_at": null,
"created_at": "2026-10-20T11:13:00+00:00",
"is_usable": true
},
{
"id": 1,
"code": "dgpnlk9opbmw",
"name": "Contractors",
"url": "https://minchatapp.com/join/dgpnlk9opbmw",
"max_uses": 10,
"uses_count": 0,
"expires_at": "2026-10-27T11:13:00+00:00",
"revoked_at": null,
"created_at": "2026-10-20T11:13:00+00:00",
"is_usable": true
}
]
}
Create an invite link
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 -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
{
"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
}
Revoke an invite link
Parameters
| Name | Type | Description |
|---|---|---|
conversation
required path
|
integer |
Conversation id. |
inviteLink
required path
|
integer |
Invite link id. |
Request
curl -X DELETE 'https://minchatapp.com/api/conversations/12/invite-links/3' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"success": true
}
Regenerate an invite link
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 -X POST 'https://minchatapp.com/api/conversations/12/invite-links/3/regenerate' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"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
}
Preview an invite link
Public (Bearer optional): chat title, avatar, member count.
Parameters
| Name | Type | Description |
|---|---|---|
code
required path
|
string |
Invite code. |
Request
curl 'https://minchatapp.com/api/invite-links/p4rkrskpstdq' \
-H 'Accept: application/json'
Response
{
"code": "p4rkrskpstdq",
"url": "https://minchatapp.com/join/p4rkrskpstdq",
"conversation": {
"id": null,
"type": "group",
"name": "Design team",
"avatar": null,
"description": "Release discussions",
"members_count": 5
},
"is_member": false,
"expires_at": "2026-10-23T09:06:13+00:00"
}
Join by invite link
Parameters
| Name | Type | Description |
|---|---|---|
code
required path
|
string |
Invite code. |
Request
curl -X POST 'https://minchatapp.com/api/conversations/join/p4rkrskpstdq' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"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
}
}
Mention suggestions
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 'https://minchatapp.com/api/conversations/12/mention-targets' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"members": [
{
"id": 2,
"name": "Boris Petrov",
"username": "boris_p",
"avatar": null,
"role": "member"
}
]
}
Unread mentions
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 'https://minchatapp.com/api/conversations/12/mentions/unread' \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json'
Response
{
"message_ids": [],
"unread_mentions_count": 0
}
Mark mentions read
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 -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
{
"unread_mentions_count": 0
}