

Welcome to ActivitySmith
ActivitySmith is API service that lets you trigger and update Live Activities and send push notifications directly from your own infrastructure. Pair your iOS device(s), authenticate with an API key, and send real-time alerts from any backend, cron, agent, or automation. Without building or maintaining your own iOS app or dealing directly with APNs. Check out the following resources to get started: Want an SDK or Integration? Let us know at [email protected].Prerequisites
- Create an API key
- Download our iOS app and pair your device(s)
Features
- Push Notifications: send push notifications to all paired devices or target specific channels.
- Live Activities: start, update and end a Live Activity on your lock screen or dynamic island, with optional channel targeting and one optional action button.
Powerful Capabilities
- Glanceable observability: monitor real-time system state and long-running operations directly on your lock screen or dynamic island.
- The hard stuff: APNs(Apple Push Notification service), certificates, orchestration
- Customizability: adapt the experience to fit your unique needs.
- Works with any backend: use with any backend, cron, agent, automation or AI tool.
- iOS app: ready to use native iOS app for your iPhone or iPad. No need to build your own.
Push Notifications
To send a push notification, use thepush-notification endpoint. It takes title and optional fields like message, payload, media, redirection, actions, and target.channels.target.channels accepts channel slugs (for example ["devs", "ops"]).
mediaattaches an image, audio file, or video that users can preview or play when they expand the notification.redirectionopens on normal tap.actions(up to 4) appear when users expand the notification.media + redirectionis supported.media + actionsis not supported in v1.
Live Activities
Live Activities come in two UI types, but the delivery flow stays the same: start the activity, keep the returnedactivity_id, update it as state
changes, then end it when the work is done.
| Type | Best for | Required state |
|---|---|---|
segmented_progress | Jobs tracked in steps | title, type, number_of_steps, current_step |
progress | Jobs with continuous progress | title, type, and either percentage or value + upper_limit |
For segmented_progress, number_of_steps does not need to stay fixed. You
can increase or decrease it in later update or end calls if the workflow
changes.
Live Activities can also include one optional action button. Use open_url
when the button should open a browser destination, or webhook when
ActivitySmith backend should call your HTTPS webhook.
Shared flow
- Call
POST /live-activity/start. - Save the returned
activity_id. - Call
POST /live-activity/updatewhenever progress changes. - Call
POST /live-activity/endwhen the work is finished.
Start response
Starting a Live Activity returns theactivity_id you will use for later
updates and for the final end call.
Update and end response
Update and end calls return the same activity ID plus the delivery result.Segmented Progress Type
Usesegmented_progress for jobs and workflows that move through clear steps or
phases. It fits jobs like backups, deployments, ETL pipelines, and checklists.
number_of_steps is dynamic, so you can increase or decrease it later if the
workflow changes.
Start
Start withtitle, type: "segmented_progress", number_of_steps, and
current_step. Add subtitle, color, and target.channels if needed.
Update
Update the same activity withactivity_id and the latest current_step. If
the workflow changes, you can also increase or decrease number_of_steps.
End
End the activity with the final state. You can send the latestcurrent_step, adjust number_of_steps if needed, and optionally set
auto_dismiss_minutes.
Progress Type
Useprogress when the state is naturally continuous. It fits charging,
downloads, sync jobs, uploads, timers, and any flow where a percentage or
numeric range is the clearest signal.
Start
Start withtitle, type: "progress", and either percentage or value plus
upper_limit. Add subtitle, color, and target.channels if needed.
Update
Update the same activity withactivity_id and the latest percentage, or
send value with upper_limit.
End
End the activity with the final value.auto_dismiss_minutes is optional.
Channel Targeting
You can scope delivery with channel slugs:- If
targetis omitted and API key scope isall: send to all account recipients. - If
targetis omitted and API key scope ischannels: send to channels assigned to that key. - If
target.channelsis present: only those channel slugs are used.