FurniOpsDocs
API referenceAgents

Accept a proposal

Applies the proposal as the person accepting it, through the same change a person makes (category rules: saved, then the source replayed; a mapping: confirmed, then replayed; a source: created), and needs that change's permission too (sources:write). A proposal not waiting for a person answers 409; one that no longer applies (the source paused or busy) answers 409 and stays proposed. A triage note has nothing to apply: accepting one answers 409; reject dismisses it.

POST/v1/proposals/{id}/accept

Applies the proposal as the person accepting it, through the same change a person makes (category rules: saved, then the source replayed; a mapping: confirmed, then replayed; a source: created), and needs that change's permission too (sources:write). A proposal not waiting for a person answers 409; one that no longer applies (the source paused or busy) answers 409 and stays proposed. A triage note has nothing to apply: accepting one answers 409; reject dismisses it.

Authorization

apiKey
AuthorizationBearer <token>

An API key (fo_live_… / fo_test_…) as a bearer token

In: header

Path Parameters

id*string

Proposal (a change an AI agent proposes, proved before anyone sees it) ID

Match^prp_[0-9A-Za-z]{22}$

Header Parameters

FurniOps-Version?string

Dated API version; pinned per organisation on first use and overridable per request

Value in

  • "2026-10-01"
  • "2026-10-04"
FurniOps-Mode?string

The data the request acts on: test is the organisation's sandbox. An OAuth token picks it (live by default); an API key's mode is fixed, and naming the other one is refused

Value in

  • "live"
  • "test"
Idempotency-Key*string

Unique key for this operation, reused on retries (24 h)

Length1 <= length <= 257
FurniOps-Dry-Run?string

Preview the write and change nothing: true answers the would-be response, explain a Preview (application/vnd.furniops.preview+json)

Value in

  • "true"
  • "explain"

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X POST "https://example.com/v1/proposals/string/accept" \  -H "Idempotency-Key: string"
{  "object": "proposal",  "id": "string",  "catalogue": "string",  "agent": "categories",  "source": "string",  "status": "shadow",  "risk": "low",  "summary": "string",  "payload": {    "kind": "category_rules",    "rules": [      {        "path": [          "string"        ],        "category": "string",        "reason": "string"      }    ]  },  "evidence": {    "kind": "category_rules",    "products": 0,    "filed_before": 0,    "filed_after": 0,    "snapshot": "2019-08-24T14:15:22Z"  },  "model": "string",  "cost_micros": 0,  "failure": "string",  "superseded_by": "string",  "decided_by": {    "kind": "user",    "id": "string"  },  "created_at": "2019-08-24T14:15:22Z",  "decided_at": "2019-08-24T14:15:22Z",  "applied_at": "2019-08-24T14:15:22Z"}