Changelog
Changes and updates to the Open API. This API is currently in beta — breaking changes may occur between versions.
v0.59.0 — November 2026
GET /stats/academy/coursestakesper_department=1, which adds each course's completion per department, andcourse_idsto limit the response to the given courses (additive)- New
GET /stats/academy/courses/{course_id}/users: where each assigned user stands in a course — passed, completed and chapters done (additive) - Manager Hub:
/teammembers carryis_offboarding,offboarding_starts_atandterminated_at,/summaryhas anoffboardingblock, and/coursesrows carryimage_url(additive) - Achievements carry
colors, the colours of their badge (additive) - Walls, posts and comments answer
403while walls are off for the company, as forms, handbooks and courses do. See feature-gated endpoints - An article that belongs to other content also needs that content's scope, e.g.
write:handbooksfor a handbook chapter's article. See owned articles PUT /walls/{id}/posts/{post_id}only updates posts the token itself created; others answer403- Handbooks and courses imported from a content provider cannot be edited: changing their content answers
403. Publishing, groups and deleting still work. See handbooks and courses - Webhooks created over the API stop with their token: revoking or deleting the token revokes them, and while it is expired they are paused. An incoming webhook also needs its action's write scope. Outgoing webhooks that existed before this version keep running. See expiration
- Outgoing webhook deliveries verify the receiver's TLS certificate. See retries
formresponse.updatedis also sent when a response's answers are edited- Fixed:
sinceanduntilsent withZor another offset are compared as that moment, so an incremental sync no longer repeats or misses rows. See incremental sync - Fixed: page links keep the request's filters and
per_page, and rows that tie on the sort key are ordered byid, so paging no longer repeats or skips rows. See pagination
v0.58.0 — October 2026
- Person boxes in
GET /org-chartcarrydescription, a short explainer an admin wrote on that box in the CMS, ornull. Someone with several boxes can have a different description on each. Department boxes always returnnull(additive)
v0.57.0 — October 2026
- Achievements have a new
type,tasks: awarded automatically when an employee has checked off a chosen number of to-do tasks.trigger_typeistask_countandtrigger_configis{ "count": 100 }. Defaults to ✅ andpersonal. See triggers (additive)
v0.56.0 — October 2026
- Outgoing webhook deliveries no longer follow redirects: a
3xxanswer is a failed attempt. Each attempt, test deliveries included, re-checks that the URL ishttpsand that its host resolves only to public addresses; otherwise the attempt fails without a request. A receiver behind a redirect must register its final URL. See retries - A
404or410answer ends the delivery at once, with no retries; answer5xx(e.g.503) while the receiver is temporarily down. See retries
v0.55.0 — October 2026
- Journeys have a new
type,preboarding: one journey per company that employees must complete before their onboarding journey unlocks. It is listed first byGET /journeys,type=preboardingfilters on it, and it only appears while preboarding is enabled for the company. While it locks an employee's onboarding, onboarding'sassigned_atanddue_atarenull; once it unlocks onboarding they count from the unlock. See preboarding (additive)
v0.54.0 — October 2026
- The user object from the users endpoints carries
roles, the user's CMS roles (admin,editor,user_editor), so an integration can audit who holds which rights. Users embedded as authors or respondents elsewhere do not carry it (additive) - Groups on the user object from the users endpoints carry
is_editornext tois_manager, true when the user is an editor of that group. Users embedded elsewhere do not (additive) GET /userstakes arolefilter:?role=admin,editororuser_editor
v0.53.0 — October 2026
- New outgoing webhook event
monotree.completion.created, sent when an employee completes a course, a journey or a handbook. The payload carries the completion with the employee and the completed item embedded, keyed by itstype. See the completion payload - The event can be filtered on completion type. In the management API,
filterstakes the type tokenscourse,journeyandhandbookfor this event, and returns them the same way; for every other eventfiltersstill takes IDs (additive) - Onboarding keeps its own event,
monotree.onboarding.completed, and is not sent as a completion. No existing event changes
v0.52.0 — October 2026
- Bot messages to a group chat can now be scheduled (
write:chat_messages):POST /chat-rooms/{id}/scheduled-messagestakesbot_user_id,text, optionalmediaand a futuresend_at, and the message is sent to the chat at that time.GET /chat-rooms/{id}/scheduled-messageslists the ones still waiting andDELETE /scheduled-chat-messages/{id}cancels one. See scheduled messages
v0.50.0 — October 2026
GET /stats/academy/onboardingnow also reports how quickly people finish onboarding:deadline_weeks,within_deadline_pct(share finished within the deadline),avg_days_to_completeandmedian_days_to_complete. Narrow it withgroup_idsto get the figures per department. See onboarding statistics (additive)
v0.49.0 — October 2026
- New outgoing webhook event
monotree.bot_reply.created, sent when an employee answers a bot: any message in their 1:1 chat with the bot, or a reply to a bot message in any chat. The payload carries the employee's message, the employee, the bot, and the bot message being answered asreply_to. See the bot reply payload
v0.48.0 — September 2026
- Calendar entries take an optional
mute_notificationsboolean on create and update. Whentrue, employees get no day-of notification for the entry, so entries imported in bulk stay silent. See silent entries. Responses includemute_notifications(additive)
v0.47.0 — September 2026
- Form responses now include
deadline_at, the date (YYYY-MM-DD) staff should have handled the response by, ornullwhen none is set. It is on every response endpoint and in theformresponse.*webhook payloads, and a deadline change already firedformresponse.updated(additive)
v0.46.0 — September 2026
- Events and calendar entries can have a cover image: pass
cover_media_id(an image uploaded withPOST /mediaby the same token) on create or update, andnullon update to remove it. Needs thewrite:mediascope. See events and calendar entries GET /eventsandGET /calendar-entriesresponses now includecover_image, the cover as a media object, ornull(additive)
v0.45.0 — September 2026
- Added
GET /token, which returns the calling token's name, scopes and expiry. It works with any valid token and needs no scope, so an integration can check a token at setup monotree.onboarding.completednow carriesonboarding_completed_at, the moment the employee completed onboarding (additive). The payloads of both user events are now documented
v0.44.0 — September 2026
- New outgoing webhook event
monotree.announcement.confirmed, sent when an employee confirms they have read a confirmable announcement. The payload carries the confirmation with the employee and the announcement embedded, keyed by itstype - Added
GET /announcements/{id}/confirmations(read:announcements) — who has acknowledged one briefing — andGET /confirmations?since=, every announcement confirmation newest first, for catching up after a failed webhook delivery - Confirming is once per employee per announcement, and there is no un-confirm: a confirmation is announced exactly once and its
idis a stable idempotency key. Company events can be made confirmable too, but their confirmations are not exposed yet
v0.43.0 — September 2026
- Added
POST /notifications(newwrite:notificationsscope) to put a notification in employees' activity feed, targeted bygroups,usersor both. Each recipient gets one feed notification (no push) with a title, a body and an optionalhttps://or app link that opens on tap - The response gives the number of employees matched; the notifications are created in the background. Employees who have turned notifications off, deactivated employees and bots are skipped
v0.41.1 — September 2026
- Wall posts that an employee has scheduled for later are no longer returned: they are left out of
GET /walls/{wall_id}/postsunder everystatus, andGET /walls/{wall_id}/posts/{id}answers404until the post goes live
v0.41.0 — September 2026
- Added
POST /achievementsandPATCH /achievements/{id}(newwrite:achievementsscope) to create and update achievements: type, title, description, emoji, visibility, trigger config, translations and published state. Achievements are created as drafts unlessis_publishedistrue; requires the achievements feature - The type cannot be changed after creation. Completion and employment achievements need a complete
trigger_configbefore they can be published, and publishing one starts awarding employees who meet the trigger - Added
POST /achievements/{id}/awards(write:achievements) to award a published achievement to employees, in a department (required for employee of the month).assigned_byon these awards is the company's own user (type: customer); an identical award (same user and day) is returned instead of duplicated, and new awards are announced like CMS awards — push notification, colleague feed and themonotree.achievement.awardedwebhook - Deleting achievements and awards is not part of the API
v0.40.0 — September 2026
- Added Achievements endpoints (
read:achievementsscope):GET /achievements,GET /achievements/{id},GET /achievements/{id}/awardsandGET /users/{id}/achievements— achievements, every award of one, and the awards a user holds. Personal achievements are included; requires the achievements feature - New outgoing webhook event
monotree.achievement.awarded, sent when a user is given an achievement (automatically or by hand), filterable by achievement. The payload is the award with the achievement and the user embedded.awarded_atis the awarded day with the customer server's offset — midnight for awards handed out by hand, the local time earned for automatic ones; read only the date, in that offset - Every outgoing webhook and report delivery now carries
customerin the envelope — the sending customer's Monotree identifier, the CMS test event included — so one receiver can serve several Monotree customers (additive) - Outgoing webhook retries now run 1 minute and 10 minutes after the first attempt (was ~10 s and ~100 s), and every attempt is signed with a fresh
Timestamp, so a retry passes a receiver's replay window. The per-attempt timeout is 3 seconds
v0.39.0 — September 2026
- Users carry a
title— the employee's job title, set per user in the CMS (nullwhen unset, never synced from an HR system). It is on the user object everywhere it appears (additive) GET /org-chartlabels a person box with that job title, falling back to the title typed on the box and then to the profession name.custom_titlestill returns the box's own title
v0.38.0 — September 2026
- Added
POST /users/{id}/avatar(write:usersscope) to set an employee's profile picture from an uploaded image (multipartmediafield), for example from an HR system. It replaces any picture the employee chose themselves; colleagues are not notified - The response is the user object with the new
avatar_url, the same fieldGET /usersalready exposes
v0.37.0 — September 2026
POST /walls/{wall_id}/postsand thewall_postincoming webhook accept a mix of image, video and document media in one post. A single-type batch is still stored as an image, video or file gallery; a mix (or more than one video) as a mixed gallery. Chat message media is still one type per batch
v0.36.0 — August 2026
- Added
POST /groups(write:groupsscope) to create departments, professions and custom groups. Created groups are live immediately.typedefaults todepartment;is_openis only valid on custom groups
v0.35.1 — August 2026
POST /calendar-entriesno longer fails with500when the company has no published event type named "Default" to fall back on —calendar_event_type_idis required in that case and a missing one returns422with a message pointing atGET /calendar-event-types- The
calendar_entryincoming webhook accepts an optionalcalendar_event_type_idand follows the same rule
v0.35.0 — August 2026
- Added the Org Chart endpoint (
read:org_chartscope):GET /org-chartreturns the organizational chart as a nested tree ofpersonanddepartmentboxes, exactly as employees see it (deactivated people are left out and their reports move up) - Department boxes carry a
members_count; list the people themselves with the existingGET /users?group_id=. The responsemetatells whether the chart is published to employees yet
v0.34.0 — August 2026
POST /walls/{wall_id}/postsaccepts an optionalbot_user_id— the post is then attributed to that bot user instead of the token's user, matching the direct message endpoint andwall_postincoming webhooks. A non-bot id returns422
v0.33.0 — August 2026
- Forms now carry a
due_atdate (YYYY-MM-DD,nullwhen unset) — the date by which respondents should have answered, set per form in the CMS and shown in-app to users who have not yet responded (additive) - Form responses mirror it as
form_due_atnext toform_title— in the response endpoints and theformresponse.*webhook payloads; detail payloads also carry it on the embeddedform(additive)
v0.32.0 — August 2026
- Bot messages can now be pinned:
POST /chat-messages/{id}/pinpins a bot-sent message at the top of its room (optionalpinned_untilexpiry) andDELETE /chat-messages/{id}/pinremoves it — one pinned message per room, scopewrite:chat_messages - Chat message responses (
POST /users/{id}/messagesand the pin endpoints) now carry nullablepinned_atandpinned_untilfields (always present, additive) - Added user management endpoints (
write:usersscope):POST /userscreates an employee — optionally with group memberships and an app invite (send_invite) — andDELETE /users/{id}soft deletes one, mirroring the CMS user management - Creating a user whose email belongs to a deleted account restores that account instead of creating a duplicate; an email in use by an active user is rejected with
422 - Only manually created users can be deleted — users synced from an external HR or rota system return
422 - Deleted (archived) form responses are now retrievable everywhere:
?include_deleted=1works onGET /forms/{id}/responsesand letsGET /formresponses/{id}return a deleted response instead of404(previously bulk-feed only) - Added
?only_deleted=1toGET /forms/{id}/responsesandGET /formresponsesto list just the archive — historical form data without paging through live responses - Added Journeys endpoints (
read:journeysscope): list journeys, and read per-user journey status —GET /journeys/{id}/userslists everyone a journey is assigned to andGET /users/{id}/journeyslists a user's journeys, each withassigned_at,due_at,completed_at,has_completedandis_overdue due_at/is_overduefollow the CMS onboarding and offboarding weeks limits; custom journeys carry no deadline (due_atisnull). Assignment uses the same user pool as/stats/academy/journeys, so the two surfaces agree
v0.31.0 — July 2026
- Form responses now carry a nullable
deleted_atfield (always present) and anassigneesarray with the staff members assigned to handle the response — in the response endpoints and theformresponse.*webhook payloads (additive) - The
formresponse.updatedwebhook now also fires when a response is deleted, restored, or permanently deleted — the delivery'sdeleted_attells you the response is gone GET /formresponsesaccepts?include_deleted=1to include deleted (archived) responses, letting asince-based sync catch deletions it missed
v0.30.0 — July 2026
- Form responses now include a
mediaarray with the files uploaded with the submission (images, videos and documents), each carrying a direct downloadurl— in the response endpoints and theformresponse.*webhook payloads (additive) - On anonymous responses the files are stored encrypted, so
urlis a short-lived signed link (expires after ~5 minutes) — re-fetch the response for a fresh one
v0.29.0 — July 2026
- Users now include
first_nameandlast_nameas separate fields alongsidename, plusdate_of_birth(null unless collected) hired_atnow returns the effective hire date: a manual CMS override wins over the synced value- Users expose manager info: a top-level
is_managerflag and a per-membershipis_managerflag on each entry ingroups[] - Groups returned by the
/groupsendpoints now include amanagersarray (id+name) — not included where groups are embedded in other payloads - Docs: corrected the users
typeexample value (default, notuser) and documented the existingsincefilter on users and groups
v0.28.0 — July 2026
- Added Staff Cards endpoints (
read:staff_cards,write:staff_cardsscopes): full CRUD for the informational cards shown in the employee app — mirroring the CMS staff cards management. Cards are created as drafts by default - Cards are targeted via
groups(departments, professions and custom groups mixed in one array) and/or individually assignedusers; publishing (is_published: true) notifies targeted employees, exactly like the CMS publish button - Cards support a translatable
title, an expiry (expires_date/expires_time), manager visibility, and a QR code image viamedia_ids - Personal cards:
type: personalcreates a card belonging to exactly one user (no groups) — e.g. a digital business card.qr_datagenerates a QR code image server-side, attached as media taggedqr_code. List filterable via?type= - Rich card content is managed through the card's
article_idvia the articles endpoints — or attach a pre-built standalone article at create time
v0.27.0 — July 2026
- Added Forms and Form Responses endpoints (
read:forms,read:formresponsesscopes): list forms, page through a form's responses, fetch single responses with full context, and aGET /formresponses?since=bulk feed for external dashboards and sync - Detail payloads embed the
form, the sharedpublic_commentsthread (incl.mediaattachments), and staff-onlyinternal_comments - The bulk feed's
sincefilters onupdated_at— one poll captures new, edited, status-changed, and newly-commented responses. Public comments now bump their response'supdated_at, like internal notes already did - Whistleblower forms are completely excluded — never listed, always
404; anonymous responses keeprespondentand commentauthorasnull - Form response comment payloads (API and the
formresponse.comment.*webhooks) now include amediaarray with the comment's attachments (additive)
v0.26.0 — July 2026
- Added Feedback endpoint:
POST /feedbacksends feedback on the Open API straight to the Monotree team — feature requests, bug reports, anything. No scope required; any valid token works
v0.25.0 — July 2026
- Added Handbooks and Courses endpoints (
read:/write:handbooks,read:/write:coursesscopes): CRUD for both containers and their chapters — create a draft, add chapters (each owning an article), publish when ready. Publishing notifies targeted employees - Added Articles endpoints (
read:articles,write:articlesscopes): the shared rich-content structure. Read an article's typed elements and bulk-save the complete element list viaPUT /articles/{id}/elements; read-only elements (reference,gif) are never deleted by bulk saves - Element types:
paragraph(markdown),header,image_gallery,video_gallery,document— media is referenced from the existingPOST /mediaflow - Added
GET /articles/{id}/markdown— any article flattened to a single markdown document (?locale=supported) - Announcements, events, calendar entries and certificates now expose their
article_id, so the articles endpoints can manage their rich content too - Articles are fully translatable: every text field carries a field-keyed
translationsobject on read and write — writing a translation activates that locale on the owning content. Handbooks and courses accept the sametranslationsobject for their owntitle/subtitle - The
bodyconvenience field on announcements, events and calendar entries now returns422instead of silently replacing rich article content. Existing integrations are unaffected: creating withbodyand updating content whose article was built bybodyitself keep working unchanged - Create standalone articles via
POST /articlesand attach them witharticle_idwhen creating announcements, events, and calendar entries — content is complete the moment it goes live - Added
is_publishedtoPOST /announcementsandPOST /calendar-entries(defaulttrue— behavior unchanged): create drafts withis_published: falseand publish later via update. Events already supported this
v0.24.0 — July 2026
- Added Calendar Event Types endpoints (
read:calendar_event_types,write:calendar_event_typesscopes): list, create, and update the event types that categorize calendar entries — names are translatable per locale via atranslationsobject - Calendar entries now accept
calendar_event_type_idon create and update; when omitted on create, the default event type is used - Calendar entry responses now include the entry's
calendar_event_type PATCH /calendar-entries/{id}is now accepted alongsidePUT- Added
GET /locales(read:localesscope): the platform's active languages as a map of locale code to name, plus the default content locale — the valid keys for translatable fields
v0.23.0 — June 2026
- Added Manager Hub endpoints (
read:managerhubscope): the department reporting view from the mobile Manager Hub — team roster (/managerhub/team) and onboarding / journey / course / certificate progress (/managerhub/progress/*) - Every request names the department(s) to report on via a required
department_idsparameter; figures share their queries with the in-app Manager Hub so the two surfaces cannot drift - Read-only and department-scoped: the manager-personal action drill-downs and dismiss / snooze state are not exposed
v0.22.0 — June 2026
- Added direct messages (
write:chat_messagesscope):POST /users/{id}/messagessends a direct message to a single user's private chat, delivered by a bot user (the 1:1 room is created on first use and reused afterwards) - New
direct_messageincoming webhook action — deliver a webhook payload to one user's private chat; a bot user is always the sender - Added Bots endpoints (
read:bots,write:botsscopes): create and manage the bot users that send direct messages and power incoming webhooks - Added Incoming Webhook management endpoints (
read:incoming_webhooks,write:incoming_webhooksscopes): create, read, update, and revoke incoming webhooks programmatically — the trigger URL and token are returned once on create, and webhooks are scoped to the token that created them
v0.21.0 — June 2026
- Added Webhook Management endpoints (
read:webhooks,write:webhooksscopes): create, read, update, revoke, activate/deactivate, and test outgoing webhook endpoints programmatically — the same capabilities as the CMS Outgoing Webhooks tab - Choose events per endpoint and optionally filter entity-scoped events (post/comment events by wall, form response events by form)
- Configure delivery auth (
bearer_token,basic_auth,api_key) and custom headers; secrets, credentials, and header values are encrypted at rest and never returned (fetch the signing secret once viaGET /webhooks/{id}/secret) - Endpoints are scoped to the token that created them; removing an endpoint is a revoke (history is preserved), matching the CMS
v0.20.0 — June 2026
- Added form response comment webhook events:
monotree.formresponse.comment.created,monotree.formresponse.comment.deleted - Fire when a public comment is created or deleted on a form response. Internal staff notes do not trigger webhooks
- Filterable by form (select one or more forms when subscribing); whistleblower forms never dispatch
- The comment payload's
authorisnullwhen written by the respondent on an anonymous form — managers/owners are always identified
v0.19.0 — June 2026
- Added Certificates endpoints (
read:certificates,write:certificatesscopes): full CRUD for certificate templates, plus assign, reset/expire, list holders, and a user's certificates - Added Certificate Types endpoints (
read:certificatetypes,write:certificatetypesscopes): full CRUD for certificate categories - Assigning mirrors the in-app bulk assignment; "removing" a certificate from a user is the reset/expire operation (history is preserved, matching the platform)
- Certificate templates and types are created as drafts by default; pass
is_published: trueto publish - Update endpoints accept both
PUTandPATCH
v0.18.0 — June 2026
- Added a
statusquery parameter to list endpoints —published(default),draft, orall— on announcements, events, calendar entries, posts, and surveys publishedreturns only currently-live content;draftreturns unpublished items (including those awaiting a scheduled publish);allreturns everything. An unrecognised value returns422- Breaking:
GET /walls/{wall_id}/postsandGET /surveyspreviously returned drafts; they now return only published content by default. Passstatus=draftorstatus=allto include drafts. (Posts created via the API are published immediately, so this mainly affects draft survey templates.) - Single-item endpoints (
GET /{resource}/{id}) are unchanged — they still return an item regardless of its publication state - Certificates are not exposed via the Open API, so the
statusfilter does not apply to them
v0.17.0 — June 2026
- Breaking: events are now created as drafts by default. Previously
POST /eventsalways published immediately - Added
is_publishedtoPOST/PUT /events— settrueto publish,falseto unpublish (back to draft) - Added
publish_attoPOST/PUT /events— schedule a draft to publish at a future time (mirrors the in-app scheduled publishing). Must be a future timestamp; takes precedence overis_published - Send
publish_at: nullon update to cancel a pending schedule; scheduling an already-published event returns422 - Event responses now include a
scheduled_atfield — the time a scheduled draft will go live, ornull - Drafts and scheduled events are excluded from
GET /eventsbut remain fetchable viaGET /events/{id}
v0.16.0 — June 2026
- Form response webhook payloads (
monotree.formresponse.created,monotree.formresponse.updated) now include choice and user field selections infield_responses— previously those field types were delivered with an empty value choicesfields serialize as an array of{ id, title };usersanddepartment_usersfields serialize as an array of user objects, matching therespondentshape- Documented the full form response webhook payload, including the per-field-type
valueshapes
v0.15.0 — June 2026
- Added
monotree.formresponse.alarm_triggeredwebhook event (filterable by form) - Fires when a submitted form response matches a configured field alarm rule
- Each alarm rule fires its own delivery — idempotent per response + rule pair (never fires twice for the same match)
- Payload includes the full form response and the triggered alarm (rule name, operator, value, matched field)
- Whistleblower forms are excluded, matching other form response events
v0.14.0 — June 2026
- Added Academy statistics endpoints (
read:statsscope) that mirror the CMS academy figures - Aggregate:
GET /stats/academy/onboarding,GET /stats/academy/courses,GET /stats/academy/journeys(all accept an optionalgroup_idsfilter) - Quiz performance:
GET /stats/academy/quizzes/{quiz_id}— per-question respondents, passed and pass rate - Per-user progress:
GET /stats/academy/users/{user_id}/coursesandGET /stats/academy/users/{user_id}/onboardingfor HR / LMS integrations
v0.13.0 — May 2026
- Added Surveys read endpoints (
read:surveysscope):GET /surveys,GET /surveys/{id} - Added Survey answers endpoints keyed by template id:
GET /surveys/{template_id}/answersandGET /surveys/{template_id}/answers/{id}— mirrors the CMS Excel export - Each answer embeds its spawn (id +
starts_at), question, and choice so consumers can interpret rows without separate lookups - Filters:
since,until(created_at),spawn_starts_at;per_pageraised to 100 for bulk pulls - Anonymous surveys: spawns below
survey_respondents_threshold(default 3) are suppressed entirely, matching the export's privacy contract
v0.12.0 — May 2026
- User responses now include an
avatar_urlfield — direct URL to the user's profile picture, ornullif none is set - Affects
GET /users,GET /users/{id}, and embedded user objects on posts, comments, announcements, events, calendar entries, form responses, andmonotree.user.registered/monotree.onboarding.completedwebhooks
v0.11.0 — April 2026
- Added Media upload endpoints (
write:mediascope):POST /mediaandGET /media/{id} - Extended
POST /walls/{wall_id}/postswith optionalmedia_idsarray — upload first, then attach by id - Incoming webhook
wall_postandchat_messageactions now accept an optionalmediaarray of URL + type pairs (server fetches URLs) - Supported media types:
image,video,document. Max 10 per post/message, same type across the batch
v0.10.0 — April 2026
- Added
monotree.formresponse.updatedwebhook event (filterable by form) - Fires when a form response's status, deadline, visibility/archive flag, or assignees change
- Does not fire on initial creation (use
formresponse.created) or on unrelated activity like comments/notes - Whistleblower forms are excluded, matching the existing
formresponse.createdbehavior
v0.9.0 — April 2026
- Added Comments CRUD endpoints on posts (
read:comments,write:commentsscopes) - New endpoints:
GET/POST /posts/{post_id}/commentsandGET/PUT/DELETE /posts/{post_id}/comments/{id} - Added
monotree.comment.created,monotree.comment.updatedandmonotree.comment.deletedwebhook events (filterable by wall) - Comment updates are restricted to the author within 30 minutes of creation
v0.8.0 — April 2026
- Outgoing webhooks now support resource filtering — optionally select specific forms or walls per event type
- Form response webhooks can be scoped to specific forms (multi-select)
- Post created webhooks can be scoped to specific walls (multi-select)
- Default remains "all" — no filter means you receive all events of that type
- Added
filtersfield to webhook create/update API
v0.7.0 — April 2026
- Added Calendar Entries CRUD endpoints (
read:calendar_entries,write:calendar_entriesscopes) - Create, update, and delete calendar entries with optional body and group targeting
- Added Create calendar entry action for incoming webhooks
v0.6.0 — April 2026
- Added Events CRUD endpoints (
read:events,write:eventsscopes) - Create, update, and delete company events with date, time, location, and group targeting
- Events are automatically published and added to the calendar on creation
v0.5.0 — March 2026
- Added Statistics read-only endpoints (
read:statsscope) - User summary: total, registered, active and new users (yesterday/7d/30d)
- Engagement: time series with active users, app time, sessions — filterable by granularity, period count, and group
- Adoption rate: per-department active/total employees percentage — filterable by group
- Content activity: posts, comments, reactions, chat messages, completed todos — this week vs last week
- All statistics responses are cached server-side (1h–24h) for performance
v0.4.0 — March 2026
- Added Walls read-only endpoints with group associations (
read:wallsscope) - Post endpoints now nested under walls:
/walls/{wall_id}/posts - Added Timestamp header to outgoing webhooks for replay attack prevention
- Webhook signatures now include the timestamp:
HMAC-SHA256(timestamp + "." + payload, secret) - Added bot user avatars for incoming webhooks (defaults to app icon)
- Outgoing webhooks now use revoke instead of delete
- Incoming webhooks now use unified
textfield for all actions - Added Pagination section to documentation with
metaandlinksformat - Added incoming webhook rate limiting documentation
v0.3.0 — March 2026
- Added Users read-only endpoints (
read:usersscope) - Added Groups read-only endpoints (
read:groupsscope) - Added
monotree.user.registeredwebhook event - Added
monotree.onboarding.completedwebhook event - Added
monotree.formresponse.createdwebhook event - Added IP whitelist per token
- Added configurable rate limit with rate limit response headers
- Added usage counters on tokens, outgoing webhooks, and incoming webhooks
- Added content author selection (bot user or yourself) on incoming webhooks
- Added Test Webhook buttons for outgoing and incoming webhooks
- Added signature verification documentation with Node.js example
v0.2.0 — March 2026
- Added Announcements CRUD endpoints (
read:announcements,write:announcementsscopes) - Added Create post on wall action for incoming webhooks
- Added
monotree.announcement.publishedwebhook event
v0.1.0 — March 2026
- Initial beta release of the Open API
- Bearer token authentication with scoped permissions
- Posts CRUD endpoints (
read:posts,write:postsscopes) - Outgoing webhooks with HMAC-SHA256 signing for post events
- Incoming webhooks for sending messages to chat rooms
- API request logging and webhook delivery logging
- Rate limiting at 60 requests per minute per token
- CMS admin interface for managing tokens, webhooks, and logs