FAQ
Common questions about installing, configuring and running AT-AuctionHouse.
If none of these help, ask in the support Discord. See Support.
Installing
AT-AuctionHouse needs Vault plus an economy plugin such as EssentialsX. Vault on its own is not enough: it is an interface, and something has to implement it.
Install both, restart, and check that your economy plugin actually registered with Vault. Most of them log a line saying so at startup.
On Folia there is an extra catch, see the next question.
Upstream Vault is not marked folia-supported, so Folia refuses to load it. The economy
hook then finds no provider and AT-AuctionHouse disables itself.
You need a Folia-compatible Vault fork and a Folia-compatible economy plugin. Nothing about this is specific to AT-AuctionHouse. Every Vault-based plugin has the same requirement.
Paper or Folia, 1.21.1 through the current 26.x line, from one jar.
1.21.1 is the floor because the anvil search bar and the Folia detection API both arrived there. Java 21 is enough on 1.21.x; the 26.x line needs Java 25, and the jar loads on both.
No. Every driver is declared in plugin.yml and downloaded by the server at startup into
an isolated classloader, and only the one matching your DATABASE.TYPE is ever
initialised.
The first startup after installing the plugin needs network access to fetch it. After that it is cached.
No. There are no placeholders exposed to other plugins.
The {placeholder} names in gui.yml are internal to the plugin's own menus. They do not
work anywhere else, and PlaceholderAPI placeholders do not work inside gui.yml.
No. There is no API for other plugins to hook into.
Configuring
No. Config files upgrade themselves in place. New keys and their explanatory comments are merged in, your values are kept exactly as you set them, and keys that no longer exist are removed.
There is nothing to diff and nothing to regenerate. See Configuration.
No. Defaults are served from the copy bundled inside the jar, so a missing key resolves to the shipped value rather than to nothing.
Run /ah reload. If it still looks the same, check the console: an unknown material logs
one warning naming the exact route, and a missing menu block logs a warning naming the
menu.
Also check that the role's character actually appears in that menu's STRUCTURE. An item
defined under ITEMS with no matching character in CHARS is never drawn.
Its character is no longer in the layout, or two roles were given the same character in
CHARS. CHARS maps role to character, so a duplicate means the last one wins and the
other button is gone.
Only for DATABASE.TYPE. Everything else is picked up by /ah reload.
Sound entries are read live and take effect on the next click without even a reload.
Yes, two ways. Set AUCTION.BROADCAST-PRICE-THRESHOLD higher than AUCTION.MAX-PRICE so
nothing can reach it, or blank the SELL.BROADCAST message in your language file. A
message set to "" is skipped silently.
Yes, as long as the material is not on the blacklist. The whole item is serialized, including its name, lore, enchantments, custom model data and persistent data, so it comes out of the auction house exactly as it went in.
The blacklist matches materials rather than individual custom items, so two custom items sharing a material are either both allowed or both blocked.
Add its Bukkit material name to AUCTION.BLACKLIST and run /ah reload. Matching is
case-insensitive.
Set FORMATTING.CURRENCY-SYMBOL in config.yml and run /ah reload. It is written in
front of every price the plugin shows. Set it to "" for bare numbers.
The same key decides what players may type at the price prompt, so they can include the symbol or leave it out either way.
If you would rather build the price yourself in a lore line, {price-raw} still gives the
plain number with no symbol and no suffix. See
Configuration.
Edit FORMATTING.MAGNITUDE-SUFFIXES in config.yml. The list is positional, one entry per
step of 1000, starting with an empty entry for the ones slot.
Whatever you put there is also what the price prompt reads back, so renaming K to mil
makes 2.5mil something a player can type when AUCTION.COMPACT-PRICE-INPUT is on.
They are in your language file, not in config.yml. Edit the TIME block:
TIME:
DAY: "d"
HOUR: "h"
MINUTE: "m"
SECOND: "s"
ZERO: "0s"Each label is written straight after its number with no space. ZERO is the whole string
shown once a listing has run out, so a word works there too.
They live in the language file because nothing ever reads a duration back from a player,
unlike the price suffixes. The shipped files already differ, French uses j for days and
Japanese uses 日, 時間, 分 and 秒. See Languages.
Running it
No. That is the plugin's single hard rule. Every path that takes an item out of a player's inventory has a matching path that gives it back: on failure, on cancel, on a full inventory, on logout, and on a clean server shutdown.
Anything that cannot be handed over right now goes to the collection box instead.
No. The listing is claimed with a single conditional database update that only matches if it is still active, so exactly one buyer wins and the rest are told the listing is gone.
If the buyer's payment then fails, the claim is rolled back and the listing goes back on sale, because at that point no money and no item have moved.
This holds across servers too, which is what makes cross-server mode safe.
Once the money has moved and the listing is marked sold, the item is owed unconditionally. It is written to the buyer's collection box and waits for them.
The same applies to the seller's money: an offline seller gets a payout, delivered the next time they are seen.
Any item a player handed to a menu but has not got back yet is written to their collection box before anything else is torn down. That includes items sitting in the sell menu and items held at the chat price prompt.
They show up in the collection box with the reason "Shutdown".
Either Redis is not connected, or CROSS-SERVER.SYNC.AUCTION-UPDATES is off.
The database is the source of truth, so nothing is lost either way. Players can press the Refresh button in the auction house menu to force a fresh read at any time. See Cross-server.
They are pointing at different databases. Check DATABASE.MYSQL.HOST, PORT and
DATABASE on each one, not just the TYPE.
/ah about reports the backend actually in use on each server.
No. SQLite is a single file and cannot be shared safely. Move to MySQL or MongoDB first, then enable cross-server mode. See Storage.
No. The old data stays where it is and the new backend starts empty. There is no built-in migration between backends.
Check the console. An unknown sound name is logged exactly once, naming the name that failed.
Both forms work: the Bukkit constant name like ENTITY_VILLAGER_NO, and the namespaced
key like minecraft:entity.villager.no. Sound names change between Minecraft versions, so
one that worked on an older server may not exist on a newer one.
Tell them to run /ah collect. Almost every "vanished item" report is an item sitting in
the collection box because their inventory was full at the time.
If it is genuinely not there, the console will have logged a warning naming the listing id, which is enough to track it down. Bring that line to the Discord.
The support Discord. There is no public issue tracker.