Accept a suggestion into shadow
const url = 'http://127.0.0.1:8080/v1/suggestions/example/accept';const options = { method: 'POST', headers: { 'Deedglass-Version': '2026-10-01', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"reason":"Ops approves these every time","replace_shadow":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://127.0.0.1:8080/v1/suggestions/example/accept \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Deedglass-Version: 2026-10-01' \ --data '{ "reason": "Ops approves these every time", "replace_shadow": true }'Creates a policy version from the suggestion (origin suggestion, suggestion_id set; an identical version already stored is reused and note says so) and runs it in shadow next to the enforced version. Nothing is enforced: promote it later with POST /v1/policies/{id}/versions/{v}/activate and mode: enforce. Seals policy.activated (shadow) and suggestion.accepted (deeds, in that order). reason is optional (up to 280 characters). An org runs at most one version in shadow: 409 shadow_slot_taken unless replace_shadow is true; 409 suggestion_stale when the enforced version changed since (the suggestion is superseded); 409 suggestion_decided when it was already decided; 409 conflict for advice. An admin+ Console session or an org admin key; viewers get 403 insufficient_role, agent keys 403 insufficient_scope.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The suggestion id (sug_…).
Header Parameters
Section titled “Header Parameters”The API version (YYYY-MM-DD). Leave it out to use your org’s pinned version (public routes use the latest). An unknown version is 400 api_version_invalid.
Needed when the request uses a Console session (it changes state); without it the answer is 403 csrf_failed. Not sent with an API key.
1 to 255 printable ASCII characters. A retry with the same key and body returns the stored response with Deedglass-Idempotent-Replayed: true for 24 hours.
Request Body
Section titled “Request Body”object
Optional. It goes into both deeds.
Replace the version running in shadow now.
Example
{ "reason": "Ops approves these every time", "replace_shadow": true}Responses
Section titled “Responses”The suggestion, accepted, with the version it created and the deeds.
A policy change Insights proposes, with its evidence, diff, replay and risk (S28). Nothing applies until a person accepts it, and accepting only runs it in shadow.
object
object
Why the template wording stands (validation:…
When worded by Claude
object
The enforced version the suggestion was written for.
The numbers that triggered it: window, approvals, median_wait_seconds, approvers, agents, tool, pattern, sample_actions (loosen); mismatches (tighten); days and limits (budget); and so on per generator.
object
The change as unified hunks with 3 lines of context; null for advice.
object
object
object
The candidate’s compile warnings (severity warning).
object
The change replayed against the same 14 days, compared with the enforced version.
object
The replay (rpl_…
object
object
object
Actions whose decision the replay changes.
object
object
Accept and reject answers only: the deeds sealed, in order.
Accept only
Accept only
Example
{ "object": "suggestion", "status": "open", "kind": "loosen", "generator": "loosen.approval_rate", "phrasing": { "source": "template" }, "diff": { "hunks": [ { "lines": [ { "op": " " } ] } ] }, "stale_reason": "base_changed", "decided_by": { "type": "user" }}Headers
Section titled “Headers”This request’s id. Quote it to support; it matches error.request_id.
The API version this response follows.
Present, and true, when the response is a stored one replayed for an Idempotency-Key.
shadow_slot_taken, suggestion_stale, suggestion_decided, or conflict for advice.
object
object
One or more calm sentences with the next step.
The request field, query parameter or header the error is about.
On policy_invalid only. Each problem with its line, code and hint.
One finding about a policy file, with its position and the next step. Codes are stable and listed in docs/POLICY_ERRORS.md. In the policy_invalid error envelope each diagnostic also carries object: policy_diagnostic. The full PolicyDiagnostic schema is in openapi.yaml.
object
One agent action. Its sections mirror the deed’s. status is the one field an agent needs; state is the exact lifecycle state (docs/GATE.md). The Gate’s own responses (POST /v1/actions and its result report) add execution.result and witness.reasons; lists leave both out. The full Action schema is in openapi.yaml.
object
On undo_unavailable only. Every check of the undo, each with its fix. Additive (S23).
One of the twelve safety checks (S23 §3.3). Available means no check failed. The full UndoCheck schema is in openapi.yaml.
object
Example
{ "error": { "type": "invalid_request_error", "code": "shadow_slot_taken", "message": "acme-sim v2 is already running in shadow. Promote or clear it first, or accept with replace_shadow: true to replace it.", "param": "replace_shadow", "request_id": "req_01m435q4ne4yj7meyd2bdz8kdm", "doc_url": "https://docs.deedglass.com/errors/shadow_slot_taken" }}Headers
Section titled “Headers”This request’s id. Quote it to support; it matches error.request_id.
default
Section titled “default”An error. Every error has this envelope; doc_url explains the code.
object
object
One or more calm sentences with the next step.
The request field, query parameter or header the error is about.
On policy_invalid only. Each problem with its line, code and hint.
One finding about a policy file, with its position and the next step. Codes are stable and listed in docs/POLICY_ERRORS.md. In the policy_invalid error envelope each diagnostic also carries object: policy_diagnostic. The full PolicyDiagnostic schema is in openapi.yaml.
object
One agent action. Its sections mirror the deed’s. status is the one field an agent needs; state is the exact lifecycle state (docs/GATE.md). The Gate’s own responses (POST /v1/actions and its result report) add execution.result and witness.reasons; lists leave both out. The full Action schema is in openapi.yaml.
object
On undo_unavailable only. Every check of the undo, each with its fix. Additive (S23).
One of the twelve safety checks (S23 §3.3). Available means no check failed. The full UndoCheck schema is in openapi.yaml.
object
Example
{ "error": { "type": "invalid_request_error", "code": "not_found", "message": "There's no endpoint at GET /v1/helth. Did you mean /v1/health?", "param": null, "request_id": "req_01j9zr3m5k8q2w7x4t6v0b1c9d", "doc_url": "https://docs.deedglass.com/errors/not_found" }}Headers
Section titled “Headers”This request’s id. Quote it to support; it matches error.request_id.
The API version this response follows.