Tartary is land surveyed from the Bitcoin chain: district N is block N, and every block's land, its biome, height, climate and settlement, is worked out from the block itself, the same way by everyone. Each district is split into parcels. A deed is a token (a 1-sat ordinal) for one parcel, and whoever holds the token holds the land.
Anyone can use the land and the deeds: a game, a metaverse, a map, a marketplace. Reading needs no key and no account, and the API is open to every website.
The API is https://api.vulpinenetwork.com/api.
curl https://api.vulpinenetwork.com/api/tartary/deed/170.3
A parcel is named <district>.<index>. The answer is metadata in the shape game engines, wallets and NFT tools already read, so most can load it as it is:
{
"name": "Tartary 170.3",
"description": "Parcel 3 of district 170 in Tartary, ...",
"image": "https://api.vulpinenetwork.com/api/deed/land/170.3.svg",
"attributes": [
{ "trait_type": "District", "value": 170 },
{ "trait_type": "Parcel", "value": 3 },
{ "trait_type": "Biome", "value": "mangrove" },
{ "trait_type": "Terrain", "value": "mangrove" },
{ "trait_type": "Elevation", "value": "lowland" }
],
"parcel": "170.3", "district": 170, "index": 3,
"founded": true,
"holder": "the address that holds the deed now",
"outpoint": "the deed token's txid.vout",
"derivation": "tartary-1"
}
| Field | What it is |
|---|---|
name, description, image, attributes | The usual token metadata. image is the deed's picture, an SVG. |
parcel, district, index | Where the land is. |
founded | Whether anyone holds a deed for it yet. An unfounded parcel still has its land. |
holder | The Bitcoin address that holds the deed today. The reader follows the token when it is sent or sold. |
outpoint | Where the deed's token sits on the chain now (txid.vout), for anyone who wants to check it themselves. |
derivation | The rule the land was worked out with. It never changes for a given name. |
curl "https://api.vulpinenetwork.com/api/tartary/deeds/all?limit=1000"
The answer is {"deeds": [...], "next": 1000}. Each deed has seq, parcel, district, holder, outpoint and ts. Ask again with ?after= the next you were given, until next is null.
| You want | Ask for |
|---|---|
| A window of districts, with biome, terrain, climate and settlement | GET /api/tartary/map?from=0&count=100 |
| One district in full | GET /api/tartary/district/:district |
| A district's parcels, founded or not | GET /api/tartary/parcels/:district |
| One parcel, with what is built on it | GET /api/tartary/parcel/:parcel |
| A deed's picture | GET /api/deed/land/:parcel.svg |
| The deeds an address holds | GET /api/tartary/founded/:address |
District 170, for example, is mangrove (mangrove), elevation lowland, with 2 parcels.
const API = 'https://api.vulpinenetwork.com/api'
// one parcel: what to draw, and who owns it
const deed = await (await fetch(`${API}/tartary/deed/170.3`)).json()
const biome = deed.attributes.find((a) => a.trait_type === 'Biome').value
// every deed, a page at a time
let after = 0, all = []
while (after !== null) {
const page = await (await fetch(`${API}/tartary/deeds/all?limit=1000&after=${after}`)).json()
all = all.concat(page.deeds); after = page.next
}
To know a player holds a deed, compare holder with the address their wallet controls, and have them sign a message with that address to prove it.