Create a Vault
Creates a Vault with its full derivation structure in a single request. The RouteMap must contain the special "network" key (its variants are upserted into the global Network registry by coinType). The other segments become Routes: order is normalized from 0 in the order of the source values. The Vault is created in draft status (lockedAt = null). D1 doesn't support transactions, so on a partial failure a best-effort cleanup is performed.
curl -X POST "https://policy-engine-rest.ezig.workers.dev/api/v1/vaults" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"vault": {
"code": "acme-otc",
"name": "ACME OTC",
"description": "example_string",
"walletServiceUrl": "https://wallet.example.com"
},
"routes": {
"network": {
"order": 0,
"name": "Network",
"dynamic": false,
"variants": [
{
"id": 195,
"code": "tron_network",
"name": "Tron"
}
]
},
"index": {
"order": 1,
"name": "Index",
"dynamic": true
},
"asset": {
"order": 2,
"name": "Asset",
"dynamic": false,
"variants": [
{
"id": 0,
"code": "a7a5",
"name": "A7A5"
},
{
"id": 1,
"code": "usdt",
"name": "USDT"
}
]
}
}
}'
import requests
import json
url = "https://policy-engine-rest.ezig.workers.dev/api/v1/vaults"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
data = {
"vault": {
"code": "acme-otc",
"name": "ACME OTC",
"description": "example_string",
"walletServiceUrl": "https://wallet.example.com"
},
"routes": {
"network": {
"order": 0,
"name": "Network",
"dynamic": false,
"variants": [
{
"id": 195,
"code": "tron_network",
"name": "Tron"
}
]
},
"index": {
"order": 1,
"name": "Index",
"dynamic": true
},
"asset": {
"order": 2,
"name": "Asset",
"dynamic": false,
"variants": [
{
"id": 0,
"code": "a7a5",
"name": "A7A5"
},
{
"id": 1,
"code": "usdt",
"name": "USDT"
}
]
}
}
}
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", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
},
body: JSON.stringify({
"vault": {
"code": "acme-otc",
"name": "ACME OTC",
"description": "example_string",
"walletServiceUrl": "https://wallet.example.com"
},
"routes": {
"network": {
"order": 0,
"name": "Network",
"dynamic": false,
"variants": [
{
"id": 195,
"code": "tron_network",
"name": "Tron"
}
]
},
"index": {
"order": 1,
"name": "Index",
"dynamic": true
},
"asset": {
"order": 2,
"name": "Asset",
"dynamic": false,
"variants": [
{
"id": 0,
"code": "a7a5",
"name": "A7A5"
},
{
"id": 1,
"code": "usdt",
"name": "USDT"
}
]
}
}
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"vault": {
"code": "acme-otc",
"name": "ACME OTC",
"description": "example_string",
"walletServiceUrl": "https://wallet.example.com"
},
"routes": {
"network": {
"order": 0,
"name": "Network",
"dynamic": false,
"variants": [
{
"id": 195,
"code": "tron_network",
"name": "Tron"
}
]
},
"index": {
"order": 1,
"name": "Index",
"dynamic": true
},
"asset": {
"order": 2,
"name": "Asset",
"dynamic": false,
"variants": [
{
"id": 0,
"code": "a7a5",
"name": "A7A5"
},
{
"id": 1,
"code": "usdt",
"name": "USDT"
}
]
}
}
}`)
req, err := http.NewRequest("POST", "https://policy-engine-rest.ezig.workers.dev/api/v1/vaults", 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')
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 = '{
"vault": {
"code": "acme-otc",
"name": "ACME OTC",
"description": "example_string",
"walletServiceUrl": "https://wallet.example.com"
},
"routes": {
"network": {
"order": 0,
"name": "Network",
"dynamic": false,
"variants": [
{
"id": 195,
"code": "tron_network",
"name": "Tron"
}
]
},
"index": {
"order": 1,
"name": "Index",
"dynamic": true
},
"asset": {
"order": 2,
"name": "Asset",
"dynamic": false,
"variants": [
{
"id": 0,
"code": "a7a5",
"name": "A7A5"
},
{
"id": 1,
"code": "usdt",
"name": "USDT"
}
]
}
}
}'
response = http.request(request)
puts response.body
{
"id": "cmr3f41z20001psp7phmyapw3",
"code": "test_vault",
"name": "Test Vault",
"description": "example_string",
"lockedAt": "2026-07-02T11:25:15.134000Z",
"walletServiceUrl": "example_string",
"createdAt": "2026-07-02T11:25:15.134000Z",
"updatedAt": "2026-07-02T11:25:15.134000Z",
"networks": [
{
"id": "cmr3f41z20001psp7phmyapw3",
"coinType": 195,
"code": "tron_network",
"slug": "tron",
"name": "Tron",
"description": "example_string",
"logoUri": "https://cdn.example.com/networks/tron.png",
"type": "TRON",
"createdAt": "2026-07-02T11:25:15.134000Z",
"updatedAt": "2026-07-02T11:25:15.134000Z"
}
],
"routes": [
{
"id": "cmr3f41z20001psp7phmyapw3",
"vaultId": "example_string",
"order": 0,
"code": "purpose",
"name": "John Doe",
"description": "example_string",
"dynamic": true,
"createdAt": "2026-07-02T11:25:15.134000Z",
"updatedAt": "2026-07-02T11:25:15.134000Z",
"variants": [
{
"id": "cmr3f41z20001psp7phmyapw3",
"routeId": "example_string",
"pathId": 1,
"code": "usdt",
"name": "John Doe",
"description": "example_string",
"enabled": true,
"tokenId": "example_string",
"createdAt": "2026-07-02T11:25:15.134000Z",
"updatedAt": "2026-07-02T11:25:15.134000Z"
}
]
}
]
}
{
"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": "Internal Server Error",
"message": "An unexpected error occurred on the server",
"code": 500,
"requestId": "req_1234567890"
}
/api/v1/vaults
Target server for requests. Edit to use your own host.
Session token. Mobile/services. The web uses a cookie.
API key (sent in cookie)
The media type of the request body
RouteMap: the key is the segment code. The special "network" key is required (static; its variants go into the global Network registry, id = SLIP-0044 coinType). The other segments become the Vault's Routes, with order normalized from 0.
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. Session token. Mobile/services. The web uses a cookie.
API Key for authentication. Provide your API key in the cookie.
Body
RouteMap: the key is the segment code. The special "network" key is required (static; its variants go into the global Network registry, id = SLIP-0044 coinType). The other segments become the Vault's Routes, with order normalized from 0.
{"network":{"order":0,"name":"Network","dynamic":false,"variants":[{"id":195,"code":"tron_network","name":"Tron"}]},"index":{"order":1,"name":"Index","dynamic":true},"asset":{"order":2,"name":"Asset","dynamic":false,"variants":[{"id":0,"code":"a7a5","name":"A7A5"},{"id":1,"code":"usdt","name":"USDT"}]}}