# Transaction

`GET /api/tx/{txid}`

One transaction, confirmed or in the mempool, as the site's transaction page shows it: status (block, time, confirmations; or first seen and fee rate), fee, sizes, every input and output (address, value, the tracked rare sats each held), the flow of every tracked rare sat from the input that carried it to the output (or fee) it landed in, its sales and the Transfers and Extractions feeds' notable verdicts. A transaction confirmed before the index's moves retention shows only the tracked sats still in its outputs (`sat_flow: outputs`). Cacheable 15 s (a minute once 6 blocks deep).

#### Path parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `txid` | string | yes | The transaction id, 64 hex digits. |

#### Example request

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

data = requests.get("https://raresats.net/api/tx/d78f3f29369db39032219ae561732dda47b54b6f6d4d93d72a22c257c3946ac2").json()
```

#### Response `200`

| Field | Type | Description |
| --- | --- | --- |
| `txid` | string |  |
| `status` | string | `pending`: in the mempool; `replaced`, `conflicted`, `evicted`: it left the mempool unconfirmed and bitcoind no longer knows it (nothing else is known then). One of: `confirmed`, `pending`, `replaced`, `conflicted`, `evicted`, `unknown`. |
| `height` | integer \| null | The confirming block. |
| `hash` | string \| null |  |
| `time` | integer \| null | That block's time, unix seconds. |
| `confirmations` | integer \| null | As of the index's tip. |
| `tx_index` | integer \| null | Its position in the block. |
| `indexed` | boolean | The index holds its block. |
| `first_seen` | integer \| null | Pending: when bitcoind first saw it, unix seconds. |
| `removed` | object \| null | The index's record of its leaving the mempool (`status`, `replaced_by`, `at`). |
| `version` | integer \| null | Its version. |
| `locktime` | integer \| null | Its locktime. |
| `size` | integer \| null | Bytes. |
| `vsize` | integer \| null | Virtual bytes. |
| `weight` | integer \| null | Weight units. |
| `coinbase` | boolean |  |
| `input_value` | integer \| null | Sats; `null` for a coinbase or an input of unknown value. |
| `output_value` | integer \| null | Sats. |
| `fee` | integer \| null | Sats. |
| `fee_rate` | number \| null | sat/vB, one decimal. |
| `sat_flow` | string | `complete`: every tracked sat it moved is in `flow`; `outputs`: confirmed before the index's moves retention (`moves_from`), so only the tracked sats still in its unspent outputs are known; `unknown`: its block is not indexed yet. |
| `tracked` | boolean | It moved (or minted) tracked sats. |
| `marker` | boolean | It carries the marketplace's OP_RETURN marker. |
| `raresats` | object \| null | A raresats.net sale: `{kind, count}`, `kind` `purchase` or `offer`. |
| `kinds` | array of string | Its address-history kinds: `mined`, `sale`, `extraction`, `burn`, `consolidation`, `transfer`. |
| `inputs` | array of object |  |
| `inputs[].vin` | integer |  |
| `inputs[].outpoint` | string \| null | The spent output, `txid:vout`; `null` for a coinbase. |
| `inputs[].value` | integer \| null | The spent output's value in sats; `null` for a coinbase or when unknown. |
| `inputs[].address` | string \| null |  |
| `inputs[].script_pubkey` | string \| null | The spent output's script, hex. |
| `inputs[].sequence` | integer |  |
| `inputs[].created_height` | integer \| null | The block that created the spent output, when known. |
| `inputs[].sighash` | integer \| null | Its first signature's sighash flag (131 is SINGLE\|ANYONECANPAY, a listing's). |
| `inputs[].inscriptions` | integer | Inscription envelopes it reveals. |
| `inputs[].tracked` | boolean | It spent a UTXO holding tracked sats. |
| `inputs[].extracted` | boolean | That UTXO was extracted. |
| `inputs[].pieces` | array of object |  |
| `inputs[].pieces[].offset` | integer | Its offset in the output (or the fee). |
| `inputs[].pieces[].start` | integer | Its first sat. |
| `inputs[].pieces[].len` | integer | How many sats from `start` on. |
| `inputs[].pieces[].types` | array of string |  |
| `inputs[].pieces[].height` | integer \| null | The block that mined it. |
| `inputs[].pieces[].date` | string \| null | That block's UTC day, `YYYY-MM-DD` (its birthday page). |
| `inputs[].pieces[].luck` | integer \| null | That block's luck. |
| `inputs[].inscribed_sats` | array of integer |  |
| `outputs` | array of object |  |
| `outputs[].vout` | integer |  |
| `outputs[].value` | integer | Sats. |
| `outputs[].address` | string \| null |  |
| `outputs[].script_pubkey` | string |  |
| `outputs[].kind` | string | One of: `spendable`, `unspendable`. |
| `outputs[].tracked` | boolean |  |
| `outputs[].extracted` | boolean |  |
| `outputs[].pieces` | array of object |  |
| `outputs[].pieces[].offset` | integer | Its offset in the output (or the fee). |
| `outputs[].pieces[].start` | integer | Its first sat. |
| `outputs[].pieces[].len` | integer | How many sats from `start` on. |
| `outputs[].pieces[].types` | array of string |  |
| `outputs[].pieces[].height` | integer \| null | The block that mined it. |
| `outputs[].pieces[].date` | string \| null | That block's UTC day, `YYYY-MM-DD` (its birthday page). |
| `outputs[].pieces[].luck` | integer \| null | That block's luck. |
| `outputs[].inscribed_sats` | array of integer |  |
| `outputs[].marker` | boolean | The marketplace's OP_RETURN marker. |
| `outputs[].runestone` | boolean | An OP_RETURN OP_13 runestone. |
| `outputs[].spent_by_pending` | object | The pending transaction spending it (tracked outputs only). |
| `flow` | array of object |  |
| `flow[].source` | string | A spent UTXO (`vin`), newly mined sats (a coinbase's subsidy) or the block's fees (a coinbase). One of: `input`, `subsidy`, `fees`. |
| `flow[].vin` | integer \| null | The input it came from (`source: input`). |
| `flow[].input_offset` | integer \| null | Its offset in the spent output (or in the coinbase's input stream). |
| `flow[].dest` | string | An output (`vout`), the fee (paid to the miner) or `lost` (a coinbase that did not claim it). One of: `output`, `fee`, `lost`. |
| `flow[].vout` | integer \| null | The output it went to (`dest: output`). |
| `flow[].offset` | integer \| null | Its offset in that output (or in the fee). |
| `flow[].start` | integer |  |
| `flow[].len` | integer |  |
| `flow[].types` | array of string |  |
| `flow[].height` | integer \| null | The block that mined it. |
| `flow[].date` | string \| null | That block's UTC day. |
| `flow[].luck` | integer \| null | That block's luck. |
| `fee_pieces` | array of object |  |
| `fee_pieces[].offset` | integer | Its offset in the output (or the fee). |
| `fee_pieces[].start` | integer | Its first sat. |
| `fee_pieces[].len` | integer | How many sats from `start` on. |
| `fee_pieces[].types` | array of string |  |
| `fee_pieces[].height` | integer \| null | The block that mined it. |
| `fee_pieces[].date` | string \| null | That block's UTC day, `YYYY-MM-DD` (its birthday page). |
| `fee_pieces[].luck` | integer \| null | That block's luck. |
| `mined_pieces` | array of object |  |
| `mined_pieces[].offset` | integer | Its offset in the output (or the fee). |
| `mined_pieces[].start` | integer | Its first sat. |
| `mined_pieces[].len` | integer | How many sats from `start` on. |
| `mined_pieces[].types` | array of string |  |
| `mined_pieces[].height` | integer \| null | The block that mined it. |
| `mined_pieces[].date` | string \| null | That block's UTC day, `YYYY-MM-DD` (its birthday page). |
| `mined_pieces[].luck` | integer \| null | That block's luck. |
| `lost_pieces` | array of object |  |
| `lost_pieces[].offset` | integer | Its offset in the output (or the fee). |
| `lost_pieces[].start` | integer | Its first sat. |
| `lost_pieces[].len` | integer | How many sats from `start` on. |
| `lost_pieces[].types` | array of string |  |
| `lost_pieces[].height` | integer \| null | The block that mined it. |
| `lost_pieces[].date` | string \| null | That block's UTC day, `YYYY-MM-DD` (its birthday page). |
| `lost_pieces[].luck` | integer \| null | That block's luck. |
| `rows` | object | Tracked sats it moved, per row. |
| `sales` | array of object | Its sales, each with `pending`. |
| `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). |
| `transfer` | object \| null | Its notable transfer (the Transfers feed's event, with `reasons`), else `null`. |
| `extractions` | array of object | Its notable extractions (the Extractions feed's events). |
| `entries` | array of object | One address-history entry per party it moved tracked sats for. |
| `depends` | array of string | Pending parents whose tracked outputs it spends. |
| `moves_from` | integer \| null | The lowest block whose full sat flow the index keeps. |
| `as_of` | object \| null | `{height, time}` of the index. |
| `explorer` | string \| null | Block explorer base URL, for a secondary link. |

```json title="Response"
{
  "txid": "d78f3f29369db39032219ae561732dda47b54b6f6d4d93d72a22c257c3946ac2",
  "status": "confirmed",
  "height": 969717,
  "hash": "00000000000000000001ffc80f14c6109df0c60ae45957f0f22e736914cfb276",
  "time": 1791024538,
  "confirmations": 11,
  "tx_index": 1408,
  "indexed": true,
  "first_seen": null,
  "removed": null,
  "version": 2,
  "locktime": 969671,
  "size": 11675,
  "vsize": 11675,
  "weight": 46700,
  "coinbase": false,
  "input_value": 3649149319,
  "output_value": 3649128183,
  "fee": 21136,
  "fee_rate": 1.8,
  "sat_flow": "complete",
  "tracked": true,
  "marker": false,
  "raresats": null,
  "kinds": ["transfer"],
  "inputs": [
    {
      "vin": 0,
      "outpoint": "00d22e4e66b6e4de2e3f0fb3cb146df30c8d9b40845b103d5574741c1c7c778a:0",
      "value": 50000000,
      "address": "12DeZJEgWyd2ffYU6KekZdevGLqnkpnUU9",
      "script_pubkey": "76a9140d5c77dc25efd254a51e23ba422c4e6e8e2d25f588ac",
      "sequence": 4294967293,
      "created_height": 302976,
      "sighash": 1,
      "inscriptions": 0,
      "tracked": false,
      "extracted": false,
      "pieces": [],
      "inscribed_sats": []
    },
    {
      "vin": 2,
      "outpoint": "14833143ef7ebe658760f03f7533b50b9ebaa1ad87d85c597aaaa6ffe4b0b767:0",
      "value": 210587000,
      "address": "15vSCMDKkR3s7rDLNMnTrL7ivg8bqyRTSs",
      "script_pubkey": "76a91435fb94d60678093dce315bbd73dd4084582c93cb88ac",
      "sequence": 4294967293,
      "created_height": 709400,
      "sighash": 1,
      "inscriptions": 0,
      "tracked": true,
      "extracted": false,
      "pieces": [
        {
          "offset": 97510060,
          "start": 1282092500000000,
          "len": 1,
          "types": ["uncommon", "alpha"],
          "height": 302837,
          "date": "2014-05-27",
          "luck": 1
        }
      ],
      "inscribed_sats": []
    }
  ],
  "outputs": [
    {
      "vout": 0,
      "value": 3649128183,
      "address": "3EBzpPwBe8TBeuVzTGmKuJADQUniLKHSwy",
      "script_pubkey": "a914891ca628ea69a42f89db374f34c7ff4eff6fce9487",
      "kind": "spendable",
      "tracked": true,
      "extracted": false,
      "pieces": [
        {
          "offset": 159380060,
          "start": 1282092500000000,
          "len": 1,
          "types": ["uncommon", "alpha"],
          "height": 302837,
          "date": "2014-05-27",
          "luck": 1
        }
      ],
      "inscribed_sats": [],
      "marker": false,
      "runestone": false
    }
  ],
  "flow": [
    {
      "source": "input",
      "vin": 2,
      "input_offset": 97510060,
      "dest": "output",
      "vout": 0,
      "offset": 159380060,
      "start": 1282092500000000,
      "len": 1,
      "types": ["uncommon", "alpha"],
      "height": 302837,
      "date": "2014-05-27",
      "luck": 1
    }
  ],
  "fee_pieces": [],
  "mined_pieces": [],
  "lost_pieces": [],
  "rows": {"uncommon": 8, "black": 3, "alpha_uncommon": 8, "black_omega": 3},
  "sales": [],
  "transfer": {
    "id": "transfer:969717:d78f3f29369db39032219ae561732dda47b54b6f6d4d93d72a22c257c3946ac2",
    "kind": "transfer",
    "height": 969717,
    "time": 1791024538,
    "block_hash": "00000000000000000001ffc80f14c6109df0c60ae45957f0f22e736914cfb276",
    "txid": "d78f3f29369db39032219ae561732dda47b54b6f6d4d93d72a22c257c3946ac2",
    "tx_index": 1408,
    "rows": {"uncommon": 8, "black": 3, "alpha_uncommon": 8, "black_omega": 3},
    "moved": [
      {"row": "uncommon", "label": "Uncommon", "count": 8},
      {"row": "black", "label": "Black", "count": 3},
      {"row": "alpha_uncommon", "label": "Alpha uncommon", "count": 8},
      {"row": "black_omega", "label": "Black omega", "count": 3}
    ],
    "from": [
      {
        "outpoint": "14833143ef7ebe658760f03f7533b50b9ebaa1ad87d85c597aaaa6ffe4b0b767:0",
        "address": "15vSCMDKkR3s7rDLNMnTrL7ivg8bqyRTSs",
        "label": "15vSCMDKkR3s7rDLNMnTrL7ivg8bqyRTSs",
        "value": 210587000,
        "sats": 1,
        "created_height": 709400,
        "created_time": 1636736136,
        "extracted": false
      }
    ],
    "from_count": 8,
    "to": [
      {
        "vout": 0,
        "address": "3EBzpPwBe8TBeuVzTGmKuJADQUniLKHSwy",
        "label": "3EBzpPwBe8TBeuVzTGmKuJADQUniLKHSwy",
        "value": 3649128183,
        "sats": 11,
        "kind": "spendable",
        "extracted": false
      }
    ],
    "to_count": 1,
    "fee_sats": 0,
    "dormancy": {
      "seconds": 301043862,
      "outpoint": "f836de28ecaed8eea81acee25931c47e8dc136d2969d21f2ec81ac32375cdd04:1",
      "created_height": 458063,
      "created_time": 1489980676
    },
    "sats": [{"sat": 472424999999999, "height": 94484}],
    "sats_total": 11,
    "reasons": [
      {
        "code": "dormant",
        "category": "dormant",
        "seconds": 301043862,
        "label": "Dormant 9.5 years"
      }
    ]
  },
  "extractions": [],
  "entries": [
    {
      "txid": "d78f3f29369db39032219ae561732dda47b54b6f6d4d93d72a22c257c3946ac2",
      "height": 969717,
      "time": 1791024538,
      "tx_index": 1408,
      "direction": "out",
      "kind": "transfer",
      "rows_in": {},
      "rows_out": {"uncommon": 1, "alpha_uncommon": 1},
      "sats_in": 0,
      "sats_out": 1,
      "value_in": 0,
      "value_out": 61700000,
      "outputs_in": 0,
      "inputs_out": 1,
      "extracted_in": false,
      "extracted_out": false,
      "extracted_sats": 0,
      "isolated": 0,
      "burned": 0,
      "roles": [],
      "counterparty": "3EBzpPwBe8TBeuVzTGmKuJADQUniLKHSwy",
      "counterparty_script_pubkey": "a914891ca628ea69a42f89db374f34c7ff4eff6fce9487",
      "counterparties": 1,
      "lead_sat": {"sat": 1739532500000000, "types": ["uncommon", "alpha"]},
      "sales": [],
      "address": "1Hjv1dXPWvcZ2E7un5wv5tkCJ2oa9r4rj",
      "script_pubkey": "76a914032a7a69b345c6770a95be057d54af7c384c34b288ac"
    }
  ],
  "depends": [],
  "moves_from": 965696,
  "as_of": {"height": 969727, "time": 1791028507},
  "explorer": "https://mempool.space"
}
```

#### Errors

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

| Status | When |
| --- | --- |
| 400 | Not a transaction id. |
| 404 | No such transaction: neither the blockchain nor the mempool holds it. |
| 503 | The index is unavailable, busy, or does not serve transactions yet. |

- The site's own view of a transaction (the page at `/tx/{txid}`): what a block explorer shows, plus what the transaction did to the rare sats raresats.net tracks.
- `flow` lists every run of tracked sats from the input that carried it (`vin`, its offset in the spent output) to the output it landed in (`vout`, its offset there), or the fee, under ordinal theory's first-in-first-out rule. Each run has its mint `date` (a [birthday page](https://raresats.net/docs/get-birthday.md)) and `luck` (its block's: [Sat luck](https://raresats.net/docs/guide-filters.md#sat-luck)). A coinbase's runs come from the block `subsidy` or the block's `fees`.
- `inputs` and `outputs` hold every input and output, each with the tracked sats it held (`pieces`), `extracted`, its inscribed tracked sats; an input's revealed inscriptions and its signature's sighash (131, SINGLE|ANYONECANPAY, is a marketplace listing's); an output's OP_RETURN `marker` (a raresats.net sale) or `runestone`.
- `sat_flow` says how much is known: `complete`; `outputs` for a transaction confirmed before the index's moves retention (`moves_from`, about four weeks), when only the tracked sats still in its unspent outputs are known; `unknown` while its block is being indexed.
- `sales` are its sales (marketplace, price, unit price, seller and buyer); `raresats` is set for a raresats.net purchase or accepted offer. `transfer` and `extractions` are the Transfers and Extractions feeds' notable verdicts, with their `reasons`.
- A pending transaction has `status: pending`, `first_seen` and `fee_rate`; one that left the mempool unconfirmed, and that bitcoind no longer knows, has `status` `replaced`, `conflicted` or `evicted` and `removed` (with `replaced_by`), and nothing else.
- `GET /api/sales/{seq}/tx` redirects to `/tx/{txid}`; with `accept: application/json` it answers `{txid, href}`.
