# Create prompt

URL: https://docs.hanzo.ai/docs/openapi/prompt/post-prompt

> Records a prompt for the caller's org and answers 201 with it.

`POST /v1/prompt`

> [Prompt →](https://docs.hanzo.ai/docs/openapi/prompt) · [All API references →](https://docs.hanzo.ai/docs/openapi) · [Get started →](https://docs.hanzo.ai/docs/guides)

|               |                                        |
| ------------- | -------------------------------------- |
| **Address**   | `https://api.hanzo.ai/v1/prompt`       |
| **Method**    | `POST`                                 |
| **Operation** | `post_prompt`                          |
| **Auth**      | `Authorization: Bearer $HANZO_API_KEY` |

Records a prompt for the caller's org and answers 201 with it. A name the
org already uses is NOT an error and NOT an overwrite: it appends a new version,
so the library keeps real, inspectable history and the response carries the whole
version list. The name is also the URL segment the prompt is fetched by, which is
why its shape is constrained and a handful of names are reserved.

## Request

5 fields, body `application/json` (required).

| Field    | In   | Type      | Required | Description                                                                                                                              |
| -------- | ---- | --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `labels` | body | string\[] | —        | Labels is free-form taxonomy, each up to 64 characters, capped at 32 entries.                                                            |
| `name`   | body | string    | —        | Name is the org-unique handle AND the URL segment the prompt is addressed by: 1-64 characters matching ^\[A-Za-z0-9]\[A-Za-z0-9.\_-]\*$. |
| `prompt` | body | string    | —        | Prompt is the template body, capped at 64 KiB.                                                                                           |
| `tags`   | body | string\[] | —        | Tags is free-form taxonomy under the same bounds as Labels.                                                                              |
| `type`   | body | string    | —        | Type labels the template's kind; defaults to "text".                                                                                     |

## Response

| Status    | Body                | Meaning |
| --------- | ------------------- | ------- |
| `201`     | prompt.promptDetail | created |
| `default` | problem-details     | refused |

`201` body — 12 fields.

| Field                        | In   | Type                  | Always | Description                                                                                                                         |
| ---------------------------- | ---- | --------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------- |
| `createdAt`                  | body | string                | —      | CreatedAt is when version 1 was written, RFC 3339 UTC.                                                                              |
| `labels`                     | body | string\[]             | —      | Labels is the current version's free-form taxonomy.                                                                                 |
| `lastUpdatedAt`              | body | string                | —      | UpdatedAt is when the current version was appended, RFC 3339 UTC.                                                                   |
| `name`                       | body | string                | —      | Name is the prompt's org-unique handle and the URL segment it is addressed by.                                                      |
| `prompt`                     | body | string                | —      | Prompt is the CURRENT version's template body — the only content this service returns.                                              |
| `tags`                       | body | string\[]             | —      | Tags is the second free-form taxonomy, same rules as Labels.                                                                        |
| `type`                       | body | string                | —      | Type labels the current version's kind; "text" unless the creator said otherwise.                                                   |
| `version`                    | body | integer (int64)       | —      | Version is the current version number, starting at 1 and incremented by one on every create against an existing name.               |
| `versionHistory`             | body | prompt.versionView\[] | —      | Versions is the history METADATA, newest first, capped at the last 100 — no bodies, so a long history cannot inflate this response. |
| `versionHistory[].createdAt` | body | string                | —      | CreatedAt is when this revision was appended, RFC 3339 UTC.                                                                         |
| `versionHistory[].type`      | body | string                | —      | Type is the kind this revision was written with, which may differ from the current one.                                             |
| `versionHistory[].version`   | body | integer (int64)       | —      | Version is this revision's number, 1 for the first.                                                                                 |

Failure carries the platform error shape — see [Errors](https://docs.hanzo.ai/docs/errors).

## Examples

**CLI**

```bash
hanzo prompt create
```

**SDK**

**.ts**

```ts
import { Configuration, PromptApi } from 'hanzoai';

const api = new PromptApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postPrompt({ labels: ["<labels>"], name: "<name>" });
```

**.py**

```python
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import PromptApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = PromptApi(client).post_prompt(labels=["<labels>"], name="<name>")
```

**.go**

```go
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.PromptAPI.PostPrompt(context.Background()).Execute()
if err != nil {
	return err
}
```

**.rs**

```rust
use hanzo_client::apis::{configuration::Configuration, prompt_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = prompt_api::post_prompt(&cfg, Default::default()).await?;
```

**.java**

```java
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.PromptApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new PromptApi(client).postPrompt();
```

**HTTP**

```bash
curl -X POST https://api.hanzo.ai/v1/prompt \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "labels": [
         "<labels>"
       ],
       "name": "<name>"
     }'
```

**MCP**

MCP reaches **prompt** through the `prompt` tool, which names its 6 operations with its own verbs — this one among them, under a name only MCP declares. `describe` explains any of them:

```bash
curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_prompts"
         }
       }
     }'
```

---

[Prompt API](https://docs.hanzo.ai/docs/openapi/prompt) · [All Hanzo APIs](https://docs.hanzo.ai/docs/openapi) · [Interactive reference](https://docs.hanzo.ai/docs/openapi/reference)
