Snooze & Time
Snooze Basics
Snoozing moves a task's target (target_at, also returned as due_at) to a new time. The task leaves the over-target list and comes back when that time arrives. A snooze never moves the task's deadline, and it stops at a deadline that's still ahead (see Snoozing and deadlines). For recurring tasks, the recurrence rule and the scheduled occurrence are kept — snoozing only moves this occurrence's target.
Every way of changing a task's date is the same move: the snooze button and menu, the snooze-all button, notification buttons, the quick panel's buttons and target picker, Today on a task segment, a bulk date change, and a plain PATCH { target_at }. There's no separate "snoozed" state on a task: the app doesn't mark a task as snoozed or keep a per-task snooze count. "Snooze" is still the word on the buttons.
To snooze one task through the API:
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"until": "2026-03-10T15:00:00Z"}' \
https://tasks.example.com/api/tasks/42/snoozeSnooze tracking
original_due_at records the task's first target. Moves don't change it, which is why the target age ("3d") keeps counting through them. It changes only in these cases:
| Change | original_due_at |
|---|---|
Any move of a target (snooze, picker, Today, bulk, PATCH { target_at }) | Kept |
| A task with no target gets one | Set to the new target, so the age starts there |
| A deadline's automatic target is set | Set to that target |
| A recurring task is completed or skipped | Set to the next occurrence |
PATCH { target_at: null } — Remove target (no deadline) | Cleared |
PATCH { rrule, target_at } — a schedule change | Cleared |
A task already targeted at the new time is left alone. Undo puts the previous values back in all cases.
due_at still works as an older name for target_at; sending both with different values returns a 400. Older clients may send retarget (or reset_original_due_at), allow_past_deadline, or cap_at_deadline: on a task these are accepted and change nothing.
What can't be snoozed
- Reminders are never snoozed. The snooze endpoint refuses them, bulk snooze skips them, and a plain
PATCH { target_at }that would move a dated reminder is refused. To move a reminder to a new time, change its time in the reminder editor, or through the API send the new time with"retarget": true— the one place that flag still means something. See Reminders. - Quotas have no target, so there's nothing to snooze. The snooze endpoint refuses them and bulk snooze skips them. See Quotas.
- Done and trashed tasks can't be snoozed.
Snoozing and Deadlines
While a task's deadline is still ahead, every move of its target stops at the deadline. That holds everywhere: one task or many, in the web app, the native apps, notification buttons, and the API. A move that stopped short says so: a single snooze reads "Snoozed to deadline 6:00 PM", a bulk snooze adds "· N stopped at their deadline", and a notification button that stopped at a deadline sends a quiet notification saying so. In the API, the single-task response has capped_at_deadline: true, and the bulk responses count these in capped_deadline. To move a task later than its deadline, change or remove the deadline first.
The snooze menu and the target picker offer Deadline day: your morning time on the deadline's day, or the deadline itself if that's earlier. It's shown only while that moment is still ahead.
Once the deadline has passed, a single snooze or target change can go anywhere. In a bulk snooze, a passed deadline puts the task with the High-priority tasks (see Filtering rules).
Single-Task Snooze Warnings
When you snooze one task from the task list, OpenTask warns about two situations that are usually mistakes:
- "Snooze past the next occurrence?" — the new time is at or after the recurring task's next scheduled occurrence, so the snooze would skip that occurrence. You can snooze anyway, snooze to the next occurrence instead, or cancel.
- "Add a due date?" — the task has no target, so snoozing it would create one.
The warning never changes your choice for you; "Snooze anyway" stays the primary button. Bulk snoozes never show these warnings.
Bulk Snooze
The snooze-all button (a blue floating button with a clock and the over-target count, in the bottom-right corner on a desktop and above the bottom tabs on a phone) is the primary workflow action. It snoozes every over-target task in one tap. On a desktop, the clock in the top bar does the same.
Filtering rules
| Condition | Included in bulk snooze? |
|---|---|
| Over target | The snooze-all sweep takes only over-target tasks; bulk/snooze takes whatever ids you send |
| Priority 0-2 | Always |
| Priority 3 (High) | Only when no lower-priority task in the same batch is still eligible |
| Priority 0-2 with a deadline that has passed | Like High: only when nothing lower is still eligible. Reported as skipped_deadline while held back |
| Priority 4 (Urgent) | Never — must be snoozed individually, deadline or not |
| Reminder | Never — skipped and reported as skipped_reminders |
| Quota | Never |
| The snooze would cross a deadline that's still ahead | Yes, but it stops at the deadline (counted in capped_deadline; see Snoozing and deadlines) |
| Done / deleted | Excluded |
High tasks take two presses. The first press moves P0-2 and leaves High tasks where they are, along with any task whose deadline has passed. A second press, finding only those left, moves them. An Urgent task in the batch doesn't hold them back, because Urgent tasks are never swept.
The confirmation message names what happened:
- "Snoozed 5 tasks (2 high skipped)" — the first press, with High tasks deferred to the next press
- "Snoozed 2 high-priority tasks" — the second press, when everything moved was High
- "Snoozed 3 tasks (2 high, 1 past deadline skipped)" — High tasks and a task past its deadline held for the next press
- "No snoozable tasks (1 urgent task must be snoozed individually)" — only Urgent tasks are over target
When tasks stopped at a deadline that's still ahead, the message adds "· N stopped at their deadline".
Explicit selections
A task you pick deliberately is snoozed at any priority. bulk/snooze, bulk/snooze-overdue, and bulk/edit accept include_task_ids: tasks listed there bypass the High/Urgent filter (and the passed-deadline hold). The app uses this whenever you snooze tasks you chose yourself: from the multi-select action bar, a widget row, or the Apple Watch. Only the snooze-all sweep leaves it out. include_task_ids doesn't override the reminder and quota rules, and the move still stops at a deadline that's still ahead.
What a tap does
A plain tap of the snooze-all button snoozes over-target tasks to the start of the next reminder period — the first period that starts after now, or tomorrow's first period once the last one today has begun. Reminder periods are the parts of your day set up under Settings > Reminder periods; see Reminders.
Two settings under Settings > Snooze control this:
| Setting | Options | Default |
|---|---|---|
| Snooze-all button | Next period, Default snooze | Next period |
| Default snooze | 30 min, 1 hour, 2 hours, Next period, Tomorrow at your morning time, Custom (1-1440 minutes) | 1 hour |
Set Snooze-all button to "Default snooze" to have a tap use your default snooze duration instead. If you have no reminder periods, a tap uses the default snooze either way. The default snooze is also what a single tap on a task's snooze button uses.
Morning time (also under Settings > Snooze) sets the time used by "Tomorrow at ...", Deadline day, and a deadline's automatic target.
Long-press snooze menu
Long-press the snooze-all button, or a task's snooze button, to choose a target. On a desktop you can also right-click the floating snooze-all button.
- Next period, named with where it lands (for example "Next period · Afternoon 4:00 PM"). This is the same target as the notification's Next period action.
- 1 hour, 2 hours
- The other reminder periods, in the order they next start, each showing where it lands (for example "Evening · 8:30 PM" or "Early morning · tomorrow 7:00 AM") — today if the period hasn't started yet, otherwise tomorrow
- Tomorrow at your morning time (hidden if a period already lands at that exact time)
- Deadline day, on a task's own snooze menu when it has a deadline (see Snoozing and deadlines)
- Custom... (pick a date and time)
- Remove target, on a task's own snooze menu: sends the task back to its task segment. On a task with a deadline and a target you picked, this is Back to auto instead, which puts the deadline's automatic target back
Bulk Snooze API
Two endpoints perform bulk snoozes:
| Endpoint | Which tasks | Target options |
|---|---|---|
POST /api/tasks/bulk/snooze-overdue | Every over-target task (the same set as the badge) | until, delta_minutes, slot, tomorrow, or none (your default snooze) |
POST /api/tasks/bulk/snooze | The tasks in ids | until or delta_minutes |
delta_minutes means something different on each endpoint:
- On snooze-overdue, it's minutes from now. Values of 60 or more are rounded to the hour; shorter values are exact.
- On bulk snooze, it's added to each task's own target, with no rounding. Tasks without a target are skipped (reported as
skipped_no_due_date). Negative values (up to -1440) move tasks earlier.
Snooze to a reminder period
snooze-overdue accepts a slot field to snooze to a reminder period. The server resolves the time in your timezone:
"slot": "09:00"— a period's start time (HH:MM). Resolves to today at that time if it's still ahead, otherwise tomorrow."slot": "next"— the next period to start.
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"slot": "next"}' \
https://tasks.example.com/api/tasks/bulk/snooze-overduesnooze-overdue also accepts "tomorrow": true, which snoozes to tomorrow at your morning time.
until, delta_minutes, slot, and tomorrow are mutually exclusive. bulk/snooze has neither slot nor tomorrow.
Moving dates in a bulk edit
POST /api/tasks/bulk/edit can move dates too, together with other changes, in one request and one undo step. The app uses it when a multi-select save changes the date and something else. Send the new target as changes.target_at (or changes.due_at), or a relative move as delta_minutes (added to each task's own target, like bulk/snooze). Deadlines and horizons can be set the same way (changes.deadline_at, changes.horizon). The date follows the bulk snooze priority rules for tasks not listed in include_task_ids, and a relative move skips tasks without a target (skipped_no_due_date). A date that would cross a deadline that's still ahead stops at it (capped_deadline). date_task_ids limits the date change to some of the ids, while the other changes still apply to all of them. A task the date can't apply to still gets the other changes. See the API reference for the full request.
Response counts
Both endpoints return tasks_affected (only tasks whose date actually moved, so a task already targeted at that time is counted neither as affected nor skipped), tasks_skipped, skipped_urgent (tasks skipped on priority — High and Urgent together), skipped_high (the High part of that count), snoozed_high (how many of the moved tasks were High), skipped_reminders, skipped_deadline (tasks held back because their deadline has passed, not counted in skipped_urgent), and capped_deadline (moved tasks that stopped at a deadline that's still ahead, also counted in tasks_affected).
snooze-overdue also returns until (the resolved target time) and message, a ready-to-display summary with the same wording as the app's confirmation, such as "Snoozed 3 tasks (2 high, 1 urgent skipped)" or "No snoozable tasks". It's meant for clients that show the result without working it out from the counts, such as an Apple Shortcut.
When a Bearer-token call (a notification button, a widget, a Shortcut) leaves High, Urgent, or passed-deadline tasks over target, the server also sends a quiet notification saying what stayed (see Bulk snooze results). feedback_notification in the response says whether this call sent one. Send "notify": false from a client that shows the result itself.
Time Rounding
When a snooze is computed as a duration from now (the default snooze, the 1-hour and 2-hour menu options, and delta_minutes on snooze-overdue) and the duration is 1 hour or more, the target time is rounded to the nearest hour using a 35-minute threshold:
- Minutes < 35: round down (truncate to the hour)
- Minutes >= 35: round up (advance to the next hour)
Examples (snooze +1 hour):
| Current time | +1 hour | Rounded to |
|---|---|---|
| 2:15 PM | 3:15 PM | 3:00 PM |
| 2:34 PM | 3:34 PM | 3:00 PM |
| 2:35 PM | 3:35 PM | 4:00 PM |
| 2:50 PM | 3:50 PM | 4:00 PM |
Sub-hour snoozes (such as +30 minutes) use the exact time with no rounding.
Snooze Surfaces
| Surface | Actions available |
|---|---|
| Snooze-all button (floating button; also the top-bar clock on desktop) | Tap: snooze all over target to the next period. Long-press (or right-click the floating button): snooze menu |
| Task row snooze button | Tap: default snooze. Long-press: snooze menu, including Deadline day and Remove target (or Back to auto) |
| Task detail / quick panel | Preset times, hour increments/decrements, target picker (with Deadline day), Remove target or Back to auto |
| Multi-select action bar | Snooze the selected tasks |
| iOS notification (banner) | Done, +1hr, All +1hr, All → Next period, All → each reminder period |
| iOS notification (long-press) | Interactive snooze grid |
| iPhone Tasks widget | Snooze mode: Next period or +1h per task. An "All over target" bar on the Over target page |
| iPhone app icon (touch and hold) | Snooze All +1hr, to Next Period, +2hr, or to Tomorrow |
| Apple Watch app | Touch and hold a task: Next period or +1 hour. A sheet snoozes all over target |
| Apple Watch widget | +1h or ⏭ next period for all over target, when snoozable tasks are over target |
| Mac menu bar item | ⏭ next period or +1h per task, and an "All over target" bar |
On the widget, Apple Watch, and Mac menu bar item, per-task snoozes count from the task's own target while it's still upcoming (a task targeted at 5:00 PM moves to 6:00 PM with +1h), and from now when it's over target. Like every snooze, these stop at a deadline that's still ahead. See Widgets, Apple Watch & Mac.
Recurring Task Snooze
Snoozing a recurring task only changes this occurrence's target. The recurrence rule (rrule) and the scheduled occurrence (occurrence_at) stay as they were, and so does a deadline on the task. When you complete or skip it, the task advances from its scheduled occurrence: to the first occurrence after both that occurrence and the completion time.
Examples:
- A daily 9:00 AM task snoozed to noon and then completed is next due at 9:00 AM tomorrow.
- A weekly Sunday task moved to Saturday and completed on Saturday comes back the following Sunday, not the next day.
Snoozing past the next scheduled occurrence skips that occurrence: completing the task then advances to the next occurrence after the completion, with no catch-up. That's why the app warns before a single-task snooze does it. See Recurrence.
