curl --request POST \
--url https://odyssey.asteroid.ai/agents/v2/secrets \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"name": "<string>",
"values": [
{
"key": "<string>",
"value": "<string>"
}
],
"fields": [
{
"label": "<string>",
"required": true,
"hint": "<string>"
}
],
"itemKey": "<string>",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"templateId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://odyssey.asteroid.ai/agents/v2/secrets"
payload = {
"name": "<string>",
"values": [
{
"key": "<string>",
"value": "<string>"
}
],
"fields": [
{
"label": "<string>",
"required": True,
"hint": "<string>"
}
],
"itemKey": "<string>",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"templateId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
values: [{key: '<string>', value: '<string>'}],
fields: [{label: '<string>', required: true, hint: '<string>'}],
itemKey: '<string>',
organizationId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
templateId: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://odyssey.asteroid.ai/agents/v2/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://odyssey.asteroid.ai/agents/v2/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([
'name' => '<string>',
'values' => [
[
'key' => '<string>',
'value' => '<string>'
]
],
'fields' => [
[
'label' => '<string>',
'required' => true,
'hint' => '<string>'
]
],
'itemKey' => '<string>',
'organizationId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'templateId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$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://odyssey.asteroid.ai/agents/v2/secrets"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"values\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"fields\": [\n {\n \"label\": \"<string>\",\n \"required\": true,\n \"hint\": \"<string>\"\n }\n ],\n \"itemKey\": \"<string>\",\n \"organizationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"templateId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
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://odyssey.asteroid.ai/agents/v2/secrets")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"values\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"fields\": [\n {\n \"label\": \"<string>\",\n \"required\": true,\n \"hint\": \"<string>\"\n }\n ],\n \"itemKey\": \"<string>\",\n \"organizationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"templateId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://odyssey.asteroid.ai/agents/v2/secrets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"values\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"fields\": [\n {\n \"label\": \"<string>\",\n \"required\": true,\n \"hint\": \"<string>\"\n }\n ],\n \"itemKey\": \"<string>\",\n \"organizationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"templateId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"createdAt": "2023-11-07T05:31:56Z",
"fields": [
{
"key": "<string>",
"label": "<string>",
"required": true,
"type": "username",
"valueUpdatedAt": "2023-11-07T05:31:56Z",
"hint": "<string>",
"legacyName": "<string>",
"readableValue": "<string>"
}
],
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"itemKey": "<string>",
"kind": "login",
"name": "<string>",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"updatedAt": "2023-11-07T05:31:56Z",
"actor": {
"id": "<string>",
"kind": "person"
},
"createdBy": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"lastRotatedAt": "2023-11-07T05:31:56Z",
"lastRotatedBy": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"lastUsedAt": "2023-11-07T05:31:56Z",
"templateId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"code": 400,
"message": "<string>",
"detail": "<string>",
"errors": [
{
"detail": "<string>",
"parameter": "<string>"
}
],
"instance": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}{
"code": 401,
"message": "<string>",
"detail": "<string>",
"instance": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}{
"code": 403,
"message": "<string>",
"capability": "<string>",
"detail": "<string>",
"instance": "<string>",
"reason": "capability_required",
"status": 123,
"title": "<string>",
"type": "<string>"
}{
"code": 404,
"message": "<string>",
"detail": "<string>",
"instance": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}{
"code": 409,
"message": "<string>",
"detail": "<string>",
"instance": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}{
"code": 500,
"message": "<string>",
"detail": "<string>",
"instance": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}Create Secret
Create a secret. The item key is derived from name unless itemKey is given. Secret values go to WorkOS; Postgres stores metadata and readable values only.
curl --request POST \
--url https://odyssey.asteroid.ai/agents/v2/secrets \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"name": "<string>",
"values": [
{
"key": "<string>",
"value": "<string>"
}
],
"fields": [
{
"label": "<string>",
"required": true,
"hint": "<string>"
}
],
"itemKey": "<string>",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"templateId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://odyssey.asteroid.ai/agents/v2/secrets"
payload = {
"name": "<string>",
"values": [
{
"key": "<string>",
"value": "<string>"
}
],
"fields": [
{
"label": "<string>",
"required": True,
"hint": "<string>"
}
],
"itemKey": "<string>",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"templateId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
values: [{key: '<string>', value: '<string>'}],
fields: [{label: '<string>', required: true, hint: '<string>'}],
itemKey: '<string>',
organizationId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
templateId: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://odyssey.asteroid.ai/agents/v2/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://odyssey.asteroid.ai/agents/v2/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([
'name' => '<string>',
'values' => [
[
'key' => '<string>',
'value' => '<string>'
]
],
'fields' => [
[
'label' => '<string>',
'required' => true,
'hint' => '<string>'
]
],
'itemKey' => '<string>',
'organizationId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'templateId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$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://odyssey.asteroid.ai/agents/v2/secrets"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"values\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"fields\": [\n {\n \"label\": \"<string>\",\n \"required\": true,\n \"hint\": \"<string>\"\n }\n ],\n \"itemKey\": \"<string>\",\n \"organizationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"templateId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
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://odyssey.asteroid.ai/agents/v2/secrets")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"values\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"fields\": [\n {\n \"label\": \"<string>\",\n \"required\": true,\n \"hint\": \"<string>\"\n }\n ],\n \"itemKey\": \"<string>\",\n \"organizationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"templateId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://odyssey.asteroid.ai/agents/v2/secrets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"values\": [\n {\n \"key\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"fields\": [\n {\n \"label\": \"<string>\",\n \"required\": true,\n \"hint\": \"<string>\"\n }\n ],\n \"itemKey\": \"<string>\",\n \"organizationId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"templateId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body{
"createdAt": "2023-11-07T05:31:56Z",
"fields": [
{
"key": "<string>",
"label": "<string>",
"required": true,
"type": "username",
"valueUpdatedAt": "2023-11-07T05:31:56Z",
"hint": "<string>",
"legacyName": "<string>",
"readableValue": "<string>"
}
],
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"itemKey": "<string>",
"kind": "login",
"name": "<string>",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"updatedAt": "2023-11-07T05:31:56Z",
"actor": {
"id": "<string>",
"kind": "person"
},
"createdBy": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"lastRotatedAt": "2023-11-07T05:31:56Z",
"lastRotatedBy": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"lastUsedAt": "2023-11-07T05:31:56Z",
"templateId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"code": 400,
"message": "<string>",
"detail": "<string>",
"errors": [
{
"detail": "<string>",
"parameter": "<string>"
}
],
"instance": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}{
"code": 401,
"message": "<string>",
"detail": "<string>",
"instance": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}{
"code": 403,
"message": "<string>",
"capability": "<string>",
"detail": "<string>",
"instance": "<string>",
"reason": "capability_required",
"status": 123,
"title": "<string>",
"type": "<string>"
}{
"code": 404,
"message": "<string>",
"detail": "<string>",
"instance": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}{
"code": 409,
"message": "<string>",
"detail": "<string>",
"instance": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}{
"code": 500,
"message": "<string>",
"detail": "<string>",
"instance": "<string>",
"status": 123,
"title": "<string>",
"type": "<string>"
}Authorizations
Headers
A key unique within the organization. Reusing it returns the secret already created with that key instead of creating a second one.
Body
1 - 200Field values as key/value pairs.
Show child attributes
Show child attributes
Inline field blueprint. Required when templateId is omitted.
Show child attributes
Show child attributes
Optional UPPER_SNAKE key. Derived from name when omitted.
1 - 64^[A-Z0-9]+(?:_[A-Z0-9]+)*$Required when templateId is omitted.
login, api_key, card, custom The organization. Defaults to the one organization the caller acts in, such as an API key's. Required when the caller belongs to several.
Org template to snapshot. Mutually exclusive with kind and fields.
Response
The request has succeeded and a new resource has been created as a result.
A vault item. Secret values live in WorkOS and never appear here.
Show child attributes
Show child attributes
UPPER_SNAKE key. Derived from name when omitted on create. Stays the same across renames. Unique among a profile's attached items, not across the organisation.
1 - 64^[A-Z0-9]+(?:_[A-Z0-9]+)*$Kind of vault item. Templates and items need at least one field. Completeness is per-field required.
login, api_key, card, custom 1 - 200Who made it. createdBy holds a user id only, so read this for a record an API key made.
Show child attributes
Show child attributes
Template snapshotted at create. Provenance only.

