Plugins / Auction House
Auction House Coming soon
Buy-it-now and timed auctions where no item or coin is ever duplicated or lost.
Get Auction House
Coming soon Not on sale yet. This page gets a buy button the day it is.
Try it live
Auction House runs on a public demo server, set up so you can use it yourself. Join, try it, then decide.
Address: try.zeropvp.xyz:25570 (Java Edition 1.21.11)
In Minecraft: Multiplayer, Add Server, paste the address, Join. Type /demo go auctionhouse to land at its booth, or right-click the compass and pick it. The world resets every night.
Overview
Auction House
An auction house players cannot dupe: every item lives in exactly one place at a time
An auction house is the one plugin on an economy server that players will try to break. Two people clicking "buy" in the same tick, a full inventory, a server crash halfway through a purchase: on a careless plugin, each of those prints items or money. This one is built around the transaction first. Every item lives in exactly one place at a time, every purchase is reserved before anyone is charged, and the whole thing is covered by tests that throw twenty-five buyers at one listing at once.
Search the house: seller, price, time left, click to buy.
- Plugin name in /plugins
AuctionHouse- Latest version
- 1.1.0
- Server
- Paper or Purpur, Java 21
- BuiltByBit
- coming soon
What changed in 1.1.0
- New: when somebody lists an item, everyone else gets a chat line. Hovering it shows the item, clicking it opens the auction house searched for that item. Set it up under "broadcast:" in config.yml: new-listings (on/off), min-price, and cooldown-seconds (one announcement per seller per 60 seconds by default). It is on after the update; set broadcast.new-listings: false to keep chat quiet.
- New command /ah price (also /ah pricecheck and /ah worth): hold an item and see what that item type sold for over the last 30 days (number of sales, average, lowest and highest) and the cheapest buy-it-now listing right now, all for the amount you hold. The number of days is price-check.days. Uses the auctionhouse.use permission.
- New: the first member of staff (auctionhouse.admin) who joins after install gets one short setup line: whether the auction house can trade yet (economy found or not) and which commands to try first. It shows once per server; setup-hint: false turns it off.
- New staff command /ah admin setup (also /ah admin status), works from the console: shows the same setup summary at any time.
- Tab completion knows /ah price and /ah admin setup.
- Existing config.yml files keep working without changes. The new settings and messages use their defaults until you add them. The /ah help and /ah admin help lines only list the new commands on a fresh config.yml (or copy the help lines from the new default config).
Features
Why server owners pick it
- Built around the transaction, so simultaneous buyers cannot dupe
- Nothing lost to a full inventory: a collection bin catches it
- Items come back exactly as they were listed
- Timed auctions with anti-snipe
- Vault economy or a built-in item currency
What makes it different
- Every move of an item is one database transaction, so the second of two simultaneous buyers finds nothing and is never charged
- Tested by sending twenty-five buyers at one listing at once
- A purchase interrupted by a crash is rolled back on the next start and reported in the console
Works with
- Paper or Purpur 1.21.9+ (tested on 1.21.11); the dialog windows need a 1.21.6+ client
- Java 21
- Vault plus any economy plugin, or the built-in item currency
- PlaceholderAPI is optional
- SQLite is downloaded by the server on first start; no database to set up
- One server: the database is a local file, so it is not shared across a network
- No DRM, no licence key and no licence server; the code is not obfuscated
Highlights
- Dupe-safe by design, not by patch: an item is either for sale or waiting in somebody's bin, never both. Every move between the two is one database transaction with a guard on the state it expects, so the second of two simultaneous buyers simply finds nothing and is never charged.
- Nothing is lost to a full inventory: a purchase, a win or a returned item that does not fit goes to the collection bin, whole, and is collected later with a click.
- Items come back exactly as they went in: listings are stored in Paper's own item format with every data component: enchantments, custom names, custom model data, other plugins' tags, shulker contents. Items listed before a Minecraft update are upgraded by the server when they are read.
- The main thread never waits on the disk: all database work runs on its own thread and hands back to the main thread for anything that touches a player, an inventory or the economy.
Every listing on one page.
What you get
- New in v1.1.0: New listing announcements: a chat line for each new listing, hover shows the item, click opens the auction house searched for it
- New in v1.1.0: Price check: /ah price shows what the held item sold for over the last 30 days and the cheapest listing right now
- New in v1.1.0: Setup summary: /ah admin setup says whether trading works yet and what to try first
- Buy it now: /ah sell <price> [amount], a confirmation showing the fee, the tax and what you will get, and it is up
- Timed auctions: a starting bid, a minimum step between bids, and anti-snipe: a bid in the last seconds pushes the end back so nobody wins by bidding in the final tick
- Bids are paid when they are placed, and an outbid player gets their money straight back, so a winner can never be short at the end
- A real auction house screen: the item grid with pages, the real items with their own tooltips, seller, price, current bid and time left under each one
- Categories worked out from the item (weapons, armour, tools, potions, books, food, blocks) plus your own categories from config, matched by material with * wildcards or by name
- Search by name, enchantment (sharpness, mending), potion or seller, and sort by newest, ending soon, cheapest or dearest
- Purchase confirmation in a native Minecraft dialog window with the item shown, so a misclick never spends money
- Listing limits per permission: auctionhouse.limit.10, auctionhouse.limit.25, or unlimited
- Listing fee and sales tax, flat or percentage, each with its own exemption permission
- Expiry: what does not sell goes back to the seller's expired items, never on the floor
- Collection bin for purchases, auction wins, sale money and refunded bids, with "collect everything"
- History of everything you sold and bought, with tax and dates
- Notifications: a chat message and an optional sound when you sell, win, or are outbid; offline sellers get a summary of what sold when they join
- Blacklist by material (with wildcards), name, lore, data components or other plugins' item tags, and it looks inside shulker boxes and bundles
- Staff tools: remove any listing (the item goes back to the seller, any bid back to the bidder), view a player's listings, bin and history, refund a sale
- Vault economy (EssentialsX, CMI, TheNewEconomy and the rest), or an item currency: diamonds, or any exact item you hold when you run /ah admin currency
- Crash recovery: a purchase interrupted by a crash is rolled back on the next start and reported in the console
- Every message, button and lore line is in config.yml, in MiniMessage, with one colour block that re-themes every screen
A timed auction: starting bid, bids so far, time left, click to bid.
How it keeps items safe
Selling: price, amount, buy it now or auction, duration, fee and tax shown up front.
Every purchase asks once more before the money moves.
- Buying: the listing is reserved for the buyer in the database first, then the buyer is charged, then in one transaction the listing becomes the buyer's item and the seller's money. A second buyer is turned away at the reservation, before any money moves.
- Selling: the item leaves your hand and your player file is saved before the listing is written, so a crash can never leave the item both in your inventory and on sale.
- Collecting: a claim is removed from the database before it is handed over, so two clicks can only deliver it once. If the inventory turns out to be full, it goes straight back to the bin.
- The screens only ever show copies. Every click in them is cancelled before anything else sees it: shift-clicks, number keys, double-click collecting and drags included.
- Shutdown: every hand-off already started finishes before the plugin stops, so a /stop mid-trade cannot drop anything.
FAQ
Which servers does it run on?
Paper or Purpur 1.21.9 or newer, with Java 21.
Do I need other plugins?
Vault plus any economy plugin, or nothing at all with the built-in item currency. PlaceholderAPI is optional.
Is there DRM or a licence key?
No. There is nothing to activate and no licence server to reach, and the code is not obfuscated.
How long does setup take?
Drop the jar into /plugins and restart. The setup guide above has 5 short steps.
Can I try it before I buy?
Yes. This page has a test server with the plugin installed.
Where do I get help?
In the active support Discord, in the discussion tab on this page, or in the documentation.
How do players know what an item is worth?
/ah price shows the sales of the last 30 days (count, average, lowest, highest) and the cheapest listing right now.
Updates
Released on October 14, 2026 and updated once since. The latest version is v1.1.0 (October 16, 2026). Every update is free, new Minecraft versions included.
Also by Frostyh
- Crates: crates with the real chances shown
- Graves: death chests with a floating label
- Scripted SMP Essentials: NPCs, death ban, recording mode and more for scripted SMPs
- Complete Collection: all my published plugins in one purchase, 40% off
If this plugin helps your server, a short review on this page would mean a lot. Thank you!
Installation
Requirements
- Server software
- Paper, or a Paper fork such as Purpur. Spigot and CraftBukkit are not supported: the plugin uses Paper-only APIs.
- Minecraft version
- plugin.yml api-version 1.21; built against Paper API 1.21.11
- Java
- 21 or newer
- Required plugins
- none
- Optional plugins
Vault,PlaceholderAPI- Libraries
org.xerial:sqlite-jdbc:3.53.2.1, downloaded by the server at startup (plugin.yml libraries)
Steps
- Download
AuctionHouse.jarfrom BuiltByBit. There is no licence key to enter. - Stop the server and put the jar into the
pluginsfolder. - Start the server. The plugin creates
plugins/AuctionHouse/config.ymlwith the defaults shown under Configuration. - Edit
config.ymlto suit your server. - Restart the server to apply the changes.
Setup guide
- Install Vault and an economy plugin (EssentialsX is free), or set currency.type: item to trade in diamonds.
- Drop AuctionHouse.jar into /plugins and restart. The console says what it trades in.
- Set your sales tax, listing fee and limits in config.yml, then /ah admin reload.
- Give bigger limits to your ranks with auctionhouse.limit.<number>.
- Hold something and run /ah sell 100. Open /ah on a second account and buy it.
Commands
From plugin.yml. "Not set" in the permission column means plugin.yml attaches no permission to the command itself; the nodes the plugin checks are listed under Permissions.
| Command | Aliases | Usage | Description | Permission |
|---|---|---|---|---|
/ah | /auctionhouse, /auctions | /ah [sell|auction|search|price|listings|collect|expired|history|admin] | The auction house. | not set |
Subcommands in detail
/ah Open the auction house.
/ah sell <price> [amount] Sell the item in your hand (buy it now).
/ah sell The sell form: price, amount, buy now or auction, length, bid step.
/ah auction <start> [amount] Start a timed auction for the item in your hand.
/ah search <words> Open the auction house filtered by a search.
/ah listings Your listings; click one to take it back.
/ah collect Your collection bin.
/ah expired Items that came back unsold.
/ah history What you sold and bought.
/ah admin remove <id> [reason] (staff) Remove a listing.
/ah admin view <player> (staff) A player's listings, each removable.
/ah admin bin <player> (staff) Look into a player's collection bin.
/ah admin history <player> (staff) A player's sales, with sale ids.
/ah admin refund <sale id> (staff) Refund a sale.
/ah admin currency (staff) Use the item in your hand as the item currency.
/ah admin reload (staff) Reload config.yml.
Prices take 1500, 1.5k, 2m.
/ah price What the held item sold for (also /ah worth).
/ah admin setup (staff) Setup summary, works from the console.
Permissions
From plugin.yml.
| Node | Default | Description | Children |
|---|---|---|---|
auctionhouse.use | everyone | Open the auction house and browse it. | none |
auctionhouse.buy | everyone | Buy listings. | none |
auctionhouse.bid | everyone | Bid on auctions. | none |
auctionhouse.sell | everyone | List items for sale. | none |
auctionhouse.auction | everyone | List items as timed auctions. | none |
auctionhouse.limit.unlimited | nobody until granted | No limit on listings. | none |
auctionhouse.fee.exempt | nobody until granted | Pays no listing fee. | none |
auctionhouse.tax.exempt | nobody until granted | Pays no sales tax. | none |
auctionhouse.blacklist.bypass | nobody until granted | May list blacklisted items. | none |
auctionhouse.admin | operators | Remove listings, view any player's listings and bin, refund sales, set the item currency, reload. | none |
The store page also describes these groups and patterns:
auctionhouse.limit.<number>: listings up at once, the highest one counts (default from config: 5)%auctionhouse_listings%: your active listings%auctionhouse_limit%: how many you may have up%auctionhouse_bin%: things waiting in your collection bin%auctionhouse_expired%: items that came back unsold%auctionhouse_sold%: how many things you have sold%auctionhouse_earned%: what you earned after tax (formatted; _raw for a plain number)%auctionhouse_bought%: how many things you have bought%auctionhouse_spent%: what you spent (formatted; _raw for a plain number)%auctionhouse_total%: every listing on the auction house
Placeholders (PlaceholderAPI, optional)
Placeholders
Registered with PlaceholderAPI under the identifier auctionhouse (AhPlaceholders.java). PlaceholderAPI must be installed for these to work.
| Placeholder | Returns |
|---|---|
%auctionhouse_listings% | your active listings |
%auctionhouse_limit% | how many you may have up at once (online players) |
%auctionhouse_bin% | things waiting in your collection bin |
%auctionhouse_expired% | items waiting in your expired items |
%auctionhouse_sold% | how many things you have sold |
%auctionhouse_earned% | what you earned after tax, formatted |
%auctionhouse_earned_raw% | the same as a plain number |
%auctionhouse_bought% | how many things you have bought |
%auctionhouse_spent% | what you spent, formatted |
%auctionhouse_spent_raw% | the same as a plain number |
%auctionhouse_total% | every listing on the auction house |
Configuration reference
The default files as they ship in the jar, with their comments. The plugin writes them to plugins/AuctionHouse/ on first start.
config.yml
Top-level keys:
| Key | Default | Comment above it |
|---|---|---|
currency | section, 4 keys | none |
money | section, 1 key | When something sells, the money goes straight into the seller's balance, online or not. false: it waits in the seller's collection bin (/ah collect) until they take it. With an item currency an offline seller is always paid on their next join. |
listings | section, 5 keys | none |
price | section, 2 keys | none |
auctions | section, 5 keys | none |
fees | section, 3 keys | none |
sell | section, 3 keys | none |
buy | section, 1 key | none |
refunds | section, 1 key | none |
history | section, 2 keys | none |
notify | section, 4 keys | none |
broadcast | section, 3 keys | A chat line to everyone when something new goes up. Hovering shows the item; clicking opens the auction house searched for it. The text is messages.broadcast-listing and broadcast-auction. |
price-check | section, 1 key | /ah price: what the item in your hand sold for over this many days, and its cheapest listing now. |
setup-hint | true | The first member of staff who joins gets one short line: is it trading yet, and where to start. Shown once per server (remembered in state.yml); /ah admin setup shows it again any time. |
safety | section, 1 key | none |
gui | section, 3 keys | none |
date-format | "yyyy-MM-dd HH:mm" | none |
categories | section, 3 keys | Your own categories come first and claim an item before the built-in groups see it. materials takes * at either end: "*_ORE", "MUSIC_DISC_*". name-contains matches the item's shown name. |
blacklist | section, 7 keys | Items that may not be listed. auctionhouse.blacklist.bypass ignores all of it. |
theme | section, 12 keys | Every message below is written against these names, not against hex codes: <accent>Buy</accent> rather than <#f0a04b>Buy</#f0a04b>. Change a colour here and it changes on every screen at once. Ordinary MiniMessage still works, so <gradient:#a:#b> and... |
messages | section, 228 keys | none |
# AuctionHouse - buy-it-now listings and timed auctions, with every item and coin accounted for.
#
# Players open /ah, browse the grid, and buy or bid. To sell, hold the item and run /ah sell <price>,
# or /ah sell on its own for the full form (amount, buy now or auction, how long, bid step).
#
# Everything lives in plugins/AuctionHouse/auctions.db (SQLite). Single server: the database is a
# local file, so two servers cannot share one auction house.
# ------------------------------------------------------------------------------------------------
# MONEY
# ------------------------------------------------------------------------------------------------
currency:
# vault: money from your economy plugin through Vault (EssentialsX, CMI, TheNewEconomy...).
# item: an item is the money, diamonds by default. Prices are then whole items.
type: vault
# Use the economy plugin's own money format ($1,234.50). false uses the format below.
vault-format: true
format: "${amount}"
item:
material: DIAMOND
name: "Diamond"
plural: "Diamonds"
format: "{amount} {name}"
# An exact item (custom name, model, anything) set in game with /ah admin currency while
# holding it. Leave empty to use the plain material above.
template: ""
# When something sells, the money goes straight into the seller's balance, online or not.
# false: it waits in the seller's collection bin (/ah collect) until they take it.
# With an item currency an offline seller is always paid on their next join.
money:
auto-deposit: true
# ------------------------------------------------------------------------------------------------
# LISTINGS
# ------------------------------------------------------------------------------------------------
listings:
# Listings a player may have up at once. Give more with auctionhouse.limit.<number>
# (auctionhouse.limit.20) or none at all with auctionhouse.limit.unlimited.
default-limit: 5
# The lengths offered in the sell form, in hours. 0.5 is thirty minutes.
durations-hours: [1, 6, 12, 24, 48]
default-buy-now-hours: 48
default-auction-hours: 12
# Nothing may be listed for longer than this many hours.
max-hours: 168
price:
min: 1
max: 1000000000
auctions:
enabled: true
# The smallest step between two bids, and the default step as a share of the starting price.
min-increment: 1
default-increment-percent: 5
# A bid in the last N seconds pushes the end out to at least N seconds after the bid, so nobody
# wins by bidding in the final second. 0 turns it off.
anti-snipe-seconds: 30
anti-snipe-extend-seconds: 30
fees:
# Paid when listing, and kept even if the listing is cancelled or expires.
listing-fee-flat: 0
listing-fee-percent: 0
# Taken from the price when something sells; the seller gets the rest.
sales-tax-percent: 5
sell:
# /ah sell <price> shows what it will cost and pay before the item goes up.
confirm: true
# Creative players cannot list items (staff with auctionhouse.admin still can).
block-creative: true
disabled-worlds: []
buy:
# Ask before a purchase goes through.
confirm: true
refunds:
# /ah admin refund also takes the seller's money (after tax) back out of their balance.
take-from-seller: true
history:
# Sales older than this are dropped from the history at startup. 0 keeps them forever.
keep-days: 90
# How many past sales /ah history shows.
show: 135
notify:
# A sound when you sell something, win an auction or are outbid.
sound: true
sound-key: "minecraft:entity.experience_orb.pickup"
# On join: what sold while you were away, and what waits in your bins.
join-summary: true
join-delay-seconds: 3
# A chat line to everyone when something new goes up. Hovering shows the item; clicking opens the
# auction house searched for it. The text is messages.broadcast-listing and broadcast-auction.
broadcast:
new-listings: true
# Only listings at or above this price are announced. 0 announces every one.
min-price: 0
# Seconds before the same seller is announced again, so one player cannot flood the chat.
cooldown-seconds: 60
# /ah price: what the item in your hand sold for over this many days, and its cheapest listing now.
price-check:
days: 30
# The first member of staff who joins gets one short line: is it trading yet, and where to start.
# Shown once per server (remembered in state.yml); /ah admin setup shows it again any time.
setup-hint: true
safety:
# Writes a player's inventory to disk right after every trade that changes it, so a crash
# cannot roll an inventory back to before an item went up for sale. Leave this on.
save-player-data: true
gui:
refresh-seconds: 2
click-cooldown-ms: 200
# The glass behind the bottom row. AIR for none.
filler: GRAY_STAINED_GLASS_PANE
date-format: "yyyy-MM-dd HH:mm"
# ------------------------------------------------------------------------------------------------
# CATEGORIES
# ------------------------------------------------------------------------------------------------
# Your own categories come first and claim an item before the built-in groups see it. materials
# takes * at either end: "*_ORE", "MUSIC_DISC_*". name-contains matches the item's shown name.
categories:
auto: true
custom:
valuables:
name: "<accent>Valuables</accent>"
icon: DIAMOND
materials: [DIAMOND, DIAMOND_BLOCK, EMERALD, EMERALD_BLOCK, NETHERITE_INGOT, NETHERITE_SCRAP, NETHERITE_BLOCK,
ANCIENT_DEBRIS, GOLD_INGOT, GOLD_BLOCK, IRON_INGOT, IRON_BLOCK, NETHER_STAR, TOTEM_OF_UNDYING, ELYTRA,
HEAVY_CORE, ENCHANTED_GOLDEN_APPLE, "*_SMITHING_TEMPLATE"]
name-contains: []
# The built-in groups: their names and icons.
names:
weapons: {name: "<accent>Weapons</accent>", icon: DIAMOND_SWORD}
armour: {name: "<accent>Armour</accent>", icon: IRON_CHESTPLATE}
tools: {name: "<accent>Tools</accent>", icon: IRON_PICKAXE}
potions: {name: "<accent>Potions</accent>", icon: POTION}
books: {name: "<accent>Books</accent>", icon: ENCHANTED_BOOK}
food: {name: "<accent>Food</accent>", icon: GOLDEN_CARROT}
blocks: {name: "<accent>Blocks</accent>", icon: GRASS_BLOCK}
misc: {name: "<accent>Everything else</accent>", icon: CHEST}
# ------------------------------------------------------------------------------------------------
# BLACKLIST
# ------------------------------------------------------------------------------------------------
# Items that may not be listed. auctionhouse.blacklist.bypass ignores all of it.
blacklist:
materials: [BEDROCK, BARRIER, COMMAND_BLOCK, CHAIN_COMMAND_BLOCK, REPEATING_COMMAND_BLOCK, COMMAND_BLOCK_MINECART,
STRUCTURE_BLOCK, STRUCTURE_VOID, JIGSAW, LIGHT, DEBUG_STICK, KNOWLEDGE_BOOK, SPAWNER, TRIAL_SPAWNER,
END_PORTAL_FRAME, REINFORCED_DEEPSLATE, "*_SPAWN_EGG"]
# Case-insensitive pieces of the item's shown name or of any lore line.
name-contains: []
lore-contains: ["soulbound", "untradeable"]
# Data components the item carries beyond its defaults, e.g. "minecraft:custom_model_data".
components: []
# Other plugins' item tags, e.g. "myplugin:bound".
pdc-keys: []
# Look inside shulker boxes and bundles too.
check-containers: true
block-damaged: false
# ------------------------------------------------------------------------------------------------
# THEME
# ------------------------------------------------------------------------------------------------
# Every message below is written against these names, not against hex codes: <accent>Buy</accent>
# rather than <#f0a04b>Buy</#f0a04b>. Change a colour here and it changes on every screen at once.
# Ordinary MiniMessage still works, so <gradient:#a:#b> and <#ff0000> are fine anywhere.
theme:
accent: "#f0a04b" # your colour: headings and anything the player is meant to click
accent2: "#f7c98f" # a lighter accent, for a second level of emphasis
title: "#f4f7ff" # screen titles
text: "#c2ccdd" # ordinary prose
muted: "#6b7a94" # hints, separators, anything the eye should skip
value: "#ffffff" # the numbers and names the player opened the screen to read
good: "#57e08a"
warn: "#ffc857"
bad: "#ff6b6b"
small-caps: false # a garnish; whole menus in it read badly
# Real Minecraft item pictures beside the buttons. Drawn from the client's own textures, so there
# is nothing to install and no resource pack: it needs a 1.21.9 or newer client.
item-icons: true
sounds: true
messages:
prefix: "<accent><bold>AH</bold></accent> <muted>»</muted> "
no-permission: "<bad>You cannot do that.</bad>"
players-only: "<text>Players only.</text>"
unknown-player: "<bad>Nobody called </bad><value>{name}</value><bad> has been here.</bad>"
help: "<text>/ah · /ah sell <price> [amount] · /ah sell · /ah auction <start> [amount] · /ah search <words> · /ah price · /ah listings · /ah collect · /ah expired · /ah history</text>"
help-admin: "<text>/ah admin remove <id> [reason] · /ah admin view <player> · /ah admin bin <player> · /ah admin history <player> · /ah admin refund <sale id> · /ah admin currency · /ah admin setup · /ah admin reload</text>"
usage-sell: "<text>/ah sell <price> [amount], holding the item. /ah sell alone opens the form.</text>"
usage-auction: "<text>/ah auction <starting bid> [amount], holding the item.</text>"
usage-admin-remove: "<text>/ah admin remove <listing id> [reason]. Admins see the id on every listing.</text>"
usage-admin-player: "<text>/ah admin {sub} <player></text>"
usage-admin-refund: "<text>/ah admin refund <sale id>. The id is on each sale in /ah admin history <player>.</text>"
reloaded: "<text>Reloaded. </text><value>{count}</value><text> listing(s) for sale.</text>"
unlimited: "no limit"
time-ended: "ending"
category-all: "<accent>Everything</accent>"
fee-none: "none"
# How a trade ended, when it did not go through.
outcome-ok: "<good>Done.</good>"
outcome-gone: "<bad>That listing is gone: somebody else got there first.</bad>"
outcome-expired: "<bad>That listing has just ended.</bad>"
outcome-busy: "<warn>Somebody is buying that right now. Try again in a moment.</warn>"
outcome-own: "<bad>That is your own listing.</bad>"
outcome-price-changed: "<bad>The price is no longer </bad><value>{price}</value><bad>. Have another look.</bad>"
outcome-no-money: "<bad>You cannot afford that.</bad>"
outcome-is-auction: "<text>That one is an auction: click it to bid.</text>"
outcome-not-auction: "<text>That one is buy-it-now, not an auction.</text>"
outcome-too-low: "<bad>The lowest bid it takes now is </bad><value>{min}</value><bad>.</bad>"
outcome-already-highest: "<text>You are already the highest bidder.</text>"
outcome-has-bids: "<bad>That auction has a bid on it, so it runs to the end.</bad>"
outcome-not-yours: "<bad>That is not your listing.</bad>"
outcome-not-due: "<text>That listing has not ended yet.</text>"
outcome-already-refunded: "<bad>That sale was refunded already.</bad>"
outcome-inventory-full: "<warn>Your inventory is full. It is waiting in </warn><value>/ah collect</value><warn>.</warn>"
outcome-no-economy: "<bad>The auction house has no economy to trade in yet. Tell staff.</bad>"
outcome-error: "<bad>Something went wrong and nothing changed. Try again, and tell staff if it keeps happening.</bad>"
# Selling.
auctions-off: "<bad>Auctions are switched off here.</bad>"
world-disabled: "<bad>You cannot list items in this world.</bad>"
no-creative: "<bad>You cannot list items in creative mode.</bad>"
hold-something: "<text>Hold the item you want to sell.</text>"
item-changed: "<bad>The item in your hand changed. Start again.</bad>"
bad-amount: "<bad>Pick an amount from 1 to {max}.</bad>"
blocked-material: "<bad>That item cannot be sold on the auction house.</bad>"
blocked-name: "<bad>An item with that name cannot be sold on the auction house.</bad>"
blocked-lore: "<bad>That item is marked as not for sale.</bad>"
blocked-component: "<bad>That item cannot be sold on the auction house.</bad>"
blocked-damaged: "<bad>Repair it first: damaged items cannot be listed.</bad>"
blocked-inside: "<bad>Something inside that container cannot be sold on the auction house.</bad>"
bad-price: "<bad>Prices go from </bad><value>{min}</value><bad> to </bad><value>{max}</value><bad>.</bad>"
whole-price: "<bad>Use a whole number.</bad>"
bad-increment: "<bad>The bid step must be a number above zero.</bad>"
bad-duration: "<bad>That is longer than a listing may run.</bad>"
bad-bid: "<bad>That is not a bid this auction can take.</bad>"
limit-reached: "<bad>You have </bad><value>{limit}</value><bad> listing(s) up, which is your limit.</bad>"
no-money-fee: "<bad>The listing fee is </bad><value>{fee}</value><bad> and you cannot afford it.</bad>"
listed: "<good>Listed</good> <value>{item}</value><text> for </text><value>{price}</value><text> for {time}.</text>"
listed-auction: "<good>Auction started</good><text> for </text><value>{item}</value><text>, bids from </text><value>{price}</value><text>, ending in {time}.</text>"
unreadable: "<bad>This item could not be read from the database (from a newer server version?). Staff can remove it, which returns it to the seller.</bad>"
# Buying and bidding.
bought: "<good>Bought</good> <value>{item}</value><text> from {seller} for </text><value>{price}</value><text>.</text>"
bought-to-bin: "<good>Bought</good> <value>{item}</value><text> for </text><value>{price}</value><text>. Your inventory is full, so it waits in </text><value>/ah collect</value><text>.</text>"
bid-placed: "<good>Bid placed:</good> <value>{price}</value><text> on {item}. Ends in {time}. If somebody outbids you, the money comes back.</text>"
bid-extended: "<text>A late bid: the auction now ends in </text><value>{time}</value><text>.</text>"
# Telling people.
notify-sold: "<good>Sold</good> <value>{item}</value><text> to {buyer} for </text><value>{price}</value><text>. You got </text><value>{net}</value><text> after tax.</text>"
notify-sold-auction: "<good>Your auction ended:</good> <value>{item}</value><text> went to {buyer} for </text><value>{price}</value><text>. You got </text><value>{net}</value><text>.</text>"
notify-outbid: "<warn>Outbid</warn><text> on {item}: {bidder} bid </text><value>{price}</value><text>. Your </text><value>{refund}</value><text> is back.</text>"
notify-bid: "<text>New bid on your {item}: </text><value>{price}</value><text> from {bidder}.</text>"
notify-won: "<good>You won</good> <value>{item}</value><text> for </text><value>{price}</value><text>. Collect it in </text><value>/ah collect</value><text>.</text>"
notify-expired: "<text>Your </text><value>{item}</value><text> did not sell. It is in </text><value>/ah expired</value><text>.</text>"
notify-removed: "<warn>Staff removed your listing</warn><text> of {item}. It is in </text><value>/ah expired</value><text>. {reason}</text>"
notify-bid-refunded: "<text>The auction for {item} was removed by staff. Your bid of </text><value>{price}</value><text> is back.</text>"
notify-refunded: "<good>Refunded:</good> <value>{price}</value><text> for sale #{id}.</text>"
join-sold: "<good>While you were away</good><text> you sold </text><value>{count}</value><text> listing(s) for </text><value>{price}</value><text> after tax.</text>"
join-bin: "<value>{count}</value><text> thing(s) wait in your collection bin: </text><value>/ah collect</value>"
join-expired: "<value>{count}</value><text> item(s) came back unsold: </text><value>/ah expired</value>"
# Taking listings back and collecting.
cancelled: "<text>Took back </text><value>{item}</value><text>.</text>"
cancelled-to-expired: "<text>Took back </text><value>{item}</value><text>. Your inventory is full, so it is in </text><value>/ah expired</value><text>.</text>"
collected-money: "<good>Collected</good> <value>{price}</value><text>.</text>"
collect-money-full: "<warn>No room for the money items. They stay here until you make room.</warn>"
inventory-full: "<warn>Your inventory is full. Make room and click again.</warn>"
collected-none: "<text>Nothing to collect.</text>"
collected-all: "<good>Collected</good> <value>{count}</value><text> thing(s).</text>"
# Staff.
unknown-listing: "<bad>There is no listing #{id} for sale.</bad>"
unknown-sale: "<bad>There is no sale #{id} in the history.</bad>"
admin-removed: "<text>Removed listing #{id} (</text><value>{item}</value><text> by {seller}). The item went back to the seller, and any bid to the bidder.</text>"
admin-refunded: "<text>Refunded sale #{id}: </text><value>{price}</value><text> back to {buyer}. {item} {clawback}</text>"
refund-item-returned: "<text>The item had not been collected and went back to the seller.</text>"
refund-item-kept: "<text>The buyer had already collected the item.</text>"
refund-clawback-off: ""
refund-clawback-ok: "<text>Took </text><value>{price}</value><text> back from {seller}.</text>"
refund-clawback-failed: "<warn>Could not take {price} back from {seller}; settle that by hand.</warn>"
admin-currency-set: "<text>The item currency is now </text><value>{item}</value><text>. currency.type is </text><value>{type}</value><text>; set it to item to use it.</text>"
setup-hint: "<accent>Auction House is installed.</accent> {currency}\n<text>Try it: hold an item and run </text><value>/ah sell 100</value><text>, then open </text><value>/ah</value><text>. Staff commands: </text><value>/ah help</value><text>. After editing config.yml: </text><value>/ah admin reload</value><text>.</text>\n<muted>{count} listing(s) up. This shows once; setup-hint: false turns it off, /ah admin setup shows it again.</muted>"
setup-currency-ok: "<good>Trading in {currency}.</good>"
setup-currency-missing: "<bad>No economy yet:</bad><text> install Vault plus an economy plugin (EssentialsX is free), or set currency.type: item in config.yml.</text>"
# Announcements and the price check.
broadcast-listing: "<value>{seller}</value><text> listed </text><value>{item}</value><text> for </text><accent>{price}</accent><text>. </text><muted>Hover to see it, click to find it.</muted>"
broadcast-auction: "<value>{seller}</value><text> started an auction for </text><value>{item}</value><text>, bids from </text><accent>{price}</accent><text>, {time}. </text><muted>Click to find it.</muted>"
price-check-title: "<accent>Price check:</accent> <value>{item}</value> <muted>(prices for {amount}, matched by item type)</muted>"
price-check-sales: "<text>Last {days} days: </text><value>{count}</value><text> sale(s), average </text><accent>{avg}</accent><text>, from </text><value>{low}</value><text> to </text><value>{high}</value><text>.</text>"
price-check-no-sales: "<text>None sold in the last {days} days.</text>"
price-check-listed: "<text>On sale now: </text><value>{count}</value><text> listing(s), the cheapest </text><accent>{price}</accent><text>.</text>"
price-check-none-listed: "<text>None on sale right now. </text><muted>Hold it and run /ah sell to be the first.</muted>"
# Sort orders.
sort-newest: "Newest first"
sort-ending: "Ending soon"
sort-price-low: "Cheapest first"
sort-price-high: "Dearest first"
# Why something is in a bin.
reason-purchase: "Bought"
reason-won: "Won at auction"
reason-sold: "Sale money"
reason-outbid: "Outbid, money back"
reason-refund: "Refund"
reason-expired: "Did not sell"
reason-cancelled: "Taken back"
reason-removed: "Removed by staff"
reason-returned: "Returned"
# The chest screens.
gui-title-browse: "<title>Auction House</title> <muted>{page}/{pages}</muted>"
gui-title-categories: "<title>Categories</title>"
gui-title-mine: "<title>Your listings</title> <muted>{count}/{limit}</muted>"
gui-title-admin: "<title>Listings of {player}</title>"
gui-title-collection: "<title>Collection bin</title> <muted>{count}</muted>"
gui-title-expired: "<title>Expired items</title> <muted>{count}</muted>"
gui-title-history: "<title>History of {player}</title>"
gui-prev: "<accent>Previous page</accent>"
gui-next: "<accent>Next page</accent>"
gui-page-lore: "<muted>Page {page} of {pages}</muted>"
gui-empty: "<text>Nothing for sale here yet.</text>"
gui-empty-search: "<text>Nothing matches </text><value>{query}</value><text>.</text>"
gui-category: "<accent>Category:</accent> {category}"
gui-category-lore: "<muted>Click to choose.\nRight-click for everything.</muted>"
gui-sort: "<accent>Sort:</accent> <value>{sort}</value>"
gui-sort-on: "<accent>» {sort}</accent>"
gui-sort-off: "<muted> {sort}</muted>"
gui-sort-lore: "<muted>Click for the next, right-click for the one before.</muted>"
gui-search: "<accent>Search</accent>"
gui-search-active: "<accent>Search:</accent> <value>{query}</value>"
gui-search-lore: "<muted>Click to search by name, enchantment or seller.\nRight-click to clear.</muted>"
gui-sell: "<good>Sell an item</good>"
gui-sell-lore: "<muted>Hold it, then click.\nYou have {count}/{limit} listing(s) up.</muted>"
gui-mine: "<accent>Your listings</accent> <muted>{count}/{limit}</muted>"
gui-mine-lore: "<muted>See what you have up, take things back.</muted>"
gui-collection: "<accent>Collection bin</accent>"
gui-collection-lore: "<text>{bin} waiting</text>\n<text>{expired} came back unsold</text>\n<muted>Purchases, wins and money land here.</muted>"
gui-history: "<accent>History</accent>"
gui-history-lore: "<muted>What you sold and bought.</muted>"
gui-category-all: "{category}"
gui-category-entry: "{category}"
gui-category-count: "<muted>{count} for sale</muted>"
gui-back: "<accent>Back</accent>"
gui-mine-empty: "<text>You have nothing listed. Hold an item and run /ah sell.</text>"
gui-admin-empty: "<text>{player} has nothing listed.</text>"
gui-collection-empty: "<text>Your collection bin is empty.</text>"
gui-expired-empty: "<text>Nothing came back unsold.</text>"
gui-history-empty: "<text>No sales yet.</text>"
gui-tab-bin: "<accent>Collection bin</accent> <muted>({bin})</muted>"
gui-tab-expired: "<accent>Expired items</accent> <muted>({expired})</muted>"
gui-collect-all: "<good>Collect everything</good>"
gui-collect-all-lore: "<muted>{count} on this tab, until your inventory is full.</muted>"
# Lines under the items.
lore-seller: "<muted>Seller</muted> <value>{seller}</value>"
lore-price: "<muted>Price</muted> <accent>{price}</accent>"
lore-start: "<muted>Starting bid</muted> <accent>{price}</accent> <muted>· no bids yet</muted>"
lore-bid: "<muted>Highest bid</muted> <accent>{price}</accent> <muted>by {bidder} · {bids} bid(s)</muted>"
lore-min: "<muted>Next bid from</muted> <value>{price}</value>"
lore-ends: "<muted>Ends in</muted> <value>{time}</value>"
lore-unreadable: "<bad>This item could not be read.</bad>"
lore-pending: "<warn>Being bought right now</warn>"
lore-own: "<muted>Your listing · click to take it back</muted>"
lore-click-buy: "<good>Click to buy</good>"
lore-click-bid: "<good>Click to bid</good>"
lore-admin: "<muted>#{id} · shift + right-click to remove</muted>"
lore-reason: "<muted>{reason}</muted> <text>{note}</text>"
lore-date: "<muted>{date}</muted>"
lore-click-collect: "<good>Click to take it</good>"
lore-click-collect-money: "<good>Click to collect</good>"
lore-money-name: "<accent>{price}</accent>"
lore-history-sold: "<text>Sold to {buyer} for</text> <accent>{price}</accent>"
lore-history-net: "<muted>You got {net} · tax {tax}</muted>"
lore-history-bought: "<text>Bought from {seller} for</text> <accent>{price}</accent>"
lore-history-auction: "<muted>Auction</muted>"
lore-history-buy-now: "<muted>Buy it now</muted>"
lore-history-refunded: "<warn>Refunded</warn>"
lore-history-id: "<muted>Sale #{id}</muted>"
# The dialog windows.
dialog-back: "<white><icon:back></white><text>Back</text>"
dialog-back-tip: "<text>Back to the auction house.</text>"
dialog-buy-title: "<value>Buy this?</value>"
dialog-buy-body: "<value>{item}</value>\n<text>from {seller}</text>\n<text>Price </text><accent>{price}</accent>\n<muted>Ends in {time}</muted>"
dialog-buy-yes: "<white><icon:buy></white><good>Buy for {price}</good>"
dialog-buy-yes-tip: "<text>Pays the price and gives you the item. If your inventory is full it waits in /ah collect.</text>"
dialog-bid-title: "<value>Place a bid</value>"
dialog-bid-none: "<text>No bids yet, starting at </text><accent>{price}</accent>"
dialog-bid-current: "<text>Highest bid </text><accent>{price}</accent><text> by {bidder} ({bids})</text>"
dialog-bid-body: "<value>{item}</value>\n<text>from {seller}</text>\n{current}\n<text>Lowest bid now </text><value>{min}</value>\n<muted>Ends in {time}. Your bid is paid now and comes back if you are outbid.</muted>"
dialog-bid-field: "<text>Your bid</text>"
dialog-bid-yes: "<white><icon:bid></white><good>Place bid</good>"
dialog-bid-yes-tip: "<text>Pays your bid now. It comes back if somebody outbids you.</text>"
dialog-cancel-title: "<value>Take it back?</value>"
dialog-cancel-body: "<value>{item}</value>\n<text>Comes off the auction house and back to you.</text>\n<muted>The listing fee ({fee}) is not returned.</muted>"
dialog-cancel-yes: "<white><icon:cancel></white><bad>Take it back</bad>"
dialog-cancel-yes-tip: "<text>Into your inventory, or /ah expired if it is full.</text>"
dialog-remove-title: "<value>Remove listing #{id}?</value>"
dialog-remove-body: "<value>{item}</value>\n<text>by {seller} · listing #{id} · {bids} bid(s)</text>\n<muted>The item goes back to the seller's expired items and any bid back to the bidder.</muted>"
dialog-remove-field: "<text>Reason (the seller sees it)</text>"
dialog-remove-yes: "<white><icon:delete></white><bad>Remove it</bad>"
dialog-remove-yes-tip: "<text>Takes it off the auction house.</text>"
dialog-search-title: "<value>Search</value>"
dialog-search-body: "<text>Words from the item's name, an enchantment (sharpness, mending), a potion or a seller.</text>"
dialog-search-field: "<text>Search for</text>"
dialog-search-yes: "<white><icon:search></white><good>Search</good>"
dialog-search-yes-tip: "<text>Shows only what matches every word.</text>"
dialog-search-clear: "<white><icon:close></white><text>Clear</text>"
dialog-search-clear-tip: "<text>Shows everything again.</text>"
dialog-sell-title: "<value>Sell</value>"
dialog-sell-title-auction: "<value>Start an auction</value>"
dialog-sell-body: "<value>{item}</value>\n<text>Listing fee </text><value>{fee}</value><text> · sales tax </text><value>{tax}%</value>\n<muted>You have {count}/{limit} listing(s) up.</muted>"
dialog-sell-price: "<text>Price</text>"
dialog-sell-start: "<text>Starting bid</text>"
dialog-sell-amount: "<text>How many</text>"
dialog-sell-mode: "<text>Sell as</text>"
dialog-sell-mode-buy-now: "Buy it now"
dialog-sell-mode-auction: "Auction"
dialog-sell-duration: "<text>For</text>"
dialog-sell-hours: "{time}"
dialog-sell-increment: "<text>Bid step, auctions only (empty = automatic)</text>"
dialog-sell-yes: "<white><icon:sell></white><good>List it</good>"
dialog-sell-yes-tip: "<text>Takes the item from your hand and puts it up.</text>"
dialog-cancel-form: "<white><icon:close></white><text>Cancel</text>"
dialog-cancel-form-tip: "<text>Nothing is listed.</text>"
dialog-confirm-sell-title: "<value>List this?</value>"
dialog-confirm-sell-body: "<value>{item}</value>\n<text>Price </text><accent>{price}</accent><text> for {time}</text>\n<text>Listing fee </text><value>{fee}</value><text> · tax {tax}%</text>\n<text>You get </text><good>{net}</good><text> when it sells.</text>"
dialog-confirm-sell-auction: "<value>{item}</value>\n<text>Bids from </text><accent>{price}</accent><text> in steps of {increment}, for {time}</text>\n<text>Listing fee </text><value>{fee}</value><text> · tax {tax}% of the winning bid</text>"
dialog-confirm-sell-yes: "<white><icon:sell></white><good>List for {price}</good>"
dialog-confirm-sell-yes-tip: "<text>Takes the item from your hand and puts it up.</text>"Config guide
The annotated summary from the store page. Where it and the default file above differ, the file is what the plugin ships.
currency:
type: vault vault, or item
item: { material: DIAMOND, name: "Diamond", plural: "Diamonds" }
money:
auto-deposit: true sale money straight into the balance, even offline
listings:
default-limit: 5
durations-hours: [1, 6, 12, 24, 48]
default-buy-now-hours: 48
default-auction-hours: 12
price: { min: 1, max: 1000000000 }
auctions:
min-increment: 1
default-increment-percent: 5
anti-snipe-seconds: 30
anti-snipe-extend-seconds: 30
fees:
listing-fee-flat: 0
listing-fee-percent: 0
sales-tax-percent: 5
categories:
custom:
valuables: { name: "Valuables", icon: DIAMOND, materials: [DIAMOND, NETHERITE_INGOT, "*_SMITHING_TEMPLATE"] }
blacklist:
materials: [BEDROCK, BARRIER, SPAWNER, "*_SPAWN_EGG"]
lore-contains: ["soulbound"]
components: [] e.g. "minecraft:custom_model_data"
pdc-keys: [] other plugins' item tags
check-containers: true
Differences between this summary and the shipped files (an example in the summary may use values of its own):
blacklist.materials: the summary shows[BEDROCK, BARRIER, SPAWNER, '*_SPAWN_EGG'], the default file has[BEDROCK, BARRIER, COMMAND_BLOCK, CHAIN_COMMAND_BLOCK, REPEATING_COMMAND_BLOCK, COMMAND_BLOCK_MINECART, STRUCTURE_BLOCK, STRUCTURE_VOID, JIGSAW, LIGHT, DEBUG....blacklist.lore-contains: the summary shows[soulbound], the default file has[soulbound, untradeable].
FAQ
Which servers and versions does it run on?
It needs Paper or a Paper fork such as Purpur, because it uses Paper-only APIs (the dialog API for its menus, Adventure text components). Spigot and CraftBukkit are not supported. plugin.yml declares api-version 1.21, the jar is built against Paper API 1.21.11, and it needs Java 21 or newer.
Does it need other plugins?
No other plugin is required (plugin.yml has no hard dependencies). Optional: Vault, PlaceholderAPI (plugin.yml softdepend), used when present. The server downloads org.xerial:sqlite-jdbc:3.53.2.1 at startup, so it needs internet access on first start.
How do I apply config changes?
Edit plugins/AuctionHouse/config.yml and restart the server.
Does it run on Folia, or for Bedrock players?
Not tested on Folia, and plugin.yml does not declare folia-supported. Bedrock players (through Geyser) have not been tested either.
What licence do I get?
The licence terms are the BuiltByBit EULA shown on the listing. There is no licence key to enter, and the plugin never contacts a licence server.
Links
- BuiltByBit: listing coming soon
- Support Discord: discord.gg/KG4ubAZEuw
- All plugins on BuiltByBit: the collection
- More plugins: all plugins
- Custom work: commissions
Support
Questions, bugs or ideas: the active support Discord or the discussion tab on this page. When something breaks, include your server version and the error from the console.
Full setup guide, commands, permissions and config reference: documentation.