> ## Documentation Index
> Fetch the complete documentation index at: https://nevermined.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Discovering services

> Browse the Catalog in the app or query it over a public read API — then pay for what you find through the Router.

The Catalog is discoverable two ways: a human browses it in the app, and an agent reads it over a **public, unauthenticated** API. Both surface the same curated set of Router-payable services.

## Browse in the app

Open [nevermined.app/catalog](https://nevermined.app/catalog/) to explore listings visually:

* **Categories** — filter by top-level category and sub-category (Search & Research, Crypto & Blockchain, AI & Media, and more).
* **Search** — free-text over a service's title and description.
* **Service detail** — each listing has a page with its description, protocol, indicative price, callable endpoints, tags, and links to the provider's homepage and docs.

The app is a browsing surface. To actually *buy*, an agent drives the [Router](/docs/products/catalog/router/quickstart) — the same directory, read programmatically.

## Query the read API

The Catalog read API is **public, unauthenticated, read-only, and cached for five minutes**. Send no `Authorization` header — none is required.

Base URL is the environment API host: `https://api.sandbox.nevermined.app` or `https://api.live.nevermined.app`.

### List services

```bash theme={null}
curl -s "https://api.sandbox.nevermined.app/api/v1/catalog/services?category=Search%20%26%20Research&protocol=x402"
```

| Param                  | Notes                                                                   |
| ---------------------- | ----------------------------------------------------------------------- |
| `search`               | Free-text over **title and description only**                           |
| `category`             | One of the curated categories — an unknown value is rejected with `400` |
| `subCategory`          | Granular label under a category; discover values from `/categories`     |
| `protocol`             | `x402` or `mpp` for payable services                                    |
| `tag`                  | Exact match against one entry of `tags[]`                               |
| `page`                 | Page number, ≥ 1 (default 1)                                            |
| `offset`               | Page **size**, not a skip count (default 20, capped at 100)             |
| `sortBy` / `sortOrder` | Omit for the curated default ordering                                   |

The response is a page of services plus the total matching your filters:

```json theme={null}
{ "total": 9, "page": 1, "offset": 20, "services": [ /* … */ ] }
```

<Note>
  **`offset` is the page size, not a SQL offset.** To walk the whole catalog, hold `offset` fixed and increment `page`. And the default ordering is intentionally not stable — services rotate within their curation tier — so never assume `services[0]` is the same service across two calls.
</Note>

The fields you'll actually use on each service:

| Field                      | Use                                                                                 |
| -------------------------- | ----------------------------------------------------------------------------------- |
| `slug`                     | Stable, case-sensitive id — use it for the per-slug lookup                          |
| `protocol`                 | `x402` or `mpp` — payable through the Router                                        |
| `targetUrl`                | The default endpoint's complete URL                                                 |
| `endpoints[]`              | Other callable paths, each with `priceLabel` and `docsUrl`                          |
| `priceLabel`               | Human string like `"$0.001"` — **indicative only**; the wire price governs          |
| `category` / `subCategory` | Curated category and its granular label                                             |
| `discovery`                | Machine-readable pointers (x402 manifest, MCP, A2A agent card, OpenAPI, `llms.txt`) |

### List categories

```bash theme={null}
curl -s "https://api.sandbox.nevermined.app/api/v1/catalog/categories"
```

Returns each category with a count of listed services in it. It enumerates what is **populated**, not the full legal set — prefer it over hard-coding category names.

### Get one service

```bash theme={null}
curl -s "https://api.sandbox.nevermined.app/api/v1/catalog/services/<slug>"
```

Returns the full service by its `slug`, or `404 BCK.CATALOG.0001` if no listed service matches (the lookup is case-sensitive).

### The agent-readable feed

```
GET /.well-known/agent-services-catalog.json
```

A single [Agentic Resource Discovery](/docs/integrate/authentication/for-agents) document listing every service with its Router pay-through target and discovery pointers — the machine-readable twin of the browse experience.

<Tip>
  The full machine-facing discovery contract — every filter's validation edge, the `discovery` pointer shapes, and the catalog error codes — ships in the **[Router AI coding skill](/docs/development-guide/build-using-nvm-skill)** (`nevermined-router`), so your assistant already knows how to walk the Catalog.
</Tip>

## What "listed" means

The Catalog only lists services the Router can actually pay — those that price each request on the wire (**x402** and **MPP**). Services that bill out of band aren't listed, so a browsing agent is never handed one it can't buy. More on the Catalog's contents in [AI Services](/docs/products/catalog/ai-services#what-gets-listed).

## From discovery to a paid call

Once you've picked a service, buying it is the Router flow:

<Steps>
  <Step title="Read its targetUrl and protocol">
    Straight off the catalog listing. You don't need to know x402 from MPP — the Router probes the service and detects the protocol from its `402`.
  </Step>

  <Step title="Get an API key, a Delegation, and funds">
    A one-time setup — see the [Router quickstart](/docs/products/catalog/router/quickstart).
  </Step>

  <Step title="Route the call">
    Hand the Router the request. It pays the `402` from your wallet, enforces your cap, and relays the answer.
  </Step>
</Steps>

<Card title="Router quickstart" icon="rocket" href="/docs/products/catalog/router/quickstart">
  From an API key to a paid call against a service you found here, in five steps.
</Card>

## Publish your own service

Listing a service **you** own — and the health validation it passes before it goes live — is covered in [AI Services → Add your AI Service](/docs/products/catalog/ai-services#add-your-ai-service).


## Related topics

- [AI Services](/docs/products/catalog/ai-services.md)
- [Catalog Overview](/docs/products/catalog/overview.md)
- [AI Coding Skill](/docs/development-guide/build-using-nvm-skill.md)
- [API Versioning](/docs/development-guide/api-versioning.md)
- [Payments & Balance](/docs/api-reference/typescript/payments-and-balance.md)
