Overview #
The MineSeedFinder API answers two questions about a Minecraft world from its seed: which structures generate near a position, and which biome sits at a point. It covers Bedrock and Java Edition, there is no key and no account, and every route is a plain HTTP request that returns JSON or plain text.
The same engine runs in the browser on the SeedFinder console and the SeedCracker console, so you can check a result by hand before wiring it into a script.
Base URL #
All routes sit at the root of the site: no path prefix, no version segment, no trailing slash.
https://www.mineseedfinder.com
Rate limits #
| Route | Limit | What happens past it |
|---|---|---|
/GetStructures |
None applied by the API itself | Results are cached at the edge for an hour, so a repeated request is answered without running the scan again. |
/GetBiomeAt and /GetBiomes |
6 requests per minute per IP, shared between the two | 429 with a Retry-After header, in seconds. Responses are cached for an hour in the browser and for a day at the edge. |
The switch applies to every example on this page.
Endpoint GET /GetStructures #
Lists the structures near a position, sorted by distance. It also
answers POST. /scan is the same endpoint
under its original codename, with the same parameters and the same
JSON, so a script written against either name keeps working.
/GetStructures reads the edition from
mc, default Bedrock.
/GetStructures/java and
/GetStructures/bedrock fix it and ignore
mc. /scan,
/scan/java and
/scan/bedrock behave the same way.
Parameters #
| Parameter | Type | Default | Description |
|---|---|---|---|
seed | int (uint64) | 0 |
The world seed. Negative seeds are read as their 64-bit unsigned value, the same way the game reads them. |
x | float | 0 |
Player X position, in blocks. |
z | float | 0 |
Player Z position, in blocks. |
radius | int | 100 |
Search radius in chunks. Below 1 is rejected with 400; above 1000 is clamped. |
max | int | 20 |
Maximum results. Below 1 is rejected with 400; above 200 is clamped. |
types | string | 5 |
Comma-separated structure IDs from the table below. |
mc | string | bedrock |
Edition on the plain path only: the first letter decides, j... for Java and b... for Bedrock. Anything else is a 400. Ignored on the fixed paths. |
results; error responses add
missing_or_invalid. On POST, send the same
names as a JSON body or as form data.
Structure IDs #
types takes these IDs, comma-separated.
For example 5,8,9 asks for villages,
monuments and mansions.
| ID | Structure | ID | Structure |
|---|---|---|---|
1 | Desert Temple | 11 | Ruined Portal |
2 | Jungle Temple | 12 | Ruined Portal (Nether) |
3 | Witch Hut | 13 | Ancient City |
4 | Igloo | 14 | Buried Treasure |
5 | Village | 15 | Mineshaft |
6 | Ocean Ruins | 23 | Trail Ruins |
7 | Shipwreck | 24 | Trial Chamber |
8 | Monument | ||
9 | Mansion | ||
10 | Outpost |
Desert Well (16) and Amethyst Geode
(17) are not supported.
Response #
200
{
"results": [
{ "distance": 34.5, "name": "mansion", "x": 520, "z": 216 },
{ "distance": 56.5, "name": "village", "x": -360, "z": -840 },
{ "distance": 73.7, "name": "village", "x": 168, "z": 1176 }
]
}
chunk × 16 + 8), including
Trail Ruins and Trial Chambers. distance
is measured in chunks from the position you passed in. A search that
finds nothing returns {"results": []}.
400, a parameter the API cannot use
{
"error": "Invalid parameter: invalid value for 'mc': 'x' (must start with 'j' or 'b')",
"missing_or_invalid": ["mc"]
}
503, native library missing on that server
{
"error": "SeedFinder native library (.so) not loaded on this server.",
"hint": "Check Vercel build logs for messages starting with [seedfinder].",
"missing_or_invalid": [],
"results": []
}
Live example #
Villages, monuments and mansions within 100 chunks of spawn on seed
31415.
https://www.mineseedfinder.com/GetStructures?seed=31415&x=0&z=0&radius=100&max=50&types=5,8,9
Examples #
import requests
BASE = "https://www.mineseedfinder.com"
def structures(seed, x=0, z=0, radius=100, max_=20, types="5", mc="bedrock"):
r = requests.get(
f"{BASE}/GetStructures",
params={"seed": seed, "x": x, "z": z, "radius": radius,
"max": max_, "types": types, "mc": mc},
timeout=15,
)
r.raise_for_status()
return r.json()
for s in structures(seed=31415, types="5,8,9").get("results", []):
print(f"{s['name']:<14} (x={s['x']}, z={s['z']}) dist={s['distance']}")
-- Flarial Client module: `network` is a Flarial global.
local BASE = "https://www.mineseedfinder.com"
local function structures(seed, x, z, radius, maxResults, types)
local url = string.format(
"%s/GetStructures?seed=%d&x=%d&z=%d&radius=%d&max=%d&types=%s",
BASE, seed, x, z, radius, maxResults, types
)
local resp = network.get(url)
if not resp or resp.code ~= 200 then
print("[seedfinder] HTTP error: " .. tostring(resp and resp.code))
return nil
end
return resp.body -- JSON string; parse it with your JSON library
end
print(structures(31415, 0, 0, 100, 50, "5,8,9"))
curl "https://www.mineseedfinder.com/GetStructures?seed=31415&x=0&z=0&radius=100&max=50&types=5,8,9"
# the same request with a JSON body
curl -X POST https://www.mineseedfinder.com/GetStructures \
-H "Content-Type: application/json" \
-d '{"seed": 31415, "x": 0, "z": 0, "radius": 100, "max": 50, "types": "5,8,9"}'
Endpoint GET /GetBiomeAt #
Answers with the biome at one block position, as plain text. Biomes are identical in Java and Bedrock, so there is no edition parameter.
Parameters #
| Parameter | Type | Description |
|---|---|---|
seed | int (uint64) | The world seed. Required. |
x | float | Block X position. Required. |
z | float | Block Z position. Required. |
200
minecraft:river
Examples #
import requests
r = requests.get(
"https://www.mineseedfinder.com/GetBiomeAt",
params={"seed": 31415, "x": 0, "z": 0},
timeout=15,
)
r.raise_for_status()
print(r.text) # minecraft:river
local resp = network.get(
"https://www.mineseedfinder.com/GetBiomeAt?seed=31415&x=0&z=0"
)
print(resp and resp.body) -- minecraft:river
curl "https://www.mineseedfinder.com/GetBiomeAt?seed=31415&x=0&z=0"
Endpoint GET /GetBiomes #
Answers with a square grid of biomes centred on X/Z, as text, JSON or a PNG map.
Parameters #
| Parameter | Type | Default | Description |
|---|---|---|---|
seed | int (uint64) | required | The world seed. |
x | float | required | Centre X position, in blocks. |
z | float | required | Centre Z position, in blocks. |
size | int | 1 | Samples per side, 1 to 100. One sample is one output row and one PNG pixel. |
scale | int | 4 | Distance between samples, in blocks: 4, 8 or 16. |
outputformat | string | image | text, json or image. |
Output formats #
- text: one line per Z row, north first, one character per sample.
- json: the same rows as an array of strings.
- image: a PNG with one pixel per sample, in the same colours as the biome map on the console.
text nor json
carries a legend, so the table below is the decoder. It mirrors
BIOME_CHARS in app/biomes.py:
when that table changes, this one changes with it.
Character legend #
| Char | Biome | Char | Biome |
|---|---|---|---|
A | minecraft:ocean | b | minecraft:warm_ocean |
B | minecraft:plains | c | minecraft:lukewarm_ocean |
C | minecraft:desert | d | minecraft:cold_ocean |
D | minecraft:windswept_hills | e | minecraft:deep_warm_ocean |
E | minecraft:forest | f | minecraft:deep_lukewarm_ocean |
F | minecraft:taiga | g | minecraft:deep_cold_ocean |
G | minecraft:swamp | h | minecraft:deep_frozen_ocean |
H | minecraft:river | i | minecraft:sunflower_plains |
I | minecraft:frozen_ocean | j | minecraft:windswept_gravelly_hills |
J | minecraft:frozen_river | k | minecraft:flower_forest |
K | minecraft:snowy_plains | l | minecraft:ice_spikes |
L | minecraft:mushroom_fields | m | minecraft:old_growth_birch_forest |
M | minecraft:beach | n | minecraft:old_growth_spruce_taiga |
N | minecraft:jungle | o | minecraft:windswept_savanna |
O | minecraft:sparse_jungle | p | minecraft:eroded_badlands |
P | minecraft:deep_ocean | q | minecraft:bamboo_jungle |
Q | minecraft:stony_shore | r | minecraft:dripstone_caves |
R | minecraft:snowy_beach | s | minecraft:lush_caves |
S | minecraft:birch_forest | t | minecraft:meadow |
T | minecraft:dark_forest | u | minecraft:grove |
U | minecraft:snowy_taiga | v | minecraft:snowy_slopes |
V | minecraft:old_growth_pine_taiga | w | minecraft:jagged_peaks |
W | minecraft:windswept_forest | x | minecraft:frozen_peaks |
X | minecraft:savanna | y | minecraft:stony_peaks |
Y | minecraft:savanna_plateau | z | minecraft:deep_dark |
Z | minecraft:badlands | 0 | minecraft:mangrove_swamp |
a | minecraft:wooded_badlands | 1 | minecraft:cherry_grove |
2 | minecraft:pale_garden |
Both biome routes allow 6 requests per minute per IP address, shared
between them, and answer 429 with a
Retry-After header beyond that.
Examples #
import requests
r = requests.get(
"https://www.mineseedfinder.com/GetBiomes",
params={"seed": 31415, "x": 0, "z": 0, "size": 8, "scale": 16,
"outputformat": "json"},
timeout=15,
)
r.raise_for_status()
for row in r.json(): # one string per Z row, north first
print(row)
local url = "https://www.mineseedfinder.com/GetBiomes"
.. "?seed=31415&x=0&z=0&size=8&scale=16&outputformat=text"
local resp = network.get(url)
print(resp and resp.body) -- one line per row, one char per biome
# PNG map, one pixel per sample
curl -o biomes.png "https://www.mineseedfinder.com/GetBiomes?seed=31415&x=0&z=0&size=32&scale=16"
# text grid you can read in the terminal
curl "https://www.mineseedfinder.com/GetBiomes?seed=31415&x=0&z=0&size=8&scale=16&outputformat=text"
Discord bot (closed test) #
The same structure lookup that runs on this page also exists as a Discord slash command, so a server can answer "what is around this seed" without leaving the chat. It is in a closed test: it runs privately, there is no invite link on this page, and it is not supported as a public service yet.
/scan takes seven required fields: the
API's seed, x,
z, radius,
max and types,
plus an explicit edition (Java or
Bedrock). It answers with an embed: the structures near the
position, sorted by distance and paginated when there are many. A
button on the reply opens the SeedFinder console with the same
search already filled in.
Commands #
| Command | What it does |
|---|---|
/scan |
Finds structures near a position. All seven fields are required: seed, edition (Java or Bedrock), x, z, radius in chunks (1-1000), types (names, IDs, or all, with autocomplete) and max (1-200). |
/types (/tipos) |
Lists the structure names and IDs the API accepts. |
/ping |
Bot and API status. |
/help (/ajuda) |
How to use the bot. |
/config |
Admins only: which channels may use the bot, the per-channel cooldown, and the reply language (English or Portuguese). |
/scan seed:31415 edition:Bedrock x:0 z:0 radius:100 types:village,monument max:20
Attribution #
Using this API, or showing its results, in your own project, bot or website? No sign-up and no permission needed. Credit the service with a powered by SeedFinder line linking to the home page, wherever you show the results.
<a href="https://www.mineseedfinder.com/">powered by SeedFinder</a>