How do I post to Instagram with an API, without my own Meta app?
Send a multipart/form-data request to Upload-Post's POST https://api.upload-post.com/api/upload (videos/Reels) or POST /api/upload_photos (photos and carousels) with platform[]=instagram. Upload-Post runs its own approved Meta app with the required Instagram permissions, so you skip the whole Meta developer flow: no app registration, no App Review, no permission approvals, no token refresh logic. You connect the Instagram account once via OAuth in the dashboard. It does have to be a Business or Creator account linked to a Facebook Page (that's an Instagram platform requirement).
Steps
- Create an account at upload-post.com and generate an API key under API Keys (Authentication).
- Connect the Instagram account at Manage Users, approving all requested permissions. To let your users connect their own Instagram accounts inside your product, generate a white-label JWT connect link instead.
- Post a Reel:
- cURL
- Python
- JavaScript
curl \
-H 'Authorization: Apikey your-api-key-here' \
-F 'video=@/path/to/your/video.mp4' \
-F 'title="Your Reel caption"' \
-F 'user="test"' \
-F 'platform[]=instagram' \
-X POST https://api.upload-post.com/api/upload
import requests
response = requests.post(
"https://api.upload-post.com/api/upload",
headers={"Authorization": "Apikey your-api-key-here"},
files={"video": open("/path/to/your/video.mp4", "rb")},
data={
"title": "Your Reel caption",
"user": "test",
"platform[]": "instagram",
},
)
print(response.json())
import fs from "node:fs";
const form = new FormData();
form.append("video", new Blob([fs.readFileSync("/path/to/your/video.mp4")]), "video.mp4");
form.append("title", "Your Reel caption");
form.append("user", "test");
form.append("platform[]", "instagram");
const response = await fetch("https://api.upload-post.com/api/upload", {
method: "POST",
headers: { Authorization: "Apikey your-api-key-here" },
body: form,
});
console.log(await response.json());
Photos and carousels
Use POST /api/upload_photos with a photos[] array (up to 10 items; Instagram also supports mixed photo + video carousels):
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 'title="My mixed carousel"' \
-F 'user="test"' \
-F 'platform[]=instagram'
Useful Instagram parameters
Full list in the Upload Video reference:
| Parameter | What it does | Default |
|---|---|---|
instagram_title | Instagram-specific caption (falls back to title) | title |
media_type | REELS or STORIES | REELS |
share_to_feed | Also show the Reel in the feed | true |
share_mode | Trial Reels: CUSTOM, TRIAL_REELS_SHARE_TO_FOLLOWERS_IF_LIKED, TRIAL_REELS_DONT_SHARE_TO_FOLLOWERS | CUSTOM |
cover_url / cover_image | Custom Reel cover (URL or binary JPEG ≤ 8 MB) | none |
user_tags | Users to tag, e.g. "@user1, user2" (video posts) | none |
collaborators | Comma-separated collaborator usernames | none |
location_id | Instagram location ID | none |
first_comment | Auto-post a first comment after publishing | none |
scheduled_date | ISO-8601 date to schedule the post | none |
Stories: send media_type="STORIES" on either endpoint (video or photo).
Limits and gotchas
- Account type: personal Instagram accounts aren't supported by the Instagram API. Switch to Business/Creator and link a Facebook Page. Error 400 on connect usually means a missing Page or unverified account (FAQ).
- Daily cap: 50 Instagram posts per connected account per rolling 24 h (upload limits).
- Video specs: max 300 MB. See Video Requirements and Photo Requirements.
- Photo tagging uses JSON
user_tagswith x/y coordinates; see Upload Photo.