Mutation
Use the scheduleInstagramPost mutation to schedule content to Instagram:
mutation ScheduleInstagramPost($input: ScheduleInstagramPostInput!) {
scheduleInstagramPost(input: $input) {
success
errors {
field
message
}
post {
id
socialAccount {
id
username
}
publishingStatus
caption
firstComment
collaborators
gallery {
id
galleryMediaSet {
id
media {
url
mimeType
}
}
}
submissions {
id
mediaType
shareToFeed
postAt
publishingMethod
}
}
}
}
Input Parameters
ScheduleInstagramPostInput
SPECIFIC_TIME, QUEUE_NEXT (default: SPECIFIC_TIME).
Only accepted when scheduling a new post. See Scheduling at the Next Open Slot.id, name, or url. See Attaching Media.
Only supported when scheduling new posts, not when updating existing ones.READY_TO_PUBLISH, DRAFT (default: READY_TO_PUBLISH)InstagramPostSubmissionInputType
Each submission defines a specific posting schedule and format:
schedulingMode: QUEUE_NEXT on the post when scheduling a new one, or the post is a draft.
See Drafts without a date.FEED_POST, CAROUSEL, REEL, STORYAUTOMATIC, MANUAL (default: AUTOMATIC)Media Types
Instagram supports four different content types, each with specific requirements:
Feed Post
- Single image or video posted to the main Instagram feed
- Supports square (1:1), portrait (4:5), or landscape (1.91:1) aspect ratios
- Maximum file size: 30MB for videos, 8MB for images
Carousel
- Multiple images and/or videos in a single post (2-10 items)
- All media items appear in a swipeable gallery
- Mixed media types supported (images and videos together)
Reel
- Short-form vertical video content (9:16 aspect ratio recommended)
- Minimum duration: 3 seconds
- Can optionally be shared to the main feed using
shareToFeed: true
Story
- Temporary content that disappears after 24 hours
- Single image or video only
- Vertical format (9:16) recommended
Examples
Feed Post with Single Image
Schedule a basic Instagram feed post with an image from URL.
{
"input": {
"username": "myhandle",
"caption": "Beautiful sunset from our latest adventure! 🌅 #photography #sunset #travel",
"media": [{ "url": "https://example.com/sunset.jpg" }],
"submissions": [
{
"postAt": "2025-12-01T18:00:00Z",
"mediaType": "FEED_POST"
}
]
}
}
Scheduling at the Next Open Slot
Instead of picking a time yourself, pass schedulingMode: QUEUE_NEXT and leave postAt out. Postpone puts the post in the next open slot on the account's Account Schedule, skipping any slot that already has a post on it.
{
"input": {
"username": "myhandle",
"schedulingMode": "QUEUE_NEXT",
"caption": "This one goes out at my next open slot.",
"media": [{ "url": "https://example.com/sunset.jpg" }],
"submissions": [
{
"mediaType": "FEED_POST"
}
]
}
}
Leave postAt off the submissions — the resolved slot becomes the date for all of them.
The account needs a schedule set up for this to work, postAt and QUEUE_NEXT can't be combined, and updateScheduledInstagramPost rejects schedulingMode. See Scheduling at the Next Open Slot for the full rules.
Carousel Post with Multiple Images
Schedule a carousel post with multiple images from your Content Library.
{
"input": {
"username": "myhandle",
"caption": "Behind the scenes from our latest photoshoot! Swipe to see more 📸✨",
"media": [{ "id": "1231" }, { "id": "1233" }, { "id": "1235" }],
"submissions": [
{
"postAt": "2025-12-01T15:30:00Z",
"mediaType": "CAROUSEL"
}
]
}
}
Reel with Feed Sharing
Schedule a Reel that will also appear in the main feed.
{
"input": {
"username": "myhandle",
"caption": "Quick tutorial on our latest technique! Save this for later 💡 #tutorial #tips #howto",
"media": [{ "name": "tutorial-video.mp4" }],
"submissions": [
{
"postAt": "2025-12-01T16:00:00Z",
"mediaType": "REEL",
"shareToFeed": true
}
]
}
}
Instagram Story
Schedule a temporary Story post.
{
"input": {
"username": "myhandle",
"media": [{ "url": "https://example.com/story-image.jpg" }],
"submissions": [
{
"postAt": "2025-12-01T14:00:00Z",
"mediaType": "STORY"
}
]
}
}
Post with Collaborators and First Comment
Schedule a post with tagged collaborators and an automatic first comment.
{
"input": {
"username": "myhandle",
"caption": "Amazing collaboration with some incredible creators! 🤝",
"firstComment": "Thanks to everyone who made this possible! Check out their profiles 👆",
"collaborators": ["collaborator1", "collaborator2", "collaborator3"],
"media": [{ "url": "https://example.com/collab-photo.jpg" }],
"submissions": [
{
"postAt": "2025-12-01T19:00:00Z",
"mediaType": "FEED_POST"
}
]
}
}
Response Types
Success Response
{
"data": {
"scheduleInstagramPost": {
"success": true,
"errors": [],
"post": {
"id": "123",
"socialAccount": {
"id": "456",
"username": "myhandle"
},
"publishingStatus": "READY_TO_PUBLISH",
"caption": "Beautiful sunset from our latest adventure! 🌅 #photography #sunset #travel",
"firstComment": "",
"collaborators": [],
"gallery": {
"id": "789",
"media": [
{
"id": "101",
"url": "https://cdn.example.com/sunset.jpg",
"type": "image"
}
]
},
"submissions": [
{
"id": "112",
"mediaType": "FEED_POST",
"shareToFeed": false,
"postAt": "2025-12-01T18:00:00Z",
"publishingMethod": "AUTOMATIC"
}
]
}
}
}
}
Error Response
{
"data": {
"scheduleInstagramPost": {
"success": false,
"errors": [
{
"field": "caption",
"message": "Instagram captions can have at most 30 hashtags, but yours has 35 (3-5 hashtags recommended)"
}
],
"post": null
}
}
}
Updating a Post
To update an existing scheduled post, use the same input type with the corresponding update mutation and include the post id:
mutation UpdateScheduledInstagramPost($input: ScheduleInstagramPostInput!) {
updateScheduledInstagramPost(input: $input) {
success
errors {
field
message
}
post {
id
}
}
}
Pass the id of the post you want to update in the input, along with the fields you want to change:
{
"input": {
"id": "12345",
"username": "myhandle",
"caption": "Updated caption!",
"submissions": [{"postAt": "2025-12-01T15:30:00Z", "mediaType": "FEED"}]
}
}
id field to specify which post to update. Only scheduled posts that have not been published yet can be updated.postAt is required on an update, so every update states the date the post goes out on — pass the date it already has to leave it where it is. A draft staying a draft is exempt, and a draft you're promoting to READY_TO_PUBLISH needs a date of your choosing; see Drafts without a date.
schedulingMode is not accepted on an update at all; see Scheduling at the Next Open Slot.
Validation Rules
- Caption Length: Maximum 2,200 characters
- Hashtags: Maximum 30 hashtags per caption (3-5 recommended for better reach)
- Collaborators: Maximum 3 collaborators per post
- Carousel Media: 2-10 images/videos per carousel
- Reel Duration: Minimum 3 seconds for video content
- Aspect Ratios: Images must be between 0.558:1 and 1.92:1 (approximately)
- File Sizes: Videos max 30MB, images max 8MB
- GIF Support: GIFs are not supported on Instagram
- Story Limit: Stories can only contain one image or video
- Scheduling: Posts must be scheduled for future dates only
- Account Limits: Respects your plan's monthly post limits
Common Errors
The specified username is not connected to your Postpone account. Connect the account in your settings first.
Your caption contains too many hashtags. Instagram allows a maximum of 30 hashtags, but 3-5 hashtags are recommended for better engagement.
You must include media content. Use media to attach images or videos to your post.
GIF files cannot be posted to Instagram. Convert your GIF to MP4 video format instead.
Your image aspect ratio is outside Instagram's accepted range (0.558:1 to 1.92:1). Crop or resize your image to fit within these limits.
Instagram Reels support only single videos. For multiple videos, use a carousel post instead.
Your video is too short. Instagram Reels require a minimum duration of 3 seconds.
Instagram Stories support only single media items. Use separate submissions for multiple Story posts.
You've included too many media items. Instagram carousels support a maximum of 10 images or videos.
The postAt timestamp must be in the future. Check your timezone settings.
A new post has to say when it goes out: pass a postAt, or schedulingMode: QUEUE_NEXT. Drafts are exempt: leave postAt off one and it is parked on a placeholder date about 30 days out.
schedulingMode isn't accepted on an update, so a postAt is the only way to say when the post goes out. You'll also see it when promoting a parked draft to publishingStatus: READY_TO_PUBLISH without giving it a date.
schedulingMode: QUEUE_NEXT needs an Account Schedule on the account you're posting to. Set one up, or pass an explicit postAt.
schedulingMode is only accepted when scheduling a new post. To move a post that is already scheduled, pass a postAt to updateScheduledInstagramPost.
You've tagged too many collaborators. Instagram allows a maximum of 3 collaborators per post.
You've reached your plan's Instagram post limit for the scheduled month. Upgrade your plan or schedule for a different month.