# UTXO

`GET /api/utxo/{outpoint}`

One output and every rare sat in it: the sats raresats.net tracks, each with its offset in the output; the rare and exotic sats it does not track, found in the output's sat ranges; inscriptions and runes; for a spent output, where it was spent and where its tracked sats are now; its sales and the marketplace's live listing of it. Cacheable 15 s. A spend still in the mempool is one `spent_in` with `pending: true` (the index's word preferred to bitcoind's); an output a pending transaction makes has `pending`.

#### Path parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `outpoint` | string | yes | The output as `txid:vout`. |

#### Example request

```bash title="cURL"
curl 'https://raresats.net/api/utxo/f1c500f81c331d31415902755278e2a599311d8121ac9582bc63ad981efa48fb:1'
```
```js title="JavaScript"
const response = await fetch('https://raresats.net/api/utxo/f1c500f81c331d31415902755278e2a599311d8121ac9582bc63ad981efa48fb:1');
const data = await response.json();
```
```python title="Python"
import requests

data = requests.get("https://raresats.net/api/utxo/f1c500f81c331d31415902755278e2a599311d8121ac9582bc63ad981efa48fb:1").json()
```

#### Response `200`

| Field | Type | Description |
| --- | --- | --- |
| `outpoint` | string | `txid:vout`. |
| `txid` | string |  |
| `vout` | integer |  |
| `status` | string | `unknown` when this server has no way to tell (no bitcoind or ord index configured, or both unreachable). One of: `unspent`, `spent`, `unknown`. |
| `spent` | boolean \| null | Whether it is spent (a spend in the mempool counts), `null` when unknown. |
| `value` | integer \| null | Its value in sats. |
| `address` | string \| null | Its address (`null` for a script without one). |
| `script` | string \| null | Its scriptPubKey, hex. |
| `kind` | string \| null | `spendable` or `unspendable`. |
| `created_height` | integer \| null | The block that created it. |
| `created_time` | integer \| null | That block's time, unix seconds. |
| `confirmations` | integer \| null | Confirmations of the transaction that created it. |
| `extracted` | boolean \| null | The index's extracted verdict (rare sats isolated in a small UTXO), when it tracks the output. |
| `as_of` | object \| null | `{height, time}` of the index. |
| `chain` | string \| null | The chain (`mainnet`). |
| `explorer` | string \| null | Block explorer base URL. |
| `sources` | object | `{fork, oracle, bitcoind, history}`, each `ok`, `off` (not configured) or `unavailable`: what this answer could ask. |
| `contents` | string | `complete`: every sat range was typed; `tracked`: the tracked sats only; `recovered`: a spent output's tracked sats, from the moves the index keeps; `unknown`: nothing could be recovered. |
| `tracked` | object \| null |  |
| `other` | object \| null | `null` without the ord index, or for a spent output. |
| `inscriptions` | array of object \| null | `{id, sat, offset}`, `sat` and `offset` where known (`id` null when only the tracked sat is known to be inscribed). |
| `inscriptions_total` | integer |  |
| `runes` | array of object \| null | `{name, amount, divisibility, symbol}`; `amount` a decimal string. |
| `spent_in` | object \| null | `{txid, height, time, pending, source}`: the spending transaction (`pending` while in the mempool, then with `first_seen`, `fee_rate`, `vin`, `sale`); `source` says how it was found: `fork_mempool` (the index's mempool overlay, preferred), `mempool` (bitcoind's), `sale`, `moves` or `history`. One spender, whichever said so. |
| `now` | array of object \| null | A spent output: where its tracked sats are now, up to 12: `{sat, len, types, kind, outpoint, offset, address, created_height, created_time}`. |
| `now_total` | integer |  |
| `sales` | array of object | Sales out of the output (`direction: sold`) and into it (`bought`), newest first. |
| `sales[].seq` | integer \| null | The sales store's sequence number, else `null`. |
| `sales[].txid` | string | The sale transaction. |
| `sales[].vin` | integer \| null | The seller input. |
| `sales[].height` | integer \| null | Block height (null while pending). |
| `sales[].time` | integer | Unix seconds. |
| `sales[].marketplace` | string | Marketplace id. |
| `sales[].price` | integer \| null | Price in sats. |
| `sales[].row` | string \| null | The sale's own row. |
| `sales[].unit_price` | number \| null | Unit price per sat of that row. |
| `sales[].count` | integer \| null | Sats of that row sold. |
| `sales[].sats_sold` | integer \| null | Tracked sats the sale sold. |
| `sales[].seller` | object \| null | `{address, outpoint}`. |
| `sales[].buyer` | object \| null | `{address, outpoint}`. |
| `sales[].inscribed` | boolean | An inscription was on a sold sat. |
| `sales[].outlier` | boolean \| null | A statistical outlier (`null` when unknown). |
| `sales[].secondary` | map of integer | A sale's secondary rows: the market rows of the other sats it sold (not its own row, a row it is a sub-category of, or a label row), each with its sats, primary-first: `{"black_omega": 1}` for a black omega sold with an alpha uncommon; `{}` for none. A sale never counts in its secondary rows' markets (the primary-sat rule, in Concepts). |
| `sales[].as` | array of string | The sat's rows (`rows`, in its order) the sale sold sats of: why a sale another row led is listed on this sat (a Block 9 chunk on its palindrome's page names `block9`, `block9_palindrome`, `nakamoto_palindrome`). |
| `sales[].pending` | boolean | Still in the mempool: listed first, with `first_seen` and `fee_rate`; `time` is `first_seen`. |
| `sales[].first_seen` | integer \| null | When the transaction was first seen in the mempool (bitcoind's entry time), unix seconds. |
| `sales[].fee_rate` | number \| null | Its fee rate, sat/vB (one decimal). |
| `notes` | array of string | What could not be shown, and why. |
| `listing` | [Listing](https://raresats.net/docs/listing-object.md) \| null | The marketplace's live listing of the output, else `null`. |
| `pending` | object \| null | An output a transaction still in the mempool makes: `{txid, first_seen, fee_rate}`. Absent otherwise. |

#### Errors

`{error}` (a message, no code):

| Status | When |
| --- | --- |
| 400 | Not an outpoint. |
| 404 | No such output: its transaction is unknown, or has no output of that index. |
| 503 | The index is unavailable or busy. |

- `tracked` lists the sats raresats.net tracks, each sat (or run of a whole range such as block 9) with its `offset` in the output, so a wallet can split them out, and its `luck` (its block's: [Sat luck](https://raresats.net/docs/guide-filters.md#sat-luck)).
- `other` lists the rare and exotic sats raresats.net does not track (vintage, pizza, Nakamoto, block 78/286/666, jpeg, hitman, Silk Road, plain alphas and omegas, palindromes, …), grouped by exact type combination with counts and a few sample sats. It needs the ord index; a huge output is scanned only up to a budget (`truncated`).
- A spent output has `spent_in` (the spending transaction, found in the mempool, a sale, the block moves the index keeps or the holder's history) and `now`: where each of its tracked sats is today. What a spent output held is recovered from the block moves the index keeps (the last 4,032 blocks); older ones answer `contents: "unknown"`, and `notes` says so.
- `sources` and `notes` say what the answer could not ask: a server without bitcoind or the ord index shows only the tracked sats, and may answer `status: "unknown"` for an output it tracks nothing in.
- `sales` are the sales out of and into the output, each with its own `row` and its `secondary` rows (the other sats sold with it).
- `listing` is the marketplace's live listing of the output (a [Listing](https://raresats.net/docs/listing-object.md)), or `null`.
- A spend still in the mempool is one `spent_in` with `pending: true`: the index's mempool overlay names it (`source: "fork_mempool"`, with `first_seen`, `fee_rate`, `vin` and `sale`), else bitcoind's mempool (`source: "mempool"`). An output a pending transaction makes has `pending: {txid, first_seen, fee_rate}`.
