Microsoft 365
Collect Microsoft 365 audit and activity logs from the Office 365 Management Activity API, including events from Exchange, SharePoint, OneDrive, Azure Active Directory, and more.
RunReveal polls the Microsoft 365 Management Activity API every 5 minutes to retrieve your organization’s audit logs. Logs are available in workload-specific views for easier querying.

Prerequisites
Before connecting Microsoft 365 to RunReveal, you need to:
- Ensure audit logging is enabled for your Microsoft 365 tenant via the Microsoft Purview compliance portal.
- Have access to the Azure Entra admin center with sufficient permissions to register applications and grant admin consent.
Step 1: Register an Application in Azure Entra
- Sign in to the Azure Entra admin center and navigate to Entra ID → App registrations.
- Click New registration.
- Enter a name for the application (e.g.,
RunReveal 365). - Under Supported account types, select Accounts in this organizational directory only.
- Click Register.

Step 2: Create a Client Secret
- In your new app registration, click Certificates & secrets in the left sidebar.
- Click New client secret.
- Enter a description (e.g.,
RunReveal integration) and set an expiration period. - Click Add.
- Copy the secret Value immediately — it will be hidden after you navigate away from this page. This is your Client Secret.
Step 3: Add API Permissions
- In the left sidebar, click API permissions → Add a permission.
- Select Office 365 Management APIs.
- Add the following Delegated permissions:
ActivityFeed.ReadActivityFeed.ReadDlpServiceHealth.Read
- Add the following Application permissions:
ActivityFeed.ReadActivityFeed.ReadDlpServiceHealth.Read
- Click Grant admin consent to approve the permissions for your organization.

Step 4: Copy Your Application and Tenant IDs
- In the left sidebar, click Overview.
- Copy the Application (client) ID — this is your Client ID.
- Copy the Directory (tenant) ID — this is your Tenant ID.

Step 5: Connect to RunReveal
- In RunReveal, navigate to Sources → Add Source.
- Search for and select Microsoft 365.
- Fill in the following fields:
| Field | Description |
|---|---|
| Source Name | A descriptive name for this source |
| Tenant ID | Your Azure AD Directory (tenant) ID |
| Client ID | Your Azure AD Application (client) ID |
| Client Secret | The client secret value you copied in Step 2 |
- Click Save.
RunReveal will automatically subscribe to all available Microsoft 365 activity feeds for your tenant. Logs should begin appearing within a few minutes.
Note: After the first connection, it can take up to 12 hours for Microsoft to make logs available via the API for the first time.
Verify It’s Working
Once added, the source logs should begin flowing within a few minutes.
You can validate we are receiving your logs by running the following SQL query:
SELECT * FROM runreveal.microsoft365_logs LIMIT 1Use dot notation on the rawJSON column to access any Microsoft 365-specific field without needing to know the exact JSONExtractString path:
SELECT
eventTime,
eventName,
rawJSON.UserId,
rawJSON.Workload,
rawJSON.Operation,
rawJSON.ResultStatus,
rawJSON.ClientIP
FROM runreveal.microsoft365_logs
WHERE rawJSON.Workload = 'AzureActiveDirectory'
LIMIT 50Schema
The microsoft365_logs view exposes all standard RunReveal normalized fields plus a rawJSON column typed as ClickHouse’s native JSON type. This lets you access any field from the raw Microsoft 365 audit event using dot notation, regardless of workload.
Table: microsoft365_logs
| Column | Type |
|---|---|
workspaceID | String |
sourceID | String |
sourceType | LowCardinality(String) |
sourceTTL | UInt32 |
receivedAt | DateTime |
id | String |
eventTime | DateTime |
eventName | String |
eventID | String |
srcIP | String |
srcASCountryCode | String |
srcASNumber | UInt32 |
srcASOrganization | String |
srcCity | String |
srcConnectionType | String |
srcISP | String |
srcLatitude | Float64 |
srcLongitude | Float64 |
srcUserType | String |
| Column | Type |
|---|---|
dstIP | String |
dstASCountryCode | String |
dstASNumber | UInt32 |
dstASOrganization | String |
dstCity | String |
dstConnectionType | String |
dstISP | String |
dstLatitude | Float64 |
dstLongitude | Float64 |
dstUserType | String |
actor | Map(String, String) |
tags | Map(String, String) |
resources | Array(String) |
serviceName | String |
enrichments | Array(Tuple(…)) |
readOnly | Bool |
rawLog | String |
rawJSON | JSON |