{"id":18283482,"url":"https://github.com/ajedi32/echovr_api_docs","last_synced_at":"2025-11-13T22:43:32.719Z","repository":{"id":47287175,"uuid":"156934818","full_name":"Ajedi32/echovr_api_docs","owner":"Ajedi32","description":"Unofficial documentation for Echo VR's HTTP API","archived":false,"fork":false,"pushed_at":"2021-09-04T16:06:15.000Z","size":134,"stargazers_count":22,"open_issues_count":2,"forks_count":6,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-13T20:09:04.205Z","etag":null,"topics":["api-client","documentation","echo-arena","echo-vr","virtual-reality"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ajedi32.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-11-10T01:03:17.000Z","updated_at":"2025-08-27T12:18:25.000Z","dependencies_parsed_at":"2022-09-12T15:32:14.135Z","dependency_job_id":null,"html_url":"https://github.com/Ajedi32/echovr_api_docs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Ajedi32/echovr_api_docs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ajedi32%2Fechovr_api_docs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ajedi32%2Fechovr_api_docs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ajedi32%2Fechovr_api_docs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ajedi32%2Fechovr_api_docs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ajedi32","download_url":"https://codeload.github.com/Ajedi32/echovr_api_docs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ajedi32%2Fechovr_api_docs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284304466,"owners_count":26982161,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-13T02:00:06.582Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-client","documentation","echo-arena","echo-vr","virtual-reality"],"created_at":"2024-11-05T13:09:41.705Z","updated_at":"2025-11-13T22:43:32.699Z","avatar_url":"https://github.com/Ajedi32.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Echo VR API Documentation\n\nUnofficial documentation for Echo VR's HTTP API.\n\n## Summary\n\nEcho Arena has an HTTP API available for querying current game state. This API\nlistens locally on port 6721 (`http://127.0.0.1:6721/session`). This API now requires a setting to be toggled on.\n\nNote that if any other service is alredy bound to this (TCP) port, which often\nhappens on Windows, Echo will not be able to bind to it. To kill any services\nusing it, run `net stop HTTP` in an administrator command prompt.\n\nThis repository aims to document all the functionality of this API.\n\n## API Endpoints\n\n### GET /session\n\nThis returns a detailed representation of the current state of the match. The response is a JSON string, which can be parsed with any standard JSON parser.\n\nExample response (formatted for readability):\n\n\u003cpre\u003e\n{\n    \u003ca href=\"#client_name\"\u003e\"client_name\"\u003c/a\u003e: \"Timemaster111\",\n    \u003ca href=\"#sessionid\"\u003e\"sessionid\"\u003c/a\u003e: \"1C32B3DA-F1F6-4B17-8BAE-FD1BC59C28BD\",\n    \u003ca href=\"#sessionip\"\u003e\"sessionip\"\u003c/a\u003e: \"184.154.39.222\",\n    \u003ca href=\"#match_type\"\u003e\"match_type\"\u003c/a\u003e: \"Echo_Arena\", // \"Echo_Arena_Private\", \"Echo_Arena\", \"Echo_Combat\", \"Echo_Combat_Private\", \"Social_2.0\", \"INVALID GAMETYPE\"\n    \u003ca href=\"#map_name\"\u003e\"map_name\"\u003c/a\u003e: \"mpl_arena_a\", // \"mpl_arena_a\", \"mpl_lobby_b2\", mpl_combat_dyson, mpl_combat_combustion, mpl_combat_fission, mpl_combat_gauss, \"INVALID LEVEL\"\n    \u003ca href=\"#game_clock\"\u003e\"game_clock\"\u003c/a\u003e: 215.09978,\n    \u003ca href=\"#game_clock_display\"\u003e\"game_clock_display\"\u003c/a\u003e: \"03:35.09\",\n    \u003ca href=\"#private_match\"\u003e\"private_match\"\u003c/a\u003e: false,\n    \u003ca href=\"#total_round_count\"\u003e\"total_round_count\"\u003c/a\u003e: 1,\n    \u003ca href=\"#blue_round_score\"\u003e\"blue_round_score\"\u003c/a\u003e: 0,\n    \u003ca href=\"#orange_round_score\"\u003e\"orange_round_score\"\u003c/a\u003e: 0,\n    \u003ca href=\"#blue_points\"\u003e\"blue_points\"\u003c/a\u003e: 2,\n    \u003ca href=\"#orange_points\"\u003e\"orange_points\"\u003c/a\u003e: 4,\n    \u003ca href=\"#tournament_match\"\u003e\"tournament_match\"\u003c/a\u003e: false,\n    \u003ca href=\"#blue_team_restart_request\"\u003e\"blue_team_restart_request\"\u003c/a\u003e: 0,\n    \u003ca href=\"#orange_team_restart_request\"\u003e\"orange_team_restart_request\"\u003c/a\u003e: 0,\n    \u003ca href=\"#right_shoulder_pressed\"\u003e\"right_shoulder_pressed\"\u003c/a\u003e: 0.0,\n    \u003ca href=\"#right_shoulder_pressed2\"\u003e\"right_shoulder_pressed2\"\u003c/a\u003e: 0.0,\n    \u003ca href=\"#left_shoulder_pressed\"\u003e\"left_shoulder_pressed\"\u003c/a\u003e: 0.0,\n    \u003ca href=\"#left_shoulder_pressed2\"\u003e\"left_shoulder_pressed2\"\u003c/a\u003e: 0.0,\n    \u003ca href=\"#packet_loss_ratio\"\u003e\"packet_loss_ratio\"\u003c/a\u003e: TBC,\n    \u003ca href=\"#game_status\"\u003e\"game_status\"\u003c/a\u003e: \"score\", // \"pre_match\", \"round_start\", \"playing\", \"score\", \"round_over\", \"round_start\", \"post_match\", \"pre_sudden_death\", \"sudden_death\", \"post_sudden_death\"\n    \u003ca href=\"#pause\"\u003e\"pause\"\u003c/a\u003e: {\n        \u003ca href=\"#pausepaused_state\"\u003e\"paused_state\"\u003c/a\u003e: \"unpaused\", // \"unpaused\", \"unpausing\", \"paused\", \"paused_requested\"\n        \u003ca href=\"#pauseunpaused_team\"\u003e\"unpaused_team\"\u003c/a\u003e: \"none\", // \"orange\", \"blue\", \"none\"\n        \u003ca href=\"#pausepaused_requested_team\"\u003e\"paused_requested_team\"\u003c/a\u003e: \"none\", // \"orange\", \"blue\", \"none\"\n        \u003ca href=\"#pauseunpaused_timer\"\u003e\"unpaused_timer\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#pausepaused_timer\"\u003e\"paused_timer\"\u003c/a\u003e: 0.0\n    },\n    \u003ca href=\"#possession\"\u003e\"possession\"\u003c/a\u003e: [\n        1,\n        0\n    ],\n    \u003ca href=\"#last_throw\"\u003e\"last_throw\"\u003c/a\u003e: {\n        \u003ca href=\"#last_throwarm_speed\"\u003e\"arm_speed\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwtotal_speed\"\u003e\"total_speed\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwoff_axis_spin_deg\"\u003e\"off_axis_spin_deg\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwwrist_throw_penalty\"\u003e\"wrist_throw_penalty\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwrot_per_sec\"\u003e\"rot_per_sec\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwpot_speed_from_rot\"\u003e\"pot_speed_from_rot\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwspeed_from_arm\"\u003e\"speed_from_arm\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwspeed_from_movement\"\u003e\"speed_from_movement\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwspeed_from_wrist\"\u003e\"speed_from_wrist\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwwrist_align_to_throw_deg\"\u003e\"wrist_align_to_throw_deg\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwthrow_align_to_movement_deg\"\u003e\"throw_align_to_movement_deg\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwoff_axis_penalty\"\u003e\"off_axis_penalty\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_throwthrow_move_penalty\"\u003e\"throw_move_penalty\"\u003c/a\u003e: 0.0\n    },\n    \u003ca href=\"#last_score\"\u003e\"last_score\"\u003c/a\u003e: {\n        \u003ca href=\"#last_scoredisc_speed\"\u003e\"disc_speed\"\u003c/a\u003e: 0.0,\n        \u003ca href=\"#last_scoreteam\"\u003e\"team\"\u003c/a\u003e: \"orange\", // \"orange\", \"blue\", \"none\"\n        \u003ca href=\"#last_scoregoal_type\"\u003e\"goal_type\"\u003c/a\u003e: \"SLAM DUNK\", // \"[NO GOAL]\", \"SLAM DUNK\", \"INSIDE SHOT\", \"LONG SHOT\", \"BOUNCE SHOT\", \"LONG BOUNCE SHOT\", \"BUMPER_SHOT\" (TBC)\n        \u003ca href=\"#last_scorepoint_amount\"\u003e\"point_amount\"\u003c/a\u003e: 2,\n        \u003ca href=\"#last_scoredistance_thrown\"\u003e\"distance_thrown\"\u003c/a\u003e: 0.40054435,\n        \u003ca href=\"#last_scoreperson_scored\"\u003e\"person_scored\"\u003c/a\u003e: \"Bob\",\n        \u003ca href=\"#last_scoreassist_scored\"\u003e\"assist_scored\"\u003c/a\u003e: \"[INVALID]\"\n    },\n    \u003ca href=\"#disc\"\u003e\"disc\"\u003c/a\u003e: {\n        \u003ca href=\"#discposition\"\u003e\"position\"\u003c/a\u003e: [\n            0.0,\n            0.0,\n            0.0\n        ],\n        \u003ca href=\"#discforward\"\u003e\"forward\"\u003c/a\u003e: [\n            0.0,\n            0.0,\n            1.0\n        ],\n        \u003ca href=\"#discleft\"\u003e\"left\"\u003c/a\u003e: [\n            1.0,\n            0.0,\n            0.0\n        ],\n        \u003ca href=\"#discup\"\u003e\"up\"\u003c/a\u003e: [\n            0.0,\n            1.0,\n            0.0\n        ],\n        \u003ca href=\"#discvelocity\"\u003e\"velocity\"\u003c/a\u003e: [\n            0.0,\n            0.0,\n            0.0\n        ],\n        \u003ca href=\"#discbounce_count\"\u003e\"bounce_count\"\u003c/a\u003e: 0\n    },\n    \u003ca href=\"#player\"\u003e\"player\"\u003c/a\u003e: {\n        \u003ca href=\"#playervr_left\"\u003e\"vr_left\"\u003c/a\u003e: [\n            0.78700006,\n            0.072000004,\n            0.61300004\n        ],\n        \u003ca href=\"#playervr_position\"\u003e\"vr_position\"\u003c/a\u003e: [\n            -3.9650002,\n            2.2310002,\n            -34.506001\n        ],\n        \u003ca href=\"#playervr_forward\"\u003e\"vr_forward\"\u003c/a\u003e: [\n            -0.61700004,\n            0.091000006,\n            0.78200006\n        ],\n        \u003ca href=\"#playervr_up\"\u003e\"vr_up\"\u003c/a\u003e: [\n            0.0,\n            0.99300003,\n            -0.116\n        ]\n    },\n    \u003ca href=\"#teams\"\u003e\"teams\"\u003c/a\u003e: [\n        {\n            \u003ca href=\"#teamsteam\"\u003e\"team\"\u003c/a\u003e: \"BLUE TEAM\",\n            \u003ca href=\"#teamspossession\"\u003e\"possession\"\u003c/a\u003e: false,\n            \u003ca href=\"#teamsstats\"\u003e\"stats\"\u003c/a\u003e: {\n                \u003ca href=\"#teamsstatspoints\"\u003e\"points\"\u003c/a\u003e: 2,\n                \u003ca href=\"#teamsstatspossession_time\"\u003e\"possession_time\"\u003c/a\u003e: 32.055771,\n                \u003ca href=\"#teamsstatsinterceptions\"\u003e\"interceptions\"\u003c/a\u003e: 0,\n                \u003ca href=\"#teamsstatsblocks\"\u003e\"blocks\"\u003c/a\u003e: 0,\n                \u003ca href=\"#teamsstatssteals\"\u003e\"steals\"\u003c/a\u003e: 1,\n                \u003ca href=\"#teamsstatscatches\"\u003e\"catches\"\u003c/a\u003e: 0,\n                \u003ca href=\"#teamsstatspasses\"\u003e\"passes\"\u003c/a\u003e: 0,\n                \u003ca href=\"#teamsstatssaves\"\u003e\"saves\"\u003c/a\u003e: 3,\n                \u003ca href=\"#teamsstatsgoals\"\u003e\"goals\"\u003c/a\u003e: 0,\n                \u003ca href=\"#teamsstatsstuns\"\u003e\"stuns\"\u003c/a\u003e: 6,\n                \u003ca href=\"#teamsstatsassists\"\u003e\"assists\"\u003c/a\u003e: 1,\n                \u003ca href=\"#teamsstatsshots_taken\"\u003e\"shots_taken\"\u003c/a\u003e: 0\n            },\n            \u003ca href=\"#teamsplayers\"\u003e\"players\"\u003c/a\u003e: [\n                {\n                    \u003ca href=\"#teamsplayersname\"\u003e\"name\"\u003c/a\u003e: \"Timemaster111\",\n                    \u003ca href=\"#teamsplayersplayerid\"\u003e\"playerid\"\u003c/a\u003e: 0,\n                    \u003ca href=\"#teamsplayersuserid\"\u003e\"userid\"\u003c/a\u003e: 3561909181390317,\n                    \u003ca href=\"#teamsplayersnumber\"\u003e\"number\"\u003c/a\u003e: 5,\n                    \u003ca href=\"#teamsplayerslevel\"\u003e\"level\"\u003c/a\u003e: 50,\n                    \u003ca href=\"#teamsplayersping\"\u003e\"ping\"\u003c/a\u003e: 48,\n                    \u003ca href=\"#teamsplayersstunned\"\u003e\"stunned\"\u003c/a\u003e: false,\n                    \u003ca href=\"#teamsplayersinvulnerable\"\u003e\"invulnerable\"\u003c/a\u003e: false,\n                    \u003ca href=\"#teamsplayerspossession\"\u003e\"possession\"\u003c/a\u003e: false,\n                    \u003ca href=\"#teamsplayersholding_left\"\u003e\"holding_left\"\u003c/a\u003e: \"none\",\n                    \u003ca href=\"#teamsplayersholding_right\"\u003e\"holding_right\"\u003c/a\u003e: \"none\",\n                    \u003ca href=\"#teamsplayersblocking\"\u003e\"blocking\"\u003c/a\u003e: false,\n                    \u003ca href=\"#teamsplayersstats\"\u003e\"stats\"\u003c/a\u003e: {\n                        \u003ca href=\"#teamsstatspossession_time\"\u003e\"possession_time\"\u003c/a\u003e: 8.9302616,\n                        \u003ca href=\"#teamsstatspoints\"\u003e\"points\"\u003c/a\u003e: 0,\n                        \u003ca href=\"#teamsstatssaves\"\u003e\"saves\"\u003c/a\u003e: 1,\n                        \u003ca href=\"#teamsstatsgoals\"\u003e\"goals\"\u003c/a\u003e: 0,\n                        \u003ca href=\"#teamsstatsstuns\"\u003e\"stuns\"\u003c/a\u003e: 3,\n                        \u003ca href=\"#teamsstatspasses\"\u003e\"passes\"\u003c/a\u003e: 0,\n                        \u003ca href=\"#teamsstatscatches\"\u003e\"catches\"\u003c/a\u003e: 0,\n                        \u003ca href=\"#teamsstatssteals\"\u003e\"steals\"\u003c/a\u003e: 0,\n                        \u003ca href=\"#teamsstatsblocks\"\u003e\"blocks\"\u003c/a\u003e: 0,\n                        \u003ca href=\"#teamsstatsinterceptions\"\u003e\"interceptions\"\u003c/a\u003e: 0,\n                        \u003ca href=\"#teamsstatsassists\"\u003e\"assists\"\u003c/a\u003e: 0,\n                        \u003ca href=\"#teamsstatsshots_taken\"\u003e\"shots_taken\"\u003c/a\u003e: 0\n                    },\n                    \u003ca href=\"#teamsplayersvelocity\"\u003e\"velocity\"\u003c/a\u003e: [\n                        0.48200002,\n                        0.83300006,\n                        -2.3240001\n                    ],\n                    \u003ca href=\"#teamsplayershead\"\u003e\"head\"\u003c/a\u003e: {\n                        \u003ca href=\"#teamsplayersheadposition\"\u003e\"position\"\u003c/a\u003e: [\n                            -2.1360002,\n                            2.098,\n                            -33.876003\n                        ],\n                        \u003ca href=\"#teamsplayersheadforward\"\u003e\"forward\"\u003c/a\u003e: [\n                            0.14600001,\n                            -0.36400002,\n                            0.92000002\n                        ],\n                        \u003ca href=\"#teamsplayersheadleft\"\u003e\"left\"\u003c/a\u003e: [\n                            0.98400003,\n                            -0.045000002,\n                            -0.17400001\n                        ],\n                        \u003ca href=\"#teamsplayershead\"\u003e\u003c/a\u003e\"up\": [\n                            0.105,\n                            0.93000007,\n                            0.35200003\n                        ]\n                    },\n                    \u003ca href=\"#teamsplayersbody\"\u003e\"body\"\u003c/a\u003e: {\n                        \u003ca href=\"#teamsplayersbodyposition\"\u003e\"position\"\u003c/a\u003e: [\n                            -2.1360002,\n                            2.098,\n                            -33.876003\n                        ],\n                        \u003ca href=\"#teamsplayersbodyforward\"\u003e\"forward\"\u003c/a\u003e: [\n                            0.296,\n                            0.001,\n                            0.95500004\n                        ],\n                        \u003ca href=\"#teamsplayersbodyleft\"\u003e\"left\"\u003c/a\u003e: [\n                            0.95500004,\n                            -0.0020000001,\n                            -0.296\n                        ],\n                        \u003ca href=\"#teamsplayersbodyup\"\u003e\"up\"\u003c/a\u003e: [\n                            0.001,\n                            1.0,\n                            -0.001\n                        ]\n                    },\n                    \u003ca href=\"#teamsplayersrhand\"\u003e\"rhand\"\u003c/a\u003e: {\n                        \u003ca href=\"#teamsplayersrhandpos\"\u003e\"pos\"\u003c/a\u003e: [\n                            -2.3390002,\n                            1.8030001,\n                            -33.733002\n                        ],\n                        \u003ca href=\"#teamsplayersrhandforward\"\u003e\"forward\"\u003c/a\u003e: [\n                            -0.259,\n                            0.74000001,\n                            0.62\n                        ],\n                        \u003ca href=\"#teamsplayersrhandleft\"\u003e\"left\"\u003c/a\u003e: [\n                            0.80900002,\n                            -0.18400002,\n                            0.55800003\n                        ],\n                        \u003ca href=\"#teamsplayersrhandup\"\u003e\"up\"\u003c/a\u003e: [\n                            0.52700001,\n                            0.64700001,\n                            -0.55200005\n                        ]\n                    },\n                    \u003ca href=\"#teamsplayerslhand\"\u003e\"lhand\"\u003c/a\u003e: {\n                        \u003ca href=\"#teamsplayerslhandpos\"\u003e\"pos\":\u003c/a\u003e [\n                            -2.0700002,\n                            1.8610001,\n                            -33.788002\n                        ],\n                        \u003ca href=\"#teamsplayerslhandforward\"\u003e\"forward\"\u003c/a\u003e: [\n                            -0.44800001,\n                            0.73100001,\n                            0.51500005\n                        ],\n                        \u003ca href=\"#teamsplayerslhandleft\"\u003e\"left\"\u003c/a\u003e: [\n                            0.89200002,\n                            0.32200003,\n                            0.317\n                        ],\n                        \u003ca href=\"#teamsplayerslhandup\"\u003e\"up\"\u003c/a\u003e: [\n                            0.066,\n                            0.60100001,\n                            -0.79600006\n                        ]\n                    },\n                },\n                {\n                /* ... more players ... */\n                }\n            ]\n        },\n        {\n            \u003ca href=\"#teams\"\u003e\"team\"\u003c/a\u003e: \"ORANGE TEAM\",\n            /* ... same as blue team ... */\n        },\n        {\n            \u003ca href=\"#teams\"\u003e\"team\"\u003c/a\u003e: \"SPECTATORS\",\n            /* ... same as blue team ... */\n        }\n    ]\n}  \n\u003c/pre\u003e\n\n#### Properties\n\nThe response is a JSON object, with the following properties:\n\n#### `client_name`\nThe username of the signed-in user.\n\n#### `sessionid`\nA 128-bit string-encoded GUID of the session.\n\n#### `sessionip`\nIP address to the current server\n\n#### `match_type`\nRepresents the type of match being played.\n\nPossible values:\n\n* `\"Echo_Arena_Private\"`\n* `\"Echo_Arena\"`\n* `\"Echo_Combat\"`\n* `\"Echo_Combat_Private\"`\n* `\"Social_2.0\"`\n* `\"INVALID GAMETYPE\"`\n\n#### `map_name`\nName of the map being played.\n\nPossible values:\n* `\"mpl_arena_a\"` - Standard Echo Arena map\n* `\"mpl_lobby_b2\"` - Lobby\n* `mpl_combat_dyson` - Combat maps\n* `mpl_combat_combustion`\n* `mpl_combat_fission`\n* `mpl_combat_gauss`\n* `\"INVALID LEVEL\"`\n\n#### `game_clock`\nCurrent game time in seconds.\n\n#### `game_clock_display`\nCurrent game time as shown in game.\n\n#### `private_match`\nWhether the current session is a private lobby.\n\n#### `total_round_count`\nTotal number of rounds to be played in the match.\n\n#### `blue_round_score`\nTotal number of rounds that blue has won.\n\n#### `orange_round_score`\nTotal number of rounds that orange has won.\n\n#### `blue_points`\nNumber of points blue has scored this round.\n\n#### `orange_points`\nNumber of points orange has scored this round.\n\n#### `tournament_match`\nWhether the current session is being used for an official tournament orchestrated in collaboration with the Echo Arena developers. This is [for possible future integration with ESL and other organized tournaments](https://discordapp.com/channels/326412222119149578/506931756675497986/510566303367430145).\n\n#### `blue_team_restart_request`\nWhether or not the blue team is requesting a restart.\n\n#### `orange_team_restart_request`\nWhether or not the orange team is requesting a restart.\n\n#### `right_shoulder_pressed`\nTouch controller input\n\n#### `right_shoulder_pressed2`\nTouch controller input\n\n#### `left_shoulder_pressed`\nTouch controller input\n\n#### `left_shoulder_pressed2`\nTouch controller input\n\n#### `packet_loss_ratio`\nNumber of packets missed bu the client out of the total number of packets sent by the server in a 5 second window.\n\n#### `game_status`\nThe current game's status.\n\nPossible values:\n\n* `\"pre_match\"`\n* `\"round_start\"`\n* `\"playing\"`\n* `\"score\"`\n* `\"round_over\"`\n* `\"round_start\"`\n* `\"post_match\"`\n* `\"pre_sudden_death\"`\n* `\"sudden_death\"`\n* `\"post_sudden_death\"`\n\n#### `pause`\nDetails about whether the game is currently paused.\n\n#### `pause.paused_state`\nCurrent pause state of the match.\n\nPossible values:\n* `\"unpaused\"`\n* `\"unpausing\"`\n* `\"paused\"`\n* `\"paused_requested\"`\n\n#### `pause.unpaused_team`\nTeam that unpaused the game.\n\nPossible values:\n* `\"orange\"`\n* `\"blue\"`\n* `\"none\"`\n\n#### `pause.paused_requested_team`\nTeam that pressed the pause button.\n\nPossible values:\n* `\"orange\"`\n* `\"blue\"`\n* `\"none\"`\n\n#### `pause.unpaused_timer`\nTime until gameplay will resume.\n\n#### `pause.paused_timer`\nTime since game was paused.\n\n#### `possession`\nTeam and player currently in possession of the disc.\n\n`possession[0]` is the team in possession and `possession[1]` is the player in that team. \n\n#### `last_throw`\nInfo about the last throw made in game by the client user.\n\n#### `last_throw.arm_speed`\nSpeed of the arm during the last throw.\n\n#### `last_throw.total_speed`\nCombination of all speed factors that went into the disc.\n\n#### `last_throw.off_axis_spin_deg`\n\n#### `last_throw.wrist_throw_penalty`\n\n#### `last_throw.rot_per_sec`\n\n#### `last_throw.pot_speed_from_rot`\n\n#### `last_throw.speed_from_arm`\n\n#### `last_throw.speed_from_movement`\n\n#### `last_throw.speed_from_wrist`\n\n#### `last_throw.wrist_align_to_throw_deg`\n\n#### `last_throw.throw_align_to_movement_deg`\n\n#### `last_throw.off_axis_penalty`\n\n#### `last_throw.throw_move_penalty`\n\n#### `last_score`\nLast score made in the game.\n\n#### `last_score.disc_speed`\nSpeed of the disc when it went into the goal.\n\n#### `last_score.team`\nTeam that scored the last goal.\n\n* `\"blue\"`\n* `\"orange\"`\n\n#### `last_score.goal_type`\nA human-readable explanation of the type of goal scored. This is \"[NO GOAL]\" by default when no goal has been scored.\n\nPossible values:\n\n* `\"[NO GOAL]\"`\n* `\"SLAM DUNK\"`\n* `\"INSIDE SHOT\"`\n* `\"LONG SHOT\"`\n* `\"BOUNCE SHOT\"`\n* `\"LONG BOUNCE SHOT\"`\n* `\"BUMPER_SHOT\"` (TBC)\n\n#### `last_score.point_amount`\nThe number of points scored (2 or 3). This is 0 by default when no goal has been scored.\n\n#### `last_score.distance_thrown`\nThe distance the goal was scored from. This is 0 by default when no goal has been scored.\n\n#### `last_score.person_scored`\nThe username of the player who scored the goal. This is `\"[INVALID]\"` by default when no goal has been scored since you first joined the match.\n\n#### `last_score.assist_scored`\nThe username of the player who assisted the goal. This is `\"[INVALID]\"` by default when no goal has been scored since you first joined the match, or when a goal was scored, but no player was credited with the assist.\n\n#### `disc`\nAn object representing the current state of the disk.\n\n#### `disc.position`\nAn array representing the disk's position within the arena.\n\n#### `disc.forward`\nThe direction that the disc is facing.\n\n#### `disc.left`\nThe direction that the left side of the disc is facing.\n\n#### `disc.up`\nThe direction that the top of the disc is facing.\n\n#### `disc.velocity`\nAn array representing the disk's velocity.\n\n#### `disc.bounce_count`\nThe number of times the disk has bounced. (TODO: Since the last time someone grabbed it? Do headbutts count as bounces?)\n\n#### `player`\nAn object representing the current state of the local VR player. This is used for positions of the player within their playspace.\n\n#### `player.vr_left`\nThe direction that the left side of the player's head is facing within their playspace.\n\n#### `player.vr_position`\nAn array representing the player's position within their playspace.\n\n#### `player.vr_forward`\nThe direction that the player's head is facing within their playspace.\n\n#### `player.vr_up`\nThe direction that the top side of the player's head is facing within their playspace.\n\n#### `teams`\nAn array of objects containing data used to instantiate the game's two teams. The first element in the array is always the blue team, while the second is always the orange team and the third is always the spectators.\n\n#### `teams[].team`\nA human-readable team name. Usually either \"ORANGE TEAM\" or \"BLUE TEAM\", but if all the players on a team have the same team name (set by pressing F11 while in a match or the lobby) it will be that instead.\n\n#### `teams[].possession`\nIndicated whethe this team currently has possession of the disk.\n\n#### `teams[].stats`\nAn object containing data used to instantiate the team's current stats.\n\n#### `teams[].stats.points`\nPoints scored by the subject.\n\n#### `teams[].stats.possession_time`\nTime in seconds that the subject possessed the disk.\n\n#### `teams[].stats.interceptions`\nNumber of times the subject intercepted a pass by the opposing team\n\nAPI always returns zero for teams\n\n#### `teams[].stats.blocks`\nNumber of times the subject blocked a punch\n\nAPI always returns zero for teams\n\n#### `teams[].stats.steals`\nNumber of times the subject stole the disk from the opposing team\n\n#### `teams[].stats.catches`\nNumber of times the subject successfully caught a pass by a team member\n\n#### `teams[].stats.passes`\nNumber of times the subject successfully completed a pass\n\nAPI always returns zero for teams\n\n#### `teams[].stats.saves`\nNumber of opposing team goals prevented by the subject.\n\n#### `teams[].stats.goals`\nNumber of goals scored by the subject.\n\nAPI always returns zero for teams\n\n#### `teams[].stats.stuns`\nNumber of times the subject has stunned the opposing team.\n\n#### `teams[].stats.assists`\nNumber of goals assisted by the subject.\n\n#### `teams[].stats.shots_taken`\nNumber of times the subject attempted a shot on goal\n\n#### `teams[].players`\nAn array of objects containing data used to instantiate the team's players.\n\n#### `teams[].players[].name`\nThe username of the player.\n\n#### `teams[].players[].playerid`\nA number representing ID of the player within the current game session.\n\n#### `teams[].players[].userid`\nA unique number identifying the player across all game sessions.\n\n#### `teams[].players[].number`\nThe number a player chose for themselves in the customization room.\n\nNeed to verify how this works in the new update.\n\n#### `teams[].players[].level`\nA number (1-50) representing the player's experience \"level\". New accounts start as level 1, and will usually reach level 50 after a few hundred games in public matchmaking.\n\nNote that there a rare bug where this number may be 0 in the UI in some cases; it's possible this bug may also affect the API (though this has yet to be verified).\n\n#### `teams[].players[].ping`\nCurrent ping (network latency to server) of this player.\n\n#### `teams[].players[].stunned`\nWhether the player is currently stunned.\n\n#### `teams[].players[].invulnerable`\nWhether or not the player is currently immune to stuns. Players will be in this state for 3 seconds after they are stunned.\n\n#### `teams[].players[].possession`\nIndicates whether this player currently has possession of the disk.\n\n#### `teams[].players[].holding_left`\nThe item or object the player is holding in their left hand.\n\nPossible values:\n* `\"disc\"`\n* player id (`\"0\"`, `\"1\"`)\n* `\"geo\"`\n\n#### `teams[].players[].holding_right`\nThe item or object the player is holding in their right hand.\n\nPossible values:\n* `\"disc\"`\n* player id (`\"0\"`, `\"1\"`)\n* `\"geo\"`\n\n#### `teams[].players[].blocking`\nWhether the player is currently blocking (and will therefore deflect stuns).\n\n#### `teams[].players[].stats`\nAn object containing data used to instantiate the player's current stats. See [`teams[].stats`](#teamsstats) for a list of available stats.\n\n#### `teams[].players[].velocity`\nThe current velocity (speed and direction of movement) of the player.\n\n#### `teams[].players[].head`\nAn object containing position and rotation of the head of the player\n\n#### `teams[].players[].head.position`\nThe position of the player's head in the arena.\n\n#### `teams[].players[].head.forward`\nThe direction that the player's head is facing.\n\n#### `teams[].players[].head.left`\nThe direction that the left side of the player's head is facing.\n\n#### `teams[].players[].head.up`\nThe direction that the top side of the player's head is facing.\n\n#### `teams[].players[].body`\nAn object containing position and rotation of the body of the player\n\n#### `teams[].players[].body.position`\nThe position of the player's body in the arena.\n\n#### `teams[].players[].body.forward`\nThe direction that the player's body is facing.\n\n#### `teams[].players[].body.left`\nThe direction that the left side of the player's body is facing.\n\n#### `teams[].players[].body.up`\nThe direction that the top side of the player's body is facing.\n\n#### `teams[].players[].rhand`\nAn object containing position and rotation data for the right hand.\n\n#### `teams[].players[].rhand.pos`\nThe position of the player's right hand within the arena.\n\n#### `teams[].players[].rhand.forward`\nThe direction that the player's right hand is facing.\n\n#### `teams[].players[].rhand.left`\nThe direction that the left side of the player's right hand is facing.\n\n#### `teams[].players[].rhand.up`\nThe direction that the top side of the player's right hand is facing.\n\n#### `teams[].players[].lhand`\nAn object containing position and rotation data for the left hand.\n\n#### `teams[].players[].lhand.pos`\nThe position of the player's left hand within the arena.\n\n#### `teams[].players[].lhand.forward`\nThe direction that the player's left hand is facing.\n\n#### `teams[].players[].lhand.left`\nThe direction that the left side of the player's left hand is facing.\n\n#### `teams[].players[].lhand.up`\nThe direction that the top side of the player's left hand is facing.\n\n## Concepts\nThroughout the API there are a number of concepts that get reused in multiple places. These concepts are documented in this section.\n\n### Vectors\nPosition, direction, and velocity are represented within the API as an array of [3D vector coordinates in Cartesian space](https://en.wikipedia.org/wiki/Euclidean_vector#In_Cartesian_space). That's a fancy way of saying the array contains three numbers, each representing a distance/speed in either the left-right (`x`), up-down (`y`), or forward-back (`z`) directions. These directions are arranged as `[x, y, z]` in the arrays returned by the API.\n\nDistance is measured in meters, and speed in meters per second. So, for example, a vector coordinate `[0, 1, 0]` could represent either a distance of 1 meter in the \"up\" direction, or a speed of 1 meter/second in the \"up\" direction.\n\nFor vectors that contain a mix of several directions, you can calculate the total distance or speed (r) using a 3-dimensional version of the [Pythagorean theorem](https://en.wikipedia.org/wiki/Pythagorean_theorem): r\u003csup\u003e2\u003c/sup\u003e = x\u003csup\u003e2\u003c/sup\u003e + y\u003csup\u003e2\u003c/sup\u003e + z\u003csup\u003e2\u003c/sup\u003e\n\nIn Echo Arena, distances are measured from the center of the Arena, where the disk spawns (at `[0, 0, 0]`). Positive `z` is in the direction of the orange side of the arena, negative `z` is in the direction of the blue side of the arena. If you're on the blue side of the arena facing the orange team's goal, positive `x` would be towards your left, and negative `x` would be to your right (with left/right reversed for a player on the orange team's side of the arena facing the blue team's side). Positive `y` is \"up\" (relative to a player's orientation when they spawn) and negative `y` is \"down\".\n\nSo, for example, a player located at [10.0, -5.0, -15.0] would be, from the perspective of someone sitting on the blue team's goal facing the orange team's goal, 10 meters to the left of the center of the arena, on the blue team's side, near the floor.\n\nThe Arena is 80m long (counting from orange to blue launch tube exits), 30m wide (counting from the widest point of the side walls) and 20m tall (counting from the tallest part of the arena, in the trenches).\n\n### Possession\nThe API defines \"possession\" a little more broadly than you might expect (depending on what other sports you may be familiar with that use this term). Not only do players/teams that are currently holding the disk have possession, but teams also maintain possession for 7 seconds after releasing the disk as well, unless the disk is recovered by the opposing team. If the disk is glowing with the color of a specific team, the game considers that team as having \"possession\".\n\n### Session\nA \"session\" is what users typically think of as the \"server\" you're playing on. When you join a new match, a new session is created, and the session will remain active until all players leave. Sessions IDs are unique, and have no correspondence to the actual, physical or virtual server hardware that's hosting the game.\n\n## Community parts\nThis section is for community suggestions and common issues\n\n### Requests\nRequests list for additions to the API\n* position of the local (remote if networked) player(s) exlcuding irl playspace (position of player using boosts and thrusters and not jumps and ducks)\n* private games rules set\n\n### Issues\nIssues list for the API\n* interceptions are not reported correctly\n\n### Quirks\nList of things that don't do quite what you expect but still work\n* something like team name isn't always orange or blue\n\n### TODO\nThings that need doing in the wiki\n* packet_loss_ratio stuff\n* bumper_shot confirm\n* shoulder_pressed values and description\n* fill in last throw values\n* add in stuff like `[position](#position-1)`\n* Keep updating\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fajedi32%2Fechovr_api_docs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fajedi32%2Fechovr_api_docs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fajedi32%2Fechovr_api_docs/lists"}