← Back to status page

Set up your own Astra watcher

Point your own cron job / scheduled task at the public JSON API and get pinged the moment the status changes. Everything below is copy-paste.

API endpoint: https://astra-rollout-watch.vercel.app/api/status

How the API works

GET /api/status returns JSON with a status object and a generatedAt timestamp. The status is manual ground truth — it does not scrape OpenAI or X on every request, so it is safe to poll and cannot be abused as an external request amplifier.

The top-level status.overall field is the one to watch: it stays not_launched until an official OpenAI source confirms availability, then flips to launched. Alert only on a transition — store the last status.overall value and ping yourself only when it changes. Do not alert on every poll.

{
  "generatedAt": "2026-09-03T22:20:57.978Z",
  "status": {
    "overall": "not_launched",
    "officialLaunch": "not_confirmed",
    "chatgptAvailability": "not_detected",
    "apiAvailability": "not_detected",
    "awsAvailability": "not_detected",
    "cyberAccess": "restricted_or_unknown"
  },
  "summary": "Astra has not launched publicly. No confirmed general availability or ChatGPT / API / AWS access."
}

Polling & anti-spam rules

Option A — Linux / macOS cron (curl + jq)

Requires curl and jq (install with brew install jq on macOS, or apt install jq on Debian/Ubuntu).

mkdir -p ~/.astra-watch
cat > ~/.astra-watch/check-astra.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

STATUS_URL="https://astra-rollout-watch.vercel.app/api/status"
STATE_FILE="$HOME/.astra-watch/last-status.json"

current="$(curl -fsSL "$STATUS_URL")"
summary="$(echo "$current" | jq -r '.status | to_entries | map("\(.key)=\(.value)") | join("; ")')"

if [ ! -f "$STATE_FILE" ]; then
  echo "$current" > "$STATE_FILE"
  echo "Initial Astra status: $summary"
  exit 0
fi

previous_summary="$(jq -r '.status | to_entries | map("\(.key)=\(.value)") | join("; ")' "$STATE_FILE")"

if [ "$summary" != "$previous_summary" ]; then
  echo "$current" > "$STATE_FILE"
  echo "ASTRA STATUS CHANGED:"
  echo "  Before: $previous_summary"
  echo "  After:  $summary"
fi
EOF

chmod +x ~/.astra-watch/check-astra.sh

Then add a cron entry (runs every 15 minutes):

crontab -e
# add this line:
*/15 * * * * ~/.astra-watch/check-astra.sh >> ~/.astra-watch/astra.log 2>&1

Option B — Push notification via ntfy (no account needed)

ntfy.sh is a free push-notification service. Pick a random, unguessable topic name (so only you get the alerts), install the ntfy app, subscribe to that topic, then use this script instead.

#!/usr/bin/env bash
set -euo pipefail

STATUS_URL="https://astra-rollout-watch.vercel.app/api/status"
STATE_FILE="$HOME/.astra-watch/last-status.json"
NTFY_TOPIC="your-private-topic-name"   # change me

current="$(curl -fsSL "$STATUS_URL")"
summary="$(echo "$current" | jq -r '.status | to_entries | map("\(.key)=\(.value)") | join("; ")')"

if [ -f "$STATE_FILE" ]; then
  previous_summary="$(jq -r '.status | to_entries | map("\(.key)=\(.value)") | join("; ")' "$STATE_FILE")"
else
  previous_summary=""
fi

if [ "$summary" != "$previous_summary" ]; then
  echo "$current" > "$STATE_FILE"
  curl -fsS \
    -H "Title: Astra Rollout Watch" \
    -H "Priority: high" \
    -d "Astra status changed: $summary  https://astra-rollout-watch.vercel.app" \
    "https://ntfy.sh/$NTFY_TOPIC"
fi

Same cron line as Option A. Swap the ntfy.sh URL for any Slack/Discord webhook to push there instead.

Option C — Windows Task Scheduler (PowerShell)

No third-party tools required — uses PowerShell's built-in Invoke-RestMethod.

New-Item -ItemType Directory -Force "$env:USERPROFILE\.astra-watch" | Out-Null

@'
$statusUrl = "https://astra-rollout-watch.vercel.app/api/status"
$stateFile = "$env:USERPROFILE\.astra-watch\last-status.json"

$current = Invoke-RestMethod -Uri $statusUrl
$summary = ($current.status.PSObject.Properties | ForEach-Object { "$($_.Name)=$($_.Value)" }) -join "; "

if (Test-Path $stateFile) {
  $previous = Get-Content $stateFile -Raw | ConvertFrom-Json
  $previousSummary = ($previous.status.PSObject.Properties | ForEach-Object { "$($_.Name)=$($_.Value)" }) -join "; "
} else {
  $previousSummary = ""
}

if ($summary -ne $previousSummary) {
  $current | ConvertTo-Json -Depth 10 | Set-Content $stateFile
  Write-Output "ASTRA STATUS CHANGED: $summary"
}
'@ | Set-Content "$env:USERPROFILE\.astra-watch\check-astra.ps1"

Then register a scheduled task that runs it every 15 minutes:

$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$env:USERPROFILE\.astra-watch\check-astra.ps1`""
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 15)
Register-ScheduledTask -TaskName "Astra Rollout Watch" -Action $action -Trigger $trigger -Description "Checks Astra rollout status every 15 minutes"

Option D — Just bookmark it

Want something even simpler? The status page has a "Refresh status" button, and the API returns Cache-Control: no-store, so every refresh is a live check against the sources.