AI clipping usually means one thing: a tool finds moments in a long video and cuts them vertical. In a paid clipping campaign that is the easy part. Clips get rejected for the rest of the job: a missing hashtag, the watermark the brief asked for, the wrong length, an account that isn't verified, a disclosure that isn't there, a link submitted 40 minutes after posting.
This post shows how to automate clipping as the whole job, with AI Clipping Skill, a free, MIT-licensed skill for Claude Code (it also runs in Codex, Cursor and OpenClaw). Your agent reads the campaign brief into a checklist, cuts one disclosed clip per account from the footage the campaign supplied, checks every clip against the brief in code, shows one plan page, and after one yes posts to TikTok, Reels and Shorts and hands you each link with the minute its submission window closes. Everything before posting runs on your own computer with Python and ffmpeg and works without signing up for anything.
npx skills add social-media-skills/ai-clipping-skill -g -a claude-code -y Repo: github.com/social-media-skills/ai-clipping-skill
The example in the repo: a made-up campaign on a 9-minute NASA interview, three clips for three accounts. Where a real campaign's clip shows its paid-partnership line, the example shows "EXAMPLE ONLY: not a real ad". NASA and Bob Behnken endorse nothing here.
What a clipping campaign asks for
On Whop and Content Rewards, a campaign pays per 1,000 views for short clips of footage the brand or creator supplies. The brief sets the rules, and Content Rewards' own rejection guide says most rejections come from a detail the clipper skimmed past. A typical brief asks for:
- Money: a rate per platform, a minimum payout per clip (nothing below it), a cap per clip, a fee, a total budget that can run out.
- The caption: a hashtag, an @mention, a link, nothing from the banned list.
- The screen: a watermark or logo, a length range, 9:16.
- The footage: only the supplied files, sometimes only streams from the last few days.
- The account: verified in the marketplace, a link in the bio, sometimes a minimum share of viewers in the US and an engagement floor.
- After posting: submit the link within 30 minutes, one post into one campaign once, stay public and unchanged for 30 days, keep analytics screenshots as proof.
And every campaign post is an ad. Content Rewards requires the disclosure at the start of the video and at the top of the caption, Whop's clipper terms require following the FTC's rules, and TikTok takes undisclosed branded posts out of For You.
That list is why "automate clipping" can't stop at cutting. Each of those items is a check a script can run before the post exists.
The prompt
I joined a clipping campaign. Brief is in brief.txt, footage is behnken.mp4. Accounts: TikTok @example.clipper (everyone, comments on, duets and stitches off), Reels @example.clipper.reels, Shorts @exampleclipper (public, not for kids), all verified in the marketplace. No AI-made people or voices.
That answers what the agent would otherwise ask in its first message: the brief, the footage, the accounts, whether each is verified, and the settings only the account owner may choose. When posting isn't connected yet, the agent puts the signup link at the top of that first message, so the account gets made while the clips render.
Step 1: the brief becomes a checklist
The agent copies the brief's own numbers and words into campaign.json, then:
python3 <skill>/scripts/campaign.py campaign.json 1. **Platforms and rates:** TikTok $1.00 per 1,000 views, Instagram Reels $0.80 per 1,000 views, YouTube Shorts $0.50 per 1,000 views. 2. **Payout:** minimum payout per clip $5.00; cap per clip $150.00; marketplace fee 10%; total budget $3,000.00; $2,140.00 left when checked 16 Nov 13:30 UTC. When the budget runs out, views stop paying. 3. **Pays from:** TikTok 5,000, Instagram Reels 6,250, YouTube Shorts 10,000 views per clip; under that a clip earns nothing. 4. **Every caption:** starts with **#ad**; hashtags: #exampleorbit; mentions: @example.orbit; links: example.com/orbit. ... 16. **Submitting:** within 30 minutes of posting; one post goes into one campaign, once. ... ## Never followed - "Please don't make it feel like an ad, we want it to look natural." 0 error(s), 1 brief sentence(s) flagged -> checklist.md The example brief has 18 rules, and line 3 is the one most clippers never work out: at $1 per 1,000 views with a $5 minimum, a TikTok clip earns nothing until 5,000 views. The agent says that once, in plain words, before any cutting.
The flagged sentence is the other point of this step. The brief asks for clips that don't feel like ads. The skill keeps the disclosure on every clip, tells you why (the marketplace, advertising law, and TikTok's reach rules all require it), and never follows that sentence. A brief that forbids any disclosure on screen is listed as a conflict: you ask the brand in writing or skip the campaign. You confirm the checklist before anything is cut.
Step 2: one edit per account
python3 <skill>/scripts/transcribe.py behnken.mp4 --engine local --out work python3 <skill>/scripts/make_clips.py clips.json --transcript work/transcript.json --out clips transcribe.py gives a time for every word, with faster-whisper on your own computer, your own Groq or OpenAI key, or captions the campaign supplied. For a stream it also lists the loudest moments. The agent scores candidate moments for a hook, a payoff and whether they stand alone without the rest of the video, then picks one per account from across the footage and writes a hook for each, 3 to 8 words and true to the clip.
make_clips.py cuts each one to 9:16 with captions, the hook, the disclosure at the top for the first seconds (below TikTok's top tabs), and the brief's watermark text or logo. For a 16:9 stream with a facecam, "reframe": "stack" puts the facecam over the gameplay.
Three accounts get three different moments: Groundhog Day on TikTok (29.6 s), "save the crew, not the mission" on Reels (20.8 s), and "future crews forget his name" on Shorts (26.7 s). That is the only honest way to post a campaign on several accounts. Campaigns reject "minimally changed" edits, and TikTok, Instagram and YouTube all limit reused or near-identical uploads. The skill never changes speed, mirrors or filters a clip to make one edit look like two.
Step 3: check every clip in code
The agent writes a caption per account (#ad first, what the clip says, then every required hashtag, @mention and link) into clipjob.json, then:
python3 <skill>/scripts/check_clips.py clipjob.json groundhog-tiktok (TikTok @example.clipper, clips/clip-01.mp4, 29.6 s): ok safe-path-reels (Reels @example.clipper.reels, clips/clip-02.mp4, 20.8 s): ok curse-names-shorts (Shorts @exampleclipper, clips/clip-03.mp4, 26.7 s): ok warning: clips: 3 clip(s) are 540x960, under 1080x1920: fine for a draft or an example; ... 0 error(s), 1 warning(s) Per clip, it checks the file and length against its platform and the campaign, the caption (disclosure first, every required item, nothing banned, no engagement bait, Instagram's 5 hashtags), the disclosure and watermark on screen, that the footage is the campaign's and recent enough, that the account is verified, and that the budget isn't gone. Across clips, it refuses the same file on two accounts, two accounts on one platform sharing more than half their footage, and any edit already posted for this or another campaign. That last one works across folders: there is one ledger per user in ~/.ai-clipping/, holding a fingerprint of every file you posted.
The warning is honest too: the example clips are 540x960 to keep the repo small. A real run cuts 1080x1920.
Step 4: one plan page, one yes
python3 <skill>/scripts/plan.py clipjob.json plan.html opens with what to do before posting: set the bio link now, and for the audience and engagement rules, what actually helps (post from accounts whose viewers already live there, write hooks that pay off, answer comments in the first hour) next to what gets accounts banned (VPN tricks, engagement groups, bought views). Then a card per account: the clip's first frame, hook, caption, settings, checks, and what it earns. For the TikTok clip: $0.00 at 1,000 views, $9.00 at 10,000, $90.00 at 100,000, capped at $150. No promise, just the brief's math after the fee.
The agent shows the page and waits for one clear yes that covers these clips, these accounts, now.
Step 5: post now, not later
Campaigns accept a link only within 30 minutes of the post going live, so nothing is scheduled. After the yes, each clip is uploaded once, the request is validated, and the connected accounts post in one request with a child per account, each with its own clip and caption. Trimmed from requests/example-orbit-crew-dragon.json:
{ "schedule": {"type": "PUBLISH_NOW"}, "socialAccounts": [ {"platform": "TIKTOK", "postMode": "DIRECT_POST", "privacyLevel": "PUBLIC_TO_EVERYONE", "allowComment": true, "allowDuet": false, "allowStitch": false, "isYourBrand": false, "isBrandedContent": true, "isAiGeneratedContent": false, "contentOverride": [{"text": "#ad Astronaut Bob Behnken trains until launch day holds no surprises, ...", "media": [{"type": "MEDIA_LIBRARY", "mediaId": "<clip-01>"}]}]}, {"platform": "INSTAGRAM", "postType": "REEL", "isAiGeneratedContent": false, "contentOverride": [{"text": "#ad \"Save the crew, not the mission.\" ...", "media": [{"type": "MEDIA_LIBRARY", "mediaId": "<clip-02>"}]}]} ] } isBrandedContent: true is TikTok's paid partnership label. Instagram's paid partnership label and YouTube's paid promotion box can't be set through the posting API, so they are steps in the app, listed on the plan and on the submission sheet.
In the example the clipper is on the free plan with 2 accounts, so TikTok and Reels go through the request and Shorts is posted by hand from by-hand/curse-names-shorts.md: the file, title, description, settings, the paid promotion box, and the 30-minute steps. Pasting the Short's link back records it like the others.
Step 6: the submission sheet
After posting, plan.py --status reads the live links back and writes submit.md:
1. **TikTok @example.clipper** (TikTok), post `groundhog-tiktok` - Link: https://www.tiktok.com/@example.clipper/video/example-0001 - Live since Mon 16 Nov 09:01 America/New_York (EST). Submit by **Mon 16 Nov 09:31 America/New_York (EST)** (26 min left). 2. **Reels @example.clipper.reels** (Instagram Reels), post `safe-path-reels` - Live since Mon 16 Nov 09:02 ... Submit by **Mon 16 Nov 09:32 ...** - Before then: Instagram: edit the Reel in the app and turn on the paid partnership label. A deadline in your own time zone, per post, with the app steps that must happen inside it, and the times for the 48-hour, 72-hour and 7-day analytics screenshots. You paste each link into the campaign yourself. No marketplace has a submission API for clippers, and the skill never drives your logged-in browser.
Step 7: the ledger and the proof log
python3 <skill>/scripts/ledger.py --submitted <link> --campaign example-orbit-crew-dragon python3 <skill>/scripts/ledger.py --proof analytics.json python3 <skill>/scripts/ledger.py --earnings --submitted refuses a link already submitted, a share link, and a post made for another campaign. --proof adds a dated row per post to one proof log, from the per-post numbers the posting service collects about once a day. --earnings applies the minimum, cap and fee, with the 30-day earning window counted from the day a clip crosses the payout threshold. From the example's made-up day-3 numbers:
TikTok @example.clipper: 7,420 views, est. $6.68 after 10% fee, 30 day(s) left, submitted Reels @example.clipper.reels (Instagram Reels): 2,380 views, est. $0.00 after 10% fee (under the $5.00 minimum payout) ... audience: 22% in the US (from your screenshot); the campaign needs 30%, so expect this clip to be rejected Shorts @exampleclipper (YouTube Shorts): 1,120 views, est. $0.00 after 10% fee (under the $5.00 minimum payout) ... submitted total: 10,920 views, est. $6.68 That is what most clippers see: a few thousand views, a few dollars at most. The value of the ledger is not that number. It is knowing which clip is under the minimum, which one breaks the audience rule, and having the dated record when a payout is checked.
What stays manual, on purpose
- Submitting. You paste each link. The sheet tells you by when.
- Instagram's paid partnership label and YouTube's paid promotion box. Set in the app inside the 30 minutes.
- The bio link, set before posting, and a required TikTok sound, which no posting API can add: that clip is posted by hand with the sound.
- Content rules a script can't judge: topics, tone, what to say about the product. They are on the plan page for you to read before the yes.
- The owner's choices: who can see a TikTok, made for kids, AI labels, marketplace verification. Asked, never filled in.
Posting, and what it costs
Disclosure: the skill is made by the team that builds WoopSocial, and posting goes through WoopSocial. It posts through each platform's own API with its own approved apps, so you don't need a developer app or an app review of your own, and it returns each post's link and per-post numbers. It doesn't write captions, edit video, set Instagram's or YouTube's paid-partnership options, or submit to campaigns: the agent and the skill's scripts do the first two, and you do the rest. The free plan covers 2 social accounts, no card (make a free account). TikTok, Reels and Shorts are 3, so the agent asks up front: it posts 2 and gives you a ready page for the third, posts all of them on a paid plan, or you post all of them by hand with nothing to sign up for. The connect step for your agent is on WoopSocial's agent setup page.
Try it
npx skills add social-media-skills/ai-clipping-skill -g -a claude-code -y Then tell your agent "I joined a clipping campaign" and paste the brief. It needs Python 3.9+, ffmpeg and Pillow; scripts/check_setup.py prints the install command for anything missing. The whole example, every file the skill made, is in examples/orbit-campaign/. Whop and Content Rewards are named only as the marketplaces where these campaigns run; the skill isn't affiliated with either. Issues and pull requests are welcome, and there's the rest of our free social media skills from the same team.





