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

GET
/api/open/v1/walls/{wall_id}/posts

List posts on a wall (published by default, paginated)

GET
/api/open/v1/walls/{wall_id}/posts/{id}

Get a single post

POST
/api/open/v1/walls/{wall_id}/posts

Create a new post

PUT
/api/open/v1/walls/{wall_id}/posts/{id}

Update a post

DELETE
/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:

statusReturns
published (default)Currently-live content only (published, with a publish time in the past).
draftUnpublished content only.
allEvery 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

FieldTypeNotes
bodystringRequired. Post content.
media_idsarray of integersOptional. IDs returned from POST /media. Requires write:media scope.
bot_user_idintegerOptional. 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"
  }
}