Bluesky
Mutation
Use the scheduleBlueskyPost mutation to schedule posts to Bluesky:
mutation ScheduleBlueskyPost($input: ScheduleBlueskyPostInput!) {
scheduleBlueskyPost(input: $input) {
success
errors {
field
message
}
post {
id
socialAccount {
id
username
}
publishingStatus
allowRepliesFrom
submissions {
id
text
order
postAt
contentWarning
languages
tags
gallery {
id
galleryMediaSet {
id
media {
id
url
mimeType
}
}
}
}
}
}
}
Input Parameters
ScheduleBlueskyPostInput
EVERYBODY, MENTIONED_USERS, FOLLOWED_USERS, NOBODYREADY_TO_PUBLISH, DRAFT (default: READY_TO_PUBLISH)BlueskyPostSubmissionInputType
Each post in the thread supports these parameters:
NONE, SUGGESTIVE, NUDITY, PORNhour, dayhour, dayExamples
Simple Post
Schedule a basic post with text only.
{
"input": {
"username": "myhandle.bsky.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Hello Bluesky! This is my first scheduled post 🌤️",
"order": 0,
"contentWarning": "NONE"
}
]
}
}
Post with Media URL
Schedule a post by uploading media from an external URL. The media will be automatically downloaded and added to your Content Library.
{
"input": {
"username": "myhandle.bsky.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Check out this amazing sunset! 🌅",
"order": 0,
"contentWarning": "NONE",
"mediaUrl": "https://picsum.photos/seed/socialmedia/900/1600"
}
]
}
}
Post with Content Library Media
Schedule a post using media already in your Content Library. The search is case-insensitive and will use the first matching file based on its name.
{
"input": {
"username": "myhandle.bsky.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Sharing our company logo! 🏢",
"order": 0,
"contentWarning": "NONE",
"mediaName": "company-logo.png"
}
]
}
}
Thread with Multiple Posts
Schedule a multi-post thread with reply restrictions.
{
"input": {
"username": "myhandle.bsky.social",
"postAt": "2025-12-01T15:30:00Z",
"allowRepliesFrom": "FOLLOWED_USERS",
"thread": [
{
"text": "🧵 Thread about building great APIs (1/3)",
"order": 0,
"contentWarning": "NONE"
},
{
"text": "First, always design your API with the developer experience in mind. Clear documentation and consistent patterns make all the difference.",
"order": 1,
"contentWarning": "NONE"
},
{
"text": "Second, implement proper error handling and rate limiting. Your API consumers will thank you when things go wrong (and they will).",
"order": 2,
"contentWarning": "NONE",
"final": true
}
]
}
}
Post with Content Warning
Schedule a post with appropriate content warning labeling.
{
"input": {
"username": "myhandle.bsky.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Artistic photography from my latest shoot 📸",
"order": 0,
"contentWarning": "SUGGESTIVE",
"mediaUrl": "https://picsum.photos/seed/socialmedia/900/1600"
}
]
}
}
Multi-Language Post
Schedule a post with language tags for better discoverability.
{
"input": {
"username": "myhandle.bsky.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Hello world! / Hola mundo! / Bonjour le monde!",
"order": 0,
"contentWarning": "NONE",
"languages": ["en", "es", "fr"],
"tags": ["multilingual", "greetings"]
}
]
}
}
Auto-Repost Configuration
Schedule a post with automatic reposting.
{
"input": {
"username": "myhandle.bsky.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Don't miss our latest blog post about API best practices! 📖",
"order": 0,
"contentWarning": "NONE",
"repostAtAmount": 2,
"repostAtUnit": "hour",
"repostRepeatDays": 3,
"repostFromSocialAccount": {
"username": "mycompany.bsky.social"
}
}
]
}
}
Response Types
Success Response
{
"data": {
"scheduleBlueskyPost": {
"success": true,
"errors": [],
"post": {
"id": "123",
"socialAccount": {
"id": "456",
"username": "myhandle.bsky.social"
},
"publishingStatus": "READY_TO_PUBLISH",
"allowRepliesFrom": "EVERYBODY",
"submissions": [
{
"id": "789",
"text": "Hello Bluesky! This is my first scheduled post 🌤️",
"order": 0,
"postAt": "2025-12-01T15:30:00Z",
"contentWarning": "NONE",
"languages": [],
"tags": [],
"gallery": null
}
]
}
}
}
}
Error Response
{
"data": {
"scheduleBlueskyPost": {
"success": false,
"errors": [
{
"field": "text",
"message": "Post text cannot exceed 300 characters."
}
],
"post": null
}
}
}
Validation Rules
- Text Length: Maximum 300 characters per post
- Media: Supports images and videos with reasonable file size limits
- Content Warnings: Required field for all posts, use
NONEfor general audiences - Languages: Use standard IETF BCP 47 language codes (e.g.,
en,es,fr) - Threads: No hard limit on thread length
- 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.
The post text exceeds the 300 character limit. Consider breaking long posts into threads.
The postAt timestamp must be in the future. Check your timezone settings.
The contentWarning field is required. Use NONE for general audiences or appropriate labels for adult content.
Language codes must follow IETF BCP 47 standard (e.g., en for English, es for Spanish).
You've reached your plan's post limit for the scheduled month. Upgrade your plan or schedule for a different month.