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 Ship Line
Get Project Ship Line
GET
/api/v1/projects/{project_id}/ship-lineAlso as:CLI
opvs ship connectMCPtool_call software-factory.getProjectShipLineskillsoftware-factoryErrors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl "https://app.opvs.ai/api/v1/projects/{project_id}/ship-line" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/projects/{project_id}/ship-line",
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}/ship-line", {
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}/ship-line", 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()Try it
GET /api/v1/projects/{project_id}/ship-lineUsed 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 only · 30 tries a minute
Put Project Ship Line
PUT
/api/v1/projects/{project_id}/ship-lineAlso as:CLI
opvs ship owners ${verb}MCPtool_call software-factory.setProjectShipLineskillsoftware-factoryErrors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl -X PUT "https://app.opvs.ai/api/v1/projects/{project_id}/ship-line" \
-H "Authorization: Bearer $OPVS_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'import os
import requests
r = requests.request(
"PUT",
"https://app.opvs.ai/api/v1/projects/{project_id}/ship-line",
headers={"Authorization": f"Bearer {os.environ['OPVS_TOKEN']}", "Content-Type": "application/json"},
data='{}',
)
r.raise_for_status()
print(r.json())const r = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/ship-line", {
method: "PUT",
headers: { Authorization: `Bearer ${process.env.OPVS_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({}),
});
if (!r.ok) throw new Error(String(r.status));
console.log(await r.json());req, _ := http.NewRequest("PUT", "https://app.opvs.ai/api/v1/projects/{project_id}/ship-line", strings.NewReader(`{}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("OPVS_TOKEN"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil { log.Fatal(err) }
defer resp.Body.Close()Try it
PUT /api/v1/projects/{project_id}/ship-lineTry it sends reading requests only.
This endpoint changes data in your workspace, so it is not sent from the docs. Copy the command and run it in your own terminal.
Connect Project Ship Line
POST
/api/v1/projects/{project_id}/ship-line/connectAlso as:CLI
opvs ship connectMCPtool_call software-factory.connectProjectShipLineskillsoftware-factoryReturn signed install and existing-installation link URLs for this project.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl -X POST "https://app.opvs.ai/api/v1/projects/{project_id}/ship-line/connect" \
-H "Authorization: Bearer $OPVS_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'import os
import requests
r = requests.request(
"POST",
"https://app.opvs.ai/api/v1/projects/{project_id}/ship-line/connect",
headers={"Authorization": f"Bearer {os.environ['OPVS_TOKEN']}", "Content-Type": "application/json"},
data='{}',
)
r.raise_for_status()
print(r.json())const r = await fetch("https://app.opvs.ai/api/v1/projects/{project_id}/ship-line/connect", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.OPVS_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({}),
});
if (!r.ok) throw new Error(String(r.status));
console.log(await r.json());req, _ := http.NewRequest("POST", "https://app.opvs.ai/api/v1/projects/{project_id}/ship-line/connect", strings.NewReader(`{}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("OPVS_TOKEN"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil { log.Fatal(err) }
defer resp.Body.Close()Try it
POST /api/v1/projects/{project_id}/ship-line/connectTry it sends reading requests only.
This endpoint changes data in your workspace, so it is not sent from the docs. Copy the command and run it in your own terminal.
Get Project Ship Line Connection
GET
/api/v1/projects/{project_id}/ship-line/connectionAlso as:CLI
opvs ship statusMCPtool_call software-factory.getProjectShipLineConnectionskillsoftware-factoryRead the binding and refresh its installation/repository state via App JWT.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl "https://app.opvs.ai/api/v1/projects/{project_id}/ship-line/connection" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/projects/{project_id}/ship-line/connection",
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}/ship-line/connection", {
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}/ship-line/connection", 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()Try it
GET /api/v1/projects/{project_id}/ship-line/connectionUsed 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 only · 30 tries a minute
Did this answer your question?