Skip to main content
ActivitySmith Live ActivitiesActivitySmith Push Notifications

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

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.

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 the push-notification endpoint. It takes title and optional fields like message, payload, redirection, actions, and target.channels.
target.channels accepts channel slugs (for example ["devs", "ops"]).
  • redirection opens on normal tap.
  • actions (up to 4) show on long-press in iOS expanded notification UI.
Push Notification
curl -X POST https://activitysmith.com/api/push-notification \
  -H "Authorization: Bearer $ACTIVITYSMITH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "New subscription 💸",
    "message": "Customer upgraded to Pro plan"
  }'
Response
{
  "success": true,
  "devices_notified": 3,
  "users_notified": 1,
  "timestamp": "2025-08-12T12:00:00.000Z"
}

Live Activities

/start endpoint

To start a Live Activity, use the live-activity/start endpoint. It takes a content_state payload and starts a Live Activity on your lock screen or dynamic island.
You can optionally pass target.channels with channel slugs to scope recipients. For a segmented progress activity, include title, current_step, type, and number_of_steps.
Live Activity Start
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": "Nightly database backup",
      "subtitle": "create snapshot",
      "number_of_steps": 3,
      "current_step": 1,
      "type": "segmented_progress",
      "color": "yellow"
    }
  }'

Response

It returns a activity_id that you can use to update or end the Live Activity.
{
  "success": true,
  "activity_id": "pLAr-Hnq9ZFW4sxlk43Lhbuok4GLh7UW",
  "devices_notified": 2,
  "users_notified": 1,
  "timestamp": "2026-01-28T09:57:22.929Z"
}

/update endpoint

To update the Live Activity, call live-activity/update with the activity_id and a content_state payload (minimum: title, current_step). Live Activity Update
curl -X POST https://activitysmith.com/api/live-activity/update \
  -H "Authorization: Bearer $ACTIVITYSMITH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "activity_id": "pLAr-Hnq9ZFW4sxlk43Lhbuok4GLh7UW",
    "content_state": {
      "title": "Nightly database backup",
      "subtitle": "upload archive",
      "current_step": 2
    }
  }'

Response

{
  "success": true,
  "activity_id": "pLAr-Hnq9ZFW4sxlk43Lhbuok4GLh7UW",
  "devices_notified": 2,
  "timestamp": "2026-01-28T09:57:26.056Z"
}

/end endpoint

To end the Live Activity, call live-activity/end with the activity_id and the content state. Live Activity End
curl -X POST https://activitysmith.com/api/live-activity/end \
  -H "Authorization: Bearer $ACTIVITYSMITH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "activity_id": "pLAr-Hnq9ZFW4sxlk43Lhbuok4GLh7UW",
    "content_state": {
      "title": "Nightly database backup",
      "subtitle": "verify restore",
      "current_step": 3
    }
  }'

Response

{
  "success": true,
  "activity_id": "pLAr-Hnq9ZFW4sxlk43Lhbuok4GLh7UW",
  "devices_notified": 2,
  "timestamp": "2026-01-28T09:57:29.258Z"
}

Channel Targeting

You can scope delivery with channel slugs:
{
  "target": {
    "channels": ["devs", "ops"]
  }
}
  • If target is omitted and API key scope is all: send to all account recipients.
  • If target is omitted and API key scope is channels: send to channels assigned to that key.
  • If target.channels is present: only those channel slugs are used.