# List your own signals

Your own signals in this organization, newest first, with when you last checked and how many people and companies each caught. Read it at the start of a session to know which signals to run, and skip the paused ones.

A signal your agent runs itself, with its own tools: hiring spikes on careers pages, posts on X, a newsletter, a list in the CRM. Register it and the user sees it on the Signals page of mySDR, next to the signals mySDR runs: what it watches, where, how often, when you last checked and what it caught. mySDR does not run, schedule or check it: it shows what you report. These routes are the tools `save_agent_signal`, `log_signal_hits`, `list_agent_signals` and `delete_agent_signal` of the assistant server.

## Authentication

Send `Authorization: Bearer gtk_…`. Create the key under **Connect assistant → API keys**. Every `gtk_` key can call these routes, also while the Signals API is closed. A missing, invalid or revoked key is **401**.

### Query parameters

- **`status`** `string` — Only active or only paused signals. One of: `active`, `paused`.

## Response

- **`object`** `string` · **required** — Always `list`. One of: `list`.
- **`total`** `integer` · **required** — Signals that match.
- **`data`** `object[]` · **required** — The signals, as GET /agent-signals/{key} gives them.
- **`dashboard_url`** `string` · **required** — The Signals page in mySDR.

## Credits

Free. This call never uses credits.

## Errors

- **400** `invalid_request` — A `status` that is not `active` or `paused`.
- **401** `authentication_error` — The Authorization header is missing, or the key is unknown or revoked.
- **403** `permission_error` — API access is not part of your plan, or your account is suspended.
- **429** `rate_limit_error` — More than 60 requests per minute, or more than 3 at the same time, on one key. Wait for the Retry-After header.
- **503** `service_unavailable` — The API is temporarily unavailable. Retry later.
- **500** `internal_error` — Something went wrong on our side.

## Example

### cURL

```bash
curl "https://mysdr.app/api/v1/agent-signals?status=active" \
  -H "Authorization: Bearer $MYSDR_API_KEY"
```

### JavaScript

```javascript
const response = await fetch('https://mysdr.app/api/v1/agent-signals?status=active', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${process.env.MYSDR_API_KEY}`
  }
});
const body = await response.json();
```

### Python

```python
import json
import os
import urllib.request

request = urllib.request.Request(
    "https://mysdr.app/api/v1/agent-signals?status=active",
    headers={
    "Authorization": f"Bearer {os.environ['MYSDR_API_KEY']}"
    },
    method="GET",
)
with urllib.request.urlopen(request) as response:
    body = json.load(response)
```

### Example response

```json
{
  "object": "list",
  "total": 1,
  "data": [
    {
      "object": "agent_signal",
      "key": "hiring_spike",
      "name": "Hiring spike on careers pages",
      "description": "Companies whose careers page lists at least 10 open roles, up from fewer than 5.",
      "source": "Careers pages",
      "source_url": null,
      "schedule": "daily",
      "status": "active",
      "last_checked_at": "2026-10-25T07:00:00.000Z",
      "next_check_at": "2026-10-26T08:00:00.000Z",
      "check_overdue": false,
      "last_check_note": "140 careers pages, 3 spikes",
      "caught": {
        "leads": 0,
        "companies": 9
      },
      "last_hit_at": "2026-10-25T07:00:00.000Z",
      "via": "Grok Bot",
      "created_at": "2026-10-20T08:00:00.000Z",
      "updated_at": "2026-10-25T07:00:00.000Z",
      "results_url": "https://mysdr.app/en/gtm/companies?signal=Hiring+spike+on+careers+pages"
    }
  ],
  "dashboard_url": "https://mysdr.app/en/gtm/signals"
}
```
