The SAMO-DL API provides enterprise-grade emotion detection capabilities with >90% F1 score and sub-50ms latency. This document provides comprehensive information about all available endpoints, request/response formats, error handling, and usage examples.
https://samo-emotion-api-xxxxx-ew.a.run.app
Currently, the API uses IP-based rate limiting. For enterprise customers, API key authentication is available.
- Default: 1000 requests per minute per IP
- Burst: 100 requests per second
- Headers: Rate limit information is included in response headers
Endpoint: GET /health
Description: Check the health status of the API and model
Request:
curl -X GET https://samo-emotion-api-xxxxx-ew.a.run.app/healthResponse:
{
"status": "healthy",
"model_loaded": true,
"uptime": "99.9%",
"version": "2.0.0",
"endpoints": ["/predict", "/health", "/metrics"],
"timestamp": "2025-08-06T10:30:00Z"
}Status Codes:
200: Service is healthy503: Service is unhealthy or model not loaded
Endpoint: POST /predict
Description: Analyze text and return detected emotions with confidence scores
Request Headers:
Content-Type: application/json
Request Body:
{
"text": "I am feeling really happy today!"
}Request Parameters:
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
text |
string | Yes | Text to analyze for emotions | "I'm excited about this project!" |
Response:
[
{
"emotion": "joy",
"confidence": 0.89
},
{
"emotion": "excitement",
"confidence": 0.76
},
{
"emotion": "optimism",
"confidence": 0.65
}
]Response Format:
| Field | Type | Description |
|---|---|---|
emotion |
string | Detected emotion name |
confidence |
float | Confidence score (0.0 to 1.0) |
Supported Emotions:
EMOTIONS = [
'admiration', 'amusement', 'anger', 'annoyance', 'approval', 'caring',
'confusion', 'curiosity', 'desire', 'disappointment', 'disapproval',
'disgust', 'embarrassment', 'excitement', 'fear', 'gratitude', 'grief',
'joy', 'love', 'nervousness', 'optimism', 'pride', 'realization',
'relief', 'remorse', 'sadness', 'surprise', 'neutral'
]Example Usage:
curl -X POST https://samo-emotion-api-xxxxx-ew.a.run.app/predict \
-H "Content-Type: application/json" \
-d '{"text": "I am feeling really happy today!"}'Endpoint: GET /metrics
Description: Get Prometheus-formatted metrics for monitoring
Request:
curl -X GET https://samo-emotion-api-xxxxx-ew.a.run.app/metricsResponse:
# HELP samo_emotion_requests_total Total number of emotion detection requests
# TYPE samo_emotion_requests_total counter
samo_emotion_requests_total 1234
# HELP samo_emotion_request_duration_seconds Duration of emotion detection requests
# TYPE samo_emotion_request_duration_seconds histogram
samo_emotion_request_duration_seconds_bucket{le="0.01"} 100
samo_emotion_request_duration_seconds_bucket{le="0.05"} 500
samo_emotion_request_duration_seconds_bucket{le="0.1"} 1000
samo_emotion_request_duration_seconds_bucket{le="+Inf"} 1234
# HELP samo_emotion_model_loaded Model loaded status
# TYPE samo_emotion_model_loaded gauge
samo_emotion_model_loaded 1
All error responses follow this format:
{
"error": "Error message description",
"code": "ERROR_CODE",
"details": {
"field": "Additional error details"
},
"timestamp": "2025-08-06T10:30:00Z"
}| Status Code | Description | Common Causes |
|---|---|---|
200 |
Success | Request processed successfully |
400 |
Bad Request | Invalid input format or missing required fields |
413 |
Payload Too Large | Text exceeds maximum length (1000 characters) |
429 |
Too Many Requests | Rate limit exceeded |
500 |
Internal Server Error | Server-side error or model loading issue |
503 |
Service Unavailable | Service temporarily unavailable |
| Error Code | Description | HTTP Status |
|---|---|---|
INVALID_INPUT |
Invalid or missing input text | 400 |
TEXT_TOO_LONG |
Text exceeds maximum length | 413 |
RATE_LIMIT_EXCEEDED |
Rate limit exceeded | 429 |
MODEL_NOT_LOADED |
Emotion detection model not available | 503 |
INTERNAL_ERROR |
Internal server error | 500 |
Invalid Input:
{
"error": "Text field is required and cannot be empty",
"code": "INVALID_INPUT",
"details": {
"field": "text"
},
"timestamp": "2025-08-06T10:30:00Z"
}Rate Limit Exceeded:
{
"error": "Rate limit exceeded. Please try again later.",
"code": "RATE_LIMIT_EXCEEDED",
"details": {
"limit": 1000,
"window": "1 minute",
"retry_after": 30
},
"timestamp": "2025-08-06T10:30:00Z"
}Text Too Long:
{
"error": "Text exceeds maximum length of 1000 characters",
"code": "TEXT_TOO_LONG",
"details": {
"max_length": 1000,
"actual_length": 1500
},
"timestamp": "2025-08-06T10:30:00Z"
}| Header | Description | Example |
|---|---|---|
Content-Type |
Response content type | application/json |
X-Request-ID |
Unique request identifier | req_1234567890 |
X-Response-Time |
Request processing time | 45ms |
| Header | Description | Example |
|---|---|---|
X-RateLimit-Limit |
Rate limit per window | 1000 |
X-RateLimit-Remaining |
Remaining requests in window | 999 |
X-RateLimit-Reset |
Time when rate limit resets | 1640995200 |
Retry-After |
Seconds to wait before retrying | 30 |
import requests
import json
def detect_emotion(text: str) -> dict:
"""Detect emotions in text using SAMO-DL API"""
url = "https://samo-emotion-api-xxxxx-ew.a.run.app/predict"
headers = {"Content-Type": "application/json"}
data = {"text": text}
try:
response = requests.post(url, json=data, headers=headers, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"API Error: {e}")
return {"error": "Failed to analyze emotions"}
# Example usage
emotions = detect_emotion("I'm feeling excited about this project!")
print(json.dumps(emotions, indent=2))async function detectEmotion(text) {
const url = 'https://samo-emotion-api-xxxxx-ew.a.run.app/predict';
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ text })
};
try {
const response = await fetch(url, options);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('API Error:', error);
return { error: 'Failed to analyze emotions' };
}
}
// Example usage
const emotions = await detectEmotion("I'm feeling excited about this project!");
console.log(emotions);# Basic emotion detection
curl -X POST https://samo-emotion-api-xxxxx-ew.a.run.app/predict \
-H "Content-Type: application/json" \
-d '{"text": "I am feeling really happy today!"}'
# Health check
curl -X GET https://samo-emotion-api-xxxxx-ew.a.run.app/health
# Get metrics
curl -X GET https://samo-emotion-api-xxxxx-ew.a.run.app/metricsconst axios = require('axios');
async function detectEmotion(text) {
try {
const response = await axios.post(
'https://samo-emotion-api-xxxxx-ew.a.run.app/predict',
{ text },
{
headers: { 'Content-Type': 'application/json' },
timeout: 10000
}
);
return response.data;
} catch (error) {
console.error('API Error:', error.message);
return { error: 'Failed to analyze emotions' };
}
}
// Example usage
const emotions = await detectEmotion("I'm feeling excited about this project!");
console.log(emotions);- Average Response Time: <50ms
- 95th Percentile: <100ms
- 99th Percentile: <200ms
- Maximum Requests/Second: 100 (burst)
- Sustained Requests/Minute: 1000
- Concurrent Connections: 1000+
- F1 Score: >90%
- Accuracy: >92%
- Precision: >89%
- Recall: >91%
- Text Length: Keep text under 1000 characters for optimal performance
- Content: Avoid HTML tags, scripts, or malicious content
- Language: Currently optimized for English text
- Encoding: Use UTF-8 encoding
- Always check HTTP status codes
- Implement retry logic with exponential backoff
- Handle rate limiting gracefully
- Log errors for debugging
- Use connection pooling for high-volume requests
- Implement caching for repeated text analysis
- Batch requests when possible
- Monitor response times and error rates
- Validate all input text
- Sanitize user input before sending to API
- Use HTTPS for all requests
- Implement proper error handling to avoid information leakage
Monitor the /health endpoint to ensure service availability:
# Check service health
curl -f https://samo-emotion-api-xxxxx-ew.a.run.app/health || echo "Service unhealthy"Use the /metrics endpoint for Prometheus monitoring:
# prometheus.yml
scrape_configs:
- job_name: 'samo-emotion-api'
static_configs:
- targets: ['samo-emotion-api-xxxxx-ew.a.run.app']
metrics_path: '/metrics'
scrape_interval: 30s- Request Rate:
samo_emotion_requests_total - Response Time:
samo_emotion_request_duration_seconds - Error Rate:
samo_emotion_errors_total - Model Status:
samo_emotion_model_loaded
- Integration Guide: docs/guides/INTEGRATION_GUIDE.md
- Deployment Guide: docs/DEPLOYMENT_GUIDE.md
- Architecture Overview: docs/ARCHITECTURE.md
- Python Examples: examples/python_integration.py
- JavaScript Examples: examples/javascript_integration.js
- React Component: examples/ReactEmotionDetector.jsx
- API Test Suite: scripts/testing/
- Performance Benchmarks: scripts/testing/benchmarks.py
- GitHub Issues: https://github.com/uelkerd/SAMO--DL/issues
- Documentation: https://uelkerd.github.io/SAMO--DL/
- Performance: 2.3x speedup with ONNX optimization
- Accuracy: >90% F1 score
- Features: Enhanced error handling and monitoring
- Security: Improved input validation and rate limiting
- Initial Release: Basic emotion detection API
- Features: Core emotion detection functionality
- Performance: Baseline PyTorch implementation
This API is part of the SAMO-DL project. See the main project repository for licensing information.