# Professions

Source: https://opvs.ai/docs/api/professions

## `GET` /api/v1/memory/professions/craft/publish-jobs/{job_id}

**Get Publish Job**

Poll a watched publish job. Admin/curator-only, like publish itself.

**Parameters**

- `job_id` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/memory/professions/craft/publish-jobs/{job_id}' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/memory/professions/craft/publish-jobs/{job_id}",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/craft/publish-jobs/{job_id}", {
  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/memory/professions/craft/publish-jobs/{job_id}", 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/memory/professions/review/pending-codes

**List Curator Pending Codes**

List profession codes with shadow verdict work for the hired curator.

```bash
curl -X GET 'https://app.opvs.ai/api/v1/memory/professions/review/pending-codes' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/memory/professions/review/pending-codes",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/review/pending-codes", {
  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/memory/professions/review/pending-codes", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response

## `GET` /api/v1/memory/professions/review/roster

**List Review Roster**

Read the craft review roster for the admin page.

```bash
curl -X GET 'https://app.opvs.ai/api/v1/memory/professions/review/roster' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/review/roster", {
  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/memory/professions/review/roster", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response

## `GET` /api/v1/memory/professions/craft/verdicts

**List Craft Verdicts**

List cross-tenant craft verdict reasons for platform administrators.

```bash
curl -X GET 'https://app.opvs.ai/api/v1/memory/professions/craft/verdicts' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/craft/verdicts", {
  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/memory/professions/craft/verdicts", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response

## `POST` /api/v1/memory/professions/craft/verdicts/{verdict_id}/override

**Override Curator Verdict**

Record a super-admin dashboard override without mutating craft.

**Parameters**

- `verdict_id` (path, string, required)

**Request body**

```bash
curl -X POST 'https://app.opvs.ai/api/v1/memory/professions/craft/verdicts/{verdict_id}/override' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "override_verdict": "publish",
  "override_reason": "string",
  "overridden_by": "string"
}'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/memory/professions/craft/verdicts/{verdict_id}/override",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"override_verdict": "publish", "override_reason": "string", "overridden_by": "string"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/craft/verdicts/{verdict_id}/override", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"override_verdict": "publish", "override_reason": "string", "overridden_by": "string"})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"override_verdict": "publish", "override_reason": "string", "overridden_by": "string"}`)
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/memory/professions/craft/verdicts/{verdict_id}/override", 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` /api/v1/memory/professions/{profession_code}/craft/curator-queue

**List Curator Queue**

Forward one profession's review queue to the hired curator.

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/curator-queue' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/curator-queue",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/curator-queue", {
  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/memory/professions/{profession_code}/craft/curator-queue", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## `POST` /api/v1/memory/professions/{profession_code}/craft/{craft_id}/verdicts

**Create Curator Verdict**

Record a probationary curator verdict without mutating craft.

**Parameters**

- `profession_code` (path, string, required)
- `craft_id` (path, string, required)

**Request body**

```bash
curl -X POST 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/verdicts' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "verdict": "publish",
  "reason": "string",
  "evidence": {},
  "reviewer": "string"
}'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/verdicts",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"verdict": "publish", "reason": "string", "evidence": {}, "reviewer": "string"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/verdicts", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"verdict": "publish", "reason": "string", "evidence": {}, "reviewer": "string"})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"verdict": "publish", "reason": "string", "evidence": {}, "reviewer": "string"}`)
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/verdicts", 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

## `GET` /api/v1/memory/professions/{profession_code}/craft

**Pull Craft**

Pull PUBLISHED craft — cursor-paginated, optional ``?query=`` FTS.

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft", {
  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/memory/professions/{profession_code}/craft", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## `POST` /api/v1/memory/professions/{profession_code}/craft

**Contribute Craft**

Contribute a craft item → written 'pending' (invisible to pull until D4).

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X POST 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

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

```go
package main

import (
	"net/http"
)

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

**Responses**

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

## `POST` /api/v1/memory/professions/{profession_code}/curate

**Trigger Curation**

Run the curation gate NOW for the pinned brand's memory into this guild.

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X POST 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/curate' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/curate",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

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

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/curate", 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/memory/professions/{profession_code}/craft/review

**List Pending Craft**

List anonymized ``pending`` candidates awaiting a curator decision.

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/review' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/review", {
  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/memory/professions/{profession_code}/craft/review", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## `POST` /api/v1/memory/professions/{profession_code}/craft/{craft_id}/publish

**Publish Craft**

L4 — approve a candidate ``pending → published`` (now cross-tenant visible).

**Parameters**

- `profession_code` (path, string, required)
- `craft_id` (path, string, required)

```bash
curl -X POST 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/publish' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/publish",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/publish", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/publish", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## `POST` /api/v1/memory/professions/{profession_code}/craft/{craft_id}/reject

**Reject Craft**

L4 — seal a candidate ``pending → rejected`` (stays sealed, never served).

**Parameters**

- `profession_code` (path, string, required)
- `craft_id` (path, string, required)

```bash
curl -X POST 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/reject' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/reject",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/reject", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/reject", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## `POST` /api/v1/memory/professions/{profession_code}/craft/{craft_id}/withdraw

**Withdraw Craft**

Withdraw published shared craft; restricted to platform super-admins.

**Parameters**

- `profession_code` (path, string, required)
- `craft_id` (path, string, required)

**Request body**

```bash
curl -X POST 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/withdraw' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "reason": "string"
}'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/withdraw",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"reason": "string"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/withdraw", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"reason": "string"})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"reason": "string"}`)
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/withdraw", 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` /api/v1/memory/professions/{profession_code}/workflows

**Pull Workflows**

Pull PUBLISHED workflow-library entries — cursor-paginated. Member-gated.

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/workflows' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/{profession_code}/workflows", {
  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/memory/professions/{profession_code}/workflows", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## `POST` /api/v1/memory/professions/{profession_code}/workflows

**Contribute Workflow**

Contribute a workflow-library entry → written 'pending'. Member-gated.

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X POST 'https://app.opvs.ai/api/v1/memory/professions/{profession_code}/workflows' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/memory/professions/{profession_code}/workflows",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

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

```go
package main

import (
	"net/http"
)

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

**Responses**

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

## `GET` /api/v1/memory/professions/{profession_code}

**Get Profession Profile**

Get a profession address profile (members count, freshness).

**Parameters**

- `profession_code` (path, string, required)

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

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/memory/professions/{profession_code}", {
  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/memory/professions/{profession_code}", 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/professions/craft/publish-jobs/{job_id}

**Get Publish Job**

Poll a watched publish job. Admin/curator-only, like publish itself.

**Parameters**

- `job_id` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/professions/craft/publish-jobs/{job_id}' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/professions/craft/publish-jobs/{job_id}",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/craft/publish-jobs/{job_id}", {
  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/professions/craft/publish-jobs/{job_id}", 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/professions/review/pending-codes

**List Curator Pending Codes**

List profession codes with shadow verdict work for the hired curator.

```bash
curl -X GET 'https://app.opvs.ai/api/v1/professions/review/pending-codes' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/review/pending-codes", {
  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/professions/review/pending-codes", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response

## `GET` /api/v1/professions/review/roster

**List Review Roster**

Read the craft review roster for the admin page.

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

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/review/roster", {
  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/professions/review/roster", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response

## `GET` /api/v1/professions/craft/verdicts

**List Craft Verdicts**

List cross-tenant craft verdict reasons for platform administrators.

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

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/craft/verdicts", {
  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/professions/craft/verdicts", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

- `200` — Successful Response

## `POST` /api/v1/professions/craft/verdicts/{verdict_id}/override

**Override Curator Verdict**

Record a super-admin dashboard override without mutating craft.

**Parameters**

- `verdict_id` (path, string, required)

**Request body**

```bash
curl -X POST 'https://app.opvs.ai/api/v1/professions/craft/verdicts/{verdict_id}/override' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "override_verdict": "publish",
  "override_reason": "string",
  "overridden_by": "string"
}'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/professions/craft/verdicts/{verdict_id}/override",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"override_verdict": "publish", "override_reason": "string", "overridden_by": "string"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/craft/verdicts/{verdict_id}/override", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"override_verdict": "publish", "override_reason": "string", "overridden_by": "string"})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"override_verdict": "publish", "override_reason": "string", "overridden_by": "string"}`)
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/professions/craft/verdicts/{verdict_id}/override", 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` /api/v1/professions/{profession_code}/craft/curator-queue

**List Curator Queue**

Forward one profession's review queue to the hired curator.

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/professions/{profession_code}/craft/curator-queue' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/professions/{profession_code}/craft/curator-queue",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/{profession_code}/craft/curator-queue", {
  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/professions/{profession_code}/craft/curator-queue", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## `POST` /api/v1/professions/{profession_code}/craft/{craft_id}/verdicts

**Create Curator Verdict**

Record a probationary curator verdict without mutating craft.

**Parameters**

- `profession_code` (path, string, required)
- `craft_id` (path, string, required)

**Request body**

```bash
curl -X POST 'https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/verdicts' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "verdict": "publish",
  "reason": "string",
  "evidence": {},
  "reviewer": "string"
}'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/verdicts",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"verdict": "publish", "reason": "string", "evidence": {}, "reviewer": "string"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/verdicts", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"verdict": "publish", "reason": "string", "evidence": {}, "reviewer": "string"})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"verdict": "publish", "reason": "string", "evidence": {}, "reviewer": "string"}`)
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/verdicts", 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

## `GET` /api/v1/professions/{profession_code}/craft

**Pull Craft**

Pull PUBLISHED craft — cursor-paginated, optional ``?query=`` FTS.

**Parameters**

- `profession_code` (path, string, required)

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

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/{profession_code}/craft", {
  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/professions/{profession_code}/craft", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## `POST` /api/v1/professions/{profession_code}/craft

**Contribute Craft**

Contribute a craft item → written 'pending' (invisible to pull until D4).

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X POST 'https://app.opvs.ai/api/v1/professions/{profession_code}/craft' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

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

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

```go
package main

import (
	"net/http"
)

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

**Responses**

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

## `POST` /api/v1/professions/{profession_code}/curate

**Trigger Curation**

Run the curation gate NOW for the pinned brand's memory into this guild.

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X POST 'https://app.opvs.ai/api/v1/professions/{profession_code}/curate' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

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

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

```go
package main

import (
	"net/http"
)

func main() {
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/professions/{profession_code}/curate", 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/professions/{profession_code}/craft/review

**List Pending Craft**

List anonymized ``pending`` candidates awaiting a curator decision.

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/professions/{profession_code}/craft/review' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/{profession_code}/craft/review", {
  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/professions/{profession_code}/craft/review", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## `POST` /api/v1/professions/{profession_code}/craft/{craft_id}/publish

**Publish Craft**

L4 — approve a candidate ``pending → published`` (now cross-tenant visible).

**Parameters**

- `profession_code` (path, string, required)
- `craft_id` (path, string, required)

```bash
curl -X POST 'https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/publish' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/publish",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/publish", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

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

**Responses**

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

## `POST` /api/v1/professions/{profession_code}/craft/{craft_id}/reject

**Reject Craft**

L4 — seal a candidate ``pending → rejected`` (stays sealed, never served).

**Parameters**

- `profession_code` (path, string, required)
- `craft_id` (path, string, required)

```bash
curl -X POST 'https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/reject' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/reject",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/reject", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>" }
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
)

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

**Responses**

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

## `POST` /api/v1/professions/{profession_code}/craft/{craft_id}/withdraw

**Withdraw Craft**

Withdraw published shared craft; restricted to platform super-admins.

**Parameters**

- `profession_code` (path, string, required)
- `craft_id` (path, string, required)

**Request body**

```bash
curl -X POST 'https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/withdraw' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "reason": "string"
}'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/withdraw",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"reason": "string"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/withdraw", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"reason": "string"})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"reason": "string"}`)
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/withdraw", 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` /api/v1/professions/{profession_code}/workflows

**Pull Workflows**

Pull PUBLISHED workflow-library entries — cursor-paginated. Member-gated.

**Parameters**

- `profession_code` (path, string, required)

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

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/{profession_code}/workflows", {
  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/professions/{profession_code}/workflows", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## `POST` /api/v1/professions/{profession_code}/workflows

**Contribute Workflow**

Contribute a workflow-library entry → written 'pending'. Member-gated.

**Parameters**

- `profession_code` (path, string, required)

```bash
curl -X POST 'https://app.opvs.ai/api/v1/professions/{profession_code}/workflows' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

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

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

```go
package main

import (
	"net/http"
)

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

**Responses**

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

## `GET` /api/v1/professions/{profession_code}

**Get Profession Profile**

Get a profession address profile (members count, freshness).

**Parameters**

- `profession_code` (path, string, required)

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

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/professions/{profession_code}", {
  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/professions/{profession_code}", nil)
	req.Header.Set("Authorization", "Bearer <token>")
	resp, _ := http.DefaultClient.Do(req)
	defer resp.Body.Close()
}
```

**Responses**

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

## Get Publish Job

`GET https://app.opvs.ai/api/v1/memory/professions/craft/publish-jobs/{job_id}`

Poll a watched publish job. Admin/curator-only, like publish itself.

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

## List Curator Pending Codes

`GET https://app.opvs.ai/api/v1/memory/professions/review/pending-codes`

List profession codes with shadow verdict work for the hired curator.

## List Review Roster

`GET https://app.opvs.ai/api/v1/memory/professions/review/roster`

Read the craft review roster for the admin page.

## List Craft Verdicts

`GET https://app.opvs.ai/api/v1/memory/professions/craft/verdicts`

List cross-tenant craft verdict reasons for platform administrators.

## Override Curator Verdict

`POST https://app.opvs.ai/api/v1/memory/professions/craft/verdicts/{verdict_id}/override`

Record a super-admin dashboard override without mutating craft.

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

## List Curator Queue

`GET https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/curator-queue`

Forward one profession's review queue to the hired curator.

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

## Create Curator Verdict

`POST https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/verdicts`

Record a probationary curator verdict without mutating craft.

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

## Pull Craft

`GET https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft`

Pull PUBLISHED craft — cursor-paginated, optional ``?query=`` FTS.

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

## Contribute Craft

`POST https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft`

Contribute a craft item → written 'pending' (invisible to pull until D4).

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

## Trigger Curation

`POST https://app.opvs.ai/api/v1/memory/professions/{profession_code}/curate`

Run the curation gate NOW for the pinned brand's memory into this guild.

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

## List Pending Craft

`GET https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/review`

List anonymized ``pending`` candidates awaiting a curator decision.

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

## Publish Craft

`POST https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/publish`

L4 — approve a candidate ``pending → published`` (now cross-tenant visible).

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

## Reject Craft

`POST https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/reject`

L4 — seal a candidate ``pending → rejected`` (stays sealed, never served).

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

## Withdraw Craft

`POST https://app.opvs.ai/api/v1/memory/professions/{profession_code}/craft/{craft_id}/withdraw`

Withdraw published shared craft; restricted to platform super-admins.

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

## Pull Workflows

`GET https://app.opvs.ai/api/v1/memory/professions/{profession_code}/workflows`

Pull PUBLISHED workflow-library entries — cursor-paginated. Member-gated.

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

## Contribute Workflow

`POST https://app.opvs.ai/api/v1/memory/professions/{profession_code}/workflows`

Contribute a workflow-library entry → written 'pending'. Member-gated.

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

## Get Profession Profile

`GET https://app.opvs.ai/api/v1/memory/professions/{profession_code}`

Get a profession address profile (members count, freshness).

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

## Get Publish Job

`GET https://app.opvs.ai/api/v1/professions/craft/publish-jobs/{job_id}`

Poll a watched publish job. Admin/curator-only, like publish itself.

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

## List Curator Pending Codes

`GET https://app.opvs.ai/api/v1/professions/review/pending-codes`

List profession codes with shadow verdict work for the hired curator.

## List Review Roster

`GET https://app.opvs.ai/api/v1/professions/review/roster`

Read the craft review roster for the admin page.

## List Craft Verdicts

`GET https://app.opvs.ai/api/v1/professions/craft/verdicts`

List cross-tenant craft verdict reasons for platform administrators.

## Override Curator Verdict

`POST https://app.opvs.ai/api/v1/professions/craft/verdicts/{verdict_id}/override`

Record a super-admin dashboard override without mutating craft.

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

## List Curator Queue

`GET https://app.opvs.ai/api/v1/professions/{profession_code}/craft/curator-queue`

Forward one profession's review queue to the hired curator.

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

## Create Curator Verdict

`POST https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/verdicts`

Record a probationary curator verdict without mutating craft.

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

## Pull Craft

`GET https://app.opvs.ai/api/v1/professions/{profession_code}/craft`

Pull PUBLISHED craft — cursor-paginated, optional ``?query=`` FTS.

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

## Contribute Craft

`POST https://app.opvs.ai/api/v1/professions/{profession_code}/craft`

Contribute a craft item → written 'pending' (invisible to pull until D4).

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

## Trigger Curation

`POST https://app.opvs.ai/api/v1/professions/{profession_code}/curate`

Run the curation gate NOW for the pinned brand's memory into this guild.

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

## List Pending Craft

`GET https://app.opvs.ai/api/v1/professions/{profession_code}/craft/review`

List anonymized ``pending`` candidates awaiting a curator decision.

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

## Publish Craft

`POST https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/publish`

L4 — approve a candidate ``pending → published`` (now cross-tenant visible).

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

## Reject Craft

`POST https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/reject`

L4 — seal a candidate ``pending → rejected`` (stays sealed, never served).

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

## Withdraw Craft

`POST https://app.opvs.ai/api/v1/professions/{profession_code}/craft/{craft_id}/withdraw`

Withdraw published shared craft; restricted to platform super-admins.

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

## Pull Workflows

`GET https://app.opvs.ai/api/v1/professions/{profession_code}/workflows`

Pull PUBLISHED workflow-library entries — cursor-paginated. Member-gated.

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

## Contribute Workflow

`POST https://app.opvs.ai/api/v1/professions/{profession_code}/workflows`

Contribute a workflow-library entry → written 'pending'. Member-gated.

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

## Get Profession Profile

`GET https://app.opvs.ai/api/v1/professions/{profession_code}`

Get a profession address profile (members count, freshness).

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