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
Reference
- API reference
- CLI reference
- MCP server
- OPVS Mail
- 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
- GETList Integration Overview
- POSTCreate Integration
- GETList Provider Templates
- GETList Integrations
- GETGet Integration
- PATCHUpdate Integration
- DELETEDelete Integration
- POSTUpload Avatar
- POSTReset Integration Usage
- POSTTest Integration
- GETGet Integration Spend
- GETGet Provider Spend Overview
- POSTTrigger Billing Sync
- Data Sources
- Data Connectors
- Brands
- OPVS Protocol
- Marketplace Registry
- 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
Integrations
List Integration Overview
GET
/api/v1/brands/{brand_id}/integrationsOverview of all configured providers with aggregated stats.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/integrations",
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/brands/{brand_id}/integrations", {
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/brands/{brand_id}/integrations", 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()Create Integration
POST
/api/v1/brands/{brand_id}/integrationsCreate a new API integration key. Brand admin only.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations" \
-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/brands/{brand_id}/integrations",
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/brands/{brand_id}/integrations", {
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/brands/{brand_id}/integrations", 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()List Provider Templates
GET
/api/v1/brands/{brand_id}/integrations/providersList available provider templates with field schemas.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/providers" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/providers",
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/brands/{brand_id}/integrations/providers", {
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/brands/{brand_id}/integrations/providers", 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()List Integrations
GET
/api/v1/brands/{brand_id}/integrations/allList all integration keys, optionally filtered by provider.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/all" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/all",
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/brands/{brand_id}/integrations/all", {
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/brands/{brand_id}/integrations/all", 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 Integration
GET
/api/v1/brands/{brand_id}/integrations/{integration_id}Get a single integration key detail.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}",
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/brands/{brand_id}/integrations/{integration_id}", {
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/brands/{brand_id}/integrations/{integration_id}", 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()Update Integration
PATCH
/api/v1/brands/{brand_id}/integrations/{integration_id}Update an integration key. Brand admin only.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl -X PATCH "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}" \
-H "Authorization: Bearer $OPVS_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'import os
import requests
r = requests.request(
"PATCH",
"https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}",
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/brands/{brand_id}/integrations/{integration_id}", {
method: "PATCH",
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("PATCH", "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}", 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()Delete Integration
DELETE
/api/v1/brands/{brand_id}/integrations/{integration_id}Delete an integration key. Brand admin only.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl -X DELETE "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"DELETE",
"https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}",
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/brands/{brand_id}/integrations/{integration_id}", {
method: "DELETE",
headers: { Authorization: `Bearer ${process.env.OPVS_TOKEN}` },
});
if (!r.ok) throw new Error(String(r.status));
console.log(await r.json());req, _ := http.NewRequest("DELETE", "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}", 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()Upload Avatar
POST
/api/v1/brands/{brand_id}/integrations/avatarUpload an avatar image to R2. Returns the public URL.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/avatar" \
-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/brands/{brand_id}/integrations/avatar",
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/brands/{brand_id}/integrations/avatar", {
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/brands/{brand_id}/integrations/avatar", 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()Reset Integration Usage
POST
/api/v1/brands/{brand_id}/integrations/{integration_id}/reset-usageReset daily and minute usage counters. Brand admin only.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}/reset-usage" \
-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/brands/{brand_id}/integrations/{integration_id}/reset-usage",
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/brands/{brand_id}/integrations/{integration_id}/reset-usage", {
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/brands/{brand_id}/integrations/{integration_id}/reset-usage", 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()Test Integration
POST
/api/v1/brands/{brand_id}/integrations/{integration_id}/testRun a one-off health probe against this integration and persist the result.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}/test" \
-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/brands/{brand_id}/integrations/{integration_id}/test",
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/brands/{brand_id}/integrations/{integration_id}/test", {
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/brands/{brand_id}/integrations/{integration_id}/test", 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()Get Integration Spend
GET
/api/v1/brands/{brand_id}/integrations/{integration_id}/spendGet spend data and history for a single integration key.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}/spend" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}/spend",
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/brands/{brand_id}/integrations/{integration_id}/spend", {
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/brands/{brand_id}/integrations/{integration_id}/spend", 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 Provider Spend Overview
GET
/api/v1/brands/{brand_id}/integrations/spend/provider/{provider_name}Aggregated spend overview for all keys of a provider.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/spend/provider/{provider_name}" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/spend/provider/{provider_name}",
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/brands/{brand_id}/integrations/spend/provider/{provider_name}", {
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/brands/{brand_id}/integrations/spend/provider/{provider_name}", 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()Trigger Billing Sync
POST
/api/v1/brands/{brand_id}/integrations/{integration_id}/sync-billingTrigger a manual billing sync for a single integration. Brand admin only.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
Request
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/integrations/{integration_id}/sync-billing" \
-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/brands/{brand_id}/integrations/{integration_id}/sync-billing",
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/brands/{brand_id}/integrations/{integration_id}/sync-billing", {
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/brands/{brand_id}/integrations/{integration_id}/sync-billing", 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()Did this answer your question?