{"version":1,"min_supported":1,"open_proxy":false,"allowed_ports":[80,443],"limits":{"max_devices_per_user":5,"max_connected_nodes":2000,"max_frame_bytes":262144,"max_body_bytes":2097152,"max_concurrent_per_node":2,"min_seconds_per_node_domain":6,"job_timeout_seconds":25,"max_queue_depth":500,"default_wait_seconds":15,"max_wait_seconds":60,"default_daily_requests_user":200,"default_daily_requests_guest":0,"default_donor_mb_per_day":500,"max_donor_mb_per_day":20480,"ping_seconds":20,"missed_pings_before_evict":2,"reconnect_min_seconds":1,"reconnect_max_seconds":60,"ticket_ttl_seconds":30,"cache_ttl_seconds":600,"cache_max_bytes":268435456,"cache_entry_max_bytes":4194304,"usage_daily_retention_days":400,"event_retention_days":30,"event_max_rows":50000,"request_retention_seconds":600,"xp_daily_cap":50,"dispatcher_tick_ms":200,"hello_timeout_seconds":10,"reconcile_seconds":2,"prune_interval_seconds":3600,"breaker_failures":5,"breaker_open_seconds":60,"queue_max_wait_seconds":30,"job_grace_seconds":5,"dispatch_batch":50,"url_max_chars":2048,"poll_interval_ms":100},"frames":[{"type":"hello","direction":"c2s","max_bytes":262144,"fields":[{"name":"protocol","type":"int","required":true},{"name":"client_version","type":"str","required":true},{"name":"kind","type":"str","required":true},{"name":"platform","type":"str","required":true},{"name":"modes","type":"list","required":true},{"name":"limits","type":"object","required":false}]},{"type":"pong","direction":"c2s","max_bytes":262144,"fields":[]},{"type":"job_result","direction":"c2s","max_bytes":3145728,"fields":[{"name":"job_id","type":"str","required":true},{"name":"status","type":"int","required":true},{"name":"headers","type":"object","required":false},{"name":"body_b64","type":"str","required":true},{"name":"truncated","type":"bool","required":false},{"name":"elapsed_ms","type":"int","required":false}]},{"type":"job_error","direction":"c2s","max_bytes":262144,"fields":[{"name":"job_id","type":"str","required":true},{"name":"code","type":"str","required":true}]},{"type":"tunnel_data","direction":"c2s","max_bytes":262144,"fields":[{"name":"conn_id","type":"str","required":true},{"name":"b64","type":"str","required":true}]},{"type":"tunnel_close","direction":"c2s","max_bytes":262144,"fields":[{"name":"conn_id","type":"str","required":true}]},{"type":"tunnel_opened","direction":"c2s","max_bytes":262144,"fields":[{"name":"conn_id","type":"str","required":true},{"name":"ok","type":"bool","required":true},{"name":"code","type":"str","required":false}]},{"type":"usage","direction":"c2s","max_bytes":262144,"fields":[{"name":"bytes_up","type":"int","required":true},{"name":"bytes_down","type":"int","required":true}]},{"type":"welcome","direction":"s2c","max_bytes":262144,"fields":[{"name":"device_uid","type":"str","required":true},{"name":"limits","type":"object","required":true},{"name":"destinations","type":"list","required":true},{"name":"settings","type":"object","required":true}]},{"type":"ping","direction":"s2c","max_bytes":262144,"fields":[]},{"type":"job","direction":"s2c","max_bytes":262144,"fields":[{"name":"job_id","type":"str","required":true},{"name":"method","type":"str","required":true},{"name":"url","type":"str","required":true},{"name":"headers","type":"object","required":false},{"name":"timeout","type":"int","required":true}]},{"type":"tunnel_open","direction":"s2c","max_bytes":262144,"fields":[{"name":"conn_id","type":"str","required":true},{"name":"host","type":"str","required":true},{"name":"port","type":"int","required":true}]},{"type":"tunnel_data","direction":"s2c","max_bytes":262144,"fields":[{"name":"conn_id","type":"str","required":true},{"name":"b64","type":"str","required":true}]},{"type":"tunnel_close","direction":"s2c","max_bytes":262144,"fields":[{"name":"conn_id","type":"str","required":true}]},{"type":"settings_update","direction":"s2c","max_bytes":262144,"fields":[{"name":"settings","type":"object","required":true}]},{"type":"kick","direction":"s2c","max_bytes":262144,"fields":[{"name":"reason","type":"str","required":true}]}],"destinations":[{"suffix":"reddit.com","adapter":"reddit","methods":["GET"],"ports":[80,443],"modes":["tunnel","fetch"],"max_rps":0.5},{"suffix":"redd.it","adapter":"reddit","methods":["GET"],"ports":[80,443],"modes":["tunnel","fetch"],"max_rps":0.5}],"refusals":[{"code":"host_not_allowed","meaning":"destination is not on the allowlist"},{"code":"port_not_allowed","meaning":"port is not 80 or 443"},{"code":"address_not_public","meaning":"resolved address is private, loopback, link-local, CGNAT or multicast"},{"code":"redirect_not_allowed","meaning":"redirect leaves the allowlist"},{"code":"method_not_allowed","meaning":"method is not permitted for the destination"},{"code":"bandwidth_exhausted","meaning":"donor daily bandwidth cap reached"},{"code":"concurrency_exceeded","meaning":"donor concurrency cap reached"},{"code":"outside_hours","meaning":"outside the donor's active hours"},{"code":"body_too_large","meaning":"response exceeds the body cap"},{"code":"timeout","meaning":"job exceeded its timeout"}]}