azure-ai-contentsafety-ts
Analyze text and images for harmful content with customizable blocklists.
- risk
- unknown
- source
- community
- date added
- 2026-02-27
Azure AI Content Safety REST SDK for TypeScript
Analyze text and images for harmful content with customizable blocklists.
Installation
npm install @azure-rest/ai-content-safety @azure/identity @azure/core-auth
Environment Variables
CONTENT_SAFETY_ENDPOINT=https://<resource>.cognitiveservices.azure.com CONTENT_SAFETY_KEY=<api-key>
Authentication
Important: This is a REST client. ContentSafetyClient is a function, not a class.
API Key
import ContentSafetyClient from "@azure-rest/ai-content-safety"; import { AzureKeyCredential } from "@azure/core-auth"; const client = ContentSafetyClient( process.env.CONTENT_SAFETY_ENDPOINT!, new AzureKeyCredential(process.env.CONTENT_SAFETY_KEY!) );
DefaultAzureCredential
import ContentSafetyClient from "@azure-rest/ai-content-safety"; import { DefaultAzureCredential } from "@azure/identity"; const client = ContentSafetyClient( process.env.CONTENT_SAFETY_ENDPOINT!, new DefaultAzureCredential() );
Analyze Text
import ContentSafetyClient, { isUnexpected } from "@azure-rest/ai-content-safety"; const result = await client.path("/text:analyze").post({ body: { text: "Text content to analyze", categories: ["Hate", "Sexual", "Violence", "SelfHarm"], outputType: "FourSeverityLevels" // or "EightSeverityLevels" } }); if (isUnexpected(result)) { throw result.body; } for (const analysis of result.body.categoriesAnalysis) { console.log(`${analysis.category}: severity ${analysis.severity}`); }
Analyze Image
Base64 Content
import { readFileSync } from "node:fs"; const imageBuffer = readFileSync("./image.png"); const base64Image = imageBuffer.toString("base64"); const result = await client.path("/image:analyze").post({ body: { image: { content: base64Image } } }); if (isUnexpected(result)) { throw result.body; } for (const analysis of result.body.categoriesAnalysis) { console.log(`${analysis.category}: severity ${analysis.severity}`); }
Blob URL
const result = await client.path("/image:analyze").post({ body: { image: { blobUrl: "https://storage.blob.core.windows.net/container/image.png" } } });
Blocklist Management
Create Blocklist
const result = await client .path("/text/blocklists/{blocklistName}", "my-blocklist") .patch({ contentType: "application/merge-patch+json", body: { description: "Custom blocklist for prohibited terms" } }); if (isUnexpected(result)) { throw result.body; } console.log(`Created: ${result.body.blocklistName}`);
Add Items to Blocklist
const result = await client .path("/text/blocklists/{blocklistName}:addOrUpdateBlocklistItems", "my-blocklist") .post({ body: { blocklistItems: [ { text: "prohibited-term-1", description: "First blocked term" }, { text: "prohibited-term-2", description: "Second blocked term" } ] } }); if (isUnexpected(result)) { throw result.body; } for (const item of result.body.blocklistItems ?? []) { console.log(`Added: ${item.blocklistItemId}`); }
Analyze with Blocklist
const result = await client.path("/text:analyze").post({ body: { text: "Text that might contain blocked terms", blocklistNames: ["my-blocklist"], haltOnBlocklistHit: false } }); if (isUnexpected(result)) { throw result.body; } // Check blocklist matches if (result.body.blocklistsMatch) { for (const match of result.body.blocklistsMatch) { console.log(`Blocked: "${match.blocklistItemText}" from ${match.blocklistName}`); } }
List Blocklists
const result = await client.path("/text/blocklists").get(); if (isUnexpected(result)) { throw result.body; } for (const blocklist of result.body.value ?? []) { console.log(`${blocklist.blocklistName}: ${blocklist.description}`); }
Delete Blocklist
await client.path("/text/blocklists/{blocklistName}", "my-blocklist").delete();
Harm Categories
| Category | API Term | Description |
|---|---|---|
| Hate and Fairness | Hate | Discriminatory language targeting identity groups |
| Sexual | Sexual | Sexual content, nudity, pornography |
| Violence | Violence | Physical harm, weapons, terrorism |
| Self-Harm | SelfHarm | Self-injury, suicide, eating disorders |
Severity Levels
| Level | Risk | Recommended Action |
|---|---|---|
| 0 | Safe | Allow |
| 2 | Low | Review or allow with warning |
| 4 | Medium | Block or require human review |
| 6 | High | Block immediately |
Output Types:
FourSeverityLevels(default): Returns 0, 2, 4, 6EightSeverityLevels: Returns 0-7
Content Moderation Helper
import ContentSafetyClient, { isUnexpected, TextCategoriesAnalysisOutput } from "@azure-rest/ai-content-safety"; interface ModerationResult { isAllowed: boolean; flaggedCategories: string[]; maxSeverity: number; blocklistMatches: string[]; } async function moderateContent( client: ReturnType<typeof ContentSafetyClient>, text: string, maxAllowedSeverity = 2, blocklistNames: string[] = [] ): Promise<ModerationResult> { const result = await client.path("/text:analyze").post({ body: { text, blocklistNames, haltOnBlocklistHit: false } }); if (isUnexpected(result)) { throw result.body; } const flaggedCategories = result.body.categoriesAnalysis .filter(c => (c.severity ?? 0) > maxAllowedSeverity) .map(c => c.category!); const maxSeverity = Math.max( ...result.body.categoriesAnalysis.map(c => c.severity ?? 0) ); const blocklistMatches = (result.body.blocklistsMatch ?? []) .map(m => m.blocklistItemText!); return { isAllowed: flaggedCategories.length === 0 && blocklistMatches.length === 0, flaggedCategories, maxSeverity, blocklistMatches }; }
API Endpoints
| Operation | Method | Path |
|---|---|---|
| Analyze Text | POST | /text:analyze |
| Analyze Image | POST | /image:analyze |
| Create/Update Blocklist | PATCH | /text/blocklists/{blocklistName} |
| List Blocklists | GET | /text/blocklists |
| Delete Blocklist | DELETE | /text/blocklists/{blocklistName} |
| Add Blocklist Items | POST | /text/blocklists/{blocklistName}:addOrUpdateBlocklistItems |
| List Blocklist Items | GET | /text/blocklists/{blocklistName}/blocklistItems |
| Remove Blocklist Items | POST | /text/blocklists/{blocklistName}:removeBlocklistItems |
Key Types
import ContentSafetyClient, { isUnexpected, AnalyzeTextParameters, AnalyzeImageParameters, TextCategoriesAnalysisOutput, ImageCategoriesAnalysisOutput, TextBlocklist, TextBlocklistItem } from "@azure-rest/ai-content-safety";
Best Practices
- Always use isUnexpected() - Type guard for error handling
- Set appropriate thresholds - Different categories may need different severity thresholds
- Use blocklists for domain-specific terms - Supplement AI detection with custom rules
- Log moderation decisions - Keep audit trail for compliance
- Handle edge cases - Empty text, very long text, unsupported image formats
When to Use
This skill is applicable to execute the workflow or actions described in the overview.