---
title: "Start a watch: recurring research that files opportunities in your Strategy."
method: POST
path: "/strategy/watches"
tags: ["Strategy"]
---

# Start a watch: recurring research that files opportunities in your Strategy.

`POST /strategy/watches`

## Request

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

A watch runs on its cadence and files what it finds as opportunities. It counts against the plan's active-watch cap (403 `plan_limit_reached`), and binds only to your own script. 503 `strategy_unavailable` while watches are switched off. Requires `Idempotency-Key`. Free: a watch runs on its own schedule, or once now when asked, at no charge, and reading, promoting or editing changes only your own Strategy. Scope: `story:write`.

## Headers

- `Idempotency-Key` string, required

## Request body

- CreateOpportunityWatchRequest
  - `name` string, required: A short label, e.g. "Open horror writing assignments".
  - `query` string, required: What the watch searches for, in full phrases.
  - `cadence` 'daily' | 'weekly' | 'monday' | 'friday' | 'monthly', required: 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: Bind it to one of your scripts (its comparables, its market).

## Response `200`

The new watch.

- 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)
