Tumblr
Mutation
Use the scheduleTumblrPost mutation to schedule content to Tumblr blogs:
mutation ScheduleTumblrPost($input: ScheduleTumblrPostInput!) {
scheduleTumblrPost(input: $input) {
success
errors {
field
message
}
post {
id
socialAccount {
id
username
}
publishingStatus
content
layout
tags
communityLabel
sourceUrl
gallery {
id
galleryMediaSet {
id
media {
url
mimeType
}
}
}
submissions {
id
postAt
}
}
}
}
Input Parameters
ScheduleTumblrPostInput
SPECIFIC_TIME, QUEUE_NEXT (default: SPECIFIC_TIME).
Only accepted when scheduling a new post. See Scheduling at the Next Open Slot.FOR_EVERYONE, MATURE, DRUGS, VIOLENCE, SEXUAL_THEMESREADY_TO_PUBLISH, DRAFT (default: READY_TO_PUBLISH)TumblrPostSubmissionInputType
Each submission defines a specific posting schedule:
schedulingMode: QUEUE_NEXT on the post when scheduling a new one, or the post is a draft.
See Drafts without a date.NPF Content Structure
Tumblr uses the Neue Post Format (NPF) for structured content. Here are common content block types:
Text Block
{
"type": "text",
"text": "Your text content here",
"subtype": "heading1" // optional: heading1, heading2, quirky, quote, indented, chat, ordered-list-item, unordered-list-item
}
Image Block
{
"type": "image",
"media": [
{
"url": "https://example.com/image.jpg",
"type": "image/jpeg",
"width": 1080,
"height": 1080
}
]
}
Link Block
{
"type": "link",
"url": "https://example.com",
"title": "Link Title",
"description": "Link description",
"author": "Author Name",
"site_name": "Site Name"
}
Examples
Simple Text Post
Schedule a basic text post to Tumblr.
{
"input": {
"username": "myblog",
"content": [
{
"type": "text",
"text": "Just discovered this amazing new coffee shop downtown! ☕ The atmosphere is perfect for getting work done, and their latte art is incredible. Definitely my new favorite spot for morning meetings."
}
],
"layout": [],
"tags": ["coffee", "downtown", "productivity", "latte art", "new favorite"],
"communityLabel": "FOR_EVERYONE",
"submissions": [
{
"postAt": "2025-12-01T10:00:00Z"
}
]
}
}
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": "myblog",
"schedulingMode": "QUEUE_NEXT",
"content": [
{
"type": "text",
"text": "This one goes out at my next open slot."
}
],
"layout": [],
"communityLabel": "FOR_EVERYONE",
"submissions": [{}]
}
}
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 updateScheduledTumblrPost rejects schedulingMode. See Scheduling at the Next Open Slot for the full rules.
Image Post with Caption
Schedule an image post with descriptive text.
{
"input": {
"username": "myblog",
"content": [
{
"type": "image",
"media": [
{
"url": "https://example.com/sunset-photo.jpg",
"type": "image/jpeg",
"width": 1080,
"height": 1350
}
]
},
{
"type": "text",
"text": "Golden hour magic from last night's walk along the beach. There's something so peaceful about watching the sun disappear into the horizon. 🌅✨"
}
],
"layout": [
{
"type": "rows",
"display": [
{"blocks": [0]},
{"blocks": [1]}
]
}
],
"tags": ["photography", "sunset", "beach", "golden hour", "peaceful", "nature"],
"communityLabel": "FOR_EVERYONE",
"submissions": [
{
"postAt": "2025-12-01T18:30:00Z"
}
]
}
}
Quote Post
Schedule a quote post with attribution.
{
"input": {
"username": "myblog",
"content": [
{
"type": "text",
"subtype": "quote",
"text": "The future belongs to those who believe in the beauty of their dreams."
},
{
"type": "text",
"text": "— Eleanor Roosevelt"
}
],
"layout": [
{
"type": "rows",
"display": [
{"blocks": [0]},
{"blocks": [1]}
]
}
],
"tags": ["quotes", "inspiration", "Eleanor Roosevelt", "dreams", "motivation"],
"communityLabel": "NONE",
"submissions": [
{
"postAt": "2025-12-01T14:00:00Z"
}
]
}
}
Link Post with Commentary
Schedule a link post with your thoughts and commentary.
{
"input": {
"username": "myblog",
"content": [
{
"type": "text",
"text": "Fascinating article about the future of sustainable technology! The innovations in solar panel efficiency are particularly exciting. We're definitely moving in the right direction for a greener future. 🌱"
},
{
"type": "link",
"url": "https://example.com/sustainable-tech-article",
"title": "Revolutionary Advances in Sustainable Technology",
"description": "Exploring the latest breakthroughs in renewable energy and eco-friendly innovations that are shaping our future.",
"author": "Dr. Jane Smith",
"site_name": "Green Tech Today"
}
],
"layout": [
{
"type": "rows",
"display": [
{"blocks": [0]},
{"blocks": [1]}
]
}
],
"tags": ["sustainability", "technology", "renewable energy", "green tech", "innovation", "environment"],
"sourceUrl": "https://example.com/sustainable-tech-article",
"communityLabel": "NONE",
"submissions": [
{
"postAt": "2025-12-01T16:15:00Z"
}
]
}
}
Mature Content Post
Schedule a post with mature content labeling.
{
"input": {
"username": "myblog",
"content": [
{
"type": "text",
"text": "Exploring themes of identity and self-expression through art. This piece represents the journey of finding yourself in a world that constantly tries to define you."
},
{
"type": "image",
"media": [
{
"url": "https://example.com/artistic-expression.jpg",
"type": "image/jpeg",
"width": 800,
"height": 1200
}
]
}
],
"layout": [
{
"type": "rows",
"display": [
{"blocks": [0]},
{"blocks": [1]}
]
}
],
"tags": ["art", "identity", "self expression", "personal journey", "creative"],
"communityLabel": "MATURE",
"submissions": [
{
"postAt": "2025-12-01T20:00:00Z"
}
]
}
}
Response Types
Success Response
{
"data": {
"scheduleTumblrPost": {
"success": true,
"errors": [],
"post": {
"id": "123",
"socialAccount": {
"id": "456",
"username": "myblog"
},
"publishingStatus": "READY_TO_PUBLISH",
"content": [
{
"type": "text",
"text": "Just discovered this amazing new coffee shop downtown! ☕ The atmosphere is perfect for getting work done, and their latte art is incredible. Definitely my new favorite spot for morning meetings."
}
],
"layout": [],
"tags": ["coffee", "downtown", "productivity", "latte art", "new favorite"],
"communityLabel": "NONE",
"sourceUrl": null,
"gallery": null,
"submissions": [
{
"id": "789",
"postAt": "2025-12-01T10:00:00Z"
}
]
}
}
}
}
Error Response
{
"data": {
"scheduleTumblrPost": {
"success": false,
"errors": [
{
"field": "content",
"message": "Tumblr post content cannot be empty."
}
],
"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 UpdateScheduledTumblrPost($input: ScheduleTumblrPostInput!) {
updateScheduledTumblrPost(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": "myblog",
"submissions": [{"postAt": "2025-12-01T15:30:00Z"}]
}
}
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
- Content Format: Must use valid NPF (Neue Post Format) structure
- Tags: Maximum 30 tags per post, each tag max 139 characters
- Text Length: No hard limit, but very long posts may be truncated in feeds
- Image Requirements: JPEG, PNG, GIF, WebP formats supported
- Image Size: Maximum 10MB per image
- Video Support: MP4 format, maximum 100MB
- Community Labels: Must be correctly applied for mature content
- NPF Validation: Content and layout must follow NPF specifications
- 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 content doesn't follow the NPF format correctly. Ensure all content blocks have the required fields and valid types.
You must provide content for your post. Include at least one content block in the NPF structure.
You've exceeded the maximum of 30 tags per post. Remove some tags to comply with Tumblr's limits.
One or more tags exceed 139 characters. Shorten your tags to meet Tumblr's requirements.
Your image format is not supported. Use JPEG, PNG, GIF, or WebP format for Tumblr posts.
Your image file is too large. Tumblr supports images up to 10MB in size.
Your layout configuration doesn't follow NPF layout specifications. Check the layout format and block references.
Your content may require mature labeling. Set communityLabel to MATURE for adult content.
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 updateScheduledTumblrPost.
You've reached your plan's Tumblr post limit for the scheduled month. Upgrade your plan or schedule for a different month.