`POST /v1/orgs/{org}/proposals/{proposal_id}/reject`.
const url = 'https://api.updawg.net/v1/orgs/example/proposals/example/reject';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"reason":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.updawg.net/v1/orgs/example/proposals/example/reject \ --header 'Content-Type: application/json' \ --data '{ "reason": "example" }'Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Organization slug.
The prp_… id.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Option so that a missing field reaches Reason::parse rather than
axum’s body rejection — see the note in [reject]. It is still
required; what is optional is which of the three ways of not sending it
the caller chose.
Examplegenerated
{ "reason": "example"}Responses
Section titled “Responses”Rejected.
The body every one of the three answers with.
Named for what it is rather than for the endpoint, because all three return it and a portal that has just clicked a button wants the same three facts whichever button it was: where the proposal is now, and how the approval count stands.
object
Distinct people who have approved. A rejected proposal keeps the count it had: it is a record of who had agreed before somebody said no.
How many more approvals this needs before it can go ahead.
Zero once there are enough, and zero once there is nothing left to go
ahead with — see [ok].
What the policy asked for, via proposals.required_approvals.
When a proposal that is scheduled may start (DAWG-92).
Present only on that status, and omitted rather than null everywhere else: it is not “unknown”, it is “does not apply”, and a portal that renders a date field will render something for a null.
Examplegenerated
{ "approvals": 1, "id": "example", "outstanding": 1, "required": 1, "scheduled_for": "2026-04-15T12:00:00Z", "status": "example"}A reason is required and must not be blank.
object
Examplegenerated
{ "detail": "example", "status": 1, "title": "example", "type": "example"}No session.
object
Examplegenerated
{ "detail": "example", "status": 1, "title": "example", "type": "example"}Not permitted for this role.
object
Examplegenerated
{ "detail": "example", "status": 1, "title": "example", "type": "example"}No such proposal here.
object
Examplegenerated
{ "detail": "example", "status": 1, "title": "example", "type": "example"}No longer yours to decide.
object
Examplegenerated
{ "detail": "example", "status": 1, "title": "example", "type": "example"}Over the organization’s request limit. Retry-After says when to try again; RateLimit-Limit is the burst.
object
Examplegenerated
{ "detail": "example", "status": 1, "title": "example", "type": "example"}