# The HTTP API

> The Prompt Verse HTTP API: an API key under Connect, the same library as MCP, and model routes that answer AI_DISABLED in the pre-beta.

Source: https://prompt-verse.io/docs/the-http-api/

Prompt Verse has a small HTTP API for callers that do not speak MCP. It uses the same nouns as the tools on [Use with your AI](/docs/use-with-your-ai/). There is no client library. You call it directly.

The app lists the current routes under **Connect**, in **Advanced**. That list is the one to trust if a path here and the app ever disagree.

## A key

1. Open **Connect** and make a key under **Keys**. It is shown once. Copy it then.
2. Send it as a bearer token: `Authorization: Bearer <key>`. The header `x-api-key` is accepted as well.
3. Name the key after the client that uses it, and revoke it in the app when you stop using that client.

> [!WARNING]
> Never paste a key into a chat. A key belongs in the configuration of a client that cannot sign in.

Every call with a key acts in your own workspace, after a plan check. Without a Prompt Verse plan the answer is `PLAN_REQUIRED`. Open the app once so the workspace exists before the first call.

Reading the marketplace (`GET /api/listings`) does not need a key. Everything else does.

## What you can call

Paths below are on your Prompt Verse address. A few you will use first:

| Call | What it does |
|---|---|
| `GET /api/prompts?kind=` | Your prompts, responses and contexts |
| `POST /api/prompts` | Create one. Body includes `kind` and `title` |
| `GET /api/prompts/:id` | One document, with its tree and wrappers |
| `PATCH /api/prompts/:id` | Change one you own |
| `POST /api/prompts/:id/share` | Mint or revoke a link. Body: `{ "visibility": "unlisted" }` |
| `GET /api/search?q=&limit=` | Everything you own, by title, tag or text |
| `GET /api/skills` and `POST /api/skills` | List or create a skill |
| `GET /api/tools` and `POST /api/tools` | List or create an MCP tool you author |
| `POST /api/tools/:name/call` | Call one of your tools by name. Body: `{ "input": {} }` |
| `GET /api/elements?type=` | Library pieces |
| `GET /api/agents` and `GET /api/workflows` | Agents and workflows you own |
| `GET /api/evals` | Your evals |
| `GET /api/vcs/:entity_type/:entity_id/commits` | History. The same family has branch, checkout, merge and tag |

`entity_type` on the version routes is `prompt`, `workflow` or `agent`, as in [Versions, branches and merges](/docs/versions/).

Rendering a prompt into finished text, with variables filled, is an MCP call: `prompts` with action `render`. The HTTP API returns the stored document on `GET /api/prompts/:id`.

## What answers AI_DISABLED

> [!HONEST]
> In the pre-beta your own AI does the running. Routes that would run a model answer `AI_DISABLED`. That includes `POST /api/prompts/:id/run`, `POST /api/agents/:id/run`, `POST /api/workflows/:id/run`, `POST /api/evals/:id/run`, `POST /api/listings/:slug/run` and `GET /api/models`.

Read the prompt with `GET /api/prompts/:id`, or render it over MCP, and let your own AI answer it. To test, your AI reads the cases and scores them. See [Testing with evals](/docs/testing-with-evals/).

Publishing, installing and withdrawing on the marketplace follow [The marketplace](/docs/marketplace/). Paid checkout is mocked until payments open, so nothing is charged.
