Skip to main content

Incoming trades

Every two hours the trade inbox reads the offers other managers have sent you and scores each one. It stores one ranked row per offer. You review an offer in the UI, then accept, decline or counter. Core checks that the offer hasn't changed since you reviewed it, and the worker checks again against ESPN before it answers.

How is the inbox refreshed?​

The refresh never writes to ESPN and uses no LLM. If core is down, the last score is kept and marked stale.

How does a decision reach ESPN?​

What keys protect it?​

KeyBuilt fromChecked byStops
review_tokenLeague, season, team, transaction, proposer, fingerprint, sorted player ids and items, and the proposer's noteCore, under the offer lock, before any claimActing on an offer that changed after you read it
decision_keyLeague, season, team, transaction, action, fingerprint and your commentCore's claim key; the worker recomputes it from a fresh ESPN readReplays, and an approval reused for a different action
reviewed_noteThe exact proposer note you sawThe worker, against ESPN's current noteA silent edit to the note between review and send
Advisory lock trade-inbox:{league}:{id}Offer identityCore publish, worker refresh, worker responseAn accept and a decline both going out, or a refresh landing mid-decision

The full token and key formulas are in the Incoming trade API reference.

What must be true to answer?​

CheckWho
Offer is open, parsed and more than 5 minutes from expiryCore and worker
For accept: a current score whose fingerprint matches, and no roster-limit overageCore and worker
DRY_RUN=false and TRADE_RESPONSE_ENABLED=trueWorker
The action is listed in VERIFIED_TRADE_RESPONSE_ACTIONS, and PENDING_TRADE_SHAPE_VERIFIED is trueWorker
No other response to this offer is claimed, in flight, unknown or rejectedCore and worker

With any worker lock closed, the bot records response_blocked and the body it would have sent.

How does a counter work?​

A counter doesn't send anything to ESPN directly. It starts the negotiation bot, which stages a counter-offer for the outgoing approval path.

A thread allows at most three of our counters. The fourth is refused.

How do I retry a stuck response?​

Core never republishes on its own. A rejected response, or one whose outcome is unknown, stays blocked until you call POST …/{id}/decision/retry.

Previous stateRetry needs
rejectedof_claim_id naming the blocking response
response_unknownAlso verified_not_answered: true, after a person checks ESPN
responding or respondedNever retried

Read more​