ActivitySmith Python SDK
Installation
Install the ActivitySmith Python SDK with pip:
pip install activitysmith
Quickstart
- Create an API key
- Set
ACTIVITYSMITH_API_KEYor pass it directly toActivitySmith.
import os
from activitysmith import (
ActivitySmith,
action,
alert_badge,
alert_icon,
content_state,
metric,
)
activitysmith = ActivitySmith(api_key=os.environ["ACTIVITYSMITH_API_KEY"])
Push Notifications
Send a Push Notification
Send an immediate notification for a completed task or event.
activitysmith.notifications.send(
title="New subscription 💸",
message="Customer upgraded to Pro plan",
)
Custom Push Notification Icons
Set icon to a publicly accessible HTTPS image URL to show an avatar or service logo alongside a smaller ActivitySmith app icon. With a custom icon, iOS may omit the subtitle from the notification.
activitysmith.notifications.send(
title="MRR just crossed $10,000 🎉",
message="Up 18% this month from 31 new subscriptions.",
icon="https://cdn.activitysmith.com/integrations/icons/stripe.png",
)
Rich Push Notifications with Media
activitysmith.notifications.send(
title="Homepage ready",
message="Your agent finished the redesign.",
media="https://cdn.example.com/output/homepage-v2.png",
)
Attach images, videos, or audio to your Push Notifications. Press and hold the notification to preview the media.
What will work:
- direct image URL:
.jpg,.png,.gif, etc. - direct audio file URL:
.mp3,.m4a, etc. - direct video file URL:
.mp4,.mov, etc. - URL that responds with a proper media
Content-Type, even if the path has no extension
media cannot be combined with actions.
Push Notifications with Redirection
Open a web page, run an iOS Shortcut, or open an app when someone taps the notification. redirection supports:
- HTTP/HTTPS: Web pages, e.g.
https://example.com - Shortcuts: Run Jarvis with
shortcuts://run-shortcut?name=Jarvis - App deep links: Installed apps or specific content within them
- Spotify: A track, e.g.
spotify:track:6rqhFgbbKwnb9MLmUQDhG6 - Termius:
termius://to open the app - Claude:
claude://codeto open the Code tab - ChatGPT:
chatgpt://to open the app
- Spotify: A track, e.g.
activitysmith.notifications.send(
title="Homepage ready",
message="Your agent finished the redesign.",
redirection="https://github.com/acme/web/pull/482",
)
Actionable Push Notifications
open_url actions open a web page, run an iOS Shortcut, or open an app when someone taps the button. Supported links:
- HTTP/HTTPS: Web pages, e.g.
https://example.com - Shortcuts: Run Jarvis with
shortcuts://run-shortcut?name=Jarvis - App deep links: Installed apps or specific content within them
- Spotify: A track, e.g.
spotify:track:6rqhFgbbKwnb9MLmUQDhG6 - Termius:
termius://to open the app - Claude:
claude://codeto open the Code tab - ChatGPT:
chatgpt://to open the app
- Spotify: A track, e.g.
Webhooks are executed by the ActivitySmith backend and must use HTTPS.
activitysmith.notifications.send(
title="New subscription 💸",
message="Customer upgraded to Pro plan",
actions=[
action(
title="Open CRM",
type="open_url",
url="https://crm.example.com/customers/cus_9f3a1d",
),
action(
title="Chat with Jarvis",
type="open_url",
url="shortcuts://run-shortcut?name=Jarvis",
),
action(
title="Start Onboarding Workflow",
type="webhook",
url="https://hooks.example.com/activitysmith/onboarding/start",
method="POST",
body={
"customer_id": "cus_9f3a1d",
"plan": "pro",
},
),
],
)
Push Notification Interruption Levels
Use interruption_level to choose how urgently iOS presents a Push Notification. Omit it for normal delivery. Explicit active has the same behavior as the default.
| Value | Behavior |
|---|---|
passive |
Appears quietly in the notification list, without sound or waking the screen. |
active |
Normal delivery, subject to the device's notification settings and Focus. This is the default. |
time-sensitive |
Can bypass Scheduled Summary and Focus when the user allows Time Sensitive Notifications for ActivitySmith. |
See Apple's interruption levels for the system behavior.
The SDK also exports these values as PushInterruptionLevel.PASSIVE, PushInterruptionLevel.ACTIVE, and PushInterruptionLevel.TIME_SENSITIVE.
Passive
activitysmith.notifications.send(
title="Daily summary",
message="All scheduled jobs completed successfully.",
interruption_level="passive",
)
Active (default)
activitysmith.notifications.send(
title="Deployment complete",
message="Your latest changes are live.",
interruption_level="active",
)
Removing the interruption level from this example produces the same delivery behavior.
Time Sensitive
activitysmith.notifications.send(
title="🚨 checkout-api is down",
message="500 errors on 62% of requests. Customers can't complete payments.",
interruption_level="time-sensitive",
)
Live Activities
Choose the Live Activity type that matches what you want to show:
Value: Show a single value on your Lock Screen, such as revenue, a queue count, or a temperature.
Stats: Show up to 8 labeled values on your Lock Screen, from revenue and orders to uptime and conversion.
Alert: Show status updates with a clear message, badge, and icon. When you add an action button, color controls the button tint.
Metrics: Track two related values with segmented bars, such as CPU and memory.
Segmented Progress: Show progress through a known set of steps, like build, test, deploy, and verify.
Progress: Show percentage progress for jobs that move continuously toward completion.
Timer: Count down from a duration, or count up from 00:00 while a job runs.
Start & Update Live Activity
Use a stable stream_key to identify the metric, job, deployment, or system you want to keep visible. The first stream(...) call starts the Live Activity. Later calls with the same stream_key update it.
Value
activitysmith.live_activities.stream(
"revenue-today",
content_state=content_state(
title="Revenue",
type="value",
value="$1,240",
color="green",
icon=alert_icon("dollarsign.circle", color="green"),
badge=alert_badge("↑ 18%", color="purple"),
),
)
Send a string or number in value. Strings keep their formatting, including currency symbols, units, and decimal places.
Stats
activitysmith.live_activities.stream(
"sales-hourly",
content_state=content_state(
title="Sales",
subtitle="last hour",
type="stats",
metrics=[
metric(label="Revenue", value="$2430", color="blue"),
metric(label="Orders", value="37", color="green"),
metric(label="Conversion", value="4.8%", color="magenta"),
metric(label="Avg Order", value="$65.68", color="yellow"),
metric(label="Refunds", value="$84", color="red"),
metric(label="New Buyers", value="18", color="cyan"),
],
),
)
Alert
activitysmith.live_activities.stream(
"customer-ops",
content_state=content_state(
title="Reactivation",
message="Lumen came back after 2 weeks",
type="alert",
icon=alert_icon("cloud.sun", color="yellow"),
badge=alert_badge("Customer", color="magenta"),
),
)
Metrics
activitysmith.live_activities.stream(
"prod-web-1",
content_state=content_state(
title="Server Health",
subtitle="prod-web-1",
type="metrics",
metrics=[
metric(label="CPU", value=9, unit="%"),
metric(label="MEM", value=45, unit="%"),
],
),
)
Segmented Progress
activitysmith.live_activities.stream(
"nightly-backup",
content_state=content_state(
title="Nightly Backup",
subtitle="upload archive",
type="segmented_progress",
number_of_steps=3,
current_step=2,
),
)
Progress
activitysmith.live_activities.stream(
"search-reindex",
content_state=content_state(
title="Search Reindex",
subtitle="catalog-v2",
type="progress",
percentage=42,
),
)
Timer
activitysmith.live_activities.stream(
"benchmark-run",
content_state=content_state(
title="Benchmark Run",
subtitle="sampling",
type="timer",
duration_seconds=300,
color="cyan",
),
)
For a countdown, send duration_seconds. You can update title, subtitle, color, or any other visible field as the work changes. Leave duration_seconds out unless you want to change the timer.
To start at 00:00 and count up, set counts_down=False and leave out duration_seconds.
End Live Activity
Call end_stream(...) with the same stream_key to dismiss the Live Activity. You can include final values before it is removed. Set auto_dismiss_seconds to dismiss it after a delay in seconds, or auto_dismiss_minutes for minutes. Use 0 for immediate dismissal. Seconds take precedence if both are set.
activitysmith.live_activities.end_stream(
"prod-web-1",
content_state=content_state(
title="Server Health",
subtitle="prod-web-1",
type="metrics",
metrics=[
metric(label="CPU", value=7, unit="%"),
metric(label="MEM", value=38, unit="%"),
],
auto_dismiss_seconds=30,
),
)
Icons and Badges
Add more context to Live Activities with icons and badges.
Icon
Supported Live Activity types: value, stats, alert, metrics, segmented_progress, progress, and timer.
activitysmith.live_activities.stream(
"prod-web-1",
content_state=content_state(
title="Server Health",
subtitle="prod-web-1",
type=activitysmith.live_activities.TYPE_METRICS,
icon=alert_icon("server.rack", color="blue"),
metrics=[
metric(label="CPU", value=18, unit="%"),
metric(label="MEM", value=42, unit="%"),
],
),
)
The icon.symbol value is an Apple SF Symbol name. Browse the catalog with one of these tools:
- ActivitySmith app - Open Settings -> SF Symbols to browse 45 hand-picked icons ready to use
- SF Symbols - Apple's official macOS app
- Interactful - free third-party iOS app listing all SF Symbols under Foundations -> Iconography
Badge
Badges are supported by value, alert, segmented_progress, and progress Live Activities.
activitysmith.live_activities.stream(
"nightly-database-backup",
content_state=content_state(
title="Nightly Database Backup",
subtitle="verify restore",
type=activitysmith.live_activities.TYPE_PROGRESS,
badge=alert_badge("S3", color="cyan"),
percentage=62,
),
)
Live Activity Colors
Choose from these colors for the Live Activity accent, including progress bars and action buttons, or apply them to an individual icon or badge:
lime, green, cyan, blue, purple, magenta, red, orange, yellow, gray
Live Activity Action
Live Activities can include an action button.
open_url: Open a web page or run an iOS Shortcutwebhook: Trigger a backend GET/POST workflow
Open URL action
Open a web page or run an iOS Shortcut when someone taps the button. Supported links:
- HTTP/HTTPS: Web pages, e.g.
https://example.com - Shortcuts: Run Jarvis with
shortcuts://run-shortcut?name=Jarvis
activitysmith.live_activities.stream(
"prod-web-1",
content_state=content_state(
title="Server Health",
subtitle="prod-web-1",
type="metrics",
metrics=[
metric(label="CPU", value=76, unit="%"),
metric(label="MEM", value=52, unit="%"),
],
),
action=action(
title="Dashboard",
type="open_url",
url="https://status.example.com/servers/prod-web-1",
),
)
Apple Shortcut action
activitysmith.live_activities.stream(
"prod-web-1",
content_state=content_state(
title="Server Health",
subtitle="prod-web-1",
type="metrics",
metrics=[
metric(label="CPU", value=76, unit="%"),
metric(label="MEM", value=52, unit="%"),
],
),
action=action(
title="Chat with Jarvis",
type="open_url",
url="shortcuts://run-shortcut?name=Jarvis",
),
)
Webhook action
activitysmith.live_activities.stream(
"search-reindex",
content_state=content_state(
title="Reindexing product search",
subtitle="Shard 7 of 12",
type="segmented_progress",
number_of_steps=12,
current_step=7,
),
action=action(
title="Pause Reindex",
type="webhook",
url="https://ops.example.com/hooks/search/reindex/pause",
method="POST",
body={
"job_id": "reindex-2026-03-19",
"requested_by": "activitysmith-python",
},
),
)
Secondary action
Use secondary_action when you want a second button beside the primary action.
The secondary action button is supported for value, alert, segmented_progress, and progress Live Activities. Both buttons use the same open_url, webhook, and Apple Shortcut payload shapes.
activitysmith.live_activities.stream(
"agent-approval",
content_state=content_state(
title="Approval Needed",
message="Should I send the follow-up email to Brightlane?",
type="alert",
color="green",
icon=alert_icon("sparkles", color="green"),
badge=alert_badge("Agent", color="green"),
),
action=action(
title="Send",
type="webhook",
url="https://agent.example.com/live-activity/approve",
method="POST",
body={
"approval_id": "approval_01JY3J7Q9S0P8M1V5PZK7DR4M2",
"decision": "send",
},
),
secondary_action=action(
title="Deny",
type="webhook",
url="https://agent.example.com/live-activity/deny",
method="POST",
body={
"approval_id": "approval_01JY3J7Q9S0P8M1V5PZK7DR4M2",
"decision": "deny",
},
),
)
Lock Screen Widgets
ActivitySmith lets you display any value on your Lock Screen with widgets - SaaS metrics, revenue, signups, uptime, habits, or anything else you want to track. Create a metric in the web app, then update the metric value using our API, add a widget to your lock screen and it will fetch the latest update automatically.
Use the metric key to update its value.
activitysmith.metrics.update("deploy.success_rate", 99.9)
String metric values work too.
activitysmith.metrics.update("prod.status", "healthy")
App Icon Badge Count
Show the number you care about on your ActivitySmith app icon. Track MRR, a customer count, a stock price, or any other value you want to keep in view.
Set or update the badge value
activitysmith.badge_count(8333)
Clear the badge
Pass 0 to clear the badge.
activitysmith.badge_count(0)
Metadata
Metadata adds extra information to Push Notification and Live Activity details in ActivitySmith. It does not appear in the notification or Live Activity on your device.
activitysmith.notifications.send(
title="New subscription 💸",
message="Customer upgraded to Pro plan",
metadata={
"customer_id": "382",
"plan": "Pro",
"amount": 29,
"trial": False,
},
)
activitysmith.live_activities.stream(
"customer-import",
title="Customer Import",
type="progress",
percentage=60,
metadata={
"job_id": "import-382",
"records": 1200,
},
)
Values can be strings, numbers, or booleans. Metadata supports up to 50 entries and 16 KB of JSON, with keys up to 100 characters and strings up to 4,000 characters. Nested objects, arrays, and null values are not supported.
Tags
Use Tags to organize and filter Push Notification and Live Activity history. Tags are created automatically when you first use them. Sending Tags requires SDK version 1.10.0 or later.
activitysmith.notifications.send(
title="New subscription 💸",
message="Customer upgraded to Pro plan",
tags=["user:382", "billing"],
)
On Live Activity stream updates and legacy update or end calls, omit tags to keep existing Tags, supply a list to replace them, or pass tags=[] to clear them.
activitysmith.live_activities.update(
activity_id="YOUR_ACTIVITY_ID",
title="Customer Import",
percentage=60,
tags=[],
)
Channels
Use channels to target specific team members or devices when sending Push Notifications, Live Activities, or App Icon Badge Count updates. Omit it for account-wide delivery.
activitysmith.notifications.send(
title="New subscription 💸",
message="Customer upgraded to Pro plan",
channels=["sales", "customer-success"],
)
activitysmith.live_activities.stream(
"nightly-backup",
content_state=content_state(
title="Nightly database backup",
type="segmented_progress",
number_of_steps=3,
current_step=1,
),
channels=["ios-builds"],
)
activitysmith.badge_count(3, channels=["sales", "customer-success"])
Error Handling
Wrap API calls with try/except. The SDK raises exceptions for non-2xx responses. Rate limit errors use the error and message fields, and Live Activity limit errors include limit and active. See Rate Limits for details.
Additional Resources
PyPI Package
Install the ActivitySmith Python SDK from PyPI
Source Code
View the Python SDK source on GitHub
Metadata
Release files for activitysmith 1.13.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| activitysmith-1.13.0.tar.gz | 72.7 kB | With provenance | Details for activitysmith-1.13.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| activitysmith-1.13.0-py3-none-any.whl | Python 3 | none | any | Details for activitysmith-1.13.0-py3-none-any.whl |
Total release size: 243.9 kB
Release files / activitysmith-1.13.0.tar.gz
| Download URL | activitysmith-1.13.0.tar.gz |
|---|---|
| Size | 72.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
649d21a1871bc6a1671ee5aec1e11d6cd4fc7bc7720548b47dc5a13b71b981cd
|
|
BLAKE2b-256 checksum How to use checksums |
8accbf4d173558ca055052c27b36fb04dda263862e3f9895259ef82f3ddffa8e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency logRelease files / activitysmith-1.13.0-py3-none-any.whl
| Download URL | activitysmith-1.13.0-py3-none-any.whl |
|---|---|
| Size | 171.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e3d4a953d4e8770c3943f6fc591d2b769e7668a49989196064c2e4a7d44c9116
|
|
BLAKE2b-256 checksum How to use checksums |
56f7fefa957a2b1eb3cadac41f92b09d39da123cc14506fa091499b5fc0d2268
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency logSecurity for activitysmith 1.13.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for activitysmith-1.13.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.