# Pricing and editing listings

> Change a live capability's price, wording or schema without changing its id. Also covers what can't change, how to withdraw a capability, and how discovery ranks you.

## See your listings

```bash
curl -s https://api.zanora.dev/v1/capabilities -H "x-api-key: $ZANORA_API_KEY"
# → {"capabilities":[{"capability":{…},"version":{…}}, …]}   deprecated ones included
```

In the console: **Seller → Capabilities**.

## Edit a live listing

`POST /v1/capabilities/:id` takes a **patch**. Send only the fields that change:

```bash
curl -s -X POST https://api.zanora.dev/v1/capabilities/cap_d2383f37… -H "x-api-key: $ZANORA_API_KEY" \
  -H 'content-type: application/json' -d '{"priceMinor":"80","tags":["invoices","receipts"]}'
```

| You can change | Effect |
|---|---|
| `priceMinor`, `currency` | takes effect from the next price quote. Buyers always pay the price in the quote Zanora signs at call time, so repricing is safe at any moment |
| `name`, `description`, `category`, `tags` | updated in discovery. Changing the text discovery searches re-indexes the capability |
| `schema` | publishes a **new version**, because the version hash covers the schema |
| `latencyP50Ms` | your advertised median latency, used in ranking |

In the console, each row in **Seller → Capabilities** has an **Edit** form that sends only what you changed.

With `@zanora/middleware-mcp`, you don't call this route. Change your source and restart, and [`sell()` reconciles](https://docs.zanora.dev/sellers/mcp.md#restarting-reconciles-the-listing) the listing.

### What can't change

The **address**, **protocol** and **tool name** can't be edited. A buyer's saved capability id has to keep pointing at the same thing, so moving any of them is a new capability:

1. Publish the new capability.
2. Deprecate the old one.

A capability that isn't `active` refuses edits.

## Withdraw a capability

```bash
curl -s -X POST https://api.zanora.dev/v1/capabilities/cap_…/deprecate -H "x-api-key: $ZANORA_API_KEY"
```

It disappears from discovery straight away. Existing references still resolve, so a buyer's saved id gets a clear answer rather than a `404`.

## Ranking well in discovery

| Signal | What you control |
|---|---|
| **Verification** | [ask for it](https://docs.zanora.dev/sellers/verification.md). Unverified sellers don't appear at all |
| **Relevance** | write `description` and `tags` in the words a buyer would search for: "extract text from invoices", not "DocuParse v3" |
| **Price** | cheaper ranks higher within a buyer's price filter |
| **Latency** | an honest `latencyP50Ms`. Buyers can filter on `maxLatencyMs` |
| **Reputation** | ratings from buyers who hold a receipt. Serve well, and return `isError` or an error status rather than a bad answer, since a failed call is refunded. Use a 4xx for a bad request, so it isn't counted as your failure |
| **A schema** | publish one. Agents read it before paying, and fewer bad requests means fewer failed calls |
