<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Usama</title>
    <description>The latest articles on DEV Community by Usama (@usamalatif).</description>
    <link>https://dev.to/usamalatif</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3979389%2F3a7a2543-cbb0-4780-85bb-df1ff1a8426b.png</url>
      <title>DEV Community: Usama</title>
      <link>https://dev.to/usamalatif</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/usamalatif"/>
    <language>en</language>
    <item>
      <title>Give your AI agent eyes on short-form video: the Reelyze API + skill for Claude &amp; Cursor</title>
      <dc:creator>Usama</dc:creator>
      <pubDate>Thu, 11 Jun 2026 12:34:49 +0000</pubDate>
      <link>https://dev.to/usamalatif/give-your-ai-agent-eyes-on-short-form-video-the-reelyze-api-skill-for-claude-cursor-bjl</link>
      <guid>https://dev.to/usamalatif/give-your-ai-agent-eyes-on-short-form-video-the-reelyze-api-skill-for-claude-cursor-bjl</guid>
      <description>&lt;p&gt;Most social analytics tools hand your &lt;em&gt;dashboard&lt;/em&gt; a pile of numbers. None of them let your &lt;em&gt;AI agent&lt;/em&gt; look at a video and reason about why it underperformed. I wanted Claude and Cursor to be able to take a Reel URL and tell me what's wrong with the hook - so I exposed the engine behind &lt;a href="https://getreelyze.com" rel="noopener noreferrer"&gt;Reelyze&lt;/a&gt; as a plain HTTP API and packaged a drop-in agent skill.&lt;/p&gt;

&lt;p&gt;Here's how it works and how to wire it into your own agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the API does
&lt;/h2&gt;

&lt;p&gt;Give it a public Instagram Reel, TikTok, or YouTube Short URL, and it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Analyze&lt;/strong&gt; the video frame-by-frame - hook strength, the first-3-second retention, scene-by-scene signals, and the exact seconds viewers are predicted to drop off, with a verdict and specific fixes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transcribe&lt;/strong&gt; the spoken audio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download&lt;/strong&gt; a clean MP4, or &lt;strong&gt;extract&lt;/strong&gt; the audio as MP3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate&lt;/strong&gt; a full timed script (hooks → body → CTA, caption, hashtags, shot list) or a batch of content ideas from a topic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The transcript, download, and audio tools are &lt;strong&gt;free and metered&lt;/strong&gt; (50 calls/day per key), so you can build against them with nothing but an API key. Analyze, script, and ideas are on paid plans.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auth
&lt;/h2&gt;

&lt;p&gt;One Bearer key (&lt;code&gt;rk_live_...&lt;/code&gt;), created in the Reelyze dashboard under &lt;strong&gt;API keys&lt;/strong&gt;. Base URL is &lt;code&gt;https://api.getreelyze.com&lt;/code&gt;. CORS is open, so it works from a backend, a browser tool, or any agent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REELYZE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rk_live_xxx
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REELYZE_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.getreelyze.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The video tools are async (submit → poll)
&lt;/h2&gt;

&lt;p&gt;The analysis isn't instant - it pulls frames, OCRs on-screen text, transcribes, and scores retention - so you submit a job and poll for it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1) Submit&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REELYZE_BASE_URL&lt;/span&gt;&lt;span class="s2"&gt;/v1/analyze"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$REELYZE_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"url":"https://www.instagram.com/reel/XXXX/"}'&lt;/span&gt;
&lt;span class="c"&gt;# → {"job_id":"abc...","status":"queued","tool":"analyze","poll":"/v1/jobs/abc..."}&lt;/span&gt;

&lt;span class="c"&gt;# 2) Poll every ~3s until completed&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REELYZE_BASE_URL&lt;/span&gt;&lt;span class="s2"&gt;/v1/jobs/abc..."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$REELYZE_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="c"&gt;# → {"job_id":"abc...","status":"completed","report_markdown":"# ...full report..."}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The completed &lt;code&gt;analyze&lt;/code&gt; job returns &lt;code&gt;report_markdown&lt;/code&gt; - verdict, hook assessment, scene-by-scene retention, and the drop-off timestamps. Transcript/download/audio use the identical submit-then-poll shape; you just read &lt;code&gt;transcript_text&lt;/code&gt; or &lt;code&gt;artifact_url&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;A tiny Node poller:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REELYZE_BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REELYZE_API_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;job_id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/analyze`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;job&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/jobs/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;job_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;report_markdown&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timed out&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The content tools are synchronous
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/v1/script&lt;/code&gt; and &lt;code&gt;/v1/ideas&lt;/code&gt; return the result directly - no polling.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REELYZE_BASE_URL&lt;/span&gt;&lt;span class="s2"&gt;/v1/script"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$REELYZE_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"topic":"how I edit reels in 10 minutes","duration_seconds":30,"language":"English"}'&lt;/span&gt;
&lt;span class="c"&gt;# → {"script":{ "hooks":[...], "script":[{timecode,label,spoken,on_screen}...],&lt;/span&gt;
&lt;span class="c"&gt;#              "caption":"...", "hashtags":[...], "shot_list":[...] }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The agent skill (Claude / Cursor)
&lt;/h2&gt;

&lt;p&gt;Instead of writing the poll loop yourself, drop in the skill file. It's a single self-contained &lt;code&gt;SKILL.md&lt;/code&gt; (MIT-0) that teaches the agent the endpoints, the async pattern, and how to read the analysis report. Set one env var and the agent does the rest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;REELYZE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rk_live_xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you just talk to your agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; audit this reel and tell me why it flopped: &amp;lt;url&amp;gt;
→ Verdict: strong concept, buried payoff.
→ Hook: weak - lost ~62% by 0:03.
→ Drop-off at 0:11: 3s of B-roll with no narration.
→ Fix: cold-open on the result; cut the intro.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because it's plain HTTP behind a Bearer key with open CORS, the same skill works from Claude, Cursor, a browser tool, or your own backend - no SDK, no install.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why expose it as a skill, not just an API
&lt;/h2&gt;

&lt;p&gt;The point isn't one call - it's chaining. An agent with this skill can &lt;strong&gt;transcribe → analyze → rewrite the hook → generate the next script&lt;/strong&gt; in one flow, or compare two reels' hooks, or audit a competitor's winner and then draft your version informed by what the report found. The analysis becomes a step in a workflow instead of a tab you check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The free tools (transcript, downloader, audio) work on any key at 50/day, and the first full analysis is free -&lt;a href="https://getreelyze.com" rel="noopener noreferrer"&gt;getreelyze.com&lt;/a&gt;. Grab a key from the dashboard or the skill file from &lt;a href="https://github.com/usamalatif/reelyze-skill" rel="noopener noreferrer"&gt;https://github.com/usamalatif/reelyze-skill&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're building creator tooling, I'd genuinely like feedback on two things: does the drop-off timestamp match what you see in your own retention graphs, and what would make the API more useful inside your own agent? Reply here or find me - &lt;a href="https://getreelyze.com/authors/usama-latif" rel="noopener noreferrer"&gt;Usama&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>api</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
