URL Scheme API

Schedule Action

Schedule posts for future publication with precise date/time control

Schedule Action

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 identifiersNo[email protected]
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:
  • 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

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

  1. Always specify timezone for clarity in automated schedules
  2. Use UTC for cross-timezone posting (add Z suffix)
  3. Add error handling in scripts to catch scheduling failures
  4. Test with drafts first (status=draft) before using queued
  5. Check schedule in calendar after automated scheduling
  6. 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

Try Statuz today,
it's free.