curl --request PATCH \
--url https://api.platform.dakota.xyz/policies/{policy_id}/rules/{rule_id} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"signatures": [
"LS0tLS1CRUdJ...0tLS0tCg=="
],
"intent": {
"type": "update_policy_rule",
"policy_id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"rule_id": "rule_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"updated_definition": "{\"min_amount\": 100, \"threshold\": 1, \"asset\": {\"id\": \"USDC\"}}",
"idempotency_key": "idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT"
}
}
'const options = {
method: 'PATCH',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
signatures: ['LS0tLS1CRUdJ...0tLS0tCg=='],
intent: {
type: 'update_policy_rule',
policy_id: 'pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT',
rule_id: 'rule_2N4YkKpKu7M3mKpGYmF8kcJ8oZT',
updated_definition: '{"min_amount": 100, "threshold": 1, "asset": {"id": "USDC"}}',
idempotency_key: 'idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT'
}
})
};
fetch('https://api.platform.dakota.xyz/policies/{policy_id}/rules/{rule_id}', 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/{rule_id}"
payload = {
"signatures": ["LS0tLS1CRUdJ...0tLS0tCg=="],
"intent": {
"type": "update_policy_rule",
"policy_id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"rule_id": "rule_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"updated_definition": "{\"min_amount\": 100, \"threshold\": 1, \"asset\": {\"id\": \"USDC\"}}",
"idempotency_key": "idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT"
}
}
headers = {
"x-idempotency-key": "<x-idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(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/{rule_id}"
payload := strings.NewReader("{\n \"signatures\": [\n \"LS0tLS1CRUdJ...0tLS0tCg==\"\n ],\n \"intent\": {\n \"type\": \"update_policy_rule\",\n \"policy_id\": \"pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT\",\n \"rule_id\": \"rule_2N4YkKpKu7M3mKpGYmF8kcJ8oZT\",\n \"updated_definition\": \"{\\\"min_amount\\\": 100, \\\"threshold\\\": 1, \\\"asset\\\": {\\\"id\\\": \\\"USDC\\\"}}\",\n \"idempotency_key\": \"idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT\"\n }\n}")
req, _ := http.NewRequest("PATCH", 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/example-id",
"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/example-id",
"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/example-id",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Policy or rule not found",
"status": 404,
"detail": "Policy or rule not found",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules/example-id",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Customer Not Found",
"status": 404,
"detail": "Customer cst_2abc123 was not found in your organization.",
"instance": "https://api.platform.dakota.xyz/customers/cst_2abc123",
"request_id": "req_7f3a8b2c"
}{
"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/example-id",
"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/example-id",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}Update an existing rule
Updates an existing policy rule identified by rule_id.
curl --request PATCH \
--url https://api.platform.dakota.xyz/policies/{policy_id}/rules/{rule_id} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"signatures": [
"LS0tLS1CRUdJ...0tLS0tCg=="
],
"intent": {
"type": "update_policy_rule",
"policy_id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"rule_id": "rule_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"updated_definition": "{\"min_amount\": 100, \"threshold\": 1, \"asset\": {\"id\": \"USDC\"}}",
"idempotency_key": "idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT"
}
}
'const options = {
method: 'PATCH',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
signatures: ['LS0tLS1CRUdJ...0tLS0tCg=='],
intent: {
type: 'update_policy_rule',
policy_id: 'pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT',
rule_id: 'rule_2N4YkKpKu7M3mKpGYmF8kcJ8oZT',
updated_definition: '{"min_amount": 100, "threshold": 1, "asset": {"id": "USDC"}}',
idempotency_key: 'idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT'
}
})
};
fetch('https://api.platform.dakota.xyz/policies/{policy_id}/rules/{rule_id}', 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/{rule_id}"
payload = {
"signatures": ["LS0tLS1CRUdJ...0tLS0tCg=="],
"intent": {
"type": "update_policy_rule",
"policy_id": "pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"rule_id": "rule_2N4YkKpKu7M3mKpGYmF8kcJ8oZT",
"updated_definition": "{\"min_amount\": 100, \"threshold\": 1, \"asset\": {\"id\": \"USDC\"}}",
"idempotency_key": "idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT"
}
}
headers = {
"x-idempotency-key": "<x-idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(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/{rule_id}"
payload := strings.NewReader("{\n \"signatures\": [\n \"LS0tLS1CRUdJ...0tLS0tCg==\"\n ],\n \"intent\": {\n \"type\": \"update_policy_rule\",\n \"policy_id\": \"pol_2N4YkKpKu7M3mKpGYmF8kcJ8oZT\",\n \"rule_id\": \"rule_2N4YkKpKu7M3mKpGYmF8kcJ8oZT\",\n \"updated_definition\": \"{\\\"min_amount\\\": 100, \\\"threshold\\\": 1, \\\"asset\\\": {\\\"id\\\": \\\"USDC\\\"}}\",\n \"idempotency_key\": \"idem_2N4YkKpKu7M3mKpGYmF8kcJ8oZT\"\n }\n}")
req, _ := http.NewRequest("PATCH", 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/example-id",
"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/example-id",
"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/example-id",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Policy or rule not found",
"status": 404,
"detail": "Policy or rule not found",
"instance": "https://api.platform.dakota.xyz/policies/example-id/rules/example-id",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Customer Not Found",
"status": 404,
"detail": "Customer cst_2abc123 was not found in your organization.",
"instance": "https://api.platform.dakota.xyz/customers/cst_2abc123",
"request_id": "req_7f3a8b2c"
}{
"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/example-id",
"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/example-id",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}Authorizations
Headers
Unique key (UUID) to ensure request idempotency on POST, PUT and PATCH requests.
A key is scoped to your client, the HTTP method and the path, and is remembered for 24 hours after a
successful (below 400) response. Repeating the same request (same JSON body, whatever the key order or
whitespace) with the same key within that window returns the original response with
X-Idempotent-Replayed: true instead of executing the request again. Using the same key on the same
endpoint with a different body returns 422 with problem type idempotency-key-reused; the request is
not executed. Error responses (4xx and 5xx) are not remembered, so a request refused for a fixable reason
can be corrected and retried under the same key. Request bodies that are not JSON (for example file
uploads) are not compared.
Path Parameters
Unique identifier of the policy
Unique identifier of the rule
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 updated 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?

