> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nomiq.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Projects API: Create, Retrieve, List, and Delete Projects

> Manage Nomiq project containers via REST. Create, retrieve, list, and delete the top-level objects that house all brand generation assets.

Projects are the foundational containers in Nomiq — every brand asset, Memory Node, and exported style guideline belongs to exactly one Project. Before you can dispatch a generation job, you must have a valid `project_id`. This page covers all four Project endpoints: creating a new Project, retrieving one by ID, listing all Projects with cursor-based pagination, and permanently deleting a Project.

## Create a Project

`POST https://api.nomiq.com/v1/projects`

Creates a new, empty Project container and returns the full Project object. The `name` field is required; `description` is an optional internal note visible in the Nomiq Dashboard. All requests must carry your API key in the `Authorization` header.

### Request Body

<ParamField body="name" type="string" required>
  The human-readable name for the project (e.g., `"Acme Corp Rebrand"`). Used as a display label in the Nomiq Dashboard and returned on all Project objects.
</ParamField>

<ParamField body="description" type="string">
  An optional internal note about the project. Maximum 500 characters. Useful for recording client context or campaign scope.
</ParamField>

### Example Request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.nomiq.com/v1/projects" \
    -H "Authorization: Bearer sk_live_xxx" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Acme Corp Rebrand",
      "description": "Enterprise software client — Q3 rebrand initiative."
    }'
  ```

  ```javascript Node.js theme={null}
  const response = await fetch("https://api.nomiq.com/v1/projects", {
    method: "POST",
    headers: {
      "Authorization": "Bearer sk_live_xxx",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      name: "Acme Corp Rebrand",
      description: "Enterprise software client — Q3 rebrand initiative.",
    }),
  });

  const project = await response.json();
  console.log(project.id); // "proj_1A2b3C4d5E"
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://api.nomiq.com/v1/projects",
      headers={
          "Authorization": "Bearer sk_live_xxx",
          "Content-Type": "application/json",
      },
      json={
          "name": "Acme Corp Rebrand",
          "description": "Enterprise software client — Q3 rebrand initiative.",
      },
  )

  project = response.json()
  print(project["id"])  # "proj_1A2b3C4d5E"
  ```
</CodeGroup>

### Response

```json theme={null}
{
  "id": "proj_1A2b3C4d5E",
  "object": "project",
  "name": "Acme Corp Rebrand",
  "description": "Enterprise software client — Q3 rebrand initiative.",
  "created_at": 1677649420
}
```

### Response Fields

<ResponseField name="id" type="string">
  The unique identifier for this project (prefix `proj_`). Pass this as `project_id` in Generation API requests.
</ResponseField>

<ResponseField name="object" type="string">
  Always `"project"`. Identifies the type of object returned.
</ResponseField>

<ResponseField name="name" type="string">
  The human-readable name you provided at creation time.
</ResponseField>

<ResponseField name="description" type="string">
  The optional internal note, or `null` if none was provided.
</ResponseField>

<ResponseField name="created_at" type="integer">
  Unix timestamp (seconds) recording when the project was created.
</ResponseField>

***

## Retrieve a Project

`GET https://api.nomiq.com/v1/projects/{project_id}`

Fetches the full details of a single existing Project by its unique identifier. Returns a Project object if the ID is valid, or a `404` error if no matching project is found in your workspace.

### Path Parameters

<ParamField path="project_id" type="string" required>
  The unique identifier of the project to retrieve (e.g., `proj_1A2b3C4d5E`).
</ParamField>

### Example Request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://api.nomiq.com/v1/projects/proj_1A2b3C4d5E" \
    -H "Authorization: Bearer sk_live_xxx"
  ```

  ```javascript Node.js theme={null}
  const response = await fetch(
    "https://api.nomiq.com/v1/projects/proj_1A2b3C4d5E",
    {
      headers: {
        Authorization: "Bearer sk_live_xxx",
      },
    }
  );

  const project = await response.json();
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://api.nomiq.com/v1/projects/proj_1A2b3C4d5E",
      headers={"Authorization": "Bearer sk_live_xxx"},
  )

  project = response.json()
  ```
</CodeGroup>

### Response

```json theme={null}
{
  "id": "proj_1A2b3C4d5E",
  "object": "project",
  "name": "Acme Corp Rebrand",
  "description": "Enterprise software client — Q3 rebrand initiative.",
  "created_at": 1677649420
}
```

***

## List Projects

`GET https://api.nomiq.com/v1/projects`

Returns a paginated list of all Projects in your workspace, sorted by creation date with the most recent first. Nomiq uses cursor-based pagination — to retrieve subsequent pages, pass the `next_cursor` value from the previous response as the `starting_after` query parameter.

### Query Parameters

<ParamField query="limit" type="integer">
  The maximum number of projects to return in this page. Defaults to `10`. Maximum value is `100`.
</ParamField>

<ParamField query="starting_after" type="string">
  A project ID cursor. When provided, the API returns the page of results immediately following the project with this ID. Obtain this value from `next_cursor` in a previous list response.
</ParamField>

### Example Request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://api.nomiq.com/v1/projects?limit=2" \
    -H "Authorization: Bearer sk_live_xxx"
  ```

  ```javascript Node.js theme={null}
  const response = await fetch(
    "https://api.nomiq.com/v1/projects?limit=2",
    {
      headers: {
        Authorization: "Bearer sk_live_xxx",
      },
    }
  );

  const page = await response.json();

  // Fetch the next page if available
  if (page.has_more) {
    const nextPage = await fetch(
      `https://api.nomiq.com/v1/projects?limit=2&starting_after=${page.next_cursor}`,
      { headers: { Authorization: "Bearer sk_live_xxx" } }
    );
  }
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://api.nomiq.com/v1/projects",
      headers={"Authorization": "Bearer sk_live_xxx"},
      params={"limit": 2},
  )

  page = response.json()

  # Fetch the next page if available
  if page["has_more"]:
      next_response = requests.get(
          "https://api.nomiq.com/v1/projects",
          headers={"Authorization": "Bearer sk_live_xxx"},
          params={"limit": 2, "starting_after": page["next_cursor"]},
      )
  ```
</CodeGroup>

### Response

```json theme={null}
{
  "object": "list",
  "data": [
    {
      "id": "proj_7F8g9H0i1J",
      "object": "project",
      "name": "Brewer & Lane Identity",
      "description": "Artisan bakery client — brand launch.",
      "created_at": 1677821600
    },
    {
      "id": "proj_1A2b3C4d5E",
      "object": "project",
      "name": "Acme Corp Rebrand",
      "description": "Enterprise software client — Q3 rebrand initiative.",
      "created_at": 1677649420
    }
  ],
  "has_more": true,
  "next_cursor": "proj_1A2b3C4d5E"
}
```

### Response Fields

<ResponseField name="object" type="string">
  Always `"list"`.
</ResponseField>

<ResponseField name="data" type="array">
  An array of Project objects for this page.
</ResponseField>

<ResponseField name="has_more" type="boolean">
  `true` if additional pages exist beyond this one. Use `next_cursor` to fetch the next page.
</ResponseField>

<ResponseField name="next_cursor" type="string">
  The ID of the last item on this page. Pass this as `starting_after` to retrieve the following page. `null` when `has_more` is `false`.
</ResponseField>

***

## Delete a Project

`DELETE https://api.nomiq.com/v1/projects/{project_id}`

Permanently removes a Project and all of its associated data from your workspace. A successful deletion returns an HTTP `200` with a confirmation object.

<Warning>
  Deletion is **permanent and irreversible**. All generation jobs, brand assets, Memory Nodes, and exported style guidelines belonging to this project are immediately and unrecoverably expunged from the database. There is no soft-delete or recovery path. Ensure you have exported any assets you need before calling this endpoint.
</Warning>

### Path Parameters

<ParamField path="project_id" type="string" required>
  The unique identifier of the project to permanently delete (e.g., `proj_1A2b3C4d5E`).
</ParamField>

### Example Request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X DELETE "https://api.nomiq.com/v1/projects/proj_1A2b3C4d5E" \
    -H "Authorization: Bearer sk_live_xxx"
  ```

  ```javascript Node.js theme={null}
  const response = await fetch(
    "https://api.nomiq.com/v1/projects/proj_1A2b3C4d5E",
    {
      method: "DELETE",
      headers: {
        Authorization: "Bearer sk_live_xxx",
      },
    }
  );

  const result = await response.json();
  console.log(result.deleted); // true
  ```

  ```python Python theme={null}
  import requests

  response = requests.delete(
      "https://api.nomiq.com/v1/projects/proj_1A2b3C4d5E",
      headers={"Authorization": "Bearer sk_live_xxx"},
  )

  result = response.json()
  print(result["deleted"])  # True
  ```
</CodeGroup>

### Response

```json theme={null}
{
  "id": "proj_1A2b3C4d5E",
  "object": "project",
  "deleted": true
}
```

***

## Next Steps

With a `project_id` in hand, you can dispatch brand generation jobs to the AI Engine.

<CardGroup cols={2}>
  <Card title="Generation API" icon="bolt" href="/api-reference/generation">
    Dispatch asynchronous AI brand generation jobs using your project ID and a semantic prompt.
  </Card>

  <Card title="Memory API" icon="brain" href="/api-reference/memory">
    Learn how Memory Nodes let you iterate on previous generations without starting from scratch.
  </Card>
</CardGroup>
