Update

content_state must match the ContentState your widget extension decodes. Live Hive does not transform it. This route requires a server API key (lh_live_...).

POST /v1/activities/customer-activity-123/update

{
  "content_state": {
    "status": "driver_arriving",
    "eta": 4
  }
}

POST JSON to https://www.livehive.dev/v1 with a secret key. First success can skip this: the activity page has Send test update. Example snippets when you do have a backend (any language works):

const KEY = process.env.LIVEHIVE_API_KEY // lh_live_...

await fetch("https://www.livehive.dev/v1/activities/abc123/update", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    content_state: { status: "driver_arriving", eta: 4 },
  }),
})

Response:

{
  "id": "upd_...",
  "activity_id": "customer-activity-123",
  "status": "sent"
}

status is sent or failed after Live Hive talks to APNs. Failed deliveries include the Apple reason in the dashboard. Live Hive does not report success unless APNs accepted the push.