Developers › API reference › Compliance
GET /api/v1/compliance/rules/{id}/sign-off
What you would sign off, with a confirmation token for X-Vestoris-Confirm.
- Scope
compliance:rules:approve - A person
- operationId
complianceSignOffPreview
The token needs the scope compliance:rules:approve, and the person or service account behind it needs the matching privileges and account permissions, exactly as on the screens. See Scopes.
A person. Only a person may do this: use a personal access token or an authorization-code token, never client credentials (user_token_required).
Request
GET /api/v1/compliance/rules/{id}/sign-off
Path parameters
| Name | Description | Example |
|---|---|---|
id | The id of the rule. | 41 |
Headers
| Header | Required | Value |
|---|---|---|
Authorization | yes | Bearer <token>: an OAuth access token (vat_…) or a personal access token (vpt_…). Get a token |
Examples
Keep the token in an environment variable (VESTORIS_TOKEN), never in the script.
curl
curl "https://vestoris.com/api/v1/compliance/rules/41/sign-off" \
-H "Authorization: Bearer $VESTORIS_TOKEN"
Python (requests)
import os, requests
r = requests.get(
"https://vestoris.com/api/v1/compliance/rules/41/sign-off",
headers={
"Authorization": f"Bearer {os.environ['VESTORIS_TOKEN']}",
},
timeout=30,
)
r.raise_for_status() # errors are application/problem+json with a stable "code"
print(r.json())
JavaScript (fetch)
const res = await fetch("https://vestoris.com/api/v1/compliance/rules/41/sign-off", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.VESTORIS_TOKEN}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.code}: ${data.detail}`); // problem+json
console.log(data);
Response
200 OK, application/json: SignOffPreview. Rate-limit headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset.
Response fields
| Field | Type | Description |
|---|---|---|
rule | object | The exact version you would sign. |
action | string | What you would sign: activate, change or retire. |
restatement | string | What the engine will enforce, written by code from the structured definition. |
test_bench | any | The latest test-bench result: what the rule would have blocked, warned on or logged. |
confirm_token | string | Send this in X-Vestoris-Confirm to confirm exactly what was previewed. |
how | string | How to confirm, in words. |
source_text | string | The words the rule was written from. |
four_eyes | object | Who may not sign (the author) and why. |
needs | list of string | What is still needed before signing. |
Example response
HTTP/1.1 200 OK
Content-Type: application/json
{
"rule": [],
"action": "activate",
"restatement": "Block any order that would make one issuer more than 5.00% of a Growth account (ETFs excepted).",
"test_bench": null,
"confirm_token": "vcf_3d9a…",
"how": "POST /api/v1/compliance/rules/41/sign-off with X-Vestoris-Confirm: <confirm_token> and a reason.",
"source_text": "",
"four_eyes": {},
"needs": []
}
Example values. Your values depend on your firm's data; prices, orders and fills are simulated.
Status codes and errors
Errors are application/problem+json (RFC 9457) with a stable code to program against; the detail says what to fix. See Errors.
| Status | When | Problem codes |
|---|---|---|
| 200 | Success | |
| 400 | The request is malformed | invalid_request |
| 401 | No token, or it is invalid or expired | invalid_token |
| 403 | The token lacks the scope, or the person or service account behind it lacks the privilege or account permission | insufficient_scope forbidden ip_not_allowed user_token_required |
| 404 | Not found, or not visible to you (the API never confirms what you may not see) | not_found |
| 429 | Rate limited: wait for Retry-After seconds | rate_limited |
{
"type": "https://vestoris.com/developers/errors#validation_failed",
"title": "Validation failed",
"status": 422,
"detail": "Quantity must be greater than zero.",
"code": "validation_failed",
"instance": "/api/v1/compliance/rules/41/sign-off"
}
On the screens
The same thing in the app is explained in: