# Argus AI-powered media catalog. Upload images, get AI analysis (tags, descriptions, colors, mood, use-cases), search semantically. Website: https://argus.build MCP: npx argus-media-mcp ## Authentication All API endpoints require: Authorization: Bearer How to get a key: 1. Go to https://argus.build/ui 2. Sign in with magic link (email-based, no password) 3. Open Settings 4. Create API Key Session auth (cookie-based) is used by the web UI. API keys are for agents and scripts. ## REST API (https://argus.build) Assets (Bearer API key): POST /assets/upload Upload image (multipart/form-data, field: file, max 20 MB) POST /assets/upload-from-url Upload from URL (body: { url, filename?, project?, tags?, uploadedBy? }) POST /assets/:id/analyze Trigger AI analysis on existing asset (costs 1 credit) GET /assets List/search assets (query: q, project, status, tags, limit, offset; status=deleted to list soft-deleted) GET /assets/:id Get single asset with full analysis PATCH /assets/:id Update tags, project, or uploadedBy (body: { tags?, project?, uploadedBy? }) DELETE /assets/:id Soft-delete asset (recoverable for 30 days, then permanently purged) POST /assets/:id/recover Recover a soft-deleted asset (within 30-day window) Auth (public): POST /auth/magic Request magic link (body: { email }) GET /auth/magic/verify Verify magic link token (query: token) POST /auth/magic/verify Verify magic code (body: { email, code }) POST /auth/logout Clear session GET /auth/me Current user info and workspace list Invite claim (public, agent-native — no browser/cookies needed): POST /invite/:token/claim Start invite claim (body: { email }) → sends verification code POST /invite/:token/claim/verify Verify code and join workspace (body: { email, code }) → returns { apiKey, workspaceId, workspaceName, role } Workspaces (session cookie): POST /workspaces Create workspace GET /workspaces List workspaces PUT /workspaces/:id/switch Switch active workspace GET /workspaces/:id/members List members POST /workspaces/:id/invites Create invite link (admin only) DELETE /workspaces/:id/members/:userId Remove member (admin only) API Keys (session cookie): GET /keys List active keys POST /keys Create new key DELETE /keys/:id Revoke key Billing: POST /checkout/session Create Stripe checkout for tier upgrade (body: { tier }) POST /checkout/credits Buy credit pack (body: { pack: "100"|"500"|"2500" }) GET /usage Credits and asset usage for current workspace ## Workflow Example Upload an image, wait for analysis, then search for it: # Upload curl -X POST https://argus.build/assets/upload \ -H "Authorization: Bearer ak_yourkey" \ -F "file=@product-photo.jpg" \ -F "project=spring-campaign" \ -F "tags=product,lifestyle" # Check status (analysis runs automatically on upload) curl https://argus.build/assets/abc123 \ -H "Authorization: Bearer ak_yourkey" # status: "pending" → "ready" once analysis completes # Search curl "https://argus.build/assets?q=lifestyle+product" \ -H "Authorization: Bearer ak_yourkey" # Upload from URL (no file download needed) curl -X POST https://argus.build/assets/upload-from-url \ -H "Authorization: Bearer ak_yourkey" \ -H "Content-Type: application/json" \ -d '{"url":"https://example.com/photo.jpg","project":"imports"}' ## MCP Tools Install the Argus MCP server to give your agent direct access: npx argus-media-mcp Configure in Claude Desktop or claude_desktop_config.json: { "mcpServers": { "argus": { "command": "npx", "args": ["argus-media-mcp"], "env": { "ARGUS_API_KEY": "" } } } } Available tools: search_assets Search media by keyword matching across AI-generated fields (description, mood, tags, use-cases) Params: query?, project?, status?, tags?, limit?, offset? get_asset Get full asset details including AI analysis Params: asset_id (required) upload_from_url Upload and auto-analyze an image from URL Params: url (required), filename?, project?, tags?, uploaded_by? argus_upload Upload a local file by path with automatic AI analysis Params: file_path (required), project?, tags?, uploaded_by? analyze_asset Trigger AI analysis on an existing asset Params: asset_id (required) delete_asset Soft-delete asset (hidden from listings, recoverable within 30 days) Params: asset_id (required) recover_asset Recover a soft-deleted asset back to the active library (within 30-day window) Params: asset_id (required) get_usage Check workspace credits, asset count, and tier limits Params: (none) create_api_key Create a new API key for the workspace (returned once — store securely) Params: name (required) ## Asset Response Shape { "id": "uuid", "filename": "photo.jpg", "mimeType": "image/jpeg", "url": "https://...", "status": "ready", "tags": ["outdoor", "nature"], "analysis": { "description": "A field of wildflowers at golden hour", "richDescription": "Detailed paragraph with mood, composition, suggested uses...", "mood": "serene", "dominantColors": [{ "hex": "#f5c842", "name": "golden yellow" }], "useCases": ["hero image", "seasonal campaign"], "tags": ["wildflowers", "golden hour", "landscape"] } } Field notes: - tags: Merged array of user-supplied + AI-generated tags (deduplicated) - analysis.tags: AI-generated tags only ## Delete Response Shape DELETE /assets/:id now performs a soft delete. Response: { "id": "uuid", "status": "deleted", "deletedAt": "2026-03-30T00:00:00.000Z", "recoversAt": "2026-04-29T00:00:00.000Z" } The asset is hidden from default listings but can be recovered within 30 days via POST /assets/:id/recover. After 30 days, a scheduled purge permanently removes the asset and its file from storage. To list soft-deleted assets, pass status=deleted on GET /assets. ## Error Responses All errors return: { "error": "Description of what went wrong" } Status codes: 400 (bad request), 401 (unauthorized), 404 (not found), 429 (tier limit), 500 (server error) ## Rate Limits Tier-based limits only (asset count + credits/month per plan). No per-IP rate limiting. When tier limits are hit: 429 with { "error": "...", "upgrade": true } Check GET /usage for current consumption. Credits reset monthly; one-time packs don't expire. ## Supported Formats Analyzed (AI vision): JPEG, PNG, GIF, WebP, SVG Other file types: Uploaded and stored, but NOT analyzed (status set to "ready" immediately, no analysis data) Max upload size: 20 MB Storage backend: Cloudflare R2 ## Processing Time Analysis is async. After upload, status is "pending". Typical time: 5–15 seconds How to check: Poll GET /assets/:id every 2–3 seconds until status is "ready" or "error" Webhooks: Not available — polling only ## Search Semantics The q parameter on GET /assets does keyword matching across AI-generated fields (description, richDescription, mood, tags, useCases, filename). It is NOT vector/embedding search. Results are ranked by term match count. It feels semantic because the searched fields are AI-generated — a sunset photo matches "warm golden hour" if the AI used those words. ## Pricing Free: 50 assets, 50 credits/month, $0 Starter: Unlimited assets, 500 credits/month, $19/mo Pro: Unlimited assets, 5000 credits/month, $79/mo Enterprise: Unlimited everything, custom pricing 1 credit = 1 AI image analysis Credit packs (one-time): 100/$2, 500/$8, 2500/$30 ## When NOT to Use Argus - Video files: not supported, no analysis - Real-time processing: analysis is async, not instant - Non-image documents: PDFs and docs are stored but not analyzed - Self-hosted storage: Argus uses Cloudflare R2 only, no BYO-bucket - Bulk migration: no batch import API yet — upload one at a time or use MCP