Frostyh Plugins

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

What makes it different

Works with

Highlights

Every listing on one page.

What you get

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.

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

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

  1. Download AuctionHouse.jar from BuiltByBit. There is no licence key to enter.
  2. Stop the server and put the jar into the plugins folder.
  3. Start the server. The plugin creates plugins/AuctionHouse/config.yml with the defaults shown under Configuration.
  4. Edit config.yml to suit your server.
  5. Restart the server to apply the changes.

Setup guide

  1. Install Vault and an economy plugin (EssentialsX is free), or set currency.type: item to trade in diamonds.
  2. Drop AuctionHouse.jar into /plugins and restart. The console says what it trades in.
  3. Set your sales tax, listing fee and limits in config.yml, then /ah admin reload.
  4. Give bigger limits to your ranks with auctionhouse.limit.<number>.
  5. 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.

CommandAliasesUsageDescriptionPermission
/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.

NodeDefaultDescriptionChildren
auctionhouse.useeveryoneOpen the auction house and browse it.none
auctionhouse.buyeveryoneBuy listings.none
auctionhouse.bideveryoneBid on auctions.none
auctionhouse.selleveryoneList items for sale.none
auctionhouse.auctioneveryoneList items as timed auctions.none
auctionhouse.limit.unlimitednobody until grantedNo limit on listings.none
auctionhouse.fee.exemptnobody until grantedPays no listing fee.none
auctionhouse.tax.exemptnobody until grantedPays no sales tax.none
auctionhouse.blacklist.bypassnobody until grantedMay list blacklisted items.none
auctionhouse.adminoperatorsRemove 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:

Placeholders (PlaceholderAPI, optional)

Placeholders

Registered with PlaceholderAPI under the identifier auctionhouse (AhPlaceholders.java). PlaceholderAPI must be installed for these to work.

PlaceholderReturns
%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:

KeyDefaultComment above it
currencysection, 4 keysnone
moneysection, 1 keyWhen 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.
listingssection, 5 keysnone
pricesection, 2 keysnone
auctionssection, 5 keysnone
feessection, 3 keysnone
sellsection, 3 keysnone
buysection, 1 keynone
refundssection, 1 keynone
historysection, 2 keysnone
notifysection, 4 keysnone
broadcastsection, 3 keysA 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-checksection, 1 key/ah price: what the item in your hand sold for over this many days, and its cheapest listing now.
setup-hinttrueThe 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.
safetysection, 1 keynone
guisection, 3 keysnone
date-format"yyyy-MM-dd HH:mm"none
categoriessection, 3 keysYour 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.
blacklistsection, 7 keysItems that may not be listed. auctionhouse.blacklist.bypass ignores all of it.
themesection, 12 keysEvery 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...
messagessection, 228 keysnone
plugins/AuctionHouse/config.yml
# 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):

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.