> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.getunleash.io/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)

- `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 object, 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.
  - `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.
- `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 object, optional) — The list of environments that have change requests enabled.
  - `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": "<apiKey>",
    "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: '<apiKey>', '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", "<apiKey>")
	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"] = '<apiKey>'
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<String> response = Unirest.post("https://app.unleash-instance.example.com/api/admin/projects")
  .header("Authorization", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"name\": \"Pet shop\"\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://app.unleash-instance.example.com/api/admin/projects', [
  'body' => '{
  "name": "Pet shop"
}',
  'headers' => [
    'Authorization' => '<apiKey>',
    '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", "<apiKey>");
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": "<apiKey>",
  "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()
```