---
title: "Create"
method: POST
path: "/terms"
tags: ["terms"]
---

# Create

`POST /terms`

## Request

- Base URL: `https://api.instruxi.dev/api/v1/enforcer`
- URL: `https://api.instruxi.dev/api/v1/enforcer/terms`
- Auth: one of:
  - API key in header `Authorization`
  - API key in header `X-API-Key`

Creates a NEW terms document version. type must be one of platform, privacy, cookies, aml, custom — anything else is a 400 invalid_terms_type, because a document stored under an unrecognised type is never resolved by any reader (the onboarding gate keys on type, and the public legal route serves only platform/privacy/cookies). This does NOT deactivate or supersede any existing active version of the same type — setTermsActive is a separate, explicit step. Until the old version is turned off, getMyTerms' current-version resolution treats both as active and picks between them (tenant-specific over global, otherwise the newest-effective), so a caller may keep seeing the version they already accepted. content_hash is computed server-side (sha256 of content) and is what an acceptance snapshots, not a client-supplied value. tenant_id is admin-only; a tenant_admin caller is silently pinned to their own tenant regardless of what they pass.

## Request body

- InternalDeliveryHttpHandlerCreateTermsRequest
  - `content` string
  - `effective_at` string
  - `expires_at` string
  - `is_mandatory` boolean
  - `summary` string
  - `tenant_id` string: admin only; tenant admins are forced to their own tenant
  - `title` string
  - `type` string
  - `version` string

## Response `201`

Created

- InternalDeliveryHttpHandlerTermsResponse
  - `data` EnforcerV3InternalDomainTermsTerms
    - `content` string
    - `content_hash` string
    - `created_at` string
    - `effective_at` string
    - `expires_at` string
    - `id` string
    - `is_active` boolean
    - `is_mandatory` boolean
    - `summary` string
    - `tenant_id` string: nil = global
    - `title` string
    - `type` string
    - `updated_at` string
    - `version` string
  - `success` boolean

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden

---

[API](https://skmtc.dev/instruxi/apis/enforcer-api.md) · [All operations](https://skmtc.dev/instruxi/apis/enforcer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/instruxi/apis/enforcer-api/revisions/fa82bc1becc0?raw)
