---
title: "Accept or decline a free-agent pickup offer"
method: POST
path: "/tournaments/{identifier}/free-agency/offers/{offerId}/respond"
tags: ["Tournament Free Agency"]
---

# Accept or decline a free-agent pickup offer

`POST /tournaments/{identifier}/free-agency/offers/{offerId}/respond`

Answers a pickup offer addressed to you as a free agent. You must be the offer's recipient - an offerId addressed to anyone else answers 403 - and the offer must still be PENDING, or the request answers 409 error_free_agent_offer_not_pending.

ACCEPTING JOINS THE TEAM. Your pool row becomes PICKED_UP, you are added to the offering team's tournament roster as a FREE_AGENT entry, and every other PENDING offer addressed to you in this tournament is expired - you are off the market. Re-read GET /tournaments/{identifier}/me afterwards rather than patching a cached offer list. Leaving that roster is also the only way back to AVAILABLE; the leave-pool endpoint refuses while you are rostered.

AN OFFER CAN LAPSE BETWEEN BEING SENT AND ANSWERED - the tournament may have started, you may have been picked up elsewhere, or the offering team may have left. When accepting finds any of those, the offer is durably marked EXPIRED and the request answers 409 error_free_agent_offer_not_pending, the same code as an already-answered offer. It never answers 200 with accepted false, so a client can rely on a 2xx meaning the pickup really happened. Retrying answers identically.

DECLINING IS ALWAYS AVAILABLE and notifies the captain who offered. The competitive-ban gate applies only to acceptance: a banned agent can clear an offer but receives 403 error_competitive_banned if they try to accept it.

Offer IDs are returned by GET /tournaments/{identifier}/me. Requires the tournaments actor free_agency capability.

## Path parameters

- `identifier` string, required — Tournament slug.
- `offerId` string, required — Free-agent pickup offer ID, as returned by GET /tournaments/{identifier}/me - inbound offers under `offers`.

## Request body

- TournamentOfferRespondBody — Free agent's response to a pickup offer.
  - `accept` boolean, required — true to accept the offer and join the offering team's roster, false to decline it. A competitive ban blocks accepting but never declining.

## Response `200`

The response was recorded.

- TournamentOfferRespondResponse — Outcome of accepting or declining a free-agent pickup offer.
  - `accepted` boolean, required — Echoes the request's accept flag once the response has been recorded. An offer that turned out to be no longer actionable is a 409 rather than a false here - see the endpoint description.
  - `timestamp` string, required — Response generation time (ISO 8601).

## Other responses

- `400` — Bad request (invalid body, cursor, limit, or date).
- `401` — Missing or invalid API key.
- `403` — API key lacks the required permission.
- `404` — Resource not found.
- `409` — Conflict.
- `429` — Rate limited.
- `500` — Internal server error.

---

[API](https://skmtc.net/teambattles/apis/teambattles-api.md) · [All operations](https://skmtc.net/teambattles/apis/teambattles-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/teambattles/teambattles-api/revisions/2ffe8fb53b7d/schema)
