Создать категорию разметки
Админ создаёт тип разметки (категорию) с типизированными полями. key категории/полей — стабильные слаги (иммутабельны). Доступ и аппруверы настраиваются отдельными ручками.
curl -X POST "https://policy-engine-rest.ezig.workers.dev/api/v1/vaults/demo_vault/operation-categories" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"key": "virt_asset_sale",
"name": "John Doe",
"description": "example_string",
"emoji": "example_string",
"color": "example_string",
"appliesTo": "transfer",
"viewScope": "owner_only",
"assignScope": "owner_only",
"editScope": "owner_only",
"approvalScope": "none",
"approvalThreshold": 42,
"allowInitiatorApproval": true,
"fields": [
{
"key": "sale_rate",
"label": "example_string",
"type": "text",
"required": true,
"optionsJson": [
{
"value": "example_string",
"label": "example_string"
}
],
"scale": 42,
"currencyFieldKey": "ticker",
"unit": "example_string",
"defaultJson": "null",
"helpText": "example_string",
"sensitive": true,
"orderIndex": 42
}
]
}'
import requests
import json
url = "https://policy-engine-rest.ezig.workers.dev/api/v1/vaults/demo_vault/operation-categories"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
data = {
"key": "virt_asset_sale",
"name": "John Doe",
"description": "example_string",
"emoji": "example_string",
"color": "example_string",
"appliesTo": "transfer",
"viewScope": "owner_only",
"assignScope": "owner_only",
"editScope": "owner_only",
"approvalScope": "none",
"approvalThreshold": 42,
"allowInitiatorApproval": true,
"fields": [
{
"key": "sale_rate",
"label": "example_string",
"type": "text",
"required": true,
"optionsJson": [
{
"value": "example_string",
"label": "example_string"
}
],
"scale": 42,
"currencyFieldKey": "ticker",
"unit": "example_string",
"defaultJson": "null",
"helpText": "example_string",
"sensitive": true,
"orderIndex": 42
}
]
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://policy-engine-rest.ezig.workers.dev/api/v1/vaults/demo_vault/operation-categories", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
},
body: JSON.stringify({
"key": "virt_asset_sale",
"name": "John Doe",
"description": "example_string",
"emoji": "example_string",
"color": "example_string",
"appliesTo": "transfer",
"viewScope": "owner_only",
"assignScope": "owner_only",
"editScope": "owner_only",
"approvalScope": "none",
"approvalThreshold": 42,
"allowInitiatorApproval": true,
"fields": [
{
"key": "sale_rate",
"label": "example_string",
"type": "text",
"required": true,
"optionsJson": [
{
"value": "example_string",
"label": "example_string"
}
],
"scale": 42,
"currencyFieldKey": "ticker",
"unit": "example_string",
"defaultJson": "null",
"helpText": "example_string",
"sensitive": true,
"orderIndex": 42
}
]
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"key": "virt_asset_sale",
"name": "John Doe",
"description": "example_string",
"emoji": "example_string",
"color": "example_string",
"appliesTo": "transfer",
"viewScope": "owner_only",
"assignScope": "owner_only",
"editScope": "owner_only",
"approvalScope": "none",
"approvalThreshold": 42,
"allowInitiatorApproval": true,
"fields": [
{
"key": "sale_rate",
"label": "example_string",
"type": "text",
"required": true,
"optionsJson": [
{
"value": "example_string",
"label": "example_string"
}
],
"scale": 42,
"currencyFieldKey": "ticker",
"unit": "example_string",
"defaultJson": "null",
"helpText": "example_string",
"sensitive": true,
"orderIndex": 42
}
]
}`)
req, err := http.NewRequest("POST", "https://policy-engine-rest.ezig.workers.dev/api/v1/vaults/demo_vault/operation-categories", bytes.NewBuffer(data))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://policy-engine-rest.ezig.workers.dev/api/v1/vaults/demo_vault/operation-categories')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
request.body = '{
"key": "virt_asset_sale",
"name": "John Doe",
"description": "example_string",
"emoji": "example_string",
"color": "example_string",
"appliesTo": "transfer",
"viewScope": "owner_only",
"assignScope": "owner_only",
"editScope": "owner_only",
"approvalScope": "none",
"approvalThreshold": 42,
"allowInitiatorApproval": true,
"fields": [
{
"key": "sale_rate",
"label": "example_string",
"type": "text",
"required": true,
"optionsJson": [
{
"value": "example_string",
"label": "example_string"
}
],
"scale": 42,
"currencyFieldKey": "ticker",
"unit": "example_string",
"defaultJson": "null",
"helpText": "example_string",
"sensitive": true,
"orderIndex": 42
}
]
}'
response = http.request(request)
puts response.body
{
"id": "cmr3f41z20001psp7phmyapw3",
"vaultId": "example_string",
"key": "example_string",
"name": "John Doe",
"description": "example_string",
"emoji": "example_string",
"color": "example_string",
"appliesTo": "transfer",
"viewScope": "owner_only",
"assignScope": "owner_only",
"editScope": "owner_only",
"approvalScope": "none",
"approvalThreshold": 42,
"allowInitiatorApproval": true,
"isSystem": true,
"archived": true,
"version": 42,
"createdById": "example_string",
"updatedById": "example_string",
"createdAt": "2026-07-02T11:25:15.134Z",
"updatedAt": "2026-07-02T11:25:15.134Z",
"fields": [
{
"id": "cmr3f41z20001psp7phmyapw3",
"categoryId": "example_string",
"key": "example_string",
"label": "example_string",
"type": "text",
"required": true,
"optionsJson": [
{
"value": "example_string",
"label": "example_string"
}
],
"scale": 42,
"currencyFieldKey": "example_string",
"unit": "example_string",
"defaultJson": "null",
"helpText": "example_string",
"sensitive": true,
"orderIndex": 42,
"archived": true,
"createdAt": "2026-07-02T11:25:15.134Z",
"updatedAt": "2026-07-02T11:25:15.134Z"
}
],
"grants": [
{
"id": "cmr3f41z20001psp7phmyapw3",
"vaultId": "example_string",
"categoryId": "example_string",
"subjectType": "user",
"subjectUserId": "example_string",
"subjectGroupId": "example_string",
"canView": true,
"canAssign": true,
"canEdit": true,
"grantorId": "example_string",
"status": "example_string",
"createdAt": "2026-07-02T11:25:15.134Z"
}
],
"approvers": [
{
"id": "cmr3f41z20001psp7phmyapw3",
"categoryId": "example_string",
"kind": "user",
"userId": "example_string",
"groupId": "example_string",
"createdAt": "2026-07-02T11:25:15.134Z"
}
]
}
{
"error": "Bad Request",
"message": "The request contains invalid parameters or malformed data",
"code": 400,
"details": [
{
"field": "email",
"message": "Invalid email format"
}
]
}
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"error": "Not Found",
"message": "The requested resource was not found",
"code": 404
}
{
"error": "Conflict",
"message": "The request conflicts with the current state of the resource",
"code": 409,
"details": "Resource already exists"
}
{
"error": "Internal Server Error",
"message": "An unexpected error occurred on the server",
"code": 500,
"requestId": "req_1234567890"
}
POST
/api/v1/vaults/{code}/operation-categoriesPOST
Base URLstring
Target server for requests. Edit to use your own host.
Bearer Token
Bearer Tokenstring
Requiredbetter-auth session token. Мобилка/сервисы. Веб использует cookie.
better-auth session token. Мобилка/сервисы. Веб использует cookie.
API Key (cookie: better-auth.session_token)
better-auth.session_tokenstring
RequiredAPI key (sent in cookie)
path
codestring
RequiredУникальный код Vault'а (slug)
Content-Typestring
RequiredThe media type of the request body
Options: application/json
keystring
RequiredСтабильный слаг категории (иммутабелен)
Min length: 1 • Max length: 64 • Pattern: ^[a-z][a-z0-9_]*$
namestring
RequiredMin length: 1 • Max length: 200
descriptionstring
Max length: 1000
emojistring
Min length: 1 • Max length: 16
colorstring
Pattern: ^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$
appliesTostring
Options: transfer, deposit, both
viewScopestring
Options: owner_only, vault_members, restricted
assignScopestring
Options: owner_only, vault_members, restricted
editScopestring
Options: owner_only, vault_members, restricted
approvalScopestring
Options: none, edit, assign_and_edit
Request Preview
Response
Response will appear here after sending the request
Authentication
header
Authorizationstring
RequiredBearer token. better-auth session token. Мобилка/сервисы. Веб использует cookie.
path
parameterstring
RequiredAPI Key for authentication. Provide your API key in the cookie.
Path Parameters
Body
application/json
appliesTostring
Allowed values:
transferdepositbothviewScopestring
Allowed values:
owner_onlyvault_membersrestrictedassignScopestring
Allowed values:
owner_onlyvault_membersrestrictededitScopestring
Allowed values:
owner_onlyvault_membersrestrictedapprovalScopestring
Allowed values:
noneeditassign_and_editResponses
Was this page helpful?