# Marketplace Registry

Source: https://opvs.ai/docs/api/marketplace-registry

## `GET` /api/v1/registry/store-settings

**Get Store Settings**

Public billboard/collection settings from the marketplace service.

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/store-settings' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/store-settings",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/store-settings", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/store-settings", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response

## `GET` /api/v1/registry/packages

**List Packages**

List published packages, enriched with a batched `install_count`.

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/packages' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/packages",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/packages", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response

## `GET` /api/v1/registry/search

**Search Packages**

Semantic search across the registry (W1.10).

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/search' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/search",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/search", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/search", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response

## `GET` /api/v1/registry/packages/{vendor}/{name}

**Get Latest Package**

Latest published version of a package, enriched with `install_count`.

**Parameters**

- `vendor` (path, string, required)
- `name` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## `GET` /api/v1/registry/packages/{vendor}/{name}/versions

**List Package Versions**

Version history for a package.

**Parameters**

- `vendor` (path, string, required)
- `name` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/versions' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/versions",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/versions", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/versions", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## `GET` /api/v1/registry/packages/{vendor}/{name}/used-by

**List Package Used By**

The AI Employee profiles that run this package — the facepile source.

**Parameters**

- `vendor` (path, string, required)
- `name` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/used-by' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/used-by",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/used-by", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/used-by", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## `GET` /api/v1/registry/packages/{vendor}/{name}/download

**Download Skill Bundle**

Download a published skill repackaged for a target AI runtime.

**Parameters**

- `vendor` (path, string, required)
- `name` (path, string, required)
- `target` (query, string, optional)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/download' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/download",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/download", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/download", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## `GET` /api/v1/registry/packages/{vendor}/{name}/skill-guide

**Get Package Skill Guide**

Authenticated read of a published skill's `SKILL.md` body — and, on demand, its `references/`/`registry/` layer files — extracted live from the R2 bundle.

**Parameters**

- `vendor` (path, string, required)
- `name` (path, string, required)
- `path` (query, any, optional)
- `format` (query, any, optional)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/skill-guide' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/skill-guide",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/skill-guide", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/skill-guide", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## `GET` /api/v1/registry/certificates/{fingerprint}

**Get Certificate**

Visibility-aware passthrough for certificate verification material.

**Parameters**

- `fingerprint` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/certificates/{fingerprint}' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/certificates/{fingerprint}",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/certificates/{fingerprint}", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/certificates/{fingerprint}", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## `GET` /api/v1/registry/packages/{vendor}/{name}/reviews

**List Package Reviews**

Public paginated review list — newest-first, hidden rows filtered.

**Parameters**

- `vendor` (path, string, required)
- `name` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/reviews' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/reviews",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/reviews", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/reviews", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## `GET` /api/v1/registry/packages/{vendor}/{name}/{version}/bundle

**Get Package Bundle**

Credentialed raw bundle relay for registered users and service PATs.

**Parameters**

- `vendor` (path, string, required)
- `name` (path, string, required)
- `version` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}/bundle' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}/bundle",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}/bundle", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}/bundle", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## `GET` /api/v1/registry/packages/{vendor}/{name}/{version}

**Get Package Version**

Single version detail (manifest, signature, tier, status).

**Parameters**

- `vendor` (path, string, required)
- `name` (path, string, required)
- `version` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## `GET` /api/v1/registry/packages/{vendor}/{name}/{version}/changelog

**Get Package Changelog**

Return the bundled CHANGELOG for a specific version as text/markdown.

**Parameters**

- `vendor` (path, string, required)
- `name` (path, string, required)
- `version` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}/changelog' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}/changelog",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}/changelog", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}/changelog", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## `GET` /api/v1/registry/manifest

**Dump Manifest**

Bulk manifest dump for the gateway's 60s revocation poll.

```bash
curl -X GET 'https://app.opvs.ai/api/v1/registry/manifest' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/registry/manifest",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/manifest", {
  method: "GET",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/registry/manifest", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response

## `POST` /api/v1/registry/packages/{package_id}/ratings

**Submit Rating**

Upsert a star rating (1-5) for this package from the caller's brand.

**Parameters**

- `package_id` (path, string, required)

**Request body**

```bash
curl -X POST 'https://app.opvs.ai/api/v1/registry/packages/{package_id}/ratings' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "rating": 0
}'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/registry/packages/{package_id}/ratings",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"rating": 0},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{package_id}/ratings", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"rating": 0})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"rating": 0}`)
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/registry/packages/{package_id}/ratings", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `201` — Successful Response
- `422` — Validation Error

## `POST` /api/v1/registry/packages/{package_id}/reviews

**Submit Review**

Submit a prose review for this package.

**Parameters**

- `package_id` (path, string, required)

**Request body**

```bash
curl -X POST 'https://app.opvs.ai/api/v1/registry/packages/{package_id}/reviews' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "title": "string",
  "body": "string",
  "rating": 0
}'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/registry/packages/{package_id}/reviews",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"title": "string", "body": "string", "rating": 0},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{package_id}/reviews", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"title": "string", "body": "string", "rating": 0})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"title": "string", "body": "string", "rating": 0}`)
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/registry/packages/{package_id}/reviews", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `201` — Successful Response
- `422` — Validation Error

## `PATCH` /api/v1/registry/packages/{package_id}/reviews/{review_id}

**Patch Own Review**

Edit the caller's own review — rate-limited 3/hr/user.

**Parameters**

- `package_id` (path, string, required)
- `review_id` (path, string, required)

**Request body**

```bash
curl -X PATCH 'https://app.opvs.ai/api/v1/registry/packages/{package_id}/reviews/{review_id}' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "title": "string",
  "body": "string",
  "rating": 0
}'
```

```python
import httpx

resp = httpx.patch(
    "https://app.opvs.ai/api/v1/registry/packages/{package_id}/reviews/{review_id}",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"title": "string", "body": "string", "rating": 0},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/registry/packages/{package_id}/reviews/{review_id}", {
  method: "PATCH",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"title": "string", "body": "string", "rating": 0})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"title": "string", "body": "string", "rating": 0}`)
	req, _ := http.NewRequest("PATCH", "https://app.opvs.ai/api/v1/registry/packages/{package_id}/reviews/{review_id}", body)
	req.Header.Set("Authorization", "Bearer <token>")
	req.Header.Set("Content-Type", "application/json")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response
- `422` — Validation Error

## Get Store Settings

`GET https://app.opvs.ai/api/v1/registry/store-settings`

Public billboard/collection settings from the marketplace service.

## List Packages

`GET https://app.opvs.ai/api/v1/registry/packages`

List published packages, enriched with a batched `install_count`.

## Search Packages

`GET https://app.opvs.ai/api/v1/registry/search`

Semantic search across the registry (W1.10).

## Get Latest Package

`GET https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}`

Latest published version of a package, enriched with `install_count`.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## List Package Versions

`GET https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/versions`

Version history for a package.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## List Package Used By

`GET https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/used-by`

The AI Employee profiles that run this package — the facepile source.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## Download Skill Bundle

`GET https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/download`

Download a published skill repackaged for a target AI runtime.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## Get Package Skill Guide

`GET https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/skill-guide`

Authenticated read of a published skill's `SKILL.md` body — and, on demand, its
`references/`/`registry/` layer files — extracted live from the R2 bundle.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## Get Certificate

`GET https://app.opvs.ai/api/v1/registry/certificates/{fingerprint}`

Visibility-aware passthrough for certificate verification material.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## List Package Reviews

`GET https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/reviews`

Public paginated review list — newest-first, hidden rows filtered.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## Get Package Bundle

`GET https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}/bundle`

Credentialed raw bundle relay for registered users and service PATs.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## Get Package Version

`GET https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}`

Single version detail (manifest, signature, tier, status).

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## Get Package Changelog

`GET https://app.opvs.ai/api/v1/registry/packages/{vendor}/{name}/{version}/changelog`

Return the bundled CHANGELOG for a specific version as text/markdown.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## Dump Manifest

`GET https://app.opvs.ai/api/v1/registry/manifest`

Bulk manifest dump for the gateway's 60s revocation poll.

## Submit Rating

`POST https://app.opvs.ai/api/v1/registry/packages/{package_id}/ratings`

Upsert a star rating (1-5) for this package from the caller's brand.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## Submit Review

`POST https://app.opvs.ai/api/v1/registry/packages/{package_id}/reviews`

Submit a prose review for this package.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |

## Patch Own Review

`PATCH https://app.opvs.ai/api/v1/registry/packages/{package_id}/reviews/{review_id}`

Edit the caller's own review — rate-limited 3/hr/user.

| Code | When | What to do |
| --- | --- | --- |
| 422 | Validation Error |  |
