Skip to main content
POST
Reject a pending policy change (checker)

Authorizations

Authorization
string
header
required

Caller API key issued by scripts/generate-api-key.ts. Sent as Authorization: Bearer . Verified against a stored SHA-256 hash in constant time by packages/api/src/auth/StaticKeyAuthenticator.ts. Required on every route not listed as exempt in this document's top-level description. See /api-reference/authentication.

Path Parameters

id
string
required

Body

application/json

Request body for POST /policies/pending-changes/{id}/reject.

rejectionReason
string
required

Free-text reason. Required, non-empty.

stepUpAuthorization
Policy Change Step-Up Authorization · object
required

Signed envelope proving a checker's explicit, fresh intent to approve or reject one specific Pending Policy Change (Policy Governance, Layer 4). Produced by PolicyChangeStepUpAuthorizationSigner (@parmana/crypto) using the checker's own step-up private key, never the bearer API key. Verified server-side against: the checker's registered stepUpPublicKey, payload.pendingPolicyChangeId matching the URL's {id}, payload.action matching the endpoint (approve vs reject), payload.expiresAt not yet passed, and payload.nonce not previously seen (single-use, replay-rejected on a second attempt with the same envelope).

Example:

Response

Rejected.

A proposed change to a policy's content, held in a durable pending state until a second, distinct human explicitly approves or rejects it (Policy Governance, maker-checker). Only ever moves from PENDING_APPROVAL to APPROVED or REJECTED, exactly once.

pendingPolicyChangeId
string
required

Unique Pending Policy Change identifier.

policyName
string
required

The policy this proposal targets, same identifier as Policy.policyId.

policyVersion
string
required

The existing version this proposal is a change against ("the version being replaced"). Not necessarily equal to proposedContent's own declared version: an in-place patch and a version bump are both legitimate.

proposedContent
object
required

The full proposed policy.json content, in its entirety, not a diff or patch.

proposedBy
string
required

Identity of the proposer (maker). Always a human-authenticated (credentialHolderType USER) caller.

proposedAt
string<date-time>
required
status
enum<string>
required
Available options:
PENDING_APPROVAL,
APPROVED,
REJECTED
reason
string
required

Free-text justification from the proposer, required at creation.

resolvedBy
string

Identity of the resolver (checker). Absent while PENDING_APPROVAL. Never equal to proposedBy.

resolvedAt
string<date-time>

Absent while PENDING_APPROVAL.

rejectionReason
string

Present only when status is REJECTED.

coverageWarnings
string[]

Present only when non-empty: uncovered-fact warnings from PolicyValidator.findUncoveredFacts against proposedContent.

ruleConflicts
string[]

Present only when non-empty: advisory rule-conflict warnings from PolicyValidator.findRuleConflicts against proposedContent, never blocking.