Единая лента операций
МОЯ активность в Vault'е одной лентой (мои переводы + депозиты на мои адреса), по (createdAt, id) desc, keyset-пагинация. userId — из сессии.
Сценарии:
- моя лента — без параметров
- мои поступления за март — ?direction=in&from=2026-03-01&to=2026-04-01
- мои зависшие переводы — ?direction=out&status=pending
- ждут МОЕГО одобрения (чужие переводы) — ?awaitingMyApproval=true
- движения по моему адресу — ?addressId=... или папке — ?folderId=...
- по группе контрагентов — ?counterpartyGroupId=..., по адресу контрагента — ?counterpartyAddressId=...
- только внешние/внутренние — ?flowType=external|internal
- по категории/назначению из метаданных — ?category=... / ?paymentPurpose=...
Каждый элемент обогащён reporting-полями (§7): operationType, flowType, usdRate/usdValue (exact-снапшот), metadata. Форма элемента зависит от direction: out несёт статус/жизненный цикл, in — свершившийся факт из webhook.
curl -X GET "https://policy-engine-rest.ezig.workers.dev/api/v1/vaults/demo_vault/history?userId=example_string&direction=in&status=awaiting_approval&awaitingMyApproval=true&asset=usdt&tokenId=example_string&network=tron&addressId=123%20Main%20St&folderId=example_string&counterpartyId=example_string&counterpartyGroupId=example_string&counterpartyAddressId=123%20Main%20St&flowType=internal&category=example_string&paymentPurpose=example_string&decisionPolicyId=example_string&includeShared=true&txHash=example_string&from=example_string&to=example_string&limit=42&cursor=example_string" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import json
url = "https://policy-engine-rest.ezig.workers.dev/api/v1/vaults/demo_vault/history?userId=example_string&direction=in&status=awaiting_approval&awaitingMyApproval=true&asset=usdt&tokenId=example_string&network=tron&addressId=123%20Main%20St&folderId=example_string&counterpartyId=example_string&counterpartyGroupId=example_string&counterpartyAddressId=123%20Main%20St&flowType=internal&category=example_string&paymentPurpose=example_string&decisionPolicyId=example_string&includeShared=true&txHash=example_string&from=example_string&to=example_string&limit=42&cursor=example_string"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch("https://policy-engine-rest.ezig.workers.dev/api/v1/vaults/demo_vault/history?userId=example_string&direction=in&status=awaiting_approval&awaitingMyApproval=true&asset=usdt&tokenId=example_string&network=tron&addressId=123%20Main%20St&folderId=example_string&counterpartyId=example_string&counterpartyGroupId=example_string&counterpartyAddressId=123%20Main%20St&flowType=internal&category=example_string&paymentPurpose=example_string&decisionPolicyId=example_string&includeShared=true&txHash=example_string&from=example_string&to=example_string&limit=42&cursor=example_string", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://policy-engine-rest.ezig.workers.dev/api/v1/vaults/demo_vault/history?userId=example_string&direction=in&status=awaiting_approval&awaitingMyApproval=true&asset=usdt&tokenId=example_string&network=tron&addressId=123%20Main%20St&folderId=example_string&counterpartyId=example_string&counterpartyGroupId=example_string&counterpartyAddressId=123%20Main%20St&flowType=internal&category=example_string&paymentPurpose=example_string&decisionPolicyId=example_string&includeShared=true&txHash=example_string&from=example_string&to=example_string&limit=42&cursor=example_string", nil)
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/history?userId=example_string&direction=in&status=awaiting_approval&awaitingMyApproval=true&asset=usdt&tokenId=example_string&network=tron&addressId=123%20Main%20St&folderId=example_string&counterpartyId=example_string&counterpartyGroupId=example_string&counterpartyAddressId=123%20Main%20St&flowType=internal&category=example_string&paymentPurpose=example_string&decisionPolicyId=example_string&includeShared=true&txHash=example_string&from=example_string&to=example_string&limit=42&cursor=example_string')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
response = http.request(request)
puts response.body
{
"items": [
{
"direction": "example_string",
"operationType": "transfer",
"network": "example_string",
"flowType": "internal",
"usdRate": "example_string",
"usdValue": "example_string",
"usdRateSource": "example_string",
"metadata": {
"category": "example_string",
"tags": [
"example_string"
],
"paymentPurpose": "example_string",
"note": "example_string"
},
"decisionPolicyId": "example_string",
"id": "example_string",
"status": "example_string",
"txHash": "example_string",
"amount": "example_string",
"amountDecimal": "example_string",
"asset": "example_string",
"assetSymbol": "example_string",
"fee": "example_string",
"failureReason": "example_string",
"fromAddress": {
"id": "example_string",
"address": "123 Main St",
"label": "example_string"
},
"toAddress": "123 Main St",
"initiatorId": "example_string",
"decisionPolicyCode": "example_string",
"counterparty": {
"id": "example_string",
"name": "John Doe"
},
"approvalThreshold": 42,
"approvalsCount": 10,
"createdAt": "2026-07-02T11:25:15.134Z",
"confirmedAt": "2026-07-02T11:25:15.134Z"
}
],
"nextCursor": "example_string"
}
{
"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": "Internal Server Error",
"message": "An unexpected error occurred on the server",
"code": 500,
"requestId": "req_1234567890"
}
/api/v1/vaults/{code}/historyTarget server for requests. Edit to use your own host.
better-auth session token. Мобилка/сервисы. Веб использует cookie.
API key (sent in cookie)
Уникальный код Vault'а (slug)
Только для admin: чью активность показать. Без параметра админ видит ВЕСЬ Vault (у него нет собственных операций — это надзорная роль). Не-админ может указать только себя, иначе 403
Только поступления (in) или только переводы (out)
Статус исходящих; при указании in-элементы исключаются
true → переводы, ждущие МОЕГО голоса (я в снапшоте approvers и ещё не голосовал). Показывает чужие переводы — единственное исключение из «только своя активность». Подразумевает direction=out
Код токена
Токен по id из реестра (альтернатива asset)
Network.slug
Мой адрес: from для out, to для in
Операции по адресам из МОЕЙ папки (address-folders)
Операции конкретного контрагента (обе стороны)
Операции контрагентов группы (текущий состав)
Операции конкретного адреса контрагента
internal — вторая сторона = собственный адрес Vault'а; external — внешняя
Категория из OperationMetadata
Назначение платежа из OperationMetadata
Переводы, решённые конкретной политикой (только out)
Точный on-chain hash
createdAt >= (ISO или YYYY-MM-DD)
createdAt <= (ISO или YYYY-MM-DD)
Размер страницы (default 20, max 100)
nextCursor предыдущей страницы
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. better-auth session token. Мобилка/сервисы. Веб использует cookie.
API Key for authentication. Provide your API key in the cookie.
Path Parameters
Query Parameters
Только для admin: чью активность показать. Без параметра админ видит ВЕСЬ Vault (у него нет собственных операций — это надзорная роль). Не-админ может указать только себя, иначе 403
Статус исходящих; при указании in-элементы исключаются
awaiting_approvalpendingconfirmedfailedrejectedcancelledtrue → переводы, ждущие МОЕГО голоса (я в снапшоте approvers и ещё не голосовал). Показывает чужие переводы — единственное исключение из «только своя активность». Подразумевает direction=out
truefalseТокен по id из реестра (альтернатива asset)
Мой адрес: from для out, to для in
Операции по адресам из МОЕЙ папки (address-folders)
Операции конкретного контрагента (обе стороны)
Операции контрагентов группы (текущий состав)
Операции конкретного адреса контрагента
internal — вторая сторона = собственный адрес Vault'а; external — внешняя
internalexternalКатегория из OperationMetadata
Назначение платежа из OperationMetadata
Переводы, решённые конкретной политикой (только out)
Точный on-chain hash
createdAt >= (ISO или YYYY-MM-DD)
createdAt <= (ISO или YYYY-MM-DD)
Размер страницы (default 20, max 100)
nextCursor предыдущей страницы
Responses
Отсортировано по (createdAt, id) desc
Курсор следующей страницы; null — конец