Skip to main content
Working with an agent? Give them a link to this page as markdown.

Monitor customization

Custom instructions add your organization's policy to Watcher's managed monitors. This API edits the same text as the Custom Instructions editor in the Analyzer. There is one instructions string for the organization, shared by the managed triage and gateway monitors.

Instructions apply when those monitors run, including through gateway hooks. They do not affect custom graders or scheduled summarize and deep_review monitors. They do not replace the monitor's rubric or output format. Calls resolved by deterministic checks do not reach them.

Authentication and permissions​

Use your deployment's API authentication. In SSO mode, send an organization API key in x-api-key. In proxy mode, use the credentials your reverse proxy requires.

Method and path, relative to the API base URLRequired permissionEffect
GET /v1/monitors/customizationorg:settings:readRead the saved instructions.
PUT /v1/monitors/customizationorg:settings:writeReplace the saved instructions.

For the SSO examples below, set WATCHER_API_URL to your API base URL, including /api, and WATCHER_API_KEY to a key with both permissions. On Apollo cloud, the base URL is https://app.apolloresearch.ai/api. For self-hosting, use https://<your-watcher-host>/api. In proxy mode, replace the x-api-key header with your proxy's required authentication.

Read the current instructions​

curl --fail-with-body \
-H "x-api-key: $WATCHER_API_KEY" \
"$WATCHER_API_URL/v1/monitors/customization"

Both GET and PUT return HTTP 200 with these fields:

FieldMeaning
instructionsThe saved text, or an empty string when none is set.
updated_byThe last writer's identity, or null if never set.
updated_atThe last write time, or null if never set.

Before the first write, the response is:

{"instructions": "", "updated_by": null, "updated_at": null}

Replace the instructions​

The request body requires a string field named instructions. Its limit is 32,768 characters. PUT replaces the whole text; it does not append or merge. Save this JSON as monitor-instructions.json, changing the policy to suit your organization:

{"instructions": "Never allow AWS calls by the agent."}

Then send it:

curl --fail-with-body -X PUT \
-H "x-api-key: $WATCHER_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @monitor-instructions.json \
"$WATCHER_API_URL/v1/monitors/customization"

Watcher returns HTTP 422 and saves nothing if the text exceeds the limit or contains <organization_instructions> or </organization_instructions> in any letter case. Those tags are reserved; send plain policy text without them.

Check that the response contains the exact text you sent. Repeat GET to verify that it was saved. Later managed-monitor evaluations use the saved policy. Saving it does not regrade prior calls or sessions. Keep your own copy if you need a history: this endpoint retains only the current text.

Clear the instructions​

Send an empty string to remove your organization's custom instructions:

curl --fail-with-body -X PUT \
-H "x-api-key: $WATCHER_API_KEY" \
-H "Content-Type: application/json" \
--data '{"instructions": ""}' \
"$WATCHER_API_URL/v1/monitors/customization"

Verify that GET now returns instructions: "". The last writer and write time remain set. Clearing instructions leaves the managed monitors' built-in rubrics in place.