← Back to API docs

GET/api/v1/players/transfers

List player transfers
Advanced data packageactivebetacoreAvailable

Description

Returns all player transfers, with incremental updates by timestamp.

1. First full sync: page through everything with the id parameter.
2. Afterwards: fetch what changed with the time parameter (suggested frequency: once a minute).

Access

Request
GET https://api.sports.csap.ai/api/v1/players/transfers
Auth
Header X-API-Key: <your key> (Authorization: Bearer <key> also works; ?key= is still accepted but discouraged, because the key ends up in URLs and logs)
External keys
AvailableAny valid API key can call this endpoint.
Rate limits
3000 per minute · 200000 per day · Set per key (rate_per_min and quota_daily returned by /api/v1/account are authoritative; the numbers above are a trial key's). Beyond them the answer is 429. In addition, heavy requests such as whole-table snapshots and statistics lists without a match id are processed 2 at a time for the whole platform; a request that cannot get a slot receives 429 with Retry-After. Responses do not carry X-RateLimit-* headers for now. See the general guide

Request parameters 3

ParameterTyperequiredExampleDescription
idintegeroptional6917Records with id greater than or equal to this value, ordered by id
timeintegeroptionalRecords updated at or after this time (timestamp), ordered by update time
limitintegeroptional2Maximum number of rows, default 100, maximum 100

Example request

curl "https://api.sports.csap.ai/api/v1/players/transfers?limit=2" \
  -H "X-API-Key: YOUR_API_KEY"

Try it

Example response

Real response with an external key at 09/11/2026, 14:29 UTC: HTTP 200, 2 rows, 88 ms (data cut to 2 rows)

{
  "code": 0,
  "data": [
    {
      "fee_desc": "contract",
      "fee_eur": 85000,
      "from_team": "Al-Jazira",
      "from_team_id": null,
      "from_team_name": "Al-Jazira",
      "id": 1,
      "limit": null,
      "max_id": null,
      "max_time": null,
      "min_id": null,
      "min_time": null,
      "player_id": "1022363",
      "player_name": "Ahmed Mahmoud",
      "query": null,
      "source": "S4",
      "time": null,
      "to_team": "Khorfakkan",
      "to_team_id": null,
      "to_team_name": "Khorfakkan",
      "transfer": null,
      "transfer_date": "2026-09-29T07:32:59Z",
      "transfer_desc": "contract",
      "transfer_fee": 85000,
      "transfer_time": "2026-09-29T07:32:59Z",
      "transfer_type": 1,
      "type": 1,
      "updated_at": 1793707041523
    },
    {
      "fee_desc": "contract",
      "fee_eur": null,
      "from_team": "San Jose",
      "from_team_id": null,
      "from_team_name": "San Jose",
      "id": 2,
      "limit": null,
      "max_id": null,
      "max_time": null,
      "min_id": null,
      "min_time": null,
      "player_id": "1037535",
      "player_name": "Hernán López",
      "query": null,
      "source": "S4",
      "time": null,
      "to_team": "Argentinos Juniors",
      "to_team_id": null,
      "to_team_name": "Argentinos Juniors",
      "transfer": null,
      "transfer_date": "2026-10-21T11:33:14Z",
      "transfer_desc": "contract",
      "transfer_fee": null,
      "transfer_time": "2026-10-21T11:33:14Z",
      "transfer_type": 1,
      "type": 1,
      "updated_at": 1793707041543
    }
  ],
  "message": "success",
  "success": true
}

Response fields 27

fee_descstringTransfer fee noteExample: "contract"
fee_eurintegernullableTransfer fee (EUR)Example: 85000
from_teamstringTeam transferred fromExample: "Al-Jazira"
from_team_idnullnullableId of the team transferred from
from_team_namestringName of the team transferred fromExample: "Al-Jazira"
idintegerRecord id; paging cursor (the id parameter returns records >= this value). In match endpoints it is the platform match id (gmid)Example: 1
limitnullnullableMaximum number of rows in this response
max_idnullnullableLargest id on this page
max_timenullnullableLatest update time on this page (Unix seconds)
min_idnullnullableSmallest id on this page
min_timenullnullableEarliest update time on this page (Unix seconds)
player_idstringPlayer idExample: "1022363"
player_namestringPlayer nameExample: "Ahmed Mahmoud"
querynullnullableQuery info (paging cursor, totals)
sourcestringSource code (S1, S2…)Example: "S4"
timenullnullableTime / minute
to_teamstringTeam transferred toExample: "Khorfakkan"
to_team_idnullnullableId of the team transferred to
to_team_namestringName of the team transferred toExample: "Khorfakkan"
transfernullnullablePlayer transfer list
transfer_datestringTransfer dateExample: "2026-09-29T07:32:59Z"
transfer_descstringTransfer description (with unit)Example: "contract"
transfer_feeintegernullableTransfer feeExample: 85000
transfer_timestringTransfer timeExample: "2026-09-29T07:32:59Z"
transfer_typeintegerTransfer type: 1 loan, 2 end of loan, 3 transfer, 4 retired, 5 draft, 6 released, 7 signed, 8 unknownExample: 1
typeintegerTypeExample: 1
updated_atintegerLast update time (UTC, ISO 8601; incremental sync with the time parameter goes by it)Example: 1793707041523

Errors

HTTPmessageWhen
401missing API key / unauthorizedNo X-API-Key, or the key is invalid or disabled
400bad param …Malformed parameter (e.g. id is neither a number nor u<uid>)
301match merged into <gmid>Queried by an old match id that has been merged into a new gmid: Location points to the new address and the body carries moved_to
404not foundThe match / team / competition does not exist, or is outside what this key can see (external keys see only matches inside the open coverage)
429rate limit exceeded / daily quota exceededThe key's per-minute rate or daily quota is exceeded
429server busy, retry laterThe server's concurrency slots are full (only 2 heavy requests at a time); retry after Retry-After seconds
500query errorThe query failed on the server; you may retry