Reading your artifact
Every field on the page comes from one API call, and every field can be checked against the chain without trusting the page.
- What every field in the artifact record means, including why depth is computed when you ask and never stored per block.
- Why the birth fields never change and the carrier does, and which one to protect.
- How to recompute the artifact id in one command and compare it against the id you were handed.
- What
ALIVEandRELICmean, and which of the two is terminal. - Why a share card without the block height it was taken at is a card nobody can check.
The record
This is the shape of one artifact record, with placeholders where the hashes go. Read it once now, because the rest of the page walks the same fields in the same order.
{
"artifact_id": "...",
"birth_txid": "...",
"birth_height": 0,
"birth_vout": 0,
"endowment_sats": "100000",
"founding": true,
"status": "ALIVE",
"carrier": { "txid": "...", "vout": 0, "height": 0, "value": "100000" },
"depth": 0,
"tier": 0,
"tier_name": "Raw",
"next_tier": 1,
"blocks_to_next_tier": 1008,
"rings": []
}
Satoshi values are decimal strings so that large numbers survive JSON parsers. Heights are numbers. See API conventions.
Field by field
- artifact_id
- The permanent id, lowercase hex. Derived from your reveal transaction and the carrier index at birth. It never changes, not even when the artifact moves to a new carrier.
- birth_txid, birth_height, birth_vout
- Where the artifact was created. This is history, not location. After a move, the carrier changes but these do not.
- endowment_sats
- The value the carrier held at birth. It is your bitcoin. For founding Seals it is at least 100000
sats. It never changes, whatever a later carrier holds. What the current carrier holds is
carrier.value. - founding
- True only for Firstlight Seals: the commit output confirmed inside the founding window and the reveal landed before the grace period ended. Nothing can flip this later.
- status
ALIVEmeans a carrier exists and depth is accumulating.RELICmeans the last carrier was spent with no eligible successor. Relic is terminal.- carrier
- The outpoint the artifact is riding right now, with the height it was created and its value. This is
the output to protect. It is
nullfor a relic. - depth
tip_height - carrier.height, computed when you ask. It is not stored per block and it is not cumulative across rings. A fresh carrier is depth zero even if the artifact is five years old.- tier, tier_name
- The highest tier whose threshold is not greater than the current depth, and its name. Raw through Elder. See Depth and tiers.
- next_tier, blocks_to_next_tier
- The next threshold up and how many blocks away it is. At Elder there is no next tier, and both fields
are
null. - rings
- Completed stretches, oldest first. Empty for an artifact that has never moved.
Verify it yourself
Nothing here requires trusting the indexer. Three checks with a block explorer or your own node:
- Carrier is unspent. Look up
carrier.txidand confirm outputcarrier.vouthas not been spent. If it has, the indexer is behind or wrong. - Depth arithmetic. Subtract
carrier.heightfrom the current block height. It should matchdepth, allowing for blocks found while you were reading. - Artifact id. Take
birth_txid, reverse the bytes, appendbirth_voutas four little endian bytes, prefix the tag, hash once with SHA-256. It should equalartifact_id.
node -e '
const { createHash } = require("crypto");
const txid = "1d29e5ba13cecf357a9218518914617f872eeaa83a33bf6be6fd78dfdd1ce9c6";
const vout = 1;
const wire = Buffer.from(txid, "hex").reverse();
const le = Buffer.alloc(4); le.writeUInt32LE(vout, 0);
const pre = Buffer.concat([Buffer.from("PTNA/artifact", "ascii"), wire, le]);
console.log(createHash("sha256").update(pre).digest("hex"));
'
# d3b8d3013c23dd3df76882034df80935ba55aa75772007f0b142b63adce5eff0
Reading the rings
Each ring is one completed stretch. Read them oldest to newest to see the artifact's life. The public page on how depth works shows a stretch closing into a ring if you want the picture before the field names.
| Field | Reads as |
|---|---|
start_height and end_height | The blocks the stretch ran between |
depth | How deep it got before it ended, in blocks |
carried_value | What the carrier held during that stretch |
successor_txid and successor_vout | The transaction that ended it and where the artifact went next |
relic | True on the final ring of an artifact that ended |
A deep ring in the past and a shallow current depth is a normal, honest picture. It says the holder went deep once, then moved. That is information, not a flaw.
What the page will not show you
- A holder name, a profile, or a history of owners. The indexer does not know any of that.
- A price or an estimated value.
- A rank or a rarity score invented by us.
- A countdown that implies scarcity. The only countdowns are real ones: blocks to the next tier, and blocks remaining in the window while it is open.
If the artifact record cannot be fetched, the page says so and shows nothing rather than showing a stale or invented number.
Share cards
GET /patina/artifacts/:id/card returns the payload behind a share image: id, tier, depth,
ring count, and the block height the numbers were taken at. The height matters. A card without the height
it was generated at is a card you cannot check.