> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.getunleash.io/api/create-project/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.getunleash.io/_mcp/server. # Create project POST https://app.unleash-instance.example.com/api/admin/projects Content-Type: application/json **Enterprise feature** Create a new [Unleash project](https://docs.getunleash.io/concepts/projects). Reference: https://docs.getunleash.io/api/create-project ## Authentication - `Authorization` header (required) — API key needed to access this API - `Authorization` header (bearer token, required) — API key needed to access this API, in Bearer token format ## Request ### Body (application/json) This endpoint expects a createProjectSchema. - `name` (string, required) — The project's name. The name must contain at least one non-whitespace character. - `description` (string, optional, nullable) — The project's description. - `mode` (enum, optional, default: open) — A mode of the project affecting what actions are possible in this project - Allowed values: `open`, `protected`, `private` - `defaultStickiness` (string, optional, default: default) — A default stickiness for the project affecting the default stickiness value for variants and Gradual Rollout strategy - `environments` (list of string, optional) — A list of environments that should be enabled for this project. If this property is missing, Unleash will default to enabling all non-deprecated environments for the project. An empty list will result in no environment enabled for the project. - `changeRequestEnvironments` (list of CreateProjectSchemaChangeRequestEnvironmentsItems, optional) — A list of environments that should have change requests enabled. If the list includes environments not in the `environments` list, they will still have change requests enabled. - `id` (string, optional, deprecated) — The project's identifier. If this property is not present or is an empty string, Unleash will generate the project id automatically. This property is deprecated. ## Response ### 201 The resource was successfully created. - `id` (string, required) — The project's identifier. - `name` (string, required) — The project's name. - `description` (string, optional, nullable) — The project's description. - `featureLimit` (integer, optional, nullable) — A limit on the number of features allowed in the project. `null` if no limit. - `mode` (enum, optional) — A mode of the project affecting what actions are possible in this project - Allowed values: `open`, `protected`, `private` - `defaultStickiness` (string, optional) — A default stickiness for the project affecting the default stickiness value for variants and Gradual Rollout strategy - `environments` (list of string, optional) — The environments enabled for the project. - `changeRequestEnvironments` (list of ProjectCreatedSchemaChangeRequestEnvironmentsItems, optional) — The list of environments that have change requests enabled. ## Errors ### 400 Bad Request Error The request data does not match what we expect. - `id` (string, optional) — The ID of the error instance - `name` (string, optional) — The name of the error kind - `message` (string, optional) — A description of what went wrong. ### 401 Unauthorized Error Authorization information is missing or invalid. Provide a valid API token as the `authorization` header, e.g. `authorization:*.*.my-admin-token`. - `id` (string, optional) — The ID of the error instance - `name` (string, optional) — The name of the error kind - `message` (string, optional) — A description of what went wrong. ### 403 Forbidden Error The provided user credentials are valid, but the user does not have the necessary permissions to perform this operation - `id` (string, optional) — The ID of the error instance - `name` (string, optional) — The name of the error kind - `message` (string, optional) — A description of what went wrong. ### 415 Unsupported Media Type Error The operation does not support request payloads of the provided type. Please ensure that you're using one of the listed payload types and that you have specified the right content type in the "content-type" header. - `id` (string, optional) — The ID of the error instance - `name` (string, optional) — The name of the error kind - `message` (string, optional) — A description of what went wrong. ## Types ### CreateProjectSchemaChangeRequestEnvironmentsItems - `name` (string, required) — The name of the environment to configure change requests for. - `requiredApprovals` (integer, optional, default: 1) — The number of approvals required for a change request to be fully approved and ready to applied in this environment. If no value is provided, it will be set to the default number, which is 1. Values will be clamped to between 1 and 10 inclusive. ### ProjectCreatedSchemaChangeRequestEnvironmentsItems - `name` (string, required) — The name of the environment this change request configuration applies to. - `requiredApprovals` (integer, required, default: 1) — The number of approvals required for a change request to be fully approved and ready to applied in this environment. If no value is provided, it will be set to the default number, which is 1. The value must be greater than or equal to 1. ## Examples **Request** ```json { "name": "Pet shop" } ``` **Response** ```json { "id": "pet-shop", "name": "Pet shop", "description": "This project contains features related to the new pet shop.", "featureLimit": 100, "mode": "open", "defaultStickiness": "userId", "environments": [ "production", "staging" ], "changeRequestEnvironments": [ { "name": "production", "requiredApprovals": 3 } ] } ``` **SDK Code** ```python import requests url = "https://app.unleash-instance.example.com/api/admin/projects" payload = { "name": "Pet shop" } headers = { "Authorization": "", "Content-Type": "application/json" } response = requests.post(url, json=payload, headers=headers) print(response.json()) ``` ```javascript const url = 'https://app.unleash-instance.example.com/api/admin/projects'; const options = { method: 'POST', headers: {Authorization: '', 'Content-Type': 'application/json'}, body: '{"name":"Pet shop"}' }; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "strings" "net/http" "io" ) func main() { url := "https://app.unleash-instance.example.com/api/admin/projects" payload := strings.NewReader("{\n \"name\": \"Pet shop\"\n}") req, _ := http.NewRequest("POST", url, payload) req.Header.Add("Authorization", "") req.Header.Add("Content-Type", "application/json") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://app.unleash-instance.example.com/api/admin/projects") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Post.new(url) request["Authorization"] = '' request["Content-Type"] = 'application/json' request.body = "{\n \"name\": \"Pet shop\"\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.post("https://app.unleash-instance.example.com/api/admin/projects") .header("Authorization", "") .header("Content-Type", "application/json") .body("{\n \"name\": \"Pet shop\"\n}") .asString(); ``` ```php request('POST', 'https://app.unleash-instance.example.com/api/admin/projects', [ 'body' => '{ "name": "Pet shop" }', 'headers' => [ 'Authorization' => '', 'Content-Type' => 'application/json', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://app.unleash-instance.example.com/api/admin/projects"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", ""); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"name\": \"Pet shop\"\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "", "Content-Type": "application/json" ] let parameters = ["name": "Pet shop"] as [String : Any] let postData = JSONSerialization.data(withJSONObject: parameters, options: []) let request = NSMutableURLRequest(url: NSURL(string: "https://app.unleash-instance.example.com/api/admin/projects")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "POST" request.allHTTPHeaderFields = headers request.httpBody = postData as Data let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ```