---
title: "Create a contract type"
method: POST
path: "/contract-types"
tags: ["Contract Types"]
---

# Create a contract type

`POST /contract-types`

## Request

- Base URL: `https://contracko.com/api/v1`
- URL: `https://contracko.com/api/v1/contract-types`
- Auth: one of:
  - API key in header `x-contracko-api-key`
  - HTTP bearer

Creates a contract type, optionally with custom fields, in the API key organisation.

## Request body

- object: Input payload for creating a contract type.
  - `name` string, required: Contract type name
  - `description` string, nullable: Optional description
  - `fields` object[]: Optional custom fields to create with the contract type
    - `name` string, required
    - `fieldKey` string, required
    - `description` string
    - `placeholder` string
    - `fieldType` 'text' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'select' | 'multi_select', required
    - `required` boolean
    - `config` object: Type-specific settings: select and multi_select need options (string array); number may set min, max and decimalPlaces.
    - `options` string[]
    - `defaultValue` union
      - string
      - number
      - boolean
      - union[]
        - union
          - string
          - number
          - boolean
          - unknown[]
            - unknown
          - object
      - object

## Response `200`

Contract type created.

- object
  - `contractType` object, required: Contract type stored in Contracko
    - `id` string, uuid, required
    - `name` string, required
    - `description` string, nullable, required
    - `organisationId` string, required
    - `isDefault` boolean, required
    - `source` 'manual' | 'template_adoption' | 'starting_template' | 'ai_generated', required
    - `sourceTemplateId` string, uuid, nullable, required
    - `sourceTemplateSlug` string, nullable, required
    - `entityStatus` 'pending-review' | 'archived', nullable, required: Read-only review state. AI-created types can be pending-review; any update clears it to null.
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `fields` object[], required: Custom fields of this contract type
      - `id` string, uuid, required
      - `name` string, required
      - `fieldKey` string, required
      - `description` string, nullable, required
      - `placeholder` string, nullable, required
      - `fieldType` 'text' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'select' | 'multi_select', required
      - `required` boolean, required
      - `config` union, required
        - string
        - number
        - boolean
        - object
        - unknown[]
          - unknown
      - `defaultValue` union, required
        - string
        - number
        - boolean
        - object
        - unknown[]
          - unknown
      - `displayOrder` integer, required
      - `categoryId` string, uuid, required
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required

## Other responses

- `400`: Request validation failed (payload, query, or path format is invalid).
- `401`: Authentication failed (missing, invalid, revoked, or expired API key).
- `403`: Access denied because the API key does not include the required access for this operation.
- `409`: A previous request with the same idempotency key is still being processed.
- `422`: Request is well-formed but contains values the API cannot process.
- `429`: Retry later because the request rate limit was reached.
- `500`: The server could not complete the request.

---

[API](https://skmtc.dev/contracko/apis/contracko-parsing-api.md) · [All operations](https://skmtc.dev/contracko/apis/contracko-parsing-api/llms.txt) · [OpenAPI document](https://skmtc.dev/contracko/apis/contracko-parsing-api/revisions/2f90b1d3cafd?raw)
