curl --request POST \
--url https://api.platform.dakota.xyz/policies/{policy_id}/rules \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"signatures": [
"LS0tLS1CRUdJ...0tLS0tCg=="
],
"intent": {
"type": "add_policy_rule",
"policy_id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"rule_type": "approval_threshold",
"action": "deny",
"definition": {
"threshold": 2,
"description": "Require 2 approvals"
},
"idempotency_key": "idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT"
}
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
signatures: ['LS0tLS1CRUdJ...0tLS0tCg=='],
intent: {
type: 'add_policy_rule',
policy_id: 'pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT',
rule_type: 'approval_threshold',
action: 'deny',
definition: {threshold: 2, description: 'Require 2 approvals'},
idempotency_key: 'idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT'
}
})
};
fetch('https://api.platform.dakota.xyz/policies/{policy_id}/rules', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.platform.dakota.xyz/policies/{policy_id}/rules"
payload = {
"signatures": ["LS0tLS1CRUdJ...0tLS0tCg=="],
"intent": {
"type": "add_policy_rule",
"policy_id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"rule_type": "approval_threshold",
"action": "deny",
"definition": {
"threshold": 2,
"description": "Require 2 approvals"
},
"idempotency_key": "idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT"
}
}
headers = {
"x-idempotency-key": "<x-idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.platform.dakota.xyz/policies/{policy_id}/rules"
payload := strings.NewReader("{\n \"signatures\": [\n \"LS0tLS1CRUdJ...0tLS0tCg==\"\n ],\n \"intent\": {\n \"type\": \"add_policy_rule\",\n \"policy_id\": \"pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT\",\n \"rule_type\": \"approval_threshold\",\n \"action\": \"deny\",\n \"definition\": {\n \"threshold\": 2,\n \"description\": \"Require 2 approvals\"\n },\n \"idempotency_key\": \"idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-idempotency-key", "<x-idempotency-key>")
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))
}{
"id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"client_id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"signer_group_id": "grp_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"version": 1,
"name": "High Value Transaction Policy",
"description": "Requires approval for transactions above $10,000",
"rules": [
{
"id": "rule_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"policy_id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"rule_type": "amount_threshold",
"action": "deny",
"definition": {
"min_amount": 10000000000,
"threshold": 2,
"asset": {
"id": "USDC"
}
},
"created_at": 1640995200
}
],
"created_at": 1640995200,
"updated_at": 1640995200
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-request",
"title": "Invalid request",
"status": 400,
"detail": "Invalid request",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#authentication-error",
"title": "Unauthorized",
"status": 401,
"detail": "Unauthorized",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#forbidden",
"title": "Forbidden",
"status": 403,
"detail": "Forbidden",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Policy not found",
"status": 404,
"detail": "Policy not found",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-implemented",
"title": "Not implemented",
"status": 501,
"detail": "Not implemented",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#internal-error",
"title": "Unexpected error",
"status": 500,
"detail": "Unexpected error",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}Add a new rule to a policy
Creates a new rule under the specified policy.
curl --request POST \
--url https://api.platform.dakota.xyz/policies/{policy_id}/rules \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"signatures": [
"LS0tLS1CRUdJ...0tLS0tCg=="
],
"intent": {
"type": "add_policy_rule",
"policy_id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"rule_type": "approval_threshold",
"action": "deny",
"definition": {
"threshold": 2,
"description": "Require 2 approvals"
},
"idempotency_key": "idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT"
}
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
signatures: ['LS0tLS1CRUdJ...0tLS0tCg=='],
intent: {
type: 'add_policy_rule',
policy_id: 'pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT',
rule_type: 'approval_threshold',
action: 'deny',
definition: {threshold: 2, description: 'Require 2 approvals'},
idempotency_key: 'idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT'
}
})
};
fetch('https://api.platform.dakota.xyz/policies/{policy_id}/rules', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.platform.dakota.xyz/policies/{policy_id}/rules"
payload = {
"signatures": ["LS0tLS1CRUdJ...0tLS0tCg=="],
"intent": {
"type": "add_policy_rule",
"policy_id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"rule_type": "approval_threshold",
"action": "deny",
"definition": {
"threshold": 2,
"description": "Require 2 approvals"
},
"idempotency_key": "idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT"
}
}
headers = {
"x-idempotency-key": "<x-idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.platform.dakota.xyz/policies/{policy_id}/rules"
payload := strings.NewReader("{\n \"signatures\": [\n \"LS0tLS1CRUdJ...0tLS0tCg==\"\n ],\n \"intent\": {\n \"type\": \"add_policy_rule\",\n \"policy_id\": \"pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT\",\n \"rule_type\": \"approval_threshold\",\n \"action\": \"deny\",\n \"definition\": {\n \"threshold\": 2,\n \"description\": \"Require 2 approvals\"\n },\n \"idempotency_key\": \"idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-idempotency-key", "<x-idempotency-key>")
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))
}{
"id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"client_id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi",
"signer_group_id": "grp_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"version": 1,
"name": "High Value Transaction Policy",
"description": "Requires approval for transactions above $10,000",
"rules": [
{
"id": "rule_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"policy_id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"rule_type": "amount_threshold",
"action": "deny",
"definition": {
"min_amount": 10000000000,
"threshold": 2,
"asset": {
"id": "USDC"
}
},
"created_at": 1640995200
}
],
"created_at": 1640995200,
"updated_at": 1640995200
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-request",
"title": "Invalid request",
"status": 400,
"detail": "Invalid request",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#authentication-error",
"title": "Unauthorized",
"status": 401,
"detail": "Unauthorized",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#forbidden",
"title": "Forbidden",
"status": 403,
"detail": "Forbidden",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Policy not found",
"status": 404,
"detail": "Policy not found",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-implemented",
"title": "Not implemented",
"status": 501,
"detail": "Not implemented",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#internal-error",
"title": "Unexpected error",
"status": 500,
"detail": "Unexpected error",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}Authorizations
Headers
Unique key to ensure request idempotency. If the same key is used within a certain time window, the original response will be returned instead of executing the request again.
Path Parameters
Unique identifier of the policy
Body
List of signatures over the intent
Cryptographic signature over the intent, base64-encoded. For an ES256 signer this is the ASN.1 DER ECDSA signature over the SHA-256 of the canonical intent. For a WEBAUTHN signer this is the base64 of the WebAuthn assertion JSON (id, rawId, type, and response.authenticatorData / clientDataJSON / signature). See the WebAuthn & Passkey Signing guide.
The intent being endorsed
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
Show child attributes
Show child attributes
Response
Policy rule created successfully
Unique identifier for the policy
"pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT"
Version number of the policy (incremented on rule changes)
1
Human-readable name for the policy
"High Value Transaction Policy"
Unix timestamp when the policy was created
1640995200
Unix timestamp when the policy was last updated
1640995200
KSUID is a 27-character globally unique ID that combines a timestamp with a random component. Used for all entity identifiers in the Dakota platform.
27^[0-9A-Za-z]{27}$"1NFHrqBHb3cTfLVkFSGmHZqdDPi"
ID of the signer group that governs mutations of this policy. Members of this group must endorse any add_policy_rule, update_policy_rule, remove_policy_rule, or delete_policy intent.
"grp_2N4YkKpKu7M3mKpGYmF8kcJ8oZT"
Optional description of the policy's purpose
"Requires approval for transactions above $10,000"
Rules that make up this policy
Show child attributes
Show child attributes
Was this page helpful?

