# PATCH /v2/signals/{name}

**Update a custom signal**

Partial update — supply `expr`, `description`, or both. Providing `expr` recompiles against the live column whitelist (same validator as create). Built-in signals are read-only — only custom signals you own can be patched. Write access requires Scale or above; Hobby/Pro return `403 custom_signals_tier_required`.

## Plan access

- **Plan access.** Scale and above. Hobby/Pro can read the catalog but writes return 403 custom_signals_tier_required.
- **Rate limit.** Hobby 600/min · Pro 2,000/min · Scale 10,000/min.
- **Capacity.** Unlimited custom signals per account on Scale and Enterprise.

## Body parameters

| Name | In | Type | Required | Description |
|------|----|----|----------|-------------|
| `name` | path | string | yes | Custom signal slug. |
| `expr` | body | string | no | New SQL expression. Re-validated and re-inlined against your other custom signals. |
| `description` | body | string | no | New description. |

## Status codes

- **200** — `{ as_of, signal: {...} }` — the updated signal.
- **400** — `compile_failed` on bad expression, `bad_request` on shape failure.
- **403** — `custom_signals_tier_required` — Hobby/Pro can read but not write custom signals.
- **404** — `not_found` — no custom signal with that name on this account (built-ins are not patchable).

## Sample response

```json
{
  "as_of": "2026-05-30T18:55:00.000Z",
  "signal": {
    "name": "rsi_oversold_with_volume",
    "kind": "expression",
    "description": "RSI < 30 confirmed by a 2x relative-volume burst.",
    "expr": "rsi_14 < 30 AND volume_ratio_20d > 1.5",
    "created_at": 1779389700,
    "updated_at": 1779476400
  }
}
```

## Examples

### Loosen the volume threshold

Request:

```shell
curl -X PATCH "https://api.tickerbot.io/v2/signals/rsi_oversold_with_volume" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "expr": "rsi_14 < 30 AND volume_ratio_20d > 1.5" }'
```

Response (`200`):

```json
{
  "as_of": "2026-05-30T18:55:00.000Z",
  "signal": {
    "name": "rsi_oversold_with_volume",
    "kind": "expression",
    "description": "RSI < 30 confirmed by a 2x relative-volume burst.",
    "expr": "rsi_14 < 30 AND volume_ratio_20d > 1.5",
    "created_at": 1779389700,
    "updated_at": 1779476400
  }
}
```

---

Interactive sandbox + parameter editor: https://tickerbot.io/api/endpoints/signals/update
