Modify a signal
Change the name, the schedule or the batch body of a signal in place.
PATCH
https://api.up2data.ai/v1/signals/{signal_id}A partial update: keys you omit keep their value, and inside schedule each key is optional too. Send null for schedule.ends_at or schedule.max_runs to clear them. schedule.start_at can only change before the first run. Changing schedule.interval_ms after a run moves next_run_at to last_run_at plus the new interval, or to now if that is already past. If the new schedule means a completed signal is no longer complete, for example a higher max_runs, it is revived and resumes on schedule. Pausing and resuming have their own endpoints and are not done here.
#Request
| Field | Type | Notes |
|---|---|---|
signal_idrequired | string | Path parameter. The signal_id returned by POST /signals. |
name | string | At most 200 characters. |
schedule | object | Any of interval_ms, start_at, ends_at, max_runs. ends_at and max_runs accept null. |
request | object | Replaces the batch body used on future runs. Same rules as on create. |
#Call it
curl -X PATCH "https://api.up2data.ai/v1/signals/9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"schedule": {
"interval_ms": 43200000,
"max_runs": null
}
}'import requests
url = "https://api.up2data.ai/v1/signals/9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11"
headers = {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
}
payload = {
"schedule": {
"interval_ms": 43200000,
"max_runs": None
}
}
response = requests.patch(url, headers=headers, json=payload)
print(response.json())const url = "https://api.up2data.ai/v1/signals/9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11";
const headers = {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
};
const body = {
"schedule": {
"interval_ms": 43200000,
"max_runs": null
}
};
const response = await fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
});
const data = await response.json();
console.log(data);package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
url := "https://api.up2data.ai/v1/signals/9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11"
body := bytes.NewBufferString(`{
"schedule": {
"interval_ms": 43200000,
"max_runs": null
}
}`)
req, err := http.NewRequest("PATCH", url, body)
if err != nil {
panic(err)
}
req.Header.Set("X-API-Key", "YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
fmt.Println(string(respBody))
}#Response
{
"data": {
"signal_id": "9d1f4c2e-7b3a-4e8f-a1c5-2f6b8d9e0a11",
"name": "Watch key accounts",
"status": "active",
"active": true,
"pause_reason": null,
"schedule": { "interval_ms": 43200000, "start_at": "2026-11-01T08:00:00Z", "ends_at": null, "max_runs": null },
"run_count": 3,
"next_run_at": "2026-11-03T20:00:00Z",
"last_run_at": "2026-11-03T08:00:00Z",
"last_job_id": "job_7hd92kfa",
"last_error": null,
"completed_at": null,
"request": {
"items": [
{ "type": "profile", "url": "https://linkedin.com/in/a" },
{ "type": "company", "url": "https://linkedin.com/company/acme" }
],
"webhook_url": "https://your-server.com/hooks/up2data"
},
"created_at": "2026-10-30T12:00:00Z",
"updated_at": "2026-11-03T08:00:01Z"
},
"meta": { "creditsUsed": 0, "creditsRemaining": 98413, "billed": false, "reason": "signal_updated", "requestId": "req_t4sk0001" }
}#Errors
| Status | Type | When | Billed |
|---|---|---|---|
| 400 | invalid_request | Malformed body, start_at changed after the first run, interval_ms below 60000, ends_at not after start_at, max_runs below 1, or an invalid request body. | No |
| 404 | not_found | No signal with this signal_id in your organization, or signal_id is not a UUID. | No |
| 401 | invalid_api_key | Missing, malformed, or revoked key. | No |
| 429 | rate_limited | Over the 5,000 requests/min limit. Honor Retry-After. | No |
| 500 | internal_error | Something broke on the server side. | No |
| 503 | upstream_error | The scheduling service is unreachable. Safe to retry. | No |
See the Errors guide for every error type this version can return.