Platform Limits
Get platform-specific posting limits and constraints, including per-format limits for post types like feed, story, reel, or YouTube short.
Get platform-specific posting limits and constraints, including per-format limits for post types like feed, story, reel, or YouTube short.
/api/v1/social/limits/{platform}Retrieve posting constraints for a specific social media platform.
Replace {platform} with a platform name (case-insensitive).
curl -H "x-api-key: <apiKey>" \
https://dopost.co/api/v1/social/limits/youtubecurl -H "x-api-key: <apiKey>" \
https://dopost.co/api/v1/social/limits/youtubeThe response always has the same shape: a top-level platform string and a limits object. The limits object contains:
| Key | Description |
|---|---|
text | Text/caption constraints (maxLength, required) |
title | Title constraints — only present on platforms that require a separate title (YouTube) |
image | Image constraints (formats, fileSize, dimensions) |
video | General video constraints shared across all post types for this platform |
postTypes | Per-format limits. Each key is a post format name — see below |
postTypespostTypes contains one entry per supported post format. The key names are platform-specific and map directly to the postType / videoType field you pass in the Publish endpoint:
| Platform | postTypes keys | Publish field |
|---|---|---|
| Instagram, Instagram Direct | feed, story, reel, carousel | platformOptions.postType |
| YouTube | video, short | platformOptions.videoType |
feed, reel, story | platformOptions.postType | |
| TikTok | post | (single type) |
| X, Bluesky, Mastodon, Threads | tweet / post | (single type) |
| LinkedIn, LinkedIn Organization | feed | (single type) |
pin | (single type) | |
| Telegram | post | (single type) |
| Google Business Profile | standard, event, offer, media | platformOptions.postType |
Each entry in postTypes includes its own video.duration, maxMediaCount, supportedTypes, aspectRatio, and restrictions. Always use the per-type limits when they differ from the top-level ones. Instagram standalone videos use the same Reel contract whether they are selected as a Reel or as a video shared to Feed.
YouTube is the clearest example of how postTypes works — video and short have different duration limits:
{
"platform": "YOUTUBE",
"limits": {
"text": {
"maxLength": 5000,
"required": false,
"field": "description"
},
"title": {
"maxLength": 100,
"required": true
},
"image": {
"formats": ["image/jpeg", "image/png"],
"fileSize": { "max": 2097152 }
},
"video": {
"duration": { "min": 1, "max": 43200 },
"fileSize": { "max": 274877906944, "recommended": 10737418240 },
"frameRate": { "min": 24, "recommended": 30, "max": 60 },
"bitrate": { "min": 1, "recommended": 8 },
"resolution": {
"min": { "width": 256, "height": 144 },
"recommended": { "width": 1920, "height": 1080 }
},
"codecs": { "video": ["h264", "vp9", "hevc"], "audio": ["aac", "opus"] }
},
"postTypes": {
"video": {
"maxMediaCount": 1,
"requiresMedia": true,
"aspectRatio": { "min": 1.33, "max": 1.78 },
"restrictions": [
"video-only",
"max-file-size-256gb",
"duration-max-12h"
],
"supportedTypes": { "videos": ["video/mp4", "video/mov", "video/avi"] },
"thumbnail": {
"maxCount": 1,
"required": false,
"supportedTypes": { "images": ["image/jpeg", "image/png"] }
},
"video": { "duration": { "min": 1, "max": 43200 } }
},
"short": {
"maxMediaCount": 1,
"requiresMedia": true,
"aspectRatio": { "min": 0.5625, "max": 0.5625 },
"restrictions": ["video-only", "duration-max-60s", "vertical-required"],
"supportedTypes": { "videos": ["video/mp4"] },
"video": { "duration": { "min": 1, "max": 60 } }
}
}
}
}{
"platform": "YOUTUBE",
"limits": {
"text": {
"maxLength": 5000,
"required": false,
"field": "description"
},
"title": {
"maxLength": 100,
"required": true
},
"image": {
"formats": ["image/jpeg", "image/png"],
"fileSize": { "max": 2097152 }
},
"video": {
"duration": { "min": 1, "max": 43200 },
"fileSize": { "max": 274877906944, "recommended": 10737418240 },
"frameRate": { "min": 24, "recommended": 30, "max": 60 },
"bitrate": { "min": 1, "recommended": 8 },
"resolution": {
"min": { "width": 256, "height": 144 },
"recommended": { "width": 1920, "height": 1080 }
},
"codecs": { "video": ["h264", "vp9", "hevc"], "audio": ["aac", "opus"] }
},
"postTypes": {
"video": {
"maxMediaCount": 1,
"requiresMedia": true,
"aspectRatio": { "min": 1.33, "max": 1.78 },
"restrictions": [
"video-only",
"max-file-size-256gb",
"duration-max-12h"
],
"supportedTypes": { "videos": ["video/mp4", "video/mov", "video/avi"] },
"thumbnail": {
"maxCount": 1,
"required": false,
"supportedTypes": { "images": ["image/jpeg", "image/png"] }
},
"video": { "duration": { "min": 1, "max": 43200 } }
},
"short": {
"maxMediaCount": 1,
"requiresMedia": true,
"aspectRatio": { "min": 0.5625, "max": 0.5625 },
"restrictions": ["video-only", "duration-max-60s", "vertical-required"],
"supportedTypes": { "videos": ["video/mp4"] },
"video": { "duration": { "min": 1, "max": 60 } }
}
}
}
}To publish a YouTube Short, pass "videoType": "short" in platformOptions and keep video duration ≤ 60 seconds.
Instagram's postTypes shows how limits differ across feed, story, reel, and carousel:
{
"platform": "INSTAGRAM",
"limits": {
"text": { "maxLength": 2200, "required": false },
"image": {
"formats": ["image/jpeg"],
"fileSize": { "max": 8388608 },
"dimensions": {
"min": { "width": 320, "height": 168 },
"max": { "width": 1440, "height": 1800 },
"heightDependsOnAspectRatio": true,
"autoScalesWidth": true
}
},
"video": {
"duration": { "min": 3, "max": 900 },
"fileSize": { "max": 1000000000, "unit": "bytes" },
"frameRate": { "min": 23, "recommended": 30, "max": 60 },
"bitrate": { "max": 25, "unit": "mbps" },
"resolution": {
"maxHorizontalPixels": 1920,
"recommended": { "width": 1080, "height": 1920 }
},
"codecs": {
"video": ["h264", "hevc"],
"audio": ["aac"],
"audioSampleRateHz": 48000
}
},
"postTypes": {
"feed": {
"maxMediaCount": 1,
"requiresMedia": true,
"aspectRatio": { "min": 0.8, "max": 1.91 },
"supportedTypes": {
"images": ["image/jpeg"],
"videos": ["video/mp4", "video/quicktime"]
},
"video": { "duration": { "min": 3, "max": 900 } }
},
"story": {
"maxMediaCount": 1,
"requiresMedia": true,
"aspectRatio": 0.5625,
"supportedTypes": { "images": ["image/jpeg"], "videos": ["video/mp4"] },
"video": { "duration": { "min": 3, "max": 60 } }
},
"reel": {
"maxMediaCount": 1,
"requiresMedia": true,
"aspectRatio": 0.5625,
"supportedTypes": { "videos": ["video/mp4", "video/quicktime"] },
"video": {
"duration": { "min": 3, "max": 900 },
"fileSize": { "max": 1000000000, "unit": "bytes" }
}
},
"carousel": {
"maxMediaCount": 10,
"requiresMedia": true,
"aspectRatio": { "min": 0.8, "max": 1.91 },
"supportedTypes": { "images": ["image/jpeg"], "videos": ["video/mp4"] },
"video": { "duration": { "min": 3, "max": 180 } }
}
}
}
}{
"platform": "INSTAGRAM",
"limits": {
"text": { "maxLength": 2200, "required": false },
"image": {
"formats": ["image/jpeg"],
"fileSize": { "max": 8388608 },
"dimensions": {
"min": { "width": 320, "height": 168 },
"max": { "width": 1440, "height": 1800 },
"heightDependsOnAspectRatio": true,
"autoScalesWidth": true
}
},
"video": {
"duration": { "min": 3, "max": 900 },
"fileSize": { "max": 1000000000, "unit": "bytes" },
"frameRate": { "min": 23, "recommended": 30, "max": 60 },
"bitrate": { "max": 25, "unit": "mbps" },
"resolution": {
"maxHorizontalPixels": 1920,
"recommended": { "width": 1080, "height": 1920 }
},
"codecs": {
"video": ["h264", "hevc"],
"audio": ["aac"],
"audioSampleRateHz": 48000
}
},
"postTypes": {
"feed": {
"maxMediaCount": 1,
"requiresMedia": true,
"aspectRatio": { "min": 0.8, "max": 1.91 },
"supportedTypes": {
"images": ["image/jpeg"],
"videos": ["video/mp4", "video/quicktime"]
},
"video": { "duration": { "min": 3, "max": 900 } }
},
"story": {
"maxMediaCount": 1,
"requiresMedia": true,
"aspectRatio": 0.5625,
"supportedTypes": { "images": ["image/jpeg"], "videos": ["video/mp4"] },
"video": { "duration": { "min": 3, "max": 60 } }
},
"reel": {
"maxMediaCount": 1,
"requiresMedia": true,
"aspectRatio": 0.5625,
"supportedTypes": { "videos": ["video/mp4", "video/quicktime"] },
"video": {
"duration": { "min": 3, "max": 900 },
"fileSize": { "max": 1000000000, "unit": "bytes" }
}
},
"carousel": {
"maxMediaCount": 10,
"requiresMedia": true,
"aspectRatio": { "min": 0.8, "max": 1.91 },
"supportedTypes": { "images": ["image/jpeg"], "videos": ["video/mp4"] },
"video": { "duration": { "min": 3, "max": 180 } }
}
}
}
}For Instagram API image publishing, JPEG is the only supported image format and the maximum file size is 8 MB. Feed and carousel images must use an aspect ratio from 4:5 (0.8) through 1.91:1. Meta automatically scales widths below 320 px up and widths above 1440 px down, so 1080x1350 is not a hard upload limit and image height varies with width and aspect ratio. In a carousel, Meta crops every item according to the first image's aspect ratio. See Meta's IG User Media image specifications and carousel publishing documentation.
Instagram carousel is set automatically by dopost when you pass multiple media items — you don't need to set postType: "carousel" explicitly. Use "feed", "story", or "reel" for single-media posts.
A Feed video is published as REELS with share_to_feed=true. An explicit Reel can set shareToFeed to choose whether it also appears in Feed. The 3–900 second and 1 GB Reel limits do not apply to carousel video children; the carousel values returned here are DuPost compatibility limits because Meta does not publish an accessible, complete technical table for those children.
Pass any of these as the {platform} parameter (case-insensitive):
| Parameter value | Platform |
|---|---|
x | X (Twitter) |
instagram | Instagram (connected via Meta Business) |
instagram_direct | Instagram (connected directly via Instagram OAuth) |
facebook | |
linkedin | LinkedIn (personal profile) |
linkedin_organization | LinkedIn (company page) |
tiktok | TikTok |
youtube | YouTube |
threads | Threads |
bluesky | Bluesky |
mastodon | Mastodon |
pinterest | |
telegram | Telegram channel or group |
google-business | Google Business Profile location |
Instagram has two connection types: instagram is connected through Meta Business (Facebook Page linked), while instagram_direct is connected directly via Instagram OAuth. LinkedIn also has two: linkedin for personal profiles and linkedin_organization for company pages. Use the value that matches how your account is connected — check with the List Accounts endpoint.
Use this endpoint before publishing to validate that your content meets the platform's requirements.
| Status | Error | Cause |
|---|---|---|
400 | Unknown platform: xyz | Platform name not recognized. Response includes validPlatforms array |
401 | Invalid or missing API key | Bad or missing x-api-key header |
403 | API key does not have permission for this action | API key lacks the required scope for this endpoint |
404 | No configuration found for xyz | Platform exists but has no limits config |
429 | Rate limit exceeded | Too many requests. Check X-RateLimit-* response headers and retry after the indicated time |
GET /api/v1/social/limits/google-business returns rules by post type and category. image.minShortEdge and image.fileSize.min exempt the PROFILE/COVER/LOGO categories listed in minimumExceptions. video.minShortEdge applies to the short edge, including portrait videos. postTypes describes required fields, photo-only categories, CTA and text rules. cta lists supported actions and URL protocols.
integrationLimits identifies dopost's supported subset: one attachment, gallery MP4, photo-only Local Posts, and compatibility caps of 1,500 summary characters, 58 title characters, 100 coupon characters and 5,000 terms characters. Google's REST reference does not publish all of those numeric caps. Conversion recommendations for frame rate, bitrate and codecs are not presented as mandatory provider limits.