# Project Onboarding

Source: https://opvs.ai/docs/api/project-onboarding

## `GET` /api/v1/projects/health/checks

**Get Onboarding Health Checks**

Publish the versioned, snapshot-safe project health check set.

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

```python
import httpx

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

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

**Responses**

- `200` — Successful Response

## `GET` /api/v1/projects/onboarding/schema

**Get Onboarding Schema**

Publish the normalized schema from the API's one active kit release.

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

```python
import httpx

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

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

**Responses**

- `200` — Successful Response

## `GET` /api/v1/projects/{project_id}/onboarding-profile

**Get Onboarding Profile**

**Parameters**

- `project_id` (path, string, required)

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

```python
import httpx

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

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

**Responses**

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

## `PUT` /api/v1/projects/{project_id}/onboarding-profile

**Put Onboarding Profile**

**Parameters**

- `project_id` (path, string, required)

**Request body**

```bash
curl -X PUT 'https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-profile' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "profile_yaml": "string",
  "proof_yaml": "string",
  "kit": {
    "version": "string",
    "url": "string",
    "sha256": "string"
  },
  "expected_revision": 0
}'
```

```python
import httpx

resp = httpx.put(
    "https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-profile",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"profile_yaml": "string", "proof_yaml": "string", "kit": {"version": "string", "url": "string", "sha256": "string"}, "expected_revision": 0},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-profile", {
  method: "PUT",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"profile_yaml": "string", "proof_yaml": "string", "kit": {"version": "string", "url": "string", "sha256": "string"}, "expected_revision": 0})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"profile_yaml": "string", "proof_yaml": "string", "kit": {"version": "string", "url": "string", "sha256": "string"}, "expected_revision": 0}`)
	req, _ := http.NewRequest("PUT", "https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-profile", 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/projects/{project_id}/onboarding-profile/prefill

**Get Onboarding Profile Prefill**

**Parameters**

- `project_id` (path, string, required)

```bash
curl -X GET 'https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-profile/prefill' \
  -H 'Authorization: Bearer <token>'
```

```python
import httpx

resp = httpx.get(
    "https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-profile/prefill",
    headers={"Authorization": "Bearer <token>"},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-profile/prefill", {
  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/projects/{project_id}/onboarding-profile/prefill", 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/projects/{project_id}/onboarding-context

**Get Onboarding Context**

**Parameters**

- `project_id` (path, string, required)
- `source_commit` (query, string, required)

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

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-context", {
  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/projects/{project_id}/onboarding-context", 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/projects/{project_id}/health

**Reprove Onboarding Health**

Diff one scheduled O4 re-proof against the saved project proof.

**Parameters**

- `project_id` (path, string, required)

**Request body**

```bash
curl -X POST 'https://app.opvs.ai/api/v1/projects/{project_id}/health' \
  -H 'Authorization: Bearer <token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "card_id": "00000000-0000-0000-0000-000000000000",
  "scheduled_for": "2026-01-01T00:00:00Z",
  "source_commit": "string",
  "checked_at": "2026-01-01T00:00:00Z",
  "proof_yaml": "string",
  "expected_revision": 0
}'
```

```python
import httpx

resp = httpx.post(
    "https://app.opvs.ai/api/v1/projects/{project_id}/health",
    headers={"Authorization": "Bearer <token>", "Content-Type": "application/json"},
    json={"card_id": "00000000-0000-0000-0000-000000000000", "scheduled_for": "2026-01-01T00:00:00Z", "source_commit": "string", "checked_at": "2026-01-01T00:00:00Z", "proof_yaml": "string", "expected_revision": 0},
)
resp.raise_for_status()
print(resp.json())
```

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/health", {
  method: "POST",
  headers: { "Authorization": "Bearer <token>", "Content-Type": "application/json" },
  body: JSON.stringify({"card_id": "00000000-0000-0000-0000-000000000000", "scheduled_for": "2026-01-01T00:00:00Z", "source_commit": "string", "checked_at": "2026-01-01T00:00:00Z", "proof_yaml": "string", "expected_revision": 0})
});
const data = await resp.json();
console.log(data);
```

```go
package main

import (
	"net/http"
	"strings"
)

func main() {
	body := strings.NewReader(`{"card_id": "00000000-0000-0000-0000-000000000000", "scheduled_for": "2026-01-01T00:00:00Z", "source_commit": "string", "checked_at": "2026-01-01T00:00:00Z", "proof_yaml": "string", "expected_revision": 0}`)
	req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/projects/{project_id}/health", 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/projects/{project_id}/health/latest

**Get Latest Onboarding Health**

**Parameters**

- `project_id` (path, string, required)

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

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/health/latest", {
  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/projects/{project_id}/health/latest", 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/projects/{project_id}/health/schedule

**Get Onboarding Health Schedule**

Queued, overdue, scheduled, or missed. Scheduling a card sends no mail.

**Parameters**

- `project_id` (path, string, required)

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

```python
import httpx

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

```javascript
const resp = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/health/schedule", {
  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/projects/{project_id}/health/schedule", 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/projects/{project_id}/health/history

**Get Onboarding Health History**

**Parameters**

- `project_id` (path, string, required)
- `cursor` (query, any, optional)
- `limit` (query, integer, optional)

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

```python
import httpx

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

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

**Responses**

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

## Get Onboarding Health Checks

`GET https://app.opvs.ai/api/v1/projects/health/checks`

Also as: MCP `tool_call software-factory.getHealthChecks` · skill `software-factory`

Publish the versioned, snapshot-safe project health check set.

## Get Onboarding Schema

`GET https://app.opvs.ai/api/v1/projects/onboarding/schema`

Also as: MCP `tool_call software-factory.getOnboardingSchema` · skill `software-factory`

Publish the normalized schema from the API's one active kit release.

## Get Onboarding Profile

`GET https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-profile`

Also as: MCP `tool_call software-factory.getOnboardingProfile` · skill `software-factory`

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

## Put Onboarding Profile

`PUT https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-profile`

Also as: MCP `tool_call software-factory.putOnboardingProfile` · skill `software-factory`

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

## Get Onboarding Profile Prefill

`GET https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-profile/prefill`

Also as: MCP `tool_call software-factory.getOnboardingProfilePrefill` · skill `software-factory`

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

## Get Onboarding Context

`GET https://app.opvs.ai/api/v1/projects/{project_id}/onboarding-context`

Also as: MCP `tool_call software-factory.getOnboardingContext` · skill `software-factory`

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

## Reprove Onboarding Health

`POST https://app.opvs.ai/api/v1/projects/{project_id}/health`

Also as: MCP `tool_call software-factory.reproveOnboardingHealth` · skill `software-factory`

Diff one scheduled O4 re-proof against the saved project proof.

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

## Get Latest Onboarding Health

`GET https://app.opvs.ai/api/v1/projects/{project_id}/health/latest`

Also as: MCP `tool_call software-factory.getLatestOnboardingHealth` · skill `software-factory`

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

## Get Onboarding Health Schedule

`GET https://app.opvs.ai/api/v1/projects/{project_id}/health/schedule`

Also as: MCP `tool_call software-factory.getOnboardingHealthSchedule` · skill `software-factory`

Queued, overdue, scheduled, or missed. Scheduling a card sends no mail.

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

## Get Onboarding Health History

`GET https://app.opvs.ai/api/v1/projects/{project_id}/health/history`

Also as: MCP `tool_call software-factory.getOnboardingHealthHistory` · skill `software-factory`

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