Mastodon
Mutation
Use the scheduleMastodonPost
mutation to schedule posts to Mastodon:
mutation ScheduleMastodonPost($input: ScheduleMastodonPostInput!) {
scheduleMastodonPost(input: $input) {
success
errors {
field
message
}
post {
id
socialAccount {
id
username
}
publishingStatus
submissions {
id
text
order
postAt
visibility
contentWarning
language
gallery {
id
media {
id
url
type
}
}
}
}
}
}
Input Parameters
ScheduleMastodonPostInput
READY_TO_PUBLISH
, DRAFT
(default: READY_TO_PUBLISH
)MastodonPostSubmissionInputType
Each post in the thread supports these parameters:
PUBLIC
, UNLISTED
, PRIVATE
, DIRECT
hour
, day
hour
, day
Examples
Simple Post
Schedule a basic post with text only.
{
"input": {
"username": "myhandle@mastodon.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Hello Fediverse! This is my first scheduled post 🚀",
"order": 0,
"visibility": "PUBLIC"
}
]
}
}
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@mastodon.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Check out this amazing sunset! 🌅",
"order": 0,
"visibility": "PUBLIC",
"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@mastodon.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Sharing our company logo! 🏢",
"order": 0,
"visibility": "PUBLIC",
"mediaName": "company-logo.png"
}
]
}
}
Thread with Multiple Posts
Schedule a multi-post thread.
{
"input": {
"username": "myhandle@mastodon.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "🧵 Thread about building great APIs (1/3)",
"order": 0,
"visibility": "PUBLIC"
},
{
"text": "First, always design your API with the developer experience in mind. Clear documentation and consistent patterns make all the difference.",
"order": 1,
"visibility": "PUBLIC"
},
{
"text": "Second, implement proper error handling and rate limiting. Your API consumers will thank you when things go wrong (and they will).",
"order": 2,
"visibility": "PUBLIC",
"final": true
}
]
}
}
Post with Content Warning
Schedule a post with a content warning (spoiler text).
{
"input": {
"username": "myhandle@mastodon.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "This is some sensitive content that might need a warning.",
"order": 0,
"visibility": "PUBLIC",
"contentWarning": "Sensitive topic discussion"
}
]
}
}
Unlisted Post with Language
Schedule an unlisted post with a specific language.
{
"input": {
"username": "myhandle@mastodon.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Bonjour le monde! Ceci est un post en français.",
"order": 0,
"visibility": "UNLISTED",
"language": "fr"
}
]
}
}
Auto-Boost Configuration
Schedule a post with automatic boosting.
{
"input": {
"username": "myhandle@mastodon.social",
"postAt": "2025-12-01T15:30:00Z",
"thread": [
{
"text": "Don't miss our latest blog post about API best practices! 📖",
"order": 0,
"visibility": "PUBLIC",
"repostAtAmount": 2,
"repostAtUnit": "hour",
"repostRepeatDays": 3,
"repostFromSocialAccount": {
"username": "mycompany@mastodon.social"
}
}
]
}
}
Response Types
Success Response
{
"data": {
"scheduleMastodonPost": {
"success": true,
"errors": [],
"post": {
"id": "123",
"socialAccount": {
"id": "456",
"username": "myhandle@mastodon.social"
},
"publishingStatus": "READY_TO_PUBLISH",
"submissions": [
{
"id": "789",
"text": "Hello Fediverse! This is my first scheduled post 🚀",
"order": 0,
"postAt": "2025-12-01T15:30:00Z",
"visibility": "PUBLIC",
"contentWarning": "",
"language": "",
"gallery": null
}
]
}
}
}
}
Error Response
{
"data": {
"scheduleMastodonPost": {
"success": false,
"errors": [
{
"field": "text",
"message": "You cannot schedule a post longer than 500 characters."
}
],
"post": null
}
}
}
Validation Rules
- Text Length: 500 characters by default (varies by server), includes content warning text
- Media: Maximum 20 images per post, 1 video or GIF per post
- Images: PNG, JPG, HEIF, WEBP formats, maximum 16MB each
- Videos: MP4, M4V, MOV, WebM formats, maximum 99MB, max frame rate 120fps
- GIFs: Automatically converted to soundless MP4s, maximum 16MB
- Threads: No hard limit on thread length
- Scheduling: Posts must be scheduled for future dates only
- Visibility: Must be one of PUBLIC, UNLISTED, PRIVATE, or DIRECT
- Language: Must use valid ISO 639 language codes
- Account Limits: Respects your plan's monthly post limits
Visibility Options
Common Errors
The specified username is not connected to your Postpone account. Connect the account in your settings first.
The post text (including content warning) exceeds the server's character limit. Most Mastodon servers allow 500 characters.
The postAt
timestamp must be in the future. Check your timezone settings.
The visibility must be one of: PUBLIC, UNLISTED, PRIVATE, or DIRECT.
The language code must be a valid ISO 639 language code (e.g., "en", "fr", "de").
Mastodon posts can have a maximum of 20 images or 1 video/GIF. Reduce the number of media attachments.
Images must be under 16MB and videos under 99MB. Compress your media files or use smaller versions.
You've reached your plan's post limit for the scheduled month. Upgrade your plan or schedule for a different month.