Schedule Action: Schedule posts for future publication Schedule posts for future publication directly via URL scheme. Perfect for automation workflows that need to plan content in advance. Syntax statuz://schedule[?parameters] Parameters ParameterTypeDescriptionRequiredExample textstringPost content (URL-encoded)NoHello%20World dateISO8601Schedule date/timeNo*2024-12-25T10:00:00Z timezonestringTimezone (IANA format)NoAmerica/New_York statusstringdraft or queuedNoqueued mediastringComma-separated file paths/URLsNofile:///path/img.png filesstringAlias for media when passing raw file pathsNo/Users/me/Desktop/img.png threadbooleanCreate threadNotrue autosplitbooleanAuto-split long postsNotrue quotestringURL or ID of post to quoteNohttps://x.com/... platformsstringComma-separated platformsNox,bluesky postingModestringdefaults, allEnabled, or specificNospecific xModestringOverride posting mode for XNoallEnabled blueskyModestringOverride posting mode for BlueskyNodefaults mastodonModestringOverride posting mode for MastodonNospecific xAccountsstringComma-separated X account identifiersNowork,personal blueskyAccountsstringComma-separated Bluesky account identifiersNouser.bsky.social mastodonAccountsstringComma-separated Mastodon identifiersNouser@fosstodon.org xShareWithFollowersstringtrue/1/all or comma-separated IDsNotrue stealthModebooleanSchedule silently without opening UI (default: false)Notrue * Date is optional but recommended. If omitted with status=queued, defaults to 1 hour from now. Status Behavior draft (default) Saves the post without scheduling automatic publishing. The post appears in your calendar with the specified date, but requires manual publishing. queued Schedules the post for automatic publishing at the specified time. If no date is provided, defaults to 1 hour from now. Account & Platform Selection • platforms targets x, bluesky, mastodon, or all (comma-separated). • postingMode mirrors the Statuz UI: defaults, allEnabled, or specific. Per-platform overrides (xMode, blueskyMode, mastodonMode) take precedence for that platform. • Account arrays (xAccounts, blueskyAccounts, mastodonAccounts) accept usernames, nicknames, or account UUIDs. Format handles as: • X: username (no @) • BlueSky: user.bsky.social • Mastodon: user@instance.social • xShareWithFollowers enables X’s share-with-followers flow: set to true, 1, all, or provide a comma-separated list of account identifiers. Stealth Mode URL-scheme calls default to stealthMode=false, which opens the scheduling UI. Pass stealthMode=true to insert directly into the queue without showing any windows (ideal for unattended automations). Examples Basic Scheduled Post Schedule a post for a specific date and time: TEXT="Good morning everyone!" DATE="2025-01-20T09:00:00Z" ENCODED=$(printf %s "$TEXT" | jq -sRr @uri) open "statuz://schedule?text=$ENCODED&date=$DATE&status=queued" Schedule with Timezone Specify a timezone for local scheduling: TEXT="Lunch announcement" DATE="2025-01-20T12:00:00" TZ="America/New_York" ENCODED=$(printf %s "$TEXT" | jq -sRr @uri) open "statuz://schedule?text=$ENCODED&date=$DATE&timezone=$TZ&status=queued" Schedule 1 Hour Ahead Omit the date to schedule 1 hour from now: TEXT="Quick update" ENCODED=$(printf %s "$TEXT" | jq -sRr @uri) open "statuz://schedule?text=$ENCODED&status=queued" Save as Draft Schedule a post as a draft (won't auto-publish): TEXT="Review this later" DATE="2025-01-20T14:00:00Z" ENCODED=$(printf %s "$TEXT" | jq -sRr @uri) open "statuz://schedule?text=$ENCODED&date=$DATE&status=draft" Schedule with Media Schedule a post with attached media: TEXT="Check out these results" DATE="2025-01-20T10:00:00Z" MEDIA="file:///Users/me/Desktop/chart.png" ENCODED_TEXT=$(printf %s "$TEXT" | jq -sRr @uri) ENCODED_MEDIA=$(printf %s "$MEDIA" | jq -sRr @uri) open "statuz://schedule?text=$ENCODED_TEXT&date=$DATE&media=$ENCODED_MEDIA&status=queued" Schedule Thread Schedule a multi-post thread: TEXT="Post 1: Introduction Post 2: Main content Post 3: Conclusion" DATE="2025-01-20T14:00:00Z" ENCODED=$(printf %s "$TEXT" | jq -sRr @uri) open "statuz://schedule?text=$ENCODED&date=$DATE&thread=true&status=queued" Schedule to Specific Platforms Target specific platforms: TEXT="Platform-specific announcement" DATE="2025-01-20T10:00:00Z" PLATFORMS="x,bluesky" ENCODED=$(printf %s "$TEXT" | jq -sRr @uri) open "statuz://schedule?text=$ENCODED&date=$DATE&platforms=$PLATFORMS&status=queued" Advanced Scheduling Daily Morning Posts #!/bin/bash # Schedule tomorrow morning's post TOMORROW=$(date -v+1d -u +"%Y-%m-%dT14:00:00Z") # 9 AM EST TEXT="Good morning! Daily standup: ✅ Yesterday: Shipped features 📝 Today: Bug fixes 🚫 Blockers: None" ENCODED=$(printf %s "$TEXT" | jq -sRr @uri) open "statuz://schedule?text=$ENCODED&date=$TOMORROW&status=queued" Weekly Recap #!/bin/bash # Schedule Friday afternoon recap FRIDAY=$(date -v friday -u +"%Y-%m-%dT21:00:00Z") # 4 PM EST TEXT="🎉 Week in Review This week we: - Launched 3 features - Fixed 12 bugs - Improved performance by 25% Have a great weekend!" ENCODED=$(printf %s "$TEXT" | jq -sRr @uri) open "statuz://schedule?text=$ENCODED&date=$FRIDAY&status=queued" Schedule Multiple Posts #!/bin/bash # Schedule a series of posts DATES=( "2025-01-20T09:00:00Z" "2025-01-20T14:00:00Z" "2025-01-20T18:00:00Z" ) TEXTS=( "Morning update" "Afternoon check-in" "Evening wrap-up" ) for i in ${!DATES[@]}; do TEXT="${TEXTS[$i]}" DATE="${DATES[$i]}" ENCODED=$(printf %s "$TEXT" | jq -sRr @uri) open "statuz://schedule?text=$ENCODED&date=$DATE&status=queued" sleep 1 # Avoid race conditions done Relative Scheduling #!/bin/bash # Schedule posts at relative times schedule_in_hours() { local text=$1 local hours=$2 local date=$(date -v+${hours}H -u +"%Y-%m-%dT%H:%M:%SZ") local encoded=$(printf %s "$text" | jq -sRr @uri) open "statuz://schedule?text=$encoded&date=$date&status=queued" } schedule_in_hours "1 hour from now" 1 schedule_in_hours "3 hours from now" 3 schedule_in_hours "Tomorrow same time" 24 Date Format Reference Statuz accepts ISO 8601 date/time formats: UTC Time 2025-01-20T10:00:00Z With Timezone Offset 2025-01-20T10:00:00-05:00 # EST 2025-01-20T10:00:00+01:00 # CET Local Time (no timezone) 2025-01-20T10:00:00 Interpreted as local timezone unless timezone parameter is provided. Date Only 2025-01-20 Defaults to midnight local time. Timezone Reference Use IANA timezone identifiers: Americas • America/New_York - Eastern Time (US & Canada) • America/Chicago - Central Time (US & Canada) • America/Denver - Mountain Time (US & Canada) • America/Los_Angeles - Pacific Time (US & Canada) • America/Toronto - Toronto • America/Sao_Paulo - Brasília Europe • Europe/London - London, UK • Europe/Paris - Paris, France • Europe/Berlin - Berlin, Germany • Europe/Madrid - Madrid, Spain • Europe/Rome - Rome, Italy • Europe/Stockholm - Stockholm, Sweden Asia/Pacific • Asia/Tokyo - Tokyo, Japan • Asia/Shanghai - Beijing, Shanghai • Asia/Singapore - Singapore • Asia/Dubai - Dubai, UAE • Australia/Sydney - Sydney, Australia • Pacific/Auckland - Auckland, New Zealand Full IANA timezone list (https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) Integration Examples Python Automation #!/usr/bin/env python3 from datetime import datetime, timedelta from urllib.parse import quote import subprocess # Schedule for tomorrow at 9 AM tomorrow = datetime.now() + timedelta(days=1) schedule_time = tomorrow.replace(hour=9, minute=0, second=0) iso_time = schedule_time.strftime('%Y-%m-%dT%H:%M:%S') text = "Daily update: All systems operational ✅" encoded_text = quote(text) url = f"statuz://schedule?text={encoded_text}&date={iso_time}&timezone=America/New_York&status=queued" subprocess.run(['open', url]) Node.js Script #!/usr/bin/env node const { exec } = require('child_process'); // Schedule 2 hours from now const scheduleDate = new Date(); scheduleDate.setHours(scheduleDate.getHours() + 2); const isoDate = scheduleDate.toISOString(); const text = "Scheduled update from automation"; const encoded = encodeURIComponent(text); const url = `statuz://schedule?text=${encoded}&date=${isoDate}&status=queued`; exec(`open "${url}"`); AppleScript -- Schedule post via AppleScript set postText to "Automated post from AppleScript" set scheduleDate to "2025-01-20T14:00:00Z" set encodedText to do shell script "printf %s " & quoted form of postText & " | jq -sRr @uri" set theURL to "statuz://schedule?text=" & encodedText & "&date=" & scheduleDate & "&status=queued" do shell script "open " & quoted form of theURL Error Handling Common errors and solutions: Invalid Date Format ❌ Error: "Invalid date format" ✅ Fix: Use ISO 8601: 2025-01-20T10:00:00Z Date in Past ❌ Error: "Schedule date must be in the future" ✅ Fix: Verify your date is ahead of current time Invalid Timezone ❌ Error: "Unknown timezone" ✅ Fix: Use IANA identifiers: America/New_York Missing Text ❌ Error: "Text parameter is required" ✅ Fix: Always include text parameter Best Practices • Always specify timezone for clarity in automated schedules • Use UTC for cross-timezone posting (add Z suffix) • Add error handling in scripts to catch scheduling failures • Test with drafts first (status=draft) before using queued • Check schedule in calendar after automated scheduling • Use relative dates for recurring schedules (e.g., +1 day) Platform Limits Each platform has scheduling restrictions: X (Twitter) • Can schedule up to 18 months in advance • Minimum 5 minutes in the future BlueSky • No specific scheduling limits • Recommended at least 1 minute in the future Mastodon • Instance-dependent limits • Typically allows scheduling months in advance Related • Compose Action (/docs/url-scheme-compose) - Create posts immediately • Scheduled Action (/docs/url-scheme-scheduled) - Edit scheduled posts • Calendar Action (/docs/url-scheme-calendar) - View scheduled posts • Examples (/docs/url-scheme-examples) - More code examples Try Statuz today, it's free. Download for macOS (/download)