# Logs & Analytics

Stream provides APIs to query moderation logs, export them for compliance, retrieve analytics, and track usage statistics. These endpoints help you audit moderation activity, monitor moderator performance, and generate reports.

## Query Moderation Logs

`POST /api/v2/moderation/logs`

Query moderation action logs with filtering, sorting, and pagination. Logs record every moderation action taken -- who did what, when, and on which content.

<codetabs>

<codetabs-item value="js" label="Node">

```js
const response = await client.moderation.queryModerationLogs({
  filter: { entity_type: "stream:chat:v1:message" },
  sort: [{ field: "created_at", direction: -1 }],
  limit: 50,
});
```

</codetabs-item>

<codetabs-item value="py" label="Python">

```python
response = client.moderation().query_moderation_logs(
    filter={"entity_type": "stream:chat:v1:message"},
    sort=[{"field": "created_at", "direction": -1}],
    limit=50,
)
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
response, err := client.Moderation().QueryModerationLogs(ctx, &getstream.QueryModerationLogsRequest{
    Filter: map[string]interface{}{"entity_type": "stream:chat:v1:message"},
    Sort:   []getstream.SortParam{{Field: "created_at", Direction: getstream.PtrTo(-1)}},
    Limit:  getstream.PtrTo(50),
})
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
client.moderation().queryModerationLogs(QueryModerationLogsRequest.builder()
    .filter(Map.of("entity_type", "stream:chat:v1:message"))
    .sort(List.of(SortParam.builder().field("created_at").direction(-1).build()))
    .limit(50)
    .build()).execute();
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$response = $client->moderation()->queryModerationLogs(new QueryModerationLogsRequest(
    filter: (object)['entity_type' => 'stream:chat:v1:message'],
    sort: [new SortParam(field: 'created_at', direction: -1)],
    limit: 50,
));
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
response = client.moderation.query_moderation_logs(
  GetStream::Generated::Models::QueryModerationLogsRequest.new(
    filter: { "entity_type" => "stream:chat:v1:message" },
    sort: [GetStream::Generated::Models::SortParam.new(field: "created_at", direction: -1)],
    limit: 50
  )
)
```

</codetabs-item>

<codetabs-item value="dotnet" label=".NET">

```csharp
var response = await client.Moderation.QueryModerationLogsAsync(new QueryModerationLogsRequest
{
    Filter = new Dictionary<string, object> { { "entity_type", "stream:chat:v1:message" } },
    Sort = new List<SortParam> { new() { Field = "created_at", Direction = -1 } },
    Limit = 50,
});
```

</codetabs-item>

</codetabs>

### Request Parameters

| Key    | Required | Type   | Description                              |
| ------ | -------- | ------ | ---------------------------------------- |
| filter | false    | object | Filter conditions for logs.              |
| sort   | false    | array  | Sort parameters (e.g., by `created_at`). |
| limit  | false    | number | Maximum number of logs to return.        |
| next   | false    | string | Cursor for pagination.                   |

### Response

| Key  | Type   | Description                                                                                             |
| ---- | ------ | ------------------------------------------------------------------------------------------------------- |
| logs | array  | List of moderation log entries. Each entry includes action type, actor, target, timestamp, and details. |
| next | string | Next cursor for pagination.                                                                             |

## Export Moderation Logs

`POST /api/v2/moderation/logs/export`

Export moderation logs for external analysis or compliance purposes. The export can be filtered by time range, entity type, or any other supported filter condition.

<codetabs>

<codetabs-item value="js" label="Node">

```js
const response = await client.moderation.exportModerationLogs({
  filter: { created_at: { $gte: "2024-01-01T00:00:00Z" } },
});
```

</codetabs-item>

<codetabs-item value="py" label="Python">

```python
response = client.moderation().export_moderation_logs(
    filter={"created_at": {"$gte": "2024-01-01T00:00:00Z"}},
)
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
response, err := client.Moderation().ExportModerationLogs(ctx, &getstream.ExportModerationLogsRequest{
    Filter: map[string]interface{}{
        "created_at": map[string]interface{}{"$gte": "2024-01-01T00:00:00Z"},
    },
})
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
client.moderation().exportModerationLogs(ExportModerationLogsRequest.builder()
    .filter(Map.of("created_at", Map.of("$gte", "2024-01-01T00:00:00Z")))
    .build()).execute();
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$response = $client->moderation()->exportModerationLogs(new ExportModerationLogsRequest(
    filter: (object)['created_at' => (object)['$gte' => '2024-01-01T00:00:00Z']],
));
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
response = client.moderation.export_moderation_logs(
  GetStream::Generated::Models::ExportModerationLogsRequest.new(
    filter: { "created_at" => { "$gte" => "2024-01-01T00:00:00Z" } }
  )
)
```

</codetabs-item>

<codetabs-item value="dotnet" label=".NET">

```csharp
var response = await client.Moderation.ExportModerationLogsAsync(new ExportModerationLogsRequest
{
    Filter = new Dictionary<string, object>
    {
        { "created_at", new Dictionary<string, object> { { "$gte", "2024-01-01T00:00:00Z" } } }
    },
});
```

</codetabs-item>

</codetabs>

### Request Parameters

| Key    | Required | Type   | Description                                 |
| ------ | -------- | ------ | ------------------------------------------- |
| filter | false    | object | Filter conditions for which logs to export. |

### Response

| Key        | Type   | Description                             |
| ---------- | ------ | --------------------------------------- |
| export_url | string | URL to download the exported logs file. |
| status     | string | Status of the export operation.         |

## Get Moderation Analytics

`POST /api/v2/moderation/analytics`

Retrieve moderation analytics for a specified time range. This is a server-side only endpoint that returns aggregate statistics about moderation activity.

<codetabs>

<codetabs-item value="js" label="Node">

```js
const response = await client.moderation.getModerationAnalytics({
  from: "2024-01-01T00:00:00Z",
  to: "2024-01-31T23:59:59Z",
});
```

</codetabs-item>

<codetabs-item value="py" label="Python">

```python
response = client.moderation().get_moderation_analytics(
    from_="2024-01-01T00:00:00Z",
    to="2024-01-31T23:59:59Z",
)
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
response, err := client.Moderation().GetModerationAnalytics(ctx, &getstream.GetModerationAnalyticsRequest{
    From: getstream.PtrTo("2024-01-01T00:00:00Z"),
    To:   getstream.PtrTo("2024-01-31T23:59:59Z"),
})
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
client.moderation().getModerationAnalytics(GetModerationAnalyticsRequest.builder()
    .from("2024-01-01T00:00:00Z")
    .to("2024-01-31T23:59:59Z")
    .build()).execute();
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$response = $client->moderation()->getModerationAnalytics(new GetModerationAnalyticsRequest(
    from: '2024-01-01T00:00:00Z',
    to: '2024-01-31T23:59:59Z',
));
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
response = client.moderation.get_moderation_analytics(
  GetStream::Generated::Models::GetModerationAnalyticsRequest.new(
    from: "2024-01-01T00:00:00Z",
    to: "2024-01-31T23:59:59Z"
  )
)
```

</codetabs-item>

<codetabs-item value="dotnet" label=".NET">

```csharp
var response = await client.Moderation.GetModerationAnalyticsAsync(new GetModerationAnalyticsRequest
{
    From = "2024-01-01T00:00:00Z",
    To = "2024-01-31T23:59:59Z",
});
```

</codetabs-item>

</codetabs>

### Request Parameters

| Key  | Required | Type   | Description                              |
| ---- | -------- | ------ | ---------------------------------------- |
| from | false    | string | Start of time range (ISO 8601 datetime). |
| to   | false    | string | End of time range (ISO 8601 datetime).   |

### Response

| Key       | Type   | Description                                                       |
| --------- | ------ | ----------------------------------------------------------------- |
| analytics | object | Aggregate moderation analytics data for the specified time range. |

## Query Usage Stats

`POST /api/v2/moderation/usage_stats`

Query moderation usage statistics -- number of checks, flags, actions, and other operational metrics over a given time period.

<codetabs>

<codetabs-item value="js" label="Node">

```js
const response = await client.moderation.queryUsageStats({
  from: "2024-01-01T00:00:00Z",
  to: "2024-01-31T23:59:59Z",
});
```

</codetabs-item>

<codetabs-item value="py" label="Python">

```python
response = client.moderation().query_usage_stats(
    from_="2024-01-01T00:00:00Z",
    to="2024-01-31T23:59:59Z",
)
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
response, err := client.Moderation().QueryUsageStats(ctx, &getstream.QueryUsageStatsRequest{
    From: getstream.PtrTo("2024-01-01T00:00:00Z"),
    To:   getstream.PtrTo("2024-01-31T23:59:59Z"),
})
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
client.moderation().queryUsageStats(QueryUsageStatsRequest.builder()
    .from("2024-01-01T00:00:00Z")
    .to("2024-01-31T23:59:59Z")
    .build()).execute();
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$response = $client->moderation()->queryUsageStats(new QueryUsageStatsRequest(
    from: '2024-01-01T00:00:00Z',
    to: '2024-01-31T23:59:59Z',
));
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
response = client.moderation.query_usage_stats(
  GetStream::Generated::Models::QueryUsageStatsRequest.new(
    from: "2024-01-01T00:00:00Z",
    to: "2024-01-31T23:59:59Z"
  )
)
```

</codetabs-item>

<codetabs-item value="dotnet" label=".NET">

```csharp
var response = await client.Moderation.QueryUsageStatsAsync(new QueryUsageStatsRequest
{
    From = "2024-01-01T00:00:00Z",
    To = "2024-01-31T23:59:59Z",
});
```

</codetabs-item>

</codetabs>

### Request Parameters

| Key  | Required | Type   | Description                              |
| ---- | -------- | ------ | ---------------------------------------- |
| from | false    | string | Start of time range (ISO 8601 datetime). |
| to   | false    | string | End of time range (ISO 8601 datetime).   |

### Response

| Key   | Type   | Description                                                                             |
| ----- | ------ | --------------------------------------------------------------------------------------- |
| stats | object | Usage statistics including counts for checks, flags, and actions within the time range. |

## Get User Moderation Report

`GET /api/v2/moderation/user_report`

Retrieve a comprehensive moderation report for a specific user, including moderation history, flags received, and actions taken against their content.

<codetabs>

<codetabs-item value="js" label="Node">

```js
const response = await client.moderation.getUserModerationReport({
  user_id: "user_123",
});
```

</codetabs-item>

<codetabs-item value="py" label="Python">

```python
response = client.moderation().get_user_moderation_report(
    user_id="user_123",
)
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
response, err := client.Moderation().GetUserModerationReport(ctx, &getstream.GetUserModerationReportRequest{
    UserID: "user_123",
})
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
client.moderation().getUserModerationReport(GetUserModerationReportRequest.builder()
    .userId("user_123")
    .build()).execute();
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$response = $client->moderation()->getUserModerationReport(new GetUserModerationReportRequest(
    userId: 'user_123',
));
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
response = client.moderation.get_user_moderation_report(
  GetStream::Generated::Models::GetUserModerationReportRequest.new(
    user_id: "user_123"
  )
)
```

</codetabs-item>

<codetabs-item value="dotnet" label=".NET">

```csharp
var response = await client.Moderation.GetUserModerationReportAsync(new GetUserModerationReportRequest
{
    UserId = "user_123",
});
```

</codetabs-item>

</codetabs>

### Request Parameters

| Key     | Required | Type   | Description                               |
| ------- | -------- | ------ | ----------------------------------------- |
| user_id | true     | string | The ID of the user to get the report for. |

### Response

| Key    | Type   | Description                                                                          |
| ------ | ------ | ------------------------------------------------------------------------------------ |
| report | object | Comprehensive moderation report for the user, including history, flags, and actions. |

## Get Flag Count

`POST /api/v2/moderation/flag_count`

Get the number of moderation flags created against a specific user's content. Useful for building moderation dashboards and identifying repeat offenders.

<codetabs>

<codetabs-item value="js" label="Node">

```js
const response = await client.moderation.getFlagCount({
  user_id: "user_123",
});
```

</codetabs-item>

<codetabs-item value="py" label="Python">

```python
response = client.moderation().get_flag_count(
    user_id="user_123",
)
```

</codetabs-item>

<codetabs-item value="go" label="Go">

```go
response, err := client.Moderation().GetFlagCount(ctx, &getstream.GetFlagCountRequest{
    UserID: "user_123",
})
```

</codetabs-item>

<codetabs-item value="java" label="Java">

```java
client.moderation().getFlagCount(GetFlagCountRequest.builder()
    .userId("user_123")
    .build()).execute();
```

</codetabs-item>

<codetabs-item value="php" label="PHP">

```php
$response = $client->moderation()->getFlagCount(new GetFlagCountRequest(
    userId: 'user_123',
));
```

</codetabs-item>

<codetabs-item value="ruby" label="Ruby">

```ruby
response = client.moderation.get_flag_count(
  GetStream::Generated::Models::GetFlagCountRequest.new(
    user_id: "user_123"
  )
)
```

</codetabs-item>

<codetabs-item value="dotnet" label=".NET">

```csharp
var response = await client.Moderation.GetFlagCountAsync(new GetFlagCountRequest
{
    UserId = "user_123",
});
```

</codetabs-item>

</codetabs>

### Request Parameters

| Key         | Required | Type   | Description                       |
| ----------- | -------- | ------ | --------------------------------- |
| user_id     | true     | string | User ID to get flag count for.    |
| entity_type | false    | string | Optionally filter by entity type. |

### Response

| Key   | Type   | Description                                   |
| ----- | ------ | --------------------------------------------- |
| count | number | Total number of flags for the specified user. |

---

This page was last updated at 2026-04-16T18:29:44.345Z.

For the most recent version of this documentation, visit [https://getstream.io/moderation/docs/php/content-moderation/logs-and-analytics/](https://getstream.io/moderation/docs/php/content-moderation/logs-and-analytics/).