Create a project

OpenAPI contract

Method
POST
Path
/api/v1/projects
Security
jwtBearer (bearer) OR automationKey (bearer)
Response status
201 400 401 403 404 409 429 500
Request and response schemas
JSON
{
  "requestBody": {
    "application/json": {
      "$ref": "#/components/schemas/CreateProjectRequest"
    }
  },
  "responses": {
    "201": {
      "description": "Project created",
      "content": {
        "application/json": {
          "$ref": "#/components/schemas/ProjectResponse"
        }
      }
    },
    "400": {
      "description": "Invalid request",
      "content": {
        "application/json": {
          "$ref": "#/components/schemas/RequestError"
        }
      }
    },
    "401": {
      "description": "Authentication required or invalid",
      "content": {
        "application/json": {
          "$ref": "#/components/schemas/SecurityError"
        }
      }
    },
    "403": {
      "description": "Authenticated but not permitted",
      "content": {
        "application/json": {
          "$ref": "#/components/schemas/SecurityError"
        }
      }
    },
    "404": {
      "description": "Requested project or build was not found",
      "content": {
        "application/json": {
          "$ref": "#/components/schemas/ApiError"
        }
      }
    },
    "409": {
      "description": "Request conflicts with current project state",
      "content": {
        "application/json": {
          "$ref": "#/components/schemas/ApiError"
        }
      }
    },
    "429": {
      "description": "HTTP rate limit or API-key NCU usage limit exceeded",
      "content": {
        "application/json": {
          "$ref": "#/components/schemas/RateLimitError"
        }
      }
    },
    "500": {
      "description": "Unexpected server error",
      "content": {
        "application/json": {
          "$ref": "#/components/schemas/ApiError"
        }
      }
    }
  }
}

POST /api/v1/projects accepts a JWT or an nfy_ key with project:write. Omit the workspaceId query parameter to use the caller's default workspace, or select a workspace where the caller has project:create. Archived workspaces reject creation. The new project starts as RESTRICTED, and the creator receives a direct ADMIN grant.

name is required, nonblank, at most 100 characters, and unique within the workspace ignoring case. description is optional (500 characters). defaultPlatforms and defaultFeatures are optional comma-separated strings (200 and 4096 characters respectively) saved for later project builds; they do not submit or validate a build at creation time.

defaultModuleConfiguration stores the full backend-aware configuration, including target, LTO, NOL declarations and Structural settings. It is validated and normalized by the same configuration resolver used for builds. Use this field to save the complete configuration; a draft in the NOL dialog or analysis assistant does not save project defaults automatically. Keep 64-bit Structural seeds as decimal strings.

When both formats are supplied, explicit defaultModuleConfiguration is authoritative and updates the legacy fields to match. A later update that supplies only defaultPlatforms or defaultFeatures applies those changes to the stored configuration while preserving the backend and unrelated NOL declarations and Structural options.

http
POST /api/v1/projects
Authorization: Bearer <access token>
Content-Type: application/json

{"name":"release","defaultPlatforms":"linux-x86_64","defaultFeatures":"native-llvm-direct-call"}