# DELETE /v2/signals/{name}

**Delete a custom signal**

By default, DELETE is cascade-safe: it refuses with 409 `signal_referenced` if any of your other custom signals reference this signal by name. The response carries a `referencing_signals` array so you can audit before deciding.

Pass `?force=true` to delete anyway. Existing references will compile to `unknown_column` errors next time the consumer recompiles, so use force when you've already fixed the references. 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. |
| `force` | query | boolean | no | When `true`, skip the reference check and delete. References will break on next recompile. Default: `false`. |

## Status codes

- **200** — `{ as_of, ok: true }`.
- **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.
- **409** — `signal_referenced` with `referencing_signals` array. Pass `?force=true` to bypass.

## Sample response

```json
{
  "error": "signal_referenced",
  "message": "Custom signal \"rsi_oversold_with_volume\" is referenced by 1 other signal. Pass ?force=true to delete anyway (references will break).",
  "referencing_signals": ["rsi_dip_with_volume"]
}
```

## Examples

### Refused — referenced by another custom signal

Request:

```shell
curl -X DELETE "https://api.tickerbot.io/v2/signals/rsi_oversold_with_volume" \
  -H "Authorization: Bearer YOUR_KEY"
```

Response (`409`):

```json
{
  "error": "signal_referenced",
  "message": "Custom signal \"rsi_oversold_with_volume\" is referenced by 1 other signal. Pass ?force=true to delete anyway (references will break).",
  "referencing_signals": ["rsi_dip_with_volume"]
}
```

### Delete with force after fixing references

Request:

```shell
curl -X DELETE "https://api.tickerbot.io/v2/signals/rsi_oversold_with_volume?force=true" \
  -H "Authorization: Bearer YOUR_KEY"
```

Response (`200`):

```json
{
  "as_of": "2026-05-30T18:55:00.000Z",
  "ok": true
}
```

## Notes

- The reference check is a regex match on the JSONB text of other custom signals' `expr_text` — false positives are possible (e.g. the name appears in a comment or string literal). False positives are tolerable for a safety warning; tighter detection via compiled-AST walks is a future enhancement.

---

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