Control-plane HTTP API for runtime visibility and user/config management. Data-plane MTProto traffic is out of scope.
API runtime is configured in [server.api].
| Field | Type | Default | Description |
|---|---|---|---|
enabled |
bool |
false |
Enables REST API listener. |
listen |
string (IP:PORT) |
127.0.0.1:9091 |
API bind address. |
whitelist |
CIDR[] |
127.0.0.1/32, ::1/128 |
Source IP allowlist. Empty list means allow all. |
auth_header |
string |
"" |
Exact value for Authorization header. Empty disables header auth. |
request_body_limit_bytes |
usize |
65536 |
Maximum request body size. Must be > 0. |
minimal_runtime_enabled |
bool |
false |
Enables runtime snapshot endpoints requiring ME pool read-lock aggregation. |
minimal_runtime_cache_ttl_ms |
u64 |
1000 |
Cache TTL for minimal snapshots. 0 disables cache; valid range is [0, 60000]. |
runtime_edge_enabled |
bool |
false |
Enables runtime edge endpoints with cached aggregation payloads. |
runtime_edge_cache_ttl_ms |
u64 |
1000 |
Cache TTL for runtime edge summary payloads. 0 disables cache. |
runtime_edge_top_n |
usize |
10 |
Top-N rows for runtime edge leaderboard payloads. |
runtime_edge_events_capacity |
usize |
256 |
Ring-buffer size for /v1/runtime/events/recent. |
read_only |
bool |
false |
Disables mutating endpoints. |
server.admin_api is accepted as an alias for backward compatibility.
Runtime validation for API config:
server.api.listenmust be a validIP:PORT.server.api.request_body_limit_bytesmust be> 0.server.api.minimal_runtime_cache_ttl_msmust be within[0, 60000].server.api.runtime_edge_cache_ttl_msmust be within[0, 60000].server.api.runtime_edge_top_nmust be within[1, 1000].server.api.runtime_edge_events_capacitymust be within[16, 4096].
| Item | Value |
|---|---|
| Transport | HTTP/1.1 |
| Content type | application/json; charset=utf-8 |
| Prefix | /v1 |
| Optimistic concurrency | If-Match: <revision> on mutating requests (optional) |
| Revision format | SHA-256 hex of current config.toml content |
{
"ok": true,
"data": {},
"revision": "sha256-hex"
}{
"ok": false,
"error": {
"code": "machine_code",
"message": "human-readable"
},
"request_id": 1
}Requests are processed in this order:
api_enabledgate (503 api_disabledif disabled).- Source IP whitelist gate (
403 forbidden). Authorizationheader gate when configured (401 unauthorized).- Route and method matching (
404 not_foundor405 method_not_allowed). read_onlygate for mutating routes (403 read_only).- Request body read/limit/JSON decode (
413 payload_too_large,400 bad_request). - Business validation and config write path.
Notes:
- Whitelist is evaluated against the direct TCP peer IP (
SocketAddr::ip), withoutX-Forwarded-Forsupport. Authorizationcheck is exact string equality against configuredauth_header.
| Method | Path | Body | Success | data contract |
|---|---|---|---|---|
GET |
/v1/health |
none | 200 |
HealthData |
GET |
/v1/system/info |
none | 200 |
SystemInfoData |
GET |
/v1/runtime/gates |
none | 200 |
RuntimeGatesData |
GET |
/v1/runtime/initialization |
none | 200 |
RuntimeInitializationData |
GET |
/v1/limits/effective |
none | 200 |
EffectiveLimitsData |
GET |
/v1/security/posture |
none | 200 |
SecurityPostureData |
GET |
/v1/security/whitelist |
none | 200 |
SecurityWhitelistData |
GET |
/v1/stats/summary |
none | 200 |
SummaryData |
GET |
/v1/stats/zero/all |
none | 200 |
ZeroAllData |
GET |
/v1/stats/upstreams |
none | 200 |
UpstreamsData |
GET |
/v1/stats/minimal/all |
none | 200 |
MinimalAllData |
GET |
/v1/stats/me-writers |
none | 200 |
MeWritersData |
GET |
/v1/stats/dcs |
none | 200 |
DcStatusData |
GET |
/v1/runtime/me_pool_state |
none | 200 |
RuntimeMePoolStateData |
GET |
/v1/runtime/me_quality |
none | 200 |
RuntimeMeQualityData |
GET |
/v1/runtime/upstream_quality |
none | 200 |
RuntimeUpstreamQualityData |
GET |
/v1/runtime/nat_stun |
none | 200 |
RuntimeNatStunData |
GET |
/v1/runtime/me-selftest |
none | 200 |
RuntimeMeSelftestData |
GET |
/v1/runtime/connections/summary |
none | 200 |
RuntimeEdgeConnectionsSummaryData |
GET |
/v1/runtime/events/recent |
none | 200 |
RuntimeEdgeEventsData |
GET |
/v1/stats/users |
none | 200 |
UserInfo[] |
GET |
/v1/users |
none | 200 |
UserInfo[] |
POST |
/v1/users |
CreateUserRequest |
201 |
CreateUserResponse |
GET |
/v1/users/{username} |
none | 200 |
UserInfo |
PATCH |
/v1/users/{username} |
PatchUserRequest |
200 |
UserInfo |
DELETE |
/v1/users/{username} |
none | 200 |
string (deleted username) |
POST |
/v1/users/{username}/rotate-secret |
RotateSecretRequest or empty body |
404 |
ErrorResponse (not_found, current runtime behavior) |
| HTTP | error.code |
Trigger |
|---|---|---|
400 |
bad_request |
Invalid JSON, validation failures, malformed request body. |
401 |
unauthorized |
Missing/invalid Authorization when auth_header is configured. |
403 |
forbidden |
Source IP is not allowed by whitelist. |
403 |
read_only |
Mutating endpoint called while read_only=true. |
404 |
not_found |
Unknown route, unknown user, or unsupported sub-route (including current rotate-secret route). |
405 |
method_not_allowed |
Unsupported method for /v1/users/{username} route shape. |
409 |
revision_conflict |
If-Match revision mismatch. |
409 |
user_exists |
User already exists on create. |
409 |
last_user_forbidden |
Attempt to delete last configured user. |
413 |
payload_too_large |
Body exceeds request_body_limit_bytes. |
500 |
internal_error |
Internal error (I/O, serialization, config load/save). |
503 |
api_disabled |
API disabled in config. |
| Case | Behavior |
|---|---|
| Path matching | Exact match on req.uri().path(). Query string does not affect route matching. |
| Trailing slash | Not normalized. Example: /v1/users/ is 404. |
| Username route with extra slash | /v1/users/{username}/... is not treated as user route and returns 404. |
PUT /v1/users/{username} |
405 method_not_allowed. |
POST /v1/users/{username} |
404 not_found. |
POST /v1/users/{username}/rotate-secret |
404 not_found in current release due route matcher limitation. |
- Request body is read only for mutating routes that define a body contract.
- Body size limit is enforced during streaming read (
413 payload_too_large). - Invalid transport body frame returns
400 bad_request(Invalid request body). - Invalid JSON returns
400 bad_request(Invalid JSON body). Content-Typeis not required for JSON parsing.- Unknown JSON fields are ignored by deserialization.
PATCHupdates only provided fields and does not support explicit clearing of optional fields.If-Matchsupports both quoted and unquoted values; surrounding whitespace is trimmed.
| Endpoint | Query | Behavior |
|---|---|---|
GET /v1/runtime/events/recent |
limit=<usize> |
Optional. Invalid/missing value falls back to default 50. Effective value is clamped to [1, 1000] and additionally bounded by ring-buffer capacity. |
| Field | Type | Required | Description |
|---|---|---|---|
username |
string |
yes | [A-Za-z0-9_.-], length 1..64. |
secret |
string |
no | Exactly 32 hex chars. If missing, generated automatically. |
user_ad_tag |
string |
no | Exactly 32 hex chars. |
max_tcp_conns |
usize |
no | Per-user concurrent TCP limit. |
expiration_rfc3339 |
string |
no | RFC3339 expiration timestamp. |
data_quota_bytes |
u64 |
no | Per-user traffic quota. |
max_unique_ips |
usize |
no | Per-user unique source IP limit. |
| Field | Type | Required | Description |
|---|---|---|---|
secret |
string |
no | Exactly 32 hex chars. |
user_ad_tag |
string |
no | Exactly 32 hex chars. |
max_tcp_conns |
usize |
no | Per-user concurrent TCP limit. |
expiration_rfc3339 |
string |
no | RFC3339 expiration timestamp. |
data_quota_bytes |
u64 |
no | Per-user traffic quota. |
max_unique_ips |
usize |
no | Per-user unique source IP limit. |
| Field | Type | Required | Description |
|---|---|---|---|
secret |
string |
no | Exactly 32 hex chars. If missing, generated automatically. |
Note: the request contract is defined, but the corresponding route currently returns 404 (see routing edge cases).
| Field | Type | Description |
|---|---|---|
status |
string |
Always "ok". |
read_only |
bool |
Mirrors current API read_only mode. |
| Field | Type | Description |
|---|---|---|
uptime_seconds |
f64 |
Process uptime in seconds. |
connections_total |
u64 |
Total accepted client connections. |
connections_bad_total |
u64 |
Failed/invalid client connections. |
handshake_timeouts_total |
u64 |
Handshake timeout count. |
configured_users |
usize |
Number of configured users in config. |
| Field | Type | Description |
|---|---|---|
version |
string |
Binary version (CARGO_PKG_VERSION). |
target_arch |
string |
Target architecture (std::env::consts::ARCH). |
target_os |
string |
Target OS (std::env::consts::OS). |
build_profile |
string |
Build profile (PROFILE env when available). |
git_commit |
string? |
Optional commit hash from build env metadata. |
build_time_utc |
string? |
Optional build timestamp from build env metadata. |
rustc_version |
string? |
Optional compiler version from build env metadata. |
process_started_at_epoch_secs |
u64 |
Process start time as Unix epoch seconds. |
uptime_seconds |
f64 |
Process uptime in seconds. |
config_path |
string |
Active config file path used by runtime. |
config_hash |
string |
SHA-256 hash of current config content (same value as envelope revision). |
config_reload_count |
u64 |
Number of successfully observed config updates since process start. |
last_config_reload_epoch_secs |
u64? |
Unix epoch seconds of the latest observed config reload; null/absent before first reload. |
| Field | Type | Description |
|---|---|---|
accepting_new_connections |
bool |
Current admission-gate state for new listener accepts. |
conditional_cast_enabled |
bool |
Whether conditional ME admission logic is enabled (general.use_middle_proxy). |
me_runtime_ready |
bool |
Current ME runtime readiness status used for conditional gate decisions. |
me2dc_fallback_enabled |
bool |
Whether ME -> direct fallback is enabled. |
use_middle_proxy |
bool |
Current transport mode preference. |
startup_status |
string |
Startup status (pending, initializing, ready, failed, skipped). |
startup_stage |
string |
Current startup stage identifier. |
startup_progress_pct |
f64 |
Startup progress percentage (0..100). |
| Field | Type | Description |
|---|---|---|
status |
string |
Startup status (pending, initializing, ready, failed, skipped). |
degraded |
bool |
Whether runtime is currently in degraded mode. |
current_stage |
string |
Current startup stage identifier. |
progress_pct |
f64 |
Overall startup progress percentage (0..100). |
started_at_epoch_secs |
u64 |
Process start timestamp (Unix seconds). |
ready_at_epoch_secs |
u64? |
Timestamp when startup reached ready state; absent until ready. |
total_elapsed_ms |
u64 |
Elapsed startup duration in milliseconds. |
transport_mode |
string |
Startup transport mode (middle_proxy or direct). |
me |
RuntimeInitializationMeData |
ME startup substate snapshot. |
components |
RuntimeInitializationComponentData[] |
Per-component startup timeline and status. |
| Field | Type | Description |
|---|---|---|
status |
string |
ME startup status (pending, initializing, ready, failed, skipped). |
current_stage |
string |
Current ME startup stage identifier. |
progress_pct |
f64 |
ME startup progress percentage (0..100). |
init_attempt |
u32 |
Current ME init attempt counter. |
retry_limit |
string |
Retry limit ("unlimited" or numeric string). |
last_error |
string? |
Last ME initialization error text when present. |
| Field | Type | Description |
|---|---|---|
id |
string |
Startup component identifier. |
title |
string |
Human-readable component title. |
status |
string |
Component status (pending, running, ready, failed, skipped). |
started_at_epoch_ms |
u64? |
Component start timestamp in Unix milliseconds. |
finished_at_epoch_ms |
u64? |
Component finish timestamp in Unix milliseconds. |
duration_ms |
u64? |
Component duration in milliseconds. |
attempts |
u32 |
Attempt counter for this component. |
details |
string? |
Optional short status details text. |
| Field | Type | Description |
|---|---|---|
update_every_secs |
u64 |
Effective unified updater interval. |
me_reinit_every_secs |
u64 |
Effective ME periodic reinit interval. |
me_pool_force_close_secs |
u64 |
Effective stale-writer force-close timeout. |
timeouts |
EffectiveTimeoutLimits |
Effective timeout policy snapshot. |
upstream |
EffectiveUpstreamLimits |
Effective upstream connect/retry limits. |
middle_proxy |
EffectiveMiddleProxyLimits |
Effective ME pool/floor/reconnect limits. |
user_ip_policy |
EffectiveUserIpPolicyLimits |
Effective unique-IP policy mode/window. |
| Field | Type | Description |
|---|---|---|
client_handshake_secs |
u64 |
Client handshake timeout. |
tg_connect_secs |
u64 |
Upstream Telegram connect timeout. |
client_keepalive_secs |
u64 |
Client keepalive interval. |
client_ack_secs |
u64 |
ACK timeout. |
me_one_retry |
u8 |
Fast retry count for single-endpoint ME DC. |
me_one_timeout_ms |
u64 |
Fast retry timeout per attempt for single-endpoint ME DC. |
| Field | Type | Description |
|---|---|---|
connect_retry_attempts |
u32 |
Upstream connect retry attempts. |
connect_retry_backoff_ms |
u64 |
Upstream retry backoff delay. |
connect_budget_ms |
u64 |
Total connect wall-clock budget across retries. |
unhealthy_fail_threshold |
u32 |
Consecutive fail threshold for unhealthy marking. |
connect_failfast_hard_errors |
bool |
Whether hard errors skip additional retries. |
| Field | Type | Description |
|---|---|---|
floor_mode |
string |
Effective floor mode (static or adaptive). |
adaptive_floor_idle_secs |
u64 |
Adaptive floor idle threshold. |
adaptive_floor_min_writers_single_endpoint |
u8 |
Adaptive floor minimum for single-endpoint DCs. |
adaptive_floor_min_writers_multi_endpoint |
u8 |
Adaptive floor minimum for multi-endpoint DCs. |
adaptive_floor_recover_grace_secs |
u64 |
Adaptive floor recovery grace period. |
adaptive_floor_writers_per_core_total |
u16 |
Target total writers-per-core budget in adaptive mode. |
adaptive_floor_cpu_cores_override |
u16 |
Manual CPU core override (0 means auto-detect). |
adaptive_floor_max_extra_writers_single_per_core |
u16 |
Extra per-core adaptive headroom for single-endpoint DCs. |
adaptive_floor_max_extra_writers_multi_per_core |
u16 |
Extra per-core adaptive headroom for multi-endpoint DCs. |
adaptive_floor_max_active_writers_per_core |
u16 |
Active writer cap per CPU core. |
adaptive_floor_max_warm_writers_per_core |
u16 |
Warm writer cap per CPU core. |
adaptive_floor_max_active_writers_global |
u32 |
Global active writer cap. |
adaptive_floor_max_warm_writers_global |
u32 |
Global warm writer cap. |
reconnect_max_concurrent_per_dc |
u32 |
Max concurrent reconnects per DC. |
reconnect_backoff_base_ms |
u64 |
Reconnect base backoff. |
reconnect_backoff_cap_ms |
u64 |
Reconnect backoff cap. |
reconnect_fast_retry_count |
u32 |
Number of fast retries before standard backoff strategy. |
writer_pick_mode |
string |
Writer picker mode (sorted_rr, p2c). |
writer_pick_sample_size |
u8 |
Candidate sample size for p2c picker mode. |
me2dc_fallback |
bool |
Effective ME -> direct fallback flag. |
| Field | Type | Description |
|---|---|---|
mode |
string |
Unique-IP policy mode (active_window, time_window, combined). |
window_secs |
u64 |
Time window length used by unique-IP policy. |
| Field | Type | Description |
|---|---|---|
api_read_only |
bool |
Current API read-only state. |
api_whitelist_enabled |
bool |
Whether whitelist filtering is active. |
api_whitelist_entries |
usize |
Number of configured whitelist CIDRs. |
api_auth_header_enabled |
bool |
Whether Authorization header validation is active. |
proxy_protocol_enabled |
bool |
Global PROXY protocol accept setting. |
log_level |
string |
Effective log level (debug, verbose, normal, silent). |
telemetry_core_enabled |
bool |
Core telemetry toggle. |
telemetry_user_enabled |
bool |
Per-user telemetry toggle. |
telemetry_me_level |
string |
ME telemetry level (silent, normal, debug). |
| Field | Type | Description |
|---|---|---|
generated_at_epoch_secs |
u64 |
Snapshot generation timestamp. |
enabled |
bool |
true when whitelist has at least one CIDR entry. |
entries_total |
usize |
Number of whitelist CIDR entries. |
entries |
string[] |
Whitelist CIDR entries as strings. |
| Field | Type | Description |
|---|---|---|
enabled |
bool |
Runtime payload availability. |
reason |
string? |
source_unavailable when ME pool snapshot is unavailable. |
generated_at_epoch_secs |
u64 |
Snapshot generation timestamp. |
data |
RuntimeMePoolStatePayload? |
Null when unavailable. |
| Field | Type | Description |
|---|---|---|
generations |
RuntimeMePoolStateGenerationData |
Active/warm/pending/draining generation snapshot. |
hardswap |
RuntimeMePoolStateHardswapData |
Hardswap state flags. |
writers |
RuntimeMePoolStateWriterData |
Writer total/contour/health counters. |
refill |
RuntimeMePoolStateRefillData |
In-flight refill counters by DC/family. |
| Field | Type | Description |
|---|---|---|
active_generation |
u64 |
Active pool generation id. |
warm_generation |
u64 |
Warm pool generation id. |
pending_hardswap_generation |
u64 |
Pending hardswap generation id (0 when none). |
pending_hardswap_age_secs |
u64? |
Age of pending hardswap generation in seconds. |
draining_generations |
u64[] |
Distinct generation ids currently draining. |
| Field | Type | Description |
|---|---|---|
enabled |
bool |
Hardswap feature toggle. |
pending |
bool |
true when pending generation is non-zero. |
| Field | Type | Description |
|---|---|---|
total |
usize |
Total writer rows in snapshot. |
alive_non_draining |
usize |
Alive writers excluding draining ones. |
draining |
usize |
Writers marked draining. |
degraded |
usize |
Non-draining degraded writers. |
contour |
RuntimeMePoolStateWriterContourData |
Counts by contour state. |
health |
RuntimeMePoolStateWriterHealthData |
Counts by health bucket. |
| Field | Type | Description |
|---|---|---|
warm |
usize |
Writers in warm contour. |
active |
usize |
Writers in active contour. |
draining |
usize |
Writers in draining contour. |
| Field | Type | Description |
|---|---|---|
healthy |
usize |
Non-draining non-degraded writers. |
degraded |
usize |
Non-draining degraded writers. |
draining |
usize |
Draining writers. |
| Field | Type | Description |
|---|---|---|
inflight_endpoints_total |
usize |
Total in-flight endpoint refill operations. |
inflight_dc_total |
usize |
Number of distinct DC+family keys with refill in flight. |
by_dc |
RuntimeMePoolStateRefillDcData[] |
Per-DC refill rows. |
| Field | Type | Description |
|---|---|---|
dc |
i16 |
Telegram DC id. |
family |
string |
Address family label (V4, V6). |
inflight |
usize |
In-flight refill operations for this row. |
| Field | Type | Description |
|---|---|---|
enabled |
bool |
Runtime payload availability. |
reason |
string? |
source_unavailable when ME pool snapshot is unavailable. |
generated_at_epoch_secs |
u64 |
Snapshot generation timestamp. |
data |
RuntimeMeQualityPayload? |
Null when unavailable. |
| Field | Type | Description |
|---|---|---|
counters |
RuntimeMeQualityCountersData |
Key ME lifecycle/error counters. |
route_drops |
RuntimeMeQualityRouteDropData |
Route drop counters by reason. |
dc_rtt |
RuntimeMeQualityDcRttData[] |
Per-DC RTT and writer coverage rows. |
| Field | Type | Description |
|---|---|---|
idle_close_by_peer_total |
u64 |
Peer-initiated idle closes. |
reader_eof_total |
u64 |
Reader EOF events. |
kdf_drift_total |
u64 |
KDF drift detections. |
kdf_port_only_drift_total |
u64 |
KDF port-only drift detections. |
reconnect_attempt_total |
u64 |
Reconnect attempts. |
reconnect_success_total |
u64 |
Successful reconnects. |
| Field | Type | Description |
|---|---|---|
no_conn_total |
u64 |
Route drops with no connection mapping. |
channel_closed_total |
u64 |
Route drops because destination channel is closed. |
queue_full_total |
u64 |
Route drops due queue backpressure (aggregate). |
queue_full_base_total |
u64 |
Route drops in base-queue path. |
queue_full_high_total |
u64 |
Route drops in high-priority queue path. |
| Field | Type | Description |
|---|---|---|
dc |
i16 |
Telegram DC id. |
rtt_ema_ms |
f64? |
RTT EMA for this DC. |
alive_writers |
usize |
Alive writers currently mapped to this DC. |
required_writers |
usize |
Target writer floor for this DC. |
coverage_pct |
f64 |
alive_writers / required_writers * 100. |
| Field | Type | Description |
|---|---|---|
enabled |
bool |
Runtime payload availability. |
reason |
string? |
source_unavailable when upstream runtime snapshot is unavailable. |
generated_at_epoch_secs |
u64 |
Snapshot generation timestamp. |
policy |
RuntimeUpstreamQualityPolicyData |
Effective upstream policy values. |
counters |
RuntimeUpstreamQualityCountersData |
Upstream connect counters. |
summary |
RuntimeUpstreamQualitySummaryData? |
Aggregate runtime health summary. |
upstreams |
RuntimeUpstreamQualityUpstreamData[]? |
Per-upstream runtime rows. |
| Field | Type | Description |
|---|---|---|
connect_retry_attempts |
u32 |
Upstream connect retry attempts. |
connect_retry_backoff_ms |
u64 |
Upstream retry backoff delay. |
connect_budget_ms |
u64 |
Total connect wall-clock budget. |
unhealthy_fail_threshold |
u32 |
Consecutive fail threshold for unhealthy marking. |
connect_failfast_hard_errors |
bool |
Whether hard errors skip retries. |
| Field | Type | Description |
|---|---|---|
connect_attempt_total |
u64 |
Total connect attempts. |
connect_success_total |
u64 |
Successful connects. |
connect_fail_total |
u64 |
Failed connects. |
connect_failfast_hard_error_total |
u64 |
Fail-fast hard errors. |
| Field | Type | Description |
|---|---|---|
configured_total |
usize |
Total configured upstream entries. |
healthy_total |
usize |
Upstreams currently healthy. |
unhealthy_total |
usize |
Upstreams currently unhealthy. |
direct_total |
usize |
Direct-route upstream entries. |
socks4_total |
usize |
SOCKS4 upstream entries. |
socks5_total |
usize |
SOCKS5 upstream entries. |
shadowsocks_total |
usize |
Shadowsocks upstream entries. |
| Field | Type | Description |
|---|---|---|
upstream_id |
usize |
Runtime upstream index. |
route_kind |
string |
direct, socks4, socks5, shadowsocks. |
address |
string |
Upstream address (direct literal for direct route kind, host:port only for proxied upstreams). |
weight |
u16 |
Selection weight. |
scopes |
string |
Configured scope selector. |
healthy |
bool |
Current health flag. |
fails |
u32 |
Consecutive fail counter. |
last_check_age_secs |
u64 |
Seconds since last health update. |
effective_latency_ms |
f64? |
Effective latency score used by selector. |
dc |
RuntimeUpstreamQualityDcData[] |
Per-DC runtime rows. |
| Field | Type | Description |
|---|---|---|
dc |
i16 |
Telegram DC id. |
latency_ema_ms |
f64? |
Per-DC latency EMA. |
ip_preference |
string |
unknown, prefer_v4, prefer_v6, both_work, unavailable. |
| Field | Type | Description |
|---|---|---|
enabled |
bool |
Runtime payload availability. |
reason |
string? |
source_unavailable when shared STUN state is unavailable. |
generated_at_epoch_secs |
u64 |
Snapshot generation timestamp. |
data |
RuntimeNatStunPayload? |
Null when unavailable. |
| Field | Type | Description |
|---|---|---|
flags |
RuntimeNatStunFlagsData |
NAT probe runtime flags. |
servers |
RuntimeNatStunServersData |
Configured/live STUN server lists. |
reflection |
RuntimeNatStunReflectionBlockData |
Reflection cache data for v4/v6. |
stun_backoff_remaining_ms |
u64? |
Remaining retry backoff (milliseconds). |
| Field | Type | Description |
|---|---|---|
nat_probe_enabled |
bool |
Current NAT probe enable state. |
nat_probe_disabled_runtime |
bool |
Runtime disable flag due failures/conditions. |
nat_probe_attempts |
u8 |
Configured NAT probe attempt count. |
| Field | Type | Description |
|---|---|---|
configured |
string[] |
Configured STUN server entries. |
live |
string[] |
Runtime live STUN server entries. |
live_total |
usize |
Number of live STUN entries. |
| Field | Type | Description |
|---|---|---|
v4 |
RuntimeNatStunReflectionData? |
IPv4 reflection data. |
v6 |
RuntimeNatStunReflectionData? |
IPv6 reflection data. |
| Field | Type | Description |
|---|---|---|
addr |
string |
Reflected public endpoint (ip:port). |
age_secs |
u64 |
Reflection value age in seconds. |
| Field | Type | Description |
|---|---|---|
enabled |
bool |
Runtime payload availability. |
reason |
string? |
source_unavailable when ME pool is unavailable. |
generated_at_epoch_secs |
u64 |
Snapshot generation timestamp. |
data |
RuntimeMeSelftestPayload? |
Null when unavailable. |
| Field | Type | Description |
|---|---|---|
kdf |
RuntimeMeSelftestKdfData |
KDF EWMA health state. |
timeskew |
RuntimeMeSelftestTimeskewData |
Date-header skew health state. |
ip |
RuntimeMeSelftestIpData |
Interface IP family classification. |
pid |
RuntimeMeSelftestPidData |
Process PID marker (`one |
bnd |
RuntimeMeSelftestBndData |
SOCKS BND.ADDR/BND.PORT health state. |
| Field | Type | Description |
|---|---|---|
state |
string |
ok or error based on EWMA threshold. |
ewma_errors_per_min |
f64 |
EWMA KDF error rate per minute. |
threshold_errors_per_min |
f64 |
Threshold used for error decision. |
errors_total |
u64 |
Total source errors (kdf_drift + socks_kdf_strict_reject). |
| Field | Type | Description |
|---|---|---|
state |
string |
ok or error (max_skew_secs_15m > 60 => error). |
max_skew_secs_15m |
u64? |
Maximum observed skew in the last 15 minutes. |
samples_15m |
usize |
Number of skew samples in the last 15 minutes. |
last_skew_secs |
u64? |
Latest observed skew value. |
last_source |
string? |
Latest skew source marker. |
last_seen_age_secs |
u64? |
Age of the latest skew sample. |
| Field | Type | Description |
|---|---|---|
v4 |
RuntimeMeSelftestIpFamilyData? |
IPv4 interface probe result; absent when unknown. |
v6 |
RuntimeMeSelftestIpFamilyData? |
IPv6 interface probe result; absent when unknown. |
| Field | Type | Description |
|---|---|---|
addr |
string |
Detected interface IP. |
state |
string |
good, bogon, or loopback. |
| Field | Type | Description |
|---|---|---|
pid |
u32 |
Current process PID. |
state |
string |
one when PID=1, otherwise non-one. |
| Field | Type | Description |
|---|---|---|
addr_state |
string |
ok, bogon, or error. |
port_state |
string |
ok, zero, or error. |
last_addr |
string? |
Latest observed SOCKS BND address. |
last_seen_age_secs |
u64? |
Age of latest BND sample. |
| Field | Type | Description |
|---|---|---|
enabled |
bool |
Endpoint availability under runtime_edge_enabled. |
reason |
string? |
feature_disabled or source_unavailable. |
generated_at_epoch_secs |
u64 |
Snapshot generation timestamp. |
data |
RuntimeEdgeConnectionsSummaryPayload? |
Null when unavailable. |
| Field | Type | Description |
|---|---|---|
cache |
RuntimeEdgeConnectionCacheData |
Runtime edge cache metadata. |
totals |
RuntimeEdgeConnectionTotalsData |
Connection totals block. |
top |
RuntimeEdgeConnectionTopData |
Top-N leaderboard blocks. |
telemetry |
RuntimeEdgeConnectionTelemetryData |
Telemetry-policy flags for counters. |
| Field | Type | Description |
|---|---|---|
ttl_ms |
u64 |
Configured cache TTL in milliseconds. |
served_from_cache |
bool |
true when payload is served from cache. |
stale_cache_used |
bool |
true when stale cache is used because recompute is busy. |
| Field | Type | Description |
|---|---|---|
current_connections |
u64 |
Current global live connections. |
current_connections_me |
u64 |
Current live connections routed through ME. |
current_connections_direct |
u64 |
Current live connections routed through direct path. |
active_users |
usize |
Users with current_connections > 0. |
| Field | Type | Description |
|---|---|---|
limit |
usize |
Effective Top-N row count. |
by_connections |
RuntimeEdgeConnectionUserData[] |
Users sorted by current connections. |
by_throughput |
RuntimeEdgeConnectionUserData[] |
Users sorted by cumulative octets. |
| Field | Type | Description |
|---|---|---|
username |
string |
Username. |
current_connections |
u64 |
Current live connections for user. |
total_octets |
u64 |
Cumulative (client->proxy + proxy->client) octets. |
| Field | Type | Description |
|---|---|---|
user_enabled |
bool |
Per-user telemetry enable flag. |
throughput_is_cumulative |
bool |
Always true in current implementation. |
| Field | Type | Description |
|---|---|---|
enabled |
bool |
Endpoint availability under runtime_edge_enabled. |
reason |
string? |
feature_disabled when endpoint is disabled. |
generated_at_epoch_secs |
u64 |
Snapshot generation timestamp. |
data |
RuntimeEdgeEventsPayload? |
Null when unavailable. |
| Field | Type | Description |
|---|---|---|
capacity |
usize |
Effective ring-buffer capacity. |
dropped_total |
u64 |
Count of dropped oldest events due capacity pressure. |
events |
ApiEventRecord[] |
Recent events in chronological order. |
| Field | Type | Description |
|---|---|---|
seq |
u64 |
Monotonic sequence number. |
ts_epoch_secs |
u64 |
Event timestamp (Unix seconds). |
event_type |
string |
Event kind identifier. |
context |
string |
Context text (truncated to implementation-defined max length). |
| Field | Type | Description |
|---|---|---|
generated_at_epoch_secs |
u64 |
Snapshot time (Unix epoch seconds). |
core |
ZeroCoreData |
Core counters and telemetry policy snapshot. |
upstream |
ZeroUpstreamData |
Upstream connect counters/histogram buckets. |
middle_proxy |
ZeroMiddleProxyData |
ME protocol/health counters. |
pool |
ZeroPoolData |
ME pool lifecycle counters. |
desync |
ZeroDesyncData |
Frame desync counters. |
| Field | Type | Description |
|---|---|---|
uptime_seconds |
f64 |
Process uptime. |
connections_total |
u64 |
Total accepted connections. |
connections_bad_total |
u64 |
Failed/invalid connections. |
handshake_timeouts_total |
u64 |
Handshake timeouts. |
configured_users |
usize |
Configured user count. |
telemetry_core_enabled |
bool |
Core telemetry toggle. |
telemetry_user_enabled |
bool |
User telemetry toggle. |
telemetry_me_level |
string |
ME telemetry level (`off |
| Field | Type | Description |
|---|---|---|
connect_attempt_total |
u64 |
Total upstream connect attempts. |
connect_success_total |
u64 |
Successful upstream connects. |
connect_fail_total |
u64 |
Failed upstream connects. |
connect_failfast_hard_error_total |
u64 |
Fail-fast hard errors. |
connect_attempts_bucket_1 |
u64 |
Connect attempts resolved in 1 try. |
connect_attempts_bucket_2 |
u64 |
Connect attempts resolved in 2 tries. |
connect_attempts_bucket_3_4 |
u64 |
Connect attempts resolved in 3-4 tries. |
connect_attempts_bucket_gt_4 |
u64 |
Connect attempts requiring more than 4 tries. |
connect_duration_success_bucket_le_100ms |
u64 |
Successful connects <=100 ms. |
connect_duration_success_bucket_101_500ms |
u64 |
Successful connects 101-500 ms. |
connect_duration_success_bucket_501_1000ms |
u64 |
Successful connects 501-1000 ms. |
connect_duration_success_bucket_gt_1000ms |
u64 |
Successful connects >1000 ms. |
connect_duration_fail_bucket_le_100ms |
u64 |
Failed connects <=100 ms. |
connect_duration_fail_bucket_101_500ms |
u64 |
Failed connects 101-500 ms. |
connect_duration_fail_bucket_501_1000ms |
u64 |
Failed connects 501-1000 ms. |
connect_duration_fail_bucket_gt_1000ms |
u64 |
Failed connects >1000 ms. |
| Field | Type | Description |
|---|---|---|
enabled |
bool |
Runtime upstream snapshot availability according to API config. |
reason |
string? |
feature_disabled or source_unavailable when runtime snapshot is unavailable. |
generated_at_epoch_secs |
u64 |
Snapshot generation time. |
zero |
ZeroUpstreamData |
Always available zero-cost upstream counters block. |
summary |
UpstreamSummaryData? |
Runtime upstream aggregate view, null when unavailable. |
upstreams |
UpstreamStatus[]? |
Per-upstream runtime status rows, null when unavailable. |
| Field | Type | Description |
|---|---|---|
configured_total |
usize |
Total configured upstream entries. |
healthy_total |
usize |
Upstreams currently marked healthy. |
unhealthy_total |
usize |
Upstreams currently marked unhealthy. |
direct_total |
usize |
Number of direct upstream entries. |
socks4_total |
usize |
Number of SOCKS4 upstream entries. |
socks5_total |
usize |
Number of SOCKS5 upstream entries. |
shadowsocks_total |
usize |
Number of Shadowsocks upstream entries. |
| Field | Type | Description |
|---|---|---|
upstream_id |
usize |
Runtime upstream index. |
route_kind |
string |
Upstream route kind: direct, socks4, socks5, shadowsocks. |
address |
string |
Upstream address (direct for direct route kind, host:port for Shadowsocks). Authentication fields are intentionally omitted. |
weight |
u16 |
Selection weight. |
scopes |
string |
Configured scope selector string. |
healthy |
bool |
Current health flag. |
fails |
u32 |
Consecutive fail counter. |
last_check_age_secs |
u64 |
Seconds since the last health-check update. |
effective_latency_ms |
f64? |
Effective upstream latency used by selector. |
dc |
UpstreamDcStatus[] |
Per-DC latency/IP preference snapshot. |
| Field | Type | Description |
|---|---|---|
dc |
i16 |
Telegram DC id. |
latency_ema_ms |
f64? |
Per-DC latency EMA value. |
ip_preference |
string |
Per-DC IP family preference: unknown, prefer_v4, prefer_v6, both_work, unavailable. |
| Field | Type | Description |
|---|---|---|
keepalive_sent_total |
u64 |
ME keepalive packets sent. |
keepalive_failed_total |
u64 |
ME keepalive send failures. |
keepalive_pong_total |
u64 |
Keepalive pong responses received. |
keepalive_timeout_total |
u64 |
Keepalive timeout events. |
rpc_proxy_req_signal_sent_total |
u64 |
RPC proxy activity signals sent. |
rpc_proxy_req_signal_failed_total |
u64 |
RPC proxy activity signal failures. |
rpc_proxy_req_signal_skipped_no_meta_total |
u64 |
Signals skipped due to missing metadata. |
rpc_proxy_req_signal_response_total |
u64 |
RPC proxy signal responses received. |
rpc_proxy_req_signal_close_sent_total |
u64 |
RPC proxy close signals sent. |
reconnect_attempt_total |
u64 |
ME reconnect attempts. |
reconnect_success_total |
u64 |
Successful reconnects. |
handshake_reject_total |
u64 |
ME handshake rejects. |
handshake_error_codes |
ZeroCodeCount[] |
Handshake rejects grouped by code. |
reader_eof_total |
u64 |
ME reader EOF events. |
idle_close_by_peer_total |
u64 |
Idle closes initiated by peer. |
route_drop_no_conn_total |
u64 |
Route drops due to missing bound connection. |
route_drop_channel_closed_total |
u64 |
Route drops due to closed channel. |
route_drop_queue_full_total |
u64 |
Route drops due to full queue (total). |
route_drop_queue_full_base_total |
u64 |
Route drops in base queue mode. |
route_drop_queue_full_high_total |
u64 |
Route drops in high queue mode. |
socks_kdf_strict_reject_total |
u64 |
SOCKS KDF strict rejects. |
socks_kdf_compat_fallback_total |
u64 |
SOCKS KDF compat fallbacks. |
endpoint_quarantine_total |
u64 |
Endpoint quarantine activations. |
kdf_drift_total |
u64 |
KDF drift detections. |
kdf_port_only_drift_total |
u64 |
KDF port-only drift detections. |
hardswap_pending_reuse_total |
u64 |
Pending hardswap reused events. |
hardswap_pending_ttl_expired_total |
u64 |
Pending hardswap TTL expiry events. |
single_endpoint_outage_enter_total |
u64 |
Entered single-endpoint outage mode. |
single_endpoint_outage_exit_total |
u64 |
Exited single-endpoint outage mode. |
single_endpoint_outage_reconnect_attempt_total |
u64 |
Reconnect attempts in outage mode. |
single_endpoint_outage_reconnect_success_total |
u64 |
Reconnect successes in outage mode. |
single_endpoint_quarantine_bypass_total |
u64 |
Quarantine bypasses in outage mode. |
single_endpoint_shadow_rotate_total |
u64 |
Shadow writer rotations. |
single_endpoint_shadow_rotate_skipped_quarantine_total |
u64 |
Shadow rotations skipped because of quarantine. |
floor_mode_switch_total |
u64 |
Total floor mode switches. |
floor_mode_switch_static_to_adaptive_total |
u64 |
Static -> adaptive switches. |
floor_mode_switch_adaptive_to_static_total |
u64 |
Adaptive -> static switches. |
| Field | Type | Description |
|---|---|---|
code |
i32 |
Handshake error code. |
total |
u64 |
Events with this code. |
| Field | Type | Description |
|---|---|---|
pool_swap_total |
u64 |
Pool swap count. |
pool_drain_active |
u64 |
Current active draining pools. |
pool_force_close_total |
u64 |
Forced pool closes by timeout. |
pool_stale_pick_total |
u64 |
Stale writer picks for binding. |
writer_removed_total |
u64 |
Writer removals total. |
writer_removed_unexpected_total |
u64 |
Unexpected writer removals. |
refill_triggered_total |
u64 |
Refill triggers. |
refill_skipped_inflight_total |
u64 |
Refill skipped because refill already in-flight. |
refill_failed_total |
u64 |
Refill failures. |
writer_restored_same_endpoint_total |
u64 |
Restores on same endpoint. |
writer_restored_fallback_total |
u64 |
Restores on fallback endpoint. |
| Field | Type | Description |
|---|---|---|
secure_padding_invalid_total |
u64 |
Invalid secure padding events. |
desync_total |
u64 |
Desync events total. |
desync_full_logged_total |
u64 |
Fully logged desync events. |
desync_suppressed_total |
u64 |
Suppressed desync logs. |
desync_frames_bucket_0 |
u64 |
Desync frames bucket 0. |
desync_frames_bucket_1_2 |
u64 |
Desync frames bucket 1-2. |
desync_frames_bucket_3_10 |
u64 |
Desync frames bucket 3-10. |
desync_frames_bucket_gt_10 |
u64 |
Desync frames bucket >10. |
| Field | Type | Description |
|---|---|---|
enabled |
bool |
Whether minimal runtime snapshots are enabled by config. |
reason |
string? |
feature_disabled or source_unavailable when applicable. |
generated_at_epoch_secs |
u64 |
Snapshot generation time. |
data |
MinimalAllPayload? |
Null when disabled; fallback payload when source unavailable. |
| Field | Type | Description |
|---|---|---|
me_writers |
MeWritersData |
ME writer status block. |
dcs |
DcStatusData |
DC aggregate status block. |
me_runtime |
MinimalMeRuntimeData? |
Runtime ME control snapshot. |
network_path |
MinimalDcPathData[] |
Active IP path selection per DC. |
| Field | Type | Description |
|---|---|---|
active_generation |
u64 |
Active pool generation. |
warm_generation |
u64 |
Warm pool generation. |
pending_hardswap_generation |
u64 |
Pending hardswap generation. |
pending_hardswap_age_secs |
u64? |
Pending hardswap age in seconds. |
hardswap_enabled |
bool |
Hardswap mode toggle. |
floor_mode |
string |
Writer floor mode. |
adaptive_floor_idle_secs |
u64 |
Idle threshold for adaptive floor. |
adaptive_floor_min_writers_single_endpoint |
u8 |
Minimum writers for single-endpoint DC in adaptive mode. |
adaptive_floor_min_writers_multi_endpoint |
u8 |
Minimum writers for multi-endpoint DC in adaptive mode. |
adaptive_floor_recover_grace_secs |
u64 |
Grace period for floor recovery. |
adaptive_floor_writers_per_core_total |
u16 |
Target total writers-per-core budget in adaptive mode. |
adaptive_floor_cpu_cores_override |
u16 |
CPU core override (0 means auto-detect). |
adaptive_floor_max_extra_writers_single_per_core |
u16 |
Extra single-endpoint writers budget per core. |
adaptive_floor_max_extra_writers_multi_per_core |
u16 |
Extra multi-endpoint writers budget per core. |
adaptive_floor_max_active_writers_per_core |
u16 |
Active writer cap per core. |
adaptive_floor_max_warm_writers_per_core |
u16 |
Warm writer cap per core. |
adaptive_floor_max_active_writers_global |
u32 |
Global active writer cap. |
adaptive_floor_max_warm_writers_global |
u32 |
Global warm writer cap. |
adaptive_floor_cpu_cores_detected |
u32 |
Runtime-detected CPU cores. |
adaptive_floor_cpu_cores_effective |
u32 |
Effective core count used for adaptive caps. |
adaptive_floor_global_cap_raw |
u64 |
Raw global cap before clamping. |
adaptive_floor_global_cap_effective |
u64 |
Effective global cap after clamping. |
adaptive_floor_target_writers_total |
u64 |
Current adaptive total writer target. |
adaptive_floor_active_cap_configured |
u64 |
Configured global active cap. |
adaptive_floor_active_cap_effective |
u64 |
Effective global active cap. |
adaptive_floor_warm_cap_configured |
u64 |
Configured global warm cap. |
adaptive_floor_warm_cap_effective |
u64 |
Effective global warm cap. |
adaptive_floor_active_writers_current |
u64 |
Current active writers count. |
adaptive_floor_warm_writers_current |
u64 |
Current warm writers count. |
me_keepalive_enabled |
bool |
ME keepalive toggle. |
me_keepalive_interval_secs |
u64 |
Keepalive period. |
me_keepalive_jitter_secs |
u64 |
Keepalive jitter. |
me_keepalive_payload_random |
bool |
Randomized keepalive payload toggle. |
rpc_proxy_req_every_secs |
u64 |
Period for RPC proxy request signal. |
me_reconnect_max_concurrent_per_dc |
u32 |
Reconnect concurrency per DC. |
me_reconnect_backoff_base_ms |
u64 |
Base reconnect backoff. |
me_reconnect_backoff_cap_ms |
u64 |
Max reconnect backoff. |
me_reconnect_fast_retry_count |
u32 |
Fast retry attempts before normal backoff. |
me_pool_drain_ttl_secs |
u64 |
Pool drain TTL. |
me_pool_force_close_secs |
u64 |
Hard close timeout for draining writers. |
me_pool_min_fresh_ratio |
f32 |
Minimum fresh ratio before swap. |
me_bind_stale_mode |
string |
Stale writer bind policy. |
me_bind_stale_ttl_secs |
u64 |
Stale writer TTL. |
me_single_endpoint_shadow_writers |
u8 |
Shadow writers for single-endpoint DCs. |
me_single_endpoint_outage_mode_enabled |
bool |
Outage mode toggle for single-endpoint DCs. |
me_single_endpoint_outage_disable_quarantine |
bool |
Quarantine behavior in outage mode. |
me_single_endpoint_outage_backoff_min_ms |
u64 |
Outage mode min reconnect backoff. |
me_single_endpoint_outage_backoff_max_ms |
u64 |
Outage mode max reconnect backoff. |
me_single_endpoint_shadow_rotate_every_secs |
u64 |
Shadow rotation interval. |
me_deterministic_writer_sort |
bool |
Deterministic writer ordering toggle. |
me_writer_pick_mode |
string |
Writer picker mode (sorted_rr, p2c). |
me_writer_pick_sample_size |
u8 |
Candidate sample size for p2c picker mode. |
me_socks_kdf_policy |
string |
Current SOCKS KDF policy mode. |
quarantined_endpoints_total |
usize |
Total quarantined endpoints. |
quarantined_endpoints |
MinimalQuarantineData[] |
Quarantine details. |
| Field | Type | Description |
|---|---|---|
endpoint |
string |
Endpoint (ip:port). |
remaining_ms |
u64 |
Remaining quarantine duration. |
| Field | Type | Description |
|---|---|---|
dc |
i16 |
Telegram DC identifier. |
ip_preference |
string? |
Runtime IP family preference. |
selected_addr_v4 |
string? |
Selected IPv4 endpoint for this DC. |
selected_addr_v6 |
string? |
Selected IPv6 endpoint for this DC. |
| Field | Type | Description |
|---|---|---|
middle_proxy_enabled |
bool |
false when minimal runtime is disabled or source unavailable. |
reason |
string? |
feature_disabled or source_unavailable when not fully available. |
generated_at_epoch_secs |
u64 |
Snapshot generation time. |
summary |
MeWritersSummary |
Coverage/availability summary. |
writers |
MeWriterStatus[] |
Per-writer statuses. |
| Field | Type | Description |
|---|---|---|
configured_dc_groups |
usize |
Number of configured DC groups. |
configured_endpoints |
usize |
Total configured ME endpoints. |
available_endpoints |
usize |
Endpoints currently available. |
available_pct |
f64 |
available_endpoints / configured_endpoints * 100. |
required_writers |
usize |
Required writers based on current floor policy. |
alive_writers |
usize |
Writers currently alive. |
coverage_pct |
f64 |
alive_writers / required_writers * 100. |
| Field | Type | Description |
|---|---|---|
writer_id |
u64 |
Runtime writer identifier. |
dc |
i16? |
DC id if mapped. |
endpoint |
string |
Endpoint (ip:port). |
generation |
u64 |
Pool generation owning this writer. |
state |
string |
Writer state (warm, active, draining). |
draining |
bool |
Draining flag. |
degraded |
bool |
Degraded flag. |
bound_clients |
usize |
Number of currently bound clients. |
idle_for_secs |
u64? |
Idle age in seconds if idle. |
rtt_ema_ms |
f64? |
RTT exponential moving average. |
| Field | Type | Description |
|---|---|---|
middle_proxy_enabled |
bool |
false when minimal runtime is disabled or source unavailable. |
reason |
string? |
feature_disabled or source_unavailable when not fully available. |
generated_at_epoch_secs |
u64 |
Snapshot generation time. |
dcs |
DcStatus[] |
Per-DC status rows. |
| Field | Type | Description |
|---|---|---|
dc |
i16 |
Telegram DC id. |
endpoints |
string[] |
Endpoints in this DC (ip:port). |
endpoint_writers |
DcEndpointWriters[] |
Active writer counts grouped by endpoint. |
available_endpoints |
usize |
Endpoints currently available in this DC. |
available_pct |
f64 |
available_endpoints / endpoints_total * 100. |
required_writers |
usize |
Required writer count for this DC. |
floor_min |
usize |
Floor lower bound for this DC. |
floor_target |
usize |
Floor target writer count for this DC. |
floor_max |
usize |
Floor upper bound for this DC. |
floor_capped |
bool |
true when computed floor target was capped by active limits. |
alive_writers |
usize |
Alive writers in this DC. |
coverage_pct |
f64 |
alive_writers / required_writers * 100. |
rtt_ms |
f64? |
Aggregated RTT for DC. |
load |
usize |
Active client sessions bound to this DC. |
| Field | Type | Description |
|---|---|---|
endpoint |
string |
Endpoint (ip:port). |
active_writers |
usize |
Active writers currently mapped to endpoint. |
| Field | Type | Description |
|---|---|---|
username |
string |
Username. |
user_ad_tag |
string? |
Optional ad tag (32 hex chars). |
max_tcp_conns |
usize? |
Optional max concurrent TCP limit. |
expiration_rfc3339 |
string? |
Optional expiration timestamp. |
data_quota_bytes |
u64? |
Optional data quota. |
max_unique_ips |
usize? |
Optional unique IP limit. |
current_connections |
u64 |
Current live connections. |
active_unique_ips |
usize |
Current active unique source IPs. |
active_unique_ips_list |
ip[] |
Current active unique source IP list. |
recent_unique_ips |
usize |
Unique source IP count inside the configured recent window. |
recent_unique_ips_list |
ip[] |
Recent-window unique source IP list. |
total_octets |
u64 |
Total traffic octets for this user. |
links |
UserLinks |
Active connection links derived from current config. |
| Field | Type | Description |
|---|---|---|
classic |
string[] |
Active tg://proxy links for classic mode. |
secure |
string[] |
Active tg://proxy links for secure/DD mode. |
tls |
string[] |
Active tg://proxy links for EE-TLS mode (for each host+TLS domain). |
Link generation uses active config and enabled modes:
- Link port is
general.links.public_portwhen configured; otherwiseserver.port. - If
general.links.public_hostis non-empty, it is used as the single link host override. - If
public_hostis not set, hosts are resolved fromserver.listenersin order:announce->announce_ip-> listener bindip. - For wildcard listener IPs (
0.0.0.0/::), startup-detected external IP of the same family is used when available. - Listener-derived hosts are de-duplicated while preserving first-seen order.
- If multiple hosts are resolved, API returns links for all resolved hosts in every enabled mode.
- If no host can be resolved from listeners, fallback is startup-detected
IPv4 -> IPv6. - Final compatibility fallback uses
listen_addr_ipv4/listen_addr_ipv6when routable, otherwise"UNKNOWN". - User rows are sorted by
usernamein ascending lexical order.
| Field | Type | Description |
|---|---|---|
user |
UserInfo |
Created or updated user view. |
secret |
string |
Effective user secret. |
| Endpoint | Notes |
|---|---|
POST /v1/users |
Creates user, validates config, then atomically updates only affected access.* TOML tables (access.users always, plus optional per-user tables present in request). |
PATCH /v1/users/{username} |
Partial update of provided fields only. Missing fields remain unchanged. Current implementation persists full config document on success. |
POST /v1/users/{username}/rotate-secret |
Currently returns 404 in runtime route matcher; request schema is reserved for intended behavior. |
DELETE /v1/users/{username} |
Deletes only specified user, removes this user from related optional access.user_* maps, blocks last-user deletion, and atomically updates only related access.* TOML tables. |
All mutating endpoints:
- Respect
read_onlymode. - Accept optional
If-Matchfor optimistic concurrency. - Return new
revisionafter successful write. - Use process-local mutation lock + atomic write (
tmp + rename) for config persistence.
Delete path cleanup guarantees:
- Config cleanup removes only the requested username keys.
- Runtime unique-IP cleanup removes only this user's limiter and tracked IP state.
| Endpoint | minimal_runtime_enabled=false |
minimal_runtime_enabled=true + source unavailable |
minimal_runtime_enabled=true + source available |
|---|---|---|---|
/v1/stats/minimal/all |
enabled=false, reason=feature_disabled, data=null |
enabled=true, reason=source_unavailable, fallback data with disabled ME blocks |
enabled=true, reason omitted, full payload |
/v1/stats/me-writers |
middle_proxy_enabled=false, reason=feature_disabled |
middle_proxy_enabled=false, reason=source_unavailable |
middle_proxy_enabled=true, runtime snapshot |
/v1/stats/dcs |
middle_proxy_enabled=false, reason=feature_disabled |
middle_proxy_enabled=false, reason=source_unavailable |
middle_proxy_enabled=true, runtime snapshot |
/v1/stats/upstreams |
enabled=false, reason=feature_disabled, summary/upstreams omitted, zero still present |
enabled=true, reason=source_unavailable, summary/upstreams omitted, zero present |
enabled=true, reason omitted, summary/upstreams present, zero present |
source_unavailable conditions:
- ME endpoints: ME pool is absent (for example direct-only mode or failed ME initialization).
- Upstreams endpoint: non-blocking upstream snapshot lock is unavailable at request time.
Additional runtime endpoint behavior:
| Endpoint | Disabled by feature flag | source_unavailable condition |
Normal mode |
|---|---|---|---|
/v1/runtime/me_pool_state |
No | ME pool snapshot unavailable | enabled=true, full payload |
/v1/runtime/me_quality |
No | ME pool snapshot unavailable | enabled=true, full payload |
/v1/runtime/upstream_quality |
No | Upstream runtime snapshot unavailable | enabled=true, full payload |
/v1/runtime/nat_stun |
No | STUN shared state unavailable | enabled=true, full payload |
/v1/runtime/me-selftest |
No | ME pool unavailable => enabled=false, reason=source_unavailable |
enabled=true, full payload |
/v1/runtime/connections/summary |
runtime_edge_enabled=false => enabled=false, reason=feature_disabled |
Recompute lock contention with no cache entry => enabled=true, reason=source_unavailable |
enabled=true, full payload |
/v1/runtime/events/recent |
runtime_edge_enabled=false => enabled=false, reason=feature_disabled |
Not used in current implementation | enabled=true, full payload |
When general.use_middle_proxy=true and general.me2dc_fallback=true:
- Startup does not block on full ME pool readiness; initialization can continue in background.
- Runtime initialization payload can expose ME stage
background_inituntil pool becomes ready. - Admission/routing decision uses two readiness grace windows for "ME not ready" periods:
80sbefore first-ever readiness is observed (startup grace),6safter readiness has been observed at least once (runtime failover timeout). - While in fallback window breach, new sessions are routed via Direct-DC; when ME becomes ready, routing returns to Middle mode for new sessions.
- Success responses always include
revision. - Error responses never include
revision; they includerequest_id. - Optional fields with
skip_serializing_ifare omitted when absent. - Nullable payload fields may still be
nullwhere contract uses?(for exampleUserInfooption fields). - For
/v1/stats/upstreams, authentication details of SOCKS upstreams are intentionally omitted. ip[]fields are serialized as JSON string arrays (for example"1.2.3.4","2001:db8::1").
| Topic | Details |
|---|---|
| API startup | API listener is spawned only when [server.api].enabled=true. |
listen port 0 |
API spawn is skipped when parsed listen port is 0 (treated as disabled bind target). |
| Bind failure | Failed API bind logs warning and API task exits (no auto-retry loop). |
| ME runtime status endpoints | /v1/stats/me-writers, /v1/stats/dcs, /v1/stats/minimal/all require [server.api].minimal_runtime_enabled=true; otherwise they return disabled payload with reason=feature_disabled. |
| Upstream runtime endpoint | /v1/stats/upstreams always returns zero, but runtime fields (summary, upstreams) require [server.api].minimal_runtime_enabled=true. |
| Restart requirements | server.api changes are restart-required for predictable behavior. |
| Hot-reload nuance | A pure server.api-only config change may not propagate through watcher broadcast; a mixed change (with hot fields) may propagate API flags while still warning that restart is required. |
| Runtime apply path | Successful writes are picked up by existing config watcher/hot-reload path. |
| Exposure | Built-in TLS/mTLS is not provided. Use loopback bind + reverse proxy if needed. |
| Pagination | User list currently has no pagination/filtering. |
| Serialization side effect | Updated TOML table bodies are re-serialized on write. Endpoints that persist full config can still rewrite broader formatting/comments. |
POST /v1/users/{username}/rotate-secretis currently unreachable in route matcher and returns404.- API runtime controls under
server.apiare documented as restart-required; hot-reload behavior for these fields is not strictly uniform in all change combinations.