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
- Poll every 15–30 minutes, never every minute. This API is cached and rate-limit friendly.
- Fire an alert only when status.overall changes (
not_launched → launched), not on every successful poll. - Do not scrape OpenAI.com or X/Twitter directly from your cron job — that can get your IP rate-limited or blocked. Read this API instead.
- If you use ntfy or a webhook, use a private, unguessable topic/URL — never a public or guessable endpoint.
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.shThen add a cron entry (runs every 15 minutes):
crontab -e
# add this line:
*/15 * * * * ~/.astra-watch/check-astra.sh >> ~/.astra-watch/astra.log 2>&1Option 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"
fiSame 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.