Documentation Index
Fetch the complete documentation index at: https://activitysmith.com/docs/llms.txt
Use this file to discover all available pages before exploring further.


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 adam@activitysmith.com.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.
- Widgets: display any value on your Lock Screen with widgets - SaaS metrics, revenue, signups, uptime, habits, or anything else you want to track.
- Inbound Webhooks: forward events from external services such as Vercel, Netlify, Railway, and more, into Push Notifications and Live Activities.
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
There are four types of Live Activities:| Type | Best for | Required state |
|---|---|---|
stats | up to 8 labeled values | title, type, and a non-empty metrics array |
metrics | Live operational stats | title, type, and a non-empty metrics array |
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 |
When working with Live Activities via our API, you have two approaches tailored
to different needs.
Simple: stream updates
Use stream updates when you want the easiest, stateless flow. Send the latest state for a stablestream_key, and ActivitySmith starts or
updates the Live Activity for you. You do not need to store activity_id or
manage the lifecycle yourself.
Advanced: full lifecycle control
Use the lifecycle endpoints when you want full control over a specific Live Activity instance.- 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.
Stats Type
Stats supports up to 8 items in themetrics array. Each metric takes a
label, and a formatted string or numeric value. Add an optional color when you want a small visual cue. Leave it out when you want plain text.
Stream
Use a stablestream_key and send the latest values whenever they change.
ActivitySmith starts the Live Activity on the first call and updates it on
subsequent calls, so you do not need to store activity_id.
Metrics Type
Usemetrics to keep a small set of live numbers visible on the Lock Screen
and Dynamic Island. It fits server health, queue pressure, replica lag, worker
saturation, and similar backend state you want to glance at without opening a
dashboard.
Each entry in the metrics array takes a label, a numeric value, and an
optional unit.
Stream
Use a stablestream_key (such as a server, deployment, or job name) and send
the latest values whenever they change. ActivitySmith starts the Live Activity
on the first call and updates it on subsequent calls - you do not need to track
activity_id.
stream_key again whenever values change to update the Live
Activity in place.
End the stream
When the tracked process is finished, end the stream so the Live Activity is removed from devices.content_state is optional - include it to end with a
final state.
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.
Action Button
Live Activities support one optionalaction button shown on the Lock Screen. Use it to have a one-tap path from a long-running
job to the place where you can act on it. The action field is accepted on
start, update, and end calls, and works with all Live Activity types.


open_url: opens the provided HTTPS URL in the browser.webhook: ActivitySmith’s backend calls your HTTPS webhook withGETorPOST.
action object accepts:
| Field | Required | Description |
|---|---|---|
title | yes | Button label shown on the Live Activity. |
type | yes | Either open_url or webhook. |
url | yes | HTTPS endpoint to open or call. |
method | webhook only | GET or POST. |
body | webhook only | Optional JSON payload sent with the webhook request. |
open_url
Useopen_url when the button should jump the user to a dashboard, run page,
or any browser destination tied to the work.
webhook
Usewebhook when the button should trigger an action in your backend, like
pausing a job, acknowledging an alert, or canceling a workflow. ActivitySmith
calls the URL server-side, so the user does not leave the Lock Screen.
- Only HTTPS URLs are supported for both action types.
- One button per Live Activity.
- Pass
actionon an update call to set or replace the button on an active Live Activity.
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.