# Search Packages

> `POST /packages/search` · Packages and datasets

Canonical page: https://clawifi.dev/docs/api/post-packages-search

`POST https://api.clawifi.dev/packages/search` · 1 credit(s) per call

- Send your key as `Authorization: Bearer $CLAWIFI_API_KEY`; see [Authentication](https://clawifi.dev/docs/authentication).
- Add `"dry_run": true` (or `?dry_run=true`) to see what the call would cost; nothing runs and nothing is charged.
- Credits: 1 per call (search, plain fetch/scrape, article extract, package/dataset/code/archive/academic lookup, single OSINT lookup, social reads). Every price is on [Pricing and credits](https://clawifi.dev/docs/pricing-and-credits).

## Request

**cURL**

```sh
curl -X POST https://api.clawifi.dev/packages/search \
  -H "Authorization: Bearer $CLAWIFI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"what is the Model Context Protocol"}'
```

**Python**

```python
from clawifi import Clawifi

client = Clawifi()  # reads CLAWIFI_API_KEY
result = client.post("/packages/search", json={"query":"what is the Model Context Protocol"})
```

### Body

| Field | Type | Default | Required |
| --- | --- | --- | --- |
| `ecosystems` | array of "pypi" \| "npm" \| "crates" \| "maven" \| "nuget" \| "rubygems" \| "packagist" \| "pub" |  | no |
| `max_results_per_ecosystem` | integer | `5` | no |
| `query` | string |  | yes |

## Response

200 with a `PackageSearchResponse` object: `ecosystems`, `errors`, `paid_providers_used`, `query`, `result_count`, `results`, `searched_count`, `success`.

Errors use the shared shape; see [Errors](https://clawifi.dev/docs/errors). Try public operations without a key in the [playground](https://clawifi.dev/playground).
