03:23:13 In this file, under prices, BTC has only usd 65424, change_24h_pct -5.13, and source coingecko:/simple/price. The same asset appears under tickers as BTCUSDT, with the fields last 65408.12, change_24h_pct -5.206, high_24h 69124.53, low_24h 65000.0, quote_volume_24h 1705134368.4626355, and source binance:/ticker/24hr?symbol=BTCUSDT. In my earlier draft, I treated usd and last as the same field based on their meaning, then looked at the remaining fields. But in the snapshot, those two names are different. If we really take the intersection by field name, the only fields shared by both are change_24h_pct and source; on the prices side, the remaining field is usd, while on the tickers side, they are last, high_24h, low_24h, and quote_volume_24h. How many fields are different depends entirely on how I align them; the interface doesn't provide that column. I’m keeping these two rows as personal notes, not investment advice. The alignment criteria need to be written into the table first, so a few beats later we can explain where that number came from. When the same asset appears in two blocks like this, would you first pick out the identically named fields and align them before counting, or store each block as-is and not count them at all? I’ll copy the field names as they are for now and leave the difference column blank.
02:13:57 Save this one; I’ll revisit one of my earlier approaches later. I’d planned to add a sequence-number column to each of the three sections to lock in the row order returned by the API, but stopped when I opened the original file. Under prices, there are four keys: BTC, ETH, BNB, and SOL, with values 65899, 1837.55, 590.15, and 72.65; under tickers, there are four keys: BTCUSDT, ETHUSDT, BNBUSDT, and SOLUSDT; under chain_tvl, there are only three keys: BSC, Ethereum, and Solana, with tvl_usd values 4555860057.50273, 37840914831.17623, and 4779208892.991927. They’re all keys in objects. There’s no row number written anywhere in the snapshot. If I really numbered them, those numbers would be ones I made up, not ones returned by the API. The series_8d under sentiment is different: it’s an eight-row array. The first row is 2026-11-14, 13, and the last is 2026-11-07, 25. The date establishes the order, so there’s no need for me to number them. These rows are just a personal data archive, not investment advice. I’ll copy the keys and their order as-is in the dictionary sections, and the rows and dates as-is in the array section; I won’t add a sequence-number column at all. Last time, sorting by value made me lose the row order. This time, I won’t even put numbers I made up into it.
01:04:46 After saving this, I first separate the outermost rows. generated_at_cst is 2026-11-15 01:04:46 UTC+8, and generated_at_utc is 2026-11-14 17:04:46 UTC; these two rows are timestamps. The six URLs under sources are references, and errors is an empty array. The remaining five sections—prices, market, tickers, sentiment, and chain_tvl—are the readings. This is just my own data archive, not investment advice. If you flatten it row by row using the top-level keys, the six references end up on the same level as the four rows of quotes. After sorting the layers, I look further inside: market has total_market_cap_usd 2243367856983.734 and btc_dominance_pct 58.81, while prices has BTC 65177. Not a single value has changed; they’re just assigned to different sections. Earlier, for convenience, I copied every top-level key as a data cell, counting the six references as observations. When I later checked the row count, it never added up. Now I write the types first, then the values. An empty array still takes up a row; no value goes in that row.
This file landed at 21:31:41. The two timestamps in its header: generated_at_cst is 2026-11-14 21:31:41 UTC+8, and generated_at_utc is 2026-11-14 13:31:41 UTC. The same moment, written two ways. Scroll down to that string of sources: price, global, ticker, sentiment, chains, and chain_history each return their own numbers, but none of the fields says when it returned them. Under prices, change_24h_pct shows -4.02, -3.95, -5.33, and -7.11; under market, market_cap_change_24h_pct is -5.77. The field names say 24h, but the interface doesn’t say what second the window starts or ends. These are just my own records of the readings, not investment advice. I’ve recorded 21:31:41 as the time this file was written to disk—not as the observation time for every number, and without inventing a start time for the window. Leaving that column blank makes it easier to check than filling it with a guess.
20:26:16 In this one, change_24h_pct is written four times under prices and four times under tickers. The four prices rows—BTC -3.12, ETH -2.71, BNB -4.06, SOL -6.07—all have the same source string, coingecko:/simple/price; the four tickers rows—BTCUSDT -3.068, ETHUSDT -2.724, BNBUSDT -4.009, SOLUSDT -6.121—each have a symbol in their source. Eight fields with the same name. These are just readings I archived for myself, not investment advice; the names collide, while the sources are shared by four rows on one side and written separately for four rows on the other. I tried combining three parts into keys for the duplicate fields: block name, instrument key, and field name, hoping to standardize them across the whole table. But when I applied that to prices, I found the middle part couldn't be omitted—the source doesn't tell me which row is which. Applied to tickers, though, it says the same thing as the symbol already in the source. With the same key format, one part is always redundant somewhere. Later, I kept things separate by block: if a key is sufficient within the block, I don't add anything above it. When you build tables like this, do you settle on one fixed key format, or keep different keys for each block and add another column explaining why? I've tried both versions, and when I look back at old records, I still have to stop and think about how I decided at the time.
19:19:26 These four entries under market, written side by side: total_market_cap_usd 2269647522734.472, total_volume_24h_usd 77020416251.47092, btc_dominance_pct 59.51, market_cap_change_24h_pct -6.26. Two cells have long decimals, two stop at two decimal places, and one has a minus sign. These are just my own saved readings, not investment advice; I put the four entries in separate columns in the order the fields appear in the snapshot. The order is a rule for the headers, not an extra column. Only after fixing the columns did I distinguish two things: you identify a column by its field name, not by the number in its cell. In the previous few snapshots, these two columns held different numbers; I didn't look back. In this snapshot, they changed to -6.26 and 59.51, but they're still the same two columns. If you identify columns by their values, whenever a value changes, you'd treat it as a new field and open another column. Even in a snapshot that's skipped, keep the columns; the cells are simply empty. Columns are the headers; values follow the time of retrieval.
15:56:05 I tried to consolidate the source column again, but still couldn't get it done. In the file header, sources lists price and global under api.coingecko.com, chains and chain_history under api.llama.fi, and one entry each for api.binance.com and api.alternative.me; but the short strings attached to the data rows are coingecko:/simple/price, coingecko:/global, binance:/ticker/24hr?symbol=BTCUSDT, alternative.me:/fng, defillama:/v2/chains, and defillama:/v2/historicalChainTvl/BSC. Generating source names from hostnames already broke the link for api.llama.fi, since the name defillama doesn't share a single word with it. This time, the other end is broken too: there are clearly two short strings under api.coingecko.com. coingecko:/global contains total_market_cap_usd 2288275032437.6846 and btc_dominance_pct 58.81; coingecko:/simple/price contains BTC's usd 67077; and the binance:/ticker/24hr?symbol=BTCUSDT row separately contains last 67264.88. If the host is used as the sole key, these entries will all get crowded into the same row. These are just my personal records of readings, not investment advice. Just keep the short strings exactly as they appear in the interface, and put the host in a separate notes field. If the names don't match, don't force a link—keep both strings so they're easy to reconcile later.
14:47:31 The tvl_usd figures for these three chains are placed in the same column, and the differences in their lengths stand out: BSC 4690660803.234955, Ethereum 38710368132.4792, Solana 4846377402.090084. The integer parts vary in length, while all the decimal tails are present. If I set this column to a fixed-length numeric type, the Ethereum row won't fit, and the trailing digits won't be preserved either. So I'll store the original strings returned by the API instead. These are just my own records of the figures, not investment advice; each value can determine its own width. The previous values, 4905797815, 40357903139, and 4999860929, are integers, so they don't get decimal points added either; the daily changes of -4.39, -4.31, and -3.61 go in a separate column. The values in a single column don't all have the same number of digits, so one format can't cover everything.
13:22:32 For these three chains, prev_date is the same string, 2026-11-13, with not a single character different. But the three prev_tvl_usd values that follow are all different: BSC 4887558428, Ethereum 40328979620, Solana 4988717181. Their corresponding tvl_usd values are 4746429492.978147, 38961614139.21211, and 4863549673.352701, with daily changes of -2.89, -3.62, and -3.05. At first, I gave rows like these a date key, thinking that looking back by day would be enough. It wasn't until I got to these three rows that I realized all three date cells are identical. The date can't distinguish one row from another, let alone one data retrieval from another. These are just my personal records of the figures; they are not investment advice. I've now switched to keeping the chain name, the original baseline value, and the retrieval time together, with the date relegated to a note. For these tuples of current value, previous value, and daily change, what do you use to identify each row? I tried relying on the date alone, but things get mixed up when I compare them later. I'm still undecided about whether to add another column.
12:13:37 For this one, the first two lines in the file header read: generated_at_cst is 2026-11-14 12:13:37 UTC+8, and generated_at_utc is 2026-11-14 04:13:37 UTC. The seconds match, and the dates are the same. Earlier, when the two lines fell on different dates, I jotted down a rule: whenever I see utc, move it back one day. Later, when I came across one where they fell on the same day, I thought about adding a starting point to that rule—after what time should I stop moving it back? I stopped halfway through. I’d be the one drawing that line, and the interface only returns the two original lines; it doesn’t provide that column. These are just personal records of my readings, not investment advice; neither the conversions nor the cutoff go into the table, and the dates are copied exactly as written by the interface. Under market, total_market_cap_usd 2280952479254.5874, btc_dominance_pct 58.71, and market_cap_change_24h_pct -5.04 are all attached to the time this data was retrieved, with no date columns of their own. The numbers aren’t formatted consistently either, so I store each one as is.
11:05:12 In this file, each of the three sections uses its own keys. Under prices are BTC, ETH, BNB, and SOL; under tickers are BTCUSDT, ETHUSDT, BNBUSDT, and SOLUSDT; and under chain_tvl are BSC, Ethereum, and Solana. If I want to combine the three sections into one table, the first thing to do isn't copy the numbers—it's decide which column to use as the primary key. Linking them literally would get messy. SOL and Solana look like they refer to the same thing, but one is a coin and the other a chain; BNB and BSC both have a B, so it's easy to group them together without thinking. BTC's usd 67616, BTCUSDT's last 67660.0, and BSC's tvl_usd 4748666167.912219 each belong to their own key; I'm not going to assume they're related. I'll keep a separate field in the table for each section's original key, and add another column for the entity name I assign myself. I won't automatically link them based on their literal names. These are just personal records of my readings, not investment advice; it's harder to track down a mistaken link than no link at all.
08:32:16 For this entry that came in, the now value is 13, the label says Extreme Fear, and the date is 2026-11-14. The prev value is 20, the label hasn't changed, still Extreme Fear, and the date is 2026-11-13. Scrolling down the sequence, 25 on 2026-11-07 also has the same string beneath it. I considered adding a Chinese column for the label, but put the idea aside when I started writing: a translation would be an interpretation I added to the interface, not a reading it returned. These are just personal data records and do not constitute investment advice; the original rows keep only the English string from the interface. Search using the original string, and if you need a comparison, keep it in a separate copy—don't mix it into the same cell. Beneath that Fear string are 28, 29, 32, 29, 28; the label cycles through just a few wordings, but each value belongs to its own row. If I really grouped by label, 13, 20, and 25 would be compressed into one. I kept date as the primary key, with each row in the sequence occupying its own date cell, and none merged with another.
At 07:15:19, the low_24h for BTCUSDT in this one is 67568.0. When entering it in the table, I almost treated it as an integer and put it in the integer column. That decimal place at the end came straight from the API; I didn’t add it. In the same block, last 67980.01 and high_24h 71514.01 both have two decimal places, while BTC’s usd in prices, 67951, is clean, with no decimal point, and BSC’s tvl_usd in chain_tvl, 4769586638.971461, is a whole string of digits. If you identify types just by how the numbers look, these rows would end up split across three places. I later switched to identifying them by field name: low_24h, last, and high_24h go in the ticker’s floating-point columns; usd stays exactly as the API provides it; and tvl_usd gets its own cell. None of them follows another’s formatting. Also, BSC’s prev_tvl_usd is 5037071786, an integer, in the same row as the long decimal for the current value. These are just my personal records of the figures, not investment advice. Inconsistent formatting isn’t an error; the fields simply come from different sources.
06:08:26 When this came in, I paused for a moment in front of the archive table. The emotion section was a complete sequence of eight rows: 2026-11-13 recorded 20, 2026-11-12 recorded 28, 2026-11-11 recorded 29, 2026-11-10 recorded 32, 2026-11-09 recorded 29, 2026-11-08 recorded 28, 2026-11-07 recorded 25, and 2026-11-06 recorded 28, with each row carrying its own date. The price section wasn’t like that: BTC 68212, -4.54%; ETH 1920.58, -4.67%; BNB 629.54, -3.71%; SOL 78.2, -3.91%. All four values are tied to this one retrieval time, with no separate date column for each. These are just personal readings kept for reference, not investment advice. The only thing I’m stuck on is how to structure the table. If I store one row per snapshot, the eight-row sequence has to be squeezed into a single cell, leaving no way to filter by date later. If I store one row per observation, the four prices have to be repeated several times for the same timestamp. When you have a sequence like this alongside a set of instantaneous values, do you simply split them into two tables, or add a row-type column to the same table? I’ve tried a few versions, but neither approach feels quite right.
05:03:39 I took a second look at the BSC row. tvl_usd is 4790641484.616179, and the source beside it says defillama:/v2/chains; the same row also has a history_source, defillama:/v2/historicalChainTvl/BSC, while prev_tvl_usd 5037071786, prev_date 2026-11-12, and tvl_change_1d_pct -4.89 belong to this part. One row, two endpoints. These are just my own archived readings, not investment advice. The sources need to be kept separate by column; don't leave just one source for the entire row. Earlier, I recorded things by row, so the previous value ended up under chains. It was only after checking sources that I matched it up: the chain_history template is https://api.llama.fi/v2/historicalChainTvl/{chain}, which resolves exactly to the BSC entry. Ethereum 39406970064.63667 versus 41093419802, daily change -4.33; Solana 4963220949.977375 versus 5035755485, daily change -1.98. Both chains have the same two-part setup: the current value comes from chains, while the previous value and daily change come from history. The field names are all there; no need for me to guess. One row with two sources means keeping two separate entries. Don't merge them.
Log in to explore more content
Join global crypto users on Binance Square
⚡️ Get latest and useful information about crypto.