> ## Documentation Index
> Fetch the complete documentation index at: https://docs.contentmod.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Moderate Text

> Moderate text using the Typescript SDK

## Moderate Text

To moderate text, you can use the `text.moderate` method. This method takes in a text string and returns a `Promise` that resolves to a `TextModerationResponse` object.

```ts index.ts theme={null}
const contentMod = new ContentMod({
  publicKey: "<YOUR_PUBLIC_KEY>",
  secretKey: "<YOUR_SECRET_KEY>",
});

// Simple text moderation
const response = await contentMod.text.moderate("Some bad text");

// Text moderation with additional metadata to be saved with the moderation request
const response2 = await contentMod.text.moderate("Some bad text", {
  meta: {
    userId: "1234",
  },
});

// Optionally you can pass in an webhook callback url if you want to be notified when the moderation request is completed
const response3 = await contentMod.text.moderate("Some bad text", {
  callbackUrl: "https://example.com/webhook",
});
```

### Webhook Callback

If you pass in a webhook callback url, the response will only be an object with the `id` property.

## Properties

<ResponseField name="text" type="string" required>
  Text to moderate

  Example: `Some bad text`
</ResponseField>

<ResponseField name="options" type="object" exp>
  An object of options for the moderation request

  <Expandable title="Options" defaultOpen>
    <ResponseField name="meta" type="object">
      Any additional metadata you want to include with the moderation request that will be saved.

      Example:`{"userId": "1234"}`
    </ResponseField>

    <ResponseField name="callbackUrl" type="string">
      A webhook callback url that will be called when the moderation request is completed.

      Example: `https://example.com/webhook`
    </ResponseField>

    <ResponseField name="defer" type="boolean">
      Whether to defer the moderation request.
      If this value is true the request will be queued and you will receive the response later in a webhook that you have set up. Or you can look it up
      later using the id returned.

      Example: `true`
    </ResponseField>
  </Expandable>
</ResponseField>

## Response

The `TextModerationResponse` object contains the following properties:

<ResponseField name="id" type="string" required>
  The ID of the moderation request.

  Example: `27fbdc0b-b295-46ce-93f5-81b2fc08a381`
</ResponseField>

<ResponseField name="isSafe" type="boolean" required>
  Whether the text is considered safe.

  Example: `true`
</ResponseField>

<ResponseField name="confidence" type="number" required>
  Confidence of the safety of the text from 1-100.

  Example: `90`
</ResponseField>

<ResponseField name="sentiment" type="string" required>
  Sentiment of the text, either negative, neutral or positive.

  available sentiment values are:

  * negative
  * neutral (default)
  * positive

  Example: `positive`
</ResponseField>

<ResponseField name="sentimentScore" type="number" required>
  Sentiment score from 1-100 (negative, neutral, positive).

  Example: `90`
</ResponseField>

<ResponseField name="riskScores" type="object" required>
  Overall risk score from 1-100.

  Example: `90`
</ResponseField>

<ResponseField name="topics" type="array" required>
  General topics the text depicts, lowercase and no punctuation.

  Example: `["politics", "sports"]`
</ResponseField>

<ResponseField name="nsfwCategories" type="array" required>
  An array of the categories of the text.
  The available categories are:

  * adult\_content
  * suggestive\_imagery
  * strong\_language
  * violence\_gore
  * horror\_disturbing
  * alcohol
  * tobacco
  * substance\_use
  * gambling
  * dating\_relationship
  * medical\_procedures"
  * crude\_humor
  * political\_content

  Example: `[{"category": "sexual", "severity": 90}]`
</ResponseField>

<ResponseField name="summary" type="object" required>
  Summary of the text.

  Example: `{"profanity": true, "totalFlags": 1, "contentRating": "G", "language": "en"}`
</ResponseField>

<ResponseField name="suggestedActions" type="object" required>
  Suggested actions for the text.

  <Expandable title="Suggested Actions" defaultOpen>
    <ResponseField name="reject" type="boolean" required>
      Whether to reject the text.

      Example: `true`
    </ResponseField>

    <ResponseField name="review" type="boolean" required>
      Whether to flag the text.

      Example: `true`
    </ResponseField>
  </Expandable>

  Example: `{"reject": true, "review": true}`
</ResponseField>

<ResponseField name="content" type="string" required>
  The original text.

  Example: `This is the original text`
</ResponseField>

<ResponseField name="filteredContent" type="string" required>
  The text with profanity replaced by \*.

  Example: `This is a filtered text`
</ResponseField>

<ResponseField name="request" type="object" required>
  The request object.

  Example: `{"requestId": "27fbdc0b-b295-46ce-93f5-81b2fc08a381", "timestamp": "2023-04-05T12:00:00.000Z"}`
</ResponseField>

<ResponseField name="meta" type="object" required>
  The metadata of the request object that the user provided.

  Example: `{"userId": "12345"}`
</ResponseField>

<ResponseField name="hash" type="string" required>
  The SHA-256 hash of the text.
  Used for content comparison purposes.
  Example: `93a08bd10cd367bf83f12ba6590fcaef2f8deec8a47ce4ce88a15c7dda325ffa`
</ResponseField>
