Tested by us
On 12-Nov-2026 we uploaded a reel as a trial reel this way and it went out as one (is_shared_to_feed=false, it didn’t appear on the grid). Meta changes things often: check each reel after publishing, as explained in step 2.
Trial reels are an official Instagram feature: the reel is shown first to people who don’t follow you and doesn’t appear on your profile or to your followers. Perfect for testing hooks without burning out your account.
What few people know: you can upload them through the official Instagram API. And if an API can upload them, Claude can upload them.
The loop
Upload
Claude publishes one version of the video as a trial reel. One a day.
Test
Instagram shows it to people who don’t follow you. Your profile never knows.
Measure
Every morning Claude reads the skip rate, watch time, views and reach.
Improve
It tells you which hook won and suggests changes to your skills. You decide.
What you need
- A professional Instagram account (creator or business).
- A Meta developer account (free) at developers.facebook.com.
- Claude Code (or any Claude that can run code on your computer).
- Somewhere to put your MP4 at a public URL for a few minutes: your website, a bucket, a server… (step 3).
The Instagram API is free. The only thing you pay for is your Claude plan.
Step 1: the Meta app with Instagram Login
- On developers.facebook.com → My Apps → Create App → “Business” type.
- Add the Instagram product and choose Instagram API with Instagram Login.
- In the API settings, add your Instagram account as a tester, accept it from the Instagram app (Settings → Apps and websites) and generate the access token. It starts with
IGAA. - Permissions:
instagram_business_basic,instagram_business_content_publishandinstagram_business_manage_insights. - Save the token in a
.envfile in your project. Never paste it into a chat, a screenshot or GitHub.
Meta renames its menus from time to time; if you can’t find one, look for the closest equivalent.
It has to be THIS API variant
There are two ways to use the Instagram API. With the Facebook Login one (tokens starting with EAA, graph.facebook.com) we tried sending trial reels and Meta ignored the parameter without throwing an error: the reel went out as NORMAL, on the grid. Use the Instagram Login one: IGAA token and graph.instagram.com.
To check the token works, request your user: GET https://graph.instagram.com/v23.0/me?fields=user_id,username with the token as access_token.
Step 2: upload a video as a trial reel
It’s three calls, all to https://graph.instagram.com/v23.0:
1. Create the container with trial_params:
POST /<IG_USER_ID>/media
{
"media_type": "REELS",
"video_url": "https://your-site.com/temp/random.mp4",
"caption": "Your caption…",
"trial_params": { "graduation_strategy": "MANUAL" }
}
graduation_strategy | What happens |
|---|---|
MANUAL | The reel stays as a trial. If you want to move it to your profile, you “graduate” it by hand from the app. |
SS_PERFORMANCE | Instagram moves it to your profile only if it performs well. |
2. Wait for processing: GET /<CONTAINER_ID>?fields=status_code until it says FINISHED.
3. Publish: POST /<IG_USER_ID>/media_publish with { "creation_id": "<CONTAINER_ID>" }.
ALWAYS check it right afterwards:
GET /<REEL_ID>?fields=permalink,is_shared_to_feed
If is_shared_to_feed is false, it’s a trial reel. If it’s true or the reel shows up on your grid, it went out as a normal reel: archive it and make sure you’re using the IGAA token and graph.instagram.com.
Step 3: the MP4 has to be at a public URL (for a moment)
For reels, graph.instagram.com doesn’t accept a direct file upload: it requires video_url and Instagram downloads the video from that address.
- Upload the MP4 to your website, server or bucket with a random name.
- Check that the URL actually returns the MP4 (not an error page or a login).
- Create the container, wait for
FINISHEDand delete the file.
Step 4: read the numbers every morning
GET /<REEL_ID>/insights?metric=reels_skip_rate,ig_reels_avg_watch_time,views,reach
| Metric | What it tells you |
|---|---|
reels_skip_rate | The % of people who skip your reel in the first 3 seconds. It’s the “gone in 3 s” number: the one that tells you whether the hook works. Meta labels it as estimated and in development: use it to compare your hooks against each other, not as an exact number. |
ig_reels_avg_watch_time | The average time people watch it. |
views | Views. |
reach | Accounts reached. |
Wait at least 24 h before comparing one trial reel with another.
Step 5: the loop with Claude Code
The idea: from each video you make 5 versions with different hooks (same content; change the first line, the first shot and the cover) and Claude uploads one a day as a trial reel. Every morning it reads the numbers and notes which hook won. With that you tune your skills: the one that writes scripts and the one that edits.
Open Claude Code in your project folder (with the token already in .env) and paste this:
Let's build a trial reels loop on Instagram with the Instagram API with Instagram Login.
The token is in .env (INSTAGRAM_TOKEN, it starts with IGAA). Don't ask me to paste it into the chat. Always use https://graph.instagram.com/v23.0.
1. Create an "upload-trial" script that takes an MP4 and a caption, puts it at a temporary public URL with a random name (I'll tell you where), checks that the URL returns the MP4, creates the container with media_type=REELS and trial_params {"graduation_strategy":"MANUAL"}, waits for FINISHED, publishes, deletes the temporary MP4 and checks is_shared_to_feed. If it comes back true, warn me and stop.
Log each reel in trials.csv (date, file, hook, reel id, permalink).
2. Create a "read-numbers" script that, for each reel in trials.csv older than 24 h, requests reels_skip_rate, ig_reels_avg_watch_time, views and reach, and saves them in the same CSV.
3. Every morning: run read-numbers, tell me which hook won (lowest skip rate and longest watch time) and why you think it won. Propose one concrete change to my scripting skill and another to my editing skill. Don't change the skills without showing me the change first.
4. Then upload the next pending version with upload-trial. One a day at most.You can make the 5 versions by hand or ask Claude for them:
Give me 5 different hooks for this script, one of each type: result, curiosity, mistake, contradiction and story. For each one: the first line, what's shown in the first shot and the cover text.Notes
- Start slow: one trial a day. Mass publishing through the API can run into Meta’s limits and policies. You can see your quota with
GET /<IG_USER_ID>/content_publishing_limit. - Check each reel after publishing (step 2). If Meta changes something, it might go out as a normal reel.
- “Improves on its own” means Claude proposes the changes with data; you have the final say.
- Your token is yours: only in the
.env, never in the chat, in screenshots or on GitHub. If it leaks, revoke it in the Meta console. - It’s not a paid or third-party tool: it’s the official Instagram API + Claude.
Checklist
- Professional Instagram account.
- Meta app with “Instagram API with Instagram Login” and your account as a tester.
-
IGAAtoken in.envwith the 3 permissions. - Somewhere to put the MP4 at a public URL for a moment.
- First trial reel uploaded and
is_shared_to_feed=false. - Loop built with Claude Code: one trial a day and a reading every morning.