Why automate Instagram posts via API
If you have ever posted manually through the Instagram app, you know the drill: open the app, pick a file, write a caption, add hashtags, tag people, choose a cover image, and finally hit publish. Now multiply that by five posts a day across multiple client accounts.
The Instagram platform page explains what Upload-Post supports for Instagram specifically. The short version: you can post Reels, single photos, and carousels (multi-image posts) through a single social media API endpoint. No Facebook app review, no token refreshes, no Graph API complexity.
Instagram allows up to 50 uploads per 24 hours through the API, which is more than enough for most use cases. If you need to post across additional platforms simultaneously, see how to post to all platforms at once.
Post an Instagram Reel via API
Reels are the primary content format on Instagram. To post a video as a Reel, send a POST request to the upload endpoint with media_type set to REELS. You can also control how the Reel appears in the feed using share_mode.
curl -X POST https://api.upload-post.com/api/upload \
-H "Authorization: Apikey your-api-key-here" \
-F "[email protected]" \
-F "user=mybrand" \
-F "title=Behind the scenes of our new product launch" \
-F "platform[]=instagram" \
-F "media_type=REELS" \
-F "share_mode=FEED_AND_REELS" \
-F "audio_name=Original Audio" \
-F "cover_url=https://example.com/cover.jpg" Here is what each Instagram-specific parameter does:
media_type=REELStells Instagram to treat this as a Reel rather than a regular feed video.share_mode=FEED_AND_REELSpublishes to both the Reels tab and the main feed. UseREELS_ONLYto keep it out of the feed grid.audio_namesets the name of the embedded audio track that viewers see on the Reel.cover_urlprovides a custom cover image. Without it, Instagram picks a frame from the video.
A successful upload returns the job ID and platform status:
{
"success": true,
"job_id": "job_reel_abc123",
"platforms": {
"instagram": {
"status": "processing",
"user": "mybrand"
}
}
}
You can also set share_to_feed=true or share_to_feed=false as an alternative to share_mode. Both accomplish the same thing. Use thumb_offset to pick a specific frame from the video as the thumbnail (value in milliseconds).
Post photos and carousels
For single photos or carousel (multi-image) posts, use the /api/upload_photos endpoint. Upload multiple files using the photos[] parameter to create a carousel automatically.
curl -X POST https://api.upload-post.com/api/upload_photos \
-H "Authorization: Apikey your-api-key-here" \
-F "photos[][email protected]" \
-F "photos[][email protected]" \
-F "photos[][email protected]" \
-F "user=mybrand" \
-F "title=Our top 3 product picks this month" \
-F "platform[]=instagram" \
-F "instagram_first_comment=#productpicks #trending #shopnow"
When you send more than one file in photos[], Instagram creates a carousel post. Users swipe through the images in the order you uploaded them. A single file creates a standard photo post. Instagram supports up to 10 images per carousel.
You can use instagram_title to set a caption specific to Instagram when posting the same content to multiple platforms at once. This is useful when your Instagram caption needs different hashtags or mentions than what you use on other platforms.
Auto-post a first comment
The instagram_first_comment parameter automatically adds a comment to your post right after it goes live. This is one of the most popular Instagram strategies: keep your caption clean and move all your hashtags into the first comment.
curl -X POST https://api.upload-post.com/api/upload \
-H "Authorization: Apikey your-api-key-here" \
-F "[email protected]" \
-F "user=mybrand" \
-F "title=Quick tutorial: how to use our app" \
-F "platform[]=instagram" \
-F "media_type=REELS" \
-F "instagram_first_comment=#tutorial #howto #apptips #tech #productdemo" Why use a first comment instead of putting hashtags in the caption? Instagram's algorithm treats first-comment hashtags the same way as caption hashtags for discoverability, but your caption looks cleaner. Many brands and creators prefer this approach because it keeps the post visually focused on the message rather than a wall of hashtags.
Use collaborators and user tags
Instagram Collab posts let two accounts co-author a single piece of content. The post appears on both profiles, and engagement (likes, comments, shares) is shared. Use the collaborators parameter to invite collaborators.
curl -X POST https://api.upload-post.com/api/upload \
-H "Authorization: Apikey your-api-key-here" \
-F "[email protected]" \
-F "user=mybrand" \
-F "title=Excited to announce our partnership with @partneraccount" \
-F "platform[]=instagram" \
-F "media_type=REELS" \
-F "collaborators=partneraccount,otheraccount" \
-F "user_tags=partneraccount,photographer_jane" \
-F "location_id=123456789" collaboratorstakes a comma-separated list of Instagram usernames. The invited users receive a notification to accept the collaboration.user_tagstags users in the post itself, similar to tagging people in a photo through the app.location_idattaches a location to the post. You can find location IDs through the Instagram location search or the Facebook Places API.
Schedule Instagram posts
Add scheduled_date to any upload request to publish at a future time. The date must be in ISO-8601 format, and you can optionally specify a timezone.
curl -X POST https://api.upload-post.com/api/upload \
-H "Authorization: Apikey your-api-key-here" \
-F "[email protected]" \
-F "user=mybrand" \
-F "title=Good morning! New content dropping today." \
-F "platform[]=instagram" \
-F "media_type=REELS" \
-F "scheduled_date=2025-09-15T09:00:00Z" \
-F "timezone=America/New_York"
You can also use add_to_queue=true instead of a specific date. The queue system picks the next available time slot based on your configured schedule, which is ideal for batch uploading content without manually picking times. See the full scheduling guide for queue setup, editing scheduled posts, and managing your content calendar.
Automate with Python
The official Python SDK makes it straightforward to build automation scripts. Install it with pip install upload-post and then use the UploadPostClient to interact with the API. For a complete walkthrough, check the Python automation guide.
Here is a full script that posts a Reel, uploads a photo carousel, and schedules content for the week:
from upload_post import UploadPostClient
from datetime import datetime, timedelta
client = UploadPostClient(api_key="your-api-key-here")
# 1. Post a Reel immediately
reel_response = client.upload_video(
video_path="/path/to/reel.mp4",
title="New product walkthrough",
user="mybrand",
platforms=["instagram"],
media_type="REELS",
share_mode="FEED_AND_REELS",
instagram_first_comment="#newproduct #walkthrough #tech"
)
print(f"Reel uploaded: {reel_response['job_id']}")
# 2. Post a carousel of photos
carousel_response = client.upload_photos(
photo_paths=[
"/path/to/photo1.jpg",
"/path/to/photo2.jpg",
"/path/to/photo3.jpg"
],
title="Three angles, one product.",
user="mybrand",
platforms=["instagram"],
collaborators="partneraccount"
)
print(f"Carousel uploaded: {carousel_response['job_id']}")
# 3. Schedule Reels for the next 7 days
videos = [
"monday.mp4", "tuesday.mp4", "wednesday.mp4",
"thursday.mp4", "friday.mp4", "saturday.mp4", "sunday.mp4"
]
for i, video in enumerate(videos):
publish_date = (datetime.now() + timedelta(days=i + 1)).replace(
hour=10, minute=0, second=0, microsecond=0
)
response = client.upload_video(
video_path=f"/path/to/{video}",
title=f"Day {i + 1} of our launch week series",
user="mybrand",
platforms=["instagram"],
media_type="REELS",
scheduled_date=publish_date.isoformat(),
timezone="Europe/Madrid"
)
print(f"Scheduled {video} for {publish_date}: {response['job_id']}")
This script schedules one Reel per day at 10:00 AM Madrid time for an entire week. Adjust the hour, timezone, and file paths to match your workflow. For bulk upload scenarios, you can read video paths from a directory or a CSV file and loop through them the same way.
No-code automation: n8n and Make.com
If you prefer visual workflows over writing code, both n8n and Make.com work with Upload-Post out of the box.
n8n
n8n is an open-source workflow automation tool. You can use the HTTP Request node to call the Upload-Post API. We have a ready-made Instagram Reels n8n template that reads video files from Google Drive, adds captions from a Google Sheet, and posts them as Reels automatically. Browse all available n8n templates for more setups.
Make.com
Make.com (formerly Integromat) uses a scenario-based approach. Add an HTTP module, configure it with the Upload-Post endpoint and your API key, and connect it to any trigger: new row in Google Sheets, new file in Dropbox, a scheduled timer, and so on. The result is the same as writing code, but with a drag-and-drop interface.
Both tools support scheduling parameters (scheduled_date, add_to_queue), so you can build a complete Instagram content calendar without touching a terminal.
Instagram content requirements
Upload-Post automatically adapts your content where possible (using the built-in FFmpeg API), but it helps to know what Instagram expects so you can optimize for quality.
| Format | Spec | Details |
|---|---|---|
| Video (Reels) | Max file size | 1 GB |
| Formats | MP4, MOV | |
| Aspect ratio | 9:16 recommended, 1:1 and 4:5 supported | |
| Duration | 3 seconds to 15 minutes | |
| Resolution | 1080x1920 recommended | |
| Photo | Max file size | 8 MB |
| Formats | JPEG, PNG | |
| Aspect ratio | 1:1, 4:5, 1.91:1 | |
| Max dimensions | 1440x1440 (square), 1080x1350 (portrait) | |
| Carousel | Max images | 10 per post |
| Mixed media | Photos and videos can be combined |
Frequently asked questions
Does this work with Instagram personal accounts?
No. Instagram's API only supports Business and Creator accounts. Personal accounts cannot be accessed through any official API. The good news is that switching to a Business or Creator account is free and takes about 30 seconds in the Instagram app settings. You do need to connect it to a Facebook Page, which Upload-Post handles during the account linking process.
Can I post Instagram Stories via API?
Instagram's official API does not support publishing Stories. This is a limitation imposed by Meta, not by Upload-Post. Stories can only be created through the Instagram app itself. If Stories support becomes available through the API in the future, Upload-Post will add it.
Will automated posts get my account shadowbanned?
No. Upload-Post uses Instagram's official Content Publishing API (the same API that Hootsuite, Buffer, and every other authorized tool uses). Your posts go through Instagram's official pipeline, so there is no risk of shadowbanning or account penalties. This is fundamentally different from browser automation or unofficial bots, which do violate Instagram's terms. If you are currently using a tool like Hootsuite or Later, Upload-Post is a developer-friendly alternative that uses the same official access.
Is there a free tier?
Yes. Every Upload-Post account includes 10 free uploads per month with no credit card required. That is enough to test the API, validate your workflow, and confirm everything works before committing to a paid plan. Check the social media holiday calendar to plan your first posts around upcoming events.