Read a wait link
The link of a `wait` step with `token: true` (`run.wait_urls.<step id>`, routine.schema.json). Send it to the person who should answer: no API key and no login are needed, the link is the credential. A browser (`Accept: text/html`) gets a page with the step's `prompt` (title, body, image, link) and Approve and Reject buttons; `?decision=approve` or `?decision=reject` preselects one, for buttons in a Slack or email message (the person still confirms, so link previews and mail scanners that fetch the URL answer nothing). Programs get the `RoutineWait` JSON. The link names one run and step of one project and is signed by the node; it works once, while the step waits, and for at most 7 days after the step started waiting. The run's end, the step's own deadline or a signal sent through the API ends it too. Any link that is malformed, signed for another run, step or project, or whose run is no longer kept answers the same 404 `wait_link_invalid`. Answers carry `Cache-Control: no-store` and `Referrer-Policy: no-referrer`, and the link never appears in your organization's request log.
/v1/routines/waits/{token}
Path Parameters
token
string
required
path
"run_01m6f0re3gzz9kvb26hebdcd0x.approve.q3Zr0wq9mXk3o1yJb7vH2cT5dN8pLa4e"Query Parameters
decision
string
optional
query
Responses
application/jsonobject
string
REQUIRED
routine_waitstatus
string
REQUIRED
waiting, pending, answered, timed_out, expired, endedrun_id
string
REQUIRED
run_status
string
REQUIRED
queued, running, succeeded, failed, canceledroutine_id
string
REQUIRED
routine_name
string | null
step_id
string
REQUIRED
step_name
string | null
prompt
object | null
REQUIRED
title
string
body
string
image
string (uri)
link
string (uri)
dropped
string[]
waiting_since
string (date-time) | null
expires_at
string (date-time) | null
answer
object | null
REQUIRED
decision
string | null
approve, reject, nullapproved
boolean | null
comment
string | null
via
string
link, signalanswered_at
string (date-time) | null
curl -X GET 'https://beta-api.b3os.org/v1/routines/waits/run_01m6f0re3gzz9kvb26hebdcd0x.approve.q3Zr0wq9mXk3o1yJb7vH2cT5dN8pLa4e' \ -H 'Authorization: Bearer YOUR_API_TOKEN'
const response = await fetch('https://beta-api.b3os.org/v1/routines/waits/run_01m6f0re3gzz9kvb26hebdcd0x.approve.q3Zr0wq9mXk3o1yJb7vH2cT5dN8pLa4e', { method: 'GET', headers: { "Authorization": "Bearer YOUR_API_TOKEN" }});const data = await response.json();console.log(data);
import requestsheaders = { 'Authorization': 'Bearer YOUR_API_TOKEN'}response = requests.get('https://beta-api.b3os.org/v1/routines/waits/run_01m6f0re3gzz9kvb26hebdcd0x.approve.q3Zr0wq9mXk3o1yJb7vH2cT5dN8pLa4e', headers=headers)print(response.json())
{ "object": "routine_wait", "status": "waiting", "run_id": "run_01m6f0re3gzz9kvb26hebdcd0x", "run_status": "running", "routine_id": "rtn_01m5t6vhkw4a8fa4tb5w4ffz37", "routine_name": "launch-card", "step_id": "approve", "step_name": "Approve the card", "prompt": { "title": "Post the launch card to", "body": "The card for 0.4.0 is below. Approve posts it; Reject stops the run here.", "image": "https://usercontent.beta.b3os.org/render/art_01m6f0rf6q8f3d8wq7xr7d1f3p/card.png" }, "waiting_since": "2026-11-02T22:10:04.211Z", "expires_at": "2026-11-09T22:10:04.211Z", "answer": null}
Try this endpoint
/v1/routines/waits/{token}