---
title: "Create Multiple Contracts"
method: POST
path: "/license-manager/contracts/bulk"
tags: ["License Manager Public"]
---

# Create Multiple Contracts

`POST /license-manager/contracts/bulk`

Create multiple contracts in a single request, supporting up to 1,000 contracts at a time. The response returns the new contract IDs in the same order you sent them. To ensure consistency, contracts are created as a single unit. If one fails, the entire request is rolled back.

## Request body

- LicenseManagerBulkCreateContractsRequest — Request body for creating multiple contracts in a single call. The `dateFormat` field specifies the format for all date values. Maximum 1,000 contracts per request. Request body limit is approximately 1 MiB — use compact JSON (no pretty-printing). Unknown top-level fields are rejected with a 400 error.
  - `dateFormat` 'MM/DD/YYYY' | 'DD/MM/YYYY' | 'YYYY-MM-DD', required — The date format used for all date values (startDate, endDate) in this request. All contracts in a single request must use the same format.
  - `contracts` LicenseManagerBulkCreateContractItem[], required — Contract items to create. Each item is a contract object.
    - `name` string, required — The display name of the contract (1–255 characters).
    - `application` string, nullable — The display name of the application to link to this contract (1–255 characters if provided). The system resolves the name to an existing application (case-insensitive match). If no match is found, a new application is automatically created and linked.
    - `status` string, required — The current status of the contract. Allowed values are "active" (currently in effect), "closed" (expired or terminated), and "pipeline" (planned but not yet active).
    - `type` string, nullable — The type of software deployment for this contract. Allowed values are "saas" (cloud-based software), "on-prem" (on-premises software), "hybrid" (combination of cloud and on-premises), and "other".
    - `category` string, nullable — The application's business category. Allowed values: operations, sales-and-marketing, developer-tools, design, project-management, customer-success, human-resources, it-and-security, finance, productivity, analytics-and-bi, other.
    - `startDate` string, nullable — The start date of the contract, in the format specified by the top-level `dateFormat` field.
    - `endDate` string, nullable — The end date of the contract, in the format specified by the top-level `dateFormat` field.
    - `paymentTerm` string, nullable — The billing frequency for this contract. Allowed values are "annual", "monthly", "multiyear", "quarterly", "one-time", and "free".
    - `contractValue` number, nullable — The total monetary value of the contract in the specified currency.
    - `currency` string — ISO 4217 currency code for cost fields. Allowed values: USD, EUR, GBP, CAD, CHF, SEK, NOK, DKK, MXN, PLN, BRL, ILS, AUD, NZD, ZAR, GHS, TTD.
    - `licensesCount` integer, nullable — The number of licenses included in this contract.
    - `autoRenewal` boolean — Indicates whether the contract renews automatically when it reaches its end date. The default is "false" - doesn't renew automatically.
    - `cancellationNotice` integer, nullable — The number of days before the end date for the cancellation notice. The `cancellationDeadline` is calculated as `endDate` minus this value.
    - `owner` string, nullable — The contract owner as free-text (e.g., name or email). Up to 36 characters.
    - `notes` string, nullable — Free-text notes or comments about the contract.

## Response `201`

Contracts are successfully created.

- LicenseManagerBulkCreateContractsResponse — Response after successfully creating multiple contracts. The `ids` array is positionally ordered — `ids[0]` corresponds to `contracts[0]` in the request.
  - `ids` string[], required — The unique identifiers of the newly created contracts (CUID format), in the same order as the input.

## Other responses

- `400` — The request was invalid or cannot be served
- `401` — Authentication information is missing or invalid
- `403` — The server understood the request but refuses to authorize it
- `500` — An unexpected error occurred on the server

---

[API](https://skmtc.net/sysaid/apis/sysaid-public-api.md) · [All operations](https://skmtc.net/sysaid/apis/sysaid-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/sysaid/sysaid-public-api/revisions/38a43a1b2981/schema)
