> For the complete documentation index, see [llms.txt](https://docs.onum.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.onum.com/listeners-changelog/office-365-listener.md).

# Office 365 Listener

Learn more about this Listener type in [this article](/listeners/listener-integrations/collect-data-from-microsoft-office-365.md).

<details>

<summary>v1.0.1</summary>

<mark style="background-color:purple;">**Released on**</mark> <mark style="background-color:purple;"></mark><mark style="background-color:purple;">05/03/2026</mark>

* Added per-content-type logging with metrics.
* Added source available time field to the event.
* Security enhancements: enforce HTTPS-only validation with Microsoft host-suffix allowlist on `loginServerUrl` and `resourceEndpoint` fields to prevent SSRF attacks and host-suffix spoofing (e.g. `https://login.microsoftonline.com.evil.com` is rejected), allowlist derived from Microsoft 365 IP Address and URL web service.
* Fixed unbounded time window growth causing AF20055 errors by processing data in bounded windows with partial progress on failure.
* Fixed state clearing on error path that wiped retry and pagination resume state, making retry logic dead code.
* Fixed `ClearWindowState` to preserve `failedContentURIs` and `failedRetryAttempts` across successful windows so failed content is retried on the next tick.

</details>

<details>

<summary>v1.0.0</summary>

<mark style="background-color:purple;">**Released on**</mark> <mark style="background-color:purple;"></mark><mark style="background-color:purple;">03/04/2026</mark>

We have added structured error handling for Office 365 API responses, including:

* Parse JSON error responses with error codes and messages
* Distinguish between permanent (non-retryable) and retryable errors
* Support for Office 365 error codes: AF20050, AF20051, AF20052
* Add retry logic with attempt tracking:
  * implement max retry attempts (3) to prevent unbounded retry loops
  * track retry attempts per content ID with failedRetryAttempts map
  * improved error messages include attempt counts (e.g., "attempt 2/3")
  * cleanup of retry attempt counters on success and permanent failures
* We have implemented safeguards against memory exhaustion in high-volume data processing scenarios in the deduplication system (which prevents duplicate message processing):
  * implement size limit for processedContentIDs map (500k entries max, \~50 MB)
  * clear map when limit reached to prevent OOM in high-volume
  * log warning when map is cleared for monitoring/alerting
* We have added memory protection for retry map. This update implements safeguards against memory exhaustion in the retry system. Failed content entries are now automatically removed from the retry tracking map after they exceed their maximum retry attempts, rather than being stored indefinitely:
  * remove failed content after exceeding max retry attempts
  * prevent unbounded growth of failedContentURIs map

</details>

<details>

<summary>v0.2.0</summary>

<mark style="background-color:purple;">**Released on**</mark> <mark style="background-color:purple;"></mark><mark style="background-color:purple;">02/10/2026</mark>

* New logs for errors and pre-fetch operations.
* Added proxy configuration settings.
* In order to use this Listener, you must activate the following environment variable in your distributor using docker compose: `SINGLETON_LISTENER_EXECUTOR=true.`
* Fixed deadlock in the `fetch` method.
* Fixed next page query parameter (`nextpage` > `nextPage`).
* Fixed forever loop in the `listContent` function.

</details>

<details>

<summary>v0.1.0</summary>

<mark style="background-color:purple;">**Released on**</mark> <mark style="background-color:purple;"></mark><mark style="background-color:purple;">20/01/2026</mark>

Added error port when using this Listener in a Pipeline.

</details>

<details>

<summary>v0.0.3</summary>

<mark style="background-color:purple;">**Released on**</mark> <mark style="background-color:purple;"></mark><mark style="background-color:purple;">07/10/2025</mark>

The logger has been replaced by an error notifier. This change represents an architectural shift from passive logging to active error notification, whereby the error notifier proactively alerts about issues.

</details>

<details>

<summary>v0.0.1</summary>

<mark style="background-color:purple;">**Released on**</mark> <mark style="background-color:purple;"></mark><mark style="background-color:purple;">01/23/2025</mark>

Initial version.

</details>
