# POST /v1/prompt

> The system prompt for some packs, for an agent that runs its own model.

The same text the web SDK's core.prompt(packs) gives. Not counted.

## Keys

Your MorphScreen key in `X-MorphScreen-Key`: it isn't counted.

## Example

MorphScreen's system prompt for some packs, for an agent that runs its own model:
```bash
curl https://api.morphscreen.com/v1/prompt \
  -H "X-MorphScreen-Key: $MORPHSCREEN_KEY" \
  -H "Content-Type: application/json" \
  -d '{"packs": ["data"]}'
```

It answers `{"prompt": "..."}`, the text the web SDK's `core.prompt(packs)` gives. Send it as your model's first system message ([The system prompt](/docs/format/system-prompt)). It isn't counted as a call or a render.

## Request

### PromptRequest

The packs the answers may use (every pack when left out) and the app's own components.

| Field | Type | Required | What it is |
|---|---|---|---|
| `packs` | list of string |  |  |
| `components` | list of object |  |  |

## Responses

| Status | What comes back |
|---|---|
| 200 | The prompt. |
| 400 | The request can't be run as written: invalid_json, invalid_input, invalid_options or invalid_catalog. |
| 401 | No key, or one turned down: your MorphScreen key (morphscreen_key_required, morphscreen_key_invalid) or your OpenRouter key (openrouter_key_required, openrouter_key_invalid). |
| 403 | The account is suspended (account_suspended). |
| 413 | The body is over 1 MB (payload_too_large). |
| 429 | A limit reached, with <span class="nb">Retry-After</span> saying how long to wait: requests a minute (rate_limited). |
| 503 | Accounts can't be read just now; try again. |

Errors come back as `{"error": {"code", "message", "type", "metadata": {"error_type", "reason"}}}`: `type` is the reason to act on (`rate_limited`, `plan_quota_reached`...). [Limits and errors](/docs/production/limits) says what to do about each.
