Public integration documentation
This page documents the current public ReplayLabs API exactly as it is exposed today. It covers authentication, plans, limits, endpoints, payloads, and error behavior.
If you want product context beyond raw endpoints, start with the public use-case pages below.
/api/external/v1Use a bearer API key
API keys are created in the developer portal. They are sent in the `Authorization` header and are tied to the owning ReplayLabs account.
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.replaylabs.app/api/external/v1/replays/227/api/external/v1/replays/:gameId/api/external/v1/groups/:groupId/replays/api/external/v1/teams/api/external/v1/teams/:teamId/api/external/v1/teams/:teamId/groups/api/external/v1/teams/:teamId/stats/api/external/v1/teams/api/external/v1/teams/:teamId/api/external/v1/teams/:teamId/members/api/external/v1/teams/:teamId/membersCurrent behavior and defaults
Current payload shape
{
"data": {
"id": 227,
"link": "https://api.replaylabs.app/api/external/v1/replays/227",
"web_url": "https://app.replaylabs.app/match/227",
"created": "2026-03-31T12:14:22Z",
"title": "scrim game 2",
"replay_name": "scrim_game_2",
"replay_id": "CE3BF1B611F125E4BC11DC9AAF19E2AD",
"playlist": "Private",
"team_size": 3,
"duration": 323,
"date": "2026-03-30T19:15:00Z",
"map_name": "ChampionsField_Day",
"groups": [
{
"id": 22,
"name": "Scrim block A",
"link": "https://api.replaylabs.app/api/external/v1/groups/22/replays",
"web_url": "https://app.replaylabs.app/groups/22"
}
],
"blue": {
"name": "Blue",
"players": [
{
"name": "Player 1",
"id": {
"platform": "steam",
"id": "76561190000000001"
},
"stats": {
"core": {
"score": 512,
"goals": 2,
"assists": 1,
"saves": 3,
"shots": 5
},
"boost": {
"amount_collected": 2713,
"amount_used": 2289,
"collected_per_minute": 503.9,
"used_per_minute": 425.4,
"small_pad_count": 55,
"big_pad_count": 29
},
"field": {
"avg_speed": 1540,
"total_distance": 578827,
"avg_distance_to_ball": 2865,
"avg_distance_to_teammates": 3567
},
"demo": {
"inflicted": 1,
"taken": 0
},
"bump": {
"inflicted": 4,
"taken": 2
}
}
}
],
"stats": {
"core": {
"score": 990,
"goals": 1,
"assists": 1,
"saves": 5,
"shots": 10
}
}
},
"orange": {
"name": "Orange",
"players": [],
"stats": {}
}
}
}Field-level reference
Summary view and ids view
{
"data": {
"id": 22,
"name": "Scrim block A",
"link": "https://api.replaylabs.app/api/external/v1/groups/22/replays",
"web_url": "https://app.replaylabs.app/groups/22",
"replay_count": 3,
"replays": [
{
"id": 220,
"link": "https://api.replaylabs.app/api/external/v1/replays/220",
"web_url": "https://app.replaylabs.app/match/220",
"date": "2026-03-28T18:02:00Z",
"title": "series game 1",
"replay_name": "series_game_1",
"replay_id": "8BE4CE464D5A8EB097E472834941DF59",
"playlist": "Private",
"map_name": "DFH Stadium"
}
]
}
}{
"data": {
"id": 22,
"name": "Scrim block A",
"link": "https://api.replaylabs.app/api/external/v1/groups/22/replays",
"web_url": "https://app.replaylabs.app/groups/22",
"replay_count": 3,
"replay_ids": [220, 221, 219]
}
}Rosters, statistics and groups
A key sees a team when the account behind it owns that team or is on its roster. A team it cannot see answers 404 NOT_FOUND, the same as one that does not exist, so the API cannot be used to find out which team ids are taken.
{
"data": {
"teams": [
{
"id": 12,
"name": "Bandits",
"link": "https://api.replaylabs.app/api/external/v1/teams/12",
"web_url": "https://replaylabs.app/teams/12",
"is_private": true,
"created": "2026-08-14T18:02:11.000Z",
"member_count": 4,
"starter_count": 3
}
],
"total": 1,
"limit": 50,
"offset": 0
}
}{
"data": {
"id": 12,
"name": "Bandits",
"link": "https://api.replaylabs.app/api/external/v1/teams/12",
"web_url": "https://replaylabs.app/teams/12",
"groups_link": "https://api.replaylabs.app/api/external/v1/teams/12/groups",
"is_private": true,
"created": "2026-08-14T18:02:11.000Z",
"members": [
{
"name": "Ana",
"id": { "platform": "steam", "id": "76561198000000001" },
"role": "starter",
"slot": 1
},
{
"name": "Bo",
"id": { "platform": "epic", "id": "epic|bo" },
"role": "coach",
"slot": null
}
]
}
}{
"data": {
"id": 12,
"name": "Bandits",
"link": "https://api.replaylabs.app/api/external/v1/teams/12",
"web_url": "https://replaylabs.app/teams/12",
"record": {
"games": 10,
"wins": 7,
"losses": 3,
"draws": 0,
"win_rate": 0.7,
"goals_for": 30,
"goals_against": 18,
"goal_difference": 12,
"goals_for_per_match": 3,
"goals_against_per_match": 1.8,
"shot_accuracy": 0.35,
"saves_per_match": 2.2,
"assists_per_match": 1.5,
"score_per_match": 400
},
"players": [
{
"name": "Ana",
"id": { "platform": "steam", "id": "76561198000000001" },
"matches": 10,
"wins": 7,
"win_rate": 0.7,
"goals": 12,
"assists": 4,
"saves": 16,
"shots": 30,
"score": 3200,
"goals_per_match": 1.2,
"saves_per_match": 1.6,
"score_per_match": 320
}
],
"form": [
{
"game_id": 227,
"link": "https://api.replaylabs.app/api/external/v1/replays/227",
"web_url": "https://replaylabs.app/match/227",
"date": "2026-08-20T19:41:00.000Z",
"playlist": "Ranked Standard",
"goals_for": 4,
"goals_against": 2,
"result": "win"
}
]
}
}{
"data": {
"id": 12,
"name": "Bandits",
"link": "https://api.replaylabs.app/api/external/v1/teams/12",
"web_url": "https://replaylabs.app/teams/12",
"group_count": 1,
"groups": [
{
"id": 44,
"name": "Week 1 vs Comets",
"link": "https://api.replaylabs.app/api/external/v1/groups/44/replays",
"web_url": "https://replaylabs.app/groups/44",
"is_private": false,
"created": "2026-08-20T20:05:00.000Z",
"replay_count": 5
}
]
}
}Creating a team with its roster
One call, so a bot handed a full lineup by a signup command does not have to issue five requests and end up with half a team if one of them fails. Members that are rejected come back named, with the reason, and the team is kept.
POST /api/external/v1/teams
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"name": "Bandits",
"is_private": true,
"members": [
{ "player_id": "76561198000000001", "role": "starter" },
{ "player_id": "76561198000000002", "role": "starter" },
{ "player_id": "76561198000000003", "role": "starter" },
{ "player_id": "epic|bo", "role": "coach" }
]
}201 Created
{
"data": {
"id": 12,
"name": "Bandits",
"link": "https://api.replaylabs.app/api/external/v1/teams/12",
"web_url": "https://replaylabs.app/teams/12",
"groups_link": "https://api.replaylabs.app/api/external/v1/teams/12/groups",
"is_private": true,
"created": "2026-08-14T18:02:11.000Z",
"members": [ "..." ],
"added_count": 3,
"rejected": [
{ "player_id": "epic|bo", "reason": "Role limit reached for coach" }
]
}
}{
"error": {
"code": "MONTHLY_QUOTA_EXCEEDED",
"message": "Monthly API request quota reached for this plan",
"limit": 25000,
"used": 25000,
"period_start": "2026-04-01"
}
}{
"error": "Too many API requests for this plan. Please slow down.",
"limit": 60,
"remaining": 0,
"resetAt": "2026-04-25T12:35:00.000Z"
}error string, not an { error: { ... } } object.{ error: { ... } } shape shown above.