Turn any news article or long-form post URL into a 30–60 second 9:16 short with stock visuals, narration, and captions. Use when the user shares a link and w...
---
name: revid-article-to-short
description: Turn any news article or long-form post URL into a 30–60 second 9:16 short with stock visuals, narration, and captions. Use when the user shares a link and wants an edited summary, not a talking-head.
metadata: {"openclaw":{"requires":{"config":["REVID_API_KEY"]}}}
---
# Article / news → short
Take any URL with a substantial article body and produce a vertical short with
voiceover + auto-cut stock b-roll + captions.
## When to use this skill
- Source is a news article, long-form blog, press release, or essay.
- Output goal: an **edited summary**, voiceover + visuals, 30–60 s.
- The user does NOT want a talking-head (use
[`revid-blog-to-avatar-video`](../revid-blog-to-avatar-video/SKILL.md) for that).
- For e-commerce product pages prefer
[`revid-shopify-product-promo`](../revid-shopify-product-promo/SKILL.md) — same
workflow but tuned defaults.
## Inputs
| Field | Required | Notes |
|---|---|---|
| `url` | yes | Article URL |
| `aspectRatio` | no | Default `9:16` |
| `targetDuration` | no | Default 45 s |
| `language` | no | Auto-detected; override for non-English |
## Step-by-step
1. Validate the URL.
2. POST the payload below.
3. Poll `/status` (canonical loop in the Polling section below).
4. Return `videoUrl`.
## API call template
```http
POST /api/public/v3/render
Host: www.revid.ai
Content-Type: application/json
key: $REVID_API_KEY
```
```json
{
"workflow": "article-to-video",
"source": {
"url": "{ARTICLE_URL}",
"scrapingPrompt": "Summarize the article body. Skip ads, related links, navigation, and footer."
},
"aspectRatio": "9:16",
"voice": { "enabled": true, "stability": 0.6, "speed": 1.0, "language": "en-US" },
"captions": { "enabled": true, "position": "middle", "autoCrop": true },
"music": { "enabled": true, "syncWith": "beats" },
"media": {
"type": "stock-video",
"density": "medium",
"animation": "soft",
"quality": "pro",
"videoModel": "pro",
"imageModel": "good"
},
"options": {
"targetDuration": 45,
"summarizationPreference": "summarize",
"soundEffects": true,
"hasToGenerateCover": true,
"coverTextType": "headline"
},
"render": { "resolution": "1080p", "frameRate": 30 }
}
```
## Examples
- [`examples/article-techreview.json`](examples/article-techreview.json)
- [`examples/run.sh`](examples/run.sh)
## Polling
After `POST /render`, poll until `status === "ready"`:
```bash
PID="<pid-from-render>"
while :; do
R=$(curl -fsSL "https://www.revid.ai/api/public/v3/status?pid=$PID" \
-H "key: $REVID_API_KEY")
S=$(echo "$R" | jq -r .status)
case "$S" in
ready) echo "$R" | jq .; break ;;
failed) echo "FAILED: $R"; exit 1 ;;
*) sleep 5 ;;
esac
done
```
In production prefer setting `webhookUrl` in the request body and skip polling.
## Failure modes
| Symptom | Fix |
|---|---|
| `scrape failed` | Pre-fetch the article body server-side and switch to [`revid-script-to-video`](../revid-script-to-video/SKILL.md) with the body in `source.text`. |
| Off-topic stock visuals | Pass a tighter `scrapingPrompt` (e.g. *"Focus on the financial markets angle, not the company history"*) and lower `media.density: "low"`. |
| Wrong language detected | Set `voice.language` and `options.language` explicitly. |
| Captions clip subjects | `captions.position: "top"`. |
## See also
- [`revid-shopify-product-promo`](../revid-shopify-product-promo/SKILL.md)
- [`revid-news-to-daily-short`](../revid-news-to-daily-short/SKILL.md) for
*generating* news from a topic vs summarizing a known URL.
- [`revid-pdf-to-video`](../revid-pdf-to-video/SKILL.md) for PDFs instead of HTML.
don't have the plugin yet? install it then click "run inline in claude" again.
restructured original into six-component format, added explicit decision logic for scrape failures and language detection, documented REVID_API_KEY as external input with setup guidance, added edge cases for rate limits and auth expiry, clarified output format and success criteria, removed em-dashes throughout.
convert a news article, blog post, press release, or essay URL into a vertical short video (9:16 aspect ratio, 30-60 seconds) with AI voiceover, auto-synced stock footage, and burned-in captions. use this when the user shares a link and wants an edited summary video, not a talking head. skip this if the user wants an avatar-based video or if the source is a product page (use the product-promo skill instead).
| field | required | notes |
|---|---|---|
url |
yes | article URL; must be publicly scrapeable and have substantial body text. |
REVID_API_KEY |
yes | env var or header key for revid.ai API access. set up via revid dashboard; requires read/write perms for render and status endpoints. |
aspectRatio |
no | video frame ratio. defaults to 9:16 (vertical). |
targetDuration |
no | desired video length in seconds. defaults to 45; valid range 30-120. |
language |
no | language code for voiceover and caption text (e.g., en-US, fr-FR). auto-detected from article; override if detection fails. |
scrapingPrompt |
no | custom instruction for content extraction. defaults to generic summarization. tighten for noisy pages (e.g., finance sites with sidebars). |
media.density |
no | stock footage frequency. options: low, medium (default), high. lower values reduce visual clutter. |
captions.position |
no | caption placement on screen. options: top, middle (default), bottom. adjust if captions obscure subject. |
validate input url: confirm the url is http/https, not malformed, and resolves (HEAD request). reject localhost or internal ips. allow redirects up to 5 hops.
construct api request payload: build json body with workflow: "article-to-video", populate source.url with the article url, set scraping prompt (use custom if provided, else default), and merge user overrides for aspectRatio, targetDuration, voice.language, captions.position, and media.density.
post to /render endpoint: send POST request to https://www.revid.ai/api/public/v3/render with Content-Type: application/json header and key: $REVID_API_KEY auth header. capture the response pid (process id).
poll /status endpoint: enter a loop that queries https://www.revid.ai/api/public/v3/status?pid={pid} every 5 seconds with the same auth header. check the status field in the response.
handle status responses: if status is ready, extract videoUrl from response and proceed to step 6. if status is failed, log the error reason and exit with failure. if status is processing or pending, wait and repeat step 4.
return videoUrl: output the download or stream url for the finished short video.
if scraping fails (status response includes scrape error or empty body extracted): offer user two paths: (a) retry with a tighter scrapingPrompt parameter, or (b) switch to revid-script-to-video skill with pre-fetched article body as plain text input.
if language is detected incorrectly: user can override by setting voice.language and options.language to the correct code. recommend this for non-English articles or multilingual content.
if stock visuals are off-topic or too generic: reduce media.density from medium to low, or refine scrapingPrompt to highlight the key angle (e.g., "focus on financial impact, not company history").
if captions clip the main subject or are hard to read: adjust captions.position from middle to top or bottom, or reduce captions font size via autoCrop: true.
if api key is missing or expired: request will return 401. check env var REVID_API_KEY is set and token has not exceeded expiration. regenerate key in revid dashboard if needed.
if url returns 404 or 403: article is unreachable or blocked. confirm url is public and user has permission. some paywalled sites will reject scraping; offer fallback to manual script input.
if polling timeout exceeds 10 minutes: job is likely stuck. cancel request and retry; if persistent, contact revid support.
success response: http 200 from /render endpoint with json body containing pid (string, alphanumeric). polling /status with that pid returns json with status: "ready", videoUrl (string, https url), and metadata including duration (seconds), resolution, and language.
video file: mp4 format, h.264 codec, 1080p (1920x1080 for 9:16 aspect ratio with letterbox or crop), 30 fps, aac audio at 128 kbps.
storage: video is hosted at the url in the response. typical ttl is 7-30 days depending on plan; download and archive if longer retention needed.
captions: burned-in (not separate vtt file), positioned as specified, white text with soft drop shadow for legibility.
audio: ai-generated voiceover (no background music by default unless music.enabled: true in payload; set to false to disable).
user receives a viewable video url within 2-5 minutes. video plays end-to-end without errors, captions match voiceover timing and are legible, stock footage is thematically relevant to article content, and duration is within target range (e.g., 43-47 seconds if target was 45). user can immediately share, download, or edit the short.