curl "https://api.up2data.ai/v1/usage/signals?group_by=external_id" \
-H "X-API-Key: $UP2DATA_API_KEY"
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"]
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();
{
"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"
}
}
Signals
Signal usage by external_id
Date-bounded Signal check rollups grouped by platform attribution external_id.
GET
/
v1
/
usage
/
signals
curl "https://api.up2data.ai/v1/usage/signals?group_by=external_id" \
-H "X-API-Key: $UP2DATA_API_KEY"
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"]
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();
{
"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"
}
}
Cost: Free
Aggregate check outcomes and credits charged from
How Signals work
Signals are scheduled change monitoring, billed per check. See what you can watch and how it’s priced.
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).
string
default:"external_id"
Must be
external_id when set. Defaults to external_id.string
Inclusive start (ISO 8601). Defaults to the first instant of the current UTC month.
string
Exclusive end (ISO 8601). Defaults to now.
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 |
curl "https://api.up2data.ai/v1/usage/signals?group_by=external_id" \
-H "X-API-Key: $UP2DATA_API_KEY"
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"]
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();
{
"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"
}
}