Publish the staged draft as a new effective version.
Admin — requires first-party Bearer + `settings.manage` (realm pinned by the session token). Reads the draft, creates a new immutable `legal_agreement_version` row (advancing `version_no`, recording an `agreement.published` audit event), and clears the draft. Returns 404 when no draft exists for the type. This is the only path the admin UI uses to publish — there is no "publish without a draft" entry in the UI (the legacy `PUT /agreements/{type}` handler remains for backward compatibility).
Admin — requires first-party Bearer + settings.manage (realm pinned by the session token).
Reads the draft, creates a new immutable legal_agreement_version row
(advancing version_no, recording an agreement.published audit event),
and clears the draft. Returns 404 when no draft exists for the type. This is
the only path the admin UI uses to publish — there is no "publish without a
draft" entry in the UI (the legacy PUT /agreements/{type} handler remains
for backward compatibility).
Path Parameters
Agreement type: terms_of_service | privacy_policy
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/api/legal/admin/agreements/string/publish"{ "effective_at": "2019-08-24T14:15:22Z", "external_url": "string", "mode": "full_text", "version_id": "9e94c502-ca41-4342-a7f7-af96b444512c", "version_no": 0}{ "code": "string", "details": null, "message": "string", "requestId": "string", "status": 0}{ "code": "string", "details": null, "message": "string", "requestId": "string", "status": 0}{ "code": "string", "details": null, "message": "string", "requestId": "string", "status": 0}{ "code": "string", "details": null, "message": "string", "requestId": "string", "status": 0}{ "code": "string", "details": null, "message": "string", "requestId": "string", "status": 0}