How to Schedule YouTube Uploads with the publishAt Timestamp
Upload videos as private and set a future publishAt time so they go live on a schedule without you being at the keyboard.
Posting at a consistent time helps the algorithm and your viewers. Instead of staying up to hit publish, you can upload privately and set a publishAt timestamp so YouTube flips the video to public for you. This guide shows the exact field and format.
What you need
- A working upload script (see the Python upload guide)
- Python 3.9+ with the google client
- The target publish time in your head, in UTC
Step 1: Understand the two required fields
To schedule, the status block must set privacyStatus to private and include publishAt as an RFC 3339 timestamp in UTC. YouTube keeps the video private until that moment, then publishes it automatically.
Step 2: Build a UTC timestamp
Compute the timestamp safely instead of typing it by hand. This snippet schedules a video for the next day at 15:00 UTC.
from datetime import datetime, timedelta, timezone
def publish_at(days_ahead=1, hour_utc=15):
when = datetime.now(timezone.utc) + timedelta(days=days_ahead)
when = when.replace(hour=hour_utc, minute=0, second=0, microsecond=0)
# RFC 3339, e.g. 2026-06-22T15:00:00Z
return when.strftime("%Y-%m-%dT%H:%M:%SZ")
print(publish_at()) # -> 2026-06-22T15:00:00ZStep 3: Add it to the upload body
Reuse your upload script and replace the status block with the scheduled version. Everything else (snippet, media upload) stays the same.
body = {
"snippet": {
"title": "Friday build log",
"description": "This week's progress.",
"categoryId": "22",
},
"status": {
"privacyStatus": "private",
"publishAt": publish_at(days_ahead=2, hour_utc=15),
},
}Result
The video uploads now and YouTube publishes it at your chosen UTC time. Studio shows it as Scheduled, so you can batch a week of content and walk away.
Watch related tutorials
20:00
138:00
35:40
20:00
07:00
18:20