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

# Signal usage by external_id

> Date-bounded Signal check rollups grouped by platform attribution external_id.

**Cost: Free**

<Card title="How Signals work" icon="satellite-dish" href="/concepts/signals" type="tip" horizontal arrow="true" cta="Read the guide">
  Signals are scheduled change monitoring, billed per check. See what you can watch and how it's priced.
</Card>

Aggregate check outcomes and credits charged from `signal_check_logs`, grouped by `external_id`. Use this for platform tenant metering — rows reflect historical attribution snapshotted at check time, so later Signal metadata edits do not rewrite past usage. Returns at most **1000** rows (highest `credits_charged` first).

Defaults to the current UTC month through now when `from` / `to` are omitted. Deleted Signals still contribute to the rollup for retained logs (**90 days**).

<ParamField query="group_by" type="string" default="external_id">
  Must be `external_id` when set. Defaults to `external_id`.
</ParamField>

<ParamField query="from" type="string">
  Inclusive start (ISO 8601). Defaults to the first instant of the current UTC month.
</ParamField>

<ParamField query="to" type="string">
  Exclusive end (ISO 8601). Defaults to now.
</ParamField>

### Response row fields

| Field               | Description                                                |
| ------------------- | ---------------------------------------------------------- |
| `external_id`       | Attribution key, or `null` for Signals created without one |
| `checks`            | Total check attempts in the window                         |
| `successful_checks` | Checks that completed without error                        |
| `failed_checks`     | Checks that failed                                         |
| `matched_checks`    | Checks that matched criteria (Triggers)                    |
| `credits_charged`   | Credits billed for successful checks                       |

<RequestExample>
  ```bash cURL theme={null}
  curl "https://api.up2data.ai/v1/usage/signals?group_by=external_id" \
    -H "X-API-Key: $UP2DATA_API_KEY"
  ```

  ```python Python theme={null}
  resp = requests.get(
      "https://api.up2data.ai/v1/usage/signals",
      params={"group_by": "external_id"},
      headers={"X-API-Key": UP2DATA_API_KEY},
  )
  rows = resp.json()["data"]
  ```

  ```ts TypeScript theme={null}
  const res = await fetch(
    "https://api.up2data.ai/v1/usage/signals?group_by=external_id",
    { headers: { "X-API-Key": apiKey } },
  );
  const { data, meta } = await res.json();
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "data": [
      {
        "external_id": "crm:workspace:42",
        "checks": 120,
        "successful_checks": 118,
        "failed_checks": 2,
        "matched_checks": 7,
        "credits_charged": 118
      },
      {
        "external_id": null,
        "checks": 3,
        "successful_checks": 3,
        "failed_checks": 0,
        "matched_checks": 0,
        "credits_charged": 3
      }
    ],
    "meta": {
      "requestId": "req_…",
      "creditsRemaining": 9840,
      "group_by": "external_id",
      "from": "2026-07-01T00:00:00.000Z",
      "to": "2026-07-21T12:00:00.000Z"
    }
  }
  ```
</ResponseExample>
