Home›Java›Mods›InTrade - Player-to-Player Trading System
ModsJava

InTrade - Player-to-Player Trading System

⬇ Download on Spigot
Safe and convenient player-to-player trading: items, money, experience levels and points in a single window with double confirmation.
Requires Paper 1.21.7+ (does not run on plain Spigot)
​
About
InTrade is a server-side plugin for direct trading between players. Your offer is on the left, your partner's offer is on the right. Each side has 16 item slots plus buttons for the available currencies. No client mods are needed, everything works through a regular inventory menu.
The main goal of the plugin is to keep trades fair. Swapping an item at the last moment is impossible: any change resets both players' readiness and is immediately highlighted for the partner.

Features


Screenshots

upload_2026-9-25_19-6-48.png
Trade window

​

How a trade works

  1. Run /trade <player> or Shift + right click a player. They accept with /trade accept.
  2. Add items from your inventory. To take an item back, click it in the trade window.
  3. Choose a currency and enter an amount.
  4. Check your partner's offer and click Ready. Once both players confirm, a short countdown starts, after which the trade completes.

Requirements

Optional integrations:
Items and experience levels work without any dependencies.

Installation

  1. Put InTrade-x.x.x.jar into the plugins folder.
  2. Restart the server.
  3. If needed, edit plugins/InTrade/config.yml and run /trade reload.

Commands

Alias: /intrade. By default a request lasts 60 seconds, with a 5-second cooldown between requests.
Spoiler: Permissions and rank-based access
Player permissions (default: everyone)
  • intrade.player - all player permissions
  • intrade.use - requests and /trade claim
  • intrade.sneak - requests via Shift + right click
  • intrade.toggle - toggling incoming requests
  • intrade.history - own history
  • intrade.currency.money - Vault money
  • intrade.currency.experience - experience levels
  • intrade.currency.playerpoints - PlayerPoints
Staff permissions (default: op)
  • intrade.admin - all staff permissions
  • intrade.history.others - other players' history
  • intrade.reload - reloading settings
  • intrade.bypass.distance - bypass distance and world restrictions
  • intrade.bypass.cooldown - bypass request cooldown
  • intrade.bypass.blocked - trade blocked items
Wildcard nodes: intrade.*, intrade.currency.*, intrade.bypass.*.

Trading only from a certain rank. Set in the config:
Code (Text):
permissions:
  open-to-everyone: false
Run /trade reload and grant access to a group:
Code (Text):
/lp group rank3 permission set intrade.player true
Higher ranks get access if you have group inheritance set up. Example: trading is available from rank 3, but money only from rank 5:
Code (Text):
/lp group rank3 permission set intrade.currency.money false
/lp group rank5 permission set intrade.currency.money true

Spoiler: config.yml
Code (Text):
# InTrade configuration.
# Messages and menu texts are in lang/<language>.yml.
# "auto" shows every player the messages in their game language. English and Russian are included,
# other languages can be added as new files in lang/. Any other value (for example "ru") uses one
# language for everyone.
language: auto
# Used for the console and for game languages without a file in lang/.
default-language: en
permissions:
  # true: all players can trade by default.
  # false: players need intrade.player (or individual permissions) from a permissions plugin such as LuckPerms.
  # Staff permissions are always limited to operators by default.
  open-to-everyone: true
requests:
  # Time before an unanswered request expires.
  expire-seconds: 60
  # Minimum time between two requests from the same player.
  cooldown-seconds: 5
  # Allow sending a request by sneaking and right-clicking a player.
  sneak-click: true
  # Maximum distance between players. 0 disables the check.
  max-distance: 0
  # Allow trades only between players in the same world.
  same-world: false
safety:
  # Time after any change during which the "Ready" button is locked.
  change-lock-seconds: 3
  # Time a changed or removed item stays highlighted for the partner.
  highlight-seconds: 6
  # Countdown after both players are ready. Any change stops it.
  confirm-seconds: 3
currencies:
  # Requires Vault and an economy plugin.
  money:
    enabled: true
  # Whole experience levels.
  experience:
    enabled: true
  # Requires PlayerPoints.
  playerpoints:
    enabled: true
# Materials that cannot be traded.
blocked-items: []
#  - BEDROCK
#  - BARRIER
# Worlds where trades cannot be started.
disabled-worlds: []
history:
  enabled: true
  # Trades older than this are deleted on startup. 0 keeps all trades.
  # Trade counts and the top list are not affected.
  keep-days: 90
# Changes in this section require a server restart.
storage:
  # sqlite: local file plugins/InTrade/trades.db, no setup required.
  # mysql: MySQL or MariaDB server, configured below.
  type: sqlite
  # Unique name of this server. Only needed when several servers use the same MySQL database.
  # Items in open trade windows and /trade claim mail are kept per server,
  # trade history and trade counts are shared.
  server-id: main
  mysql:
    host: localhost
    port: 3306
    database: minecraft
    user: root
    password: ""
    # Number of connections. One is used for writing, the rest for reading.
    pool-size: 4
    # Additional JDBC driver properties.
    properties:
      useSSL: false
      allowPublicKeyRetrieval: true

Spoiler: PlaceholderAPI placeholders
  • %intrade_trades% - number of the player's completed trades
  • %intrade_trading% - whether the player is currently in a trade
  • %intrade_accepting% - whether the player accepts incoming requests
  • %intrade_top_<1-10>_name% - name of the player at the given leaderboard position
  • %intrade_top_<1-10>_trades% - trade count of the player at that position

Spoiler: History and database
By default history is kept for 90 days, cleanup runs on server startup. history.keep-days: 0 disables deletion. Trade counters and the leaderboard are stored separately and are not reset by cleanup.
SQLite works without setup, the database is located at plugins/InTrade/trades.db. For MySQL or MariaDB set storage.type: mysql, fill in the storage.mysql section and restart the server. Tables with the intrade_ prefix are created automatically.
Server networks. Several servers can use one database with shared history and stats. Each server needs a unique storage.server-id: pending offers and items for /trade claim are bound to a specific server.

Spoiler: Developer API
The api module gives access to stats and trade events. Add it as compileOnly and put InTrade in your plugin's depend or softdepend.
Code (Text):
import me.spolzer.intrade.api.InTrade;
InTrade trade = InTrade.get();
trade.tradeCount(player.getUniqueId()).thenAccept(count ->
    getLogger().info("Completed trades: " + count));
  • TradeRequestEvent and TradeStartEvent are cancellable.
  • TradeCompleteEvent contains both offers.
  • TradeCancelEvent provides the cancellation reason.
  • Stats are returned as a CompletableFuture. Switch to the main server thread when working with Bukkit objects.

Spoiler: FAQ
Is a client mod required?
No, the plugin is fully server-side.
Does it work on Spigot?
No, InTrade requires Paper 1.21.7 or newer (or a Paper fork such as Purpur).
Can I block certain items from being traded?
Yes, via the blocked-items list in the config. Staff with intrade.bypass.blocked can still trade them.
Can I restrict trading by distance or world?
Yes: max-distance, same-world and disabled-worlds.
What happens if a player leaves or dies during a trade?
The trade is cancelled and items are returned to their owners. Anything that doesn't fit in the inventory is saved for /trade claim.
How do I add my own language?
Create a lang/<code>.yml file based on en.yml or ru.yml.
Is there absolute protection against server crashes?
Pending offers are written to the database and restored after a restart. However, player data saving, database writes and third-party economy operations are not combined into a single transaction, so a 100% guarantee cannot be given if the server crashes.
Links
GitHub • CurseForge • Support
Found a bug or have an idea? Post in the discussion thread or open an issue on GitHub.​

Commands

Plugin details

Read from the plugin's own plugin.yml.

Quick facts

Install steps are the general flow for this file type — How to install Minecraft Java mods & modpacks walks through it step by step.

InTrade - Player-to-Player Trading System is a free Minecraft Java mod. Compatible with Minecraft 1.21, 26.1, 26.2, 26.3. Downloaded 12 times (via Spigot). Download it and open it directly in the game.

Explore more