{"repo":"Leo4815162342/dukascopy-node","free":true,"listed":false,"github":"https://github.com/Leo4815162342/dukascopy-node","clone":"git clone https://github.com/Leo4815162342/dukascopy-node.git","description":"✨ Download historical and real-time price tick data for Crypto, Stocks, ETFs, CFDs, Forex via CLI and Node.js ✨","language":"TypeScript","stars":862,"topics":["backtesting","bitcoin","candlestick-chart","cli","crypto","dukascopy","etf","exchange-rates","forex","forex-data","historical-data","market-data","metatrader","nodejs","ohlc","stock","stock-data","stock-prices","tick-data","trading"],"license":"MIT","category":"data_provider","readme_excerpt":"<h1>dukascopy-node</h1>\n\n<p align=\"center\"><img width=\"150\" src=\"https://github.com/Leo4815162342/dukascopy-node/blob/master/dukascopy-node.png?raw=true\" alt=\"dukascopy-node\"></p>\n\n<p align=\"center\">\n    <b>✨ Download free historical and real-time market price tick data ✨</b> <br>Stocks • Crypto • Commodities • Bonds • Currencies • CFDs • ETFs  <br> via Node.js and CLI\n</p>\n\n<p align=\"center\">\n    <a href=\"https://github.com/Leo4815162342/dukascopy-node/actions/workflows/cicd.yaml\"><img src=\"https://github.com/Leo4815162342/dukascopy-node/actions/workflows/cicd.yaml/badge.svg\" alt=\"Build Status of dukascopy-node npm package\"></a>\n    <a href=\"https://www.npmjs.com/package/dukascopy-node\"><img src=\"https://badgen.net/npm/v/dukascopy-node?cache=600\" alt=\"dukascopy-node latest version\"></a>\n    <a href=\"https://www.npmjs.com/package/dukascopy-node\"><img src=\"https://badgen.net/npm/dt/dukascopy-node?cache=600\" alt=\"Total number of downloads of dukascopy-node npm package\"></a>\n    <a href=\"https://github.com/Leo4815162342/dukascopy-node\"><img src=\"https://badgen.net/github/stars/Leo4815162342/dukascopy-node?cache=600\" alt=\"dukascopy-node github stars\"></a>\n</p>\n<p align=\"center\"><a href=\"https://www.dukascopy-node.app/\">📚 Documentation</a></p>\n<p align=\"center\"><a href=\"https://context7.com/leo4815162342/dukascopy-node\"><img width=\"12\" src=\"https://context7.com/favicon.ico\" alt=\"dukascopy-node via pnpm\"/> MCP Docs (via Context7 MCP)</a></p>\n\n\n\n***\n\n## 🚀 Installation\n\n<table>\n    <thead>\n        <tr>\n            <th><img width=\"16\" src=\"https://www.dukascopy-node.app/npm.png\" alt=\"dukascopy-node via npm\"> npm</th>\n            <th><img width=\"16\" src=\"https://www.dukascopy-node.app/yarn.png\" alt=\"dukascopy-node via yarn\"> yarn</th>\n            <th><img width=\"16\" src=\"https://www.dukascopy-node.app/pnpm.png\" alt=\"dukascopy-node via pnpm\"> pnpm</th>\n        </tr>\n    </thead>\n    <tbody>\n        <tr>\n            <td><pre><code>npm install dukascopy-node --save</code></pre></td>\n            <td><pre><code>yarn add dukascopy-node</code></pre></td>\n            <td><pre><code>pnpm add dukascopy-node</code></pre></td>\n        </tr>\n    </tbody>\n</table>\n\n> [!IMPORTANT]  \n> Node.js 18 or higher is required.\n\n## ✨ Download Historical Price Data via CLI\n\n```bash\nnpx dukascopy-node -i btcusd -from 2019-01-13 -to 2019-01-14 -t tick -f csv\n```\n\n![dukascopy-node-1080p](https://user-images.githubusercontent.com/12486774/210557823-63ba12f1-ab77-42ae-ad27-6c199b0c1fdb.gif)\n\n\n[🛠️ View full CLI specification](https://www.dukascopy-node.app/config/cli)\n\n---\n\n## ✨ Download Historical Price Data via Node.js\n\n```javascript\nconst { getHistoricalRates } = require('dukascopy-node');\n\n(async () => {\n  try {\n    const data = await getHistoricalRates({\n      instrument: 'btcusd',\n      dates: {\n        from: new Date('2019-01-13'),\n        to: new Date('2019-01-14')\n      },\n      timeframe: 'tick',\n      format: 'json'\n    });\n\n    console.log(data);\n  } catch (error) {\n    console.log('error', error);\n  }\n})();\n```\n\n[🛠️ View full Node.js specification](https://www.dukascopy-node.app/config/node)\n\n## ✨ Download Real-Time Price Data via Node.js \n\n```javascript\nconst { getRealTimeRates } = require('dukascopy-node');\n\n(async () => {\n  try {\n    const data = await getRealTimeRates({\n      instrument: 'eurusd',\n      timeframe: 'tick',\n      format: 'json'\n    });\n\n    console.log(data);\n  } catch (error) {\n    console.log('error', error);\n  }\n})();\n```\n\n[ℹ️ More Information](https://www.dukascopy-node.app/downloading-real-time-data)\n\n---\n\n## 📖 Quick start\n* [Basic usage of `dukascopy-node`](https://www.dukascopy-node.app/output-formats)\n* [Downloading tick data](https://www.dukascopy-node.app/downloading-tick-data)\n* [Date formatting and converting timezones](https://www.dukascopy-node.app/custom-date-format-and-timezone-conversion)\n* [Dealing with empty data and errors](https://www.dukascopy-node.app/errors-and-empty-data)\n* [Downloading data with cache](https://www.dukascopy-node.app/using-cache)\n* [Downloading data with custom batching](https://www.dukascopy-node.app/custom-batching)\n* [Usage with typescript](https://www.dukascopy-node.app/with-typescript)\n* [Debugging](https://www.dukascopy-node.app/debugging)\n\n---\n\n📁 Instruments\n\n* [Bonds 📊 (3)](#bnd_cfd)\n* [ETFs 📈 (17)](#etf_cfd)\n* [Crypto assets ₿ (29)](#vccy)\n* [Agricultural commodities ☕ (6)](#cmd_agricultural)\n* [Energy commodities ⚡ (4)](#cmd_energy)\n* [Metals commodities ⚙️ (3)](#cmd_metals)\n* [Germany ETFs 🇩🇪📈 (1)](#etf_cfd_de)\n* [France ETFs 🇫🇷📈 (3)](#etf_cfd_fr)\n* [Hong Kong ETFs 🇭🇰📈 (4)](#etf_cfd_hk)\n* [United States ETFs 🇺🇸📈 (60)](#etf_cfd_us)\n* [Forex currencies 💱 (290)](#fx_crosses)\n* [Forex major currencies 💶 (7)](#fx_majors)\n* [Forex metals 🥇 (51)](#fx_metals)\n* [Africa 🌍 (1)](#idx_africa)\n* [America 🌎 (6)](#idx_america)\n* [Asia 🌏 (5)](#idx_asia)\n* [Europe 🇪🇺 (9)](#idx_europe)\n* [Austria 🇦🇹 (3)](#austria)\n* [Belgium 🇧🇪 (7)](#belgium)\n* [Denmark 🇩🇰 (8)](#denmark)\n* [Finland 🇫🇮 (7)](#finland)\n* [France 🇫🇷 (38)](#france)\n* [Germany 🇩🇪 (43)](#germany)\n* [Hong Kong 🇭🇰 (26)](#hong-kong)\n* [Ireland 🇮🇪 (4)](#ireland)\n* [Italy 🇮🇹 (38)](#italy)\n* [Japan 🇯🇵 (53)](#japan)\n* [Mexico 🇲🇽 (28)](#mexico)\n* [Netherlands 🇳🇱 (15)](#netherlands)\n* [Norway 🇳🇴 (5)](#norway)\n* [Portugal 🇵🇹 (2)](#portugal)\n* [Spain 🇪🇸 (19)](#spain)\n* [Sweden 🇸🇪 (18)](#sweden)\n* [Switzerland 🇨🇭 (25)](#switzerland)\n* [United Kingdom 🇬🇧 (104)](#uk)\n* [United States 🇺🇸 (546)](#us)\n* [Crypto Curr  (1)](#crypto_curr)\n* [Mutual Funds  (9)](#mutual_funds)\n* [Ungrouped  (1)](#ungrouped)\n<hr>\n<h3 id=\"bnd_cfd\">Bonds 📊</h3>\n\n|Instrument|id|Earliest data (UTC)|\n|-|-|-|\n|[Euro Bund](https://www.dukascopy-node.app/instrument/bundtreur)|`bundtreur`|May 2, 2016|\n|[UK Long Gilt](https://www.dukascopy-node.app/instrument/ukgilttrgbp)|`ukgilttrgbp`|Dec 26, 2017|\n|[US T-Bond](https://www.dukascopy-node.app/instrument/ustbondtrusd)|`ustbondtrusd`|Jan 1, 2000|\n<h3 id=\"etf_cfd\">ETFs 📈</h3>\n\n|Instrument|id|Earliest data (UTC)|\n|-|-|-|\n|[ARK Artificial Intelligence & Robotics UCITS ETF](https://www.dukascopy-node.app/instrument/arkiususd)|`arkiususd`|Jan 1, 2000|\n|[Global X Cybersecurity Ucits ETF](https://www.dukascopy-node.app/instrument/bugggbgbp)|`bugggbgbp`|Jan 1, 2000|\n|[iShares NASDAQ 100 UCITS ETF](https://www.dukascopy-node.app/instrument/cndxgbusd)|`cndxgbusd`|Feb 26, 2025|\n|[EUR Deposit Interest Rates vs Euro](https://www.dukascopy-node.app/instrument/csh2freur)|`csh2freur`|Jan 1, 2000|\n|[GBP Deposit Interest Rates vs](https://www.dukascopy-node.app/instrument/csh2gbgbx)|`csh2gbgbx`|Jan 1, 2000|\n|[WisdomTree Cybersecurity UCITS ETF USD](https://www.dukascopy-node.app/instrument/cysegbgbx)|`cysegbgbx`|Jan 1, 2000|\n|[iShares MSCI Europe Health Care Sector UCITS ETF](https://www.dukascopy-node.app/instrument/esihgbgbp)|`esihgbgbp`|Jan 1, 2000|\n|[iShares Physical Gold ETC - IGLN](https://www.dukascopy-node.app/instrument/iglnususd)|`iglnususd`|Jan 1, 2000|\n|[iShares S&P 500 Financial Sector UCITS ETF (LSE)](https://www.dukascopy-node.app/instrument/iufsususd)|`iufsususd`|Jan 1, 2000|\n|[iShares MSCI Global Semiconductors UCITS ETF (London)](https://www.dukascopy-node.app/instrument/semigbgbp)|`semigbgbp`|Jan 1, 2000|\n|[Invesco Physical Gold ETC](https://www.dukascopy-node.app/instrument/sgldususd)|`sgldususd`|Jan 1, 2000|\n|[VanEck Semiconductors UCITS ETF](https://www.dukascopy-node.app/instrument/smhususd)|`smhususd`|Jan 1, 2000|\n|[USD Deposit Interest Rates vs US Dollar](https://www.dukascopy-node.app/instrument/smtcususd)|`smtcususd`|Jan 1, 2000|\n|[WisdomTree Artificial Intelligence UCITS ETF - USD Acc](https://www.dukascopy-node.app/instrument/wtaiususd)|`wtaiususd`|Jan 1, 2000|\n|[Xtrackers FTSE Developed Europe Real Estate UCITS](https://www.dukascopy-node.app/instrument/xdergbgbx)|`xdergbgbx`|Jan 1, 2000|\n|[Xtrackers MSCI World Health Care UCITS ETF 1C](https://www.dukascopy-node.app/instrument/xdwhususd)|`xdwhususd`|Jan 1, 2000|\n|[Xtrackers MSCI World Information Technology UCITS ETF 1C](https://www.dukascopy-node.app/instrument/xdwtususd)|`xdwtususd`|Jan 1, 2000|\n<h3 id=\"vccy\">Crypto assets ₿</h3>\n\n|Instrument|id|Earliest data (UTC)|\n|-|-|-|\n|[Cardano vs US Dollar](https://www.dukascopy-node.app/instrument/adausd)|`adausd`|Jan 1, 2000|\n|[Aave vs US Dollar](https://www.dukascopy-node.app/instrument/aveusd)|`aveusd`|Jan 1, 2000|\n|[Basic Attnetion Token vs US Dollar](https://www.dukascopy-node.app/instrument/batusd)|`batusd`|Aug 5, 2019|\n|[Bitcoin Cash vs Swiss Franc](https://www.dukascopy-node.app/instrument/bchchf)|`bchchf`|Mar 14, 2023|\n|[Bitcoin Cash vs Euro](https://www.dukascopy-node.app/instrument/bcheur)|`bcheur`|Mar 14, 2023|\n|[Bitcoin Cash vs Pound Sterling](https://www.dukascopy-node.app/instrument/bchgbp)|`bchgbp`|Mar 14, 2023|\n|[Bitcoin Cash vs US Dollar](https://www.dukascopy-node.app/instrument/bchusd)|`bchusd`|May 17, 2021|\n|[Bitcoin vs Swiss Franc](https://www.dukascopy-node.app/instrument/btcchf)|`btcchf`|Jan 1, 2000|\n|[Bitcoin vs Euro](https://www.dukascopy-node.app/instrument/btceur)|`btceur`|Jan 1, 2000|\n|[Bitcoin vs Pound Sterling](https://www.dukascopy-node.app/instrument/btcgbp)|`btcgbp`|Mar 14, 2023|\n|[Bitcoin vs US Dollar](https://www.dukascopy-node.app/instrument/btcusd)|`btcusd`|Jan 1, 2000|\n|[Compound vs US Dollar](https://www.dukascopy-node.app/instrument/cmpusd)|`cmpusd`|Jan 1, 2000|\n|[Dashcoin vs US Dollar](https://www.dukascopy-node.app/instrument/dshusd)|`dshusd`|Aug 4, 2019|\n|[Ether vs Swiss Franc](https://www.dukascopy-node.app/instrument/ethchf)|`ethchf`|Mar 14, 2023|\n|[Ether vs Euro](https://www.dukascopy-node.app/instrument/etheur)|`etheur`|Mar 14, 2023|\n|[Ether vs Pound Sterling](https://www.dukascopy-node.app/instrument/ethgbp)|`ethgbp`|Mar 14, 2023|\n|[Ether vs US Dollar](https://www.dukascopy-node.app/instrument/ethusd)|`ethusd`|Jan 1, 2000|\n|[Chainlink vs US Dollar](https://www.dukascopy-node.app/instrument/lnkusd)|`lnkusd`|Jan 1, 2000|\n|[Litecoin vs Swiss Franc](https://www.dukascopy-node","default_branch":"master","files":196,"tree":[".eslintignore",".eslintrc.jsonold",".github/FUNDING.yml",".github/workflows/cicd.yaml",".gitignore",".npmignore",".npmrc",".prettierignore",".prettierrc.json",".vscode/settings.json","CHANGELOG.md","LICENSE","README.md","dukascopy-node.png","eslint.config.mjs","examples/basic/README.md","examples/basic/basic-array.js","examples/basic/basic-array.output.json","examples/basic/basic-csv.js","examples/basic/basic-csv.output.csv","examples/basic/basic-json.js","examples/basic/basic-json.output.json","examples/with-cache/README.md","examples/with-cache/with-cache-custom-folder.js","examples/with-cache/with-cache-custom-folder.png","examples/with-cache/with-cache.js","examples/with-cache/with-cache.png","examples/with-custom-batching/README.md","examples/with-custom-batching/with-custom-batching.js","examples/with-debugging/README.md","examples/with-debugging/with-debugging.png","examples/with-tick-data/README.md","examples/with-tick-data/with-tick-data.js","examples/with-tick-data/with-tick-data.output.json","examples/with-typescript/README.md","examples/with-typescript/array_item.png","examples/with-typescript/array_tick_item.png","examples/with-typescript/json_item.png","examples/with-typescript/json_item_tick.png","examples/with-typescript/string.png","package.json","pnpm-lock.yaml","pnpm-workspace.yaml","src/__mocks__/fixtures/candles-day-BTC-USD-BID-2018.json","src/__mocks__/fixtures/candles-day-BTC-USD-BID-2019.json","src/__mocks__/fixtures/candles-day-BTC-USD-BID-2020.json","src/__mocks__/fixtures/candles-day-BTC-USD-BID-2021.json","src/__mocks__/fixtures/candles-day-BTC-USD-BID-2022.json","src/__mocks__/fixtures/candles-day-BTC-USD-BID-2023.json","src/__mocks__/fixtures/candles-hour-BTC-USD-BID-2023-1.json","src/__mocks__/fixtures/candles-hour-BTC-USD-BID-2023-2.json","src/__mocks__/fixtures/candles-minute-BTC-USD-BID-2023-2-19.json","src/__mocks__/fixtures/candles-minute-BTC-USD-BID-from-1783900800000.json","src/__mocks__/fixtures/candles-minute-EUR-USD-BID-2026-7-10.json","src/__mocks__/fixtures/candles-minute-EUR-USD-BID-2026-7-11-empty.json","src/__mocks__/fixtures/instrument-BTC-USD.json","src/__mocks__/fixtures/instrument-EUR-USD.json","src/__mocks__/fixtures/ticks-BTC-USD-2023-2-20-12.json","src/__mocks__/fixtures/ticks-EUR-USD-2026-7-13-12.json","src/__mocks__/handlers.ts","src/__mocks__/server.ts","src/aggregator/index.ts","src/aggregator/ohlc.test.ts","src/aggregator/ohlc.ts","src/aggregator/tests/aggregator.test.ts","src/aggregator/tests/cases/d1_to_mn1.ts","src/aggregator/tests/cases/h1_to_d1.ts","src/aggregator/tests/cases/h1_to_mn1.ts","src/aggregator/tests/cases/m1_to_d1.ts","src/aggregator/tests/cases/m1_to_h1.ts","src/aggregator/tests/cases/m1_to_m1.ts","src/aggregator/tests/cases/m1_to_m1_keep_flats.ts","src/aggregator/tests/cases/m1_to_m30.ts","src/aggregator/tests/cases/tick_to_h1.ts","src/aggregator/tests/cases/tick_to_h1_with_gaps.ts","src/aggregator/tests/cases/tick_to_m1.ts","src/aggregator/tests/cases/tick_to_m15.ts","src/aggregator/tests/cases/tick_to_m15_with_gaps.ts","src/aggregator/tests/cases/tick_to_m1_with_gaps.ts","src/aggregator/tests/cases/tick_to_m30.ts","src/aggregator/tests/cases/tick_to_m30_with_gaps.ts","src/aggregator/tests/cases/tick_to_m5.ts","src/aggregator/tests/cases/tick_to_m5_with_gaps.ts","src/aggregator/tests/sample_d1_data.json","src/aggregator/tests/sample_h1_data.json","src/aggregator/tests/sample_m1_data.json","src/aggregator/tests/sample_m1_data_flats.json","src/aggregator/tests/sample_tick_data.json","src/aggregator/tests/sample_tick_data_with_gaps.json","src/aggregator/types.ts","src/buffer-fetcher/buffer-fetcher.test.ts","src/buffer-fetcher/index.ts","src/buffer-fetcher/types.ts","src/cache-manager/cache-manager.test.ts","src/cache-manager/index.ts","src/cli/cli.ts","src/cli/config.ts","src/cli/index.ts","src/cli/printer.ts","src/cli/progress.ts","src/cli/tests/cli.test.ts","src/cli/tests/expected-outputs/btcusd-d1-bid-2022-01-01-2023-02-20.json","src/cli/tests/expected-outputs/btcusd-h1-bid-2023-01-01-2023-02-20.json","src/cli/tests/expected-outputs/btcusd-h4-bid-2023-01-01-2023-02-20.json","src/cli/tests/expected-outputs/btcusd-m1-bid-2023-02-19-2023-02-20.json","src/cli/tests/expected-outputs/btcusd-m15-bid-2023-02-19-2023-02-20.json","src/cli/tests/expected-outputs/btcusd-m30-bid-2023-02-19-2023-02-20.json","src/cli/tests/expected-outputs/btcusd-m5-bid-2023-02-19-2023-02-20.json","src/cli/tests/expected-outputs/btcusd-mn1-bid-2018-01-01-2023-02-01.json","src/cli/tests/expected-outputs/btcusd-s1-bid-2023-02-20T12-2023-02-20T13.json","src/cli/tests/expected-outputs/btcusd-tick-2023-02-20T12-2023-02-20T13.json","src/config-validator/index.ts","src/config-validator/schema.ts","src/config-validator/tests/cases/dates_empty-object.ts","src/config-validator/tests/cases/dates_missing.ts","src/config-validator/tests/cases/general_all-invalid.ts","src/config-validator/tests/cases/general_all-valid.ts","src/config-validator/tests/cases/ignore-flats_as-string.ts","src/config-validator/tests/cases/instrument_as-number.ts","src/config-validator/tests/cases/instrument_missing.ts","src/config-validator/tests/cases/instrument_nonsupported.ts","src/config-validator/tests/cases/price-type_as-number.ts","src/config-validator/tests/cases/price-type_nonsupported.ts","src/config-validator/tests/cases/timeframe_as-number.ts","src/config-validator/tests/cases/timeframe_nonsupported.ts","src/config-validator/tests/cases/utc-offset_as-string.ts","src/config-validator/tests/cases/volumes_as-string.ts","src/config-validator/tests/index.test.ts","src/config/data-api.ts","src/config/format.ts","src/config/index.ts","src/config/instruments-metadata.ts","src/config/instruments.ts","src/config/price-types.ts","src/config/timeframes.ts","src/config/volume-unit.ts","src/data-normaliser/index.ts","src/data-normaliser/tests/index.test.ts","src/data-normaliser/types.ts","src/dates-normaliser/index.ts","src/dates-normaliser/tests/cases/d1_01.ts","src/dates-normaliser/tests/cases/d1_02.ts","src/dates-normaliser/tests/cases/h1_01.ts","src/dates-normaliser/tests/cases/h1_02.ts","src/dates-normaliser/tests/cases/h1_03.ts","src/dates-normaliser/tests/cases/tick_01.ts","src/dates-normaliser/tests/cases/tick_02.ts","src/dates-normaliser/tests/index.test.ts","src/dates-normaliser/types.ts","src/getHistoricalRates.ts","src/getRealTimeRates.ts","src/index.ts","src/output-formatter/index.ts","src/output-formatter/tests/cases/m1_array.ts","src/output-formatter/tests/cases/m1_csv.ts","src/output-formatter/tests/cases/m1_csv_no_volume.ts","src/output-formatter/tests/cases/m1_json.ts","src/output-formatter/tests/cases/m1_json_no_volume.ts","src/output-formatter/tests/cases/tick_array.ts","src/output-formatter/tests/cases/tick_csv.ts","src/output-formatter/tests/cases/tick_csv_no_volume.ts","src/output-formatter/tests/cases/tick_json.ts","src/output-formatter/tests/cases/tick_json_no_volume.ts","src/output-formatter/tests/index.test.ts","src/output-formatter/types.ts","src/processor/index.ts","src/processor/types.ts","src/rates.integration.test.ts","src/stream-writer/index.ts","src/url-generator/index.ts","src/url-generator/tests/index.test.ts","src/url-generator/types.ts","src/utils/MemoryUsageReporter.ts","src/utils/date.test.ts","src/utils/date.ts","src/utils/formatBytes.ts","src/utils/formatTimeDuration.ts","src/utils/formatVolume.ts","src/utils/general.ts","src/utils/instrument-meta-data/generate-data.test.ts","src/utils/instrument-meta-data/generate-data.ts","src/utils/instrument-meta-data/generate-data.types.ts","src/utils/instrument-meta-data/generate-group-data.ts","src/utils/instrument-meta-data/generate-id-name.ts","src/utils/instrument-meta-data/generate-instrument-enum.ts","src/utils/instrument-meta-data/generate-instrument-md.ts","src/utils/instrument-meta-data/generate-meta.ts","src/utils/instrument-meta-data/generated/instrument-enum.ts","src/utils/instrument-meta-data/generated/instrument-groups.json","src/utils/instrument-meta-data/generated/instrument-meta-data.json","src/utils/instrument-meta-data/generated/instruments.md","src/utils/instrument-meta-data/generated/raw-meta-data-2026-07-13.json","src/utils/range.test.ts","src/utils/range.ts","src/utils/testUtils.ts","tsconfig.json"],"storefront":"/r/Leo4815162342","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/Leo4815162342/dukascopy-node/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}