{"slug": "how-my-agent-produced-a-3-9m-view-viral-video", "title": "How My Agent Produced a 3.9M-View Viral Video", "summary": "A fully autonomous AI pipeline produced a 10-second documentary-style video about a Tulum car rental scam that has garnered 3.9 million views, with 100% of views coming from non-followers and 986 shares. The video was generated without a camera, actor, or editor, using a queue-based system that converts a concept JSON into a Seedance prompt, WaveSpeed-generated footage, and an FFmpeg overlay before publishing to four platforms. The pipeline's stability relies on WaveSpeed's authenticated API, which avoids the reverse-engineering issues that plagued previous AI content projects.", "body_md": "# How My Agent Produced a 3.9M-View Viral Video\n\nOne scam concept goes into a queue. A fully autonomous pipeline turns it into a documentary-style reel and ships it to four platforms. This one came out the other side with 3.9 million views and counting.\n\n- The video is the\n**Tulum spare-tire rental scam** reel —**3,943,661 views**, 100% from non-followers, 986 shares. No camera, no actor, no editor. - It’s one run of a skill my agent executes end to end: concept → Seedance prompt → WaveSpeed generation → FFmpeg overlay → multi-platform publish.\n- Every artifact below is the real one: the queue JSON, the exact prompt that generated the footage, the overlay code, and the publish config.\n- The account-level story — how the whole channel hit\n[18 million views in 90 days](/posts/tabiji-18m-views/)— is the companion piece. This is the anatomy of one video inside it.\n\n## The video\n\nThis is a ten-second clip of a couple at a Cancun airport rental counter, a pushy agent fixated on the spare tire, and — days later — a different employee claiming the tire is gone and reaching for a card machine. It is a real scam. None of it was filmed. The footage, the people, the garage, the luggage carts: all generated.\n\nHere is what that produced, from the account’s own insights the morning I grabbed this:\n\nTwo numbers matter more than the view count. **100% non-followers** — the reel reached essentially zero existing audience; it was pure cold algorithmic reach. And **986 shares**, which outnumber the 518 saves and run heavy against just 2,622 likes. People didn’t double-tap this. They sent it — to the friend flying to Mexico next month. Hold onto that; it’s the whole reason it traveled.\n\n## The pipeline, in one line\n\nA concept becomes a prompt becomes a clip becomes a captioned, overlaid, multi-platform reel — from a queue, with no human in the loop on the production side. Five steps, one skill my agent runs:\n\n**concept (JSON) → documentary prompt → WaveSpeed Seedance clip → FFmpeg overlay → publish to four platforms.**\n\nOne thing worth saying up front, because it’s the difference between this working and not: [WaveSpeed](https://wavespeed.ai/?ref=zonted) exposes a real, authenticated API. Unlike the Suno mess that [killed Kapiko](/posts/kapiko-postmortem/), nothing here is reverse-engineered or breaking every 36 hours. The key lives in the keychain, the call is a clean POST, and the whole skill actually survives as a cron job. Here is each step, with the real files.\n\n## Step 1: the concept is data, not a script\n\nEvery reel starts as a structured queue item. Not a screenplay — a small JSON object that names the place, the setup, where each person stands, and the five beats that will become the on-screen story. This is the actual Tulum entry:\n\ndata/queue.json — the Tulum item\n\n```\n{\n  \"id\": \"tulum-car-rental-spare-tire-scam\",\n  \"destination\": \"Tulum\",\n  \"country\": \"Mexico\",\n  \"scam_name\": \"Spare Tire Rental Scam\",\n  \"location_context\": \"At Cancun Airport rental counters feeding Tulum\n     road trips, inside bright garages and return lanes packed with carts.\",\n  \"concept\": \"The pickup agent makes a big show of the spare tire, then at\n     return another employee claims it is missing and charges hundreds.\",\n  \"prompt_anchors\": [\"airport rental garage\", \"open trunk\",\n     \"spare tire close-up\", \"clipboard inspection\",\n     \"different employee at return\", \"credit card machine\"],\n  \"tourist_blocking\": \"A couple stands at the open trunk as the pickup agent\n     points hard at the spare tire and tools like it matters most.\",\n  \"scammer_blocking\": \"Days later, a different employee at return bends into\n     the same trunk, straightens up, and announces the spare is gone.\",\n  \"beats\": [\n    \"Pickup fixates on the spare tire\",\n    \"The trunk gets extra attention\",\n    \"Return day feels routine at first\",\n    \"Then the tire is suddenly missing\",\n    \"The charge hits before you can react\"\n  ],\n  \"hashtags\": [\"tulum\", \"mexico\", \"travelscam\", \"rentalcar\",\n     \"sparetire\", \"travelsafety\", \"cancunairport\", \"tabiji\"]\n}\n```\n\nThe concept itself isn’t invented. It’s lifted from a real, upvoted travel-scam report — the kind where a tourist got burned and came back to write it up. That’s the validated-demand trick I cover in the [account-level post](/posts/tabiji-18m-views/): you’re transcribing a scam people already proved they care about, not guessing. The `beats`\n\narray is the most important field — those five lines become the lower-third captions, and they follow a deliberate threat-then-fix arc.\n\n## Step 2: concept → documentary prompt\n\nA script, `generate_prompt.py`\n\n, flattens that JSON into one Seedance prompt. It stitches the location, the opening visual, the two blocking descriptions, the reveal, and the visual anchors into a single paragraph, then ends with a fixed clause that forces documentary realism. This is the *exact* prompt that generated the footage you just watched:\n\nGenerated Seedance prompt\n\n```\nPhotorealistic documentary-style travel footage in Tulum, Mexico. At\nCancun Airport rental counters feeding Tulum road trips, inside bright\ngarages and return lanes packed with luggage carts. A bright rental\ngarage hums with rolling suitcases, cars pulling out, and staff guiding\ntired arrivals into inspection lanes. A couple stands at the open trunk\nas the pickup agent points hard at the spare tire and tools like it\nmatters more than anything else. Days later, a different employee at\nreturn bends into the same trunk, straightens up, and announces the\nspare is gone while holding a payment terminal. [...] Visual anchors to\npreserve: airport rental garage, open trunk, spare tire close-up,\nclipboard inspection, different employee at return, credit card machine.\nNatural handheld camera movement, subtle zoom or push-in only when it\nhelps the social tension, realistic pacing, overlapping background\nmotion, authentic tourist behavior, grounded travel realism, no\nstylization, no subtitles, no on-screen text.\n```\n\nTwo rules are doing quiet work here. First, **“no subtitles, no on-screen text”** — the model is bad at rendering text and it instantly breaks the documentary look, so all words get added later in FFmpeg, never by the model. Second, the script runs a small substitution pass to keep a scam prompt from tripping the generator’s safety filter without losing the mechanics:\n\ngenerate_prompt.py — moderation softening\n\n```\nreplacements = {\n    ' aggressive ':   ' pressuring ',\n    ' aggressively ': ' insistently ',\n    ' threatens ':    ' warns about ',\n    ' threat ':       ' warning ',\n    ' extortion ':    ' fake fine ',\n}\n```\n\n“Pressuring” renders the same social tension as “aggressive” and sails through moderation. The scam still reads; the trigger words don’t.\n\n## Step 3: generate the clip\n\nThe prompt goes to WaveSpeed running ByteDance’s Seedance 2.0, vertical, ten seconds. The call is unremarkable, which is the point — it’s a real API:\n\nrun_queue_item.py — submit to WaveSpeed\n\n```\nBASE  = 'https://api.wavespeed.ai/api/v3'\nMODEL = 'bytedance/seedance-2.0/text-to-video'\n\npayload = {\n    'prompt': prompt,\n    'duration': 10,\n    'aspect_ratio': '9:16',\n    'resolution': '480p',\n}\n# POST, then poll /predictions/{id}/result every 8s until the\n# status flips to completed, then stream the mp4 to disk.\n```\n\nA clip runs roughly $0.30 to $2 depending on duration and resolution. Cheap per unit, not free at volume — and it says nothing about whether the result is any good, which is still the hard part. The raw 480p vertical clip lands on disk and moves to the only step that touches a human-readable word.\n\n## Step 4: burn the overlay\n\nEverything you read on screen — the flag, the crimson headline, the five beats that appear one at a time — is added *after* generation with FFmpeg. The overlay script never assumes a canvas size; it measures the real frame with `ffprobe`\n\n, then dynamically wraps and shrinks text to fit. That’s why a long scam name never runs off the edge:\n\nrender_overlay.py — measure, wrap, fit\n\n```\n# measured from the actual rendered frame, not a fixed 1080x1920\nmax_headline_width = int(w * 0.78)\nmax_beat_width     = int(w * 0.76)\n\ndef fit_wrapped(text, font_path, start_size, max_width, max_lines, min_size):\n    size = start_size\n    while size >= min_size:\n        lines = wrap_text(text, font((font_path, size)), max_width)\n        if len(lines) <= max_lines:\n            return size, lines\n        size = max(min_size, math.floor(size * 0.92))  # shrink 8%, retry\n    return min_size, wrap_text(text, font((font_path, min_size)), max_width)\n```\n\nThe five beats are timed to reveal in sequence across the clip’s duration — one lower-third line at a time, each fading in, the last one held to the end in crimson for emphasis:\n\nrender_overlay.py — beat timing\n\n```\nbeat_start = 0.9\nsegment = max(1.1, (duration - beat_start) / max(len(beats), 1))\n# beat i appears at beat_start + i*segment, behind a translucent\n# black box, drawn with an alpha ramp so it fades in cleanly.\n```\n\nThe output is a finished, captioned, on-brand vertical MP4 — the exact thing in the embed above. No human has touched it.\n\n## Step 5: publish everywhere at once\n\nA config builder turns the same queue item into per-platform captions, then one publish script fans the video out. Here is the Instagram caption it generated — note that it’s the five beats again, plus the explainer, plus the *“save this”* call to action that drives the shares:\n\nbuild_config.py — generated Instagram caption\n\n```\nThe Spare Tire Rental Scam in Tulum, Mexico 🇲🇽\n\nPickup fixates on the spare tire\nThe trunk gets extra attention\nReturn day feels routine at first\nThen the tire is suddenly missing\nThe charge hits before you can react\n\nThe spare tire rental scam works by making the trunk part of the\nstory from the beginning, so the final accusation feels pre-scripted.\n\nSave this before your next trip. 📌\n\n#tulum #mexico #travelscam #rentalcar #sparetire #travelsafety\n#cancunairport #tabiji\n```\n\nOne script (`publish-video.py`\n\n) then does the whole fan-out: upload the file to temporary storage, create the Instagram Reel, upload the YouTube Short, post the Facebook Page reel, hand the clip to TikTok, and clean up — each with a thumbnail pulled from the 1-second mark. For this reel, Instagram, YouTube, and TikTok all shipped; Facebook got rate-limited and was left to retry rather than hammered. X stays off by default.\n\n## Why this one hit 3.9 million\n\nThe pipeline ships a reel like this every day. Most do fine. This one detonated, and the insights say why. Look at the engagement shape again: 986 shares, 518 saves, 2,622 likes. On most content likes dwarf everything; here shares are over a third of the likes and *beat the saves*. That is the signature of content people forward rather than admire.\n\nIt’s engineered for exactly that. A named scam at a named place is a warning you feel obligated to pass to someone specific. The five beats deliver the threat fast and the caption delivers the fix (“save this”), which is the structure that travels — a threat with no defense just makes people anxious and they scroll on. And because Instagram weights shares heavily for reaching people who don’t follow you, 986 shares is what turned a tiny account’s reel into 1.85 million strangers reached. The [account-level post](/posts/tabiji-18m-views/) breaks down those mechanics — the Reddit demand-mining, the account warming, the human kept on engagement — in full.\n\n## The takeaway\n\nA single structured concept went into a queue and came out as 3.9 million views, with no human touching the footage between the two. That’s the part that’s genuinely solved: the production line. What it doesn’t solve is which concept detonates and which dies at 4,000 views — that’s still taste, validated demand, and a distribution game the platforms keep changing.\n\nThe machine makes the video. The judgment about *what* to make, and the patience to keep feeding it, is the whole job. One in fifty hits 3.9 million. The skill’s contribution is making the other forty-nine cost a dollar each.\n\nNewsletter\n\n## Get the next post by email.\n\nOne email when I publish something new. No spam, no fixed schedule, unsubscribe anytime.\n\nRecommended Reading\n\n[The Three Unlocks Behind 18M Views of AI Travel Content](/posts/tabiji-18m-views/)Tabiji, our AI travel-safety channel, got 18,117,121 views in 90 days — 98.6% from strangers. The three unlocks: Reddit as a demand oracle, warming accounts…\n\n[The True Cost of AI Content Production](/posts/true-cost-of-ai-content-production/)Everyone obsesses over model costs and token prices. But after producing 400+ pages and 200+ videos with AI, we learned the real expense is data…\n\n[Kapiko: a 10-day, $150 post-mortem](/posts/kapiko-postmortem/)Built and shipped Kapiko — an AI-generated ambient music YouTube channel — in 10 days for ~$150. The pipeline worked. The Suno API does not exist. Here is…", "url": "https://wpnews.pro/news/how-my-agent-produced-a-3-9m-view-viral-video", "canonical_source": "https://zonted.com/posts/how-my-agent-made-a-viral-video/", "published_at": "2026-05-31 00:00:00+00:00", "updated_at": "2026-06-04 18:59:21.305526+00:00", "lang": "en", "topics": ["ai-agents", "generative-ai", "ai-tools", "ai-products", "ai-startups"], "entities": ["Seedance", "WaveSpeed", "FFmpeg", "Tulum", "Cancun"], "alternates": {"html": "https://wpnews.pro/news/how-my-agent-produced-a-3-9m-view-viral-video", "markdown": "https://wpnews.pro/news/how-my-agent-produced-a-3-9m-view-viral-video.md", "text": "https://wpnews.pro/news/how-my-agent-produced-a-3-9m-view-viral-video.txt", "jsonld": "https://wpnews.pro/news/how-my-agent-produced-a-3-9m-view-viral-video.jsonld"}}