Notifications
One-shot push notifications to every device signed in to your Chirp account. No persistent card, no lifecycle — just a title, a body, and optional rich fields like images, sounds, and tap-to-open URLs.
Quick start
The simplest way to send a notification is a single HTTP request. Replace $CHIRP_API_KEY with your API key from the dashboard.
curl -X POST https://api.chirpapp.dev/v1/notify \
-H "Authorization: Bearer $CHIRP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Hello from Chirp","body":"Your first notification!"}'Every SDK and integration wraps this endpoint. See the integrations page for language-specific examples — use the Live Activity / Notification toggle on each integration page to switch between the two modes.
Notifications vs Live Activities
Notification
- Fire-and-forget — no lifecycle to manage
- Supports images, sounds, subtitles, tap-to-open URLs
- Groups via thread_id in Notification Center
- Best for: alerts, one-time events, status updates
Live Activity
- Persistent card on the lock screen and Dynamic Island
- Start → update → end lifecycle
- Rich template layouts (@deploy, @agent, @training, etc.)
- Best for: long-running tasks, builds, training runs, monitoring
Schema reference
POST to /v1/notify with a JSON body containing any of these fields.
titlerequiredFirst line of the notification. Max 200 characters.
bodyrequiredPrimary content of the notification. Max 4000 characters.
subtitleLine displayed below the title in smaller text. Useful for source or category labels.
soundUse "default" for the standard iOS notification sound, or the name of a custom sound bundled in the app (e.g. "chirp"). Omit to use the default sound.
image_urlLink to an image (JPEG, PNG, or GIF, under 10 MB). The image is downloaded and displayed as a rich notification attachment. Requires the Chirp app to have the Notification Service Extension installed.
open_urlURL to open when the user taps the notification. External URLs open in the browser; deep links (chirp://) route inside the app.
thread_idGroups related notifications together in Notification Center. Use consistent thread IDs to bundle notifications (e.g. all deploy alerts under "deploys").
interruption_levelControls how urgently the notification is delivered. Options: "passive" (silent, no screen wake), "active" (default — sound + screen), "time-sensitive" (breaks through Focus and Notification Summary), "critical" (overrides mute, requires Apple entitlement).
volumeSound volume for critical alerts only. Only applies when interruption_level is "critical". Defaults to full volume (1).
filter_criteriaMatches a Focus filter configured on the device. If the active Focus allows this criterion, the notification can be shown.
dataArbitrary key-value data passed to the app. Not displayed in the notification itself, but accessible in notification handlers.
priorityDelivery priority hint. "high" (default for notifications), "normal", or "default". High-priority notifications wake the device; normal may be batched.
Examples
Minimal notification
curl -X POST https://api.chirpapp.dev/v1/notify \
-H "Authorization: Bearer $CHIRP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Deploy complete","body":"my-app v2.4.1 is live"}'Rich notification with image and tap URL
curl -X POST https://api.chirpapp.dev/v1/notify \
-H "Authorization: Bearer $CHIRP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "New order",
"body": "$129.99 from [email protected]",
"subtitle": "Shopify",
"sound": "default",
"image_url": "https://cdn.example.com/product-thumb.jpg",
"open_url": "https://admin.shopify.com/orders/12345",
"thread_id": "orders"
}'Time-sensitive alert
Breaks through Focus and Notification Summary on the user’s device.
curl -X POST https://api.chirpapp.dev/v1/notify \
-H "Authorization: Bearer $CHIRP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Server down",
"body": "api-prod-3 is unreachable. Last ping 45s ago.",
"sound": "default",
"interruption_level": "time-sensitive"
}'Python SDK
import chirp
chirp.notify(
title="Build complete",
body="my-app v2.4.1 deployed to production",
sound="default",
thread_id="deploys",
)
# With all options:
chirp.notify(
title="Payment received",
body="$49.99 from [email protected]",
subtitle="Stripe",
sound="chirp",
image_url="https://example.com/receipt.png",
open_url="https://dashboard.stripe.com/payments/pi_123",
interruption_level="active",
)Node SDK
import { ChirpClient } from "chirp";
const chirp = new ChirpClient();
await chirp.notify("Build complete", "my-app v2.4.1 deployed to production", {
sound: "default",
thread_id: "deploys",
});Bash helper
source ~/.chirp.sh
chirp_notify "Deploy done" "my-app is live"Sounds
The sound field controls what plays when the notification arrives.
"default"Standard iOS notification sound."chirp"Custom Chirp notification sound (bundled in the app).- omittedDefault notification sound.
Interruption levels
iOS lets you control how urgently a notification is presented. Set the interruption_level field to one of these values.
passiveSilently added to Notification Center. No sound, no screen wake, no banner. Use for low-priority informational updates.
activeDefault behavior. Presents a banner, lights up the screen, plays the sound. This is what you get when you omit the field entirely.
time-sensitiveBreaks through Focus and Notification Summary. Use for alerts that need immediate attention — server down, deployment failures, security events.
criticalOverrides the mute switch and Do Not Disturb. Plays at the volume specified by the volume field. Requires the critical alerts entitlement from Apple — contact us to enable this.
Image attachments
Pass an image_url and the Chirp app’s Notification Service Extension will download the image and attach it to the notification. The image appears as a thumbnail that the user can expand with a long-press or 3D Touch.
- Supported formats: JPEG, PNG, GIF (including animated GIFs)
- Maximum size: 10 MB
- The URL must be publicly accessible (no auth headers are sent)
- Download must complete within 30 seconds (Apple’s limit)
Thread grouping
Set thread_id to group related notifications in Notification Center. All notifications with the same thread ID are bundled together — the user sees a stack instead of individual items.
Good thread IDs are stable, meaningful strings like deploys, orders, ci-main, or alerts-prod.
Tap-to-open URLs
Set open_url to open a link when the user taps the notification. External URLs (https://) open in the browser. The app’s internal deep links (chirp://) route to the appropriate screen.
Send notifications from…
Use the Notification toggle on each integration page to see the notification-specific setup.