---
title: "Change a watch, or pause or resume it."
method: PATCH
path: "/strategy/watches/{watchId}"
tags: ["Strategy"]
---

# Change a watch, or pause or resume it.

`PATCH /strategy/watches/{watchId}`

## Request

- Base URL: `https://docs.sleeperhit.studio/api/v1`
- URL: `https://docs.sleeperhit.studio/api/v1/strategy/watches/{watchId}`
- Auth: HTTP bearer

Only the fields sent change. A new cadence, or resuming, schedules the next run from now; resuming counts against the plan's active-watch cap (403 `plan_limit_reached`). `scriptId: null` detaches it from its script. Free. Scope: `story:write`.

## Request body

- UpdateOpportunityWatchRequest
  - `name` string: A short label, e.g. "Open horror writing assignments".
  - `query` string: What the watch searches for, in full phrases.
  - `cadence` 'daily' | 'weekly' | 'monday' | 'friday' | 'monthly': How often it runs; `monday` and `friday` run weekly on that day.
  - `category` 'jobs' | 'comparables' | 'contests' | 'articles' | 'sales' | 'general': What it looks for (default `general`).
  - `scriptId` string, nullable: Bind it to one of your scripts; null detaches it.
  - `active` boolean: `false` pauses it, `true` resumes it (counted against the plan's active-watch cap).

## Response `200`

The watch as it is now.

- OpportunityWatchEnvelope
  - `watch` OpportunityWatch, required
    - `id` string, required
    - `name` string, required
    - `query` string, required
    - `category` string, required
    - `cadence` string, required
    - `active` boolean, required: False while paused: listed, but it does not run.
    - `script` object, nullable, required
      - `id` string, required
      - `title` string, required
    - `lastRunAt` string, date-time, nullable, required
    - `nextRunAt` string, date-time, nullable, required
    - `lastError` string, nullable, required: Why the last run failed, in plain words; null when it worked or has not run.
    - `runCount` integer, required
    - `opportunityCount` integer, required: How many opportunities it has found.
    - `updatedAt` string, date-time, required

## Other responses

- `400`: `validation_failed`: the message names the field.
- `401`: Missing, malformed, revoked, or expired API key.
- `403`: API key is valid but lacks the scope, is blocked by IP allowlist, or the account is disabled.
- `404`: `strategy_item_not_found`: no such row in your Strategy, or it is another writer's.
- `429`: Rate limit for this API key + IP + route family was exceeded.
- `500`: The API failed unexpectedly. Safe to retry with the same Idempotency-Key.
- `503`: `strategy_unavailable`: Strategy, or its watches, is switched off right now.

---

[API](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api.md) · [All operations](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sleeperhit/apis/sleeper-hit-studio-story-api/revisions/4534f5d25540?raw)
