{"openapi":"3.1.0","info":{"title":"ReelsRadar API","version":"1.0.0","description":"REST surface for tracking public TikTok, Instagram Reels, YouTube Shorts and Facebook video metrics. Dashboard routes require a Supabase session cookie. Machine routes use Stripe signatures or CRON_SECRET.","contact":{"name":"ReelsRadar","url":"https://reelsradar.io","email":"support@reelsradar.io"}},"servers":[{"url":"https://reelsradar.io/api","description":"Production"}],"tags":[{"name":"track"},{"name":"videos"},{"name":"accounts"},{"name":"collections"},{"name":"overview"},{"name":"export"},{"name":"alerts"},{"name":"workspace"},{"name":"billing"},{"name":"public"},{"name":"webhooks"},{"name":"cron"}],"paths":{"/track":{"post":{"tags":["track"],"summary":"Track an account or video URL","security":[{"sessionCookie":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"},"collection_id":{"type":"string","format":"uuid","nullable":true}}}}}},"responses":{"200":{"description":"Tracking started","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"type":{"type":"string","enum":["account","video"]},"job_id":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Plan limit or no access"}}}},"/track/bulk":{"post":{"tags":["track"],"summary":"Bulk track up to 50 URLs","security":[{"sessionCookie":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["urls"],"properties":{"urls":{"type":"array","maxItems":50,"items":{"type":"string"}},"collection_id":{"type":"string","format":"uuid","nullable":true}}}}}},"responses":{"200":{"description":"Per-URL results"}}}},"/videos":{"get":{"tags":["videos"],"summary":"List tracked videos","security":[{"sessionCookie":[]}],"parameters":[{"name":"platforms","in":"query","schema":{"type":"string"}},{"name":"datePreset","in":"query","schema":{"type":"string"}},{"name":"collectionId","in":"query","schema":{"type":"string"}},{"name":"individualOnly","in":"query","schema":{"type":"string"}},{"name":"tiktokShopOnly","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer"}},{"name":"sort","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Video list","content":{"application/json":{"schema":{"type":"object","properties":{"videos":{"type":"array","items":{"type":"object"}},"total":{"type":"integer"}}}}}}}}},"/accounts":{"get":{"tags":["accounts"],"summary":"List tracked accounts","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Account list with derived metrics"}}}},"/accounts/{id}":{"patch":{"tags":["accounts"],"summary":"Update account status or tracking limit","security":[{"sessionCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["active","paused","removed"]},"tracking_limit":{"type":"integer"}}}}}},"responses":{"200":{"description":"Updated"}}},"delete":{"tags":["accounts"],"summary":"Soft-remove an account","security":[{"sessionCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Removed"}}}},"/accounts/{id}/analytics":{"get":{"tags":["accounts"],"summary":"Account analytics panel payload","security":[{"sessionCookie":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Analytics payload"}}}},"/overview":{"get":{"tags":["overview"],"summary":"Workspace overview KPIs and chart series","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Overview payload"}}}},"/collections":{"get":{"tags":["collections"],"summary":"List collections","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Collections"}}},"post":{"tags":["collections"],"summary":"Create collection","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Created"}}}},"/export":{"get":{"tags":["export"],"summary":"Download CSV export","security":[{"sessionCookie":[]}],"parameters":[{"name":"type","in":"query","schema":{"type":"string","enum":["videos","accounts"]}}],"responses":{"200":{"description":"CSV file","content":{"text/csv":{"schema":{"type":"string"}}}}}}},"/alerts":{"get":{"tags":["alerts"],"summary":"List alert rules","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Rules"}}},"post":{"tags":["alerts"],"summary":"Create or update alert rule","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Saved"}}}},"/workspace/team":{"get":{"tags":["workspace"],"summary":"List team members and seat usage","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Team"}}},"post":{"tags":["workspace"],"summary":"Invite teammate","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Invited"}}}},"/workspace/bootstrap":{"post":{"tags":["workspace"],"summary":"Return workspace + hasAccess","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Workspace"}}}},"/stripe/create-checkout":{"post":{"tags":["billing"],"summary":"Create Stripe Checkout session","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Checkout URL"}}}},"/stripe/create-portal":{"post":{"tags":["billing"],"summary":"Create Stripe Customer Portal session","security":[{"sessionCookie":[]}],"responses":{"200":{"description":"Portal URL"}}}},"/auth/signup":{"post":{"tags":["public"],"summary":"Create user account","responses":{"200":{"description":"Created"},"409":{"description":"Exists"}}}},"/lead":{"post":{"tags":["public"],"summary":"Capture email lead","responses":{"200":{"description":"Saved"}}}},"/founding/stats":{"get":{"tags":["public"],"summary":"Founding yearly spots remaining","responses":{"200":{"description":"Stats"}}}},"/webhook/stripe":{"post":{"tags":["webhooks"],"summary":"Stripe webhook receiver","security":[{"stripeSignature":[]}],"responses":{"200":{"description":"Received"}}}},"/webhooks/apify":{"post":{"tags":["webhooks"],"summary":"Apify scrape completion webhook","parameters":[{"name":"job_id","in":"query","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Processed"}}}},"/cron/refresh":{"get":{"tags":["cron"],"summary":"Refresh due tracked accounts","security":[{"cronSecret":[]}],"responses":{"200":{"description":"Queued"}}}},"/cron/alerts":{"get":{"tags":["cron"],"summary":"Send viral spike alert emails","security":[{"cronSecret":[]}],"responses":{"200":{"description":"Sent"}}}}},"components":{"securitySchemes":{"sessionCookie":{"type":"apiKey","in":"cookie","name":"sb-access-token","description":"Supabase Auth session cookie from the dashboard login."},"cronSecret":{"type":"http","scheme":"bearer","description":"CRON_SECRET environment variable"},"stripeSignature":{"type":"apiKey","in":"header","name":"stripe-signature"}}}}