# project_save

Create or Update Project

## Beschreibung

Linear-style upsert. Pass `id` to update; omit to create. Description accepts Markdown and is converted to Tiptap JSON.

## Zugriff

Zugriffsprofil: `gated`. Module: `projects_tasks`.
Die Freigabe im Profil ersetzt keine Account-, Workspace- oder Rollenberechtigung.

## Parameter

| Name | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `account_id` | string | Ja |  |
| `id` | string | Nein | Project prefix ID (proj_…) or slug. Omit to create. |
| `workspace_id` | string | Nein | Required on create. Prefix or key. |
| `name` | string | Nein |  |
| `summary` | string / null | Nein |  |
| `description_markdown` | string / null | Nein |  |
| `status` | string | Nein |  |
| `priority` | string | Nein |  |
| `icon_emoji` | string / null | Nein | Single unicode emoji glyph (e.g. "🚀"). The common `:shortcode:` aliases (`:rocket:`, `:fire:`, `:white_check_mark:`, …) are also accepted and converted to the matching glyph at save time. Pass an empty string to clear. |
| `color` | string | Nein |  |
| `target_on` | string / null | Nein |  |
| `start_on` | string / null | Nein |  |
| `lead` | string / null | Nein | User prefix or @handle. |

## Eingabeschema

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "account_id": {
      "type": "string"
    },
    "id": {
      "type": "string",
      "description": "Project prefix ID (proj_…) or slug. Omit to create."
    },
    "workspace_id": {
      "type": "string",
      "description": "Required on create. Prefix or key."
    },
    "name": {
      "type": "string"
    },
    "summary": {
      "type": [
        "string",
        "null"
      ]
    },
    "description_markdown": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "type": "string"
    },
    "priority": {
      "type": "string"
    },
    "icon_emoji": {
      "type": [
        "string",
        "null"
      ],
      "description": "Single unicode emoji glyph (e.g. \"🚀\"). The common `:shortcode:` aliases (`:rocket:`, `:fire:`, `:white_check_mark:`, …) are also accepted and converted to the matching glyph at save time. Pass an empty string to clear."
    },
    "color": {
      "type": "string"
    },
    "target_on": {
      "type": [
        "string",
        "null"
      ]
    },
    "start_on": {
      "type": [
        "string",
        "null"
      ]
    },
    "lead": {
      "type": [
        "string",
        "null"
      ],
      "description": "User prefix or @handle."
    }
  },
  "required": [
    "account_id"
  ],
  "type": "object"
}
```

## Ausgabeschema

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "project": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "name"
      ]
    }
  },
  "required": [
    "project"
  ],
  "type": "object"
}
```
