Update a program
/programs/{program_uuid}
Update an existing program using PATCH semantics: only the fields you supply are changed,
everything else is left as-is. Pass null to clear an optional field.
Note: when changing event_grouping to separate you must also supply
max_separate_events. Conversely, when changing it to grouped, any supplied
max_separate_events is ignored and the stored value is cleared.
Example Request
PATCHRequest Schema
program_uuid
The program UUID
program_name
status
report_emails
data_retention_months
event_grouping
max_separate_events
default_risk_level
The risk level pre-filled when a new entity is added to this program. When set to `null` (No default - always choose), a risk level must be explicitly selected before an entity can be saved through manual workflows; bulk file uploads assign `low`.
Available Response Data
12 Data Pointsuuid uuid
The program's UUID
program_number string (A short obfuscated public identifier for the program (e.g. "P-123-456-789"))
program_name string
The display name of the program
status enum
Lifecycle status of the program: active, paused, archived
report_emails array (Email addresses (max 5) that receive event report notifications for this program)
data_retention_months integer
How long, in months, to keep entity data for
event_grouping enum
Whether events from the same entity should be grouped into one event: separate, grouped
max_separate_events integer
When event_grouping is separate, the maximum number of separate events to create
default_risk_level enum
The risk level pre-filled when a new entity is added to this program: low, medium, high
created_at timestamp
ISO 8601 timestamp at which the program was created
updated_at timestamp
ISO 8601 timestamp at which the program was last updated
api_reference uuid
unique request identifier for log tracing and audit
API Data Scale & Coverage tag
Unmatched data depth to power your compliance and verification workflows.
Sandbox Environment
Build and test against a sandbox account. Sandbox is a separate account with its own UUID and its own API keys, and the environment is fixed at the account level, so you cannot switch an existing key between live and sandbox with a parameter or header. Both share the same base URL, so the account behind your key is what determines which environment you are in. GET /v1/account returns an environment field of live or sandbox, and that is the authoritative answer.
Calls on a sandbox key are not billed. Every endpoint, response shape, error envelope, idempotency and rate-limit behaviour mirrors live, so the only change when you move to production should be the credentials. Sandbox accounts are provisioned by your Global Data account manager.
Technical Use Cases tag
Propagating changes from your system of record
Push corrections and changes of circumstance into WatchEye as they happen, so screening runs against current details, not the details captured at onboarding.
Status and lifecycle management
Change status fields as a matter progresses. A status change is not a deletion, so the record stays fully visible through the API.
Keeping the audit trail intact
Every update is written to the account audit log, so the change history is available without you maintaining a parallel record of it.
Compliance & Security tag
Enterprise-grade infrastructure audited against the standards your regulators require.
Common Questions tag
Everything you need to know about implementation details and compliance infrastructure.
help_center General
Is this call billed?
add
Is this call billed?
Yes. This is a chargeable endpoint, and the fee is billed to your account at the time of the request. Your rates are set per account and confirmed by your Global Data account manager.
If your balance reaches zero or an agreed call limit is reached, further chargeable requests return 402 Payment Required until the account is topped up. Calls made with a key on a sandbox account are never charged.
rocket_launch Implementation
What are the rate limits?
add
What are the rate limits?
600 requests per minute by default, enforced with a 60-second fixed window. Every response carries X-RateLimit-Limit and X-RateLimit-Remaining.
Exceeding the limit returns 429 Too Many Requests with a Retry-After header giving the number of seconds to wait, and X-RateLimit-Reset giving the reset timestamp. Schedule retries from Retry-After instead of a fixed sleep, and slow down before you hit zero, not after.
Higher limits can be arranged case by case through WatchEye support.
Ready to integrate Update a program?
Talk to our team about credentials, sandbox access and the right combination of endpoints for your workflow.
