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.

ActivitySmith Live Activities on iPhone

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"
}
}'
View Live Activities docs

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.

Segmented progress Live Activity on iPhone

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.

Progress Live Activity on iPhone

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

Segmented progress start example
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

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

End

Segmented progress end example
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

Progress start example
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

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

End

Progress end example
await activitysmith.liveActivities.end({
activity_id: activityId,
content_state: {
title: "EV Charging",
subtitle: "Added 200 mi range",
percentage: 100,
auto_dismiss_minutes: 2,
},
});

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.