Skip to content

Payload Reference

Use this as the single source of truth for the /notify request body.

Authentication (required)

Send your secret as a Bearer token on every request:

POST /notify
Authorization: Bearer <uniqueID>
Content-Type: application/json

Complete JSON example

{
"job_id": "deploy-prod",
"title": "Production Deploy",
"message": "Running migrations...",
"status": "running",
"action": "update",
"layout": "progress",
"theme": "default",
"metric": "Step 2/5",
"progress": 0.4,
"secondaryMetric": "LIVE",
"metricA": "3",
"metricB": "1",
"subA": "HOME",
"subB": "AWAY",
"icon": "bolt.fill",
"accentColor": "#00CFFF"
}

Field reference

FieldTypeRequiredAllowed / formatDefaultAvailabilityNotes
job_idstringYes1-64 chars, A-Z a-z 0-9 _ -noneAll tiersRouting key only; not displayed as title.
titlestringNonon-empty text recommendedderived from message or "Island Pulse"All tiersDisplay title in Live Activity UI.
messagestringYes*non-empty stringnoneAll tiersPrimary body text. Required for start/update; not required for end.
statusstringNorunning | success | failedrunningAll tiersVisual status state.
actionstringNostart | update | endauto-selectedAll tiersOmit for normal auto-routing behavior.
layoutstringNodefault | progress | score | sportsdefaultPro for non-defaultFree requests are normalized to default.
themestringNoimplementation-defineddefaultApp feature dependentOptional visual theme hint.
metricstringNoshort textnoneAll tiersKPI/auxiliary metric.
progressnumberNo0.0-1.0 (or 0-100)noneAll tiersValues above 1 are normalized as percentages.
secondaryMetricstringNoshort textnoneAll tiersSecondary badge/label text.
metricAstringNoshort textnoneAll tiersSports/dual metric left value.
metricBstringNoshort textnoneAll tiersSports/dual metric right value.
subAstringNoshort textnoneAll tiersSports/dual metric left sublabel.
subBstringNoshort textnoneAll tiersSports/dual metric right sublabel.
iconstringNoSF Symbol namelayout defaultAll tiersPer-push icon override.
accentColorstringNoCSS color or hexapp/theme defaultAll tiersPer-push accent override.

Tier behavior notes

  • Free tier allows one active job_id at a time per token.
  • Free tier uses default layout only; non-default layout values are coerced to default.
  • Sending a different active job_id on free returns 403 FREE_TIER_JOB_LOCKED (TIER_LIMIT_EXCEEDED support code).
  • Sending start for a job_id that is already running returns 409 ACTIVITY_ALREADY_RUNNING (all tiers). Send updates instead, or end the activity first.
  • Pro tier supports multiple concurrent job streams (up to iOS system limits).

Common errors

HTTPErrorMeaning
400MISSING_UNIQUE_IDMissing or invalid Bearer token.
400MISSING_JOB_IDjob_id missing or empty.
400INVALID_JOB_IDjob_id format invalid.
400INVALID_ACTIONaction is not start/update/end.
403FREE_TIER_JOB_LOCKEDFree tier: a different job_id is already active. End it first.
409ACTIVITY_ALREADY_RUNNINGA Live Activity for this job_id is already running. Send updates or end it before starting again.
502APNS_PUSH_FAILEDAPNs rejected delivery.
502APNS_RECOVERY_FAILEDUpdate token was dead and start recovery failed too.