---
title: "Revoke a pickup offer your team sent"
method: POST
path: "/tournaments/{identifier}/free-agency/offers/{offerId}/revoke"
tags: ["Tournament Free Agency"]
---

# Revoke a pickup offer your team sent

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

Withdraws a pending free-agent pickup offer that one of your teams sent. Authority is the SENDING side of the offer: you must be the captain, co-captain, or organization owner of the team that made it, which is the mirror of the respond endpoint, where only the agent the offer is addressed to may act.

The offer must still be PENDING. One that has been accepted, declined, expired, or already revoked answers 409 error_free_agent_offer_not_pending - so unlike check-in this is not retry-safe, and a second call after a successful one is a conflict rather than a no-op. Use it to free yourself to send a fresh offer to the same agent, which is otherwise blocked by 409 error_free_agent_offer_exists.

Revoking is silent: the agent is not notified, the offer simply disappears from their inbox. Nothing is rostered or released, because a pending offer never rostered anyone.

An offerId belonging to a different tournament answers 404 error_tournament_not_found. 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`.

## Response `200`

The offer was revoked.

- TournamentWriteAck — Acknowledgement returned by the tournament write endpoints whose backing operation has nothing to return - the organizer writes (endpoints 22-34), the team roster writes (40, 41), and the competitor self actions that neither mint nor resolve a row (38, 39, 44, 45, 47). Endpoints that mint a row answer with that row's id instead, and the two respond endpoints (42, 46) answer with the decision they recorded.
  - `success` true, required — Always true; failures are error responses.
  - `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)
