Posts
Posts are content items on a wall. They are nested under walls in the URL — use GET /walls to find the wall ID first.
Required scope: read:posts, write:posts (and write:media if attaching media).
Endpoints
/api/open/v1/walls/{wall_id}/postsList posts on a wall (published by default, paginated)
/api/open/v1/walls/{wall_id}/posts/{id}Get a single post
/api/open/v1/walls/{wall_id}/postsCreate a new post
/api/open/v1/walls/{wall_id}/posts/{id}Update a post
/api/open/v1/walls/{wall_id}/posts/{id}Delete a post (returns 204)
List posts
Standard list parameters: page, per_page (max 50), since (ISO 8601 datetime — only return records created after this timestamp).
curl "https://customer.monotree.com/api/open/v1/walls/1/posts?per_page=10" \
-H "Authorization: Bearer mono_your_token_here"Filtering by status
By default, the list returns only published posts. Use the status query parameter to retrieve drafts:
status | Returns |
|---|---|
published (default) | Currently-live content only (published, with a publish time in the past). |
draft | Unpublished content only. |
all | Every item, regardless of state. |
curl "https://customer.monotree.com/api/open/v1/walls/1/posts?status=draft" \
-H "Authorization: Bearer mono_your_token_here"An unrecognised value returns 422. Posts created via this API are published immediately, so this mainly surfaces drafts authored elsewhere.
A post that an employee has scheduled for later is never returned — not in the list under any status, and GET /walls/{wall_id}/posts/{id} answers 404. Until it goes live it is only visible to the employee who scheduled it. It shows up like any other post once published.
Create a post
curl -X POST https://customer.monotree.com/api/open/v1/walls/1/posts \
-H "Authorization: Bearer mono_your_token_here" \
-H "Content-Type: application/json" \
-d '{"body": "Hello from the API!"}'Request body
| Field | Type | Notes |
|---|---|---|
body | string | Required. Post content. |
media_ids | array of integers | Optional. IDs returned from POST /media. Requires write:media scope. |
bot_user_id | integer | Optional. A bot user to attribute the post to instead of the token's user. A non-bot id returns 422. |
By default the post is authored by the token's user (or the system user, if the token is configured that way). Pass bot_user_id to attribute it to a bot instead — see Create a post as a bot.
Create a post with media
Upload each file via POST /media first to get an ID, then reference the IDs in the optional media_ids array. Images, videos and documents can be mixed in one post, up to 10 items. A single-type batch is stored as an image, video or file gallery; a mix (or more than one video) as a mixed gallery. Audio and other types return 422.
curl -X POST https://customer.monotree.com/api/open/v1/walls/1/posts \
-H "Authorization: Bearer mono_your_token_here" \
-H "Content-Type: application/json" \
-d '{"body": "Look at this!", "media_ids": [42, 43]}'Create a post as a bot
Create a bot once, then pass its id as bot_user_id to publish the post under the bot's name and avatar — the same bot users that send direct messages and power incoming webhooks. When bot_user_id is present the bot is always the author, regardless of how the token is configured. The id must belong to a bot user; a regular user's id returns 422.
curl -X POST https://customer.monotree.com/api/open/v1/walls/1/posts \
-H "Authorization: Bearer mono_your_token_here" \
-H "Content-Type: application/json" \
-d '{"body": "Weekly report is ready!", "bot_user_id": 873}'Update a post
curl -X PUT https://customer.monotree.com/api/open/v1/walls/1/posts/123 \
-H "Authorization: Bearer mono_your_token_here" \
-H "Content-Type: application/json" \
-d '{"body": "Updated body"}'Response
{
"data": {
"id": 123,
"body": "Hello from the API!",
"wall_id": 1,
"wall_name": "General",
"author": {
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"type": "user",
"avatar_url": "https://images.monotree.com/avatars/john-doe.jpg",
"groups": [
{ "id": 1, "name": "Kitchen Staff", "type": "department", "created_at": "2026-01-15T10:00:00+00:00" }
],
"hired_at": "2025-06-01",
"is_away": false,
"last_active_on": "2026-03-22",
"registered_at": "2025-06-01T09:00:00+00:00",
"created_at": "2025-06-01T09:00:00+00:00"
},
"created_at": "2026-03-22T10:00:00+00:00",
"updated_at": "2026-03-22T10:00:00+00:00"
}
}