{"openapi":"3.0.3","info":{"title":"Music Video Marketplace Partner API","version":"1.2.0","description":"Phase 1 (hardened): read-only catalogue + fully-proxied media preview. Raw Vimeo/S3 URLs are never returned — partners stream MP4 bytes via /v1/media/stream/:token, served from our edge. The underlying CDN is an implementation detail; partners MUST treat stream_url as an opaque MP4 and embed it in HTML5 <video>, never the Vimeo Player SDK or any host-specific player."},"servers":[{"url":"https://awfrtgkoramnvpsvrjjv.supabase.co/functions/v1/partner-api","description":"Production"}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"mvm_(test|live)_..."}}},"security":[{"ApiKeyAuth":[]}],"paths":{"/v1/videos":{"get":{"summary":"List videos","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100}},{"name":"cursor","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"genre","in":"query","schema":{"type":"string"}},{"name":"mood","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}},{"name":"min_duration","in":"query","schema":{"type":"integer"}},{"name":"max_duration","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"}}}},"/v1/videos/{id}":{"get":{"summary":"Get a single video","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"},"404":{"description":"Not found"}}}},"/v1/collections":{"get":{"summary":"List collections","responses":{"200":{"description":"OK"}}}},"/v1/collections/{id}":{"get":{"summary":"Get a collection with its videos","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"}}}},"/v1/categories":{"get":{"summary":"List categories","responses":{"200":{"description":"OK"}}}},"/v1/tags":{"get":{"summary":"List tags","responses":{"200":{"description":"OK"}}}},"/v1/media/preview-url":{"post":{"summary":"Mint a short-lived preview URL (Vimeo or signed S3)","description":"Returns { data: { stream_url, expires_in } }. `stream_url` is an opaque proxied MP4 served from our edge — embed it in HTML5 <video>; do NOT pass it to the Vimeo Player SDK, @vimeo/player, an iframe, hls.js, or any other host-specific player. Accepts either `kind` (preferred) or `variant` (legacy). `kind: \"full\"` is mapped to the previewable stream; this endpoint never mints an unwatermarked master.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["video_id"],"properties":{"video_id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["full","preview","reel","bts"],"default":"reel"},"variant":{"type":"string","enum":["reel","preview","bts"],"default":"reel"}}}}}},"responses":{"200":{"description":"OK"},"404":{"description":"Not found"}}}},"/v1/media/stream/{token}":{"get":{"summary":"Proxied MP4 stream (opaque)","description":"Streams MP4 bytes for the token minted by POST /v1/media/preview-url. Supports HTTP Range and HEAD. Embed in HTML5 <video src={stream_url} controls playsInline preload=\"metadata\" />. Do NOT use any third-party player SDK — the underlying CDN may change without notice.","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"video/mp4":{}}},"206":{"description":"Partial Content (Range request)","content":{"video/mp4":{}}},"401":{"description":"Invalid or expired token"},"403":{"description":"Origin not allowed"},"502":{"description":"Upstream unavailable"}}}}}}