BO3 API endpoint
Returns BO3.gg's esports player and coach transfer feed, newest first by default, with paging and filters: `team_id` (moves into or out of one team), `player_id`, `action` (`join`, `change`, `leave`) and `role` (`player`, `coach`). The feed cannot be filtered by game upstream, so every row carries its `game` instead; narrow it with a team or player id.
/bo3/transfersHeader: x-api-key required.
Parameters:
team_id: optional BO3 team id (the id of a team in bo3-match-history or the team pages); returns moves into or out of that team.player_id: optional BO3 player id.action: optional; allowed values: join, change, leave.role: optional; allowed values: player, coach.sort: optional; allowed values: newest, oldest. Defaults to newest.offset: optional zero-based offset; defaults to 0.limit: optional page size, 1 to 100; defaults to 20.Notable response behavior:
action is join (a destination team, code 1), leave (an origin team only, code 3) or change (both sides, code 2; the sample read was a rebrand, HOTU to Game Point). The three account for all 136,070 records.game (cs2, valorant, lol, dota2, r6siege, mlbb). Use team_id or player_id to narrow by game.| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| id | 40 | |
| date | 40 | 2026-07-20 to 2026-07-27 |
| action | 40 | leave in all 40 |
| action_code | 40 | |
| game | 40 | valorant (17), cs2 (17), dota2 (6) |
| player_id | 40 | |
| player_slug | 40 | |
| nickname | 40 | |
| is_coach | 40 | true in 5 of 40 |
| from | 40 | |
| source_url | 33 | x.com and 2 other hosts |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required | ||
| team_id | integer | No | BO3 team id; transfers into or out of this team Minimum: 1. | ||
| player_id | integer | No | BO3 player id; this person's transfers Minimum: 1. | ||
| action | string | No | Transfer action; one of join, change, leave Allowed values: join, change, leave. | ||
| role | string | No | Role; one of player, coach Allowed values: player, coach. | ||
| sort | string | No | newest | Order by date; one of newest, oldest; defaults to newest Allowed values: newest, oldest. | |
| offset | integer | No | 0 | Zero-based offset; defaults to 0 Minimum: 0. | |
| limit | integer | No | 20 | Page size, 1 to 100; defaults to 20 Minimum: 1. Maximum: 100. |
curl -X GET "https://api.crawlora.net/api/v1/bo3/transfers?action=join&role=player&sort=newest&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"source_url": "https://api.bo3.gg/api/v1/transfers",
"fetched_at": "2026-10-28T10:00:00Z",
"total": 136070,
"offset": 0,
"limit": 20,
"count": 1,
"has_more": true,
"transfers": [
{
"id": 252309,
"date": "2026-07-27",
"action": "leave",
"action_code": 3,
"game": "valorant",
"player_id": 42611,
"player_slug": "blackwiz",
"nickname": "BlackWiz",
"is_coach": false,
"from": {
"id": 6805,
"slug": "reignite",
"name": "REIGNITE FOXX"
},
"source_url": "https://x.com/ReigniteJP/status/0"
}
]
}
}Request schema
No body schema
Response schema
Inline response schema
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | bo3.TransfersResponse | No | ||||
| data.count | integer | No | 20 | |||
| data.fetched_at | string | No | 2026-10-28T10:00:00Z | |||
| data.has_more | boolean | No | true | |||
| data.limit | integer | No | 20 | |||
| data.offset | integer | No | 0 | |||
| data.source_url | string | No | https://bo3.gg/matches/current | |||
| data.total | integer | No | 136070 | |||
| data.transfers | array | No | ||||
| data.transfers[].action | string | No | join, change, leave | leave | ||
| data.transfers[].action_code | integer | No | 3 | |||
| data.transfers[].compensation | string | No | ||||
| data.transfers[].date | string | No | 2026-07-27 | |||
| data.transfers[].from | bo3.TransferTeam | No | ||||
| data.transfers[].from.id | integer | No | 667 | |||
| data.transfers[].from.name | string | No | Vitality | |||
| data.transfers[].from.slug | string | No | vitality | |||
| data.transfers[].game | string | No | valorant | |||
| data.transfers[].id | integer | No | 252309 | |||
| data.transfers[].is_coach | boolean | No | false | |||
| data.transfers[].nickname | string | No | BlackWiz | |||
| data.transfers[].player_id | integer | No | 42611 | |||
| data.transfers[].player_slug | string | No | blackwiz | |||
| data.transfers[].source_url | string | No | ||||
| data.transfers[].to | bo3.TransferTeam | No | ||||
| data.transfers[].to.id | integer | No | 667 | |||
| data.transfers[].to.name | string | No | Vitality | |||
| data.transfers[].to.slug | string | No | vitality | |||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/bo3/transfers?action=join&role=player&sort=newest&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"