Guides
- Hire an AI Employee
- Manufacture a catalog product
- System endpoints
- Format negotiation
- Read depth and cross-board reach
- Board health
- Plans & billing
- Professions (Guild Hall)
- Code index
- Memory (AgentMemory)
- Workspace settings
- Coder profiles
- Move or copy a card to another board
- Email boards
- Your repo's knowledge in AgentMemory
- Become a vendor
- Your signing certificate
- Partner keys and publish credentials
- Rotate a credential
- Skill anatomy
- Profession anatomy
- The 4-layer skill format
- Write skills that hold up
- Preflight and common mistakes
- The package manifest
- Sign and publish
- Security review
- Versions and trust tiers
- Required upgrades
- Revoke a version
- Breaking changes and deprecation
- Promote your package
- Harvest
- Vendor API and CLI reference
- Vendor glossary
- How marketplace skills reach your AI tool
- Use marketplace skills in Claude Code
- Use marketplace skills in Cursor
- Use marketplace skills in Windsurf
- Use marketplace skills in Antigravity
- Use marketplace skills in Gemini CLI
- Give marketplace skills to your AI employees on OPVS
Reference
- API reference
- Blotato
- CLI reference
- MCP server
- OPVS Mail
- AgentBoard
- Board
- Board Inbox
- Board Chat
- Board Agent API
- AgentDocs
- Public Docs
- AgentMemory
- Employees
- My mail
- Calendar
- Webhooks
- Notifications
- Auth
- PAT Provisioning
- Agents
- Agent Workspace
- Agent Embed
- Org Chart
- AI Office
- Invitations
- Workflows
- Decisions
- Code Index
- Workstations
- Professions
- Integrations
- Data Sources
- Data Connectors
- Brands
- OPVS Protocol
- Marketplace Registry
- Workspace Planner
- Project Overview
- Project Onboarding
- Project Environment
- Project Bundle
- Project Ship
- Project Ship Line
- Review Policy
- Builders
- Environments
- Machines
- Fleet
- GitHub
- GitHub App
- Factory
- Factory Control
- Factory Control Plane
- Factory Claim
- Factory Steer
- Factory Drill
- Factory Events
- Factory Metrics
- Factory Ratings
- Factory Reviews
- Factory Verdicts
- Factory Pay Per Use
- Performance
- Model Evals
- System
Factory
- How the factory works
- Set up your factory
- Fix a machine or desk that won't come up
- Fix a board that doesn't build or ship
- Machines, desks and the sidecar
- Board types and columns
- Projects and project settings
- Builders and engines
- How a card moves
- Connect GitHub
- Set a review policy
- Run your factory with the opvs skill and the agent-ops kit
- Factory CLI reference
Project Overview
Get All Projects Overview
/api/v1/projects/overviewtool_call software-factory.getAllProjectsOverviewskillsoftware-factoryErrors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/projects/overview" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/projects/overview",
headers={"Authorization": f"Bearer {os.environ['OPVS_TOKEN']}"},
)
r.raise_for_status()
print(r.json())const r = await fetch("https://app.opvs.ai/api/v1/projects/overview", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.OPVS_TOKEN}` },
});
if (!r.ok) throw new Error(String(r.status));
console.log(await r.json());req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/projects/overview", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("OPVS_TOKEN"))
resp, err := http.DefaultClient.Do(req)
if err != nil { log.Fatal(err) }
defer resp.Body.Close()GET /api/v1/projects/overviewUsed once, saved nowhere. Your token travels for this request through opvs.ai and SpiderPublish to app.opvs.ai, then this page forgets it when the tab closes.
Get All Projects Performance By Who
/api/v1/projects/performance/by-whotool_call software-factory.getAllProjectsPerformanceByWhoskillsoftware-factoryErrors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/projects/performance/by-who" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/projects/performance/by-who",
headers={"Authorization": f"Bearer {os.environ['OPVS_TOKEN']}"},
)
r.raise_for_status()
print(r.json())const r = await fetch("https://app.opvs.ai/api/v1/projects/performance/by-who", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.OPVS_TOKEN}` },
});
if (!r.ok) throw new Error(String(r.status));
console.log(await r.json());req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/projects/performance/by-who", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("OPVS_TOKEN"))
resp, err := http.DefaultClient.Do(req)
if err != nil { log.Fatal(err) }
defer resp.Body.Close()GET /api/v1/projects/performance/by-whoUsed once, saved nowhere. Your token travels for this request through opvs.ai and SpiderPublish to app.opvs.ai, then this page forgets it when the tab closes.
Get Project Performance By Who
/api/v1/projects/{project_id}/performance/by-whotool_call software-factory.getProjectPerformanceByWhoskillsoftware-factoryErrors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/projects/{project_id}/performance/by-who" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/projects/{project_id}/performance/by-who",
headers={"Authorization": f"Bearer {os.environ['OPVS_TOKEN']}"},
)
r.raise_for_status()
print(r.json())const r = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/performance/by-who", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.OPVS_TOKEN}` },
});
if (!r.ok) throw new Error(String(r.status));
console.log(await r.json());req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/projects/{project_id}/performance/by-who", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("OPVS_TOKEN"))
resp, err := http.DefaultClient.Do(req)
if err != nil { log.Fatal(err) }
defer resp.Body.Close()GET /api/v1/projects/{project_id}/performance/by-whoUsed once, saved nowhere. Your token travels for this request through opvs.ai and SpiderPublish to app.opvs.ai, then this page forgets it when the tab closes.
Get All Projects Work
/api/v1/projects/worktool_call software-factory.getAllProjectsWorkskillsoftware-factoryErrors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/projects/work" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/projects/work",
headers={"Authorization": f"Bearer {os.environ['OPVS_TOKEN']}"},
)
r.raise_for_status()
print(r.json())const r = await fetch("https://app.opvs.ai/api/v1/projects/work", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.OPVS_TOKEN}` },
});
if (!r.ok) throw new Error(String(r.status));
console.log(await r.json());req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/projects/work", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("OPVS_TOKEN"))
resp, err := http.DefaultClient.Do(req)
if err != nil { log.Fatal(err) }
defer resp.Body.Close()GET /api/v1/projects/workUsed once, saved nowhere. Your token travels for this request through opvs.ai and SpiderPublish to app.opvs.ai, then this page forgets it when the tab closes.
Get Project Overview
/api/v1/projects/{project_id}/overviewtool_call software-factory.getProjectOverviewskillsoftware-factoryErrors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/projects/{project_id}/overview" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/projects/{project_id}/overview",
headers={"Authorization": f"Bearer {os.environ['OPVS_TOKEN']}"},
)
r.raise_for_status()
print(r.json())const r = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/overview", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.OPVS_TOKEN}` },
});
if (!r.ok) throw new Error(String(r.status));
console.log(await r.json());req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/projects/{project_id}/overview", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("OPVS_TOKEN"))
resp, err := http.DefaultClient.Do(req)
if err != nil { log.Fatal(err) }
defer resp.Body.Close()GET /api/v1/projects/{project_id}/overviewUsed once, saved nowhere. Your token travels for this request through opvs.ai and SpiderPublish to app.opvs.ai, then this page forgets it when the tab closes.
Get Project Work
/api/v1/projects/{project_id}/worktool_call software-factory.getProjectWorkskillsoftware-factoryErrors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/projects/{project_id}/work" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/projects/{project_id}/work",
headers={"Authorization": f"Bearer {os.environ['OPVS_TOKEN']}"},
)
r.raise_for_status()
print(r.json())const r = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/work", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.OPVS_TOKEN}` },
});
if (!r.ok) throw new Error(String(r.status));
console.log(await r.json());req, _ := http.NewRequest("GET", "https://app.opvs.ai/api/v1/projects/{project_id}/work", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("OPVS_TOKEN"))
resp, err := http.DefaultClient.Do(req)
if err != nil { log.Fatal(err) }
defer resp.Body.Close()GET /api/v1/projects/{project_id}/workUsed once, saved nowhere. Your token travels for this request through opvs.ai and SpiderPublish to app.opvs.ai, then this page forgets it when the tab closes.