# Publishing

Endpoints related to publishing content, such as posts and drafts.

## Upload media from URL

> \# General\
> \
> This endpoint allows users to upload media by providing a URL. The uploaded media will be processed and stored, returning a new media URL that is used to publish a new post. Most of the platforms require validated URLs for posting images.\
> \
> You can upload:\
> \
> \- publicly accessible URLs\
> \
> \- \_base64\_ encoded image data\
> \
> Media uploads are limited to 1GB file size or smaller.\
> \
> Media upload has a user-level rate limit of \*\*10 requests / minute\*\*.\
> \
> \# Upload Google Drive\
> \
> If you have a link in google drive like this:\
> \
> <[https://drive.google.com/file/d/18-UgDEaKG7YR7AewIDd\\\_Qi4QCLCX5Kop/view?usp=drivesdk>\\](https://drive.google.com/file/d/18-UgDEaKG7YR7AewIDd\\_Qi4QCLCX5Kop/view?usp=drivesdk>\\)
> \
> You can use the following link for your Blotato "upload media" API call:\
> \
> <[https://drive.google.com/uc?export=download\\\&id=18-UgDEaKG7YR7AewIDd\\\_Qi4QCLCX5Kop>\\](https://drive.google.com/uc?export=download\\\&id=18-UgDEaKG7YR7AewIDd\\_Qi4QCLCX5Kop>\\)
> \
> Note how the IDs match: \`18-UgDEaKG7YR7AewIDd\_Qi4QCLCX5Kop\`\
> \
> To see examples of how to upload to Blotato from a Google Drive, you can also check out these tutorials and templates:\
> \
> n8n: <[https://youtu.be/D9okDd\\\_1tBI>\\](https://youtu.be/D9okDd\\_1tBI>\\)
> \
> make: <[https://youtu.be/f4Stdm4lDNM>\\](https://youtu.be/f4Stdm4lDNM>\\)
> \
> \# Seeing error "Google Drive can't scan this file for viruses"?\
> \
> This is the \*\*most common issue\*\* when using Google Drive. When you try to access your file, you see this popup "Google Drive can't scan this file for viruses".\
> \
> The issue is when you host a large video on google drive, it will show this popup, which prevents Blotato from accessing the video.\
> \
> Recommended workaround: if you're regularly posting large videos (100MB+), I recommend using frame.io, an AWS S3 bucket, or similar tool where there is no issue passing around large video files.

```json
{"openapi":"3.0.3","info":{"title":"Blotato API","version":"2.0.0"},"tags":[{"name":"publishing","description":"Endpoints related to publishing content, such as posts and drafts."}],"servers":[{"url":"https://backend.blotato.com","description":"Blotato API Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"blotato-api-key","in":"header"}}},"paths":{"/v2/media":{"post":{"summary":"Upload media from URL","tags":["publishing"],"description":"# General\n\nThis endpoint allows users to upload media by providing a URL. The uploaded media will be processed and stored, returning a new media URL that is used to publish a new post. Most of the platforms require validated URLs for posting images.\n\nYou can upload:\n\n- publicly accessible URLs\n\n- _base64_ encoded image data\n\nMedia uploads are limited to 1GB file size or smaller.\n\nMedia upload has a user-level rate limit of **10 requests / minute**.\n\n# Upload Google Drive\n\nIf you have a link in google drive like this:\n\n<https://drive.google.com/file/d/18-UgDEaKG7YR7AewIDd_Qi4QCLCX5Kop/view?usp=drivesdk>\n\nYou can use the following link for your Blotato \"upload media\" API call:\n\n<https://drive.google.com/uc?export=download&id=18-UgDEaKG7YR7AewIDd_Qi4QCLCX5Kop>\n\nNote how the IDs match: `18-UgDEaKG7YR7AewIDd_Qi4QCLCX5Kop`\n\nTo see examples of how to upload to Blotato from a Google Drive, you can also check out these tutorials and templates:\n\nn8n: <https://youtu.be/D9okDd_1tBI>\n\nmake: <https://youtu.be/f4Stdm4lDNM>\n\n# Seeing error \"Google Drive can't scan this file for viruses\"?\n\nThis is the **most common issue** when using Google Drive. When you try to access your file, you see this popup \"Google Drive can't scan this file for viruses\".\n\nThe issue is when you host a large video on google drive, it will show this popup, which prevents Blotato from accessing the video.\n\nRecommended workaround: if you're regularly posting large videos (100MB+), I recommend using frame.io, an AWS S3 bucket, or similar tool where there is no issue passing around large video files.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"description":"The URL of the media to upload.","type":"string"}},"required":["url"]}}},"required":true},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"description":"Uploaded and validated blotato media URL.","type":"string"},"id":{"description":"The internal ID of the uploaded media.","type":"string"}},"required":["url","id"]}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Validation error","type":"string"}},"required":["message"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"description":"Rate limit exceeded","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Rate limit exceeded","type":"string"}},"required":["message"]}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"description":"Server error","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"An error occurred","type":"string"}},"required":["message"]}}}}}}}}}
```

## Create presigned upload URL

> Creates a presigned URL for direct file upload. Use this when you have a local file to upload rather than a publicly accessible URL. The returned \`presignedUrl\` accepts a PUT request with the file body, and \`publicUrl\` is the final media URL to use when publishing a post.

```json
{"openapi":"3.0.3","info":{"title":"Blotato API","version":"2.0.0"},"tags":[{"name":"publishing","description":"Endpoints related to publishing content, such as posts and drafts."}],"servers":[{"url":"https://backend.blotato.com","description":"Blotato API Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"blotato-api-key","in":"header"}}},"paths":{"/v2/media/uploads":{"post":{"summary":"Create presigned upload URL","tags":["publishing"],"description":"Creates a presigned URL for direct file upload. Use this when you have a local file to upload rather than a publicly accessible URL. The returned `presignedUrl` accepts a PUT request with the file body, and `publicUrl` is the final media URL to use when publishing a post.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"description":"The filename including extension, used to determine content type.","type":"string"}},"required":["filename"]}}},"required":true},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"presignedUrl":{"description":"URL to PUT the file to. Expires after a short period.","type":"string"},"publicUrl":{"description":"The final public URL of the uploaded media, to be used when creating a post.","type":"string"}},"required":["presignedUrl","publicUrl"]}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"}},"required":["message"]}}}}}}}}}
```

## Create a new post

> \# General\
> \
> Creates a new post with the provided content and optional scheduling. The post can be published immediately or scheduled for a later time.\
> \
> Every post is scheduled on a queue. Failed posts are available at <[https://my.blotato.com/failed>](https://my.blotato.com/failed>). The most common issue of failed post is incorrect JSON structure. Please make sure that JSON payload conforms to the structure described above. If you are still having trouble with identifying the issue, please contact support via Intercom and provide your \`postSubmissionId\`.\
> \
> Post creation has a user-level rate limit of \*\*30 requests / minute\*\* to prevent spamming / abusing social media endpoints\
> \
> \
> \# Examples\
> \
> \## Post to a Platform Immediately\
> \
> \`\`\`\
> POST <https://backend.blotato.com/v2/posts> HTTP/1.1\
> Content-Type: application/json\
> Headers:\
> \
> {\
> &#x20; "post": {\
> &#x20;   "accountId": "acc\_12345",\
> &#x20;   "content": {\
> &#x20;     "text": "Hello, world!",\
> &#x20;     "mediaUrls": \[],\
> &#x20;     "platform": "twitter"\
> &#x20;   },\
> &#x20;   "target": {\
> &#x20;     "targetType": "twitter"\
> &#x20;   }\
> &#x20; }\
> }\
> \`\`\`\
> \
> \## Post at a Scheduled Time\
> \
> \`\`\`\
> POST <https://backend.blotato.com/v2/posts> HTTP/1.1\
> Content-Type: application/json\
> \
> {\
> &#x20; "post": {\
> &#x20;   "accountId": "acc\_67890",\
> &#x20;   "content": {\
> &#x20;     "text": "Scheduled post example",\
> &#x20;     "mediaUrls": \[],\
> &#x20;     "platform": "facebook"\
> &#x20;   },\
> &#x20;   "target": {\
> &#x20;     "targetType": "facebook",\
> &#x20;     "pageId": "987654321"\
> &#x20;   }\
> &#x20; },\
> &#x20; "scheduledTime": "2025-03-10T15:30:00Z"\
> }\
> \`\`\`\
> \
> \## Post an Image or a Video\
> \
> \`\`\`\
> POST <https://backend.blotato.com/v2/posts> HTTP/1.1\
> Content-Type: application/json\
> \
> {\
> &#x20; "post": {\
> &#x20;   "accountId": "acc\_24680",\
> &#x20;   "content": {\
> &#x20;     "text": "Check out this image!",\
> &#x20;     "mediaUrls": \[\
> &#x20;       "<https://example.com/image1.jpg",\\>
> &#x20;       "<https://example.com/image2.jpg"\\>
> &#x20;     ],\
> &#x20;     "platform": "instagram"\
> &#x20;   },\
> &#x20;   "target": {\
> &#x20;     "targetType": "instagram"\
> &#x20;   }\
> &#x20; }\
> }\
> \`\`\`\
> \
> \## Post a Twitter-like Thread with Multiple Posts\
> \
> \`\`\`\
> POST <https://backend.blotato.com/v2/posts> HTTP/1.1\
> Content-Type: application/json\
> Headers:\
> \
> POST <https://backend.blotato.com/v2/posts> HTTP/1.1\
> Content-Type: application/json\
> \
> {\
> &#x20; "post": {\
> &#x20;   "accountId": "acc\_13579",\
> &#x20;   "content": {\
> &#x20;     "text": "This is the first tweet in the thread.",\
> &#x20;     "mediaUrls": \[],\
> &#x20;     "platform": "twitter",\
> &#x20;     "additionalPosts": \[\
> &#x20;       {\
> &#x20;         "text": "Here's the second tweet, adding more info.",\
> &#x20;         "mediaUrls": \[]\
> &#x20;       },\
> &#x20;       {\
> &#x20;         "text": "And here's the third tweet to conclude!",\
> &#x20;         "mediaUrls": \[]\
> &#x20;       }\
> &#x20;     ]\
> &#x20;   },\
> &#x20;   "target": {\
> &#x20;     "targetType": "twitter"\
> &#x20;   }\
> &#x20; }\
> }\
> \`\`\`

````json
{"openapi":"3.0.3","info":{"title":"Blotato API","version":"2.0.0"},"tags":[{"name":"publishing","description":"Endpoints related to publishing content, such as posts and drafts."}],"servers":[{"url":"https://backend.blotato.com","description":"Blotato API Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"blotato-api-key","in":"header"}}},"paths":{"/v2/posts":{"post":{"summary":"Create a new post","tags":["publishing"],"description":"# General\n\nCreates a new post with the provided content and optional scheduling. The post can be published immediately or scheduled for a later time.\n\nEvery post is scheduled on a queue. Failed posts are available at <https://my.blotato.com/failed>. The most common issue of failed post is incorrect JSON structure. Please make sure that JSON payload conforms to the structure described above. If you are still having trouble with identifying the issue, please contact support via Intercom and provide your `postSubmissionId`.\n\nPost creation has a user-level rate limit of **30 requests / minute** to prevent spamming / abusing social media endpoints\n\n\n# Examples\n\n## Post to a Platform Immediately\n\n```\nPOST https://backend.blotato.com/v2/posts HTTP/1.1\nContent-Type: application/json\nHeaders:\n\n{\n  \"post\": {\n    \"accountId\": \"acc_12345\",\n    \"content\": {\n      \"text\": \"Hello, world!\",\n      \"mediaUrls\": [],\n      \"platform\": \"twitter\"\n    },\n    \"target\": {\n      \"targetType\": \"twitter\"\n    }\n  }\n}\n```\n\n## Post at a Scheduled Time\n\n```\nPOST https://backend.blotato.com/v2/posts HTTP/1.1\nContent-Type: application/json\n\n{\n  \"post\": {\n    \"accountId\": \"acc_67890\",\n    \"content\": {\n      \"text\": \"Scheduled post example\",\n      \"mediaUrls\": [],\n      \"platform\": \"facebook\"\n    },\n    \"target\": {\n      \"targetType\": \"facebook\",\n      \"pageId\": \"987654321\"\n    }\n  },\n  \"scheduledTime\": \"2025-03-10T15:30:00Z\"\n}\n```\n\n## Post an Image or a Video\n\n```\nPOST https://backend.blotato.com/v2/posts HTTP/1.1\nContent-Type: application/json\n\n{\n  \"post\": {\n    \"accountId\": \"acc_24680\",\n    \"content\": {\n      \"text\": \"Check out this image!\",\n      \"mediaUrls\": [\n        \"https://example.com/image1.jpg\",\n        \"https://example.com/image2.jpg\"\n      ],\n      \"platform\": \"instagram\"\n    },\n    \"target\": {\n      \"targetType\": \"instagram\"\n    }\n  }\n}\n```\n\n## Post a Twitter-like Thread with Multiple Posts\n\n```\nPOST https://backend.blotato.com/v2/posts HTTP/1.1\nContent-Type: application/json\nHeaders:\n\nPOST https://backend.blotato.com/v2/posts HTTP/1.1\nContent-Type: application/json\n\n{\n  \"post\": {\n    \"accountId\": \"acc_13579\",\n    \"content\": {\n      \"text\": \"This is the first tweet in the thread.\",\n      \"mediaUrls\": [],\n      \"platform\": \"twitter\",\n      \"additionalPosts\": [\n        {\n          \"text\": \"Here's the second tweet, adding more info.\",\n          \"mediaUrls\": []\n        },\n        {\n          \"text\": \"And here's the third tweet to conclude!\",\n          \"mediaUrls\": []\n        }\n      ]\n    },\n    \"target\": {\n      \"targetType\": \"twitter\"\n    }\n  }\n}\n```","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"post":{"type":"object","properties":{"accountId":{"description":"The ID of the social media account to publish the content to.","type":"string"},"content":{"type":"object","allOf":[{"type":"object","properties":{"text":{"description":"The text content of the post.","type":"string"},"mediaUrls":{"description":"List of media URLs to include in the post.","type":"array","items":{"description":"URLs of media files (images, videos) to include in the post. Must originate from the blotato domain. Use the media upload endpoint to upload media files before publishing.","type":"string"}}},"required":["text","mediaUrls"]},{"type":"object","properties":{"platform":{"description":"Social media platform","type":"string","enum":["twitter","instagram","linkedin","facebook","tiktok","pinterest","threads","bluesky","youtube","other"]},"additionalPosts":{"type":"array","items":{"type":"object","properties":{"text":{"description":"The text content of the post.","type":"string"},"mediaUrls":{"description":"List of media URLs to include in the post.","type":"array","items":{"description":"URLs of media files (images, videos) to include in the post. Must originate from the blotato domain. Use the media upload endpoint to upload media files before publishing.","type":"string"}}},"required":["text","mediaUrls"]}}},"required":["platform"]}]},"target":{"type":"object","discriminator":{"propertyName":"targetType"},"oneOf":[{"type":"object","properties":{"targetType":{"description":"Publish to a custom webhook.","type":"string","enum":["webhook"]},"url":{"minLength":1,"description":"The URL of the webhook to publish to.","type":"string"}},"required":["targetType","url"]},{"type":"object","properties":{"targetType":{"description":"Publish to Twitter.","type":"string","enum":["twitter"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to LinkedIn.","type":"string","enum":["linkedin"]},"pageId":{"minLength":1,"description":"The ID of the LinkedIn page to publish to.","type":"string"}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to Facebook.","type":"string","enum":["facebook"]},"pageId":{"pattern":"^\\d+$","description":"The ID of the Facebook page to publish to.","type":"string"},"mediaType":{"description":"Whether the media is a reel or video.","type":"string","enum":["reel","video"]},"link":{"minLength":1,"description":"Link preview to attach to the Facebook post.","type":"string"}},"required":["targetType","pageId"]},{"type":"object","properties":{"targetType":{"description":"Publish to Instagram.","type":"string","enum":["instagram"]},"mediaType":{"description":"Whether the media is a reel or story.","type":"string","enum":["reel","story"]},"altText":{"minLength":1,"maxLength":1000,"description":"Alternative text, for accessibility purposes. Only supported on a single image or image media in a carousel.","type":"string"},"shareToFeed":{"description":"Whether to also share the reel to the Instagram feed. Only applicable for reels.","type":"boolean"},"audioName":{"minLength":1,"maxLength":2200,"description":"For Reels only. Name of the audio of your Reels media. You can only rename once, either while creating a reel or after from the audio page.","type":"string"},"collaborators":{"description":"List of collaborators to add to the Instagram post.","minItems":1,"maxItems":3,"type":"array","items":{"minLength":1,"description":"The Instagram usernames of the collaborator to add to the post.","type":"string"}},"coverImageUrl":{"minLength":1,"description":"URL of the cover image to use for the Instagram post. Use the media upload endpoint to upload media files before publishing. Maximum file size is 8MB. Only applicable to reels.","type":"string"},"trial":{"description":"Settings for trial reels. Trial reels are shown only to non-followers.","type":"object","properties":{"graduationStrategy":{"description":"Strategy to use to determine when to graduate post from trial (convert the trial reel to a reel, sharing it to followers).","type":"string","enum":["MANUAL","SS_PERFORMANCE"]}},"required":["graduationStrategy"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to TikTok.","type":"string","enum":["tiktok"]},"privacyLevel":{"description":"The privacy level of the TikTok post.","type":"string","enum":["SELF_ONLY","PUBLIC_TO_EVERYONE","MUTUAL_FOLLOW_FRIENDS","FOLLOWER_OF_CREATOR"]},"disabledComments":{"description":"Whether to disable comments on the TikTok post.","type":"boolean"},"disabledDuet":{"description":"Whether to disable duet on the TikTok post.","type":"boolean"},"disabledStitch":{"description":"Whether to disable stitch on the TikTok post.","type":"boolean"},"isBrandedContent":{"description":"Whether the TikTok post is branded content.","type":"boolean"},"isYourBrand":{"description":"Whether the TikTok post is for your brand.","type":"boolean"},"isAiGenerated":{"description":"Whether the TikTok post is AI-generated.","type":"boolean"},"title":{"minLength":1,"maxLength":90,"description":"Title for the image posts. If notprovided, the first 90 characters of the post.content.text will be used.","type":"string"},"autoAddMusic":{"description":"Whether to automatically add music to the TikTok image posts.","type":"boolean"},"isDraft":{"description":"Don't publish the post immediately, save it as a draft instead. Default is false.","type":"boolean"},"imageCoverIndex":{"minimum":0,"description":"Index of the image (starts from 0) to use as the cover for carousel posts. Only applicable for carousel image posts.","type":"number"},"videoCoverTimestamp":{"minimum":0,"description":"Location in milliseconds of the video to use as the cover image. Only applicable for video posts. If not provided, the frame as 0 milliseconds will be used.","type":"number"}},"required":["targetType","privacyLevel","disabledComments","disabledDuet","disabledStitch","isBrandedContent","isYourBrand","isAiGenerated"]},{"type":"object","properties":{"targetType":{"description":"Publish to Pinterest.","type":"string","enum":["pinterest"]},"boardId":{"minLength":1,"description":"The ID of the Pinterest board to publish to.","type":"string"},"title":{"minLength":1,"maxLength":100,"description":"Title for the Pinterest post.","type":"string"},"link":{"maxLength":2048,"description":"Link for the Pinterest post.","type":"string"},"altText":{"maxLength":500,"description":"Alternative text for the Pinterest post, for accessibility purposes.","type":"string"}},"required":["targetType","boardId"]},{"type":"object","properties":{"targetType":{"description":"Publish to Threads.","type":"string","enum":["threads"]},"replyControl":{"description":"Who can reply to the Threads post.","type":"string","enum":["everyone","accounts_you_follow","mentioned_only"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to Bluesky.","type":"string","enum":["bluesky"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to YouTube.","type":"string","enum":["youtube"]},"title":{"minLength":1,"maxLength":100,"pattern":"^[^<>]*$","description":"Title for the YouTube post. Must not contain '>' nor '<' characters.","errorMessage":{"pattern":"must not contain '>' nor '<'"},"type":"string"},"privacyStatus":{"description":"The privacy status of the YouTube post.","type":"string","enum":["private","public","unlisted"]},"shouldNotifySubscribers":{"description":"Whether to notify subscribers about the YouTube post.","type":"boolean"},"isMadeForKids":{"description":"Whether the YouTube post is made for kids.","type":"boolean"},"containsSyntheticMedia":{"description":"Whether the media contains synthetic content, such as AI-generated images or deepfake videos. Default is false.","type":"boolean"}},"required":["targetType","title","privacyStatus","shouldNotifySubscribers"]}]}},"required":["accountId","content","target"]},"postDraftId":{"description":"The ID of the existing post draft to use for creating the post. Unused in the API call","type":"string"},"useNextFreeSlot":{"description":"If provided, indicates whether to use the next available free slot for scheduling the post. If set to true, the post will be scheduled at the next available slot time for the specified platform. If neither `scheduledTime` nor `slot` is provided, and this is set to true, the post will be scheduled at the next available slot time.","type":"boolean"},"slot":{"description":"The schedule slot to use for scheduling the post. If neither `scheduledTime` nor `slot` is provided, the post will be published immediately.","type":"object","properties":{"id":{"description":"The ID of the schedule slot to use for scheduling.","type":"string"},"time":{"description":"The timestamp (ISO 8601) when the post should be published.","type":"string"}},"required":["id","time"]},"scheduledTime":{"description":"The timestamp (ISO 8601) when the post should be published.","type":"string"}},"required":["post"]}}},"required":true},"responses":{"201":{"description":"Submitted","content":{"application/json":{"schema":{"description":"Submitted","type":"object","properties":{"postSubmissionId":{"description":"The ID of the post submission. Use this ID to track the status of the post.","type":"string"}},"required":["postSubmissionId"]}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Validation error","type":"string"}},"required":["message"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"description":"Rate limit exceeded","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Rate limit exceeded","type":"string"}},"required":["message"]}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"description":"Server error","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"An error occurred","type":"string"}},"required":["message"]}}}}}}}}}
````

## Get post status

> Fetches the status of a post by its submission ID. This is useful for checking if a post was successfully published or if it failed. Post lookup has a user-level rate limit of \*\*60 requests / minute\*\* to prevent spamming / abusing social media endpoints

```json
{"openapi":"3.0.3","info":{"title":"Blotato API","version":"2.0.0"},"tags":[{"name":"publishing","description":"Endpoints related to publishing content, such as posts and drafts."}],"servers":[{"url":"https://backend.blotato.com","description":"Blotato API Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"blotato-api-key","in":"header"}}},"paths":{"/v2/posts/{postSubmissionId}":{"get":{"summary":"Get post status","tags":["publishing"],"description":"Fetches the status of a post by its submission ID. This is useful for checking if a post was successfully published or if it failed. Post lookup has a user-level rate limit of **60 requests / minute** to prevent spamming / abusing social media endpoints","parameters":[{"schema":{"type":"string"},"in":"path","name":"postSubmissionId","required":true,"description":"The ID of the post submission to check."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"postSubmissionId":{"description":"The ID of the post submission.","type":"string"},"status":{"description":"The current status of the post.","type":"string","enum":["in-progress","failed","published","scheduled"]},"scheduledTime":{"description":"The scheduled time of the post if it is scheduled. Null if the post was published immediately.","type":"string"},"publicUrl":{"description":"The public URL of the post if it was published.","type":"string"},"errorMessage":{"description":"The error message if the post failed.","type":"string"}},"required":["postSubmissionId","status"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"description":"Not found","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Resource not found","type":"string"}},"required":["message"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"description":"Rate limit exceeded","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Rate limit exceeded","type":"string"}},"required":["message"]}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"description":"Server error","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"An error occurred","type":"string"}},"required":["message"]}}}}}}}}}
```

## List scheduled posts

> Fetches the current user's scheduled posts, ordered by scheduled time (ascending). Supports cursor-based pagination. Only returns posts scheduled in the future.

```json
{"openapi":"3.0.3","info":{"title":"Blotato API","version":"2.0.0"},"tags":[{"name":"publishing","description":"Endpoints related to publishing content, such as posts and drafts."}],"servers":[{"url":"https://backend.blotato.com","description":"Blotato API Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"blotato-api-key","in":"header"}}},"paths":{"/v2/schedules":{"get":{"summary":"List scheduled posts","tags":["publishing"],"description":"Fetches the current user's scheduled posts, ordered by scheduled time (ascending). Supports cursor-based pagination. Only returns posts scheduled in the future.","parameters":[{"schema":{"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"account":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"username":{"type":"string"},"profileImageUrl":{"type":"string","nullable":true},"subaccountId":{"type":"string","nullable":true},"subId":{"type":"string","nullable":true},"subaccountName":{"type":"string","nullable":true}},"required":["id","name","username","profileImageUrl","subaccountId","subId","subaccountName"],"nullable":true},"draft":{"type":"object","properties":{"accountId":{"description":"The ID of the social media account to publish the content to.","type":"string"},"content":{"type":"object","allOf":[{"type":"object","properties":{"text":{"description":"The text content of the post.","type":"string"},"mediaUrls":{"description":"List of media URLs to include in the post.","type":"array","items":{"description":"URLs of media files (images, videos) to include in the post. Must originate from the blotato domain. Use the media upload endpoint to upload media files before publishing.","type":"string"}}},"required":["text","mediaUrls"]},{"type":"object","properties":{"platform":{"description":"Social media platform","type":"string","enum":["twitter","instagram","linkedin","facebook","tiktok","pinterest","threads","bluesky","youtube","other"]},"additionalPosts":{"type":"array","items":{"type":"object","properties":{"text":{"description":"The text content of the post.","type":"string"},"mediaUrls":{"description":"List of media URLs to include in the post.","type":"array","items":{"description":"URLs of media files (images, videos) to include in the post. Must originate from the blotato domain. Use the media upload endpoint to upload media files before publishing.","type":"string"}}},"required":["text","mediaUrls"]}}},"required":["platform"]}]},"target":{"type":"object","discriminator":{"propertyName":"targetType"},"oneOf":[{"type":"object","properties":{"targetType":{"description":"Publish to a custom webhook.","type":"string","enum":["webhook"]},"url":{"minLength":1,"description":"The URL of the webhook to publish to.","type":"string"}},"required":["targetType","url"]},{"type":"object","properties":{"targetType":{"description":"Publish to Twitter.","type":"string","enum":["twitter"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to LinkedIn.","type":"string","enum":["linkedin"]},"pageId":{"minLength":1,"description":"The ID of the LinkedIn page to publish to.","type":"string"}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to Facebook.","type":"string","enum":["facebook"]},"pageId":{"pattern":"^\\d+$","description":"The ID of the Facebook page to publish to.","type":"string"},"mediaType":{"description":"Whether the media is a reel or video.","type":"string","enum":["reel","video"]},"link":{"minLength":1,"description":"Link preview to attach to the Facebook post.","type":"string"}},"required":["targetType","pageId"]},{"type":"object","properties":{"targetType":{"description":"Publish to Instagram.","type":"string","enum":["instagram"]},"mediaType":{"description":"Whether the media is a reel or story.","type":"string","enum":["reel","story"]},"altText":{"minLength":1,"maxLength":1000,"description":"Alternative text, for accessibility purposes. Only supported on a single image or image media in a carousel.","type":"string"},"shareToFeed":{"description":"Whether to also share the reel to the Instagram feed. Only applicable for reels.","type":"boolean"},"audioName":{"minLength":1,"maxLength":2200,"description":"For Reels only. Name of the audio of your Reels media. You can only rename once, either while creating a reel or after from the audio page.","type":"string"},"collaborators":{"description":"List of collaborators to add to the Instagram post.","minItems":1,"maxItems":3,"type":"array","items":{"minLength":1,"description":"The Instagram usernames of the collaborator to add to the post.","type":"string"}},"coverImageUrl":{"minLength":1,"description":"URL of the cover image to use for the Instagram post. Use the media upload endpoint to upload media files before publishing. Maximum file size is 8MB. Only applicable to reels.","type":"string"},"trial":{"description":"Settings for trial reels. Trial reels are shown only to non-followers.","type":"object","properties":{"graduationStrategy":{"description":"Strategy to use to determine when to graduate post from trial (convert the trial reel to a reel, sharing it to followers).","type":"string","enum":["MANUAL","SS_PERFORMANCE"]}},"required":["graduationStrategy"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to TikTok.","type":"string","enum":["tiktok"]},"privacyLevel":{"description":"The privacy level of the TikTok post.","type":"string","enum":["SELF_ONLY","PUBLIC_TO_EVERYONE","MUTUAL_FOLLOW_FRIENDS","FOLLOWER_OF_CREATOR"]},"disabledComments":{"description":"Whether to disable comments on the TikTok post.","type":"boolean"},"disabledDuet":{"description":"Whether to disable duet on the TikTok post.","type":"boolean"},"disabledStitch":{"description":"Whether to disable stitch on the TikTok post.","type":"boolean"},"isBrandedContent":{"description":"Whether the TikTok post is branded content.","type":"boolean"},"isYourBrand":{"description":"Whether the TikTok post is for your brand.","type":"boolean"},"isAiGenerated":{"description":"Whether the TikTok post is AI-generated.","type":"boolean"},"title":{"minLength":1,"maxLength":90,"description":"Title for the image posts. If notprovided, the first 90 characters of the post.content.text will be used.","type":"string"},"autoAddMusic":{"description":"Whether to automatically add music to the TikTok image posts.","type":"boolean"},"isDraft":{"description":"Don't publish the post immediately, save it as a draft instead. Default is false.","type":"boolean"},"imageCoverIndex":{"minimum":0,"description":"Index of the image (starts from 0) to use as the cover for carousel posts. Only applicable for carousel image posts.","type":"number"},"videoCoverTimestamp":{"minimum":0,"description":"Location in milliseconds of the video to use as the cover image. Only applicable for video posts. If not provided, the frame as 0 milliseconds will be used.","type":"number"}},"required":["targetType","privacyLevel","disabledComments","disabledDuet","disabledStitch","isBrandedContent","isYourBrand","isAiGenerated"]},{"type":"object","properties":{"targetType":{"description":"Publish to Pinterest.","type":"string","enum":["pinterest"]},"boardId":{"minLength":1,"description":"The ID of the Pinterest board to publish to.","type":"string"},"title":{"minLength":1,"maxLength":100,"description":"Title for the Pinterest post.","type":"string"},"link":{"maxLength":2048,"description":"Link for the Pinterest post.","type":"string"},"altText":{"maxLength":500,"description":"Alternative text for the Pinterest post, for accessibility purposes.","type":"string"}},"required":["targetType","boardId"]},{"type":"object","properties":{"targetType":{"description":"Publish to Threads.","type":"string","enum":["threads"]},"replyControl":{"description":"Who can reply to the Threads post.","type":"string","enum":["everyone","accounts_you_follow","mentioned_only"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to Bluesky.","type":"string","enum":["bluesky"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to YouTube.","type":"string","enum":["youtube"]},"title":{"minLength":1,"maxLength":100,"pattern":"^[^<>]*$","description":"Title for the YouTube post. Must not contain '>' nor '<' characters.","errorMessage":{"pattern":"must not contain '>' nor '<'"},"type":"string"},"privacyStatus":{"description":"The privacy status of the YouTube post.","type":"string","enum":["private","public","unlisted"]},"shouldNotifySubscribers":{"description":"Whether to notify subscribers about the YouTube post.","type":"boolean"},"isMadeForKids":{"description":"Whether the YouTube post is made for kids.","type":"boolean"},"containsSyntheticMedia":{"description":"Whether the media contains synthetic content, such as AI-generated images or deepfake videos. Default is false.","type":"boolean"}},"required":["targetType","title","privacyStatus","shouldNotifySubscribers"]}]}},"required":["accountId","content","target"]},"scheduledAt":{"type":"string"}},"required":["id","account","draft","scheduledAt"]}},"count":{"type":"string"},"cursor":{"type":"string"}},"required":["items","count"]}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"}},"required":["message"]}}}}}}}}}
```

## Get a scheduled post by ID

> Fetches a single scheduled post by its ID. Returns the schedule details including the draft content and account information.

```json
{"openapi":"3.0.3","info":{"title":"Blotato API","version":"2.0.0"},"tags":[{"name":"publishing","description":"Endpoints related to publishing content, such as posts and drafts."}],"servers":[{"url":"https://backend.blotato.com","description":"Blotato API Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"blotato-api-key","in":"header"}}},"paths":{"/v2/schedules/{id}":{"get":{"summary":"Get a scheduled post by ID","tags":["publishing"],"description":"Fetches a single scheduled post by its ID. Returns the schedule details including the draft content and account information.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"schedule":{"type":"object","properties":{"id":{"type":"string"},"account":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"username":{"type":"string"},"profileImageUrl":{"type":"string","nullable":true},"subaccountId":{"type":"string","nullable":true},"subId":{"type":"string","nullable":true},"subaccountName":{"type":"string","nullable":true}},"required":["id","name","username","profileImageUrl","subaccountId","subId","subaccountName"],"nullable":true},"draft":{"type":"object","properties":{"accountId":{"description":"The ID of the social media account to publish the content to.","type":"string"},"content":{"type":"object","allOf":[{"type":"object","properties":{"text":{"description":"The text content of the post.","type":"string"},"mediaUrls":{"description":"List of media URLs to include in the post.","type":"array","items":{"description":"URLs of media files (images, videos) to include in the post. Must originate from the blotato domain. Use the media upload endpoint to upload media files before publishing.","type":"string"}}},"required":["text","mediaUrls"]},{"type":"object","properties":{"platform":{"description":"Social media platform","type":"string","enum":["twitter","instagram","linkedin","facebook","tiktok","pinterest","threads","bluesky","youtube","other"]},"additionalPosts":{"type":"array","items":{"type":"object","properties":{"text":{"description":"The text content of the post.","type":"string"},"mediaUrls":{"description":"List of media URLs to include in the post.","type":"array","items":{"description":"URLs of media files (images, videos) to include in the post. Must originate from the blotato domain. Use the media upload endpoint to upload media files before publishing.","type":"string"}}},"required":["text","mediaUrls"]}}},"required":["platform"]}]},"target":{"type":"object","discriminator":{"propertyName":"targetType"},"oneOf":[{"type":"object","properties":{"targetType":{"description":"Publish to a custom webhook.","type":"string","enum":["webhook"]},"url":{"minLength":1,"description":"The URL of the webhook to publish to.","type":"string"}},"required":["targetType","url"]},{"type":"object","properties":{"targetType":{"description":"Publish to Twitter.","type":"string","enum":["twitter"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to LinkedIn.","type":"string","enum":["linkedin"]},"pageId":{"minLength":1,"description":"The ID of the LinkedIn page to publish to.","type":"string"}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to Facebook.","type":"string","enum":["facebook"]},"pageId":{"pattern":"^\\d+$","description":"The ID of the Facebook page to publish to.","type":"string"},"mediaType":{"description":"Whether the media is a reel or video.","type":"string","enum":["reel","video"]},"link":{"minLength":1,"description":"Link preview to attach to the Facebook post.","type":"string"}},"required":["targetType","pageId"]},{"type":"object","properties":{"targetType":{"description":"Publish to Instagram.","type":"string","enum":["instagram"]},"mediaType":{"description":"Whether the media is a reel or story.","type":"string","enum":["reel","story"]},"altText":{"minLength":1,"maxLength":1000,"description":"Alternative text, for accessibility purposes. Only supported on a single image or image media in a carousel.","type":"string"},"shareToFeed":{"description":"Whether to also share the reel to the Instagram feed. Only applicable for reels.","type":"boolean"},"audioName":{"minLength":1,"maxLength":2200,"description":"For Reels only. Name of the audio of your Reels media. You can only rename once, either while creating a reel or after from the audio page.","type":"string"},"collaborators":{"description":"List of collaborators to add to the Instagram post.","minItems":1,"maxItems":3,"type":"array","items":{"minLength":1,"description":"The Instagram usernames of the collaborator to add to the post.","type":"string"}},"coverImageUrl":{"minLength":1,"description":"URL of the cover image to use for the Instagram post. Use the media upload endpoint to upload media files before publishing. Maximum file size is 8MB. Only applicable to reels.","type":"string"},"trial":{"description":"Settings for trial reels. Trial reels are shown only to non-followers.","type":"object","properties":{"graduationStrategy":{"description":"Strategy to use to determine when to graduate post from trial (convert the trial reel to a reel, sharing it to followers).","type":"string","enum":["MANUAL","SS_PERFORMANCE"]}},"required":["graduationStrategy"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to TikTok.","type":"string","enum":["tiktok"]},"privacyLevel":{"description":"The privacy level of the TikTok post.","type":"string","enum":["SELF_ONLY","PUBLIC_TO_EVERYONE","MUTUAL_FOLLOW_FRIENDS","FOLLOWER_OF_CREATOR"]},"disabledComments":{"description":"Whether to disable comments on the TikTok post.","type":"boolean"},"disabledDuet":{"description":"Whether to disable duet on the TikTok post.","type":"boolean"},"disabledStitch":{"description":"Whether to disable stitch on the TikTok post.","type":"boolean"},"isBrandedContent":{"description":"Whether the TikTok post is branded content.","type":"boolean"},"isYourBrand":{"description":"Whether the TikTok post is for your brand.","type":"boolean"},"isAiGenerated":{"description":"Whether the TikTok post is AI-generated.","type":"boolean"},"title":{"minLength":1,"maxLength":90,"description":"Title for the image posts. If notprovided, the first 90 characters of the post.content.text will be used.","type":"string"},"autoAddMusic":{"description":"Whether to automatically add music to the TikTok image posts.","type":"boolean"},"isDraft":{"description":"Don't publish the post immediately, save it as a draft instead. Default is false.","type":"boolean"},"imageCoverIndex":{"minimum":0,"description":"Index of the image (starts from 0) to use as the cover for carousel posts. Only applicable for carousel image posts.","type":"number"},"videoCoverTimestamp":{"minimum":0,"description":"Location in milliseconds of the video to use as the cover image. Only applicable for video posts. If not provided, the frame as 0 milliseconds will be used.","type":"number"}},"required":["targetType","privacyLevel","disabledComments","disabledDuet","disabledStitch","isBrandedContent","isYourBrand","isAiGenerated"]},{"type":"object","properties":{"targetType":{"description":"Publish to Pinterest.","type":"string","enum":["pinterest"]},"boardId":{"minLength":1,"description":"The ID of the Pinterest board to publish to.","type":"string"},"title":{"minLength":1,"maxLength":100,"description":"Title for the Pinterest post.","type":"string"},"link":{"maxLength":2048,"description":"Link for the Pinterest post.","type":"string"},"altText":{"maxLength":500,"description":"Alternative text for the Pinterest post, for accessibility purposes.","type":"string"}},"required":["targetType","boardId"]},{"type":"object","properties":{"targetType":{"description":"Publish to Threads.","type":"string","enum":["threads"]},"replyControl":{"description":"Who can reply to the Threads post.","type":"string","enum":["everyone","accounts_you_follow","mentioned_only"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to Bluesky.","type":"string","enum":["bluesky"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to YouTube.","type":"string","enum":["youtube"]},"title":{"minLength":1,"maxLength":100,"pattern":"^[^<>]*$","description":"Title for the YouTube post. Must not contain '>' nor '<' characters.","errorMessage":{"pattern":"must not contain '>' nor '<'"},"type":"string"},"privacyStatus":{"description":"The privacy status of the YouTube post.","type":"string","enum":["private","public","unlisted"]},"shouldNotifySubscribers":{"description":"Whether to notify subscribers about the YouTube post.","type":"boolean"},"isMadeForKids":{"description":"Whether the YouTube post is made for kids.","type":"boolean"},"containsSyntheticMedia":{"description":"Whether the media contains synthetic content, such as AI-generated images or deepfake videos. Default is false.","type":"boolean"}},"required":["targetType","title","privacyStatus","shouldNotifySubscribers"]}]}},"required":["accountId","content","target"]},"scheduledAt":{"type":"string"}},"required":["id","account","draft","scheduledAt"]}},"required":["schedule"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"description":"Not found","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Resource not found","type":"string"}},"required":["message"]}}}},"500":{"description":"Server error","content":{"application/json":{"schema":{"description":"Server error","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"An error occurred","type":"string"}},"required":["message"]}}}}}}}}}
```

## Delete a scheduled post

> Deletes a scheduled post by its ID. The associated publishing job is also cancelled.

```json
{"openapi":"3.0.3","info":{"title":"Blotato API","version":"2.0.0"},"tags":[{"name":"publishing","description":"Endpoints related to publishing content, such as posts and drafts."}],"servers":[{"url":"https://backend.blotato.com","description":"Blotato API Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"blotato-api-key","in":"header"}}},"paths":{"/v2/schedules/{id}":{"delete":{"summary":"Delete a scheduled post","tags":["publishing"],"description":"Deletes a scheduled post by its ID. The associated publishing job is also cancelled.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"The ID of the schedule to delete."}],"responses":{"204":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"}},"required":["message"]}}}}}}}}}
```

## Updates a scheduled post. The post must be in scheduled state to be updated. You can update the scheduled time or change the post contents.

> Updates a scheduled post by ID. You can update the draft content, the scheduled time, or both. The scheduled time must be a valid ISO 8601 date in the future. When the scheduled time is changed, the post is re-queued for publishing at the new time.

```json
{"openapi":"3.0.3","info":{"title":"Blotato API","version":"2.0.0"},"tags":[{"name":"publishing","description":"Endpoints related to publishing content, such as posts and drafts."}],"servers":[{"url":"https://backend.blotato.com","description":"Blotato API Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"blotato-api-key","in":"header"}}},"paths":{"/v2/schedules/{id}":{"patch":{"summary":"Updates a scheduled post. The post must be in scheduled state to be updated. You can update the scheduled time or change the post contents.","tags":["publishing"],"description":"Updates a scheduled post by ID. You can update the draft content, the scheduled time, or both. The scheduled time must be a valid ISO 8601 date in the future. When the scheduled time is changed, the post is re-queued for publishing at the new time.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"patch":{"description":"The fields to update in the schedule.","type":"object","properties":{"draft":{"type":"object","properties":{"accountId":{"description":"The ID of the social media account to publish the content to.","type":"string"},"content":{"type":"object","allOf":[{"type":"object","properties":{"text":{"description":"The text content of the post.","type":"string"},"mediaUrls":{"description":"List of media URLs to include in the post.","type":"array","items":{"description":"URLs of media files (images, videos) to include in the post. Must originate from the blotato domain. Use the media upload endpoint to upload media files before publishing.","type":"string"}}},"required":["text","mediaUrls"]},{"type":"object","properties":{"platform":{"description":"Social media platform","type":"string","enum":["twitter","instagram","linkedin","facebook","tiktok","pinterest","threads","bluesky","youtube","other"]},"additionalPosts":{"type":"array","items":{"type":"object","properties":{"text":{"description":"The text content of the post.","type":"string"},"mediaUrls":{"description":"List of media URLs to include in the post.","type":"array","items":{"description":"URLs of media files (images, videos) to include in the post. Must originate from the blotato domain. Use the media upload endpoint to upload media files before publishing.","type":"string"}}},"required":["text","mediaUrls"]}}},"required":["platform"]}]},"target":{"type":"object","discriminator":{"propertyName":"targetType"},"oneOf":[{"type":"object","properties":{"targetType":{"description":"Publish to a custom webhook.","type":"string","enum":["webhook"]},"url":{"minLength":1,"description":"The URL of the webhook to publish to.","type":"string"}},"required":["targetType","url"]},{"type":"object","properties":{"targetType":{"description":"Publish to Twitter.","type":"string","enum":["twitter"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to LinkedIn.","type":"string","enum":["linkedin"]},"pageId":{"minLength":1,"description":"The ID of the LinkedIn page to publish to.","type":"string"}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to Facebook.","type":"string","enum":["facebook"]},"pageId":{"pattern":"^\\d+$","description":"The ID of the Facebook page to publish to.","type":"string"},"mediaType":{"description":"Whether the media is a reel or video.","type":"string","enum":["reel","video"]},"link":{"minLength":1,"description":"Link preview to attach to the Facebook post.","type":"string"}},"required":["targetType","pageId"]},{"type":"object","properties":{"targetType":{"description":"Publish to Instagram.","type":"string","enum":["instagram"]},"mediaType":{"description":"Whether the media is a reel or story.","type":"string","enum":["reel","story"]},"altText":{"minLength":1,"maxLength":1000,"description":"Alternative text, for accessibility purposes. Only supported on a single image or image media in a carousel.","type":"string"},"shareToFeed":{"description":"Whether to also share the reel to the Instagram feed. Only applicable for reels.","type":"boolean"},"audioName":{"minLength":1,"maxLength":2200,"description":"For Reels only. Name of the audio of your Reels media. You can only rename once, either while creating a reel or after from the audio page.","type":"string"},"collaborators":{"description":"List of collaborators to add to the Instagram post.","minItems":1,"maxItems":3,"type":"array","items":{"minLength":1,"description":"The Instagram usernames of the collaborator to add to the post.","type":"string"}},"coverImageUrl":{"minLength":1,"description":"URL of the cover image to use for the Instagram post. Use the media upload endpoint to upload media files before publishing. Maximum file size is 8MB. Only applicable to reels.","type":"string"},"trial":{"description":"Settings for trial reels. Trial reels are shown only to non-followers.","type":"object","properties":{"graduationStrategy":{"description":"Strategy to use to determine when to graduate post from trial (convert the trial reel to a reel, sharing it to followers).","type":"string","enum":["MANUAL","SS_PERFORMANCE"]}},"required":["graduationStrategy"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to TikTok.","type":"string","enum":["tiktok"]},"privacyLevel":{"description":"The privacy level of the TikTok post.","type":"string","enum":["SELF_ONLY","PUBLIC_TO_EVERYONE","MUTUAL_FOLLOW_FRIENDS","FOLLOWER_OF_CREATOR"]},"disabledComments":{"description":"Whether to disable comments on the TikTok post.","type":"boolean"},"disabledDuet":{"description":"Whether to disable duet on the TikTok post.","type":"boolean"},"disabledStitch":{"description":"Whether to disable stitch on the TikTok post.","type":"boolean"},"isBrandedContent":{"description":"Whether the TikTok post is branded content.","type":"boolean"},"isYourBrand":{"description":"Whether the TikTok post is for your brand.","type":"boolean"},"isAiGenerated":{"description":"Whether the TikTok post is AI-generated.","type":"boolean"},"title":{"minLength":1,"maxLength":90,"description":"Title for the image posts. If notprovided, the first 90 characters of the post.content.text will be used.","type":"string"},"autoAddMusic":{"description":"Whether to automatically add music to the TikTok image posts.","type":"boolean"},"isDraft":{"description":"Don't publish the post immediately, save it as a draft instead. Default is false.","type":"boolean"},"imageCoverIndex":{"minimum":0,"description":"Index of the image (starts from 0) to use as the cover for carousel posts. Only applicable for carousel image posts.","type":"number"},"videoCoverTimestamp":{"minimum":0,"description":"Location in milliseconds of the video to use as the cover image. Only applicable for video posts. If not provided, the frame as 0 milliseconds will be used.","type":"number"}},"required":["targetType","privacyLevel","disabledComments","disabledDuet","disabledStitch","isBrandedContent","isYourBrand","isAiGenerated"]},{"type":"object","properties":{"targetType":{"description":"Publish to Pinterest.","type":"string","enum":["pinterest"]},"boardId":{"minLength":1,"description":"The ID of the Pinterest board to publish to.","type":"string"},"title":{"minLength":1,"maxLength":100,"description":"Title for the Pinterest post.","type":"string"},"link":{"maxLength":2048,"description":"Link for the Pinterest post.","type":"string"},"altText":{"maxLength":500,"description":"Alternative text for the Pinterest post, for accessibility purposes.","type":"string"}},"required":["targetType","boardId"]},{"type":"object","properties":{"targetType":{"description":"Publish to Threads.","type":"string","enum":["threads"]},"replyControl":{"description":"Who can reply to the Threads post.","type":"string","enum":["everyone","accounts_you_follow","mentioned_only"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to Bluesky.","type":"string","enum":["bluesky"]}},"required":["targetType"]},{"type":"object","properties":{"targetType":{"description":"Publish to YouTube.","type":"string","enum":["youtube"]},"title":{"minLength":1,"maxLength":100,"pattern":"^[^<>]*$","description":"Title for the YouTube post. Must not contain '>' nor '<' characters.","errorMessage":{"pattern":"must not contain '>' nor '<'"},"type":"string"},"privacyStatus":{"description":"The privacy status of the YouTube post.","type":"string","enum":["private","public","unlisted"]},"shouldNotifySubscribers":{"description":"Whether to notify subscribers about the YouTube post.","type":"boolean"},"isMadeForKids":{"description":"Whether the YouTube post is made for kids.","type":"boolean"},"containsSyntheticMedia":{"description":"Whether the media contains synthetic content, such as AI-generated images or deepfake videos. Default is false.","type":"boolean"}},"required":["targetType","title","privacyStatus","shouldNotifySubscribers"]}]}},"required":["accountId","content","target"]},"scheduledTime":{"description":"The new scheduled time for the post (ISO 8601 format).","type":"string"}}}},"required":["patch"]}}},"required":true},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"The ID of the schedule to update."}],"responses":{"204":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"description":"Not found","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Resource not found","type":"string"}},"required":["message"]}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Validation error","type":"string"}},"required":["message"]}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"}},"required":["message"]}}}}}}}}}
```

## Resolves a source asynchronously

> Submits a source for asynchronous resolution. The response contains a source resolution ID that can be used to check the status of the resolution. A source can be any text content, URL, or other data that needs to be processed to generate a title and content. Source resolution has a user-level rate limit of \*\*30 requests / minute\*\*.

```json
{"openapi":"3.0.3","info":{"title":"Blotato API","version":"2.0.0"},"tags":[{"name":"publishing","description":"Endpoints related to publishing content, such as posts and drafts."}],"servers":[{"url":"https://backend.blotato.com","description":"Blotato API Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"blotato-api-key","in":"header"}}},"paths":{"/v2/source-resolutions-v3":{"post":{"summary":"Resolves a source asynchronously","tags":["publishing"],"description":"Submits a source for asynchronous resolution. The response contains a source resolution ID that can be used to check the status of the resolution. A source can be any text content, URL, or other data that needs to be processed to generate a title and content. Source resolution has a user-level rate limit of **30 requests / minute**.","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"object","discriminator":{"propertyName":"sourceType"},"oneOf":[{"type":"object","properties":{"sourceType":{"type":"string","enum":["text"]},"text":{"type":"string"}},"required":["sourceType","text"]},{"type":"object","properties":{"sourceType":{"type":"string","enum":["article"]},"url":{"type":"string"}},"required":["sourceType","url"]},{"type":"object","properties":{"sourceType":{"type":"string","enum":["youtube"]},"url":{"type":"string"}},"required":["sourceType","url"]},{"type":"object","properties":{"sourceType":{"type":"string","enum":["twitter"]},"url":{"type":"string"}},"required":["sourceType","url"]},{"type":"object","properties":{"sourceType":{"type":"string","enum":["tiktok"]},"url":{"type":"string"}},"required":["sourceType","url"]},{"type":"object","properties":{"sourceType":{"type":"string","enum":["perplexity-query"]},"text":{"type":"string"}},"required":["sourceType","text"]},{"type":"object","properties":{"sourceType":{"type":"string","enum":["audio"]},"url":{"type":"string"}},"required":["sourceType","url"]},{"type":"object","properties":{"sourceType":{"type":"string","enum":["pdf"]},"url":{"type":"string"}},"required":["sourceType","url"]}]},"customInstructions":{"type":"string"}},"required":["source"]}}},"required":true},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"description":"Validation error","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Validation error","type":"string"}},"required":["message"]}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"}},"required":["message"]}}}}}}}}}
```

## Get source resolution status

> Fetches the status of a source resolution by its ID. This endpoint allows users to check whether the source has been resolved or is still in the queue. Source resolution lookup has a user-level rate limit of \*\*60 requests / minute\*\*.

```json
{"openapi":"3.0.3","info":{"title":"Blotato API","version":"2.0.0"},"tags":[{"name":"publishing","description":"Endpoints related to publishing content, such as posts and drafts."}],"servers":[{"url":"https://backend.blotato.com","description":"Blotato API Server"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"blotato-api-key","in":"header"}}},"paths":{"/v2/source-resolutions-v3/{id}":{"get":{"summary":"Get source resolution status","tags":["publishing"],"description":"Fetches the status of a source resolution by its ID. This endpoint allows users to check whether the source has been resolved or is still in the queue. Source resolution lookup has a user-level rate limit of **60 requests / minute**.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","discriminator":{"propertyName":"status"},"oneOf":[{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["completed"]},"title":{"type":"string"},"content":{"type":"string"},"referenceUrl":{"type":"string"}},"required":["id","status","title","content"]},{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["queued"]}},"required":["id","status"]},{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["processing"]}},"required":["id","status"]},{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["failed"]},"message":{"type":"string"}},"required":["id","status","message"]}]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"description":"Not found","type":"object","properties":{"code":{"type":"number"},"reqId":{"description":"Request ID for tracking","type":"string"},"message":{"description":"Resource not found","type":"string"}},"required":["message"]}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"number"},"message":{"type":"string"}},"required":["message"]}}}}}}}}}
```
