Install template
curl --request POST \
--url https://boardy.worksong.ai/v1/templates/install \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"workspaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"includeSampleData": false,
"includeDashboard": true,
"includeAgent": true,
"templateId": "<string>"
}
'import requests
url = "https://boardy.worksong.ai/v1/templates/install"
payload = {
"workspaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"includeSampleData": False,
"includeDashboard": True,
"includeAgent": True,
"templateId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
workspaceId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
includeSampleData: false,
includeDashboard: true,
includeAgent: true,
templateId: '<string>'
})
};
fetch('https://boardy.worksong.ai/v1/templates/install', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://boardy.worksong.ai/v1/templates/install",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'workspaceId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'includeSampleData' => false,
'includeDashboard' => true,
'includeAgent' => true,
'templateId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://boardy.worksong.ai/v1/templates/install"
payload := strings.NewReader("{\n \"workspaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"includeSampleData\": false,\n \"includeDashboard\": true,\n \"includeAgent\": true,\n \"templateId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://boardy.worksong.ai/v1/templates/install")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"workspaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"includeSampleData\": false,\n \"includeDashboard\": true,\n \"includeAgent\": true,\n \"templateId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://boardy.worksong.ai/v1/templates/install")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"workspaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"includeSampleData\": false,\n \"includeDashboard\": true,\n \"includeAgent\": true,\n \"templateId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"templateId": "<string>",
"workspaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"boards": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"dashboards": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"docs": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"forms": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"agents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"skipped": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}Templates
Install template
POST
/
v1
/
templates
/
install
Install template
curl --request POST \
--url https://boardy.worksong.ai/v1/templates/install \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"workspaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"includeSampleData": false,
"includeDashboard": true,
"includeAgent": true,
"templateId": "<string>"
}
'import requests
url = "https://boardy.worksong.ai/v1/templates/install"
payload = {
"workspaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"includeSampleData": False,
"includeDashboard": True,
"includeAgent": True,
"templateId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
workspaceId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
includeSampleData: false,
includeDashboard: true,
includeAgent: true,
templateId: '<string>'
})
};
fetch('https://boardy.worksong.ai/v1/templates/install', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://boardy.worksong.ai/v1/templates/install",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'workspaceId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'includeSampleData' => false,
'includeDashboard' => true,
'includeAgent' => true,
'templateId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://boardy.worksong.ai/v1/templates/install"
payload := strings.NewReader("{\n \"workspaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"includeSampleData\": false,\n \"includeDashboard\": true,\n \"includeAgent\": true,\n \"templateId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://boardy.worksong.ai/v1/templates/install")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"workspaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"includeSampleData\": false,\n \"includeDashboard\": true,\n \"includeAgent\": true,\n \"templateId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://boardy.worksong.ai/v1/templates/install")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"workspaceId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"includeSampleData\": false,\n \"includeDashboard\": true,\n \"includeAgent\": true,\n \"templateId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"templateId": "<string>",
"workspaceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"boards": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"dashboards": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"docs": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"forms": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"agents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"skipped": [
"<string>"
]
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}{
"type": "<string>",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>"
}Authorizations
clerkSessionapiToken
Clerk session JWT (deployments with Clerk auth) — validated per request (issuer + signature + lifetime + authorized-party). The internal Boardy tenant/member are resolved from the token's ACTIVE Clerk organization (org_id) → the Boardy tenant it maps to → this user's member in that tenant (#356). A token with no active organization is rejected; production never trusts spoofable X-Tenant-Id/X-Member-Id headers. The same normalized context backs the SPA, this OpenAPI surface, and MCP.
Headers
AD-5 idempotency: a repeated mutation with the same key replays the prior result (no double-apply).
Body
application/json
Response
Created
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes