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). The walls feature must be enabled for the company, otherwise every endpoint returns 403 (see Walls).
An unknown wall, or a post id that is not on the given wall, returns 404.
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 (author only)
/api/open/v1/walls/{wall_id}/posts/{id}Delete a post (returns 204)
List posts
Newest first. Standard list parameters: page, per_page (max 50), since (ISO 8601 datetime — only return records created at or 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. PUT (author only) and DELETE still reach a scheduled post by its id.
GET /walls/{wall_id}/posts/{id} takes no status and returns a draft as well as a published post.
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. Max 50,000 characters. |
media_ids | array of integers | Optional. Up to 10 IDs returned from POST /media, uploaded by the same token. 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 with an error on media.
media_idswithout thewrite:mediascope returns403.- An id that was not uploaded by this token returns
422with an error onmedia_ids.
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
PUT changes the post's body, which is required (max 50,000 characters). Media and the author can't be changed.
Only the token's own posts can be updated: posts authored by the token's user (or the system user, if the token is configured that way). Any other post returns 403, and so does a post created with bot_user_id, since its author is the bot.
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"}'Delete a post
DELETE removes any post on the wall, not only the token's own, and returns 204.
Response
{
"data": {
"id": 123,
"body": "Hello from the API!",
"wall_id": 1,
"wall_name": "General",
"author": {
"id": 1,
"name": "John Doe",
"first_name": "John",
"last_name": "Doe",
"title": "Head Chef",
"email": "john@example.com",
"type": "default",
"avatar_url": "https://images.monotree.com/avatars/john-doe.jpg",
"is_manager": false,
"groups": [
{ "id": 1, "name": "Kitchen Staff", "type": "department", "is_manager": false, "created_at": "2026-01-15T10:00:00+01:00" }
],
"hired_at": "2025-06-01",
"date_of_birth": "1994-08-12",
"is_away": false,
"last_active_on": "2026-03-22T14:05:12.000000Z",
"registered_at": "2025-06-01T09:00:00+02:00",
"created_at": "2025-06-01T09:00:00+02:00"
},
"created_at": "2026-03-22T10:00:00+01:00",
"updated_at": "2026-03-22T10:00:00+01:00"
}
}author is the same user object served by /users. Its type is default for an employee, system when the token is set to act as the system user, and bot for a post created with bot_user_id.