Free tier: one active pipeline
On the Free tier, each webhook URL (Bearer token) can have one active job_id at a time. That keeps server resources predictable and matches a single Live Activity slot for many setups.
What “one active pipeline” means
- The first successful
startfor a newjob_idacquires the lock for that URL. - Further
startrequests that use a differentjob_idreturn 403FREE_TIER_JOB_LOCKEDuntil the current job ends or the lock expires. - A second
startfor the samejob_idwhile it is already running returns 409ACTIVITY_ALREADY_RUNNING. Use updates instead. - Updates to the same
job_idalways work (update/ implicit update).
Switch to a different job_id
- End the current job (same
job_idas the running activity):
curl -X POST 'https://YOUR_HOST/notify' \ -H 'Authorization: Bearer YOUR_UNIQUE_ID' \ -H 'Content-Type: application/json' \ -d '{"job_id":"my-old-job","action":"end","message":"Finished","status":"success"}'- Then start your new pipeline with a new
job_id:
curl -X POST 'https://YOUR_HOST/notify' \ -H 'Authorization: Bearer YOUR_UNIQUE_ID' \ -H 'Content-Type: application/json' \ -d '{"job_id":"my-new-job","title":"New run","message":"Starting","status":"running"}'If end fails because there is no Live Activity update token (for example the activity was dismissed long ago), use the expiresAt time from a previous FREE_TIER_JOB_LOCKED response, or open the app and use Resync server registration in Settings → Webhook (same URL and token; reconnects device state).
Pro tier
Pro removes the single active job_id restriction so multiple concurrent jobs are allowed (subject to iOS system limits for Live Activities).