
Live Activities for long-running backend workflows
Keep in-progress deploys, migrations, incidents, jobs, automations, and AI agent runs visible on iPhone and iPad until the work is done.

Start a Live Activity with one API call
The start endpoint creates a Live Activity and returns an activity_id. Use that ID to push step updates during execution, then end the activity when work completes.
curl -X POST https://activitysmith.com/api/live-activity/start \
-H "Authorization: Bearer $ACTIVITYSMITH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content_state": {
"title": "ActivitySmith API Deployment",
"subtitle": "start",
"number_of_steps": 5,
"current_step": 1,
"type": "segmented_progress"
}
}'Two Live Activity types
ActivitySmith supports two Live Activity types. Both use the same start, update, and end lifecycle, but each fits a different kind of workflow and progress display.
Segmented Progress
Best for jobs tracked in steps. Use it for deployments, backups, ETL pipelines, and checklists where "step 2 of 4" is more useful than a raw percentage.
number_of_steps can increase or decrease as the workflow changes.

Progress
Best for jobs tracked as a percentage or numeric range. Use it for EV charging, downloads, uploads, sync jobs, timers, and other continuous work.
Send either percentage or value with upper_limit.

Lifecycle from start to finish
Use the same lifecycle in every SDK and CLI. Pick the type that matches the way your workflow progresses.
Segmented Progress lifecycle
Use this when work moves through named steps and you want the activity to show the current stage clearly.
Start

const start = await activitysmith.liveActivities.start({
content_state: {
title: "Nightly database backup",
subtitle: "create snapshot",
number_of_steps: 3,
current_step: 1,
type: "segmented_progress",
color: "yellow",
},
channels: ["devs", "ops"], // Optional
});
const activityId = start.activity_id;Update

const update = await activitysmith.liveActivities.update({
activity_id: activityId,
content_state: {
title: "Nightly database backup",
subtitle: "upload archive",
current_step: 2,
},
});End

const end = await activitysmith.liveActivities.end({
activity_id: activityId,
content_state: {
title: "Nightly database backup",
subtitle: "verify restore",
current_step: 3,
auto_dismiss_minutes: 2,
},
});Progress lifecycle
Use this when progress is continuous and a percentage or numeric range is the clearest signal.
Start

const start = await activitysmith.liveActivities.start({
content_state: {
title: "EV Charging",
subtitle: "Added 30 mi range",
type: "progress",
percentage: 15,
color: "lime",
},
});
const activityId = start.activity_id;Update

await activitysmith.liveActivities.update({
activity_id: activityId,
content_state: {
title: "EV Charging",
subtitle: "Added 120 mi range",
percentage: 60,
},
});End

await activitysmith.liveActivities.end({
activity_id: activityId,
content_state: {
title: "EV Charging",
subtitle: "Added 200 mi range",
percentage: 100,
auto_dismiss_minutes: 2,
},
});Integrate in minutes
Pick your stack and start triggering live activities in a few lines of code.
Keep long-running backend work visible to everyone
Give your team one persistent progress channel from start to finish, then clear the activity cleanly when the workflow ends.