Live Activity Templates Reference
Complete reference for all eight built-in Live Activity templates — their slugs, attributes (static data), content state (dynamic data), and how they render across views.
How Templates Work
Each Live Activity uses a template that defines the layout. You provide two types of data:
- Attributes — Static data set once when the activity starts. Cannot be changed after creation.
- Content State — Dynamic data that you update over time via the API.
All values in both attributes and contentState must be strings.
status-tracker
Slug: status-tracker
A step-by-step progress indicator with ETA. Ideal for deliveries, order fulfillment, and multi-stage workflows.
Attributes (static)
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Header text (e.g., "Order #1234") |
steps | string | Yes | Comma-separated step names (e.g., "Confirmed,Preparing,On the way,Delivered") |
Content State (dynamic)
| Field | Type | Required | Description |
|---|---|---|---|
currentStep | string | Yes | Zero-based index of the active step (e.g., "2") |
status | string | Yes | Current status text (e.g., "Driver is 5 minutes away") |
eta | string | No | Estimated time (e.g., "12:35 PM") |
statusIcon | string | No | SF Symbol name for the compact view (e.g., "car.fill") |
Views
Lock Screen / Expanded Notification:
┌─────────────────────────────────────┐
│ Order #1234 12:35 PM │
│ │
│ ●━━━━●━━━━◉╌╌╌╌○ │
│ Confirmed Preparing On the way Delivered │
│ │
│ 🚗 Driver is 5 minutes away │
└─────────────────────────────────────┘Dynamic Island (Compact):
┌──────────────────────────┐
│ 🚗 On the way · 12:35 │
└──────────────────────────┘Android Ongoing Notification:
┌─────────────────────────────────────┐
│ 📦 YourApp ongoing │
│ Order #1234 · On the way │
│ ●━━●━━◉╌╌○ ETA 12:35 PM │
└─────────────────────────────────────┘Example
curl -X POST https://api.nativesuite.io/api/apps/{appId}/live-activities \
-H "X-NativeSuite-Key: {secret}" \
-H "Content-Type: application/json" \
-d '{
"templateSlug": "status-tracker",
"attributes": {
"title": "Order #1234",
"steps": "Confirmed,Preparing,On the way,Delivered"
},
"contentState": {
"currentStep": "2",
"status": "Driver is 5 minutes away",
"eta": "12:35 PM",
"statusIcon": "car.fill"
}
}'metric-live
Slug: metric-live
A large number with trend indicator. Ideal for stock prices, live scores, counters.
Attributes (static)
| Field | Type | Required | Description |
|---|---|---|---|
label | string | Yes | Metric label (e.g., "AAPL", "Home Team") |
Content State (dynamic)
| Field | Type | Required | Description |
|---|---|---|---|
value | string | Yes | Current value (e.g., "$187.42", "3") |
change | string | No | Change amount (e.g., "+2.3%", "+1") |
trend | string | No | Direction: up, down, or neutral |
Views
Lock Screen / Expanded Notification:
┌─────────────────────────────────────┐
│ AAPL │
│ │
│ $187.42 │
│ ▲ +2.3% │
└─────────────────────────────────────┘Dynamic Island (Compact):
┌───────────────────────┐
│ AAPL $187.42 ▲ │
└───────────────────────┘Example
curl -X PATCH https://api.nativesuite.io/api/apps/{appId}/live-activities/{id} \
-H "X-NativeSuite-Key: {secret}" \
-H "Content-Type: application/json" \
-d '{
"contentState": {
"value": "$189.10",
"change": "+0.9%",
"trend": "up"
}
}'countdown
Slug: countdown
A live countdown timer. Ideal for auctions, reservations, event starts.
Attributes (static)
| Field | Type | Required | Description |
|---|---|---|---|
label | string | Yes | Title (e.g., "Auction Ending") |
subtitle | string | No | Optional subtitle (e.g., "Lot #42 — Vintage Watch") |
Content State (dynamic)
| Field | Type | Required | Description |
|---|---|---|---|
targetDate | string | Yes* | ISO 8601 timestamp to count down to (e.g., "2026-04-21T18:00:00Z") |
remaining | string | No | Fallback text if targetDate is not set (e.g., "04:32") |
* Either targetDate or remaining must be provided.
Views
Lock Screen / Expanded Notification:
┌─────────────────────────────────────┐
│ Auction Ending │
│ Lot #42 — Vintage Watch │
│ │
│ 02:14:38 │
└─────────────────────────────────────┘Dynamic Island (Compact):
┌─────────────────────────┐
│ ⏱ Auction 02:14:38 │
└─────────────────────────┘Example
{
"templateSlug": "countdown",
"attributes": {
"label": "Auction Ending",
"subtitle": "Lot #42 — Vintage Watch"
},
"contentState": {
"targetDate": "2026-04-21T18:00:00Z"
}
}progress-bar
Slug: progress-bar
A progress bar with percentage. Ideal for uploads, processing jobs, goals.
Attributes (static)
| Field | Type | Required | Description |
|---|---|---|---|
label | string | Yes | Title (e.g., "Uploading report.pdf") |
Content State (dynamic)
| Field | Type | Required | Description |
|---|---|---|---|
progress | string | Yes | Percentage as a number string, 0–100 (e.g., "73") |
detail | string | No | Optional detail text (e.g., "3.2 MB of 4.4 MB") |
Views
Lock Screen / Expanded Notification:
┌─────────────────────────────────────┐
│ Uploading report.pdf │
│ │
│ ████████████��███░░░░░░░ 73% │
│ 3.2 MB of 4.4 MB │
└─────────────────────────────────────┘Dynamic Island (Compact):
┌────────────────────���────┐
│ 📄 Uploading 73% │
└─────────────────────────┘Example
{
"templateSlug": "progress-bar",
"attributes": {
"label": "Uploading report.pdf"
},
"contentState": {
"progress": "73",
"detail": "3.2 MB of 4.4 MB"
}
}two-column
Slug: two-column
Two side-by-side metrics. Ideal for comparisons, versus scores, before/after.
Attributes (static)
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Header text (e.g., "Lakers vs Celtics") |
Content State (dynamic)
| Field | Type | Required | Description |
|---|---|---|---|
leftValue | string | Yes | Left metric value (e.g., "102") |
leftLabel | string | Yes | Left metric label (e.g., "LAL") |
rightValue | string | Yes | Right metric value (e.g., "98") |
rightLabel | string | Yes | Right metric label (e.g., "BOS") |
Views
Lock Screen / Expanded Notification:
┌─────────────────────────────────────┐
│ Lakers vs Celtics │
│ │
│ LAL BOS │
│ 102 — 98 │
└─────────────────────────────────────┘Dynamic Island (Compact):
┌───────────────────────────┐
│ LAL 102 — BOS 98 │
└───────────────────────────┘Example
{
"templateSlug": "two-column",
"attributes": {
"title": "Lakers vs Celtics"
},
"contentState": {
"leftValue": "102",
"leftLabel": "LAL",
"rightValue": "98",
"rightLabel": "BOS"
}
}key-value-list
Slug: key-value-list
A list of key-value pairs. Ideal for flight info, booking details, order summaries.
Attributes (static)
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Header text (e.g., "Flight BA204") |
Content State (dynamic)
| Field | Type | Required | Description |
|---|---|---|---|
items | string | Yes | Comma-separated key:value pairs (e.g., "Gate:B12,Boarding:12:45 PM,Status:Boarding") |
primaryValue | string | No | Value shown in compact views (e.g., "Gate B12") |
Views
Lock Screen / Expanded Notification:
┌─────────────────────────────────────┐
│ Flight BA204 │
│ │
│ Gate B12 │
│ Boarding 12:45 PM │
│ Status Boarding │
└─────────────────────────────────────┘Dynamic Island (Compact):
┌──────────────────────��────┐
│ ✈ BA204 Gate B12 │
└───────────────────────────┘Example
{
"templateSlug": "key-value-list",
"attributes": {
"title": "Flight BA204"
},
"contentState": {
"items": "Gate:B12,Boarding:12:45 PM,Status:Boarding",
"primaryValue": "Gate B12"
}
}image-banner
Slug: image-banner
A title and subtitle with status text. Ideal for events, promotions, live broadcasts.
Attributes (static)
This template has no static attributes.
Content State (dynamic)
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Main title (e.g., "Summer Sale") |
subtitle | string | No | Subtitle text (e.g., "Up to 40% off all items") |
status | string | No | Status badge text (e.g., "LIVE NOW") |
Views
Lock Screen / Expanded Notification:
┌─────────────────────────────────────┐
│ Summer Sale LIVE NOW │
│ │
│ Up to 40% off all items │
└─────────────────────────────────────┘Dynamic Island (Compact):
┌───────────────────────────┐
│ 🔴 LIVE Summer Sale │
└───────────────────────────┘Example
{
"templateSlug": "image-banner",
"contentState": {
"title": "Summer Sale",
"subtitle": "Up to 40% off all items",
"status": "LIVE NOW"
}
}mini-table
Slug: mini-table
A small grid of stats. Ideal for sports box scores, dashboards, multi-metric summaries.
Attributes (static)
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Header text (e.g., "Box Score") |
Content State (dynamic)
| Field | Type | Required | Description |
|---|---|---|---|
rows | string | Yes | Comma-separated label:value pairs (e.g., "Q1:28-24,Q2:31-27,Q3:22-25,Q4:21-22") |
primaryValue | string | No | Value shown in compact views (e.g., "102-98") |
Views
Lock Screen / Expanded Notification:
┌─────────────────────────────────────┐
│ Box Score │
│ │
│ Q1 28-24 │
│ Q2 31-27 │
│ Q3 22-25 │
│ Q4 21-22 │
└─────────────────────────────────────┘Dynamic Island (Compact):
┌─────────────────────────┐
│ 🏀 Box Score 102-98 │
└─────────────────────────┘Example
{
"templateSlug": "mini-table",
"attributes": {
"title": "Box Score"
},
"contentState": {
"rows": "Q1:28-24,Q2:31-27,Q3:22-25,Q4:21-22",
"primaryValue": "102-98"
}
}Template Quick Reference
| Slug | Best For | Attributes | Content State |
|---|---|---|---|
status-tracker | Deliveries, order fulfillment | title, steps | currentStep, status, eta, statusIcon |
metric-live | Stock prices, scores, counters | label | value, change, trend |
countdown | Auctions, reservations, events | label, subtitle | targetDate, remaining |
progress-bar | Uploads, processing, goals | label | progress, detail |
two-column | Comparisons, versus scores | title | leftValue, leftLabel, rightValue, rightLabel |
key-value-list | Flight info, booking details | title | items, primaryValue |
image-banner | Events, promotions, broadcasts | — | title, subtitle, status |
mini-table | Box scores, dashboards | title | rows, primaryValue |
General Notes
- All values are strings — both
attributesandcontentStateuse string values, not numbers or booleans - Attributes are immutable — set once when the activity starts, cannot be changed via update
- Content state replaces entirely — each update sends the full content state, not a partial diff
- Compact views use
primaryValue(where available) or the most prominent dynamic field - Dynamic Island is iOS-only (16.1+). Android renders all templates as ongoing notifications
- See the Live Activities guide for usage patterns and best practices
- See the Live Activities API reference for endpoint details