> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://fastpix.com/docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://fastpix.com/docs/_mcp/server.

# Moderate video content and detect profanity

POST https://api.fastpix.com/v1/ai/{mediaId}/moderation
Content-Type: application/json

This endpoint analyzes existing media for potentially unsafe or inappropriate content, including profanity. The results contain detected moderation categories and confidence scores to help automate content review and policy enforcement.

#### What it detects

* **Video:** Sexual content, violence, graphic violence, self-harm, harassment, hate, and illicit content.
* **Audio:** Harassment, hate, threats, sexual content, self-harm, violence, and profanity.

#### How it works

1. Send a `POST` request to this endpoint, replacing `<mediaId>` with the ID of the media for which you want to generate moderation.
2. Optionally, include a request body to select the media types and categories to analyze, specify the audio language, set category confidence thresholds, or configure the video sampling interval. If the body is omitted, FastPix uses the default moderation configuration.
3. The response confirms that the request was successful and returns the ID of the media. The job starts immediately after a successful request.
4. You can use the [video.media.ai.moderation.ready](https://fastpix.com/docs/webhooks/in-video-ai-events#videomediaaimoderationready-1) webhook event to track and notify the status.
5. After the webhook event is received, you can use the [Get video moderation results](https://fastpix.com/docs/in-video-ai-api/content-moderation/get-media-ai-moderation) endpoint to retrieve the generated moderation.

**Use case**: Use this feature to analyze media that has already been uploaded for unsafe content and profanity, without requiring the user to upload it again.

Related guide: Content moderation and profanity detection

Reference: https://fastpix.com/docs/in-video-ai-api/content-moderation/create-ai-moderation

## Authentication

- `Authorization` header (basic auth, required) — FastPix APIs are secured with Basic Authentication. Use your Access Token ID as the username and Secret Key as the password in the Authorization header of each API request. * Username: Access Token ID * Password: Secret Key Activate your FastPix account to generate your API credentials. See the guide here

## Request

### Path parameters

- `mediaId` (string, required) — The unique identifier assigned to the media when it is created. The value must be a valid UUID.

### Body (application/json)

This endpoint expects a ModerationTriggerRequest.

- `modalities` (list of enum, optional) — Media types to analyze. If omitted, both video and audio are selected when available.
  - Allowed values: `video`, `audio`
- `languageCode` (enum, optional) — Language code used for audio moderation. If omitted, the moderation workflow uses its default language handling.
  - Allowed values: `en`, `hi`, `te`, `ta`, `kn`, `ml`, `mr`, `gu`, `pa`, `bn`, `or`, `as`, `ur`
- `categories` (list of enum, optional) — Moderation categories to evaluate. If omitted, all supported categories are evaluated.
  - Allowed values: `violence`, `sexual`, `profanity`, `threats`, `harassment`, `hate_speech`
- `thresholds` (ModerationTriggerRequestThresholds, optional) — Confidence threshold for each selected category. Values must be between 0 and 1. Categories without a specified threshold use the default value of 0.5.
- `sampling` (ModerationTriggerRequestSampling, optional) — Video sampling configuration.

## Response

### 201

Successfully triggered video moderation generation.

- `success` (boolean, optional) — Shows the request status. Returns true for success and false for failure.
- `data` (AiTriggerSuccessData, optional)

## Types

### ModerationTriggerRequestThresholds

Confidence threshold for each selected category. Values must be between 0 and 1. Categories without a specified threshold use the default value of 0.5.

- `violence` (double, optional)
- `sexual` (double, optional)
- `profanity` (double, optional)
- `threats` (double, optional)
- `harassment` (double, optional)
- `hate_speech` (double, optional)

### ModerationTriggerRequestSampling

Video sampling configuration.

- `intervalSeconds` (integer, optional) — Target video moderation interval in seconds. The value must not exceed the media duration. Defaults to 5 when a configuration body is supplied.

### AiTriggerSuccessData

- `id` (string, optional)

## Examples

**Request**

```json
{
  "modalities": [
    "video",
    "audio"
  ],
  "languageCode": "te",
  "categories": [
    "violence",
    "profanity"
  ],
  "thresholds": {
    "violence": 0.4,
    "profanity": 0.3
  },
  "sampling": {
    "intervalSeconds": 5
  }
}
```

**Response**

```json
{
  "success": true,
  "data": {
    "id": "c695988b-ff84-42ae-bb21-10f284fedb0e"
  }
}
```

**SDK Code**

```python
import requests

url = "https://api.fastpix.com/v1/ai/4fa85f64-5717-4562-b3fc-2c963f66afa6/moderation"

payload = {
    "modalities": ["video", "audio"],
    "languageCode": "te",
    "categories": ["violence", "profanity"],
    "thresholds": {
        "violence": 0.4,
        "profanity": 0.3
    },
    "sampling": { "intervalSeconds": 5 }
}
headers = {
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers, auth=("<username>", "<password>"))

print(response.json())
```

```javascript
const url = 'https://api.fastpix.com/v1/ai/4fa85f64-5717-4562-b3fc-2c963f66afa6/moderation';
const credentials = btoa("<username>:<password>");

const options = {
  method: 'POST',
  headers: {
    Authorization: `Basic ${credentials}`,
    'Content-Type': 'application/json'
  },
  body: '{"modalities":["video","audio"],"languageCode":"te","categories":["violence","profanity"],"thresholds":{"violence":0.4,"profanity":0.3},"sampling":{"intervalSeconds":5}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.fastpix.com/v1/ai/4fa85f64-5717-4562-b3fc-2c963f66afa6/moderation"

	payload := strings.NewReader("{\n  \"modalities\": [\n    \"video\",\n    \"audio\"\n  ],\n  \"languageCode\": \"te\",\n  \"categories\": [\n    \"violence\",\n    \"profanity\"\n  ],\n  \"thresholds\": {\n    \"violence\": 0.4,\n    \"profanity\": 0.3\n  },\n  \"sampling\": {\n    \"intervalSeconds\": 5\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.SetBasicAuth("<username>", "<password>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.fastpix.com/v1/ai/4fa85f64-5717-4562-b3fc-2c963f66afa6/moderation")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request.basic_auth("<username>", "<password>")
request["Content-Type"] = 'application/json'
request.body = "{\n  \"modalities\": [\n    \"video\",\n    \"audio\"\n  ],\n  \"languageCode\": \"te\",\n  \"categories\": [\n    \"violence\",\n    \"profanity\"\n  ],\n  \"thresholds\": {\n    \"violence\": 0.4,\n    \"profanity\": 0.3\n  },\n  \"sampling\": {\n    \"intervalSeconds\": 5\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.fastpix.com/v1/ai/4fa85f64-5717-4562-b3fc-2c963f66afa6/moderation")
  .basicAuth("<username>", "<password>")
  .header("Content-Type", "application/json")
  .body("{\n  \"modalities\": [\n    \"video\",\n    \"audio\"\n  ],\n  \"languageCode\": \"te\",\n  \"categories\": [\n    \"violence\",\n    \"profanity\"\n  ],\n  \"thresholds\": {\n    \"violence\": 0.4,\n    \"profanity\": 0.3\n  },\n  \"sampling\": {\n    \"intervalSeconds\": 5\n  }\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.fastpix.com/v1/ai/4fa85f64-5717-4562-b3fc-2c963f66afa6/moderation', [
  'body' => '{
  "modalities": [
    "video",
    "audio"
  ],
  "languageCode": "te",
  "categories": [
    "violence",
    "profanity"
  ],
  "thresholds": {
    "violence": 0.4,
    "profanity": 0.3
  },
  "sampling": {
    "intervalSeconds": 5
  }
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
    'auth' => ['<username>', '<password>'],
]);

echo $response->getBody();
```

```csharp
using RestSharp;
using RestSharp.Authenticators;

var client = new RestClient("https://api.fastpix.com/v1/ai/4fa85f64-5717-4562-b3fc-2c963f66afa6/moderation");
client.Authenticator = new HttpBasicAuthenticator("<username>", "<password>");
var request = new RestRequest(Method.POST);

request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"modalities\": [\n    \"video\",\n    \"audio\"\n  ],\n  \"languageCode\": \"te\",\n  \"categories\": [\n    \"violence\",\n    \"profanity\"\n  ],\n  \"thresholds\": {\n    \"violence\": 0.4,\n    \"profanity\": 0.3\n  },\n  \"sampling\": {\n    \"intervalSeconds\": 5\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let credentials = Data("<username>:<password>".utf8).base64EncodedString()

let headers = [
  "Authorization": "Basic \(credentials)",
  "Content-Type": "application/json"
]
let parameters = [
  "modalities": ["video", "audio"],
  "languageCode": "te",
  "categories": ["violence", "profanity"],
  "thresholds": [
    "violence": 0.4,
    "profanity": 0.3
  ],
  "sampling": ["intervalSeconds": 5]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.fastpix.com/v1/ai/4fa85f64-5717-4562-b3fc-2c963f66afa6/moderation")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```