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
- Data Sources
- Data Connectors
- Brands
- GETList Brands
- GETGet Brand
- PATCHUpdate Brand
- GETGet Brand Settings
- PATCHUpdate Brand Settings
- GETGet Brand Info
- PATCHUpdate Brand Info
- GETList Brand Members
- PATCHUpdate Brand Member
- DELETERemove Brand Member
- POSTUpload Member Photo
- DELETERemove Member Photo
- POSTReset Member Password
- POSTSet Member Password
- GETList Guests
- POSTMake Guest Member
- DELETERemove Guest
- POSTUpload Brand Image
- GETList Brand Images
- DELETEDelete Brand Image
- POSTUpload Brand Logo
- GETGet Docs Domain
- POSTVerify Docs Domain
- 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
Brands
List Brands
/api/v1/brandsList all brands the current user belongs to.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/brands" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands",
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", {
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", 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 Brand
/api/v1/brands/{brand_id}Get brand details. Requires membership.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/brands/{brand_id}" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_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}", {
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}", 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 Brand
/api/v1/brands/{brand_id}Update brand name, billing email, or docs custom domain. Brand admin only.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X PATCH "https://app.opvs.ai/api/v1/brands/{brand_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}",
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}", {
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}", 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 Brand Settings
/api/v1/brands/{brand_id}/settingsGet brand settings (voice, tone, logo).
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/settings" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/settings",
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}/settings", {
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}/settings", 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 Brand Settings
/api/v1/brands/{brand_id}/settingsUpdate brand settings. Brand admin only.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X PATCH "https://app.opvs.ai/api/v1/brands/{brand_id}/settings" \
-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}/settings",
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}/settings", {
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}/settings", 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 Brand Info
/api/v1/brands/{brand_id}/infoGet brand information (address, tax).
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/info" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/info",
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}/info", {
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}/info", 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 Brand Info
/api/v1/brands/{brand_id}/infoUpdate brand information. Brand admin only.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X PATCH "https://app.opvs.ai/api/v1/brands/{brand_id}/info" \
-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}/info",
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}/info", {
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}/info", 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 Brand Members
/api/v1/brands/{brand_id}/membersList members of a brand.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/members" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/members",
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}/members", {
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}/members", 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 Brand Member
/api/v1/brands/{brand_id}/members/{user_id}Update a member's role or position. Brand admin only.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X PATCH "https://app.opvs.ai/api/v1/brands/{brand_id}/members/{user_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}/members/{user_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}/members/{user_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}/members/{user_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()Remove Brand Member
/api/v1/brands/{brand_id}/members/{user_id}Remove a member from the brand. Brand admin only.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X DELETE "https://app.opvs.ai/api/v1/brands/{brand_id}/members/{user_id}" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"DELETE",
"https://app.opvs.ai/api/v1/brands/{brand_id}/members/{user_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}/members/{user_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}/members/{user_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 Member Photo
/api/v1/brands/{brand_id}/members/{user_id}/photoUpload a picture for a member of this brand.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/members/{user_id}/photo" \
-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}/members/{user_id}/photo",
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}/members/{user_id}/photo", {
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}/members/{user_id}/photo", 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()Remove Member Photo
/api/v1/brands/{brand_id}/members/{user_id}/photoRemove a picture from a member of this brand.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X DELETE "https://app.opvs.ai/api/v1/brands/{brand_id}/members/{user_id}/photo" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"DELETE",
"https://app.opvs.ai/api/v1/brands/{brand_id}/members/{user_id}/photo",
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}/members/{user_id}/photo", {
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}/members/{user_id}/photo", 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()Reset Member Password
/api/v1/brands/{brand_id}/members/{user_id}/reset-passwordSend the member the existing password-reset email.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/members/{user_id}/reset-password" \
-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}/members/{user_id}/reset-password",
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}/members/{user_id}/reset-password", {
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}/members/{user_id}/reset-password", 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()Set Member Password
/api/v1/brands/{brand_id}/members/{user_id}/set-passwordSet a password only for an ordinary person who belongs to this brand alone.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/members/{user_id}/set-password" \
-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}/members/{user_id}/set-password",
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}/members/{user_id}/set-password", {
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}/members/{user_id}/set-password", 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 Guests
/api/v1/brands/{brand_id}/guestsList outside people and every board/docs resource they can open.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/guests" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/guests",
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}/guests", {
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}/guests", 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()Make Guest Member
/api/v1/brands/{brand_id}/guests/{user_id}/make-memberInvite a guest; their existing grants remain until they accept.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/guests/{user_id}/make-member" \
-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}/guests/{user_id}/make-member",
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}/guests/{user_id}/make-member", {
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}/guests/{user_id}/make-member", 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()Remove Guest
/api/v1/brands/{brand_id}/guests/{user_id}Remove every board/docs grant without deleting authored content.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X DELETE "https://app.opvs.ai/api/v1/brands/{brand_id}/guests/{user_id}" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"DELETE",
"https://app.opvs.ai/api/v1/brands/{brand_id}/guests/{user_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}/guests/{user_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}/guests/{user_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 Brand Image
/api/v1/brands/{brand_id}/images/uploadUpload an image to R2 storage. Returns a CDN URL.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/images/upload" \
-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}/images/upload",
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}/images/upload", {
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}/images/upload", 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 Brand Images
/api/v1/brands/{brand_id}/imagesList images uploaded for this brand, newest first.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/images" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/images",
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}/images", {
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}/images", 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()Delete Brand Image
/api/v1/brands/{brand_id}/imagesDelete one uploaded image, if nothing still references it.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X DELETE "https://app.opvs.ai/api/v1/brands/{brand_id}/images" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"DELETE",
"https://app.opvs.ai/api/v1/brands/{brand_id}/images",
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}/images", {
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}/images", 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 Brand Logo
/api/v1/brands/{brand_id}/logoUpload a brand logo to R2 and store the URL in brand_settings.logo_big.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/logo" \
-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}/logo",
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}/logo", {
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}/logo", 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 Docs Domain
/api/v1/brands/{brand_id}/docs-domainGet custom domain configuration for this brand's public docs.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl "https://app.opvs.ai/api/v1/brands/{brand_id}/docs-domain" \
-H "Authorization: Bearer $OPVS_TOKEN"import os
import requests
r = requests.request(
"GET",
"https://app.opvs.ai/api/v1/brands/{brand_id}/docs-domain",
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}/docs-domain", {
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}/docs-domain", 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()Verify Docs Domain
/api/v1/brands/{brand_id}/docs-domain/verifyTrigger DNS verification for the brand's custom domain.
Errors
| Code | When | What to do |
|---|---|---|
| 422 | Validation Error | — |
curl -X POST "https://app.opvs.ai/api/v1/brands/{brand_id}/docs-domain/verify" \
-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}/docs-domain/verify",
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}/docs-domain/verify", {
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}/docs-domain/verify", 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()