Instagram Reels user_tags API: usernames only, not on-screen text
user_tags on a Reel tags public accounts by username; x and y apply to images and stories. A handle burned into the video is not a tag. How to do both.

To tag people on a Reel through the Instagram API, send user_tags as an array of objects with a public username. The x and y coordinates are only for images and stories, so a Reel needs the username alone. A handle you burn into the pixels with captions is just text: it notifies nobody and tags nobody.
The facts below are from Meta's IG User Media reference, read 2026-10-02, and the changelog. Sume's video captions handles the on-screen version; the tag itself is a publish-time parameter that Sume does not send.
What does user_tags accept on a Reel?
Meta lists user_tags as required for user tagging in images, videos and stories, an array of public usernames. For each object username is required. x and y are floats from 0.0 to 1.0, required for images and optional for stories, and Meta says they apply only to images and stories. The reel container example on the same page lists user_tags alongside collaborators, cover_url, audio_name and location_id.
So the minimum Reel tag is a username and nothing else. The tagged account has to be public.
| Media | username | x / y |
|---|---|---|
| Image | Required | Required |
| Story | Required | Optional |
| Reel | Required | Applies only to images and stories |
Why is a burned-in handle not the same thing?
A caption rendered into the video is part of the frames. Instagram never reads it, so there is no tag chip, and no notification. The tag is a field on the container.
The two do different jobs. The tag creates the platform relationship. The on-screen handle helps a viewer who sees the Reel reposted or screen-recorded somewhere without the tag UI. If you want both, keep them consistent: the same spelling, the same account.
How do I burn a handle with Sume?
Standalone video captions accept authored overlay copy as cues with text, start and end in seconds, which skips speech-to-text, so it also works on a silent clip. style and design control the look, and design.placement.anchor_ratio sets the line centre as a fraction of frame height.
The docs list the standalone caption at $0.20 for videos up to 60 seconds; check GET /v1/catalog for the live price. The source video_url must be a fetchable public HTTPS URL.
curl -X POST https://api.sume.com/v1/video-captions \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: reel-handle-001" \
-d '{
"video_url": "https://media.sume.com/artifacts/artf_demo/reel.mp4",
"style": "slam",
"cues": [{"text": "@ig_user_name", "start": 0.5, "end": 3.0}]
}'How do I send the real tag, and what if it fails?
Send user_tags in the same container request as media_type=REELS and video_url. Meta's page shows the encoded form user_tags=%5B%7Busername:ig_user_name%7D%5D for a GET-style request; with a JSON body, send an array.
Tagging can fail after the post succeeds. Since the 2026-09-28 changelog entry, a successful media_publish can include a config_issue field, and USER_TAGGING_FAILURE means the media published without its user tags. Read that field on every publish response instead of assuming the tags landed; see config_issue and caption not attached for the handling pattern.
Also note the caption limits: 2,200 characters, 30 hashtags and 20 @ tags, per Meta's reference.
curl -X POST "https://graph.instagram.com/v26.0/$IG_USER_ID/media" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"media_type": "REELS",
"video_url": "https://media.sume.com/artifacts/artf_demo/reel-captioned.mp4",
"user_tags": [{"username": "ig_user_name"}]
}'What should I check before bulk-tagging?
Tagging many accounts in one run multiplies the failure modes. Keep the tagged username list next to each video, validate that every account is public before the container call, and cap the list under the caption's own @ tag limit if you also mention people in the caption. A mention in the caption and a tag in user_tags are separate mechanisms with separate failure paths.
If a publish reports USER_TAGGING_FAILURE, do not re-publish the whole Reel: that would create a duplicate post. Log it, and fix the tag in the Instagram app or through the supported edit path.
Sources
Related posts
More in Developers
- Reels views vs crossposted_views vs facebook_views: which to report
Instagram Reels insights list views, crossposted_views and facebook_views separately. Which to report, and how to trace Sume-made variants.
- Clickable transcript from Sume STT word timestamps in Python
Turn a Sume speech-to-text result into HTML where each word seeks the audio player to its start time. Runnable Python, with the result envelope handled safely.
- Jan allow-all MCP permissions and smart routing with Sume tools
Jan can auto-approve every MCP tool call and narrow which servers it queries. What each does to paid Sume calls, and how to keep a spend check.
- Jan MCP tool call timeout of 30 seconds vs Sume jobs_wait
Jan times out MCP tool calls after 30 seconds by default, while a Sume jobs_wait slice can run 50 to 55 seconds. How to set them so a render never looks failed.
Written by Sume