curl -X POST https://api.up2data.ai/v1/signals/sig_9dk2m1xq/check-now \
-H "X-API-Key: $UP2DATA_API_KEY"
resp = requests.post(
f"https://api.up2data.ai/v1/signals/{signal_id}/check-now",
headers={"X-API-Key": UP2DATA_API_KEY},
)
result = resp.json()["data"]
print(result["status"], result.get("matched"), result.get("is_baseline"))
const res = await fetch(
`https://api.up2data.ai/v1/signals/${signalId}/check-now`,
{ method: "POST", headers: { "X-API-Key": apiKey } },
);
const { data, meta } = await res.json();
// meta.reason: baseline_established | check_matched | check_completed | check_failed | …
{
"data": {
"signal_id": "sig_9dk2m1xq",
"check_number": 2,
"status": "matched",
"matched": true,
"is_baseline": false,
"billed": true,
"credits_used": 1,
"trigger_id": "trg_abc123",
"criteria_matched": ["headline"],
"diff": {
"headline": { "before": "VP Eng @ Acme", "after": "CTO @ Beta" }
},
"webhook": { "status": "retrying", "attempts": 0, "delivery_id": "wh_signal_trg_abc123" }
},
"meta": { "creditsUsed": 1, "billed": true, "reason": "check_matched", "requestId": "req_ts5k18dq" }
}
{
"data": {
"signal_id": "sig_9dk2m1xq",
"check_number": 1,
"status": "failed",
"matched": false,
"billed": false,
"credits_used": 0,
"error_type": "invalid_request",
"error_message": "could not derive a Harvest searchQuery from the search URL"
},
"meta": { "creditsUsed": 0, "billed": false, "reason": "check_failed", "requestId": "req_fail1" }
}
Signals
Check a Signal now
Run one real check immediately — same scrape, billing, and Trigger rules as a scheduled check.
POST
/
v1
/
signals
/
{id}
/
check-now
curl -X POST https://api.up2data.ai/v1/signals/sig_9dk2m1xq/check-now \
-H "X-API-Key: $UP2DATA_API_KEY"
resp = requests.post(
f"https://api.up2data.ai/v1/signals/{signal_id}/check-now",
headers={"X-API-Key": UP2DATA_API_KEY},
)
result = resp.json()["data"]
print(result["status"], result.get("matched"), result.get("is_baseline"))
const res = await fetch(
`https://api.up2data.ai/v1/signals/${signalId}/check-now`,
{ method: "POST", headers: { "X-API-Key": apiKey } },
);
const { data, meta } = await res.json();
// meta.reason: baseline_established | check_matched | check_completed | check_failed | …
{
"data": {
"signal_id": "sig_9dk2m1xq",
"check_number": 2,
"status": "matched",
"matched": true,
"is_baseline": false,
"billed": true,
"credits_used": 1,
"trigger_id": "trg_abc123",
"criteria_matched": ["headline"],
"diff": {
"headline": { "before": "VP Eng @ Acme", "after": "CTO @ Beta" }
},
"webhook": { "status": "retrying", "attempts": 0, "delivery_id": "wh_signal_trg_abc123" }
},
"meta": { "creditsUsed": 1, "billed": true, "reason": "check_matched", "requestId": "req_ts5k18dq" }
}
{
"data": {
"signal_id": "sig_9dk2m1xq",
"check_number": 1,
"status": "failed",
"matched": false,
"billed": false,
"credits_used": 0,
"error_type": "invalid_request",
"error_message": "could not derive a Harvest searchQuery from the search URL"
},
"meta": { "creditsUsed": 0, "billed": false, "reason": "check_failed", "requestId": "req_fail1" }
}
Cost: same as the Signal’s underlying scrape · failed scrapes free · does not advance the schedule
Runs the check immediately without changing
Also returns
How Signals work
Signals are scheduled change monitoring, billed per check. See what you can watch and how it’s priced.
next_check_at. If criteria match (and this is not the baseline), a real Trigger is created and the webhook fires.
POST /v1/signals/{id}/test is a backward-compatible alias for this endpoint.
Response
Discriminated bydata.status:
status | Meaning |
|---|---|
matched | Criteria matched; Trigger created when applicable |
not_matched | Check succeeded; no Trigger (includes baseline) |
failed | Scrape/check failed; not billed |
paused | Signal paused (credits/budget); not billed |
is_baseline, criteria_matched, diff, error_type / error_message on failure, and webhook when a delivery was enqueued.
curl -X POST https://api.up2data.ai/v1/signals/sig_9dk2m1xq/check-now \
-H "X-API-Key: $UP2DATA_API_KEY"
resp = requests.post(
f"https://api.up2data.ai/v1/signals/{signal_id}/check-now",
headers={"X-API-Key": UP2DATA_API_KEY},
)
result = resp.json()["data"]
print(result["status"], result.get("matched"), result.get("is_baseline"))
const res = await fetch(
`https://api.up2data.ai/v1/signals/${signalId}/check-now`,
{ method: "POST", headers: { "X-API-Key": apiKey } },
);
const { data, meta } = await res.json();
// meta.reason: baseline_established | check_matched | check_completed | check_failed | …
{
"data": {
"signal_id": "sig_9dk2m1xq",
"check_number": 2,
"status": "matched",
"matched": true,
"is_baseline": false,
"billed": true,
"credits_used": 1,
"trigger_id": "trg_abc123",
"criteria_matched": ["headline"],
"diff": {
"headline": { "before": "VP Eng @ Acme", "after": "CTO @ Beta" }
},
"webhook": { "status": "retrying", "attempts": 0, "delivery_id": "wh_signal_trg_abc123" }
},
"meta": { "creditsUsed": 1, "billed": true, "reason": "check_matched", "requestId": "req_ts5k18dq" }
}
{
"data": {
"signal_id": "sig_9dk2m1xq",
"check_number": 1,
"status": "failed",
"matched": false,
"billed": false,
"credits_used": 0,
"error_type": "invalid_request",
"error_message": "could not derive a Harvest searchQuery from the search URL"
},
"meta": { "creditsUsed": 0, "billed": false, "reason": "check_failed", "requestId": "req_fail1" }
}
To verify webhook delivery without needing criteria to match, use
POST /v1/signals/{id}/test-webhook — free, no scrape.⌘I