Postpone Logo
Platforms

YouTube Shorts

Schedule short-form video content to YouTube

Mutation

Use the scheduleYouTubePost mutation to schedule video content to YouTube:

Mutation
mutation ScheduleYouTubePost($input: ScheduleYouTubePostInput!) {
  scheduleYouTubePost(input: $input) {
    success
    errors {
      field
      message
    }
    post {
      id
      socialAccount {
        id
        username
      }
      publishingStatus
      title
      description
      tags
      madeForKids
      containsSyntheticMedia
      privacyStatus
      gallery {
        id
        galleryMediaSet {
          id
          media {
            url
            mimeType
          }
        }
      }
      submissions {
        id
        postAt
        publishingMethod
      }
    }
  }
}

Input Parameters

ScheduleYouTubePostInput

username
String! required
The username of the connected YouTube account to post from
schedulingMode
SchedulingModeType
How the post date is decided. Options: SPECIFIC_TIME, QUEUE_NEXT (default: SPECIFIC_TIME). Only accepted when scheduling a new post. See Scheduling at the Next Open Slot.
title
String! required
The title of the video (max 100 characters)
description
String
The description of the video (max 5,000 characters)
tags
[String!]
Array of tags for the video (max 500 characters total)
madeForKids
Boolean! required
Whether the content is made for kids (COPPA compliance)
containsSyntheticMedia
Boolean
Whether the video contains synthetic or altered media (default: false)
media
[SimpleMediaInput]
The video to publish, as a single-item list. The item references a file by id, name, or url. See Attaching Media. Only supported when scheduling new posts, not when updating existing ones.
privacyStatus
YouTubePrivacyStatus! required
Privacy setting for the video. Options: PUBLIC, UNLISTED, PRIVATE
submissions
[YouTubePostSubmissionInputType!]! required
Array of submissions defining when to post (minimum 1 submission)
publishingStatus
PublishingStatusType
Publishing status. Options: READY_TO_PUBLISH, DRAFT (default: READY_TO_PUBLISH)
postTags
[ID!]
Array of post tag IDs to organize your content. See Post Tags.
id
ID
ID of existing post when updating (only for updates)

YouTubePostSubmissionInputType

Each submission defines a specific posting schedule:

postAt
DateTime
When to publish the video (must be in the future). Required unless you pass schedulingMode: QUEUE_NEXT on the post when scheduling a new one, or the post is a draft. See Drafts without a date.
publishingMethod
PublishingMethodType
How to publish the content. Options: AUTOMATIC, MANUAL (default: AUTOMATIC)
id
ID
ID of existing submission when updating (only for updates)

Examples

Simple YouTube Short

Schedule a basic YouTube Short with a video from URL.

{
  "input": {
    "username": "mychannel",
    "title": "Amazing Dance Tutorial #Shorts",
    "description": "Learn this viral dance in just 60 seconds! Follow for more tutorials.\n\n#dance #tutorial #shorts #viral",
    "tags": ["dance", "tutorial", "shorts", "viral", "howto"],
    "media": [{ "url": "https://example.com/dance-short.mp4" }],
    "madeForKids": false,
    "privacyStatus": "PUBLIC",
    "submissions": [
      {
        "postAt": "2025-12-01T18: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 video in the next open slot on the account's Account Schedule, skipping any slot that already has a post on it.

{
  "input": {
    "username": "mychannel",
    "schedulingMode": "QUEUE_NEXT",
    "title": "This one goes out at my next open slot #Shorts",
    "media": [{ "url": "https://example.com/dance-short.mp4" }],
    "madeForKids": false,
    "privacyStatus": "PUBLIC",
    "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 updateScheduledYouTubePost rejects schedulingMode. See Scheduling at the Next Open Slot for the full rules.

YouTube Short with Content Library Media

Schedule a video using media from your Content Library. Reference the file by its id, which every upload mutation returns.

{
  "input": {
    "username": "mychannel",
    "title": "Quick Cooking Hack You Need to Try!",
    "description": "This cooking hack will change your life! Save this for later and try it today.\n\nIngredients mentioned:\n- Ingredient 1\n- Ingredient 2\n\n#cooking #foodhacks #shorts #recipe",
    "tags": ["cooking", "food", "hacks", "recipe", "kitchen"],
    "media": [{ "id": "1044" }],
    "madeForKids": false,
    "privacyStatus": "PUBLIC",
    "submissions": [
      {
        "postAt": "2025-12-01T16:30:00Z"
      }
    ]
  }
}

You can also reference the file by name. Names are matched case-insensitively and the first match wins, so prefer id when several files share a name.

{
  "media": [{ "name": "cooking-hack-video.mp4" }]
}

Kids Content Video

Schedule a YouTube video appropriate for children.

{
  "input": {
    "username": "kidschannel",
    "title": "Fun Learning Song for Kids",
    "description": "Educational and fun song for children to learn colors and shapes!\n\nSafe content for kids with no ads or external links.",
    "tags": ["kids", "education", "learning", "songs", "colors"],
    "media": [{ "url": "https://example.com/kids-song.mp4" }],
    "madeForKids": true,
    "privacyStatus": "PUBLIC",
    "submissions": [
      {
        "postAt": "2025-12-01T14:00:00Z"
      }
    ]
  }
}

Synthetic Media Content

Schedule a video containing AI-generated or altered content.

{
  "input": {
    "username": "techchannel",
    "title": "AI-Generated Video Experiment",
    "description": "Testing out the latest AI video generation tools. This video contains synthetic media created using AI.\n\n#ai #technology #synthetic #experiment",
    "tags": ["ai", "technology", "synthetic", "experiment", "future"],
    "media": [{ "url": "https://example.com/ai-generated-video.mp4" }],
    "madeForKids": false,
    "containsSyntheticMedia": true,
    "privacyStatus": "PUBLIC",
    "submissions": [
      {
        "postAt": "2025-12-01T20:00:00Z"
      }
    ]
  }
}

Unlisted Video

Schedule an unlisted video that won't appear in search results.

{
  "input": {
    "username": "mychannel",
    "title": "Behind the Scenes - Unlisted",
    "description": "Exclusive behind-the-scenes content for our community. This video is unlisted and only accessible via direct link.",
    "tags": ["behind-the-scenes", "exclusive", "community"],
    "media": [{ "url": "https://example.com/bts-video.mp4" }],
    "madeForKids": false,
    "privacyStatus": "UNLISTED",
    "submissions": [
      {
        "postAt": "2025-12-01T12:00:00Z"
      }
    ]
  }
}

Response Types

Success Response

{
  "data": {
    "scheduleYouTubePost": {
      "success": true,
      "errors": [],
      "post": {
        "id": "123",
        "socialAccount": {
          "id": "456",
          "username": "mychannel"
        },
        "publishingStatus": "READY_TO_PUBLISH",
        "title": "Amazing Dance Tutorial #Shorts",
        "description": "Learn this viral dance in just 60 seconds! Follow for more tutorials.\n\n#dance #tutorial #shorts #viral",
        "tags": ["dance", "tutorial", "shorts", "viral", "howto"],
        "madeForKids": false,
        "containsSyntheticMedia": false,
        "privacyStatus": "PUBLIC",
        "gallery": {
          "id": "789",
          "media": [
            {
              "id": "101",
              "url": "https://cdn.example.com/dance-short.mp4",
              "type": "video"
            }
          ]
        },
        "submissions": [
          {
            "id": "112",
            "postAt": "2025-12-01T18:00:00Z",
            "publishingMethod": "AUTOMATIC"
          }
        ]
      }
    }
  }
}

Error Response

{
  "data": {
    "scheduleYouTubePost": {
      "success": false,
      "errors": [
        {
          "field": "title",
          "message": "YouTube video titles cannot exceed 100 characters."
        }
      ],
      "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
mutation UpdateScheduledYouTubePost($input: ScheduleYouTubePostInput!) {
  updateScheduledYouTubePost(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": "mychannelname",
    "title": "Updated Video Title",
    "description": "Updated description",
    "submissions": [{"postAt": "2025-12-01T15:30:00Z"}]
  }
}
The update mutation uses the same input type as the create mutation. Include the 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

The API enforces YouTube's content policies and technical limitations:
  • Video Duration: Maximum 60 seconds for YouTube Shorts, up to 12 hours for regular videos
  • File Size: Maximum 256GB per video
  • Video Format: Supports MP4, MOV, AVI, WMV, FLV, 3GPP, WEBM
  • Aspect Ratios: Vertical (9:16) recommended for Shorts, also supports 16:9 and 1:1
  • Resolution: Up to 4K (3840x2160) supported
  • Frame Rate: Up to 60fps supported
  • Title Length: Maximum 100 characters
  • Description Length: Maximum 5,000 characters
  • Tags: Maximum 500 characters total across all tags
  • COPPA Compliance: Must correctly identify content made for kids
  • Synthetic Media: Must be disclosed if content is AI-generated or altered
  • Scheduling: Posts must be scheduled for future dates only
  • Account Limits: Respects your plan's monthly post limits

Common Errors