Rate, tag, and screen fashion photography with a single API call. Trained on 148K+ images. Runs on serverless GPU.
Capabilities
0-100 score with Low / Medium / High classification. CLIP ViT-B/16 fine-tuned on 148K rated images.
Granular 0-10 scores across Face, Appearance, and Photography dimensions. Each dimension calibrated on real data.
7 AI-detected tags per image via Google SigLIP zero-shot classification. Portrait, fashion, editorial and more.
Safe / Revealing / Suggestive / NSFW classification with dedicated NSFW safety classifier cross-check and portfolio-safe flag.
Minimal-rejection mode with learned MLP. Borderline images get a needs_review flag instead of hard rejection.
Resolution check, P99 sharpness detection, and MediaPipe face detection. Flags low-quality or faceless images for review.
JPEG, PNG, WebP, GIF, HEIC/HEIF. Up to 25 MB. Server-side HEIC conversion included.
Google MediaPipe multi-scale detection returns face count, confidence, and area ratio for robust person verification.
Submit feedback to improve AI accuracy. Hardened retraining with golden-set validation and automatic rollback.
API Reference
/api/v1/token
Authenticate and get a bearer token
curl -X POST https://ai-image-rating.digitaltwin.technology/api/v1/token \
-H "Content-Type: application/json" \
-d '{"client_id": "agency_...", "client_secret": "sk_..."}'/api/v1/rate
Rate an uploaded image
Multipart file upload. Returns score, tags, content rating, quality, and portfolio gate decision.
curl -X POST https://ai-image-rating.digitaltwin.technology/api/v1/rate \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "file=@photo.jpg"/api/v1/rate-url
Rate an image from URL
curl -X POST https://ai-image-rating.digitaltwin.technology/api/v1/rate-url \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/photo.jpg"}'/api/v1/usage
Check your remaining quota
curl https://ai-image-rating.digitaltwin.technology/api/v1/usage \
-H "Authorization: Bearer YOUR_TOKEN"
# {"used": 42, "limit": 1000, "remaining": 958}/api/v1/feedback
Submit your rating to improve the AI
curl -X POST https://ai-image-rating.digitaltwin.technology/api/v1/feedback \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"image_hash": "a1b2c3...", "user_score": 3, "dimension_feedback": {"lighting": 9.0}}'
Interactive docs available at
/api/v1/docs (Swagger) and
/api/v1/redoc on the API server.
Response Format
{
"rating": "High",
"score": 78.5,
"tags": [
{"tag": "portrait", "confidence": 0.92},
{"tag": "fashion", "confidence": 0.87},
{"tag": "studio", "confidence": 0.65}
],
"content_rating": {
"level": "safe",
"detail": "Professional fashion photography",
"safe_for_portfolio": true,
"content_rating_conflict": false
},
"quality": {
"width": 3000,
"height": 4000,
"sharpness": 850.2,
"issues": [],
"is_acceptable": true
},
"rejected": false,
"is_original": true,
"portfolio_prob": 0.94,
"image_hash": "a1b2c3d4e5f6...",
"needs_review": false,
"review_reason": null,
"face_count": 1,
"face_confidence": 0.95,
"dimension_scores": {
"facial_brightness": 7.4,
"facial_clarity": 8.1,
"facial_skin_tone": 7.9,
"facial_structure": 7.6,
"facial_contour": 7.2,
"facial_aesthetic": 8.0,
"skin_quality": 8.2,
"hair_styling": 6.9,
"body_proportion": 7.1,
"clothing_fit": 8.5,
"overall_look": 7.7,
"color_harmony": 7.6,
"composition": 8.0,
"lighting": 8.4,
"background": 7.2,
"expression_mood": 6.5,
"overall_cohesion": 7.8,
"professional_quality": 8.1
}
}Quick Start
import requests
BASE = "https://ai-image-rating.digitaltwin.technology/api/v1"
# 1. Get token
token_resp = requests.post(f"{BASE}/token", json={
"client_id": "agency_abc123def456",
"client_secret": "sk_your_secret_here",
})
token = token_resp.json()["access_token"]
headers = {"Authorization": f"Bearer {token}"}
# 2. Rate an image
with open("photo.jpg", "rb") as f:
resp = requests.post(f"{BASE}/rate", headers=headers, files={"file": f})
result = resp.json()
print(f"Score: {result['score']}, Rating: {result['rating']}")
print(f"Tags: {[t['tag'] for t in result['tags']]}")
print(f"Portfolio suitable: {not result['rejected']}")const BASE = "https://ai-image-rating.digitaltwin.technology/api/v1";
// 1. Get token
const tokenResp = await fetch(`${BASE}/token`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: "agency_abc123def456",
client_secret: "sk_your_secret_here",
}),
});
const { access_token } = await tokenResp.json();
// 2. Rate an image from URL
const resp = await fetch(`${BASE}/rate-url`, {
method: "POST",
headers: {
Authorization: `Bearer ${access_token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com/photo.jpg" }),
});
const result = await resp.json();
console.log(`Score: ${result.score}, Rating: ${result.rating}`);# 1. Get token
TOKEN=$(curl -s -X POST https://ai-image-rating.digitaltwin.technology/api/v1/token \
-H "Content-Type: application/json" \
-d '{"client_id": "agency_...", "client_secret": "sk_..."}' \
| python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
# 2. Rate an image file
curl -X POST https://ai-image-rating.digitaltwin.technology/api/v1/rate \
-H "Authorization: Bearer $TOKEN" \
-F "file=@photo.jpg"
# 3. Rate from URL
curl -X POST https://ai-image-rating.digitaltwin.technology/api/v1/rate-url \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/photo.jpg"}'
# 4. Check usage
curl https://ai-image-rating.digitaltwin.technology/api/v1/usage \
-H "Authorization: Bearer $TOKEN"Pricing
Get Started
We review every application. You'll receive credentials once approved.
Already applied?