Complete documentation for integrating AI-powered content moderation into your application. 60+ models across image, video, audio, and text.
Get your API keys
Make your first request
Varies by plan tier
60+ AI models
All API requests require authentication using an API key. Include your API key in the Authorization header.
Authorization: Bearer private_xxxxxxxxxxxxx
Get your API keys from the Dashboard after signing up.
Make your first moderation request in seconds. The synchronous endpoint runs the model in-request and returns the result directly — great for trying things out. For production workloads we recommend the Async API.
curl -X POST https://api.bynn.com/v1/moderation/infer \
-H "Authorization: Bearer private_xxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "nudity-detection",
"image_url": "https://example.com/image.jpg"
}'{
"inference_id": "inf_jWMNLabLwSRy5qEp8DLKdVZd",
"model_id": "nudity_detection",
"model_name": "Nudity & Adult Content",
"moderation_type": "image",
"status": "completed",
"processing_mode": "sync",
"result": {
"is_safe": true,
"confidence": 0.97
},
"response_time_ms": 143,
"billable_quantity": 1,
"cost": "$0.00750"
}We recommend the asynchronous endpoint for all production integrations. It accepts the exact same parameters as the synchronous endpoint, but queues the work and responds immediately with 202 Accepted — so it supports much higher submission rates and is the only sensible path for heavy media (video, audio, PDF OCR) and sustained volume. Poll the status endpoint to fetch the result.
curl -X POST https://api.bynn.com/v1/moderation/infer_async \
-H "Authorization: Bearer private_xxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "face-redaction",
"image_url": "https://example.com/image.jpg"
}'HTTP/1.1 202 Accepted
{
"inference_id": "inf_kbD92ZNAYS2sWAHC8ti6St3z",
"model_id": "face_redaction",
"status": "pending",
"processing_mode": "async",
"billable_quantity": 1,
"cost": "$0.03000"
}curl https://api.bynn.com/v1/moderation/inference/inf_kbD92ZNAYS2sWAHC8ti6St3z \ -H "Authorization: Bearer private_xxxxxxxxxxxxx"
{
"inference_id": "inf_kbD92ZNAYS2sWAHC8ti6St3z",
"status": "completed",
"processing_mode": "async",
"result": {
"faces_detected": 2,
"faces_redacted": 2,
"png_image_url": "https://...s3.eu-west-1.amazonaws.com/...&X-Amz-Expires=3600..."
},
"response_time_ms": 2391,
"cost": "$0.03000"
}Good to know
pending → processing → completed or failed.idempotency_key to safely retry submissions without duplicate charges.*_url fields — links are valid for 1 hour per fetch and downloadable for up to 24 hours after completion.429 queue_full with a Retry-After header.Rate limits vary by plan tier. The synchronous endpoint is limited tightly because it holds a connection for the whole inference; the async endpoint accepts far more submissions and is the recommended path for sustained volume.
| Plan | Sync (req/s) | Async submits (req/s) | Max queued jobs |
|---|---|---|---|
| Trial | 1 | 5 | 50 |
| Standard plans | 1 | 20 | 500 – 1,000 |
| Enterprise | 5 | 30 | 2,000 |
| Custom | Contact us | Contact us | Contact us |
429 response includes a Retry-After header with the seconds until the window resets.The API uses standard HTTP status codes and returns errors in a consistent JSON format.
400Invalid parameters or missing required fields
401Invalid or missing API key
402Account balance is too low for this inference — top up to continue
422Input could not be processed (unknown model, invalid media, file too large)
429Rate limit or queued-job cap reached — honor the Retry-After header, or switch to /moderation/infer_async for high volume
500Internal server error, try again later — failed inferences are automatically refunded