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

# Monitor Markets with Watchlists and Alerts

> Save markets to watchlists and set price movement alerts for when a market crosses your chosen threshold — requires session authentication.

Arbitrage gives you two tools for keeping tabs on markets over time. Watchlists let you group and save canonical questions or specific markets you want to follow. Alerts let you define a price condition on a market so you can be notified when it's met. Both features work through the main web app at [app.revalonlabs.xyz](https://app.revalonlabs.xyz) and are also accessible via the API for programmatic use.

## Authentication

Watchlists and alerts require a session JWT — either from SIWE wallet sign-in or from email/password login through the Developer Console. Pass the token as a bearer header:

```text theme={null}
Authorization: Bearer <your-session-jwt>
```

* **SIWE (Sign-In With Ethereum):** Connect your Web3 wallet at [app.revalonlabs.xyz](https://app.revalonlabs.xyz). The app handles the SIWE handshake and issues a session JWT cookie automatically.
* **Email/password:** Register and log in via the Developer Console or the `/api/v1/auth/login` endpoint to get a JWT.

<Note>
  API keys (`X-API-Key`) do **not** grant access to watchlists or alerts. These endpoints require a user session.
</Note>

***

## Watchlists

A watchlist is a named collection of markets or canonical questions. You can create as many as you need and add or remove items at any time.

### List your watchlists

**Endpoint:** `GET /api/v1/watchlists`

```bash theme={null}
curl https://api.predexy.com/api/v1/watchlists \
  -H "Authorization: Bearer <your-session-jwt>"
```

**Example response:**

```json theme={null}
{
  "data": [
    {
      "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
      "name": "Crypto Forecasts",
      "created_at": "2026-04-01T09:00:00Z"
    },
    {
      "id": "e3a1c23d-4f56-78ab-9012-cdef01234567",
      "name": "US Politics 2026",
      "created_at": "2026-04-10T14:30:00Z"
    }
  ]
}
```

### Create a watchlist

**Endpoint:** `POST /api/v1/watchlists`

The request body requires a `name` field.

```bash theme={null}
curl -X POST https://api.predexy.com/api/v1/watchlists \
  -H "Authorization: Bearer <your-session-jwt>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Crypto Forecasts"}'
```

**Example response:**

```json theme={null}
{
  "data": {
    "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
    "name": "Crypto Forecasts",
    "created_at": "2026-04-01T09:00:00Z"
  }
}
```

### Add a market to a watchlist

**Endpoint:** `POST /api/v1/watchlists/{id}/items`

You can add a canonical question, a specific market, or both. Pass the relevant UUID(s) in the request body:

```bash theme={null}
curl -X POST \
  https://api.predexy.com/api/v1/watchlists/7c9e6679-7425-40de-944b-e07fc1f90ae7/items \
  -H "Authorization: Bearer <your-session-jwt>" \
  -H "Content-Type: application/json" \
  -d '{
    "canonical_question_id": "550e8400-e29b-41d4-a716-446655440000"
  }'
```

### Remove an item from a watchlist

**Endpoint:** `DELETE /api/v1/watchlists/{watchlist-id}/items/{item-id}`

```bash theme={null}
curl -X DELETE \
  "https://api.predexy.com/api/v1/watchlists/7c9e6679-7425-40de-944b-e07fc1f90ae7/items/c1d2e3f4-5678-90ab-cdef-012345678901" \
  -H "Authorization: Bearer <your-session-jwt>"
```

### Update a watchlist name

**Endpoint:** `PATCH /api/v1/watchlists/{id}`

```bash theme={null}
curl -X PATCH \
  https://api.predexy.com/api/v1/watchlists/7c9e6679-7425-40de-944b-e07fc1f90ae7 \
  -H "Authorization: Bearer <your-session-jwt>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Crypto Markets Q2 2026"}'
```

### Delete a watchlist

**Endpoint:** `DELETE /api/v1/watchlists/{id}`

```bash theme={null}
curl -X DELETE \
  https://api.predexy.com/api/v1/watchlists/7c9e6679-7425-40de-944b-e07fc1f90ae7 \
  -H "Authorization: Bearer <your-session-jwt>"
```

***

## Alerts

Alerts let you define a condition on a market so you're notified when a price threshold is crossed. You associate an alert with a canonical question or a specific market, then provide a `type` and a `condition` object describing when to fire.

### List your alerts

**Endpoint:** `GET /api/v1/alerts`

```bash theme={null}
curl https://api.predexy.com/api/v1/alerts \
  -H "Authorization: Bearer <your-session-jwt>"
```

**Example response:**

```json theme={null}
{
  "data": [
    {
      "id": "a1b2c3d4-5678-90ef-ghij-012345678901",
      "type": "price_threshold",
      "condition": {
        "direction": "above",
        "threshold": 0.70
      },
      "canonical_question_id": "550e8400-e29b-41d4-a716-446655440000",
      "market_id": null,
      "is_active": true,
      "created_at": "2026-04-15T12:00:00Z"
    }
  ]
}
```

### Create an alert

**Endpoint:** `POST /api/v1/alerts`

The request body requires:

| Field                   | Type   | Required | Description                                              |
| ----------------------- | ------ | -------- | -------------------------------------------------------- |
| `type`                  | string | Yes      | Alert type, e.g. `price_threshold`                       |
| `condition`             | object | Yes      | The trigger condition (threshold price, direction, etc.) |
| `canonical_question_id` | UUID   | No       | Canonical question to watch                              |
| `market_id`             | UUID   | No       | Specific market to watch                                 |

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.predexy.com/api/v1/alerts \
    -H "Authorization: Bearer <your-session-jwt>" \
    -H "Content-Type: application/json" \
    -d '{
      "type": "price_threshold",
      "condition": {
        "direction": "above",
        "threshold": 0.70
      },
      "canonical_question_id": "550e8400-e29b-41d4-a716-446655440000"
    }'
  ```

  ```python Python theme={null}
  import httpx

  response = httpx.post(
      "https://api.predexy.com/api/v1/alerts",
      headers={"Authorization": "Bearer <your-session-jwt>"},
      json={
          "type": "price_threshold",
          "condition": {
              "direction": "above",
              "threshold": 0.70,
          },
          "canonical_question_id": "550e8400-e29b-41d4-a716-446655440000",
      },
  )
  response.raise_for_status()
  alert = response.json()
  print(f"Alert created: {alert['data']['id']}")
  ```
</CodeGroup>

### Update an alert

**Endpoint:** `PATCH /api/v1/alerts/{id}`

You can update the `type`, `condition`, or toggle `is_active` to pause or resume an alert without deleting it.

```bash theme={null}
curl -X PATCH \
  https://api.predexy.com/api/v1/alerts/a1b2c3d4-5678-90ef-ghij-012345678901 \
  -H "Authorization: Bearer <your-session-jwt>" \
  -H "Content-Type: application/json" \
  -d '{
    "condition": {
      "direction": "above",
      "threshold": 0.80
    },
    "is_active": true
  }'
```

### Delete an alert

**Endpoint:** `DELETE /api/v1/alerts/{id}`

```bash theme={null}
curl -X DELETE \
  https://api.predexy.com/api/v1/alerts/a1b2c3d4-5678-90ef-ghij-012345678901 \
  -H "Authorization: Bearer <your-session-jwt>"
```

***

<Tip>
  The easiest way to manage watchlists and alerts is through the web app at [app.revalonlabs.xyz](https://app.revalonlabs.xyz). The UI lets you browse markets and add them to watchlists or set alerts with a few clicks, then the API is available if you want to automate or integrate these features into your own tooling.
</Tip>
