# Delay / Wait

Pause the run for a time, until a time, or until a call resumes it.

## Do things in Delay / Wait

Add a **Delay / Wait** step and choose what it does. Choose a row to see its fields.

- [Delay For](https://docs.gorunner.io/apps/delay-wait#fields-f-delay-for): Suspend the workflow for a duration, then resume automatically.
- [Delay Until](https://docs.gorunner.io/apps/delay-wait#fields-f-delay-until): Suspend the workflow until a specific date/time, then resume automatically.
- [Wait for Approval / Webhook](https://docs.gorunner.io/apps/delay-wait#fields-f-wait-for-resume): Suspend until an external resume call.

Later steps read a step’s output by its name: see [Use data from earlier steps](https://docs.gorunner.io/build/use-data-from-earlier-steps).

Not in your list? See [When an app isn’t here](https://docs.gorunner.io/apps/when-an-app-isnt-here#q-not-in-list).

## For developers

In the API, which calls apps pieces, Delay / Wait is `pieceId: "delay"` with the actions `delay_for`, `delay_until`, `wait_for_resume`. [Get an app](https://docs.gorunner.io/api/apps/get-app) returns every field.

What each action does outside the run: `delay_for` pure, `delay_until` pure, `wait_for_resume` pure. See [How versions and side effects work](https://docs.gorunner.io/apps#q-versions).

### Delay / Wait › Delay For

Suspend the workflow for a duration, then resume automatically. Inside a branch arm or loop body the run cannot suspend durably: the wait blocks in place and is capped at 5 minutes, so keep long waits on the main chain.

- **Duration · Required**: The number of time units to wait. Default: 5.
- **Unit · Required**: The unit of time for the delay. In expression mode it must resolve to seconds, minutes, hours or days (an unknown unit fails the step rather than silently waiting seconds). Options: Seconds, Minutes, Hours, Days. Default: Seconds.

### Delay / Wait › Delay Until

Suspend the workflow until a specific date/time, then resume automatically. A time already in the past continues immediately. Inside a branch arm or loop body the wait blocks in place (capped at 5 minutes) instead of suspending durably.

- **Date & Time · Required**: The date/time to wait until (ISO 8601, such as 2025-12-31T23:59:00Z). A value with no timezone (2025-12-31 23:59) is read as UTC.

### Delay / Wait › Wait for Approval / Webhook

Suspend until an external resume call. The URL to call is produced before the run suspends as {{steps.\<this>.resumeUrl}}. Send it wherever the answer comes from. Optionally time out after a maximum wait. The posted body (and any query parameters) are exposed as {{steps.\<this>.resumeData}}. Only works on the main chain: inside a branch arm or loop body the step fails, because a suspended run can only re-enter the top level.

- **Max Wait (timeout) · Optional**: Auto-resume after this many time units if no resume call arrives (0 = wait indefinitely). Default: 0.
- **Unit · Required**: The unit of time for the delay. In expression mode it must resolve to seconds, minutes, hours or days (an unknown unit fails the step rather than silently waiting seconds). Options: Seconds, Minutes, Hours, Days. Default: Seconds.
- **Public Base URL · Optional**: Public URL of this installation, used to build the resume URL. Defaults to the PUBLIC_API_URL env var.

Source: https://docs.gorunner.io/apps/delay-wait
