Account & setup
Update Boat secrets setup
POST
/
secrets
Update Boat secrets setup
curl --request POST \
--url https://boat.dev/api/v1/secrets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"envContents": "OPENAI_API_KEY=sk-...\nDATABASE_URL=postgres://...",
"secretFiles": [
{
"path": ".config/service-account.json",
"contents": "{\"type\":\"service_account\"}"
}
]
}
'import requests
url = "https://boat.dev/api/v1/secrets"
payload = {
"envContents": "OPENAI_API_KEY=sk-...
DATABASE_URL=postgres://...",
"secretFiles": [
{
"path": ".config/service-account.json",
"contents": "{\"type\":\"service_account\"}"
}
]
}
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({
envContents: 'OPENAI_API_KEY=sk-...\nDATABASE_URL=postgres://...',
secretFiles: [{path: '.config/service-account.json', contents: '{"type":"service_account"}'}]
})
};
fetch('https://boat.dev/api/v1/secrets', 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://boat.dev/api/v1/secrets",
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([
'envContents' => 'OPENAI_API_KEY=sk-...
DATABASE_URL=postgres://...',
'secretFiles' => [
[
'path' => '.config/service-account.json',
'contents' => '{"type":"service_account"}'
]
]
]),
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://boat.dev/api/v1/secrets"
payload := strings.NewReader("{\n \"envContents\": \"OPENAI_API_KEY=sk-...\\nDATABASE_URL=postgres://...\",\n \"secretFiles\": [\n {\n \"path\": \".config/service-account.json\",\n \"contents\": \"{\\\"type\\\":\\\"service_account\\\"}\"\n }\n ]\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://boat.dev/api/v1/secrets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"envContents\": \"OPENAI_API_KEY=sk-...\\nDATABASE_URL=postgres://...\",\n \"secretFiles\": [\n {\n \"path\": \".config/service-account.json\",\n \"contents\": \"{\\\"type\\\":\\\"service_account\\\"}\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://boat.dev/api/v1/secrets")
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 \"envContents\": \"OPENAI_API_KEY=sk-...\\nDATABASE_URL=postgres://...\",\n \"secretFiles\": [\n {\n \"path\": \".config/service-account.json\",\n \"contents\": \"{\\\"type\\\":\\\"service_account\\\"}\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"type": "secrets.updated",
"success": true,
"environmentId": "env_123",
"envContents": "OPENAI_API_KEY=sk-...\n",
"secretFiles": [],
"pushed": {
"updated": 2,
"failed": 0
}
}{
"ok": false,
"type": "sandbox.error",
"status": 401,
"code": "unauthorized",
"message": "Unauthorized",
"error": {
"code": "unauthorized",
"message": "Unauthorized",
"status": 401
},
"requestId": "req_01HX..."
}Authorizations
Boat bearer token in the form boat_.... Service API keys authenticate sandbox operations.
Body
application/json
Full replacement for the sandbox secret setup. Omitted envContents or secretFiles are treated as empty values, and successful updates are pushed to active sandboxes.
Response
Updated secret setup metadata.
Example:
true
Stable success envelope discriminator added by v1.
Show child attributes
Show child attributes
Present on update; counts how many active sandboxes received the new environment.
⌘I
Update Boat secrets setup
curl --request POST \
--url https://boat.dev/api/v1/secrets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"envContents": "OPENAI_API_KEY=sk-...\nDATABASE_URL=postgres://...",
"secretFiles": [
{
"path": ".config/service-account.json",
"contents": "{\"type\":\"service_account\"}"
}
]
}
'import requests
url = "https://boat.dev/api/v1/secrets"
payload = {
"envContents": "OPENAI_API_KEY=sk-...
DATABASE_URL=postgres://...",
"secretFiles": [
{
"path": ".config/service-account.json",
"contents": "{\"type\":\"service_account\"}"
}
]
}
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({
envContents: 'OPENAI_API_KEY=sk-...\nDATABASE_URL=postgres://...',
secretFiles: [{path: '.config/service-account.json', contents: '{"type":"service_account"}'}]
})
};
fetch('https://boat.dev/api/v1/secrets', 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://boat.dev/api/v1/secrets",
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([
'envContents' => 'OPENAI_API_KEY=sk-...
DATABASE_URL=postgres://...',
'secretFiles' => [
[
'path' => '.config/service-account.json',
'contents' => '{"type":"service_account"}'
]
]
]),
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://boat.dev/api/v1/secrets"
payload := strings.NewReader("{\n \"envContents\": \"OPENAI_API_KEY=sk-...\\nDATABASE_URL=postgres://...\",\n \"secretFiles\": [\n {\n \"path\": \".config/service-account.json\",\n \"contents\": \"{\\\"type\\\":\\\"service_account\\\"}\"\n }\n ]\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://boat.dev/api/v1/secrets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"envContents\": \"OPENAI_API_KEY=sk-...\\nDATABASE_URL=postgres://...\",\n \"secretFiles\": [\n {\n \"path\": \".config/service-account.json\",\n \"contents\": \"{\\\"type\\\":\\\"service_account\\\"}\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://boat.dev/api/v1/secrets")
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 \"envContents\": \"OPENAI_API_KEY=sk-...\\nDATABASE_URL=postgres://...\",\n \"secretFiles\": [\n {\n \"path\": \".config/service-account.json\",\n \"contents\": \"{\\\"type\\\":\\\"service_account\\\"}\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"type": "secrets.updated",
"success": true,
"environmentId": "env_123",
"envContents": "OPENAI_API_KEY=sk-...\n",
"secretFiles": [],
"pushed": {
"updated": 2,
"failed": 0
}
}{
"ok": false,
"type": "sandbox.error",
"status": 401,
"code": "unauthorized",
"message": "Unauthorized",
"error": {
"code": "unauthorized",
"message": "Unauthorized",
"status": 401
},
"requestId": "req_01HX..."
}