Messages
Messages is a simple service for storing messages behind a group ID. Post messages to a group, upvote or downvote them, and retrieve visible messages. Useful for comments, feedback, or anywhere you need a lightweight message store without running your own backend.
Each group has a password-protected admin panel where you can flag or delete messages, configure auto-flag heuristics, and view all messages including hidden ones.
Create a Group
API
Create a Group
POST /m with a JSON body to create a
group. If id is omitted, one is generated. If
password is omitted, one is generated for you.
curl -X POST messages/m \
-H "Content-Type: application/json" \
-d '{"id": "my-group", "password": "s3cret"}'
# Response (201 Created)
{
"id": "my-group",
"password": "s3cret",
"url": "/m/my-group"
}
Save the password — it is needed for the admin
panel and cannot be retrieved later.
Post a Message
POST /m/ID with a message
body. If the group doesn't exist, it is created automatically
(but the generated admin password is not returned — create
the group first if you need admin access). Accepts JSON
({"body": "..."}) or plain text. Max 4096
characters.
# JSON
curl -X POST messages/m/my-group \
-H "Content-Type: application/json" \
-d '{"body": "Hello world"}'
# Plain text
curl -X POST messages/m/my-group \
-H "Content-Type: text/plain" \
-d "Hello world"
# Response (201 Created)
{
"id": "xK9mP2qR5tLw",
"group": "my-group",
"body": "Hello world",
"flagged": false
}
Upsert a Message
PUT /m/ID creates a
message or upvotes an existing one with the same body. If a
duplicate exists, it receives an upvote instead of creating a new
message. Returns 201 when created,
200 when an existing message was upvoted.
curl -X PUT messages/m/my-group \
-H "Content-Type: application/json" \
-d '{"body": "Hello world"}'
# Response (200 OK) — duplicate upvoted
{
"id": "xK9mP2qR5tLw",
"group": "my-group",
"body": "Hello world",
"created": false,
"upvotes": 2,
"flagged": false
}
# Response (201 Created) — new message
{
"id": "yL3nQ7rS8uMx",
"group": "my-group",
"body": "Something new",
"created": true,
"upvotes": 0,
"flagged": false
}
Get Messages
GET /m/ID returns messages
as an HTML page. /m/ID.json or
Accept: application/json returns JSON.
Flagged messages and messages with negative vote scores are hidden.
curl messages/m/my-group.json
{
"id": "my-group",
"messages": [
{
"nano_id": "xK9mP2qR5tLw",
"body": "Hello world",
"upvotes": 3,
"downvotes": 0,
"score": 3,
"created_at": "2025-01-15 12:30:00"
}
]
}
Vote on Messages
POST /m/ID/upvote/MSG_ID
or /m/ID/downvote/MSG_ID to
vote on a message.
curl -X POST messages/m/my-group/upvote/xK9mP2qR5tLw
{"ok": true}
Admin Panel
Visit /m/ID/admin to access the admin
panel. You'll need the password from when the group was created.
From there you can flag or delete individual messages and
configure auto-flag heuristics (links, HTML, emails, duplicates,
message length limits, and rapid-post detection).