API Documentation

Complete reference for the TupicAnalytics REST API. Upload media, get AI-powered intelligence back.

Base URL: https://tupicanalytics.com

🔐 Authentication

All endpoints require a Bearer token. Get a JWT via /auth/signin or create a Personal Access Token via /tokens.

Header: Authorization: Bearer YOUR_TOKEN

Auth
POST/auth/signupRegister new account
Request Body
{
  "username": "john",
  "email": "john@example.com",
  "password": "securepass123"
}
Response 201
{
  "access_token": "eyJ...",
  "user": { "id": 1, "username": "john" }
}
POST/auth/signinLogin & get JWT (supports 2FA)
Request Body
{
  "username": "john",
  "password": "securepass123"
}
Response 200
{ "access_token": "eyJ..." }
GET/auth/meCurrent user infoAuth
Response 200
{ "user": { "id": 1, "username": "john", "email": "john@example.com" } }
POST/auth/googleGoogle Sign-In

Verify Google ID token and login/register user. Auto-creates account if new.

Request Body
{ "credential": "Google ID token from GSI" }
Response 200
{ "access_token": "eyJ...", "user": {...} }
POST/auth/link-googleLink Google to accountAuth
Request Body
{ "credential": "Google ID token" }
Response 200
{ "user": {...}, "message": "Google account linked" }
Personal Access Tokens
POST/tokensCreate PATAuth
Request Body
{ "name": "my-bot-token" }
Response 201
{
  "id": 5,
  "access_token": "eyJ...",
  "name": "my-bot-token"
}

⚠ Token shown once. Store securely.

GET/tokensList tokensAuth
Response 200
{ "tokens": [{ "id":5, "name":"my-bot-token" }] }
DEL/tokens/{id}Revoke tokenAuth
Response 200
{ "message": "Token deleted" }
Upload & Media
POST/uploadUpload & analyze mediaAuthFile

Main endpoint. Uploads file, generates embedding, NSFW scan, duplicate check, hashtags, thumbnail, and blockchain registration.

Request (multipart/form-data)
ParamTypeDescription
file*fileImage, video, audio, or text
Formats
image: jpg, png, gif, svg, webp | video: mp4, mov, avi, mkv, webm | audio: mp3, wav | text: txt
Response 200
{
  "media": {
    "id": 42, "filename": "photo.jpg",
    "nudity": { "sexy":2.1, "porn":0.3 },
    "rga_category": "G",
    "hashtags": ["person","car"],
    "fingerprint": "a7f3c9..."
  }
}
GET/mediaList uploaded mediaAuth
Query Params
ParamTypeDescription
media_typestringFilter: image, video, audio, text
DEL/media/{id}Delete mediaAuth
Response 200
{ "message": "Content deleted successfully" }
Search & Similarity
GET/search?query={q}Text/hashtag searchAuth
Response 200
{ "query":"car", "count":3, "results": [...] }
POST/search/imageVisual similarityAuthFile

Upload query image, returns top-10 similar by cosine similarity.

Response 200
{ "results": [{ "id":15, "similarity":87.3 }] }
GET/analyze/recommend/{id}RecommendationsAuth
Response 200
[{ "id":15, "cosine_similarity":82.5, "total_score":0.925 }]
Video Analysis
POST/analyze/video/{id}Scene-by-scene contentAuth

Extracts frames at 1fps, YOLO + NSFW per frame. Returns scenes with hashtags and RGA.

Response 200
[{ "scene_id":25, "frame_time":1.0, "hashtags":["person"], "rga":"G" }]
POST/analyze/ad/{id}Ad placement analysisAuth

Saliency maps, emotion, motion scoring, dominant colors, empty space. Best ad slot marked.

Response 200
[{ "scene_id":3, "saliency_score":0.45, "emotion":"happy", "score":0.78, "is_best":true }]
POST/analyze/apply_cutCut video segmentsAuth
Request Body
{ "filename":"video.mp4", "intervals":[[5.0,12.0]] }
Subtitles
POST/subtitle/generate/{id}Generate subtitles (Whisper)Auth

Extract audio → noise reduction → Whisper → SRT + optional translation.

Request Body
{ "target_language": "en" }
Response 200
{ "srt_file":"https://...", "job_id":"uuid", "detected_language":"fa" }
GET/subtitle/status?job_id={id}Job progress
Response 200
{ "progress":70, "log":"Processing chunk 2/3..." }
File Access
GET/storage/{path}Uploaded files

Serves uploaded files, thumbnails, videos.

GET/storage/t/{path}Temp files (SRT, frames)

Serves analysis outputs: frames, SRT, pitch images, audio chunks.