Node.js Integration
Add content moderation to any Node.js application.
Installation
bash
npm install @nextauralabs/vettly-sdkQuick Start
js
const { ModerationClient } = require('@nextauralabs/vettly-sdk')
const vettly = new ModerationClient({
apiKey: process.env.VETTLY_API_KEY
})
async function moderateMessage(content) {
const result = await vettly.check({
content,
contentType: 'text'
})
if (result.action === 'block') {
console.log('Blocked:', result.categories)
return false
}
return true
}
// Usage
const isAllowed = await moderateMessage('Hello world!')ES Modules
js
import { ModerationClient } from '@nextauralabs/vettly-sdk'
const vettly = new ModerationClient({
apiKey: process.env.VETTLY_API_KEY
})
const result = await vettly.check({
content: 'Check this message',
contentType: 'text'
})TypeScript
ts
import { ModerationClient, ModerationResult } from '@nextauralabs/vettly-sdk'
const vettly = new ModerationClient({
apiKey: process.env.VETTLY_API_KEY!
})
async function moderate(content: string): Promise<ModerationResult> {
return vettly.check({
content,
contentType: 'text'
})
}HTTP Server Example
js
const http = require('http')
const { ModerationClient } = require('@nextauralabs/vettly-sdk')
const vettly = new ModerationClient({
apiKey: process.env.VETTLY_API_KEY
})
const server = http.createServer(async (req, res) => {
if (req.method === 'POST' && req.url === '/api/comments') {
let body = ''
req.on('data', chunk => body += chunk)
req.on('end', async () => {
const { content } = JSON.parse(body)
const result = await vettly.check({
content,
contentType: 'text'
})
if (result.action === 'block') {
res.writeHead(403, { 'Content-Type': 'application/json' })
res.end(JSON.stringify({ error: 'Content blocked' }))
return
}
res.writeHead(200, { 'Content-Type': 'application/json' })
res.end(JSON.stringify({ success: true }))
})
}
})
server.listen(3000)Image Moderation
js
const fs = require('fs')
const { ModerationClient } = require('@nextauralabs/vettly-sdk')
const vettly = new ModerationClient({
apiKey: process.env.VETTLY_API_KEY
})
async function moderateImage(filePath) {
const imageBuffer = fs.readFileSync(filePath)
const base64 = imageBuffer.toString('base64')
const result = await vettly.check({
content: base64,
contentType: 'image'
})
return result
}
// Usage
const result = await moderateImage('./uploads/image.jpg')
if (result.action === 'block') {
console.log('Image blocked')
}Video Moderation
js
const fs = require('fs')
const { ModerationClient } = require('@nextauralabs/vettly-sdk')
const vettly = new ModerationClient({
apiKey: process.env.VETTLY_API_KEY
})
async function moderateVideo(filePath) {
const videoBuffer = fs.readFileSync(filePath)
const base64 = videoBuffer.toString('base64')
const result = await vettly.check({
content: base64,
contentType: 'video'
})
return result
}Batch Processing
js
async function moderateBatch(messages) {
const results = await Promise.all(
messages.map(content =>
vettly.check({ content, contentType: 'text' })
)
)
return results.map((result, i) => ({
content: messages[i],
action: result.action,
blocked: result.action === 'block'
}))
}
// Usage
const messages = ['message 1', 'message 2', 'message 3']
const results = await moderateBatch(messages)
console.log(results)Custom Policies
js
const result = await vettly.check({
content: 'Message to check',
contentType: 'text',
policyId: 'strict' // Your custom policy
})Error Handling
js
const { ModerationClient, VettlyError } = require('@nextauralabs/vettly-sdk')
try {
const result = await vettly.check({
content: 'Hello',
contentType: 'text'
})
} catch (error) {
if (error instanceof VettlyError) {
console.error('Vettly error:', error.message)
// Handle gracefully
} else {
throw error
}
}Response Structure
js
const result = await vettly.check({
content: 'Hello world',
contentType: 'text'
})
console.log(result.action) // 'allow' | 'block' | 'flag' | 'warn'
console.log(result.decisionId) // 'dec_abc123...'
console.log(result.categories) // Array of category scores
// Categories structure
result.categories.forEach(cat => {
console.log(cat.category) // 'hate', 'harassment', etc.
console.log(cat.score) // 0.0 to 1.0
console.log(cat.triggered) // true/false
})CLI Tool
For testing and batch processing:
bash
# Check a single message
npx vettly check "Hello world"
# Check from file
npx vettly check --file messages.txt
# With custom policy
npx vettly check "Message" --policy strictEnvironment Variables
bash
export VETTLY_API_KEY=vettly_your_api_key_hereNext Steps
- Express Integration - Express middleware
- Custom Policies - Define moderation rules
- Webhooks - Async notifications