> ## Documentation Index
> Fetch the complete documentation index at: https://guides.affiliate.com/llms.txt
> Use this file to discover all available pages before exploring further.

# GET /v1/products/watches/{watch_id} — get a watch

> Retrieve a single product watch by its ID, including its rules, filters, notification settings, expiration timestamp, and last check time.

The `GET /v1/products/watches/{watch_id}` endpoint returns the full details of a single product watch. You can also retrieve watches by metadata without knowing the watch ID — see [query by metadata](#query-by-metadata) below.

## Endpoint

```
GET /v1/products/watches/{watch_id}
```

## Path parameters

<ParamField path="watch_id" type="string" required>
  The unique identifier of the watch to retrieve. You can find this value in the `watch_id` field returned by list, create, or update responses.
</ParamField>

## Headers

<ParamField header="Authorization" type="string" required>
  Bearer token for authentication. Format: `Bearer {your_api_key}`.
</ParamField>

## Example request

```bash theme={null}
curl --request GET \
  --url 'https://api.affiliate.com/v1/products/watches/a0b49c91-2eef-4aa1-9b30-4816147680f0' \
  --header 'Authorization: Bearer {your_api_key}'
```

## Response

```json theme={null}
{
  "data": {
    "watch_id": "a0b49c91-2eef-4aa1-9b30-4816147680f0",
    "name": "Nike Shoe Price Drop Watch",
    "target_type": "product",
    "target_id": "8099987467386791069",
    "status": "active",
    "metadata": {
      "key1": "value1",
      "campaign": "summer_sale"
    },
    "rules": [
      {
        "field": "final_price",
        "start_value": 199.99,
        "condition": "decrease",
        "threshold": {
          "type": "percentage",
          "value": 50
        }
      }
    ],
    "notifications": [
      {
        "channel": "webhook",
        "channel_target": "https://example.com/webhooks/watch",
        "frequency": "immediately",
        "enabled": true
      }
    ],
    "filters": [
      {
        "field": "merchant.id",
        "operator": "=",
        "value": "41357"
      }
    ],
    "expire_timestamp": 1774751812,
    "created_at": "2025-12-29 02:36:53",
    "last_checked_at": null
  },
  "meta": {
    "trace_id": "019b74ed-15fe-72f5-a0c8-26727cbc0285"
  }
}
```

## Response fields

### `data` object

<ResponseField name="watch_id" type="string">
  The unique identifier for this watch.
</ResponseField>

<ResponseField name="name" type="string">
  The human-readable name assigned at creation.
</ResponseField>

<ResponseField name="target_type" type="string">
  The watch type: `"product"`, `"asin"`, or `"barcode"`.
</ResponseField>

<ResponseField name="target_id" type="string">
  The product identifier being watched.
</ResponseField>

<ResponseField name="status" type="string">
  Current watch status: `"active"`, `"paused"`, or `"completed"`. A watch becomes `"completed"` when a rule condition is met.
</ResponseField>

<ResponseField name="metadata" type="object">
  Custom key-value pairs attached to the watch.
</ResponseField>

<ResponseField name="rules" type="object[]">
  The conditions that trigger a notification.

  <Expandable title="Rule object">
    <ResponseField name="field" type="string">
      The product attribute being monitored.
    </ResponseField>

    <ResponseField name="start_value" type="number | null">
      The baseline value at the time the watch was created. `null` if no baseline was captured yet.
    </ResponseField>

    <ResponseField name="condition" type="string">
      The comparison condition, such as `"decrease"`, `"equals"`, or `"change"`.
    </ResponseField>

    <ResponseField name="threshold" type="object">
      The magnitude of change required. `type` is `"value"` or `"percentage"`; `value` is the numeric or string threshold.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="notifications" type="object[]">
  The configured notification channels.

  <Expandable title="Notification object">
    <ResponseField name="channel" type="string">
      The notification channel. Currently always `"webhook"`.
    </ResponseField>

    <ResponseField name="channel_target" type="string">
      The webhook URL.
    </ResponseField>

    <ResponseField name="frequency" type="string">
      Notification frequency. Currently always `"immediately"`.
    </ResponseField>

    <ResponseField name="enabled" type="boolean">
      Whether the notification channel is active.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="filters" type="object[]">
  Filters limiting which product listings can trigger the watch. Each object has `field`, `operator`, and `value` properties.
</ResponseField>

<ResponseField name="expire_timestamp" type="integer">
  UNIX timestamp of when the watch expires.
</ResponseField>

<ResponseField name="created_at" type="string">
  ISO 8601 datetime when the watch was created.
</ResponseField>

<ResponseField name="last_checked_at" type="string | null">
  ISO 8601 datetime of the most recent check. `null` if the watch has not been checked yet.
</ResponseField>

### `meta` object

<ResponseField name="meta.trace_id" type="string">
  Unique identifier for this request. Include this value when contacting support.
</ResponseField>

## Query by metadata

If you tagged your watches with metadata at creation, you can retrieve them without knowing the watch ID. Use the same `GET /v1/products/watches` endpoint with `metadata[key]=value` query parameters.

```
GET /v1/products/watches?metadata[campaign]=summer_sale
```

You can combine multiple metadata filters:

```
GET /v1/products/watches?metadata[campaign]=summer_sale&metadata[priority]=high
```

### Example

```bash theme={null}
curl --request GET \
  --url 'https://api.affiliate.com/v1/products/watches?metadata[campaign]=summer_sale' \
  --header 'Authorization: Bearer {your_api_key}'
```

The response uses the same paginated format as [list watches](/api-reference/watches/list-watches).
