{"openapi":"3.1.0","info":{"title":"SavedThat API","version":"1.0.0","description":"Save social videos (YouTube, Instagram Reels, TikTok) and search across their transcripts by meaning. All endpoints require a Supabase-issued Bearer JWT. Human-readable overview: https://savedthat.app/llms.txt","contact":{"name":"SavedThat","url":"https://savedthat.app"}},"servers":[{"url":"https://savedthat.app"}],"security":[{"bearerAuth":[]}],"paths":{"/api/search":{"post":{"operationId":"searchTranscripts","summary":"Hybrid semantic + full-text search across the user's saved video transcripts.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"Natural-language query."},"limit":{"type":"integer","default":20,"minimum":1,"maximum":50},"platform":{"type":"string","enum":["youtube","instagram","tiktok"]},"min_similarity":{"type":"number","minimum":0,"maximum":1}}}}}},"responses":{"200":{"description":"Ranked hits, each with the video, matching chunk text, timestamp, and a deep link."},"401":{"description":"Missing or invalid Bearer token."},"429":{"description":"Rate limit exceeded (30/min)."}}}},"/api/videos":{"get":{"operationId":"listVideos","summary":"List the authenticated user's saved videos.","responses":{"200":{"description":"Array of saved videos."},"401":{"description":"Unauthorized."}}},"post":{"operationId":"saveVideo","summary":"Save a video by URL; it is transcribed and indexed asynchronously.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"YouTube / Instagram Reels / TikTok URL."}}}}}},"responses":{"202":{"description":"Accepted; processing started (instant if the video was already transcribed by another user)."},"401":{"description":"Unauthorized."},"429":{"description":"Rate limit exceeded (10/min)."}}}},"/api/videos/{id}/transcript":{"get":{"operationId":"getTranscript","summary":"Fetch the transcript and timestamped chunks for a saved video.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Transcript text + timestamped chunks."},"401":{"description":"Unauthorized."},"404":{"description":"Not found."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Supabase-issued access token. Discover the authorization server via /.well-known/oauth-protected-resource (issuer: https://igsmkyifxygxogpeagjp.supabase.co/auth/v1)."}}}}