From 85d1149aacacfb3683fbf7cb5641f0a0c18e3ed8 Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Wed, 15 Oct 2025 16:28:34 -0400 Subject: [PATCH 01/36] Add new diagrams to docs (#859) * Update billing docs: failed executions are now charged * Add comprehensive Crypto Metrics Data Dictionary with 29 metrics across Blockchain, Protocol, and Wallet categories * Fix MDX parsing error in SQL code block * Simplify SQL code block to fix MDX parsing error * Fix MDX parsing errors: escape anchor links and fix broken line breaks * Fix UI issues: remove duplicate title, remove SQL syntax from MVRV, add Dune Agent to resources * Make metric cards clickable - link directly to Dune query examples for better UX * Reorder Blockchain Metrics: Move MVRV, RSOV, REV to bottom for better flow * Add disclaimer, move TVL to bottom, fix missing icons for better UX * Fix DEX Volume Crosschain icon and simplify disclaimer to be shorter and less strong * Reorder Blockchain Metrics cards to match detailed definitions section order for consistency * Reorder detailed definitions to match card order: DEX Volume first, MVRV/RSOV/REV/TVL last * Update Additional Resources links: Dune Query Editor to dune.com/queries, Community Queries to trending content * Update crypto metrics dictionary: add Blockworks/DefiLlama credits, change RSOV to dashboard link, convert detailed definitions to table format * Update Framework Credits: add company website links and correct Skycatcher attribution to only RSOV * Remove confusing validation notice about multiple data sources * Update documentation to reflect usage-based credit consumption - Replace fixed credit costs (10/20 credits) with usage-based language - Update query engine descriptions to focus on resource allocation - Maintain all API parameters and code examples - Add comprehensive credit system changes documentation - Update billing, API reference, and learning documentation * Remove unrelated crypto-metrics-data-dictionary file and update navigation - Remove accidentally committed crypto-metrics-data-dictionary.mdx file - Remove corresponding navigation entry from mint.json - Keep only credit system changes in this PR * Update dunesql-trino-connector.mdx * Update query-executions.mdx * Fix Credit System Changes documentation issues - Remove duplicate title (frontmatter vs H1) - Add navigation entry in mint.json under 'Jump right in' section - Improve formatting with pricing table instead of bullet points - Convert FAQ sections to accordion format for better UX - Add proper icon and clean up structure - Fix overall formatting and readability * Make Credit System documentation evergreen and remove redundant titles - Change title from 'Credit System Changes' to 'Credit System' - Remove redundant H1 and section titles - Remove 'changing' language to make content evergreen - Update FAQ to remove temporary migration language - Streamline content to focus on how the system works rather than changes - Make documentation suitable for long-term use * Fix remaining title redundancy in Credit System documentation - Change H1 from 'Credit System' to 'How you spend credits on Dune' - Remove redundancy between frontmatter title and H1 - Maintain clean, non-redundant structure * Fix table formatting and tip box styling in Credit System documentation - Add proper link to dune.com/enterprise for Enterprise contact sales - Change tip box to Info component for better formatting - Clean up table formatting for consistency - Improve overall visual presentation * Final table formatting improvements - Link 'Contact support' to support@dune.com - Remove italics from table for consistent formatting - Clean up Premium and Enterprise row styling - Improve overall table readability * Update annual pricing format to match pricing page - Change annual pricing format to 'billed annually' - Make annual pricing format consistent with website pricing page - Improve visual consistency and readability * Add yearly amounts in parentheses for annual plans - Add yearly cost reference to Analyst Annual plan - Add yearly cost reference to Plus Annual plan - Provide clear yearly cost for annual billing - Improve pricing transparency for users * Remove yearly amounts from annual plans - Remove yearly totals from annual plans for cleaner formatting - Keep simple format with monthly rate and billed annually - Improve table readability and consistency * Add separate Annual Price column to pricing table - Add dedicated Annual Price column for clearer comparison - Remove duplicate annual plan rows for cleaner structure - Show monthly vs annual pricing side by side - Improve table readability and organization * Fix Annual Price column to show full yearly amounts - Restore separate annual plan rows for clarity - Annual Price column shows full yearly amounts for annual plans - Use dash for monthly-only plans in Annual Price column - Maintain clear distinction between monthly and annual plans * Add missing content from original documentation - Add detailed explanation of historical credit system issues - Include Analyst Plan Pricing Update section with specific dates - Add 'What can I do to prepare?' section with actionable steps - Include Important Dates section with migration timeline - Maintain existing table format and structure * Fix formatting and spacing in Analyst Plan Pricing Update - Remove extra space after section title - Clean up bullet point formatting - Ensure proper line breaks and spacing - Fix any display issues with pricing information * Update credit-system-changes.mdx * Update credit-system-changes.mdx * Update credit-system-changes.mdx * Update billing.mdx * Update overview.mdx * Update overview.mdx * Update overview.mdx * Update overview.mdx * Update dune_table_upload_methods_overview.md * Update dune_table_upload_methods_overview.md * Update dune_table_upload_methods_overview.md * Update credit-system-changes.mdx * Update credit-system-changes.mdx * Update credit-system-changes.mdx * Update query-executions.mdx * Update query-executions.mdx with new Arcade embeds - Update interactive dashboard execution embed with new Arcade demo - Update interactive query execution embed with new Arcade demo - Update query engine size selector embed with new Arcade demo - Add responsive design and copy link functionality to all embeds * Fix MDX syntax for Arcade embeds - Convert HTML comments to JSX comments for MDX compatibility - Convert inline styles to JSX style objects - Ensure proper MDX syntax for Mintlify deployment * Fix Arcade embeds to play inline instead of opening new window - Remove embed_mobile=tab&embed_desktop=inline parameters - Remove show_copy_link=true parameter - Keep simple ?embed parameter for inline playback like other embeds * Update Arcade embeds with new interactive demos - Interactive dashboard: Run Complex Queries with Larger Engine Size - Interactive query: Change Query Engine Size Before Running SQL Query - Query engine selector: Choose a Larger Query Engine for Faster SQL Execution - Updated aspect ratios and embed parameters for better UX * Rename credit-system-changes to credit-system - Rename file from credit-system-changes.mdx to credit-system.mdx - Update navigation reference in mint.json - Cleaner URL path: /learning/how-tos/credit-system * Update query-executions.mdx * Update Arcade embeds with final interactive demos - Interactive dashboard: Run a Dashboard Query with a Large Engine on Dune Analytics - Interactive query: Change the Query Engine Size Before Running a SQL Query - Query engine selector: Run a SQL Query with Increased Engine Size - All embeds use consistent aspect ratio and enhanced parameters * Update credit-system.mdx * Update credit-system.mdx * Update query-executions.mdx * Add Query Cost Limits and Overage Limit Settings sections to credit-system.mdx - Add Query Cost Limits section with Arcade embed for cost capping feature - Add Overage Limit Settings section with Arcade embed for overage management - Both sections include interactive demos showing how to set limits - Proper MDX syntax with JSX comments and style objects * Refactor credit system sections to use external links instead of embedded demos - Remove separate Query Cost Limits and Overage Limit Settings sections - Add external links to Arcade demos in the 'What can I do to prepare?' section - Keep the same functionality but with cleaner, more concise presentation - Links point to the interactive demos on Arcade platform * Remove specific connector mentions from credit system docs - Remove dbt-style connectors reference - Remove dbt, Trino REST API, SQL Mesh, and AI-driven workflows mentions - Keep general statement about expanded connector options coming - Maintain focus on scalability without specific product commitments * Add interactive demos for query engine sizes - Small engine: Change Query Engine Size and Re-Run a SQL Query - Medium engine: Run a SQL Query and View Results in JSON Format - Large engine: Choose a Query Engine Size for Running Blockchain Data Queries - All demos use consistent aspect ratio and enhanced parameters - Proper MDX syntax with JSX comments and style objects * Add diagram references for data architecture - Add Datashare architecture diagram to datashare overview - Add data transformations diagram to quickstart guide - Create new section 'How you can work with Dune data' in quickstart - Show users multiple ways to access and transform blockchain data * Add datashare and data transformations architecture diagrams - Add datashare-architecture.png showing data flow to warehouses - Add data-transformations-dune.png showing Dune Warehouse outputs - Both diagrams illustrate how customers can access and transform Dune data --- datashare/datashare.mdx | 2 ++ datashare/images/datashare-architecture.png | Bin 0 -> 79460 bytes images/data-transformations-dune.png | Bin 0 -> 141394 bytes quickstart.mdx | 6 ++++++ 4 files changed, 8 insertions(+) create mode 100644 datashare/images/datashare-architecture.png create mode 100644 images/data-transformations-dune.png diff --git a/datashare/datashare.mdx b/datashare/datashare.mdx index b9cad8e3..79dbc859 100644 --- a/datashare/datashare.mdx +++ b/datashare/datashare.mdx @@ -11,6 +11,8 @@ Dune Datashare brings our complete blockchain dataset (1.5M+ tables, 50+ chains) Datashare replicates Dune's processed blockchain data directly into your cloud data warehouse: +![Datashare Architecture](/datashare/images/datashare-architecture.png) + 1. **Data Replication**: We maintain live copies of all Dune tables in your Snowflake or BigQuery environment 2. **Native Integration**: Data appears as regular tables/datasets in your warehouse - no APIs or external connections 3. **Fresh Data**: Automatic updates keep your data in sync with Dune's platform (hourly/daily refresh) diff --git a/datashare/images/datashare-architecture.png b/datashare/images/datashare-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..05fc7b188ac4fa1568f4f4156b0dc86d6e60afaf GIT binary patch literal 79460 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 g`&?4goUr-Ip$Bw2-OWo?L&NLrdFq*q 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

e2jL;&Hy*3B@%p`LcN{8Jp*K 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 literal 0 HcmV?d00001 diff --git a/quickstart.mdx b/quickstart.mdx index 53ff0992..2ff53f62 100644 --- a/quickstart.mdx +++ b/quickstart.mdx @@ -14,6 +14,12 @@ This guide will fast-track your understanding of how to **query**, **visualize** Dune offers many features, but this guide focuses on the essentials you'll need to get started. For more detailed guides, check out our [Analytics Guidelines](/learning-resources) and [Data Tables](/data-catalog/) sections. +## How you can work with Dune data + +Dune provides multiple ways to access and transform blockchain data, whether you're querying directly in our web app, connecting via API, using SQL transformation tools, or accessing data through our Datashare offering: + +![Data transformations on Dune](/images/data-transformations-dune.png) + ### **Prerequisites:** * **Dune Account:** You'll need a Dune account to follow along. If you don't already have one, [sign up here](https://dune.com/auth/register). From 921b1a3fae5a1997b3911c83203215e8857445c5 Mon Sep 17 00:00:00 2001 From: 0xBoxer <71930326+0xBoxer@users.noreply.github.com> Date: Thu, 16 Oct 2025 17:15:32 +0200 Subject: [PATCH 02/36] Optimize and document token balance queries (#860) * Refactor balances documentation to emphasize query template Co-authored-by: florian * Refactor token balances documentation and add Kaia, Linea, Worldchain Co-authored-by: florian --------- Co-authored-by: Cursor Agent --- .../curated/token-transfers/evm/balances.mdx | 144 +++++------------- 1 file changed, 39 insertions(+), 105 deletions(-) diff --git a/data-catalog/curated/token-transfers/evm/balances.mdx b/data-catalog/curated/token-transfers/evm/balances.mdx index bed05951..03ce610b 100644 --- a/data-catalog/curated/token-transfers/evm/balances.mdx +++ b/data-catalog/curated/token-transfers/evm/balances.mdx @@ -8,34 +8,43 @@ description: "Balances for addresses on EVM networks." import { DuneEmbed } from '/snippets/dune-embed.mdx'; - This dataset is currently in open beta. We are working on adding more chains and methods to detect balance changes. We are also working on improving the query performance. We currently recommend using the `tokens_.balances` table for queries. - Mirroring the approach of [this query](https://dune.com/queries/3702725) is currently the fastest way to get started with the token balances dataset. + **IMPORTANT: These tables are currently very unperformant.** The ONLY efficient way to query them is by using the query template pattern shown below. Do NOT query these tables directly - you will experience timeouts and poor performance. -The `tokens_.balances_daily` table contains all daily token balances across all addresses and on EVM-compatible networks. This dataset encompasses: +The `tokens_.balances_daily` and `tokens_.balances` tables contain token balances across all addresses on EVM-compatible networks. This dataset encompasses: - **Native currency balances** (such as ETH, MATIC) - **ERC-20 token balances** - **ERC-721 (NFT) balances** - **ERC-1155 token balances** -The table contains the following columns: +## How to Query These Tables Efficiently -import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; +**The ONLY performant way to query these tables is through the query template pattern:** - - - -### Utility +```sql +SELECT + day, + token_symbol, + token_address, + SUM(balance) as balance, + SUM(balance_usd) as balance_usd +FROM "query_4419528( + blockchain = 'base', + filter='address = 0x729170d38dd5449604f35f349fdfcc9ad08257cd', + native_token='ETH' +)" +WHERE day >= timestamp '2025-01-01' +GROUP BY 1, 2, 3 +``` -Leveraging the balance tables equips analysts and developers with a foundational dataset for diverse applications, enabling you to: +**Example Query:** [https://dune.com/queries/5133694](https://dune.com/queries/5133694) -- **Evaluate token distribution patterns** -- **Identify leading token holders** -- **Examine an address's token portfolio** -- **Review multi-signature wallet holdings** +### Template Parameters -and much more, offering a granular view into the dynamics of token economics. +- **blockchain**: The EVM chain to query (e.g., 'base', 'ethereum', 'arbitrum', 'optimism') +- **filter**: Filter condition for addresses (e.g., `'address = 0x...'`) +- **native_token**: The native token symbol for the chain (e.g., 'ETH', 'MATIC') ### Network Coverage @@ -43,108 +52,33 @@ Balances are available for the following EVM-compatible networks: - Arbitrum - Avalanche C-Chain -- Base -- Ethereum Mainnet -- Gnosis Chain +- Base +- Ethereum +- Kaia +- Linea - Optimism +- Polygon - Scroll -- ZkSync +- Worldchain -### Balance Calculation Methodology +## Balance Calculation Methodology -Our approach to storing balances is the following: We store token balances for each address. This process involves querying the blockchain for the balance of each address at the end of the day. The balance is then stored in the `tokens_.balances` table, which is updated daily. For the balance to be queried, the address must have appeared in any of the following tables: +Our approach to storing balances involves querying the blockchain for the balance of each address at the end of the day. The balance is then stored in the `tokens_.balances` table, which is updated daily. For the balance to be queried, the address must have appeared in any of the following tables: -- **For native currencies**: Transactions and traces ``to``/``from`` addresses, Ethereum-specific withdrawals, and block mining/validator activities. +- **For native currencies**: Transactions and traces `to`/`from` addresses, Ethereum-specific withdrawals, and block mining/validator activities. - **For ERC20**: Analysis is based on token transfer events detailed in the [tokens_ethereum_base_transfers](https://github.com/duneanalytics/spellbook/blob/main/models/_sector/tokens/ethereum/tokens_ethereum_base_transfers.sql). The address balance is updated based on the `to`/`from` addresses in the transfer events. If the token is a non-standard ERC20 token, the balance might not be updated until we detect a standard ERC20 transfer event. Known issues currently include ERC4626 tokens and rebasing tokens like stETH or $ampleforth. We are working on improving the range of balance changes that we detect. - **For ERC721 and ERC1155**: Inspection of NFT transfer activities via the [nft_ethereum_transfers](https://github.com/duneanalytics/spellbook/blob/main/models/_sector/nft/transfers/chains/nft_ethereum_transfers.sql), focusing on the `to`/`from` addresses. These dependencies on transfer and NFT event tables introduce a delay to balance updates, contingent on the latency inherent in the Spellbook's processing. -This also means that if an address has not been involved in any of the above activities, its balance will not be updated. -This might be the case for non-standard ERC20 contracts that do not emit the `Transfer` event, or for addresses that have not been involved in any transactions or NFT transfers. If there is a specific token that does not emit the `Transfer` event, but has a different event for token transfers, please let us know and we will see if we can include it in our balance calculations. - -### Granular balances +If an address has not been involved in any of the above activities, its balance will not be updated. This might be the case for non-standard ERC20 contracts that do not emit the `Transfer` event, or for addresses that have not been involved in any transactions or NFT transfers. If there is a specific token that does not emit the `Transfer` event, but has a different event for token transfers, please let us know and we will see if we can include it in our balance calculations. -We also provide a more granular view of token balances in the `tokens_.balances` table, which contains granular balance changes for each address, token combination per block. This table is updated in near real-time and is used to calculate the daily balances. This table is useful for more granular analysis, such as tracking the balance changes of a specific address over time. +### Granular Balances -However, the `tokens_.balances` table is very large and is not suitable for querying large time ranges or for querying balances for many addresses at once. For these use cases, the `tokens_.balances_daily` table is more suitable. +The `tokens_.balances` table provides a more granular view of token balances, containing granular balance changes for each address and token combination per block. This table is updated in near real-time and is used to calculate the daily balances. The `tokens_.balances` table adds a new row every time a balance changes but does not carry the balance forward for every block. Instead, it only creates a new row for a balance change of an address and token combination. -## Table Sample - -

- -
- -## Sample Queries - -#### Querying for the latest fungible Token Balances for a specific Address - -This query will return the latest fungible token balances for the specified address. Fungible tokens refer to ERC20 and native tokens. Please keep in mind that the balance table lags behind the real state by approximately 2 hours. - -```sql -select - address - ,token_symbol as symbol - ,balance - ,balance_usd - ,token_address -from tokens_{{blockchain}}.balances_daily -where address = {{wallet_address}} and day = date_trunc('day', now()) - and (token_standard = 'erc20' or token_standard = 'native') - and balance_usd > 1 -order by balance_usd desc -``` - -
- -
- -#### Querying for daily fungible Token Balances for a specific Address - -This query will return the daily fungible token balances for the specified address over time. Fungible tokens refer to ERC20 and native tokens. - -```sql -select - b.day - ,b.token_symbol - ,b.token_address - ,b.balance - ,b.balance_usd -from tokens_{{blockchain}}.balances_daily b -where address = {{wallet_address}} - and (token_standard = 'erc20' or token_standard = 'native') - and b.day > date_trunc('day',now()) - interval '{{months}}' month - and balance_usd > 1 -order by day desc, balance_usd desc -``` - -
- -
- -#### Find the top 50 token holders for a specific token - -This query will return the top 50 token holders for a specific ERC20 token on the Ethereum Mainnet. - -```sql -WITH RankedBalances AS ( - SELECT - b.address, - b.balance, - ROW_NUMBER() OVER(PARTITION BY b.day ORDER BY b.balance DESC) AS rank - FROM tokens_ethereum.balances_daily b - WHERE token_address = 0xbaac2b4491727d78d2b78815144570b9f2fe8899 - AND b.day = date_trunc('day', current_date) -) -SELECT - address, - balance -FROM RankedBalances -WHERE rank <= 50; -``` - -
- -
+ +**Direct querying is possible** for the `tokens_.balances` table when querying a limited time range and small number of addresses. For broader queries, use the query template pattern shown above. + From db854ff5439416b106ed617689be075724d7d2bb Mon Sep 17 00:00:00 2001 From: 0xBoxer <71930326+0xBoxer@users.noreply.github.com> Date: Fri, 17 Oct 2025 11:48:28 +0200 Subject: [PATCH 03/36] Fix query line breaks for token balances (#862) * Refactor balance query example for clarity Co-authored-by: florian * Update balances.mdx --------- Co-authored-by: Cursor Agent --- data-catalog/curated/token-transfers/evm/balances.mdx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/data-catalog/curated/token-transfers/evm/balances.mdx b/data-catalog/curated/token-transfers/evm/balances.mdx index 03ce610b..c42e7068 100644 --- a/data-catalog/curated/token-transfers/evm/balances.mdx +++ b/data-catalog/curated/token-transfers/evm/balances.mdx @@ -29,11 +29,7 @@ SELECT token_address, SUM(balance) as balance, SUM(balance_usd) as balance_usd -FROM "query_4419528( - blockchain = 'base', - filter='address = 0x729170d38dd5449604f35f349fdfcc9ad08257cd', - native_token='ETH' -)" +FROM "query_4419528(blockchain = 'base', filter='address = 0x729170d38dd5449604f35f349fdfcc9ad08257cd', native_token='ETH')" WHERE day >= timestamp '2025-01-01' GROUP BY 1, 2, 3 ``` From fa2d2bd01da4c12e7487bc6f66ab8dd01d3c02da Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Sun, 19 Oct 2025 17:59:33 -0400 Subject: [PATCH 04/36] Update credit system page with new content and FAQ structure (#863) * Update credit system page with new content and FAQ structure * Fix MDX syntax errors: broken link, missing AccordionGroup close tag, and typo --- learning/how-tos/credit-system.mdx | 94 +++++++++--------------------- 1 file changed, 28 insertions(+), 66 deletions(-) diff --git a/learning/how-tos/credit-system.mdx b/learning/how-tos/credit-system.mdx index 7b357b1d..a92e7fb2 100644 --- a/learning/how-tos/credit-system.mdx +++ b/learning/how-tos/credit-system.mdx @@ -8,13 +8,15 @@ icon: "coins" Dune uses a usage-based credit system that charges based on actual compute resources consumed, ensuring fair pricing for all users regardless of query complexity. +See full blog post announcement [here](link tbd) + ## How the Credit System Works -Historically, our query engine charged a fixed number of credits per execution, a simple approach for analysts but ultimately **unfair and limiting**: simpler queries were overcharged, complex queries undercharged, and query timeouts restricted capabilities. +Our query engine uses a flexible credit-based pricing model that scales with your actual resource consumption. When you run a query, credits are spent in proportion to the resources used—simple queries cost fewer credits, while complex queries that require more computational resources use more credits. -As Dune adoption grows—spanning over **100 chains, complex tables, and new ways to consume data through APIs and expanded connector options—both we and our customers need pricing that scales with real usage**. +This approach ensures fair pricing across our platform, which spans over 100 chains, complex tables, and multiple ways to consume data through APIs and various connector options. The credit system adapts to your needs: small, efficient queries are economical, while larger, more complex queries can leverage extended timeouts and additional resources as needed. -This new engine brings that flexibility. **Your credit system remains the same, but now when you run a query, credits are spent in proportion to the consumed resources.** This means that small, simple queries will become cheaper and larger queries can run longer (better timeouts). +Your credits work seamlessly across all query types and data consumption methods, providing transparent and predictable pricing that scales with your usage. **Key benefits:** @@ -26,24 +28,16 @@ This fair, usage-based model ensures Dune can keep pace with your most ambitious ## Credit Pricing -Credits are consumed based on the actual compute resources used for each query execution. The more complex your query, the more credits it consumes, but simple queries cost significantly less. - -**Credit Pricing = Overage Pricing** -Overage is now charged at the same rate as your plan. The price per 100 credits shown for each plan is what you pay for any usage beyond your included credits, keeping things simple and transparent. - -**Analyst Plan Pricing Update** +Credits are consumed based on the actual compute resources used for each query execution. The more complex your query, the more credits it consumes, but simple queries cost significantly less. At the moment, we don't share a single, per-query formula because credit usage depends on real-time factors (the compute your query actually uses, the engine you choose, and current network/data access conditions. -- Monthly plans: New pricing of \$75/month, up from \$49/month, takes effect at your first billing cycle after October 21st. +To stay in full control, you can set: +- a global query cost cap (per-execution ceiling). More info on how to do this [here](https://app.arcade.software/share/C60r4u7ESOp5RXRuzbSN). +- a monthly overage limit (account-level ceiling). +These controls ensure you never exceed what you're comfortable spending per run or per month. Learn how to set this up [here](https://app.arcade.software/share/so8QGM4H4MU0OWRWhNe9). -- Annual plans: New pricing of \$65/month (\$780/year), up from \$45/month, takes effect at your next annual renewal after October 21st. - - -This adjustment ensures sustainable economics as Dune scales to support 100+ chains and complex workflows. Your 4,000 credits will go further with usage-based pricing, meaning lighter queries cost less, giving you more value. - +**Credit Pricing = Overage Pricing** +Overage is charged at the same rate as your plan. The price per 100 credits shown for each plan is what you pay for any usage beyond your included credits, keeping things simple and transparent. - -**Note:** All plans will transition to usage-based credit consumption by their next monthly billing cycle after October 21st (including all annual plans). However, Analyst annual plans will adopt their new pricing at their next annual renewal cycle. - **Quick Plan Reference** @@ -57,10 +51,6 @@ This adjustment ensures sustainable economics as Dune scales to support 100+ cha | **Premium** | Existing customers only | - | Varies | [Contact support](mailto:support@dune.com) | | **Enterprise** | Custom pricing | - | Custom | [Contact sales](https://dune.com/enterprise) | - -**Premium Plan**: Existing Premium customers will continue to be supported on their current plans. However, the Premium plan will no longer be available to *new* sign-ups or to users who downgrade and later wish to return. If you need support or have questions, please [contact us](mailto:support@dune.com) via email. - - **Enterprise**: Whether you're an existing plan considering an upgrade or a new team, we can custom-tailor a plan to your pricing needs at dune.com/enterprise. Enterprise clients receive **favorable per-credit pricing and customized support**. @@ -69,18 +59,14 @@ This adjustment ensures sustainable economics as Dune scales to support 100+ cha Explore the complete pricing plan with credit limits and features for each tier: [dune.com/pricing](https://dune.com/pricing) -## What can I do to prepare? +## Managing Your Credit Usage -- **Review your usage.** Check your query volume and costs to understand where you stand before the change takes place. +- **Review your usage.** Check your query volume and costs regularly to stay informed about your credit consumption. - **Optimize your queries.** Efficient queries save credits and run faster. See [here](https://docs.dune.com/query-engine/writing-efficient-queries) for tips. - **Pick the plan that fits.** If you anticipate heavy usage or notice overages, please contact our sales team at [dune.com/enterprise](http://dune.com/enterprise) to discuss the best plan for your needs. Enterprise clients receive **favorable per-credit pricing and customized support**. -- **Cap your query costs.** Use our new feature to cap the amount of credits you're willing to spend on a query. More info on how to do this [here](https://app.arcade.software/share/C60r4u7ESOp5RXRuzbSN). +- **Cap your query costs.** Control spending by setting a maximum credit limit for individual queries. More info on how to do this [here](https://app.arcade.software/share/C60r4u7ESOp5RXRuzbSN). - **Set overage limits.** Configure your overage spending limits to control costs. Learn how to set this up [here](https://app.arcade.software/share/so8QGM4H4MU0OWRWhNe9). -## Important Dates - -- **October 7th-20th**: New pricing in effect for net-new subscriptions. -- **October 21st**: The new usage-based model will apply to your plan on **your first new monthly billing cycle after this date**. ## Need Help? @@ -103,46 +89,22 @@ Have questions or need additional support? [Contact Us](mailto:support@dune.com) Yes, but you will be limited to the Small and Medium engine. If you often hit timeout limits, consider the Analyst or Plus plans. - - No. All existing queries will run as before. However, more efficient queries will consume fewer credits, so optimizing your queries can help you save on cost. - - - + Credits are based on the actual compute effort measured in CPU-seconds and network resources a query consumes. This means lightweight queries cost fewer credits, while complex, resource-intensive operations require more credits. - + +At the moment, we don't share a single, per-query formula because credit usage depends on real-time factors (the compute your query actually uses, the engine you choose, and current network/data access conditions). - - It depends on your usage pattern. Light or efficient workloads will likely cost less. Heavy workloads may cost more, but you'll gain the ability to run larger, more complex queries without timeout limitations. You can set both query credit cost caps and overage limits in Settings to ensure your spending stays within comfortable boundaries. - +In practice: +Credits scale with compute used. Heavier queries consume more credits; lighter ones consume fewer. +Engine matters. Large runs complex queries fastest and therefore consumes credits at a higher rate than Medium; Small prioritizes queue time over speed and is most efficient for simple jobs. - - Cost will depend on compute used by those API queries. After October 21st, you can check the new usage dashboard in Settings to track API-specific consumption. - - - - Existing Premium customers will continue to be supported on their current plans. However, the Premium plan will no longer be available to *new* sign-ups or to users who downgrade and later wish to return. If you regularly exceed 25,000 credits/month or need guaranteed performance for large workloads, contact [sales](http://dune.com/enterprise) about Enterprise pricing. - - - - If you are downgrading to an Analyst plan, the new pricing will take effect ($65/month for annual users and $75/month for monthly users). If you are on a Premium plan, after downgrading, you will lose access to the Premium plan going forward. - - - - Your custom contract remains in place. Your account manager will work with you to align credit allocation, pricing, and engines when your contract renews. +To stay in full control, you can set: +a global query cost cap (per-execution ceiling), and +a monthly overage limit (account-level ceiling). - ---- - -### System & Migration - - - - The usage-based credit system launched in October 2025. All customers except Enterprise customers will be on the usage-based credit system and engine by November 2025. - - - - No action is required; all accounts automatically use the usage-based credit system and engine. + + Cost will depend on compute used by those API queries. You can check the usage dashboard in Settings to track API-specific consumption. @@ -150,7 +112,7 @@ Have questions or need additional support? [Contact Us](mailto:support@dune.com) - A new usage and billing dashboard will show credits used, overages, and historical usage. + The usage and billing dashboard shows credits used, overages, and historical usage. @@ -158,7 +120,7 @@ Have questions or need additional support? [Contact Us](mailto:support@dune.com) - Yes. The new pricing structure supports more complex queries and higher data volumes with longer timeouts for Enterpris clients. + Yes more complex queries and higher data volumes with longer timeouts for Enterprise clients. From f453003c1539dfce8085821119c6746168a8d19e Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Sun, 19 Oct 2025 18:05:18 -0400 Subject: [PATCH 05/36] Add blog post link for credit system announcement (#865) --- learning/how-tos/credit-system.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/learning/how-tos/credit-system.mdx b/learning/how-tos/credit-system.mdx index a92e7fb2..49bd3c11 100644 --- a/learning/how-tos/credit-system.mdx +++ b/learning/how-tos/credit-system.mdx @@ -8,7 +8,7 @@ icon: "coins" Dune uses a usage-based credit system that charges based on actual compute resources consumed, ensuring fair pricing for all users regardless of query complexity. -See full blog post announcement [here](link tbd) +See full blog post announcement [here](https://dune.com/blog/credits-changing) ## How the Credit System Works From 64ac38ceb70ecb12d1cf7de7e600419cfa6f2425 Mon Sep 17 00:00:00 2001 From: Wilhelm Van Der Walt Date: Tue, 21 Oct 2025 02:32:19 +0100 Subject: [PATCH 06/36] Typo fixes #20 (#858) * Fix typos in chunk 20 (files 201-210) * Add imports for column descriptions and table sample --------- Co-authored-by: kdot <151790166+karimhass@users.noreply.github.com> --- data-catalog/evm/corn/raw/traces.mdx | 3 +-- data-catalog/evm/degen/overview.mdx | 2 +- .../evm/ethereum/curated-data/dex/dex-aggregator-trades.mdx | 2 +- data-catalog/evm/ethereum/curated-data/dex/dex-trades.mdx | 2 +- data-catalog/evm/ethereum/curated-data/nft/nft-trades.mdx | 4 ++-- data-catalog/evm/ethereum/decoded/call-tables.mdx | 2 +- data-catalog/evm/ethereum/decoded/event-logs.mdx | 2 +- data-catalog/evm/ethereum/decoded/logs-decoded.mdx | 2 +- data-catalog/evm/ethereum/decoded/overview.mdx | 6 +++--- data-catalog/evm/ethereum/decoded/traces-decoded.mdx | 2 +- 10 files changed, 13 insertions(+), 14 deletions(-) diff --git a/data-catalog/evm/corn/raw/traces.mdx b/data-catalog/evm/corn/raw/traces.mdx index 937473da..34c86d0e 100644 --- a/data-catalog/evm/corn/raw/traces.mdx +++ b/data-catalog/evm/corn/raw/traces.mdx @@ -8,5 +8,4 @@ import { TracesSnippet } from '/snippets/evm/raw/traces-snippet.mdx'; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; import { TableSample } from "/snippets/table-sample.mdx"; - - \ No newline at end of file + diff --git a/data-catalog/evm/degen/overview.mdx b/data-catalog/evm/degen/overview.mdx index 81105e2d..0ca7358b 100644 --- a/data-catalog/evm/degen/overview.mdx +++ b/data-catalog/evm/degen/overview.mdx @@ -7,7 +7,7 @@ description: degen data on Dune Degen, an ERC-20 token launched in January 2024, has reshaped the Farcaster ecosystem by enabling Casters to reward others with DEGEN for posting quality content. Our points system recognizes unique posts and comments, effectively bridging the gap between online contributions and real-world value. -Degen has launched a layer3 solution that settles transactions on the base network. This solution is designed to provide a more efficient and scalable way to settle transactions related to $degen. +Degen has launched a layer 3 solution that settles transactions on the Base network. This solution is designed to provide a more efficient and scalable way to settle transactions related to $DEGEN. Degen Chain uses Arbitrum Orbit for rollups, Base for transaction settlements, and Arbitrum AnyTrust for data availability. diff --git a/data-catalog/evm/ethereum/curated-data/dex/dex-aggregator-trades.mdx b/data-catalog/evm/ethereum/curated-data/dex/dex-aggregator-trades.mdx index 5fcb78cf..055bd605 100644 --- a/data-catalog/evm/ethereum/curated-data/dex/dex-aggregator-trades.mdx +++ b/data-catalog/evm/ethereum/curated-data/dex/dex-aggregator-trades.mdx @@ -7,7 +7,7 @@ description: Description of the Dex Aggregator Trades table for ethereum import { DexAggregatorTradesSnippet } from '/snippets/curated-data/dex/text/dex-aggregator-trades-snippet.mdx'; import { DexAggregatorCoverage } from "/snippets/curated-data/dex/embeds/dex-aggregator-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; \ No newline at end of file diff --git a/data-catalog/evm/ethereum/curated-data/dex/dex-trades.mdx b/data-catalog/evm/ethereum/curated-data/dex/dex-trades.mdx index 0b80917a..b18c7c7c 100644 --- a/data-catalog/evm/ethereum/curated-data/dex/dex-trades.mdx +++ b/data-catalog/evm/ethereum/curated-data/dex/dex-trades.mdx @@ -7,6 +7,6 @@ description: "The `dex.trades` table captures detailed data on decentralized exc import { DexTradesSnippet } from '/snippets/curated-data/dex/text/dex-trades-snippet.mdx'; import { DexCoverage } from "/snippets/curated-data/dex/embeds/dex-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; \ No newline at end of file diff --git a/data-catalog/evm/ethereum/curated-data/nft/nft-trades.mdx b/data-catalog/evm/ethereum/curated-data/nft/nft-trades.mdx index 7a0fedd1..7fe8c9af 100644 --- a/data-catalog/evm/ethereum/curated-data/nft/nft-trades.mdx +++ b/data-catalog/evm/ethereum/curated-data/nft/nft-trades.mdx @@ -1,7 +1,7 @@ --- -title: NFT.trades on ethereum +title: NFT Trades on Ethereum sidebarTitle: NFT Trades -description: "The `nft.trades` table captures detailed data on NFT marketplaces, recording all trade events across various protocols on ethereum." +description: "The `nft.trades` table captures detailed data on NFT marketplaces, recording all trade events across various protocols on Ethereum." --- import { NFTTradesSnippet } from '/snippets/curated-data/nft/text/nft-trades-snippet.mdx'; diff --git a/data-catalog/evm/ethereum/decoded/call-tables.mdx b/data-catalog/evm/ethereum/decoded/call-tables.mdx index 8978e210..87730e28 100644 --- a/data-catalog/evm/ethereum/decoded/call-tables.mdx +++ b/data-catalog/evm/ethereum/decoded/call-tables.mdx @@ -54,7 +54,7 @@ However, if one of these functions is invoked by another smart contract in the c In short: **State data stored in the memory of a smart contract is not available on Dune!** -A good example of this is the function `decimals` of the [erc20 token contract](https://etherscan.io/token/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984#readContract) `Uni` which is a `constant` state variable that is able to be accessed through an automatically created "[getter function](https://docs.soliditylang.org/en/v0.7.4/contracts.html#getter-functions)". Should a smart contract invoke this function in the context of transaction, this message call will be recorded in the Dune table [`uniswap_ethereum.UNI_call_decimals"`](https://dune.com/queries/741354). +A good example of this is the function `decimals` of the [ERC20 token contract](https://etherscan.io/token/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984#readContract) `Uni` which is a `constant` state variable that is able to be accessed through an automatically created "[getter function](https://docs.soliditylang.org/en/v0.7.4/contracts.html#getter-functions)". Should a smart contract invoke this function in the context of a transaction, this message call will be recorded in the Dune table [`uniswap_ethereum.UNI_call_decimals`](https://dune.com/queries/741354). This is in contrast to anyone calling this function locally using web3.py/web3.js or using the Etherscan frontend to access this state. These local calls are not recorded in Dune. diff --git a/data-catalog/evm/ethereum/decoded/event-logs.mdx b/data-catalog/evm/ethereum/decoded/event-logs.mdx index 18ebf375..ceba3def 100644 --- a/data-catalog/evm/ethereum/decoded/event-logs.mdx +++ b/data-catalog/evm/ethereum/decoded/event-logs.mdx @@ -47,7 +47,7 @@ Let's take the [uniswap v3 factory](https://etherscan.io/address/0x1f98431c8ad98 ## Multiple Instances -If there is multiple instances of a contract we will collect all event logs across all instances of this smart contract in one table. For example, all uniswap v3 pool `swap` events (on ethereum) are stored in the table: `uniswap_v3_ethereum.Pair_evt_Swap` +If there are multiple instances of a contract we will collect all event logs across all instances of this smart contract in one table. For example, all uniswap v3 pool `swap` events (on ethereum) are stored in the table: `uniswap_v3_ethereum.Pair_evt_Swap` The column `contract_address` indicates as to which smart contract emitted this event. diff --git a/data-catalog/evm/ethereum/decoded/logs-decoded.mdx b/data-catalog/evm/ethereum/decoded/logs-decoded.mdx index 96177fe0..23e97fd3 100644 --- a/data-catalog/evm/ethereum/decoded/logs-decoded.mdx +++ b/data-catalog/evm/ethereum/decoded/logs-decoded.mdx @@ -8,7 +8,7 @@ description: Description of the ethereum.logs_decoded table on Dune The `logs_decoded` table contains decoded logs from Ethereum transactions. The table matches `topic0` to the event signature and the corresponding event name. The table does not contain the full event data and is not suitable for analysis of smart contract level data. For that, use the specific event tables as described in [Event Logs](/data-catalog/evm/ethereum/decoded/event-logs). -This table is great for gaining a high level understanding of the types of events that are being emitted by a smart contract or smart contracts of a certain protocol. +This table is great for gaining a high-level understanding of the types of events that are being emitted by a smart contract or smart contracts of a certain protocol. ## Column Descriptions diff --git a/data-catalog/evm/ethereum/decoded/overview.mdx b/data-catalog/evm/ethereum/decoded/overview.mdx index 393a3de1..d1554ec5 100644 --- a/data-catalog/evm/ethereum/decoded/overview.mdx +++ b/data-catalog/evm/ethereum/decoded/overview.mdx @@ -37,7 +37,7 @@ Dune's decoded data approach offers several benefits: ## Which contracts have decoded data? -Contract submission on Dune are driven by the community. Usually the odds are good that the contract you are looking at is already decoded, but esepecially for new projects or new contracts, it might be that the contract is not decoded yet. In those cases you can submit the contract to be decoded. Decoding usually takes about 24 hours, in special cases it might take longer. +Contract submissions on Dune are driven by the community. Usually the odds are good that the contract you are looking at is already decoded, but especially for new projects or new contracts, it might be that the contract is not decoded yet. In those cases you can submit the contract to be decoded. Decoding usually takes about 24 hours, in special cases it might take longer. You can check if contracts are already decoded by querying [`[blockchain].contracts`](/data-catalog/evm/ethereum/decoded/contracts) tables, the [data explorer](/web-app/query-editor/data-explorer) or use [this dashboard](https://dune.com/dune/is-my-contract-decoded-yet-v2). @@ -108,7 +108,7 @@ WHERE evt_tx_hash = 0x2bb7c8283b782355875fa37d05e4bd962519ea294678a3dcf2fdffbbd0 How exactly does this work? -Since we know which event we are looking at here, we can simply convert the encoded bytecode to decoded data by decoding the bytecode according to it's datatype. +Since we know which event we are looking at here, we can simply convert the encoded bytecode to decoded data by decoding the bytecode according to its datatype. The structure for the `Transfer` event log of an ERC20 token will always be: @@ -139,6 +139,6 @@ It's not always easy for a human to understand what exactly is going on in these If you are not able to make sense of the data by just searching the tables, it usually helps to look at single transactions using the transaction hash and Etherscan. -Furthermore, actually going into the smart contracts code (our favorite way to do this is [DethCode](https://etherscan.deth.net)) to read the comments or the actual logic can help to understand the smart contract's emitted data. +Furthermore, actually going into the smart contract's code (our favorite way to do this is [DethCode](https://etherscan.deth.net)) to read the comments or the actual logic can help to understand the smart contract's emitted data. If that also doesn't lead to satisfactory results, scouring the relevant docs and GitHub of the project can lead you to the desired answers. Furthermore, talking to the developers and core community of a project can also help you to get an understanding of the smart contracts. diff --git a/data-catalog/evm/ethereum/decoded/traces-decoded.mdx b/data-catalog/evm/ethereum/decoded/traces-decoded.mdx index 58a25e02..943551cc 100644 --- a/data-catalog/evm/ethereum/decoded/traces-decoded.mdx +++ b/data-catalog/evm/ethereum/decoded/traces-decoded.mdx @@ -6,7 +6,7 @@ description: Description of the ethereum.traces_decoded table on Dune ## Table Description -The `traces_decoded` table contains decoded traces from Ethereum transactions. The table matches `MethodID`, which consists of the first 4 bytes of any eth call to the trace signature and the corresponding Method name. The table does not contain the full trace data and is not suitable for analysis of smart contract level data. For that, use the specific event tables as described in [Call-tables](/data-catalog/evm/ethereum/decoded/traces-decoded). +The `traces_decoded` table contains decoded traces from Ethereum transactions. The table matches `MethodID`, which consists of the first 4 bytes of any eth call to the trace signature and the corresponding Method name. The table does not contain the full trace data and is not suitable for analysis of smart contract level data. For that, use the specific event tables as described in [Call-tables](/data-catalog/evm/ethereum/decoded/call-tables). This table is great for gaining a high level understanding of the types of events that are being emitted by a smart contract or smart contracts of a certain protocol. From 6dae18ec7aafda173cd75b79fd7b3f643b868a18 Mon Sep 17 00:00:00 2001 From: Wilhelm Van Der Walt Date: Tue, 21 Oct 2025 02:37:41 +0100 Subject: [PATCH 07/36] Fix typos in chunk 17 (files 171-180) (#855) --- data-catalog/evm/berachain/raw/traces.mdx | 2 +- .../evm/blast/curated-data/dex/dex-aggregator-trades.mdx | 2 +- data-catalog/evm/blast/curated-data/dex/dex-trades.mdx | 4 ++-- data-catalog/evm/blast/curated-data/nft/nft-trades.mdx | 4 ++-- data-catalog/evm/blast/decoded/contracts.mdx | 2 +- data-catalog/evm/blast/overview.mdx | 2 +- .../evm/bnb/curated-data/dex/dex-aggregator-trades.mdx | 2 +- data-catalog/evm/bnb/curated-data/dex/dex-trades.mdx | 2 +- data-catalog/evm/bnb/curated-data/nft/nft-trades.mdx | 2 +- data-catalog/evm/bnb/decoded/contracts.mdx | 6 +++--- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/data-catalog/evm/berachain/raw/traces.mdx b/data-catalog/evm/berachain/raw/traces.mdx index 1693f5a6..8839f2e9 100644 --- a/data-catalog/evm/berachain/raw/traces.mdx +++ b/data-catalog/evm/berachain/raw/traces.mdx @@ -6,7 +6,7 @@ description: Description of the berachain.traces table on Dune ## Table Description -The `traces` table contains the traces of the transactions executed on the Ethereum Virtual Machine (EVM). It includes the traces of the transaction and the traces of the internal transactions. Traces are the result of the execution of the transaction and are used to debug and understand the execution of the transaction. They are also known as `internal transactions` and can be used to understand the execution of a transaction. +The `traces` table contains the traces of transactions executed on the Ethereum Virtual Machine (EVM). It includes the traces of the transaction and the traces of internal transactions. Traces are the result of transaction execution and are used to debug and understand transaction execution. They are also known as `internal transactions` and can be used to understand the execution of a transaction. This is the raw version of this table, for decoded transaction calls, see the [call tables](/data-catalog/evm/berachain/decoded/call-tables) section. diff --git a/data-catalog/evm/blast/curated-data/dex/dex-aggregator-trades.mdx b/data-catalog/evm/blast/curated-data/dex/dex-aggregator-trades.mdx index 7b7a36ca..28fdd5c1 100644 --- a/data-catalog/evm/blast/curated-data/dex/dex-aggregator-trades.mdx +++ b/data-catalog/evm/blast/curated-data/dex/dex-aggregator-trades.mdx @@ -7,7 +7,7 @@ description: Description of the Dex Aggregator Trades table for blast import { DexAggregatorTradesSnippet } from '/snippets/curated-data/dex/text/dex-aggregator-trades-snippet.mdx'; import { DexAggregatorCoverage } from "/snippets/curated-data/dex/embeds/dex-aggregator-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; \ No newline at end of file diff --git a/data-catalog/evm/blast/curated-data/dex/dex-trades.mdx b/data-catalog/evm/blast/curated-data/dex/dex-trades.mdx index 065a7230..53822da2 100644 --- a/data-catalog/evm/blast/curated-data/dex/dex-trades.mdx +++ b/data-catalog/evm/blast/curated-data/dex/dex-trades.mdx @@ -1,7 +1,7 @@ --- -title: dex.trades on blast +title: dex.trades on Blast sidebarTitle: Dex Trades -description: "The `dex.trades` table captures detailed data on decentralized exchange (DEX) trades, recording all raw trade events across various protocols on blast." +description: "The `dex.trades` table captures detailed data on decentralized exchange (DEX) trades, recording all raw trade events across various protocols on Blast." --- import { DexTradesSnippet } from '/snippets/curated-data/dex/text/dex-trades-snippet.mdx'; diff --git a/data-catalog/evm/blast/curated-data/nft/nft-trades.mdx b/data-catalog/evm/blast/curated-data/nft/nft-trades.mdx index b3c88d8d..0324fca8 100644 --- a/data-catalog/evm/blast/curated-data/nft/nft-trades.mdx +++ b/data-catalog/evm/blast/curated-data/nft/nft-trades.mdx @@ -1,7 +1,7 @@ --- -title: NFT.trades on blast +title: NFT.trades on Blast sidebarTitle: NFT Trades -description: "The `nft.trades` table captures detailed data on NFT marketplaces, recording all trade events across various protocols on blast." +description: "The `nft.trades` table captures detailed data on NFT marketplaces, recording all trade events across various protocols on Blast." --- import { NFTTradesSnippet } from '/snippets/curated-data/nft/text/nft-trades-snippet.mdx'; diff --git a/data-catalog/evm/blast/decoded/contracts.mdx b/data-catalog/evm/blast/decoded/contracts.mdx index b83cc405..f9999c40 100644 --- a/data-catalog/evm/blast/decoded/contracts.mdx +++ b/data-catalog/evm/blast/decoded/contracts.mdx @@ -4,7 +4,7 @@ sidebarTitle: "Decoded Contracts" description: Description of the blast.contracts table on Dune --- -import { ContractsSnippet } from '/snippets/evm/decoded/contracts-snippet.mdx'; +import { ContractsSnippet } from "/snippets/evm/decoded/contracts-snippet.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; import { TableSample } from "/snippets/table-sample.mdx"; diff --git a/data-catalog/evm/blast/overview.mdx b/data-catalog/evm/blast/overview.mdx index 471353ac..096cfcb7 100644 --- a/data-catalog/evm/blast/overview.mdx +++ b/data-catalog/evm/blast/overview.mdx @@ -21,7 +21,7 @@ Blast is an Ethereum Layer 2 (L2) that natively provides yield for ETH and stabl - **T-Bill Yield:** Users who bridge stablecoins receive USDB, Blast's auto-rebasing stablecoin. The yield for USDB comes from MakerDAO's on-chain T-Bill protocol. USDB can be redeemed for DAI when bridging back to Ethereum. In the future, the Blast community will have the power to supplement, or even fully replace, MakerDAO with Blast-native solutions or other third-party protocols. -- **Gas Revenue Sharing:** Other L2s keep revenue from gas fees for themselves. Blast gives net gas revenue back to Dapps programmatically. Dapps developers can keep this revenue for themselves or use it to subsidize gas fees for users. +- **Gas Revenue Sharing:** Other L2s keep revenue from gas fees for themselves. Blast gives net gas revenue back to dApps programmatically. dApps developers can keep this revenue for themselves or use it to subsidize gas fees for users. diff --git a/data-catalog/evm/bnb/curated-data/dex/dex-aggregator-trades.mdx b/data-catalog/evm/bnb/curated-data/dex/dex-aggregator-trades.mdx index 73b60caf..9fab7c6b 100644 --- a/data-catalog/evm/bnb/curated-data/dex/dex-aggregator-trades.mdx +++ b/data-catalog/evm/bnb/curated-data/dex/dex-aggregator-trades.mdx @@ -7,7 +7,7 @@ description: Description of the Dex Aggregator Trades table for bnb import { DexAggregatorTradesSnippet } from '/snippets/curated-data/dex/text/dex-aggregator-trades-snippet.mdx'; import { DexAggregatorCoverage } from "/snippets/curated-data/dex/embeds/dex-aggregator-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; \ No newline at end of file diff --git a/data-catalog/evm/bnb/curated-data/dex/dex-trades.mdx b/data-catalog/evm/bnb/curated-data/dex/dex-trades.mdx index 711a98e3..66d19314 100644 --- a/data-catalog/evm/bnb/curated-data/dex/dex-trades.mdx +++ b/data-catalog/evm/bnb/curated-data/dex/dex-trades.mdx @@ -7,6 +7,6 @@ description: "The `dex.trades` table captures detailed data on decentralized exc import { DexTradesSnippet } from '/snippets/curated-data/dex/text/dex-trades-snippet.mdx'; import { DexCoverage } from "/snippets/curated-data/dex/embeds/dex-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; \ No newline at end of file diff --git a/data-catalog/evm/bnb/curated-data/nft/nft-trades.mdx b/data-catalog/evm/bnb/curated-data/nft/nft-trades.mdx index 40c1c450..53d02a67 100644 --- a/data-catalog/evm/bnb/curated-data/nft/nft-trades.mdx +++ b/data-catalog/evm/bnb/curated-data/nft/nft-trades.mdx @@ -7,7 +7,7 @@ description: "The `nft.trades` table captures detailed data on NFT marketplaces, import { NFTTradesSnippet } from '/snippets/curated-data/nft/text/nft-trades-snippet.mdx'; import { NFTCoverage } from "/snippets/curated-data/nft/embeds/nft-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; diff --git a/data-catalog/evm/bnb/decoded/contracts.mdx b/data-catalog/evm/bnb/decoded/contracts.mdx index 1c4bcc20..af84d840 100644 --- a/data-catalog/evm/bnb/decoded/contracts.mdx +++ b/data-catalog/evm/bnb/decoded/contracts.mdx @@ -1,7 +1,7 @@ --- -title: base.contracts +title: bnb.contracts sidebarTitle: "Decoded Contracts" -description: Description of the base.contracts table on Dune +description: Description of the bnb.contracts table on Dune --- import { ContractsSnippet } from '/snippets/evm/decoded/contracts-snippet.mdx'; @@ -9,4 +9,4 @@ import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; import { TableSample } from "/snippets/table-sample.mdx"; - \ No newline at end of file + \ No newline at end of file From 60febced32bb208f555f1332cb76f3e67000ed73 Mon Sep 17 00:00:00 2001 From: Alessandro <74107105+los-xyz@users.noreply.github.com> Date: Tue, 21 Oct 2025 12:40:57 +0200 Subject: [PATCH 08/36] Update API introduction page (#868) - Update API overview documentation - Improve Data Management Endpoints section - Enhance API reference structure --- api-reference/overview/introduction.mdx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/api-reference/overview/introduction.mdx b/api-reference/overview/introduction.mdx index d70c2935..25383f8f 100644 --- a/api-reference/overview/introduction.mdx +++ b/api-reference/overview/introduction.mdx @@ -69,14 +69,6 @@ They help you upload and manage data on Dune. Upload data to Dune to create queryable tables. - - Integrate your blockchain data with Dune using dedicated API endpoints. (_Enterprise only_) - - ## Preset Endpoints These are curated endpoints built by Dune, ready for immediate use. No SQL required. Developers can use these endpoints to access data on popular topics. From 347d25a7ed442cc171344ebec5a3d19c7a757a53 Mon Sep 17 00:00:00 2001 From: Alessandro <74107105+los-xyz@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:46:43 +0200 Subject: [PATCH 09/36] Api introduction updates (#869) * Update API introduction page - Update API overview documentation - Improve Data Management Endpoints section - Enhance API reference structure * Additional updates to API introduction page - Further improvements to API documentation - Enhanced content structure and clarity --- api-reference/overview/introduction.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-reference/overview/introduction.mdx b/api-reference/overview/introduction.mdx index 25383f8f..91f7a5bb 100644 --- a/api-reference/overview/introduction.mdx +++ b/api-reference/overview/introduction.mdx @@ -60,7 +60,7 @@ They help you manage and execute queries, as well as fetch data from these queri ## Data Management Endpoints They help you upload and manage data on Dune. - + Upload data to Dune to create queryable tables. - + ## Preset Endpoints These are curated endpoints built by Dune, ready for immediate use. No SQL required. Developers can use these endpoints to access data on popular topics. From b679bac4795dfb4ef65cd73319df19570610f8ce Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Tue, 21 Oct 2025 16:13:52 -0400 Subject: [PATCH 10/36] Add contextual AI menu with ChatGPT, Claude, and Perplexity integration (#870) --- mint.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mint.json b/mint.json index 3269041c..527ced62 100644 --- a/mint.json +++ b/mint.json @@ -62,6 +62,15 @@ "url": "catalyst" } ], + "contextual": { + "options": [ + "copy", + "view", + "chatgpt", + "claude", + "perplexity" + ] + }, "navigation": [ { "group": "", From bd6ce0150f887ef5f1d029523cff1d2bce0f1cc7 Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Wed, 22 Oct 2025 08:35:10 -0400 Subject: [PATCH 11/36] Refactor: Use block_date instead of block_month for daily volumes (#875) Co-authored-by: Cursor Agent --- query-engine/writing-efficient-queries.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/query-engine/writing-efficient-queries.mdx b/query-engine/writing-efficient-queries.mdx index f35662b2..07f53ffa 100644 --- a/query-engine/writing-efficient-queries.mdx +++ b/query-engine/writing-efficient-queries.mdx @@ -92,13 +92,13 @@ Break complex queries into readable Common Table Expressions. -- ✅ GOOD: Using CTEs for better performance and readability WITH daily_volumes AS ( SELECT - block_month as trade_date, + block_date as trade_date, SUM(amount_usd) as daily_volume FROM dex.trades WHERE blockchain = 'ethereum' - AND block_month >= TIMESTAMP '2024-09-01' - AND block_month < TIMESTAMP '2024-10-01' - GROUP BY block_month + AND block_date >= TIMESTAMP '2024-09-01' + AND block_date < TIMESTAMP '2024-10-01' + GROUP BY block_date ), volume_metrics AS ( SELECT From 65de451d101cb457d5bc9e39daeba1cfd4b6542b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Pruvost?= Date: Wed, 22 Oct 2025 15:13:07 +0200 Subject: [PATCH 12/36] Document ASOF Joins (#867) * Document ASOF Joins * fixup! Document ASOF Joins --- mint.json | 1 + .../Functions-and-operators/asof-join.mdx | 142 ++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 query-engine/Functions-and-operators/asof-join.mdx diff --git a/mint.json b/mint.json index 527ced62..afb9c71b 100644 --- a/mint.json +++ b/mint.json @@ -168,6 +168,7 @@ "query-engine/Functions-and-operators/index", "query-engine/Functions-and-operators/aggregate", "query-engine/Functions-and-operators/array", + "query-engine/Functions-and-operators/asof-join", "query-engine/Functions-and-operators/base58", "query-engine/Functions-and-operators/binary", "query-engine/Functions-and-operators/bitwise", diff --git a/query-engine/Functions-and-operators/asof-join.mdx b/query-engine/Functions-and-operators/asof-join.mdx new file mode 100644 index 00000000..d410e604 --- /dev/null +++ b/query-engine/Functions-and-operators/asof-join.mdx @@ -0,0 +1,142 @@ +--- +title: ASOF JOIN +description: ASOF JOIN in DuneSQL performs nearest-neighbor matching using inequality predicates, making it ideal for temporal lookups like “latest price at trade time” or forward-fill balance snapshots. +--- + +## Overview + +ASOF JOIN in **DuneSQL** lets you join two relations based on the *closest matching row* according to an inequality in the `ON` clause - typically on a timestamp or sequence field. + +This is most useful when you need to: + +- Get the **latest price as of trade time** +- Forward-fill sparse **balance** or **config/state** tables +- Enrich dense time grids (e.g. hourly/daily) from sparse event data +- Tracking actions of an ENS across addresses over time. +- Tracking actions of EIP-7702 enabled wallets by the contract they authorized to. + +Unlike standard joins, **ASOF JOIN does not require exact equality** — it picks the *nearest valid match* according to your inequality condition. + + +ASOF JOIN executes entirely at query time — it does not pre-materialize or store any helper tables. It is a runtime join optimized in the DuneSQL engine. + + +## Syntax + +```sql +SELECT ... +FROM left_relation +ASOF [ LEFT ] JOIN right_relation + ON AND +``` + +## Rules +- **Exactly one inequality is required**, comparing a **right-side expression to a left-side expression** using <, <=, >, or >=. +- **Any number of equality predicates** (left.sym = right.sym) are allowed and encouraged. +- **ASOF JOIN** returns only matched left rows (like INNER JOIN). +- **ASOF LEFT JOIN** returns all left rows and fills NULL when no neighbor exists. + + +Typically, expressions compare timestamps: e.g. prices.ts <= trades.ts will pick the latest price at or before the trade. + + +## Example +#### Dune's ETH balances over time +```sql +select + d.timestamp, + b.balance +from utils.days d +asof join tokens_ethereum.balances b +on b.address = 0x7058decc644317062f90525f4C1489AaF456e6B3 --dune.eth + and b.token_standard = 'native' -- native ETH + and b.block_time <= d.timestamp -- ASOF JOIN condition +``` + +``` +-- output +-- output +2024-01-01 10:00:00 1.02 +2024-01-01 10:05:00 NULL +``` + +#### Latest price at trade time +```sql +WITH + trades(ts, sym) AS (VALUES + (TIMESTAMP '2024-01-01 09:30:05', 'ABC'), + (TIMESTAMP '2024-01-01 09:30:07', 'ABC') + ), + quotes(ts, sym, price) AS (VALUES + (TIMESTAMP '2024-01-01 09:30:00', 'ABC', 100.0), + (TIMESTAMP '2024-01-01 09:30:06', 'ABC', 101.5) + ) +SELECT trades.ts, quotes.price +FROM trades +ASOF JOIN quotes ON trades.sym = quotes.sym AND quotes.ts <= trades.ts +ORDER BY 1 +``` + +``` +-- output +2024-01-01 09:30:05 100.0 +2024-01-01 09:30:07 101.5 +``` + +#### Forward-fill with ASOF LEFT JOIN +```sql +WITH + readings(read_time) AS ( + VALUES (TIMESTAMP '2024-01-01 10:00:00'), + (TIMESTAMP '2024-01-01 10:05:00') + ), + calibrations(effective_time, factor) AS ( + VALUES (TIMESTAMP '2024-01-01 10:01:00', 1.02) + ) +SELECT readings.read_time, calibrations.factor +FROM readings ASOF LEFT JOIN calibrations + ON calibrations.effective_time >= readings.read_time +ORDER BY 1 +``` + +``` +-- output +-- output +2024-01-01 10:00:00 1.02 +2024-01-01 10:05:00 NULL +``` + +## Performance +ASOF JOIN consistently outperforms LEAD() + range joins for large temporal enrichments. +Below is a rounded summary from production-scale testing (millions of rows): + + + +ASOF JOIN combines **cleaner SQL** and **runtime performance gains** when data is sparse or when “nearest match” logic is required. + + +## When to use ASOF JOIN +**✅ Recommended when:** +- You need a point-in-time snapshot (latest state, price, config) +- You are forward-filling sparse events into a regular time spine +- Data is sparse or high-cardinality (wallet balances, token prices) + +**⚠️ Consider alternatives when:** +- You just need window aggregates (e.g. moving averages) → use window functions +- You already materialize reusable helper tables with valid ranges → consider pre-filled models + +## Limitations +- **Exactly one inequality** is required in the ON clause. +- Joins based on multiple inequalities are not supported — add extra conditions via equality or `WHERE`. + +## Best Practices +- **Always constrain with equality first** (token, address, etc.) to avoid scanning irrelevant rows. +- Use `ASOF LEFT` when you need to preserve all left rows, even if no match exists. +- Prefer `<=` or `>=` for clear open/closed interval intent. +- Document the direction, as inequality can compare from right to left or from left to right (e.g., right.ts <= left.ts or left.ts >= right.ts): + - `<=` → “most recent up to this timestamp” (historical lookup) + - `>=` → “next upcoming record” (future-effective lookup) + + +Think in terms of **“as of X, what was true?”** — that’s the strongest signal that ASOF JOIN is appropriate. + \ No newline at end of file From abd7bd0cea5aaf8e84c3e60a3d354fa8e423f30f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Pruvost?= Date: Wed, 22 Oct 2025 15:56:39 +0200 Subject: [PATCH 13/36] Adds ASOF JOIN to functions and keywords (#876) Adds the ASOF JOIN function and its variants to the list of available functions and reserved keywords, improving discoverability and clarity for users. --- query-engine/Functions-and-operators/asof-join.mdx | 12 +++++------- query-engine/Functions-and-operators/index.mdx | 3 ++- query-engine/reserved-keywords.mdx | 1 + 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/query-engine/Functions-and-operators/asof-join.mdx b/query-engine/Functions-and-operators/asof-join.mdx index d410e604..cbdd7c98 100644 --- a/query-engine/Functions-and-operators/asof-join.mdx +++ b/query-engine/Functions-and-operators/asof-join.mdx @@ -1,6 +1,6 @@ --- -title: ASOF JOIN -description: ASOF JOIN in DuneSQL performs nearest-neighbor matching using inequality predicates, making it ideal for temporal lookups like “latest price at trade time” or forward-fill balance snapshots. +title: ASOF Join +description: ASOF JOIN in DuneSQL performs nearest-neighbor matching using inequality predicates, making it ideal for temporal lookups like "latest price at trade time" or forward-fill balance snapshots. --- ## Overview @@ -31,13 +31,13 @@ ASOF [ LEFT ] JOIN right_relation ``` ## Rules -- **Exactly one inequality is required**, comparing a **right-side expression to a left-side expression** using <, <=, >, or >=. +- **Exactly one inequality is required**, comparing a **right-side expression to a left-side expression** using `<`, `<=`, `>`, or `>=`. - **Any number of equality predicates** (left.sym = right.sym) are allowed and encouraged. - **ASOF JOIN** returns only matched left rows (like INNER JOIN). - **ASOF LEFT JOIN** returns all left rows and fills NULL when no neighbor exists. -Typically, expressions compare timestamps: e.g. prices.ts <= trades.ts will pick the latest price at or before the trade. +Typically, expressions compare timestamps: e.g. `prices.ts <= trades.ts` will pick the latest price at or before the trade. ## Example @@ -55,7 +55,6 @@ on b.address = 0x7058decc644317062f90525f4C1489AaF456e6B3 --dune.eth ``` -- output --- output 2024-01-01 10:00:00 1.02 2024-01-01 10:05:00 NULL ``` @@ -101,7 +100,6 @@ ORDER BY 1 ``` -- output --- output 2024-01-01 10:00:00 1.02 2024-01-01 10:05:00 NULL ``` @@ -133,7 +131,7 @@ ASOF JOIN combines **cleaner SQL** and **runtime performance gains** when data i - **Always constrain with equality first** (token, address, etc.) to avoid scanning irrelevant rows. - Use `ASOF LEFT` when you need to preserve all left rows, even if no match exists. - Prefer `<=` or `>=` for clear open/closed interval intent. -- Document the direction, as inequality can compare from right to left or from left to right (e.g., right.ts <= left.ts or left.ts >= right.ts): +- Document the direction, as inequality can compare from right to left or from left to right (e.g., `right.ts <= left.ts` or `left.ts >= right.ts`): - `<=` → “most recent up to this timestamp” (historical lookup) - `>=` → “next upcoming record” (future-effective lookup) diff --git a/query-engine/Functions-and-operators/index.mdx b/query-engine/Functions-and-operators/index.mdx index 3528f43e..bc48fdaa 100644 --- a/query-engine/Functions-and-operators/index.mdx +++ b/query-engine/Functions-and-operators/index.mdx @@ -8,7 +8,7 @@ This chapter describes the built-in SQL functions and operators supported by Tri Using ``SHOW FUNCTIONS`` in the query editor returns a list of all available functions, including custom functions, with all supported arguments and a short description. -### DuneSQL Added Functions: +### DuneSQL Added Functions and Operators: - [Varbinary datatypes for EVM data](/query-engine/Functions-and-operators/varbinary) - [Base58 for Bitcoin&Solana data](/query-engine/Functions-and-operators/base58) - [ss58 for Substrate data](/query-engine/Functions-and-operators/ss58) @@ -16,6 +16,7 @@ Using ``SHOW FUNCTIONS`` in the query editor returns a list of all available fun - [Chain Utility Functions](/query-engine/Functions-and-operators/chain-utility-functions) - [Varchar Utility Functions](/query-engine/Functions-and-operators/varchar-utility-functions) - [LiveFetch Functions](/query-engine/Functions-and-operators/live-fetch) +- [ASOF Join](/query-engine/Functions-and-operators/asof-join) ### Trino Base Functions: - [Aggregate](/query-engine/Functions-and-operators/aggregate) diff --git a/query-engine/reserved-keywords.mdx b/query-engine/reserved-keywords.mdx index ee5fb0f2..c922420c 100644 --- a/query-engine/reserved-keywords.mdx +++ b/query-engine/reserved-keywords.mdx @@ -16,6 +16,7 @@ where "from" = 0xc8ebccc5f5689fa8659d83713341e5ad19349448 | `ALTER` | reserved | | `AND` | reserved | | `AS` | reserved | +| `ASOF` | reserved | | `BETWEEN` | reserved | | `BY` | reserved | | `CASE` | reserved | From b4f5a32b226313766096234d0e68884621fa0fd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bel=C3=A9n=20Pruvost?= Date: Wed, 22 Oct 2025 17:33:28 +0200 Subject: [PATCH 14/36] Link to queries on dune (#877) * Link to queries on dune * Fix outputs --- .../Functions-and-operators/asof-join.mdx | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/query-engine/Functions-and-operators/asof-join.mdx b/query-engine/Functions-and-operators/asof-join.mdx index cbdd7c98..0b07b4da 100644 --- a/query-engine/Functions-and-operators/asof-join.mdx +++ b/query-engine/Functions-and-operators/asof-join.mdx @@ -42,6 +42,8 @@ Typically, expressions compare timestamps: e.g. `prices.ts <= trades.ts` will pi ## Example #### Dune's ETH balances over time +[See query on dune.com](https://dune.com/queries/6015716). + ```sql select d.timestamp, @@ -55,11 +57,15 @@ on b.address = 0x7058decc644317062f90525f4C1489AaF456e6B3 --dune.eth ``` -- output -2024-01-01 10:00:00 1.02 -2024-01-01 10:05:00 NULL +| timestamp | balance | +| ------------------------ | --------------------- | +| 2020-02-27 00:00 | 0.006315391776612467 | +| 2020-02-28 00:00 | 0.006315391776612467 | + ``` #### Latest price at trade time +[See query on dune.com](https://dune.com/queries/6015749). ```sql WITH trades(ts, sym) AS (VALUES @@ -78,11 +84,15 @@ ORDER BY 1 ``` -- output -2024-01-01 09:30:05 100.0 -2024-01-01 09:30:07 101.5 +| ts | price | +| ------------------------ | --------------------- | +| 2024-01-01 09:30:05 | 100.0 | +| 2024-01-01 09:30:07 | 101.5 | ``` #### Forward-fill with ASOF LEFT JOIN +[See query on dune.com](https://dune.com/queries/6015744). + ```sql WITH readings(read_time) AS ( @@ -100,8 +110,10 @@ ORDER BY 1 ``` -- output -2024-01-01 10:00:00 1.02 -2024-01-01 10:05:00 NULL +| read_time | factor | +| ------------------------ | --------------------- | +| 2024-01-01 10:00:00 | 1.02 | +| 2024-01-01 10:05:00 | NULL | ``` ## Performance From 76591ed1307af4622b29c7ae39d9d95c3c91d6f1 Mon Sep 17 00:00:00 2001 From: Norbert Durcansky Date: Thu, 23 Oct 2025 14:28:07 +0200 Subject: [PATCH 15/36] Update openapi schema name (#879) --- .gitignore | 1 + go-openapi.json => analytics-openapi.json | 0 2 files changed, 1 insertion(+) create mode 100644 .gitignore rename go-openapi.json => analytics-openapi.json (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..485dee64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/go-openapi.json b/analytics-openapi.json similarity index 100% rename from go-openapi.json rename to analytics-openapi.json From 91140080746925c4a7e9957f24f220480be819ef Mon Sep 17 00:00:00 2001 From: Wilhelm Van Der Walt Date: Thu, 23 Oct 2025 16:46:37 +0100 Subject: [PATCH 16/36] Fix typos in chunk 19 (files 191-200) (#857) --- data-catalog/evm/boba/raw/logs.mdx | 2 +- .../evm/celo/curated-data/dex/dex-aggregator-trades.mdx | 4 ++-- data-catalog/evm/celo/curated-data/dex/dex-trades.mdx | 4 ++-- data-catalog/evm/celo/curated-data/nft/nft-trades.mdx | 4 ++-- data-catalog/evm/celo/decoded/overview.mdx | 2 +- data-catalog/evm/celo/decoded/traces-decoded.mdx | 6 +++--- data-catalog/evm/celo/overview.mdx | 2 +- .../evm/corn/curated-data/dex/dex-aggregator-trades.mdx | 2 +- data-catalog/evm/corn/curated-data/dex/dex-trades.mdx | 2 +- data-catalog/evm/corn/curated-data/nft/nft-trades.mdx | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/data-catalog/evm/boba/raw/logs.mdx b/data-catalog/evm/boba/raw/logs.mdx index 12cb5bf1..e971185a 100644 --- a/data-catalog/evm/boba/raw/logs.mdx +++ b/data-catalog/evm/boba/raw/logs.mdx @@ -4,7 +4,7 @@ sidebarTitle: "Logs" description: Description of the boba.logs table on Dune --- -import { LogsSnippet } from '/snippets/evm/raw/logs-snippet.mdx'; +import { LogsSnippet } from "/snippets/evm/raw/logs-snippet.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; import { TableSample } from "/snippets/table-sample.mdx"; diff --git a/data-catalog/evm/celo/curated-data/dex/dex-aggregator-trades.mdx b/data-catalog/evm/celo/curated-data/dex/dex-aggregator-trades.mdx index 0741856a..3976f317 100644 --- a/data-catalog/evm/celo/curated-data/dex/dex-aggregator-trades.mdx +++ b/data-catalog/evm/celo/curated-data/dex/dex-aggregator-trades.mdx @@ -1,7 +1,7 @@ --- -title: dex_aggregator.trades on celo +title: dex_aggregator.trades on Celo sidebarTitle: Aggregator Trades -description: Description of the Dex Aggregator Trades table for celo +description: Description of the DEX Aggregator Trades table for Celo --- import { DexAggregatorTradesSnippet } from '/snippets/curated-data/dex/text/dex-aggregator-trades-snippet.mdx'; diff --git a/data-catalog/evm/celo/curated-data/dex/dex-trades.mdx b/data-catalog/evm/celo/curated-data/dex/dex-trades.mdx index 205ce214..96636176 100644 --- a/data-catalog/evm/celo/curated-data/dex/dex-trades.mdx +++ b/data-catalog/evm/celo/curated-data/dex/dex-trades.mdx @@ -1,7 +1,7 @@ --- -title: dex.trades on celo +title: dex.trades on Celo sidebarTitle: Dex Trades -description: "The `dex.trades` table captures detailed data on decentralized exchange (DEX) trades, recording all raw trade events across various protocols on celo." +description: "The `dex.trades` table captures detailed data on decentralized exchange (DEX) trades, recording all raw trade events across various protocols on Celo." --- import { DexTradesSnippet } from '/snippets/curated-data/dex/text/dex-trades-snippet.mdx'; diff --git a/data-catalog/evm/celo/curated-data/nft/nft-trades.mdx b/data-catalog/evm/celo/curated-data/nft/nft-trades.mdx index 8b4fc889..c8be4d1a 100644 --- a/data-catalog/evm/celo/curated-data/nft/nft-trades.mdx +++ b/data-catalog/evm/celo/curated-data/nft/nft-trades.mdx @@ -1,7 +1,7 @@ --- -title: NFT.trades on celo +title: NFT.trades on Celo sidebarTitle: NFT Trades -description: "The `nft.trades` table captures detailed data on NFT marketplaces, recording all trade events across various protocols on celo." +description: "The `nft.trades` table captures detailed data on NFT marketplaces, recording all trade events across various protocols on Celo." --- import { NFTTradesSnippet } from '/snippets/curated-data/nft/text/nft-trades-snippet.mdx'; diff --git a/data-catalog/evm/celo/decoded/overview.mdx b/data-catalog/evm/celo/decoded/overview.mdx index 757b040a..5ebd0f18 100644 --- a/data-catalog/evm/celo/decoded/overview.mdx +++ b/data-catalog/evm/celo/decoded/overview.mdx @@ -7,4 +7,4 @@ icon: "star" import { OverviewDecodedDataApproach } from "/snippets/evm/decoded/decoded-overview-snippet.mdx" import { DuneEmbed } from '/snippets/dune-embed.mdx' - \ No newline at end of file + \ No newline at end of file diff --git a/data-catalog/evm/celo/decoded/traces-decoded.mdx b/data-catalog/evm/celo/decoded/traces-decoded.mdx index 0cc06431..161586ca 100644 --- a/data-catalog/evm/celo/decoded/traces-decoded.mdx +++ b/data-catalog/evm/celo/decoded/traces-decoded.mdx @@ -1,7 +1,7 @@ --- -title: v.traces_decoded +title: celo.traces_decoded sidebarTitle: "Decoded Traces" -description: Description of the ethereum.traces_decoded table on Dune +description: Description of the celo.traces_decoded table on Dune --- import { TracesDecodedSnippet } from '/snippets/evm/decoded/traces-decoded-snippet.mdx'; @@ -9,4 +9,4 @@ import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; import { TableSample } from "/snippets/table-sample.mdx"; - \ No newline at end of file + \ No newline at end of file diff --git a/data-catalog/evm/celo/overview.mdx b/data-catalog/evm/celo/overview.mdx index 4438db14..d6b7f32b 100644 --- a/data-catalog/evm/celo/overview.mdx +++ b/data-catalog/evm/celo/overview.mdx @@ -36,7 +36,7 @@ Celo extends the reach of DeFi applications by enabling a suite of decentralized Extensive transaction data, showcasing the efficiency and user engagement across the network. - + Decoded transaction data for better analysis and understanding of contract executions on Celo. diff --git a/data-catalog/evm/corn/curated-data/dex/dex-aggregator-trades.mdx b/data-catalog/evm/corn/curated-data/dex/dex-aggregator-trades.mdx index 7526f246..9c484e54 100644 --- a/data-catalog/evm/corn/curated-data/dex/dex-aggregator-trades.mdx +++ b/data-catalog/evm/corn/curated-data/dex/dex-aggregator-trades.mdx @@ -7,7 +7,7 @@ description: Description of the Dex Aggregator Trades table for corn import { DexAggregatorTradesSnippet } from '/snippets/curated-data/dex/text/dex-aggregator-trades-snippet.mdx'; import { DexAggregatorCoverage } from "/snippets/curated-data/dex/embeds/dex-aggregator-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; \ No newline at end of file diff --git a/data-catalog/evm/corn/curated-data/dex/dex-trades.mdx b/data-catalog/evm/corn/curated-data/dex/dex-trades.mdx index 1dc7d374..1be45a74 100644 --- a/data-catalog/evm/corn/curated-data/dex/dex-trades.mdx +++ b/data-catalog/evm/corn/curated-data/dex/dex-trades.mdx @@ -7,6 +7,6 @@ description: "The `dex.trades` table captures detailed data on decentralized exc import { DexTradesSnippet } from '/snippets/curated-data/dex/text/dex-trades-snippet.mdx'; import { DexCoverage } from "/snippets/curated-data/dex/embeds/dex-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; \ No newline at end of file diff --git a/data-catalog/evm/corn/curated-data/nft/nft-trades.mdx b/data-catalog/evm/corn/curated-data/nft/nft-trades.mdx index 7c2d9326..4bb9c42f 100644 --- a/data-catalog/evm/corn/curated-data/nft/nft-trades.mdx +++ b/data-catalog/evm/corn/curated-data/nft/nft-trades.mdx @@ -7,7 +7,7 @@ description: "The `nft.trades` table captures detailed data on NFT marketplaces, import { NFTTradesSnippet } from '/snippets/curated-data/nft/text/nft-trades-snippet.mdx'; import { NFTCoverage } from "/snippets/curated-data/nft/embeds/nft-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; From c40301f32e5a9f07e4372e2225267cc27dde9e7e Mon Sep 17 00:00:00 2001 From: Wilhelm Van Der Walt Date: Thu, 23 Oct 2025 16:46:53 +0100 Subject: [PATCH 17/36] Fix typos in chunk 18 (files 181-190) (#856) --- data-catalog/evm/bnb/decoded/event-logs.mdx | 4 ++-- data-catalog/evm/bnb/decoded/logs-decoded.mdx | 6 +++--- data-catalog/evm/bnb/decoded/overview.mdx | 2 +- data-catalog/evm/bnb/decoded/traces-decoded.mdx | 6 +++--- data-catalog/evm/bnb/overview.mdx | 2 +- data-catalog/evm/bob/overview.mdx | 2 +- .../evm/boba/curated-data/dex/dex-aggregator-trades.mdx | 2 +- data-catalog/evm/boba/curated-data/dex/dex-trades.mdx | 2 +- data-catalog/evm/boba/curated-data/nft/nft-trades.mdx | 4 ++-- data-catalog/evm/boba/decoded/overview.mdx | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/data-catalog/evm/bnb/decoded/event-logs.mdx b/data-catalog/evm/bnb/decoded/event-logs.mdx index b508fb2d..1cd25a33 100644 --- a/data-catalog/evm/bnb/decoded/event-logs.mdx +++ b/data-catalog/evm/bnb/decoded/event-logs.mdx @@ -1,6 +1,6 @@ --- -title: Event Logs - Bnb -description: Smart contracts on Bnb emit event logs when certain predefined actions are completed. +title: Event Logs - BNB +description: Smart contracts on BNB emit event logs when certain predefined actions are completed. --- import EventLogs from '/snippets/evm/decoded/event-logs-snippet.mdx' diff --git a/data-catalog/evm/bnb/decoded/logs-decoded.mdx b/data-catalog/evm/bnb/decoded/logs-decoded.mdx index da692b78..df3e9a19 100644 --- a/data-catalog/evm/bnb/decoded/logs-decoded.mdx +++ b/data-catalog/evm/bnb/decoded/logs-decoded.mdx @@ -1,7 +1,7 @@ --- -title: base.logs_decoded +title: bnb.logs_decoded sidebarTitle: "Decoded Logs" -description: Description of the base.logs_decoded table on Dune +description: Description of the bnb.logs_decoded table on Dune --- import { LogsDecodedSnippet } from '/snippets/evm/decoded/logs-decoded-snippet.mdx'; @@ -9,4 +9,4 @@ import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; import { TableSample } from "/snippets/table-sample.mdx"; - \ No newline at end of file + \ No newline at end of file diff --git a/data-catalog/evm/bnb/decoded/overview.mdx b/data-catalog/evm/bnb/decoded/overview.mdx index bf7b9d1f..a0392be7 100644 --- a/data-catalog/evm/bnb/decoded/overview.mdx +++ b/data-catalog/evm/bnb/decoded/overview.mdx @@ -7,4 +7,4 @@ icon: "star" import { OverviewDecodedDataApproach } from "/snippets/evm/decoded/decoded-overview-snippet.mdx" import { DuneEmbed } from '/snippets/dune-embed.mdx' - \ No newline at end of file + \ No newline at end of file diff --git a/data-catalog/evm/bnb/decoded/traces-decoded.mdx b/data-catalog/evm/bnb/decoded/traces-decoded.mdx index 6c7167a7..6ab81f8e 100644 --- a/data-catalog/evm/bnb/decoded/traces-decoded.mdx +++ b/data-catalog/evm/bnb/decoded/traces-decoded.mdx @@ -1,7 +1,7 @@ --- -title: base.traces_decoded +title: bnb.traces_decoded sidebarTitle: "Decoded Traces" -description: Description of the base.traces_decoded table on Dune +description: Description of the bnb.traces_decoded table on Dune --- import { TracesDecodedSnippet } from '/snippets/evm/decoded/traces-decoded-snippet.mdx'; @@ -9,4 +9,4 @@ import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; import { TableSample } from "/snippets/table-sample.mdx"; - \ No newline at end of file + \ No newline at end of file diff --git a/data-catalog/evm/bnb/overview.mdx b/data-catalog/evm/bnb/overview.mdx index 8f0c2240..c3f9abf6 100644 --- a/data-catalog/evm/bnb/overview.mdx +++ b/data-catalog/evm/bnb/overview.mdx @@ -36,7 +36,7 @@ BNB Chain benefits from the strong community support and the extensive ecosystem Detailed information on transactions, illustrating operational efficiency and execution on the network. - + Decoded transaction data for easier analysis and better understanding of smart contract executions. diff --git a/data-catalog/evm/bob/overview.mdx b/data-catalog/evm/bob/overview.mdx index bace30fc..188e4d6d 100644 --- a/data-catalog/evm/bob/overview.mdx +++ b/data-catalog/evm/bob/overview.mdx @@ -59,6 +59,6 @@ BOB’s hybrid L2 design will be launched in multiple stages: Extensive transaction data, showcasing the efficiency and execution of operations on BOB. - Enhanced transaction data, including internal transactions invoked by top level transactions. + Enhanced transaction data, including internal transactions invoked by top-level transactions. diff --git a/data-catalog/evm/boba/curated-data/dex/dex-aggregator-trades.mdx b/data-catalog/evm/boba/curated-data/dex/dex-aggregator-trades.mdx index 23242c2b..91365a49 100644 --- a/data-catalog/evm/boba/curated-data/dex/dex-aggregator-trades.mdx +++ b/data-catalog/evm/boba/curated-data/dex/dex-aggregator-trades.mdx @@ -7,7 +7,7 @@ description: Description of the Dex Aggregator Trades table for boba import { DexAggregatorTradesSnippet } from '/snippets/curated-data/dex/text/dex-aggregator-trades-snippet.mdx'; import { DexAggregatorCoverage } from "/snippets/curated-data/dex/embeds/dex-aggregator-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; \ No newline at end of file diff --git a/data-catalog/evm/boba/curated-data/dex/dex-trades.mdx b/data-catalog/evm/boba/curated-data/dex/dex-trades.mdx index 9bba0a79..c1e11da7 100644 --- a/data-catalog/evm/boba/curated-data/dex/dex-trades.mdx +++ b/data-catalog/evm/boba/curated-data/dex/dex-trades.mdx @@ -7,6 +7,6 @@ description: "The `dex.trades` table captures detailed data on decentralized exc import { DexTradesSnippet } from '/snippets/curated-data/dex/text/dex-trades-snippet.mdx'; import { DexCoverage } from "/snippets/curated-data/dex/embeds/dex-coverage.mdx"; import { ColumnDescriptions } from "/snippets/column-descriptions.mdx"; -import { TableSampleParam} from "/snippets/table-sample-with-param.mdx"; +import { TableSampleParam } from "/snippets/table-sample-with-param.mdx"; \ No newline at end of file diff --git a/data-catalog/evm/boba/curated-data/nft/nft-trades.mdx b/data-catalog/evm/boba/curated-data/nft/nft-trades.mdx index 2bf7129b..4b8d75c5 100644 --- a/data-catalog/evm/boba/curated-data/nft/nft-trades.mdx +++ b/data-catalog/evm/boba/curated-data/nft/nft-trades.mdx @@ -1,7 +1,7 @@ --- -title: NFT.trades on boba +title: NFT.trades on Boba sidebarTitle: NFT Trades -description: "The `nft.trades` table captures detailed data on NFT marketplaces, recording all trade events across various protocols on boba." +description: "The `nft.trades` table captures detailed data on NFT marketplaces, recording all trade events across various protocols on Boba." --- import { NFTTradesSnippet } from '/snippets/curated-data/nft/text/nft-trades-snippet.mdx'; diff --git a/data-catalog/evm/boba/decoded/overview.mdx b/data-catalog/evm/boba/decoded/overview.mdx index 833f88f9..4a670f2a 100644 --- a/data-catalog/evm/boba/decoded/overview.mdx +++ b/data-catalog/evm/boba/decoded/overview.mdx @@ -7,4 +7,4 @@ icon: "star" import { OverviewDecodedDataApproach } from "/snippets/evm/decoded/decoded-overview-snippet.mdx" import { DuneEmbed } from '/snippets/dune-embed.mdx' - \ No newline at end of file + \ No newline at end of file From 5963a66883f603f746e4c833a90993c3ab2e0fd5 Mon Sep 17 00:00:00 2001 From: dune-eng <77401252+dune-eng@users.noreply.github.com> Date: Fri, 24 Oct 2025 14:39:41 +0200 Subject: [PATCH 18/36] [Automated] Update OpenAPI specifications (#880) Co-authored-by: norbertdurcansk <8441949+norbertdurcansk@users.noreply.github.com> --- analytics-openapi.json | 377 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 377 insertions(+) diff --git a/analytics-openapi.json b/analytics-openapi.json index b80ae14d..189b0541 100644 --- a/analytics-openapi.json +++ b/analytics-openapi.json @@ -1035,6 +1035,193 @@ } } }, + "/v1/endpoints/{handle}/{endpoint_slug}/results": { + "get": { + "summary": "Custom Endpoints", + "description": "Create custom API endpoints from Dune queries", + "parameters": [ + { + "name": "X-Dune-Api-Key", + "in": "header", + "description": "API Key for the service", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "api_key", + "in": "query", + "description": "API Key, alternative to using the HTTP header X-Dune-Api-Key", + "schema": { + "type": "string" + } + }, + { + "name": "handle", + "in": "path", + "description": "Your user or team handle", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "endpoint_slug", + "in": "path", + "description": "The name of the endpoint as slug", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "allow_partial_results", + "in": "query", + "description": "This enables returning a query result that was too large and only a partial result is\navailable. By default allow_partial_results is set to false and a failed state is returned.", + "schema": { + "type": "boolean" + } + }, + { + "name": "columns", + "in": "query", + "description": "Specifies a comma-separated list of column names to return. If omitted, all columns are included.\nTip: use this to limit the result to specific columns, reducing datapoints cost of the call.", + "schema": { + "type": "string" + } + }, + { + "name": "filters", + "in": "query", + "description": "Expression to filter out rows from the results to return. This expression is similar to\na SQL WHERE clause. More details about it in the Filtering section of the doc.\nThis parameter is incompatible with sample_count.", + "schema": { + "type": "string" + } + }, + { + "name": "ignore_max_datapoints_per_request", + "in": "query", + "description": "There is a default 250,000 datapoints limit to make sure you don't accidentally spend all\nyour credits in one call. To ignore the max limit, you can add\nignore_max_datapoints_per_request=true", + "schema": { + "type": "boolean" + } + }, + { + "name": "limit", + "in": "query", + "description": "Limit number of rows to return. This together with 'offset' allows easy pagination through\nresults in an incremental and efficient way. This parameter is incompatible\nwith sampling (sample_count).", + "schema": { + "type": "integer" + } + }, + { + "name": "offset", + "in": "query", + "description": "Offset row number to start (inclusive, first row means offset=0) returning results\nfrom. This together with 'limit' allows easy pagination through results in an\nincremental and efficient way. This parameter is incompatible with sampling (sample_count).", + "schema": { + "type": "integer" + } + }, + { + "name": "queryID", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "sample_count", + "in": "query", + "description": "Number of rows to return from the result by sampling the data. This is useful when you\nwant to get a uniform sample instead of the entire result. If the result has less\nthan the sample count, the entire result is returned. Note that this will return a\nrandomized sample, so not every call will return the same result. This parameter is\nincompatible with `offset`, `limit`, and `filters` parameters.", + "schema": { + "type": "integer" + } + }, + { + "name": "sort_by", + "in": "query", + "description": "Expression to define the order in which the results should be returned. This expression\nis similar to a SQL ORDER BY clause. More details about it in the Sorting section of the doc.", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ReadExecutionResultResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error400" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error401" + } + } + } + }, + "402": { + "description": "Payment Required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error402" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error403" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error404" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error500" + } + } + } + } + } + } + }, "/v1/execution/{execution_id}/cancel": { "post": { "summary": "Cancel a triggered execution request given the execution ID", @@ -3968,6 +4155,127 @@ } } }, + "/v1/sql/execute": { + "post": { + "summary": "Execute raw SQL query", + "description": "Execute raw SQL query without requiring a stored query ID", + "parameters": [ + { + "name": "X-Dune-Api-Key", + "in": "header", + "description": "API Key for the service", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "api_key", + "in": "query", + "description": "Alternative to using the X-Dune-Api-Key header", + "schema": { + "type": "string" + } + }, + { + "name": "performance", + "in": "query", + "description": "The performance engine tier the execution will be run on. Can be either `medium` or `large`. Medium consumes 10 credits, and large consumes 20 credits, per run. Default is `medium`.", + "schema": { + "type": "string", + "enum": [ + "medium", + "large" + ] + } + } + ], + "requestBody": { + "description": "Raw SQL query to execute", + "content": { + "*/*": { + "schema": { + "type": "string" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.ExecuteQueryResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error400" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error401" + } + } + } + }, + "402": { + "description": "Payment Required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error402" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error403" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error404" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error500" + } + } + } + } + }, + "x-codegen-request-body-name": "sql" + } + }, "/v1/table/upload/csv": { "post": { "summary": "Upload CSV", @@ -4712,6 +5020,9 @@ "cron_expression": { "type": "string" }, + "expires_at": { + "type": "string" + }, "is_private": { "type": "boolean" }, @@ -4985,6 +5296,19 @@ "description": "Timestamp of when the query execution was cancelled, if applicable.", "example": "2024-12-20T11:04:18.724658237Z" }, + "error": { + "type": "object", + "description": "In case the execution had an error, this object will contain the error details", + "allOf": [ + { + "$ref": "#/components/schemas/models.QueryResultError" + } + ] + }, + "execution_cost_credits": { + "type": "number", + "description": "Cost of the execution" + }, "execution_ended_at": { "type": "string", "description": "Timestamp of when the query execution ended.", @@ -5175,6 +5499,34 @@ "items": { "$ref": "#/components/schemas/models.Row" } + }, + "update_type": { + "type": "string", + "description": "The type of update operation from Trino (e.g., \"SET SESSION\")" + } + } + }, + "models.QueryResultError": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "A descriptive message about the error.", + "example": "Error: Line 1:1: mismatched input 'selecdt'" + }, + "metadata": { + "type": "object", + "description": "Metadata about the syntax error that occurred, if applicable.", + "allOf": [ + { + "$ref": "#/components/schemas/models.SyntaxErrorMetadata" + } + ] + }, + "type": { + "type": "string", + "description": "The type of error that occurred.", + "example": "syntax_error" } } }, @@ -5186,6 +5538,15 @@ "description": "Timestamp of when the query execution was cancelled, if applicable.", "example": "2024-12-20T11:04:18.724658237Z" }, + "error": { + "type": "object", + "description": "In case the execution had an error, this object will contain the error details", + "allOf": [ + { + "$ref": "#/components/schemas/models.QueryResultError" + } + ] + }, "execution_ended_at": { "type": "string", "description": "Timestamp of when the query execution ended.", @@ -5253,6 +5614,21 @@ "type": "object" } }, + "models.SyntaxErrorMetadata": { + "type": "object", + "properties": { + "column": { + "type": "integer", + "description": "The column number at which the syntax error occurred.", + "example": 73 + }, + "line": { + "type": "integer", + "description": "The line number at which the syntax error occurred in the query.", + "example": 10 + } + } + }, "models.TableClearResponse": { "type": "object", "properties": { @@ -5272,6 +5648,7 @@ }, "type": { "type": "array", + "description": "ColumnType is a json.RawMessage so that we can support objects like Array and Struct.", "items": { "type": "integer" } From a178da3451bb9a5a41064d765d401d7226b7e386 Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Fri, 24 Oct 2025 09:43:30 -0400 Subject: [PATCH 19/36] Migrate from mint.json to docs.json (#881) - Migrated configuration from deprecated mint.json to docs.json format - Used official mint upgrade command as base - Enhanced with navbar, footer, SEO, integrations, and contextual menu - Configured tabs with proper navigation structure - Moved 'Other Networks' section from Get Started to Data Catalog - Set contextual menu order: ChatGPT, Claude, Perplexity, Copy, View - Backed up original mint.json as mint.json.backup --- docs.json | 3096 ++++++++++++++++++++++++++++++++++++++++++++++ mint.json.backup | 3032 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 6128 insertions(+) create mode 100644 docs.json create mode 100644 mint.json.backup diff --git a/docs.json b/docs.json new file mode 100644 index 00000000..fac83d9c --- /dev/null +++ b/docs.json @@ -0,0 +1,3096 @@ +{ + "$schema": "https://mintlify.com/docs.json", + "theme": "mint", + "name": "Dune Docs", + "description": "Official documentation for building with Dune's data platform, query engine, and API.", + "logo": { + "light": "/logo/dune-logo-light.png", + "dark": "/logo/dune-logo-dark.png", + "href": "https://dune.com" + }, + "favicon": "/dune.png", + "colors": { + "primary": "#F4603E", + "light": "#F49282", + "dark": "#F4603E" + }, + "navbar": { + "links": [ + { + "label": "Support", + "href": "mailto:support@dune.com" + } + ], + "primary": { + "type": "button", + "label": "Start building", + "href": "https://dune.com" + } + }, + "tabs": [ + { + "name": "Get Started", + "url": "home" + }, + { + "name": "Analytics Studio", + "url": "web-app" + }, + { + "name": "Query Engine", + "url": "query-engine" + }, + { + "name": "Data Catalog", + "url": "data-catalog" + }, + { + "name": "Analytics API", + "url": "api-reference" + }, + { + "name": "Datashare", + "url": "datashare" + }, + { + "name": "Catalyst", + "url": "catalyst" + } + ], + "navigation": { + "tabs": [ + { + "tab": "Get Started", + "pages": [ + "home", + "quickstart", + "learning-resources", + { + "group": "Jump right in", + "pages": [ + "learning/how-tos/create-your-first-query", + "learning/how-tos/query-templates", + "learning/how-tos/create-new-content", + "learning/how-tos/create-your-first-visualization", + "learning/how-tos/navigate-query-editor", + "learning/how-tos/find-datasets", + "learning/how-tos/export-data-out", + "learning/how-tos/create-and-manage-teams", + "learning/how-tos/credit-system-on-dune", + "learning/how-tos/credit-system", + "learning/how-tos/search-for-content", + "learning/how-tos/share-dune-content", + "learning/how-tos/share-your-query", + "learning/how-tos/transfer-ownership", + "learning/flipside-migration-guide" + ] + } + ] + }, + { + "tab": "Analytics Studio", + "pages": [ + { + "group": "Analytics Studio", + "pages": [ + "web-app/overview", + { + "group": "Create Queries", + "pages": [ + "web-app/query-editor/query-window", + "web-app/query-editor/data-explorer", + "web-app/query-editor/parameters", + "web-app/query-editor/query-scheduler", + "web-app/query-editor/query-lineage", + "web-app/query-editor/version-history" + ] + }, + { + "group": "Create Visualizations", + "pages": [ + "web-app/visualizations/charts-graphs", + "web-app/visualizations/counters", + "web-app/visualizations/tables" + ] + }, + { + "group": "Decoding Contracts", + "pages": [ + "web-app/decoding/decoding-contracts", + "web-app/decoding/best-practices", + "web-app/decoding/faqs", + "web-app/decoding/multichain-decoding", + "web-app/decoding/short-guide-contract-submission" + ] + }, + "web-app/dashboards", + "web-app/teams", + "web-app/dune-ai", + "web-app/upload-data", + "web-app/embeds", + "web-app/search", + "web-app/alerts", + "web-app/bug-bounty", + "web-app/user-activity" + ] + } + ] + }, + { + "tab": "Query Engine", + "pages": [ + "query-engine/overview", + { + "group": "Functionality", + "pages": [ + "query-engine/query-executions", + "query-engine/query-a-query", + "query-engine/materialized-views" + ] + }, + { + "group": "DuneSQL", + "pages": [ + "query-engine/dunesql-architecture", + "query-engine/writing-efficient-queries", + "query-engine/datatypes", + "query-engine/reserved-keywords" + ] + }, + { + "group": "Functions and Operators", + "pages": [ + "query-engine/Functions-and-operators/index", + "query-engine/Functions-and-operators/aggregate", + "query-engine/Functions-and-operators/array", + "query-engine/Functions-and-operators/asof-join", + "query-engine/Functions-and-operators/base58", + "query-engine/Functions-and-operators/binary", + "query-engine/Functions-and-operators/bitwise", + "query-engine/Functions-and-operators/chain-utility-functions", + "query-engine/Functions-and-operators/comparison", + "query-engine/Functions-and-operators/conditional", + "query-engine/Functions-and-operators/conversion", + "query-engine/Functions-and-operators/datetime", + "query-engine/Functions-and-operators/decimal", + "query-engine/Functions-and-operators/evm-decoding-functions", + "query-engine/Functions-and-operators/hyperloglog", + "query-engine/Functions-and-operators/json", + "query-engine/Functions-and-operators/lambda", + "query-engine/Functions-and-operators/live-fetch", + "query-engine/Functions-and-operators/logical", + "query-engine/Functions-and-operators/map", + "query-engine/Functions-and-operators/math", + "query-engine/Functions-and-operators/ml", + "query-engine/Functions-and-operators/qdigest", + "query-engine/Functions-and-operators/regexp", + "query-engine/Functions-and-operators/setdigest", + "query-engine/Functions-and-operators/ss58", + "query-engine/Functions-and-operators/tonaddress", + "query-engine/Functions-and-operators/tronaddress", + "query-engine/Functions-and-operators/string", + "query-engine/Functions-and-operators/system", + "query-engine/Functions-and-operators/tdigest", + "query-engine/Functions-and-operators/teradata", + "query-engine/Functions-and-operators/url", + "query-engine/Functions-and-operators/uuid", + "query-engine/Functions-and-operators/varbinary", + "query-engine/Functions-and-operators/varchar-utility-functions", + "query-engine/Functions-and-operators/window" + ] + } + ] + }, + { + "tab": "Data Catalog", + "pages": [ + "data-catalog/overview", + "data-catalog/data-freshness", + "data-catalog/bring-your-own-data", + { + "group": "Curated Data", + "pages": [ + "data-catalog/curated/overview", + { + "group": "DEX Trades", + "icon": "shuffle", + "pages": [ + "data-catalog/curated/dex-trades/overview", + { + "group": "EVM DEX", + "icon": "e", + "pages": [ + "data-catalog/curated/dex-trades/evm/dex-trades", + "data-catalog/curated/dex-trades/evm/dex-aggregator-trades", + "data-catalog/curated/dex-trades/evm/dex-sandwiched", + "data-catalog/curated/dex-trades/evm/dex-sandwiches" + ] + }, + { + "group": "Solana DEX", + "icon": "s", + "pages": [ + "data-catalog/curated/dex-trades/solana/overview", + "data-catalog/curated/dex-trades/solana/jupiter-aggregator-trades", + "data-catalog/curated/dex-trades/solana/solana-dex-trades" + ] + } + ] + }, + { + "group": "Token Transfers", + "icon": "coins", + "pages": [ + "data-catalog/curated/token-transfers/overview", + { + "group": "EVM Token Transfers", + "icon": "e", + "pages": [ + "data-catalog/curated/token-transfers/evm/balances", + "data-catalog/curated/token-transfers/evm/token-transfers", + "data-catalog/curated/token-transfers/evm/tokens-metadata" + ] + }, + { + "group": "Solana Token Transfers", + "icon": "s", + "pages": [ + "data-catalog/curated/token-transfers/solana/overview", + "data-catalog/curated/token-transfers/solana/solana-token-accounts", + "data-catalog/curated/token-transfers/solana/solana-token-metadata", + "data-catalog/curated/token-transfers/solana/solana-token-transfers" + ] + } + ] + }, + { + "group": "Labels", + "icon": "tag", + "pages": [ + "data-catalog/curated/labels/overview", + "data-catalog/curated/labels/address-labels", + "data-catalog/curated/labels/ens-labels", + "data-catalog/curated/labels/owner-addresses", + "data-catalog/curated/labels/owner-details" + ] + }, + { + "group": "Prices", + "icon": "dollar-sign", + "pages": [ + "data-catalog/curated/prices/overview", + "data-catalog/curated/prices/prices_minute", + "data-catalog/curated/prices/prices_hour", + "data-catalog/curated/prices/prices_day", + "data-catalog/curated/prices/prices_usd", + "data-catalog/curated/prices/prices_latest" + ] + }, + { + "group": "NFT Trades", + "icon": "image", + "pages": [ + "data-catalog/curated/nft-trades/overview", + { + "group": "EVM NFT", + "icon": "e", + "pages": [ + "data-catalog/curated/nft-trades/evm/nft-trades", + "data-catalog/curated/nft-trades/evm/nft-mints", + "data-catalog/curated/nft-trades/evm/nft-wash-trades", + "data-catalog/curated/nft-trades/evm/nft-metadata", + "data-catalog/curated/nft-trades/evm/nft-transfers" + ] + }, + { + "group": "Solana NFT", + "icon": "s", + "pages": [ + "data-catalog/curated/nft-trades/solana/solana-nft-metadata", + "data-catalog/curated/nft-trades/solana/solana-nft-transfers" + ] + } + ] + } + ] + }, + { + "group": "EVM Networks", + "pages": [ + "data-catalog/evm/overview", + { + "group": "Abstract", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/abstract/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/abstract/raw/blocks", + "data-catalog/evm/abstract/raw/creation-traces", + "data-catalog/evm/abstract/raw/logs", + "data-catalog/evm/abstract/raw/transactions", + "data-catalog/evm/abstract/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/abstract/decoded/overview", + "data-catalog/evm/abstract/decoded/call-tables", + "data-catalog/evm/abstract/decoded/event-logs", + "data-catalog/evm/abstract/decoded/contracts", + "data-catalog/evm/abstract/decoded/logs-decoded", + "data-catalog/evm/abstract/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/abstract/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/abstract/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "ApeChain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/apechain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/apechain/raw/blocks", + "data-catalog/evm/apechain/raw/creation-traces", + "data-catalog/evm/apechain/raw/logs", + "data-catalog/evm/apechain/raw/transactions", + "data-catalog/evm/apechain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/apechain/decoded/overview", + "data-catalog/evm/apechain/decoded/call-tables", + "data-catalog/evm/apechain/decoded/event-logs", + "data-catalog/evm/apechain/decoded/contracts", + "data-catalog/evm/apechain/decoded/logs-decoded", + "data-catalog/evm/apechain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/apechain/curated-data/dex/dex-trades", + "data-catalog/evm/apechain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/apechain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Arbitrum One", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/arbitrum/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/arbitrum/raw/blocks", + "data-catalog/evm/arbitrum/raw/creation-traces", + "data-catalog/evm/arbitrum/raw/logs", + "data-catalog/evm/arbitrum/raw/transactions", + "data-catalog/evm/arbitrum/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/arbitrum/decoded/overview", + "data-catalog/evm/arbitrum/decoded/call-tables", + "data-catalog/evm/arbitrum/decoded/event-logs", + "data-catalog/evm/arbitrum/decoded/contracts", + "data-catalog/evm/arbitrum/decoded/logs-decoded", + "data-catalog/evm/arbitrum/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/arbitrum/curated-data/dex/dex-trades", + "data-catalog/evm/arbitrum/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/arbitrum/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Arbitrum Nova", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/arbitrum-nova/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/arbitrum-nova/raw/blocks", + "data-catalog/evm/arbitrum-nova/raw/creation-traces", + "data-catalog/evm/arbitrum-nova/raw/logs", + "data-catalog/evm/arbitrum-nova/raw/transactions", + "data-catalog/evm/arbitrum-nova/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/arbitrum-nova/decoded/overview", + "data-catalog/evm/arbitrum-nova/decoded/call-tables", + "data-catalog/evm/arbitrum-nova/decoded/event-logs", + "data-catalog/evm/arbitrum-nova/decoded/contracts", + "data-catalog/evm/arbitrum-nova/decoded/logs-decoded", + "data-catalog/evm/arbitrum-nova/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/arbitrum-nova/curated-data/dex/dex-trades", + "data-catalog/evm/arbitrum-nova/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/arbitrum-nova/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Avalanche", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/avalanche/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/avalanche/raw/blocks", + "data-catalog/evm/avalanche/raw/creation-traces", + "data-catalog/evm/avalanche/raw/logs", + "data-catalog/evm/avalanche/raw/transactions", + "data-catalog/evm/avalanche/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/avalanche/decoded/overview", + "data-catalog/evm/avalanche/decoded/call-tables", + "data-catalog/evm/avalanche/decoded/event-logs", + "data-catalog/evm/avalanche/decoded/contracts", + "data-catalog/evm/avalanche/decoded/logs-decoded", + "data-catalog/evm/avalanche/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/avalanche/curated-data/dex/dex-trades", + "data-catalog/evm/avalanche/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/avalanche/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "B3", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/b3/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/b3/raw/blocks", + "data-catalog/evm/b3/raw/creation-traces", + "data-catalog/evm/b3/raw/logs", + "data-catalog/evm/b3/raw/transactions", + "data-catalog/evm/b3/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/b3/decoded/overview", + "data-catalog/evm/b3/decoded/call-tables", + "data-catalog/evm/b3/decoded/event-logs", + "data-catalog/evm/b3/decoded/contracts", + "data-catalog/evm/b3/decoded/logs-decoded", + "data-catalog/evm/b3/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/b3/curated-data/dex/dex-trades", + "data-catalog/evm/b3/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/b3/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Base", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/base/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/base/raw/blocks", + "data-catalog/evm/base/raw/creation-traces", + "data-catalog/evm/base/raw/logs", + "data-catalog/evm/base/raw/transactions", + "data-catalog/evm/base/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/base/decoded/overview", + "data-catalog/evm/base/decoded/call-tables", + "data-catalog/evm/base/decoded/event-logs", + "data-catalog/evm/base/decoded/contracts", + "data-catalog/evm/base/decoded/logs-decoded", + "data-catalog/evm/base/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/base/curated-data/dex/dex-trades", + "data-catalog/evm/base/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/base/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Berachain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/berachain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/berachain/raw/blocks", + "data-catalog/evm/berachain/raw/creation-traces", + "data-catalog/evm/berachain/raw/logs", + "data-catalog/evm/berachain/raw/transactions", + "data-catalog/evm/berachain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/berachain/decoded/overview", + "data-catalog/evm/berachain/decoded/call-tables", + "data-catalog/evm/berachain/decoded/event-logs", + "data-catalog/evm/berachain/decoded/contracts", + "data-catalog/evm/berachain/decoded/logs-decoded", + "data-catalog/evm/berachain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/berachain/curated-data/dex/dex-trades", + "data-catalog/evm/berachain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/berachain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Beacon", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/beacon/overview", + "data-catalog/evm/beacon/attestations", + "data-catalog/evm/beacon/attester-slashings", + "data-catalog/evm/beacon/blobs", + "data-catalog/evm/beacon/blocks", + "data-catalog/evm/beacon/bls-to-execution-changes", + "data-catalog/evm/beacon/deposits", + "data-catalog/evm/beacon/epoch-summaries", + "data-catalog/evm/beacon/operators", + "data-catalog/evm/beacon/proposer-slashings", + "data-catalog/evm/beacon/raw", + "data-catalog/evm/beacon/validator-day-summaries", + "data-catalog/evm/beacon/validators", + "data-catalog/evm/beacon/voluntary-exits", + "data-catalog/evm/beacon/withdrawals" + ] + }, + { + "group": "Blast", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/blast/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/blast/raw/blocks", + "data-catalog/evm/blast/raw/creation-traces", + "data-catalog/evm/blast/raw/logs", + "data-catalog/evm/blast/raw/transactions", + "data-catalog/evm/blast/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/blast/decoded/overview", + "data-catalog/evm/blast/decoded/call-tables", + "data-catalog/evm/blast/decoded/event-logs", + "data-catalog/evm/blast/decoded/contracts", + "data-catalog/evm/blast/decoded/logs-decoded", + "data-catalog/evm/blast/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/blast/curated-data/dex/dex-trades", + "data-catalog/evm/blast/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/blast/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "BNB", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/bnb/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/bnb/raw/blocks", + "data-catalog/evm/bnb/raw/creation-traces", + "data-catalog/evm/bnb/raw/logs", + "data-catalog/evm/bnb/raw/transactions", + "data-catalog/evm/bnb/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/bnb/decoded/overview", + "data-catalog/evm/bnb/decoded/call-tables", + "data-catalog/evm/bnb/decoded/event-logs", + "data-catalog/evm/bnb/decoded/contracts", + "data-catalog/evm/bnb/decoded/logs-decoded", + "data-catalog/evm/bnb/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/bnb/curated-data/dex/dex-trades", + "data-catalog/evm/bnb/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/bnb/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "BOB", + "icon": "database", + "iconType": "regular", + "pages": [ + "data-catalog/evm/bob/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/bob/raw/blocks", + "data-catalog/evm/bob/raw/logs", + "data-catalog/evm/bob/raw/transactions", + "data-catalog/evm/bob/raw/traces" + ] + } + ] + }, + { + "group": "Boba", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/boba/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/boba/raw/blocks", + "data-catalog/evm/boba/raw/creation-traces", + "data-catalog/evm/boba/raw/logs", + "data-catalog/evm/boba/raw/transactions", + "data-catalog/evm/boba/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/boba/decoded/overview", + "data-catalog/evm/boba/decoded/call-tables", + "data-catalog/evm/boba/decoded/event-logs", + "data-catalog/evm/boba/decoded/contracts", + "data-catalog/evm/boba/decoded/logs-decoded", + "data-catalog/evm/boba/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/boba/curated-data/dex/dex-trades", + "data-catalog/evm/boba/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/boba/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Celo", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/celo/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/celo/raw/blocks", + "data-catalog/evm/celo/raw/creation-traces", + "data-catalog/evm/celo/raw/logs", + "data-catalog/evm/celo/raw/transactions", + "data-catalog/evm/celo/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/celo/decoded/overview", + "data-catalog/evm/celo/decoded/call-tables", + "data-catalog/evm/celo/decoded/event-logs", + "data-catalog/evm/celo/decoded/contracts", + "data-catalog/evm/celo/decoded/logs-decoded", + "data-catalog/evm/celo/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/celo/curated-data/dex/dex-trades", + "data-catalog/evm/celo/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/celo/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Corn", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/corn/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/corn/raw/blocks", + "data-catalog/evm/corn/raw/creation-traces", + "data-catalog/evm/corn/raw/logs", + "data-catalog/evm/corn/raw/transactions", + "data-catalog/evm/corn/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/corn/decoded/overview", + "data-catalog/evm/corn/decoded/call-tables", + "data-catalog/evm/corn/decoded/event-logs", + "data-catalog/evm/corn/decoded/contracts", + "data-catalog/evm/corn/decoded/logs-decoded", + "data-catalog/evm/corn/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/corn/curated-data/dex/dex-trades", + "data-catalog/evm/corn/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/corn/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Degen", + "icon": "database", + "iconType": "regular", + "pages": [ + "data-catalog/evm/degen/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/degen/raw/blocks", + "data-catalog/evm/degen/raw/logs", + "data-catalog/evm/degen/raw/transactions", + "data-catalog/evm/degen/raw/traces" + ] + } + ] + }, + { + "group": "Ethereum", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/ethereum/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/ethereum/raw/transactions", + "data-catalog/evm/ethereum/raw/logs", + "data-catalog/evm/ethereum/raw/traces", + "data-catalog/evm/ethereum/raw/creation-traces", + "data-catalog/evm/ethereum/raw/blocks", + "data-catalog/evm/ethereum/raw/withdrawals" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/ethereum/decoded/overview", + "data-catalog/evm/ethereum/decoded/call-tables", + "data-catalog/evm/ethereum/decoded/event-logs", + "data-catalog/evm/ethereum/decoded/contracts", + "data-catalog/evm/ethereum/decoded/logs-decoded", + "data-catalog/evm/ethereum/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/ethereum/curated-data/dex/dex-trades", + "data-catalog/evm/ethereum/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/ethereum/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Fantom", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/fantom/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/fantom/raw/blocks", + "data-catalog/evm/fantom/raw/creation-traces", + "data-catalog/evm/fantom/raw/logs", + "data-catalog/evm/fantom/raw/transactions", + "data-catalog/evm/fantom/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/fantom/decoded/overview", + "data-catalog/evm/fantom/decoded/call-tables", + "data-catalog/evm/fantom/decoded/event-logs", + "data-catalog/evm/fantom/decoded/contracts", + "data-catalog/evm/fantom/decoded/logs-decoded", + "data-catalog/evm/fantom/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/fantom/curated-data/dex/dex-trades", + "data-catalog/evm/fantom/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/fantom/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Flare", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/flare/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/flare/raw/blocks", + "data-catalog/evm/flare/raw/creation-traces", + "data-catalog/evm/flare/raw/logs", + "data-catalog/evm/flare/raw/transactions", + "data-catalog/evm/flare/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/flare/decoded/overview", + "data-catalog/evm/flare/decoded/call-tables", + "data-catalog/evm/flare/decoded/event-logs", + "data-catalog/evm/flare/decoded/contracts", + "data-catalog/evm/flare/decoded/logs-decoded", + "data-catalog/evm/flare/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/flare/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/flare/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Flow EVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/flow-evm/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/flow-evm/raw/blocks", + "data-catalog/evm/flow-evm/raw/creation-traces", + "data-catalog/evm/flow-evm/raw/logs", + "data-catalog/evm/flow-evm/raw/transactions", + "data-catalog/evm/flow-evm/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/flow-evm/decoded/overview", + "data-catalog/evm/flow-evm/decoded/call-tables", + "data-catalog/evm/flow-evm/decoded/event-logs", + "data-catalog/evm/flow-evm/decoded/contracts", + "data-catalog/evm/flow-evm/decoded/logs-decoded", + "data-catalog/evm/flow-evm/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Gnosis", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/gnosis/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/gnosis/raw/blocks", + "data-catalog/evm/gnosis/raw/creation-traces", + "data-catalog/evm/gnosis/raw/logs", + "data-catalog/evm/gnosis/raw/transactions", + "data-catalog/evm/gnosis/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/gnosis/decoded/overview", + "data-catalog/evm/gnosis/decoded/call-tables", + "data-catalog/evm/gnosis/decoded/event-logs", + "data-catalog/evm/gnosis/decoded/contracts", + "data-catalog/evm/gnosis/decoded/logs-decoded", + "data-catalog/evm/gnosis/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/gnosis/curated-data/dex/dex-trades", + "data-catalog/evm/gnosis/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/gnosis/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Hemi", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/hemi/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/hemi/raw/blocks", + "data-catalog/evm/hemi/raw/creation-traces", + "data-catalog/evm/hemi/raw/logs", + "data-catalog/evm/hemi/raw/transactions", + "data-catalog/evm/hemi/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/hemi/decoded/overview", + "data-catalog/evm/hemi/decoded/call-tables", + "data-catalog/evm/hemi/decoded/event-logs", + "data-catalog/evm/hemi/decoded/contracts", + "data-catalog/evm/hemi/decoded/logs-decoded", + "data-catalog/evm/hemi/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/hemi/curated-data/dex/dex-trades" + ] + } + ] + } + ] + }, + { + "group": "HyperEVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/hyperevm/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/hyperevm/raw/blocks", + "data-catalog/evm/hyperevm/raw/logs", + "data-catalog/evm/hyperevm/raw/transactions" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/hyperevm/decoded/overview", + "data-catalog/evm/hyperevm/decoded/event-logs", + "data-catalog/evm/hyperevm/decoded/contracts", + "data-catalog/evm/hyperevm/decoded/logs-decoded" + ] + } + ] + }, + { + "group": "Ink", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/ink/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/ink/raw/blocks", + "data-catalog/evm/ink/raw/creation-traces", + "data-catalog/evm/ink/raw/logs", + "data-catalog/evm/ink/raw/transactions", + "data-catalog/evm/ink/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/ink/decoded/overview", + "data-catalog/evm/ink/decoded/call-tables", + "data-catalog/evm/ink/decoded/event-logs", + "data-catalog/evm/ink/decoded/contracts", + "data-catalog/evm/ink/decoded/logs-decoded", + "data-catalog/evm/ink/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/ink/curated-data/dex/dex-trades", + "data-catalog/evm/ink/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/ink/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "KAIA", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/kaia/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/kaia/raw/blocks", + "data-catalog/evm/kaia/raw/creation-traces", + "data-catalog/evm/kaia/raw/logs", + "data-catalog/evm/kaia/raw/transactions", + "data-catalog/evm/kaia/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/kaia/decoded/overview", + "data-catalog/evm/kaia/decoded/call-tables", + "data-catalog/evm/kaia/decoded/event-logs", + "data-catalog/evm/kaia/decoded/contracts", + "data-catalog/evm/kaia/decoded/logs-decoded", + "data-catalog/evm/kaia/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/kaia/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/kaia/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Katana", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/katana/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/katana/raw/blocks", + "data-catalog/evm/katana/raw/creation-traces", + "data-catalog/evm/katana/raw/logs", + "data-catalog/evm/katana/raw/transactions", + "data-catalog/evm/katana/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/katana/decoded/overview", + "data-catalog/evm/katana/decoded/call-tables", + "data-catalog/evm/katana/decoded/event-logs", + "data-catalog/evm/katana/decoded/contracts", + "data-catalog/evm/katana/decoded/logs-decoded", + "data-catalog/evm/katana/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/katana/curated-data/dex/dex-trades", + "data-catalog/evm/katana/curated-data/dex/dex-aggregator-trades" + ] + } + ] + } + ] + }, + { + "group": "Lens", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/lens/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/lens/raw/blocks", + "data-catalog/evm/lens/raw/creation-traces", + "data-catalog/evm/lens/raw/logs", + "data-catalog/evm/lens/raw/transactions", + "data-catalog/evm/lens/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/lens/decoded/overview", + "data-catalog/evm/lens/decoded/call-tables", + "data-catalog/evm/lens/decoded/event-logs", + "data-catalog/evm/lens/decoded/contracts", + "data-catalog/evm/lens/decoded/logs-decoded", + "data-catalog/evm/lens/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/lens/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/lens/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Linea", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/linea/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/linea/raw/blocks", + "data-catalog/evm/linea/raw/creation-traces", + "data-catalog/evm/linea/raw/logs", + "data-catalog/evm/linea/raw/transactions", + "data-catalog/evm/linea/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/linea/decoded/overview", + "data-catalog/evm/linea/decoded/call-tables", + "data-catalog/evm/linea/decoded/event-logs", + "data-catalog/evm/linea/decoded/contracts", + "data-catalog/evm/linea/decoded/logs-decoded", + "data-catalog/evm/linea/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/linea/curated-data/dex/dex-trades", + "data-catalog/evm/linea/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/linea/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Mantle", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/mantle/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/mantle/raw/blocks", + "data-catalog/evm/mantle/raw/creation-traces", + "data-catalog/evm/mantle/raw/logs", + "data-catalog/evm/mantle/raw/transactions", + "data-catalog/evm/mantle/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/mantle/decoded/overview", + "data-catalog/evm/mantle/decoded/call-tables", + "data-catalog/evm/mantle/decoded/event-logs", + "data-catalog/evm/mantle/decoded/contracts", + "data-catalog/evm/mantle/decoded/logs-decoded", + "data-catalog/evm/mantle/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/mantle/curated-data/dex/dex-trades", + "data-catalog/evm/mantle/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/mantle/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Monad Testnet", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/monad-testnet/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/monad-testnet/raw/blocks", + "data-catalog/evm/monad-testnet/raw/creation-traces", + "data-catalog/evm/monad-testnet/raw/logs", + "data-catalog/evm/monad-testnet/raw/transactions", + "data-catalog/evm/monad-testnet/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/monad-testnet/decoded/overview", + "data-catalog/evm/monad-testnet/decoded/call-tables", + "data-catalog/evm/monad-testnet/decoded/event-logs", + "data-catalog/evm/monad-testnet/decoded/contracts", + "data-catalog/evm/monad-testnet/decoded/logs-decoded", + "data-catalog/evm/monad-testnet/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "opBNB", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/opbnb/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/opbnb/raw/blocks", + "data-catalog/evm/opbnb/raw/creation-traces", + "data-catalog/evm/opbnb/raw/logs", + "data-catalog/evm/opbnb/raw/transactions", + "data-catalog/evm/opbnb/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/opbnb/decoded/overview", + "data-catalog/evm/opbnb/decoded/call-tables", + "data-catalog/evm/opbnb/decoded/event-logs", + "data-catalog/evm/opbnb/decoded/contracts", + "data-catalog/evm/opbnb/decoded/logs-decoded", + "data-catalog/evm/opbnb/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/opbnb/curated-data/dex/dex-trades", + "data-catalog/evm/opbnb/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/opbnb/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Optimism", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/optimism/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/optimism/raw/blocks", + "data-catalog/evm/optimism/raw/creation-traces", + "data-catalog/evm/optimism/raw/logs", + "data-catalog/evm/optimism/raw/transactions", + "data-catalog/evm/optimism/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/optimism/decoded/overview", + "data-catalog/evm/optimism/decoded/call-tables", + "data-catalog/evm/optimism/decoded/event-logs", + "data-catalog/evm/optimism/decoded/contracts", + "data-catalog/evm/optimism/decoded/logs-decoded", + "data-catalog/evm/optimism/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/optimism/curated-data/dex/dex-trades", + "data-catalog/evm/optimism/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/optimism/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Plume", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/plume/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/plume/raw/blocks", + "data-catalog/evm/plume/raw/creation-traces", + "data-catalog/evm/plume/raw/logs", + "data-catalog/evm/plume/raw/transactions", + "data-catalog/evm/plume/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/plume/decoded/overview", + "data-catalog/evm/plume/decoded/event-logs", + "data-catalog/evm/plume/decoded/contracts", + "data-catalog/evm/plume/decoded/logs-decoded", + "data-catalog/evm/plume/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/plume/curated-data/dex/dex-trades", + "data-catalog/evm/plume/curated-data/dex/dex-aggregator-trades" + ] + } + ] + } + ] + }, + { + "group": "Plasma", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/plasma/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/plasma/raw/blocks", + "data-catalog/evm/plasma/raw/transactions", + "data-catalog/evm/plasma/raw/logs", + "data-catalog/evm/plasma/raw/traces", + "data-catalog/evm/plasma/raw/creation-traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/plasma/decoded/overview", + "data-catalog/evm/plasma/decoded/call-tables", + "data-catalog/evm/plasma/decoded/event-logs", + "data-catalog/evm/plasma/decoded/contracts", + "data-catalog/evm/plasma/decoded/logs-decoded", + "data-catalog/evm/plasma/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Polygon", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/polygon/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/polygon/raw/blocks", + "data-catalog/evm/polygon/raw/creation-traces", + "data-catalog/evm/polygon/raw/logs", + "data-catalog/evm/polygon/raw/transactions", + "data-catalog/evm/polygon/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/polygon/decoded/overview", + "data-catalog/evm/polygon/decoded/call-tables", + "data-catalog/evm/polygon/decoded/event-logs", + "data-catalog/evm/polygon/decoded/contracts", + "data-catalog/evm/polygon/decoded/logs-decoded", + "data-catalog/evm/polygon/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/polygon/curated-data/dex/dex-trades", + "data-catalog/evm/polygon/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/polygon/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Polygon-zkEVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/polygon-zkEVM/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/polygon-zkEVM/raw/blocks", + "data-catalog/evm/polygon-zkEVM/raw/creation-traces", + "data-catalog/evm/polygon-zkEVM/raw/logs", + "data-catalog/evm/polygon-zkEVM/raw/transactions", + "data-catalog/evm/polygon-zkEVM/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/polygon-zkEVM/decoded/overview", + "data-catalog/evm/polygon-zkEVM/decoded/call-tables", + "data-catalog/evm/polygon-zkEVM/decoded/event-logs", + "data-catalog/evm/polygon-zkEVM/decoded/contracts", + "data-catalog/evm/polygon-zkEVM/decoded/logs-decoded", + "data-catalog/evm/polygon-zkEVM/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/polygon-zkEVM/curated-data/dex/dex-trades", + "data-catalog/evm/polygon-zkEVM/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/polygon-zkEVM/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Ronin", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/ronin/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/ronin/raw/blocks", + "data-catalog/evm/ronin/raw/creation-traces", + "data-catalog/evm/ronin/raw/logs", + "data-catalog/evm/ronin/raw/transactions", + "data-catalog/evm/ronin/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/ronin/decoded/overview", + "data-catalog/evm/ronin/decoded/call-tables", + "data-catalog/evm/ronin/decoded/event-logs", + "data-catalog/evm/ronin/decoded/contracts", + "data-catalog/evm/ronin/decoded/logs-decoded", + "data-catalog/evm/ronin/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/ronin/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/ronin/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Scroll", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/scroll/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/scroll/raw/blocks", + "data-catalog/evm/scroll/raw/creation-traces", + "data-catalog/evm/scroll/raw/logs", + "data-catalog/evm/scroll/raw/transactions", + "data-catalog/evm/scroll/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/scroll/decoded/overview", + "data-catalog/evm/scroll/decoded/call-tables", + "data-catalog/evm/scroll/decoded/event-logs", + "data-catalog/evm/scroll/decoded/contracts", + "data-catalog/evm/scroll/decoded/logs-decoded", + "data-catalog/evm/scroll/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/scroll/curated-data/dex/dex-trades", + "data-catalog/evm/scroll/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/scroll/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Sei", + "icon": "circles-overlap", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sei/overview", + { + "group": "Raw (EVM)", + "pages": [ + "data-catalog/evm/sei/raw/blocks", + "data-catalog/evm/sei/raw/creation-traces", + "data-catalog/evm/sei/raw/logs", + "data-catalog/evm/sei/raw/transactions", + "data-catalog/evm/sei/raw/traces" + ] + }, + { + "group": "Decoded (EVM)", + "pages": [ + "data-catalog/evm/sei/decoded/overview", + "data-catalog/evm/sei/decoded/call-tables", + "data-catalog/evm/sei/decoded/event-logs", + "data-catalog/evm/sei/decoded/contracts", + "data-catalog/evm/sei/decoded/logs-decoded", + "data-catalog/evm/sei/decoded/traces-decoded" + ] + }, + { + "group": "Curated (EVM)", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/sei/curated-data/dex/dex-trades", + "data-catalog/evm/sei/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/sei/curated-data/nft/nft-trades" + ] + } + ] + }, + { + "group": "Cosmos Data", + "pages": [ + "data-catalog/evm/sei/cosmos/cosmos_blocks", + "data-catalog/evm/sei/cosmos/cosmos_block_events", + "data-catalog/evm/sei/cosmos/cosmos_message_events", + "data-catalog/evm/sei/cosmos/cosmos_tx_messages", + "data-catalog/evm/sei/cosmos/cosmos_transactions", + "data-catalog/evm/sei/cosmos/cosmos_validators" + ] + } + ] + }, + { + "group": "Sepolia", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sepolia/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/sepolia/raw/blocks", + "data-catalog/evm/sepolia/raw/creation-traces", + "data-catalog/evm/sepolia/raw/logs", + "data-catalog/evm/sepolia/raw/transactions", + "data-catalog/evm/sepolia/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/sepolia/decoded/overview", + "data-catalog/evm/sepolia/decoded/call-tables", + "data-catalog/evm/sepolia/decoded/event-logs", + "data-catalog/evm/sepolia/decoded/contracts", + "data-catalog/evm/sepolia/decoded/logs-decoded", + "data-catalog/evm/sepolia/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Shape", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/shape/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/shape/raw/blocks", + "data-catalog/evm/shape/raw/creation-traces", + "data-catalog/evm/shape/raw/logs", + "data-catalog/evm/shape/raw/transactions", + "data-catalog/evm/shape/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/shape/decoded/overview", + "data-catalog/evm/shape/decoded/call-tables", + "data-catalog/evm/shape/decoded/event-logs", + "data-catalog/evm/shape/decoded/contracts", + "data-catalog/evm/shape/decoded/logs-decoded", + "data-catalog/evm/shape/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/shape/curated-data/dex/dex-trades", + "data-catalog/evm/shape/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/shape/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Sonic", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sonic/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/sonic/raw/blocks", + "data-catalog/evm/sonic/raw/creation-traces", + "data-catalog/evm/sonic/raw/logs", + "data-catalog/evm/sonic/raw/transactions", + "data-catalog/evm/sonic/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/sonic/decoded/overview", + "data-catalog/evm/sonic/decoded/call-tables", + "data-catalog/evm/sonic/decoded/event-logs", + "data-catalog/evm/sonic/decoded/contracts", + "data-catalog/evm/sonic/decoded/logs-decoded", + "data-catalog/evm/sonic/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/sonic/curated-data/dex/dex-trades", + "data-catalog/evm/sonic/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/sonic/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Somnia", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/somnia/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/somnia/raw/blocks", + "data-catalog/evm/somnia/raw/creation-traces", + "data-catalog/evm/somnia/raw/logs", + "data-catalog/evm/somnia/raw/transactions", + "data-catalog/evm/somnia/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/somnia/decoded/overview", + "data-catalog/evm/somnia/decoded/call-tables", + "data-catalog/evm/somnia/decoded/event-logs", + "data-catalog/evm/somnia/decoded/contracts", + "data-catalog/evm/somnia/decoded/logs-decoded", + "data-catalog/evm/somnia/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Sophon", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sophon/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/sophon/raw/blocks", + "data-catalog/evm/sophon/raw/creation-traces", + "data-catalog/evm/sophon/raw/logs", + "data-catalog/evm/sophon/raw/transactions", + "data-catalog/evm/sophon/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/sophon/decoded/overview", + "data-catalog/evm/sophon/decoded/call-tables", + "data-catalog/evm/sophon/decoded/event-logs", + "data-catalog/evm/sophon/decoded/contracts", + "data-catalog/evm/sophon/decoded/logs-decoded", + "data-catalog/evm/sophon/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/sophon/curated-data/dex/dex-trades", + "data-catalog/evm/sophon/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/sophon/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Superseed", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/superseed/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/superseed/raw/blocks", + "data-catalog/evm/superseed/raw/creation-traces", + "data-catalog/evm/superseed/raw/logs", + "data-catalog/evm/superseed/raw/transactions", + "data-catalog/evm/superseed/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/superseed/decoded/overview", + "data-catalog/evm/superseed/decoded/call-tables", + "data-catalog/evm/superseed/decoded/event-logs", + "data-catalog/evm/superseed/decoded/contracts", + "data-catalog/evm/superseed/decoded/logs-decoded", + "data-catalog/evm/superseed/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/superseed/curated-data/dex/dex-trades" + ] + } + ] + } + ] + }, + { + "group": "Tac", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/tac/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/tac/raw/blocks", + "data-catalog/evm/tac/raw/creation-traces", + "data-catalog/evm/tac/raw/logs", + "data-catalog/evm/tac/raw/transactions", + "data-catalog/evm/tac/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/tac/decoded/overview", + "data-catalog/evm/tac/decoded/call-tables", + "data-catalog/evm/tac/decoded/event-logs", + "data-catalog/evm/tac/decoded/contracts", + "data-catalog/evm/tac/decoded/logs-decoded", + "data-catalog/evm/tac/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Taiko", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/taiko/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/taiko/raw/blocks", + "data-catalog/evm/taiko/raw/creation-traces", + "data-catalog/evm/taiko/raw/logs", + "data-catalog/evm/taiko/raw/transactions", + "data-catalog/evm/taiko/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/taiko/decoded/overview", + "data-catalog/evm/taiko/decoded/call-tables", + "data-catalog/evm/taiko/decoded/event-logs", + "data-catalog/evm/taiko/decoded/contracts", + "data-catalog/evm/taiko/decoded/logs-decoded", + "data-catalog/evm/taiko/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Unichain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/unichain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/unichain/raw/blocks", + "data-catalog/evm/unichain/raw/creation-traces", + "data-catalog/evm/unichain/raw/logs", + "data-catalog/evm/unichain/raw/transactions", + "data-catalog/evm/unichain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/unichain/decoded/overview", + "data-catalog/evm/unichain/decoded/call-tables", + "data-catalog/evm/unichain/decoded/event-logs", + "data-catalog/evm/unichain/decoded/contracts", + "data-catalog/evm/unichain/decoded/logs-decoded", + "data-catalog/evm/unichain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/unichain/curated-data/dex/dex-trades", + "data-catalog/evm/unichain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/unichain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Viction", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/viction/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/viction/raw/blocks", + "data-catalog/evm/viction/raw/creation-traces", + "data-catalog/evm/viction/raw/logs", + "data-catalog/evm/viction/raw/transactions", + "data-catalog/evm/viction/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/viction/decoded/overview", + "data-catalog/evm/viction/decoded/call-tables", + "data-catalog/evm/viction/decoded/event-logs", + "data-catalog/evm/viction/decoded/contracts", + "data-catalog/evm/viction/decoded/logs-decoded", + "data-catalog/evm/viction/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/viction/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/viction/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "World Chain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/worldchain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/worldchain/raw/blocks", + "data-catalog/evm/worldchain/raw/creation-traces", + "data-catalog/evm/worldchain/raw/logs", + "data-catalog/evm/worldchain/raw/transactions", + "data-catalog/evm/worldchain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/worldchain/decoded/overview", + "data-catalog/evm/worldchain/decoded/call-tables", + "data-catalog/evm/worldchain/decoded/event-logs", + "data-catalog/evm/worldchain/decoded/contracts", + "data-catalog/evm/worldchain/decoded/logs-decoded", + "data-catalog/evm/worldchain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/worldchain/curated-data/dex/dex-trades", + "data-catalog/evm/worldchain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/worldchain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "zkSync", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/zksync/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/zksync/raw/blocks", + "data-catalog/evm/zksync/raw/creation-traces", + "data-catalog/evm/zksync/raw/logs", + "data-catalog/evm/zksync/raw/transactions", + "data-catalog/evm/zksync/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/zksync/decoded/overview", + "data-catalog/evm/zksync/decoded/call-tables", + "data-catalog/evm/zksync/decoded/event-logs", + "data-catalog/evm/zksync/decoded/contracts", + "data-catalog/evm/zksync/decoded/logs-decoded", + "data-catalog/evm/zksync/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/zksync/curated-data/dex/dex-trades", + "data-catalog/evm/zksync/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/zksync/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Zora", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/zora/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/zora/raw/blocks", + "data-catalog/evm/zora/raw/creation-traces", + "data-catalog/evm/zora/raw/logs", + "data-catalog/evm/zora/raw/transactions", + "data-catalog/evm/zora/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/zora/decoded/overview", + "data-catalog/evm/zora/decoded/call-tables", + "data-catalog/evm/zora/decoded/event-logs", + "data-catalog/evm/zora/decoded/contracts", + "data-catalog/evm/zora/decoded/logs-decoded", + "data-catalog/evm/zora/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/zora/curated-data/dex/dex-trades", + "data-catalog/evm/zora/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/zora/curated-data/nft/nft-trades" + ] + } + ] + } + ] + } + ] + }, + { + "group": "Other Networks", + "pages": [ + { + "group": "Aptos", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/aptos/overview", + "data-catalog/aptos/blocks", + "data-catalog/aptos/events", + "data-catalog/aptos/move_modules", + "data-catalog/aptos/move_resources", + "data-catalog/aptos/move_table_items", + "data-catalog/aptos/signatures", + "data-catalog/aptos/transactions", + "data-catalog/aptos/user_transactions" + ] + }, + { + "group": "Bitcoin", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/bitcoin/overview", + "data-catalog/bitcoin/blocks", + "data-catalog/bitcoin/inputs", + "data-catalog/bitcoin/outputs", + "data-catalog/bitcoin/transactions" + ] + }, + { + "group": "Fuel", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/fuel/overview", + "data-catalog/fuel/blocks", + "data-catalog/fuel/transactions", + "data-catalog/fuel/receipts" + ] + }, + { + "group": "Noble", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/noble/overview", + "data-catalog/noble/blocks", + "data-catalog/noble/block_events", + "data-catalog/noble/bridge_transfers", + "data-catalog/noble/cctp_transactions", + "data-catalog/noble/message_events", + "data-catalog/noble/swaps", + "data-catalog/noble/transactions", + "data-catalog/noble/tx_messages", + "data-catalog/noble/validators" + ] + }, + { + "group": "NEAR", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/near/overview", + "data-catalog/near/actions", + "data-catalog/near/block_chunks", + "data-catalog/near/circulating_supply", + "data-catalog/near/ft_transfers", + "data-catalog/near/function_call", + "data-catalog/near/balances", + "data-catalog/near/nft_transfers", + "data-catalog/near/logs" + ] + }, + { + "group": "Polkadot", + "icon": "database", + "iconType": "regular", + "pages": [ + "data-catalog/substrate/overview", + "data-catalog/substrate/balances", + "data-catalog/substrate/blocks", + "data-catalog/substrate/calls", + "data-catalog/substrate/events", + "data-catalog/substrate/extrinsics", + "data-catalog/substrate/materialized_views", + "data-catalog/substrate/stakings", + "data-catalog/substrate/transfers", + "data-catalog/substrate/traces" + ] + }, + { + "group": "Solana", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/solana/overview", + "data-catalog/solana/account-activity", + "data-catalog/solana/blocks", + "data-catalog/solana/idl-tables", + "data-catalog/solana/instruction-calls", + "data-catalog/solana/rewards", + "data-catalog/solana/transactions", + "data-catalog/solana/vote-transactions" + ] + }, + { + "group": "Starknet", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/starknet/overview", + "data-catalog/starknet/blocks", + "data-catalog/starknet/transactions", + "data-catalog/starknet/events", + "data-catalog/starknet/calls" + ] + }, + { + "group": "Stellar", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/stellar/overview", + "data-catalog/stellar/evm_v_stellar", + "data-catalog/stellar/accounts", + "data-catalog/stellar/trust_lines", + "data-catalog/stellar/ttl", + "data-catalog/stellar/contract_data", + "data-catalog/stellar/history_ledgers", + "data-catalog/stellar/history_transactions", + "data-catalog/stellar/history_operations", + "data-catalog/stellar/history_effects", + "data-catalog/stellar/history_trades", + "data-catalog/stellar/liquidity_pools", + "data-catalog/stellar/history_contract_events" + ] + }, + { + "group": "Sui", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/sui/overview", + "data-catalog/sui/checkpoints", + "data-catalog/sui/events", + "data-catalog/sui/move_call", + "data-catalog/sui/move_package", + "data-catalog/sui/objects", + "data-catalog/sui/transaction_objects", + "data-catalog/sui/transactions", + "data-catalog/sui/wrapped_object" + ] + }, + { + "group": "TON", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/ton/overview", + "data-catalog/ton/accounts", + "data-catalog/ton/balances_history", + "data-catalog/ton/blocks", + "data-catalog/ton/transactions", + "data-catalog/ton/messages", + "data-catalog/ton/dex_pools", + "data-catalog/ton/dex_trades", + "data-catalog/ton/jetton_events", + "data-catalog/ton/jetton_metadata", + "data-catalog/ton/nft_events", + "data-catalog/ton/nft_metadata", + "data-catalog/ton/prices_daily" + ] + }, + { + "group": "XRPL", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/xrpl/overview", + "data-catalog/xrpl/transactions", + "data-catalog/xrpl/ledger", + "data-catalog/xrpl/aggregated_metrics_daily" + ] + }, + { + "group": "Tron", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/tron/overview", + { + "group": "Decoded", + "pages": [ + "data-catalog/tron/decoded/contracts", + "data-catalog/tron/decoded/event-logs", + "data-catalog/tron/decoded/overview" + ] + }, + { + "group": "Raw", + "pages": [ + "data-catalog/tron/raw/blocks", + "data-catalog/tron/raw/logs", + "data-catalog/tron/raw/transactions" + ] + }, + "data-catalog/tron/tether", + { + "group": "Tokens", + "pages": [ + "data-catalog/tron/tokens/overview", + "data-catalog/tron/tokens/transfers/erc1155-transfers", + "data-catalog/tron/tokens/transfers/erc20-transfers", + "data-catalog/tron/tokens/transfers/erc721-transfers" + ] + } + ] + } + ] + }, + { + "group": "Protocols", + "pages": [ + { + "group": "LayerZero", + "icon": "circles-overlap", + "iconType": "solid", + "pages": [ + "data-catalog/layerzero/overview", + "data-catalog/layerzero/messages", + "data-catalog/layerzero/transfers" + ] + }, + { + "group": "Succinct", + "icon": "bolt", + "iconType": "solid", + "pages": [ + "data-catalog/succinct/overview", + "data-catalog/succinct/bids", + "data-catalog/succinct/requests" + ] + } + ] + }, + { + "group": "Community Data", + "pages": [ + { + "group": "Flashbots", + "icon": "robot", + "pages": [ + "data-catalog/community/flashbots/overview", + "data-catalog/community/flashbots/mempool-dumpster" + ] + }, + { + "group": "Farcaster", + "icon": "torii-gate", + "pages": [ + "data-catalog/community/farcaster/overview", + "data-catalog/community/farcaster/casts", + "data-catalog/community/farcaster/fids", + "data-catalog/community/farcaster/fnames", + "data-catalog/community/farcaster/links", + "data-catalog/community/farcaster/profile_with_addresses", + "data-catalog/community/farcaster/reactions", + "data-catalog/community/farcaster/signers", + "data-catalog/community/farcaster/storage", + "data-catalog/community/farcaster/user_data", + "data-catalog/community/farcaster/verifications", + "data-catalog/community/farcaster/power_badge" + ] + }, + { + "group": "Lens", + "icon": "cloud", + "pages": [ + "data-catalog/community/lens/overview", + "data-catalog/community/lens/namespace-handle", + "data-catalog/community/lens/namespace-handle-link", + "data-catalog/community/lens/profile-follower", + "data-catalog/community/lens/profile-follow-module", + "data-catalog/community/lens/profile-follow-module-record", + "data-catalog/community/lens/profile-metadata", + "data-catalog/community/lens/profile-record", + "data-catalog/community/lens/publication-metadata", + "data-catalog/community/lens/publication-open-action-module", + "data-catalog/community/lens/publication-open-action-module-acted-recorded", + "data-catalog/community/lens/publication-open-action-module-acted-multirecipient", + "data-catalog/community/lens/publication-reaction", + "data-catalog/community/lens/publication-record", + "data-catalog/community/lens/publication-reference-module" + ] + }, + { + "group": "Reservoir", + "icon": "cube", + "pages": [ + "data-catalog/community/reservoir/overview", + "data-catalog/community/reservoir/ask-events", + "data-catalog/community/reservoir/asks", + "data-catalog/community/reservoir/attribute-keys", + "data-catalog/community/reservoir/attributes", + "data-catalog/community/reservoir/bid-events", + "data-catalog/community/reservoir/bids", + "data-catalog/community/reservoir/collection-floor-ask-events", + "data-catalog/community/reservoir/collection-top-bid-events", + "data-catalog/community/reservoir/collections", + "data-catalog/community/reservoir/sales", + "data-catalog/community/reservoir/token-attributes", + "data-catalog/community/reservoir/token-floor-ask-events", + "data-catalog/community/reservoir/tokens" + ] + }, + { + "group": "Snapshot", + "icon": "bolt", + "pages": [ + "data-catalog/community/snapshot/overview", + "data-catalog/community/snapshot/proposals", + "data-catalog/community/snapshot/votes", + "data-catalog/community/snapshot/users", + "data-catalog/community/snapshot/spaces", + "data-catalog/community/snapshot/follows" + ] + } + ] + }, + { + "group": "Dune Index", + "icon": "chart-line", + "pages": [ + "data-catalog/dune-index/introduction", + "data-catalog/dune-index/gas-fees", + "data-catalog/dune-index/net-transfers", + "data-catalog/dune-index/transactions" + ] + } + ] + }, + { + "tab": "Analytics API", + "pages": [ + { + "group": "Analytics API", + "pages": [ + "api-reference/overview/introduction", + { + "group": "API Quickstart", + "pages": [ + "api-reference/quickstart/results-eg", + "api-reference/quickstart/queries-eg", + "api-reference/quickstart/tables-eg" + ], + "icon": "forward-fast" + }, + "api-reference/overview/authentication", + "api-reference/overview/sdks", + "api-reference/overview/dunesql-trino-connector", + { + "group": "Result Filtering", + "pages": [ + "api-reference/executions/pagination", + "api-reference/executions/filtering", + "api-reference/executions/sorting", + "api-reference/executions/sampling" + ], + "icon": "filter" + }, + "api-reference/overview/rate-limits", + "api-reference/overview/troubleshooting", + "api-reference/overview/billing", + "api-reference/overview/faq" + ] + }, + { + "group": "SQL Endpoints", + "pages": [ + { + "group": "Executions and Results", + "pages": [ + "api-reference/executions/execution-object", + "api-reference/executions/endpoint/execute-query", + "api-reference/executions/endpoint/cancel-execution", + "api-reference/executions/endpoint/get-execution-status", + "api-reference/executions/endpoint/get-execution-result", + "api-reference/executions/endpoint/get-execution-result-csv", + "api-reference/executions/endpoint/get-query-result", + "api-reference/executions/endpoint/get-query-result-csv" + ] + }, + { + "group": "Queries", + "pages": [ + "api-reference/queries/endpoint/query-object", + "api-reference/queries/endpoint/create", + "api-reference/queries/endpoint/read", + "api-reference/queries/endpoint/update", + "api-reference/queries/endpoint/archive", + "api-reference/queries/endpoint/unarchive", + "api-reference/queries/endpoint/private", + "api-reference/queries/endpoint/unprivate" + ] + }, + { + "group": "Materialized Views", + "pages": [ + "api-reference/materialized-views/get", + "api-reference/materialized-views/create", + "api-reference/materialized-views/delete", + "api-reference/materialized-views/list", + "api-reference/materialized-views/refresh" + ] + }, + { + "group": "Webhooks", + "pages": [ + "api-reference/webhooks/webhook" + ] + } + ] + }, + { + "group": "Data Management Endpoints", + "pages": [ + { + "group": "Tables", + "pages": [ + "api-reference/tables/endpoint/overview", + "api-reference/tables/endpoint/create", + "api-reference/tables/endpoint/insert", + "api-reference/tables/endpoint/upload", + "api-reference/tables/endpoint/clear", + "api-reference/tables/endpoint/delete" + ] + } + ] + }, + { + "group": "Preset Endpoints", + "pages": [ + { + "group": "DEX", + "pages": [ + "api-reference/dex/endpoint/dex_pair" + ] + }, + { + "group": "EigenLayer", + "pages": [ + "api-reference/eigenlayer/introduction", + "api-reference/eigenlayer/endpoint/avs_metadata", + "api-reference/eigenlayer/endpoint/avs_metrics", + "api-reference/eigenlayer/endpoint/operator_metadata", + "api-reference/eigenlayer/endpoint/operator_metrics", + "api-reference/eigenlayer/endpoint/operator_to_avs_mapping" + ] + }, + { + "group": "EVM Contracts", + "pages": [ + "api-reference/evm/endpoint/contracts" + ] + }, + { + "group": "Farcaster", + "pages": [ + "api-reference/farcaster/introduction", + "api-reference/farcaster/endpoint/farcaster_channels", + "api-reference/farcaster/endpoint/farcaster_memecoins", + "api-reference/farcaster/endpoint/farcaster_users" + ] + }, + { + "group": "Markets", + "pages": [ + "api-reference/markets/endpoint/marketplace_marketshare" + ] + }, + { + "group": "Projects", + "pages": [ + "api-reference/projects/introduction", + "api-reference/projects/endpoint/linea_lxp" + ] + } + ] + } + ] + }, + { + "tab": "Datashare", + "pages": [ + { + "group": "Datashare", + "pages": [ + "datashare/datashare", + "datashare/datashare-snowflake", + "datashare/datashare-bigquery", + "datashare/datashare-trial", + "datashare/datashare-faqs" + ] + } + ] + }, + { + "tab": "Catalyst", + "pages": [ + { + "group": "Catalyst", + "pages": [ + "catalyst/overview" + ] + } + ] + } + ] + }, + "contextual": { + "options": [ + "chatgpt", + "claude", + "perplexity", + "copy", + "view" + ] + }, + "seo": { + "metatags": { + "title": "Dune Docs", + "description": "Official documentation for building with Dune's data platform, query engine, and API.", + "og:image": "/images/dune-docs-cover.jpg", + "og:site_name": "Dune Docs", + "twitter:card": "summary_large_image" + }, + "indexing": "navigable" + }, + "footer": { + "socials": { + "linkedin": "https://www.linkedin.com/company/dune-analytics", + "github": "https://github.com/duneanalytics", + "x": "https://x.com/dune", + "discord": "https://discord.gg/ErrzwBz", + "telegram": "https://t.me/dune_updates", + "youtube": "https://www.youtube.com/@dunecom" + } + }, + "integrations": { + "amplitude": { + "apiKey": "e76ce253e6eaa36e3be8e6872101e33a" + }, + "ga4": { + "measurementId": "G-H1G057R0KN" + }, + "gtm": { + "tagId": "GTM-P46XP3Z5" + } + }, + "redirects": [ + { + "source": "/data-tables/:slug*", + "destination": "/data-catalog/:slug*" + }, + { + "source": "/api-reference/tables/blockchain/overview", + "destination": "/catalyst/hosted" + }, + { + "source": "/api-reference/tables/blockchain/insert", + "destination": "/catalyst/hosted" + }, + { + "source": "/api-reference/tables/blockchain/clear", + "destination": "/catalyst/hosted" + }, + { + "source": "/api-reference/tables/blockchain/delete", + "destination": "/catalyst/hosted" + } + ] +} \ No newline at end of file diff --git a/mint.json.backup b/mint.json.backup new file mode 100644 index 00000000..afb9c71b --- /dev/null +++ b/mint.json.backup @@ -0,0 +1,3032 @@ +{ + "$schema": "https://mintlify.com/schema.json", + "name": "Dune Docs", + "logo": { + "light": "/logo/dune-logo-light.png", + "dark": "/logo/dune-logo-dark.png" + }, + "favicon": "/dune.png", + "seo": { + "title": "Dune Docs", + "titleSuffix": " | Dune Docs", + "description": "Official documentation for building with Dune's data platform, query engine, and API.", + "image": "/images/dune-docs-cover.jpg", + "siteUrl": "https://docs.dune.com", + "twitterCard": "summary_large_image" + }, + "colors": { + "primary": "#F4603E", + "light": "#F49282", + "dark": "#F4603E", + "anchors": { + "from": "#F4603E", + "to": "#F49282" + } + }, + "topbarLinks": [ + { + "name": "Support", + "url": "mailto:support@dune.com" + } + ], + "topbarCtaButton": { + "name": "Start building", + "url": "https://dune.com" + }, + "primaryTab": { + "name": "Get Started" + }, + "tabs": [ + { + "name": "Analytics Studio", + "url": "web-app" + }, + { + "name": "Query Engine", + "url": "query-engine" + }, + { + "name": "Data Catalog", + "url": "data-catalog" + }, + { + "name": "Analytics API", + "url": "api-reference" + }, + { + "name": "Datashare", + "url": "datashare" + }, + { + "name": "Catalyst", + "url": "catalyst" + } + ], + "contextual": { + "options": [ + "copy", + "view", + "chatgpt", + "claude", + "perplexity" + ] + }, + "navigation": [ + { + "group": "", + "pages": ["home", "quickstart", "learning-resources"] + }, + { + "group": "Jump right in", + "pages": [ + "learning/how-tos/create-your-first-query", + "learning/how-tos/query-templates", + "learning/how-tos/create-new-content", + "learning/how-tos/create-your-first-visualization", + "learning/how-tos/navigate-query-editor", + "learning/how-tos/find-datasets", + "learning/how-tos/export-data-out", + "learning/how-tos/create-and-manage-teams", + "learning/how-tos/credit-system-on-dune", + "learning/how-tos/credit-system", + "learning/how-tos/search-for-content", + "learning/how-tos/share-dune-content", + "learning/how-tos/share-your-query", + "learning/how-tos/transfer-ownership", + "learning/flipside-migration-guide" + ] + }, + { + "group": "Analytics Studio", + "pages": [ + "web-app/overview", + { + "group": "Create Queries", + "pages": [ + "web-app/query-editor/query-window", + "web-app/query-editor/data-explorer", + "web-app/query-editor/parameters", + "web-app/query-editor/query-scheduler", + "web-app/query-editor/query-lineage", + "web-app/query-editor/version-history" + ] + }, + { + "group": "Create Visualizations", + "pages": [ + "web-app/visualizations/charts-graphs", + "web-app/visualizations/counters", + "web-app/visualizations/tables" + ] + }, + { + "group": "Decoding Contracts", + "pages": [ + "web-app/decoding/decoding-contracts", + "web-app/decoding/best-practices", + "web-app/decoding/faqs", + "web-app/decoding/multichain-decoding", + "web-app/decoding/short-guide-contract-submission" + ] + }, + "web-app/dashboards", + "web-app/teams", + "web-app/dune-ai", + "web-app/upload-data", + "web-app/embeds", + "web-app/search", + "web-app/alerts", + "web-app/bug-bounty", + "web-app/user-activity" + ] + }, + { + "group": "", + "pages": ["query-engine/overview"] + }, + { + "group": "Functionality", + "pages": [ + "query-engine/query-executions", + "query-engine/query-a-query", + "query-engine/materialized-views" + ] + }, + { + "group": "DuneSQL", + "pages": [ + "query-engine/dunesql-architecture", + "query-engine/writing-efficient-queries", + "query-engine/datatypes", + "query-engine/reserved-keywords" + ] + }, + + { + "group": "Functions and Operators", + "pages": [ + "query-engine/Functions-and-operators/index", + "query-engine/Functions-and-operators/aggregate", + "query-engine/Functions-and-operators/array", + "query-engine/Functions-and-operators/asof-join", + "query-engine/Functions-and-operators/base58", + "query-engine/Functions-and-operators/binary", + "query-engine/Functions-and-operators/bitwise", + "query-engine/Functions-and-operators/chain-utility-functions", + "query-engine/Functions-and-operators/comparison", + "query-engine/Functions-and-operators/conditional", + "query-engine/Functions-and-operators/conversion", + "query-engine/Functions-and-operators/datetime", + "query-engine/Functions-and-operators/decimal", + "query-engine/Functions-and-operators/evm-decoding-functions", + "query-engine/Functions-and-operators/hyperloglog", + "query-engine/Functions-and-operators/json", + "query-engine/Functions-and-operators/lambda", + "query-engine/Functions-and-operators/live-fetch", + "query-engine/Functions-and-operators/logical", + "query-engine/Functions-and-operators/map", + "query-engine/Functions-and-operators/math", + "query-engine/Functions-and-operators/ml", + "query-engine/Functions-and-operators/qdigest", + "query-engine/Functions-and-operators/regexp", + "query-engine/Functions-and-operators/setdigest", + "query-engine/Functions-and-operators/ss58", + "query-engine/Functions-and-operators/tonaddress", + "query-engine/Functions-and-operators/tronaddress", + "query-engine/Functions-and-operators/string", + "query-engine/Functions-and-operators/system", + "query-engine/Functions-and-operators/tdigest", + "query-engine/Functions-and-operators/teradata", + "query-engine/Functions-and-operators/url", + "query-engine/Functions-and-operators/uuid", + "query-engine/Functions-and-operators/varbinary", + "query-engine/Functions-and-operators/varchar-utility-functions", + "query-engine/Functions-and-operators/window" + ] + }, + { + "group": "", + "pages": [ + "data-catalog/overview", + "data-catalog/data-freshness", + "data-catalog/bring-your-own-data" + ] + }, + { + "group": "Curated Data", + "pages": [ + "data-catalog/curated/overview", + { + "group": "DEX Trades", + "icon": "shuffle", + "pages": [ + "data-catalog/curated/dex-trades/overview", + { + "group": "EVM DEX", + "icon": "e", + "pages": [ + "data-catalog/curated/dex-trades/evm/dex-trades", + "data-catalog/curated/dex-trades/evm/dex-aggregator-trades", + "data-catalog/curated/dex-trades/evm/dex-sandwiched", + "data-catalog/curated/dex-trades/evm/dex-sandwiches" + ] + }, + { + "group": "Solana DEX", + "icon": "s", + "pages": [ + "data-catalog/curated/dex-trades/solana/overview", + "data-catalog/curated/dex-trades/solana/jupiter-aggregator-trades", + "data-catalog/curated/dex-trades/solana/solana-dex-trades" + ] + } + ] + }, + { + "group": "Token Transfers", + "icon": "coins", + "pages": [ + "data-catalog/curated/token-transfers/overview", + { + "group": "EVM Token Transfers", + "icon": "e", + "pages": [ + "data-catalog/curated/token-transfers/evm/balances", + "data-catalog/curated/token-transfers/evm/token-transfers", + "data-catalog/curated/token-transfers/evm/tokens-metadata" + ] + }, + { + "group": "Solana Token Transfers", + "icon": "s", + "pages": [ + "data-catalog/curated/token-transfers/solana/overview", + "data-catalog/curated/token-transfers/solana/solana-token-accounts", + "data-catalog/curated/token-transfers/solana/solana-token-metadata", + "data-catalog/curated/token-transfers/solana/solana-token-transfers" + ] + } + ] + }, + { + "group": "Labels", + "icon": "tag", + "pages": [ + "data-catalog/curated/labels/overview", + "data-catalog/curated/labels/address-labels", + "data-catalog/curated/labels/ens-labels", + "data-catalog/curated/labels/owner-addresses", + "data-catalog/curated/labels/owner-details" + ] + }, + { + "group": "Prices", + "icon": "dollar-sign", + "pages": [ + "data-catalog/curated/prices/overview", + "data-catalog/curated/prices/prices_minute", + "data-catalog/curated/prices/prices_hour", + "data-catalog/curated/prices/prices_day", + "data-catalog/curated/prices/prices_usd", + "data-catalog/curated/prices/prices_latest" + ] + }, + { + "group": "NFT Trades", + "icon": "image", + "pages": [ + "data-catalog/curated/nft-trades/overview", + { + "group": "EVM NFT", + "icon": "e", + "pages": [ + "data-catalog/curated/nft-trades/evm/nft-trades", + "data-catalog/curated/nft-trades/evm/nft-mints", + "data-catalog/curated/nft-trades/evm/nft-wash-trades", + "data-catalog/curated/nft-trades/evm/nft-metadata", + "data-catalog/curated/nft-trades/evm/nft-transfers" + ] + }, + { + "group": "Solana NFT", + "icon": "s", + "pages": [ + "data-catalog/curated/nft-trades/solana/solana-nft-metadata", + "data-catalog/curated/nft-trades/solana/solana-nft-transfers" + ] + } + ] + } + ] + }, + { + "group": "EVM Networks", + "pages": [ + "data-catalog/evm/overview", + { + "group": "Abstract", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/abstract/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/abstract/raw/blocks", + "data-catalog/evm/abstract/raw/creation-traces", + "data-catalog/evm/abstract/raw/logs", + "data-catalog/evm/abstract/raw/transactions", + "data-catalog/evm/abstract/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/abstract/decoded/overview", + "data-catalog/evm/abstract/decoded/call-tables", + "data-catalog/evm/abstract/decoded/event-logs", + "data-catalog/evm/abstract/decoded/contracts", + "data-catalog/evm/abstract/decoded/logs-decoded", + "data-catalog/evm/abstract/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/abstract/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/abstract/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "ApeChain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/apechain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/apechain/raw/blocks", + "data-catalog/evm/apechain/raw/creation-traces", + "data-catalog/evm/apechain/raw/logs", + "data-catalog/evm/apechain/raw/transactions", + "data-catalog/evm/apechain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/apechain/decoded/overview", + "data-catalog/evm/apechain/decoded/call-tables", + "data-catalog/evm/apechain/decoded/event-logs", + "data-catalog/evm/apechain/decoded/contracts", + "data-catalog/evm/apechain/decoded/logs-decoded", + "data-catalog/evm/apechain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/apechain/curated-data/dex/dex-trades", + "data-catalog/evm/apechain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/apechain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Arbitrum One", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/arbitrum/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/arbitrum/raw/blocks", + "data-catalog/evm/arbitrum/raw/creation-traces", + "data-catalog/evm/arbitrum/raw/logs", + "data-catalog/evm/arbitrum/raw/transactions", + "data-catalog/evm/arbitrum/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/arbitrum/decoded/overview", + "data-catalog/evm/arbitrum/decoded/call-tables", + "data-catalog/evm/arbitrum/decoded/event-logs", + "data-catalog/evm/arbitrum/decoded/contracts", + "data-catalog/evm/arbitrum/decoded/logs-decoded", + "data-catalog/evm/arbitrum/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/arbitrum/curated-data/dex/dex-trades", + "data-catalog/evm/arbitrum/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/arbitrum/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Arbitrum Nova", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/arbitrum-nova/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/arbitrum-nova/raw/blocks", + "data-catalog/evm/arbitrum-nova/raw/creation-traces", + "data-catalog/evm/arbitrum-nova/raw/logs", + "data-catalog/evm/arbitrum-nova/raw/transactions", + "data-catalog/evm/arbitrum-nova/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/arbitrum-nova/decoded/overview", + "data-catalog/evm/arbitrum-nova/decoded/call-tables", + "data-catalog/evm/arbitrum-nova/decoded/event-logs", + "data-catalog/evm/arbitrum-nova/decoded/contracts", + "data-catalog/evm/arbitrum-nova/decoded/logs-decoded", + "data-catalog/evm/arbitrum-nova/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/arbitrum-nova/curated-data/dex/dex-trades", + "data-catalog/evm/arbitrum-nova/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/arbitrum-nova/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Avalanche", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/avalanche/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/avalanche/raw/blocks", + "data-catalog/evm/avalanche/raw/creation-traces", + "data-catalog/evm/avalanche/raw/logs", + "data-catalog/evm/avalanche/raw/transactions", + "data-catalog/evm/avalanche/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/avalanche/decoded/overview", + "data-catalog/evm/avalanche/decoded/call-tables", + "data-catalog/evm/avalanche/decoded/event-logs", + "data-catalog/evm/avalanche/decoded/contracts", + "data-catalog/evm/avalanche/decoded/logs-decoded", + "data-catalog/evm/avalanche/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/avalanche/curated-data/dex/dex-trades", + "data-catalog/evm/avalanche/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/avalanche/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "B3", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/b3/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/b3/raw/blocks", + "data-catalog/evm/b3/raw/creation-traces", + "data-catalog/evm/b3/raw/logs", + "data-catalog/evm/b3/raw/transactions", + "data-catalog/evm/b3/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/b3/decoded/overview", + "data-catalog/evm/b3/decoded/call-tables", + "data-catalog/evm/b3/decoded/event-logs", + "data-catalog/evm/b3/decoded/contracts", + "data-catalog/evm/b3/decoded/logs-decoded", + "data-catalog/evm/b3/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/b3/curated-data/dex/dex-trades", + "data-catalog/evm/b3/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/b3/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Base", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/base/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/base/raw/blocks", + "data-catalog/evm/base/raw/creation-traces", + "data-catalog/evm/base/raw/logs", + "data-catalog/evm/base/raw/transactions", + "data-catalog/evm/base/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/base/decoded/overview", + "data-catalog/evm/base/decoded/call-tables", + "data-catalog/evm/base/decoded/event-logs", + "data-catalog/evm/base/decoded/contracts", + "data-catalog/evm/base/decoded/logs-decoded", + "data-catalog/evm/base/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/base/curated-data/dex/dex-trades", + "data-catalog/evm/base/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/base/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Berachain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/berachain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/berachain/raw/blocks", + "data-catalog/evm/berachain/raw/creation-traces", + "data-catalog/evm/berachain/raw/logs", + "data-catalog/evm/berachain/raw/transactions", + "data-catalog/evm/berachain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/berachain/decoded/overview", + "data-catalog/evm/berachain/decoded/call-tables", + "data-catalog/evm/berachain/decoded/event-logs", + "data-catalog/evm/berachain/decoded/contracts", + "data-catalog/evm/berachain/decoded/logs-decoded", + "data-catalog/evm/berachain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/berachain/curated-data/dex/dex-trades", + "data-catalog/evm/berachain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/berachain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Beacon", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/beacon/overview", + "data-catalog/evm/beacon/attestations", + "data-catalog/evm/beacon/attester-slashings", + "data-catalog/evm/beacon/blobs", + "data-catalog/evm/beacon/blocks", + "data-catalog/evm/beacon/bls-to-execution-changes", + "data-catalog/evm/beacon/deposits", + "data-catalog/evm/beacon/epoch-summaries", + "data-catalog/evm/beacon/operators", + "data-catalog/evm/beacon/proposer-slashings", + "data-catalog/evm/beacon/raw", + "data-catalog/evm/beacon/validator-day-summaries", + "data-catalog/evm/beacon/validators", + "data-catalog/evm/beacon/voluntary-exits", + "data-catalog/evm/beacon/withdrawals" + ] + }, + { + "group": "Blast", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/blast/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/blast/raw/blocks", + "data-catalog/evm/blast/raw/creation-traces", + "data-catalog/evm/blast/raw/logs", + "data-catalog/evm/blast/raw/transactions", + "data-catalog/evm/blast/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/blast/decoded/overview", + "data-catalog/evm/blast/decoded/call-tables", + "data-catalog/evm/blast/decoded/event-logs", + "data-catalog/evm/blast/decoded/contracts", + "data-catalog/evm/blast/decoded/logs-decoded", + "data-catalog/evm/blast/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/blast/curated-data/dex/dex-trades", + "data-catalog/evm/blast/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/blast/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "BNB", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/bnb/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/bnb/raw/blocks", + "data-catalog/evm/bnb/raw/creation-traces", + "data-catalog/evm/bnb/raw/logs", + "data-catalog/evm/bnb/raw/transactions", + "data-catalog/evm/bnb/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/bnb/decoded/overview", + "data-catalog/evm/bnb/decoded/call-tables", + "data-catalog/evm/bnb/decoded/event-logs", + "data-catalog/evm/bnb/decoded/contracts", + "data-catalog/evm/bnb/decoded/logs-decoded", + "data-catalog/evm/bnb/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/bnb/curated-data/dex/dex-trades", + "data-catalog/evm/bnb/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/bnb/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "BOB", + "icon": "database", + "iconType": "regular", + "pages": [ + "data-catalog/evm/bob/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/bob/raw/blocks", + "data-catalog/evm/bob/raw/logs", + "data-catalog/evm/bob/raw/transactions", + "data-catalog/evm/bob/raw/traces" + ] + } + ] + }, + { + "group": "Boba", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/boba/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/boba/raw/blocks", + "data-catalog/evm/boba/raw/creation-traces", + "data-catalog/evm/boba/raw/logs", + "data-catalog/evm/boba/raw/transactions", + "data-catalog/evm/boba/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/boba/decoded/overview", + "data-catalog/evm/boba/decoded/call-tables", + "data-catalog/evm/boba/decoded/event-logs", + "data-catalog/evm/boba/decoded/contracts", + "data-catalog/evm/boba/decoded/logs-decoded", + "data-catalog/evm/boba/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/boba/curated-data/dex/dex-trades", + "data-catalog/evm/boba/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/boba/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Celo", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/celo/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/celo/raw/blocks", + "data-catalog/evm/celo/raw/creation-traces", + "data-catalog/evm/celo/raw/logs", + "data-catalog/evm/celo/raw/transactions", + "data-catalog/evm/celo/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/celo/decoded/overview", + "data-catalog/evm/celo/decoded/call-tables", + "data-catalog/evm/celo/decoded/event-logs", + "data-catalog/evm/celo/decoded/contracts", + "data-catalog/evm/celo/decoded/logs-decoded", + "data-catalog/evm/celo/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/celo/curated-data/dex/dex-trades", + "data-catalog/evm/celo/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/celo/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Corn", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/corn/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/corn/raw/blocks", + "data-catalog/evm/corn/raw/creation-traces", + "data-catalog/evm/corn/raw/logs", + "data-catalog/evm/corn/raw/transactions", + "data-catalog/evm/corn/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/corn/decoded/overview", + "data-catalog/evm/corn/decoded/call-tables", + "data-catalog/evm/corn/decoded/event-logs", + "data-catalog/evm/corn/decoded/contracts", + "data-catalog/evm/corn/decoded/logs-decoded", + "data-catalog/evm/corn/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/corn/curated-data/dex/dex-trades", + "data-catalog/evm/corn/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/corn/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Degen", + "icon": "database", + "iconType": "regular", + "pages": [ + "data-catalog/evm/degen/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/degen/raw/blocks", + "data-catalog/evm/degen/raw/logs", + "data-catalog/evm/degen/raw/transactions", + "data-catalog/evm/degen/raw/traces" + ] + } + ] + }, + { + "group": "Ethereum", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/ethereum/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/ethereum/raw/transactions", + "data-catalog/evm/ethereum/raw/logs", + "data-catalog/evm/ethereum/raw/traces", + "data-catalog/evm/ethereum/raw/creation-traces", + "data-catalog/evm/ethereum/raw/blocks", + "data-catalog/evm/ethereum/raw/withdrawals" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/ethereum/decoded/overview", + "data-catalog/evm/ethereum/decoded/call-tables", + "data-catalog/evm/ethereum/decoded/event-logs", + "data-catalog/evm/ethereum/decoded/contracts", + "data-catalog/evm/ethereum/decoded/logs-decoded", + "data-catalog/evm/ethereum/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/ethereum/curated-data/dex/dex-trades", + "data-catalog/evm/ethereum/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/ethereum/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Fantom", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/fantom/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/fantom/raw/blocks", + "data-catalog/evm/fantom/raw/creation-traces", + "data-catalog/evm/fantom/raw/logs", + "data-catalog/evm/fantom/raw/transactions", + "data-catalog/evm/fantom/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/fantom/decoded/overview", + "data-catalog/evm/fantom/decoded/call-tables", + "data-catalog/evm/fantom/decoded/event-logs", + "data-catalog/evm/fantom/decoded/contracts", + "data-catalog/evm/fantom/decoded/logs-decoded", + "data-catalog/evm/fantom/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/fantom/curated-data/dex/dex-trades", + "data-catalog/evm/fantom/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/fantom/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Flare", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/flare/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/flare/raw/blocks", + "data-catalog/evm/flare/raw/creation-traces", + "data-catalog/evm/flare/raw/logs", + "data-catalog/evm/flare/raw/transactions", + "data-catalog/evm/flare/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/flare/decoded/overview", + "data-catalog/evm/flare/decoded/call-tables", + "data-catalog/evm/flare/decoded/event-logs", + "data-catalog/evm/flare/decoded/contracts", + "data-catalog/evm/flare/decoded/logs-decoded", + "data-catalog/evm/flare/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/flare/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/flare/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Flow EVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/flow-evm/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/flow-evm/raw/blocks", + "data-catalog/evm/flow-evm/raw/creation-traces", + "data-catalog/evm/flow-evm/raw/logs", + "data-catalog/evm/flow-evm/raw/transactions", + "data-catalog/evm/flow-evm/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/flow-evm/decoded/overview", + "data-catalog/evm/flow-evm/decoded/call-tables", + "data-catalog/evm/flow-evm/decoded/event-logs", + "data-catalog/evm/flow-evm/decoded/contracts", + "data-catalog/evm/flow-evm/decoded/logs-decoded", + "data-catalog/evm/flow-evm/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Gnosis", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/gnosis/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/gnosis/raw/blocks", + "data-catalog/evm/gnosis/raw/creation-traces", + "data-catalog/evm/gnosis/raw/logs", + "data-catalog/evm/gnosis/raw/transactions", + "data-catalog/evm/gnosis/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/gnosis/decoded/overview", + "data-catalog/evm/gnosis/decoded/call-tables", + "data-catalog/evm/gnosis/decoded/event-logs", + "data-catalog/evm/gnosis/decoded/contracts", + "data-catalog/evm/gnosis/decoded/logs-decoded", + "data-catalog/evm/gnosis/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/gnosis/curated-data/dex/dex-trades", + "data-catalog/evm/gnosis/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/gnosis/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Hemi", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/hemi/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/hemi/raw/blocks", + "data-catalog/evm/hemi/raw/creation-traces", + "data-catalog/evm/hemi/raw/logs", + "data-catalog/evm/hemi/raw/transactions", + "data-catalog/evm/hemi/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/hemi/decoded/overview", + "data-catalog/evm/hemi/decoded/call-tables", + "data-catalog/evm/hemi/decoded/event-logs", + "data-catalog/evm/hemi/decoded/contracts", + "data-catalog/evm/hemi/decoded/logs-decoded", + "data-catalog/evm/hemi/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": ["data-catalog/evm/hemi/curated-data/dex/dex-trades"] + } + ] + } + ] + }, + { + "group": "HyperEVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/hyperevm/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/hyperevm/raw/blocks", + "data-catalog/evm/hyperevm/raw/logs", + "data-catalog/evm/hyperevm/raw/transactions" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/hyperevm/decoded/overview", + "data-catalog/evm/hyperevm/decoded/event-logs", + "data-catalog/evm/hyperevm/decoded/contracts", + "data-catalog/evm/hyperevm/decoded/logs-decoded" + ] + } + ] + }, + { + "group": "Ink", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/ink/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/ink/raw/blocks", + "data-catalog/evm/ink/raw/creation-traces", + "data-catalog/evm/ink/raw/logs", + "data-catalog/evm/ink/raw/transactions", + "data-catalog/evm/ink/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/ink/decoded/overview", + "data-catalog/evm/ink/decoded/call-tables", + "data-catalog/evm/ink/decoded/event-logs", + "data-catalog/evm/ink/decoded/contracts", + "data-catalog/evm/ink/decoded/logs-decoded", + "data-catalog/evm/ink/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/ink/curated-data/dex/dex-trades", + "data-catalog/evm/ink/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/ink/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "KAIA", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/kaia/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/kaia/raw/blocks", + "data-catalog/evm/kaia/raw/creation-traces", + "data-catalog/evm/kaia/raw/logs", + "data-catalog/evm/kaia/raw/transactions", + "data-catalog/evm/kaia/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/kaia/decoded/overview", + "data-catalog/evm/kaia/decoded/call-tables", + "data-catalog/evm/kaia/decoded/event-logs", + "data-catalog/evm/kaia/decoded/contracts", + "data-catalog/evm/kaia/decoded/logs-decoded", + "data-catalog/evm/kaia/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": ["data-catalog/evm/kaia/curated-data/dex/dex-trades"] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/kaia/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Katana", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/katana/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/katana/raw/blocks", + "data-catalog/evm/katana/raw/creation-traces", + "data-catalog/evm/katana/raw/logs", + "data-catalog/evm/katana/raw/transactions", + "data-catalog/evm/katana/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/katana/decoded/overview", + "data-catalog/evm/katana/decoded/call-tables", + "data-catalog/evm/katana/decoded/event-logs", + "data-catalog/evm/katana/decoded/contracts", + "data-catalog/evm/katana/decoded/logs-decoded", + "data-catalog/evm/katana/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/katana/curated-data/dex/dex-trades", + "data-catalog/evm/katana/curated-data/dex/dex-aggregator-trades" + ] + } + ] + } + ] + }, + { + "group": "Lens", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/lens/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/lens/raw/blocks", + "data-catalog/evm/lens/raw/creation-traces", + "data-catalog/evm/lens/raw/logs", + "data-catalog/evm/lens/raw/transactions", + "data-catalog/evm/lens/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/lens/decoded/overview", + "data-catalog/evm/lens/decoded/call-tables", + "data-catalog/evm/lens/decoded/event-logs", + "data-catalog/evm/lens/decoded/contracts", + "data-catalog/evm/lens/decoded/logs-decoded", + "data-catalog/evm/lens/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": ["data-catalog/evm/lens/curated-data/dex/dex-trades"] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/lens/curated-data/nft/nft-trades"] + } + ] + } + ] + }, + { + "group": "Linea", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/linea/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/linea/raw/blocks", + "data-catalog/evm/linea/raw/creation-traces", + "data-catalog/evm/linea/raw/logs", + "data-catalog/evm/linea/raw/transactions", + "data-catalog/evm/linea/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/linea/decoded/overview", + "data-catalog/evm/linea/decoded/call-tables", + "data-catalog/evm/linea/decoded/event-logs", + "data-catalog/evm/linea/decoded/contracts", + "data-catalog/evm/linea/decoded/logs-decoded", + "data-catalog/evm/linea/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/linea/curated-data/dex/dex-trades", + "data-catalog/evm/linea/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/linea/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Mantle", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/mantle/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/mantle/raw/blocks", + "data-catalog/evm/mantle/raw/creation-traces", + "data-catalog/evm/mantle/raw/logs", + "data-catalog/evm/mantle/raw/transactions", + "data-catalog/evm/mantle/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/mantle/decoded/overview", + "data-catalog/evm/mantle/decoded/call-tables", + "data-catalog/evm/mantle/decoded/event-logs", + "data-catalog/evm/mantle/decoded/contracts", + "data-catalog/evm/mantle/decoded/logs-decoded", + "data-catalog/evm/mantle/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/mantle/curated-data/dex/dex-trades", + "data-catalog/evm/mantle/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/mantle/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Monad Testnet", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/monad-testnet/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/monad-testnet/raw/blocks", + "data-catalog/evm/monad-testnet/raw/creation-traces", + "data-catalog/evm/monad-testnet/raw/logs", + "data-catalog/evm/monad-testnet/raw/transactions", + "data-catalog/evm/monad-testnet/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/monad-testnet/decoded/overview", + "data-catalog/evm/monad-testnet/decoded/call-tables", + "data-catalog/evm/monad-testnet/decoded/event-logs", + "data-catalog/evm/monad-testnet/decoded/contracts", + "data-catalog/evm/monad-testnet/decoded/logs-decoded", + "data-catalog/evm/monad-testnet/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "opBNB", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/opbnb/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/opbnb/raw/blocks", + "data-catalog/evm/opbnb/raw/creation-traces", + "data-catalog/evm/opbnb/raw/logs", + "data-catalog/evm/opbnb/raw/transactions", + "data-catalog/evm/opbnb/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/opbnb/decoded/overview", + "data-catalog/evm/opbnb/decoded/call-tables", + "data-catalog/evm/opbnb/decoded/event-logs", + "data-catalog/evm/opbnb/decoded/contracts", + "data-catalog/evm/opbnb/decoded/logs-decoded", + "data-catalog/evm/opbnb/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/opbnb/curated-data/dex/dex-trades", + "data-catalog/evm/opbnb/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/opbnb/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Optimism", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/optimism/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/optimism/raw/blocks", + "data-catalog/evm/optimism/raw/creation-traces", + "data-catalog/evm/optimism/raw/logs", + "data-catalog/evm/optimism/raw/transactions", + "data-catalog/evm/optimism/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/optimism/decoded/overview", + "data-catalog/evm/optimism/decoded/call-tables", + "data-catalog/evm/optimism/decoded/event-logs", + "data-catalog/evm/optimism/decoded/contracts", + "data-catalog/evm/optimism/decoded/logs-decoded", + "data-catalog/evm/optimism/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/optimism/curated-data/dex/dex-trades", + "data-catalog/evm/optimism/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/optimism/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Plume", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/plume/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/plume/raw/blocks", + "data-catalog/evm/plume/raw/creation-traces", + "data-catalog/evm/plume/raw/logs", + "data-catalog/evm/plume/raw/transactions", + "data-catalog/evm/plume/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/plume/decoded/overview", + "data-catalog/evm/plume/decoded/event-logs", + "data-catalog/evm/plume/decoded/contracts", + "data-catalog/evm/plume/decoded/logs-decoded", + "data-catalog/evm/plume/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/plume/curated-data/dex/dex-trades", + "data-catalog/evm/plume/curated-data/dex/dex-aggregator-trades" + ] + } + ] + } + ] + }, + { + "group": "Plasma", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/plasma/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/plasma/raw/blocks", + "data-catalog/evm/plasma/raw/transactions", + "data-catalog/evm/plasma/raw/logs", + "data-catalog/evm/plasma/raw/traces", + "data-catalog/evm/plasma/raw/creation-traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/plasma/decoded/overview", + "data-catalog/evm/plasma/decoded/call-tables", + "data-catalog/evm/plasma/decoded/event-logs", + "data-catalog/evm/plasma/decoded/contracts", + "data-catalog/evm/plasma/decoded/logs-decoded", + "data-catalog/evm/plasma/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Polygon", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/polygon/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/polygon/raw/blocks", + "data-catalog/evm/polygon/raw/creation-traces", + "data-catalog/evm/polygon/raw/logs", + "data-catalog/evm/polygon/raw/transactions", + "data-catalog/evm/polygon/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/polygon/decoded/overview", + "data-catalog/evm/polygon/decoded/call-tables", + "data-catalog/evm/polygon/decoded/event-logs", + "data-catalog/evm/polygon/decoded/contracts", + "data-catalog/evm/polygon/decoded/logs-decoded", + "data-catalog/evm/polygon/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/polygon/curated-data/dex/dex-trades", + "data-catalog/evm/polygon/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/polygon/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Polygon-zkEVM", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/polygon-zkEVM/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/polygon-zkEVM/raw/blocks", + "data-catalog/evm/polygon-zkEVM/raw/creation-traces", + "data-catalog/evm/polygon-zkEVM/raw/logs", + "data-catalog/evm/polygon-zkEVM/raw/transactions", + "data-catalog/evm/polygon-zkEVM/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/polygon-zkEVM/decoded/overview", + "data-catalog/evm/polygon-zkEVM/decoded/call-tables", + "data-catalog/evm/polygon-zkEVM/decoded/event-logs", + "data-catalog/evm/polygon-zkEVM/decoded/contracts", + "data-catalog/evm/polygon-zkEVM/decoded/logs-decoded", + "data-catalog/evm/polygon-zkEVM/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/polygon-zkEVM/curated-data/dex/dex-trades", + "data-catalog/evm/polygon-zkEVM/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/polygon-zkEVM/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Ronin", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/ronin/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/ronin/raw/blocks", + "data-catalog/evm/ronin/raw/creation-traces", + "data-catalog/evm/ronin/raw/logs", + "data-catalog/evm/ronin/raw/transactions", + "data-catalog/evm/ronin/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/ronin/decoded/overview", + "data-catalog/evm/ronin/decoded/call-tables", + "data-catalog/evm/ronin/decoded/event-logs", + "data-catalog/evm/ronin/decoded/contracts", + "data-catalog/evm/ronin/decoded/logs-decoded", + "data-catalog/evm/ronin/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/ronin/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/ronin/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Scroll", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/scroll/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/scroll/raw/blocks", + "data-catalog/evm/scroll/raw/creation-traces", + "data-catalog/evm/scroll/raw/logs", + "data-catalog/evm/scroll/raw/transactions", + "data-catalog/evm/scroll/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/scroll/decoded/overview", + "data-catalog/evm/scroll/decoded/call-tables", + "data-catalog/evm/scroll/decoded/event-logs", + "data-catalog/evm/scroll/decoded/contracts", + "data-catalog/evm/scroll/decoded/logs-decoded", + "data-catalog/evm/scroll/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/scroll/curated-data/dex/dex-trades", + "data-catalog/evm/scroll/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/scroll/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Sei", + "icon": "circles-overlap", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sei/overview", + { + "group": "Raw (EVM)", + "pages": [ + "data-catalog/evm/sei/raw/blocks", + "data-catalog/evm/sei/raw/creation-traces", + "data-catalog/evm/sei/raw/logs", + "data-catalog/evm/sei/raw/transactions", + "data-catalog/evm/sei/raw/traces" + ] + }, + { + "group": "Decoded (EVM)", + "pages": [ + "data-catalog/evm/sei/decoded/overview", + "data-catalog/evm/sei/decoded/call-tables", + "data-catalog/evm/sei/decoded/event-logs", + "data-catalog/evm/sei/decoded/contracts", + "data-catalog/evm/sei/decoded/logs-decoded", + "data-catalog/evm/sei/decoded/traces-decoded" + ] + }, + { + "group": "Curated (EVM)", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/sei/curated-data/dex/dex-trades", + "data-catalog/evm/sei/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/sei/curated-data/nft/nft-trades"] + } + ] + }, + { + "group": "Cosmos Data", + "pages": [ + "data-catalog/evm/sei/cosmos/cosmos_blocks", + "data-catalog/evm/sei/cosmos/cosmos_block_events", + "data-catalog/evm/sei/cosmos/cosmos_message_events", + "data-catalog/evm/sei/cosmos/cosmos_tx_messages", + "data-catalog/evm/sei/cosmos/cosmos_transactions", + "data-catalog/evm/sei/cosmos/cosmos_validators" + ] + } + ] + }, + { + "group": "Sepolia", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sepolia/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/sepolia/raw/blocks", + "data-catalog/evm/sepolia/raw/creation-traces", + "data-catalog/evm/sepolia/raw/logs", + "data-catalog/evm/sepolia/raw/transactions", + "data-catalog/evm/sepolia/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/sepolia/decoded/overview", + "data-catalog/evm/sepolia/decoded/call-tables", + "data-catalog/evm/sepolia/decoded/event-logs", + "data-catalog/evm/sepolia/decoded/contracts", + "data-catalog/evm/sepolia/decoded/logs-decoded", + "data-catalog/evm/sepolia/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Shape", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/shape/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/shape/raw/blocks", + "data-catalog/evm/shape/raw/creation-traces", + "data-catalog/evm/shape/raw/logs", + "data-catalog/evm/shape/raw/transactions", + "data-catalog/evm/shape/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/shape/decoded/overview", + "data-catalog/evm/shape/decoded/call-tables", + "data-catalog/evm/shape/decoded/event-logs", + "data-catalog/evm/shape/decoded/contracts", + "data-catalog/evm/shape/decoded/logs-decoded", + "data-catalog/evm/shape/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/shape/curated-data/dex/dex-trades", + "data-catalog/evm/shape/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/shape/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Sonic", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sonic/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/sonic/raw/blocks", + "data-catalog/evm/sonic/raw/creation-traces", + "data-catalog/evm/sonic/raw/logs", + "data-catalog/evm/sonic/raw/transactions", + "data-catalog/evm/sonic/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/sonic/decoded/overview", + "data-catalog/evm/sonic/decoded/call-tables", + "data-catalog/evm/sonic/decoded/event-logs", + "data-catalog/evm/sonic/decoded/contracts", + "data-catalog/evm/sonic/decoded/logs-decoded", + "data-catalog/evm/sonic/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/sonic/curated-data/dex/dex-trades", + "data-catalog/evm/sonic/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/sonic/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Somnia", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/somnia/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/somnia/raw/blocks", + "data-catalog/evm/somnia/raw/creation-traces", + "data-catalog/evm/somnia/raw/logs", + "data-catalog/evm/somnia/raw/transactions", + "data-catalog/evm/somnia/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/somnia/decoded/overview", + "data-catalog/evm/somnia/decoded/call-tables", + "data-catalog/evm/somnia/decoded/event-logs", + "data-catalog/evm/somnia/decoded/contracts", + "data-catalog/evm/somnia/decoded/logs-decoded", + "data-catalog/evm/somnia/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Sophon", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/sophon/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/sophon/raw/blocks", + "data-catalog/evm/sophon/raw/creation-traces", + "data-catalog/evm/sophon/raw/logs", + "data-catalog/evm/sophon/raw/transactions", + "data-catalog/evm/sophon/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/sophon/decoded/overview", + "data-catalog/evm/sophon/decoded/call-tables", + "data-catalog/evm/sophon/decoded/event-logs", + "data-catalog/evm/sophon/decoded/contracts", + "data-catalog/evm/sophon/decoded/logs-decoded", + "data-catalog/evm/sophon/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/sophon/curated-data/dex/dex-trades", + "data-catalog/evm/sophon/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/sophon/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Superseed", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/superseed/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/superseed/raw/blocks", + "data-catalog/evm/superseed/raw/creation-traces", + "data-catalog/evm/superseed/raw/logs", + "data-catalog/evm/superseed/raw/transactions", + "data-catalog/evm/superseed/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/superseed/decoded/overview", + "data-catalog/evm/superseed/decoded/call-tables", + "data-catalog/evm/superseed/decoded/event-logs", + "data-catalog/evm/superseed/decoded/contracts", + "data-catalog/evm/superseed/decoded/logs-decoded", + "data-catalog/evm/superseed/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/superseed/curated-data/dex/dex-trades" + ] + } + ] + } + ] + }, + { + "group": "Tac", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/tac/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/tac/raw/blocks", + "data-catalog/evm/tac/raw/creation-traces", + "data-catalog/evm/tac/raw/logs", + "data-catalog/evm/tac/raw/transactions", + "data-catalog/evm/tac/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/tac/decoded/overview", + "data-catalog/evm/tac/decoded/call-tables", + "data-catalog/evm/tac/decoded/event-logs", + "data-catalog/evm/tac/decoded/contracts", + "data-catalog/evm/tac/decoded/logs-decoded", + "data-catalog/evm/tac/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Taiko", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/taiko/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/taiko/raw/blocks", + "data-catalog/evm/taiko/raw/creation-traces", + "data-catalog/evm/taiko/raw/logs", + "data-catalog/evm/taiko/raw/transactions", + "data-catalog/evm/taiko/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/taiko/decoded/overview", + "data-catalog/evm/taiko/decoded/call-tables", + "data-catalog/evm/taiko/decoded/event-logs", + "data-catalog/evm/taiko/decoded/contracts", + "data-catalog/evm/taiko/decoded/logs-decoded", + "data-catalog/evm/taiko/decoded/traces-decoded" + ] + } + ] + }, + { + "group": "Unichain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/unichain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/unichain/raw/blocks", + "data-catalog/evm/unichain/raw/creation-traces", + "data-catalog/evm/unichain/raw/logs", + "data-catalog/evm/unichain/raw/transactions", + "data-catalog/evm/unichain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/unichain/decoded/overview", + "data-catalog/evm/unichain/decoded/call-tables", + "data-catalog/evm/unichain/decoded/event-logs", + "data-catalog/evm/unichain/decoded/contracts", + "data-catalog/evm/unichain/decoded/logs-decoded", + "data-catalog/evm/unichain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/unichain/curated-data/dex/dex-trades", + "data-catalog/evm/unichain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/unichain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Viction", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/viction/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/viction/raw/blocks", + "data-catalog/evm/viction/raw/creation-traces", + "data-catalog/evm/viction/raw/logs", + "data-catalog/evm/viction/raw/transactions", + "data-catalog/evm/viction/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/viction/decoded/overview", + "data-catalog/evm/viction/decoded/call-tables", + "data-catalog/evm/viction/decoded/event-logs", + "data-catalog/evm/viction/decoded/contracts", + "data-catalog/evm/viction/decoded/logs-decoded", + "data-catalog/evm/viction/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/viction/curated-data/dex/dex-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/viction/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "World Chain", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/worldchain/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/worldchain/raw/blocks", + "data-catalog/evm/worldchain/raw/creation-traces", + "data-catalog/evm/worldchain/raw/logs", + "data-catalog/evm/worldchain/raw/transactions", + "data-catalog/evm/worldchain/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/worldchain/decoded/overview", + "data-catalog/evm/worldchain/decoded/call-tables", + "data-catalog/evm/worldchain/decoded/event-logs", + "data-catalog/evm/worldchain/decoded/contracts", + "data-catalog/evm/worldchain/decoded/logs-decoded", + "data-catalog/evm/worldchain/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/worldchain/curated-data/dex/dex-trades", + "data-catalog/evm/worldchain/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/worldchain/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "zkSync", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/zksync/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/zksync/raw/blocks", + "data-catalog/evm/zksync/raw/creation-traces", + "data-catalog/evm/zksync/raw/logs", + "data-catalog/evm/zksync/raw/transactions", + "data-catalog/evm/zksync/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/zksync/decoded/overview", + "data-catalog/evm/zksync/decoded/call-tables", + "data-catalog/evm/zksync/decoded/event-logs", + "data-catalog/evm/zksync/decoded/contracts", + "data-catalog/evm/zksync/decoded/logs-decoded", + "data-catalog/evm/zksync/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/zksync/curated-data/dex/dex-trades", + "data-catalog/evm/zksync/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": [ + "data-catalog/evm/zksync/curated-data/nft/nft-trades" + ] + } + ] + } + ] + }, + { + "group": "Zora", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/evm/zora/overview", + { + "group": "Raw", + "pages": [ + "data-catalog/evm/zora/raw/blocks", + "data-catalog/evm/zora/raw/creation-traces", + "data-catalog/evm/zora/raw/logs", + "data-catalog/evm/zora/raw/transactions", + "data-catalog/evm/zora/raw/traces" + ] + }, + { + "group": "Decoded", + "pages": [ + "data-catalog/evm/zora/decoded/overview", + "data-catalog/evm/zora/decoded/call-tables", + "data-catalog/evm/zora/decoded/event-logs", + "data-catalog/evm/zora/decoded/contracts", + "data-catalog/evm/zora/decoded/logs-decoded", + "data-catalog/evm/zora/decoded/traces-decoded" + ] + }, + { + "group": "Curated", + "pages": [ + { + "group": "DEX", + "pages": [ + "data-catalog/evm/zora/curated-data/dex/dex-trades", + "data-catalog/evm/zora/curated-data/dex/dex-aggregator-trades" + ] + }, + { + "group": "NFT", + "pages": ["data-catalog/evm/zora/curated-data/nft/nft-trades"] + } + ] + } + ] + } + ] + }, + + { + "group": "Other Networks", + "pages": [ + { + "group": "Aptos", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/aptos/overview", + "data-catalog/aptos/blocks", + "data-catalog/aptos/events", + "data-catalog/aptos/move_modules", + "data-catalog/aptos/move_resources", + "data-catalog/aptos/move_table_items", + "data-catalog/aptos/signatures", + "data-catalog/aptos/transactions", + "data-catalog/aptos/user_transactions" + ] + }, + { + "group": "Bitcoin", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/bitcoin/overview", + "data-catalog/bitcoin/blocks", + "data-catalog/bitcoin/inputs", + "data-catalog/bitcoin/outputs", + "data-catalog/bitcoin/transactions" + ] + }, + { + "group": "Fuel", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/fuel/overview", + "data-catalog/fuel/blocks", + "data-catalog/fuel/transactions", + "data-catalog/fuel/receipts" + ] + }, + { + "group": "Noble", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/noble/overview", + "data-catalog/noble/blocks", + "data-catalog/noble/block_events", + "data-catalog/noble/bridge_transfers", + "data-catalog/noble/cctp_transactions", + "data-catalog/noble/message_events", + "data-catalog/noble/swaps", + "data-catalog/noble/transactions", + "data-catalog/noble/tx_messages", + "data-catalog/noble/validators" + ] + }, + { + "group": "NEAR", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/near/overview", + "data-catalog/near/actions", + "data-catalog/near/block_chunks", + "data-catalog/near/circulating_supply", + "data-catalog/near/ft_transfers", + "data-catalog/near/function_call", + "data-catalog/near/balances", + "data-catalog/near/nft_transfers", + "data-catalog/near/logs" + ] + }, + { + "group": "Polkadot", + "icon": "database", + "iconType": "regular", + "pages": [ + "data-catalog/substrate/overview", + "data-catalog/substrate/balances", + "data-catalog/substrate/blocks", + "data-catalog/substrate/calls", + "data-catalog/substrate/events", + "data-catalog/substrate/extrinsics", + "data-catalog/substrate/materialized_views", + "data-catalog/substrate/stakings", + "data-catalog/substrate/transfers", + "data-catalog/substrate/traces" + ] + }, + { + "group": "Solana", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/solana/overview", + "data-catalog/solana/account-activity", + "data-catalog/solana/blocks", + "data-catalog/solana/idl-tables", + "data-catalog/solana/instruction-calls", + "data-catalog/solana/rewards", + "data-catalog/solana/transactions", + "data-catalog/solana/vote-transactions" + ] + }, + { + "group": "Starknet", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/starknet/overview", + "data-catalog/starknet/blocks", + "data-catalog/starknet/transactions", + "data-catalog/starknet/events", + "data-catalog/starknet/calls" + ] + }, + { + "group": "Stellar", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/stellar/overview", + "data-catalog/stellar/evm_v_stellar", + "data-catalog/stellar/accounts", + "data-catalog/stellar/trust_lines", + "data-catalog/stellar/ttl", + "data-catalog/stellar/contract_data", + "data-catalog/stellar/history_ledgers", + "data-catalog/stellar/history_transactions", + "data-catalog/stellar/history_operations", + "data-catalog/stellar/history_effects", + "data-catalog/stellar/history_trades", + "data-catalog/stellar/liquidity_pools", + "data-catalog/stellar/history_contract_events" + ] + }, + { + "group": "Sui", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/sui/overview", + "data-catalog/sui/checkpoints", + "data-catalog/sui/events", + "data-catalog/sui/move_call", + "data-catalog/sui/move_package", + "data-catalog/sui/objects", + "data-catalog/sui/transaction_objects", + "data-catalog/sui/transactions", + "data-catalog/sui/wrapped_object" + ] + }, + { + "group": "TON", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/ton/overview", + "data-catalog/ton/accounts", + "data-catalog/ton/balances_history", + "data-catalog/ton/blocks", + "data-catalog/ton/transactions", + "data-catalog/ton/messages", + "data-catalog/ton/dex_pools", + "data-catalog/ton/dex_trades", + "data-catalog/ton/jetton_events", + "data-catalog/ton/jetton_metadata", + "data-catalog/ton/nft_events", + "data-catalog/ton/nft_metadata", + "data-catalog/ton/prices_daily" + ] + }, + { + "group": "XRPL", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/xrpl/overview", + "data-catalog/xrpl/transactions", + "data-catalog/xrpl/ledger", + "data-catalog/xrpl/aggregated_metrics_daily" + ] + }, + { + "group": "Tron", + "icon": "database", + "iconType": "solid", + "pages": [ + "data-catalog/tron/overview", + { + "group": "Decoded", + "pages": [ + "data-catalog/tron/decoded/contracts", + "data-catalog/tron/decoded/event-logs", + "data-catalog/tron/decoded/overview" + ] + }, + { + "group": "Raw", + "pages": [ + "data-catalog/tron/raw/blocks", + "data-catalog/tron/raw/logs", + "data-catalog/tron/raw/transactions" + ] + }, + "data-catalog/tron/tether", + { + "group": "Tokens", + "pages": [ + "data-catalog/tron/tokens/overview", + "data-catalog/tron/tokens/transfers/erc1155-transfers", + "data-catalog/tron/tokens/transfers/erc20-transfers", + "data-catalog/tron/tokens/transfers/erc721-transfers" + ] + } + ] + } + ] + }, + { + "group": "Protocols", + "pages": [ + { + "group": "LayerZero", + "icon": "circles-overlap", + "iconType": "solid", + "pages": [ + "data-catalog/layerzero/overview", + "data-catalog/layerzero/messages", + "data-catalog/layerzero/transfers" + ] + }, + { + "group": "Succinct", + "icon": "bolt", + "iconType": "solid", + "pages": [ + "data-catalog/succinct/overview", + "data-catalog/succinct/bids", + "data-catalog/succinct/requests" + ] + } + ] + }, + + { + "group": "Community Data", + "pages": [ + { + "group": "Flashbots", + "icon": "robot", + "pages": [ + "data-catalog/community/flashbots/overview", + "data-catalog/community/flashbots/mempool-dumpster" + ] + }, + { + "group": "Farcaster", + "icon": "torii-gate", + "pages": [ + "data-catalog/community/farcaster/overview", + "data-catalog/community/farcaster/casts", + "data-catalog/community/farcaster/fids", + "data-catalog/community/farcaster/fnames", + "data-catalog/community/farcaster/links", + "data-catalog/community/farcaster/profile_with_addresses", + "data-catalog/community/farcaster/reactions", + "data-catalog/community/farcaster/signers", + "data-catalog/community/farcaster/storage", + "data-catalog/community/farcaster/user_data", + "data-catalog/community/farcaster/verifications", + "data-catalog/community/farcaster/power_badge" + ] + }, + + { + "group": "Lens", + "icon": "cloud", + "pages": [ + "data-catalog/community/lens/overview", + "data-catalog/community/lens/namespace-handle", + "data-catalog/community/lens/namespace-handle-link", + "data-catalog/community/lens/profile-follower", + "data-catalog/community/lens/profile-follow-module", + "data-catalog/community/lens/profile-follow-module-record", + "data-catalog/community/lens/profile-metadata", + "data-catalog/community/lens/profile-record", + "data-catalog/community/lens/publication-metadata", + "data-catalog/community/lens/publication-open-action-module", + "data-catalog/community/lens/publication-open-action-module-acted-recorded", + "data-catalog/community/lens/publication-open-action-module-acted-multirecipient", + "data-catalog/community/lens/publication-reaction", + "data-catalog/community/lens/publication-record", + "data-catalog/community/lens/publication-reference-module" + ] + }, + { + "group": "Reservoir", + "icon": "cube", + "pages": [ + "data-catalog/community/reservoir/overview", + "data-catalog/community/reservoir/ask-events", + "data-catalog/community/reservoir/asks", + "data-catalog/community/reservoir/attribute-keys", + "data-catalog/community/reservoir/attributes", + "data-catalog/community/reservoir/bid-events", + "data-catalog/community/reservoir/bids", + "data-catalog/community/reservoir/collection-floor-ask-events", + "data-catalog/community/reservoir/collection-top-bid-events", + "data-catalog/community/reservoir/collections", + "data-catalog/community/reservoir/sales", + "data-catalog/community/reservoir/token-attributes", + "data-catalog/community/reservoir/token-floor-ask-events", + "data-catalog/community/reservoir/tokens" + ] + }, + { + "group": "Snapshot", + "icon": "bolt", + "pages": [ + "data-catalog/community/snapshot/overview", + "data-catalog/community/snapshot/proposals", + "data-catalog/community/snapshot/votes", + "data-catalog/community/snapshot/users", + "data-catalog/community/snapshot/spaces", + "data-catalog/community/snapshot/follows" + ] + } + ] + }, + { + "group": "Dune Index", + "icon": "chart-line", + "pages": [ + "data-catalog/dune-index/introduction", + "data-catalog/dune-index/gas-fees", + "data-catalog/dune-index/net-transfers", + "data-catalog/dune-index/transactions" + ] + }, + { + "group": "Analytics API", + "pages": [ + "api-reference/overview/introduction", + { + "group": "API Quickstart", + "pages": [ + "api-reference/quickstart/results-eg", + "api-reference/quickstart/queries-eg", + "api-reference/quickstart/tables-eg" + ], + "icon": "forward-fast" + }, + "api-reference/overview/authentication", + "api-reference/overview/sdks", + "api-reference/overview/dunesql-trino-connector", + { + "group": "Result Filtering", + "pages": [ + "api-reference/executions/pagination", + "api-reference/executions/filtering", + "api-reference/executions/sorting", + "api-reference/executions/sampling" + ], + "icon": "filter" + }, + "api-reference/overview/rate-limits", + "api-reference/overview/troubleshooting", + "api-reference/overview/billing", + "api-reference/overview/faq" + ] + }, + { + "group": "SQL Endpoints", + "pages": [ + { + "group": "Executions and Results", + "pages": [ + "api-reference/executions/execution-object", + "api-reference/executions/endpoint/execute-query", + "api-reference/executions/endpoint/cancel-execution", + "api-reference/executions/endpoint/get-execution-status", + "api-reference/executions/endpoint/get-execution-result", + "api-reference/executions/endpoint/get-execution-result-csv", + "api-reference/executions/endpoint/get-query-result", + "api-reference/executions/endpoint/get-query-result-csv" + ] + }, + { + "group": "Queries", + "pages": [ + "api-reference/queries/endpoint/query-object", + "api-reference/queries/endpoint/create", + "api-reference/queries/endpoint/read", + "api-reference/queries/endpoint/update", + "api-reference/queries/endpoint/archive", + "api-reference/queries/endpoint/unarchive", + "api-reference/queries/endpoint/private", + "api-reference/queries/endpoint/unprivate" + ] + }, + { + "group": "Materialized Views", + "pages": [ + "api-reference/materialized-views/get", + "api-reference/materialized-views/create", + "api-reference/materialized-views/delete", + "api-reference/materialized-views/list", + "api-reference/materialized-views/refresh" + ] + }, + { + "group": "Webhooks", + "pages": ["api-reference/webhooks/webhook"] + } + ] + }, + { + "group": "Data Management Endpoints", + "pages": [ + { + "group": "Tables", + "pages": [ + "api-reference/tables/endpoint/overview", + "api-reference/tables/endpoint/create", + "api-reference/tables/endpoint/insert", + "api-reference/tables/endpoint/upload", + "api-reference/tables/endpoint/clear", + "api-reference/tables/endpoint/delete" + ] + } + ] + }, + { + "group": "Preset Endpoints", + "pages": [ + { + "group": "DEX", + "pages": ["api-reference/dex/endpoint/dex_pair"] + }, + { + "group": "EigenLayer", + "pages": [ + "api-reference/eigenlayer/introduction", + "api-reference/eigenlayer/endpoint/avs_metadata", + "api-reference/eigenlayer/endpoint/avs_metrics", + "api-reference/eigenlayer/endpoint/operator_metadata", + "api-reference/eigenlayer/endpoint/operator_metrics", + "api-reference/eigenlayer/endpoint/operator_to_avs_mapping" + ] + }, + { + "group": "EVM Contracts", + "pages": ["api-reference/evm/endpoint/contracts"] + }, + + { + "group": "Farcaster", + "pages": [ + "api-reference/farcaster/introduction", + "api-reference/farcaster/endpoint/farcaster_channels", + "api-reference/farcaster/endpoint/farcaster_memecoins", + "api-reference/farcaster/endpoint/farcaster_users" + ] + }, + { + "group": "Markets", + "pages": ["api-reference/markets/endpoint/marketplace_marketshare"] + }, + { + "group": "Projects", + "pages": [ + "api-reference/projects/introduction", + "api-reference/projects/endpoint/linea_lxp" + ] + } + ] + }, + { + "group": "Datashare", + "pages": [ + "datashare/datashare", + "datashare/datashare-snowflake", + "datashare/datashare-bigquery", + "datashare/datashare-trial", + "datashare/datashare-faqs" + ] + }, + { + "group": "Catalyst", + "pages": ["catalyst/overview"] + } + ], + "feedback": { + "thumbsRating": true, + "raiseIssue": true + }, + "footerSocials": { + "linkedin": "https://www.linkedin.com/company/dune-analytics", + "github": "https://github.com/duneanalytics", + "twitter": "https://x.com/dune", + "discord": "https://discord.gg/ErrzwBz", + "telegram": "https://t.me/dune_updates", + "youtube": "https://www.youtube.com/@dunecom" + }, + "analytics": { + "amplitude": { + "apiKey": "e76ce253e6eaa36e3be8e6872101e33a" + }, + "ga4": { + "measurementId": "G-H1G057R0KN" + }, + "gtm": { + "tagId": "GTM-P46XP3Z5" + } + }, + "redirects": [ + { + "source": "/data-tables/:slug*", + "destination": "/data-catalog/:slug*" + }, + { + "source": "/api-reference/tables/blockchain/overview", + "destination": "/catalyst/hosted" + }, + { + "source": "/api-reference/tables/blockchain/insert", + "destination": "/catalyst/hosted" + }, + { + "source": "/api-reference/tables/blockchain/clear", + "destination": "/catalyst/hosted" + }, + { + "source": "/api-reference/tables/blockchain/delete", + "destination": "/catalyst/hosted" + } + ] +} From 178c7b6dab85c443c4c4ab3dca7c00aebd588da2 Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Sat, 25 Oct 2025 18:26:11 -0400 Subject: [PATCH 20/36] Fix social media preview images by removing custom og:image (#887) Remove the global custom og:image from SEO configuration to allow Mintlify to auto-generate clean, page-specific preview images based on tab name and page title. This resolves the issue where all pages were showing the generic dune-docs-cover.jpg banner instead of contextual previews. --- docs.json | 1 - 1 file changed, 1 deletion(-) diff --git a/docs.json b/docs.json index fac83d9c..b6688cee 100644 --- a/docs.json +++ b/docs.json @@ -3044,7 +3044,6 @@ "metatags": { "title": "Dune Docs", "description": "Official documentation for building with Dune's data platform, query engine, and API.", - "og:image": "/images/dune-docs-cover.jpg", "og:site_name": "Dune Docs", "twitter:card": "summary_large_image" }, From 216e1f9a8e58fa79662c6d9027267d5bdaedad40 Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Mon, 27 Oct 2025 12:37:28 -0400 Subject: [PATCH 21/36] =?UTF-8?q?Update=20credit=20system=20docs:=20deprec?= =?UTF-8?q?ate=20Premium=20plan=20and=20emphasize=20Enter=E2=80=A6=20(#889?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update credit system docs: deprecate Premium plan and emphasize Enterprise pricing - Rename Premium to Legacy Premium with clear deprecation notice - Mark Premium as 'Deprecated - Existing customers only' in pricing table - Add prominent Tip callout highlighting Enterprise's favorable per-credit rates - Update Enterprise table entry to show 'Favorable rates' - Enhance Managing Your Credit Usage section to emphasize Enterprise savings - Add clear messaging that Enterprise offers significantly lower rates than standard plans * Update Enterprise pricing to 'Favorable Custom Pricing' in table --- learning/how-tos/credit-system.mdx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/learning/how-tos/credit-system.mdx b/learning/how-tos/credit-system.mdx index 49bd3c11..a8d17615 100644 --- a/learning/how-tos/credit-system.mdx +++ b/learning/how-tos/credit-system.mdx @@ -48,11 +48,15 @@ Overage is charged at the same rate as your plan. The price per 100 credits show | **Analyst (Annual)** | $65/month billed annually | $780/year | 4,000 | $1.625 | | **Plus** | $399/month | - | 25,000 | $1.596 | | **Plus (Annual)** | $349/month billed annually | $4,188/year | 25,000 | $1.396 | -| **Premium** | Existing customers only | - | Varies | [Contact support](mailto:support@dune.com) | -| **Enterprise** | Custom pricing | - | Custom | [Contact sales](https://dune.com/enterprise) | +| **Legacy Premium** | Deprecated - Existing customers only | - | Varies | [Contact support](mailto:support@dune.com) | +| **Enterprise** | Favorable Custom Pricing | - | Custom | **Favorable rates** - [Contact sales](https://dune.com/enterprise) | + + +**Save with Enterprise Pricing**: Enterprise plans receive **significantly lower per-credit rates** compared to standard plans, plus customized support and tailored solutions. Whether you're scaling up or just getting started, [contact our sales team](https://dune.com/enterprise) to discuss custom pricing that fits your needs. + -**Enterprise**: Whether you're an existing plan considering an upgrade or a new team, we can custom-tailor a plan to your pricing needs at dune.com/enterprise. Enterprise clients receive **favorable per-credit pricing and customized support**. +**Legacy Premium**: This plan has been deprecated and is no longer available for new subscriptions. Existing Premium customers can continue to use their plan. @@ -63,7 +67,7 @@ Explore the complete pricing plan with credit limits and features for each tier: - **Review your usage.** Check your query volume and costs regularly to stay informed about your credit consumption. - **Optimize your queries.** Efficient queries save credits and run faster. See [here](https://docs.dune.com/query-engine/writing-efficient-queries) for tips. -- **Pick the plan that fits.** If you anticipate heavy usage or notice overages, please contact our sales team at [dune.com/enterprise](http://dune.com/enterprise) to discuss the best plan for your needs. Enterprise clients receive **favorable per-credit pricing and customized support**. +- **Pick the plan that fits.** If you anticipate heavy usage or notice overages, consider upgrading to Enterprise for **significantly lower per-credit rates**. Contact our sales team at [dune.com/enterprise](http://dune.com/enterprise) to discuss custom pricing and tailored solutions for your needs. - **Cap your query costs.** Control spending by setting a maximum credit limit for individual queries. More info on how to do this [here](https://app.arcade.software/share/C60r4u7ESOp5RXRuzbSN). - **Set overage limits.** Configure your overage spending limits to control costs. Learn how to set this up [here](https://app.arcade.software/share/so8QGM4H4MU0OWRWhNe9). From 30c85c45e608cd44fc59d8b037c45c02c85cd1fc Mon Sep 17 00:00:00 2001 From: Derick Ruiz Date: Tue, 28 Oct 2025 21:44:23 +0900 Subject: [PATCH 22/36] Issue 890 Fix (#892) * Reverting the name changes so that the links work again while I look into the underlying issue. Analytics Studio -> Web App. Analytics API -> SQL API Reference. Catalyst -> Blockchain Integrations. * Adding DBeaver to the list. Adding more SDK samples. Adding more links to the Trino docs. Improving the SEO of the page to rank for terms like dune trino, dune hex, etc. Overall just making the page better for customers. * Fixing the spelling issue. --- learning/how-tos/navigate-query-editor.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/learning/how-tos/navigate-query-editor.mdx b/learning/how-tos/navigate-query-editor.mdx index b147cce0..bf5d1981 100644 --- a/learning/how-tos/navigate-query-editor.mdx +++ b/learning/how-tos/navigate-query-editor.mdx @@ -1,6 +1,6 @@ --- title: Navigate the Query Editor -description: How to navgigate the query editor +description: How to navigate the query editor --- In this guide, we'll provide an overview of the Dune Query Editor and its features. From e0f16a1a3882f447e7959d2487444ca2e2051779 Mon Sep 17 00:00:00 2001 From: Florent Delannoy Date: Tue, 28 Oct 2025 16:34:29 +0100 Subject: [PATCH 23/36] PLA-1356 Update Trino API URL (#891) Towards PLA-1356 --- api-reference/overview/dunesql-trino-connector.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api-reference/overview/dunesql-trino-connector.mdx b/api-reference/overview/dunesql-trino-connector.mdx index c971b511..f1ec8256 100644 --- a/api-reference/overview/dunesql-trino-connector.mdx +++ b/api-reference/overview/dunesql-trino-connector.mdx @@ -70,7 +70,7 @@ Use these values in your Trino, Presto, or Starburst client configuration: | Parameter | Value | Description | | ----------- | ------------------------- | ---------------------------------- | -| Host | `dune-api-trino.dune.com` | Dune's Trino/Presto endpoint | +| Host | `trino.api.dune.com` | Dune's Trino/Presto endpoint | | Port | `443` | Standard HTTPS port | | Username | `dune` | Fixed username for all connections | | Password | `` | [Your Dune API key](/api-reference/overview/authentication) | @@ -310,7 +310,7 @@ Connect to Dune using Trino SDKs in your preferred language. ```bash # Install: brew install trino - trino --server https://dune-api-trino.dune.com:443 \ + trino --server https://trino.api.dune.com:443 \ --user dune --password \ --catalog delta_prod \ --schema runtime \ @@ -323,7 +323,7 @@ Connect to Dune using Trino SDKs in your preferred language. import { Trino, BasicAuth } from "trino-client"; const trino = Trino.create({ - server: "https://dune-api-trino.dune.com:443", + server: "https://trino.api.dune.com:443", catalog: "delta_prod", schema: "runtime", auth: new BasicAuth("dune", process.env.DUNE_API_KEY), @@ -342,7 +342,7 @@ Connect to Dune using Trino SDKs in your preferred language. import os conn = trino.dbapi.connect( - host='dune-api-trino.dune.com', + host='trino.api.dune.com', port=443, user='dune', catalog='delta_prod', From 5a6a931587bea6a8d447402f5c7b7c80f3c623ba Mon Sep 17 00:00:00 2001 From: jonathandune <117348658+jonathandune@users.noreply.github.com> Date: Wed, 29 Oct 2025 11:12:45 +0100 Subject: [PATCH 24/36] Add hyperliquid to community data docs (#895) * Add Hyperliquid data to community section Co-authored-by: jonathan * Fix: Change Hyperliquid icon from chart-line to water Co-authored-by: jonathan * Refactor: Change Hyperliquid icon from water to droplet Co-authored-by: jonathan * Refactor: Update Hyperliquid to Farcaster data catalog Co-authored-by: jonathan * Remove Farcaster data catalog entries Co-authored-by: jonathan * Add Farcaster data catalog and update Hyperliquid Co-authored-by: jonathan --------- Co-authored-by: Cursor Agent --- .../community/hyperliquid/market-data.mdx | 15 +++++++++++ .../community/hyperliquid/overview.mdx | 27 +++++++++++++++++++ data-catalog/overview.mdx | 1 + mint.json | 9 ++++++- 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 data-catalog/community/hyperliquid/market-data.mdx create mode 100644 data-catalog/community/hyperliquid/overview.mdx diff --git a/data-catalog/community/hyperliquid/market-data.mdx b/data-catalog/community/hyperliquid/market-data.mdx new file mode 100644 index 00000000..8daf512c --- /dev/null +++ b/data-catalog/community/hyperliquid/market-data.mdx @@ -0,0 +1,15 @@ +--- +title: hyperliquid.market_data +sidebarTitle: "Market Data" +description: Description of the hyperliquid.market_data table on Dune +--- + +## Table description + +This table contains historical trading data from the Hyperliquid decentralized exchange. The data includes trading volume, open interest, funding rates, and other market metrics across all perpetual futures markets on the platform. The data is updated monthly. + +## Table Sample + +import { TableSample } from "/snippets/table-sample.mdx"; + + diff --git a/data-catalog/community/hyperliquid/overview.mdx b/data-catalog/community/hyperliquid/overview.mdx new file mode 100644 index 00000000..95f7c7cc --- /dev/null +++ b/data-catalog/community/hyperliquid/overview.mdx @@ -0,0 +1,27 @@ +--- +title: Hyperliquid data +sidebarTitle: "Hyperliquid Overview" +icon: "star" +description: Hyperliquid data on Dune +--- + +# Hyperliquid + +[Hyperliquid](https://hyperliquid.xyz) - a high-performance decentralized perpetual futures exchange built on a custom L1 blockchain. + +Hyperliquid is a decentralized exchange (DEX) designed for perpetual futures trading with deep liquidity and low latency. The platform operates on its own Layer 1 blockchain, optimized for trading performance and features an on-chain order book with sub-second block times. + +**Website** : [https://hyperliquid.xyz](https://hyperliquid.xyz) + +**Documentation** : [https://hyperliquid.gitbook.io](https://hyperliquid.gitbook.io) + +**Twitter** : [https://twitter.com/HyperliquidX](https://twitter.com/HyperliquidX) + + +## Data available: + + + + Historical trading data including volume, open interest, funding rates and more. Updated monthly. + + diff --git a/data-catalog/overview.mdx b/data-catalog/overview.mdx index 4339a731..54ce2973 100644 --- a/data-catalog/overview.mdx +++ b/data-catalog/overview.mdx @@ -18,6 +18,7 @@ Our data catalog can be divided into the following categories: - etc. - [Community Data](#community-data) - farcaster + - hyperliquid - lens protocol - snapshot - reservoir diff --git a/mint.json b/mint.json index afb9c71b..53d2c4b7 100644 --- a/mint.json +++ b/mint.json @@ -2765,7 +2765,14 @@ "data-catalog/community/farcaster/power_badge" ] }, - + { + "group": "Hyperliquid", + "icon": "droplet", + "pages": [ + "data-catalog/community/hyperliquid/overview", + "data-catalog/community/hyperliquid/market-data" + ] + }, { "group": "Lens", "icon": "cloud", From 855fcf3277f3700622b8dc21510b920594cd739e Mon Sep 17 00:00:00 2001 From: dune-eng <77401252+dune-eng@users.noreply.github.com> Date: Wed, 29 Oct 2025 16:02:49 +0100 Subject: [PATCH 25/36] [Automated] Update OpenAPI specifications (#896) Co-authored-by: norbertdurcansk <8441949+norbertdurcansk@users.noreply.github.com> --- analytics-openapi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analytics-openapi.json b/analytics-openapi.json index 189b0541..4869e459 100644 --- a/analytics-openapi.json +++ b/analytics-openapi.json @@ -4180,7 +4180,7 @@ { "name": "performance", "in": "query", - "description": "The performance engine tier the execution will be run on. Can be either `medium` or `large`. Medium consumes 10 credits, and large consumes 20 credits, per run. Default is `medium`.", + "description": "The performance engine tier the execution will be run on. Can be either `medium` or `large`. Credits are consumed based on actual compute resources used. Medium is the default, large provides more resources for complex queries.", "schema": { "type": "string", "enum": [ From 183f152863835f9d47100d0de500ceb6289a9907 Mon Sep 17 00:00:00 2001 From: jonathandune <117348658+jonathandune@users.noreply.github.com> Date: Wed, 29 Oct 2025 22:03:13 +0100 Subject: [PATCH 26/36] Fix hyperliquid link and changed README (#899) * fix hyperliquid * droplet icon --- README.md | 2 +- data-catalog/community/hyperliquid/overview.mdx | 4 ++-- docs.json | 8 ++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e5f4cf43..e261e6f0 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Once the pull request is merged, the changes will be automatically published to ### Adding New Pages -To add a new page to the documentation, create a new .mdx file in the folder where you want the page to be. Then, add the following to the `mint.json` file: +To add a new page to the documentation, create a new .mdx file in the folder where you want the page to be. Then, add the following to the `docs.json` file: ```json { diff --git a/data-catalog/community/hyperliquid/overview.mdx b/data-catalog/community/hyperliquid/overview.mdx index 95f7c7cc..76b7c2ea 100644 --- a/data-catalog/community/hyperliquid/overview.mdx +++ b/data-catalog/community/hyperliquid/overview.mdx @@ -7,9 +7,9 @@ description: Hyperliquid data on Dune # Hyperliquid -[Hyperliquid](https://hyperliquid.xyz) - a high-performance decentralized perpetual futures exchange built on a custom L1 blockchain. +[Hyperliquid](https://hyperliquid.xyz) is a high-performance decentralized perpetual futures exchange built on a custom L1 blockchain. -Hyperliquid is a decentralized exchange (DEX) designed for perpetual futures trading with deep liquidity and low latency. The platform operates on its own Layer 1 blockchain, optimized for trading performance and features an on-chain order book with sub-second block times. +Hyperliquid is a decentralized exchange designed for perpetual futures trading with deep liquidity and low latency. The platform operates on its own Layer 1 blockchain, optimized for trading performance and features an on-chain order book with sub-second block times. **Website** : [https://hyperliquid.xyz](https://hyperliquid.xyz) diff --git a/docs.json b/docs.json index b6688cee..ed405292 100644 --- a/docs.json +++ b/docs.json @@ -2786,6 +2786,14 @@ "data-catalog/community/farcaster/power_badge" ] }, + { + "group": "Hyperliquid", + "icon": "droplet", + "pages": [ + "data-catalog/community/hyperliquid/overview", + "data-catalog/community/hyperliquid/market-data" + ] + }, { "group": "Lens", "icon": "cloud", From ef56dfd0baba36b894c5770b756c712c271e2750 Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Thu, 30 Oct 2025 14:20:20 -0400 Subject: [PATCH 27/36] Add comprehensive Pricing FAQs to credit system documentation (#901) * Add Pricing FAQs as separate page - Created new pricing-faqs.mdx page with comprehensive pricing FAQs - Organized into 6 categories: General Questions, Credits and Spending, Query Engines & Executions, Features, Teams, and API - Added to navigation right under Credit System page - Total of 45 FAQs covering billing, credits, execution, and usage questions * Add pricing-faqs to docs.json navigation --- docs.json | 1 + learning/how-tos/pricing-faqs.mdx | 249 ++++++++++++++++++++++++++++++ mint.json | 1 + 3 files changed, 251 insertions(+) create mode 100644 learning/how-tos/pricing-faqs.mdx diff --git a/docs.json b/docs.json index ed405292..47bb67bd 100644 --- a/docs.json +++ b/docs.json @@ -78,6 +78,7 @@ "learning/how-tos/create-and-manage-teams", "learning/how-tos/credit-system-on-dune", "learning/how-tos/credit-system", + "learning/how-tos/pricing-faqs", "learning/how-tos/search-for-content", "learning/how-tos/share-dune-content", "learning/how-tos/share-your-query", diff --git a/learning/how-tos/pricing-faqs.mdx b/learning/how-tos/pricing-faqs.mdx new file mode 100644 index 00000000..88f890cf --- /dev/null +++ b/learning/how-tos/pricing-faqs.mdx @@ -0,0 +1,249 @@ +--- +title: "Pricing FAQs" +description: "Frequently asked questions about Dune's pricing, credits, billing, and plans" +icon: "circle-question" +--- + +# Pricing FAQs + +Find answers to common questions about Dune's pricing, credits, billing cycles, and subscription plans. + +## General Questions + + + + Your billing history can be found under "Billing" in your Subscription Settings. Follow the steps below for a complete view: + + 1. Go to dune.com + 2. Sign in to your Dune account + 3. Click your avatar in the middle of the top bar where your user or team badge is + 4. Click the Settings icon and then "Subscription" + + + + Upgrading to a new paid tier resets your billing cycle start date. On the date of your upgrade, you will be billed the full new plan price and refunded a prorated amount corresponding to the number of unused days of your current plan. If you upgrade from Analyst to Plus on day 15 of your billing cycle, you will be billed a month of Plus minus 15 days of Analyst (roughly half the monthly Analyst cost). + + Downgrades to lower tiers are applied at the end of your billing cycle. Benefits from your current tier remain until the end of your billing cycle. At the end of your billing cycle, you will automatically be downgraded to the lower tier of your choice. + + + + Only administrators of teams with paid plans can change team subscriptions. To change your team's subscription: + + 1. Go to dune.com + 2. Sign in to your Dune account + 3. Click your avatar in the middle of the top bar where your team badge is + 4. Click the Settings icon and then "Subscription" + 5. Click the plan you want to upgrade or downgrade to + + To cancel your subscription, follow these steps: + 1. Go to dune.com + 2. Sign in to your Dune account + 3. Click your avatar in the middle of the top bar where your user or team badge is + 4. Click the Settings icon and then "Subscription" + 5. Change your plan to Free + + Your subscription will remain active for 30 days after your last payment. + + + + If you are a single user with higher requirements than what's offered in the free tier, you can create a team of one to access paid tiers. Note that we hope to change this in the future, so individuals don't need to create a plan to upgrade. + + + + For general info on how to use Dune, please see our [docs](https://docs.dune.com). For specific questions on how to do a query, please join our [Discord](https://discord.com/invite/dunecom). If you have other issues or questions not listed on this page, please contact support@dune.com. + + + +## Credits and Spending + + + + Credits are the measurement unit for usage on Dune. They provide flexibility across query performance, programmatic executions, and API exports. Credits are consumed proportionally to the actual compute resources your queries use—simple queries cost fewer credits while complex ones use more. + + + + To view your credit usage and balance go to Settings and select Subscription; here you will see used and remaining credits. + + + + Annual billing enables customers to pay for their plan yearly at a reduced rate. Customers on this plan will still have their credits reset on a monthly basis, as well as receive monthly charges for any potential overage incurred. + + + + Credit usage is determined by the actual compute resources your queries consume. Your credit consumption directly reflects each query's complexity and resource requirements. + + **Query Execution (App & API)** + - Credits are charged based on CPU-seconds and network resources used + - Simple, efficient queries use fewer credits + - Complex queries with large data scans require more credits + - Queries cost the same whether executed manually or programmatically + + **API Export** + - Free and Analyst: 1 credit = 1,000 data points + - Plus: 1 credit = 5,000 data points + - Premium (legacy): 1 credit = 25,000 data points + + + + There are several ways to control and optimize your credit consumption: + + **Monitor Your Usage** + - Check the usage tab regularly to track your credit consumption patterns + - Review which queries and users consume the most credits + - Set overage limits to control how many additional credits can be purchased beyond your plan's included amount + + **Control Spending** + - Set query cost caps in Settings to limit the maximum credits any single query can consume + - Configure team-level caps to prevent accidental high-usage queries + - Use these caps while testing new queries or during development + + **Optimize Your Queries** + - Write efficient SQL to dramatically reduce credit consumption + - Review our [query optimization guide](https://docs.dune.com/query-engine/writing-efficient-queries) for specific techniques + + + + Once your monthly credit quota runs out, we'll continue to bill you for additional credits at your plan's overage rate. There's no separate "overage pricing", you pay the same rate per 100 credits as shown for your plan: + + - Free: $5.00 per 100 credits + - Analyst: $1.875 per 100 credits (monthly) / $1.625 per 100 credits (annual) + - Plus: $1.596 per 100 credits (monthly) / $1.396 per 100 credits (annual) + - Premium (legacy): $0.999 per 100 credits (monthly) / $0.849 per 100 credits (annual) + - Enterprise: Custom pricing per your agreement + + You can set query cost caps in Settings to control your credit usage and prevent unexpected charges. + + + + No, once your quota runs out, extra credits will be billed on an ongoing basis as you use Dune. Credits are not available to purchase in bulk once you reach your quota. + + + + Remaining credits at the end of a billing cycle do not rollover to the next month. + + + + Yes, you can pay as you go. Both individuals and teams in the free tier can continue using Dune beyond their 2,500 monthly credits by paying $5.00 per 100 additional credits. This allows you to handle occasional larger workloads without committing to a monthly subscription. If you find yourself consistently purchasing additional credits, consider upgrading to a paid plan for better value, paid plans offer significantly lower per-credit rates and additional features like API access and unlimited concurrent executions. + + + + To limit monthly spend, go to your subscription page in Settings and set the limit to the desired amount. Setting your limit to $0 will prevent additional usage billing. + + + + If you lower your spend limit below your current spending level, you will not be charged any additional fees beyond your new spend limit. However, any usage that has accrued does not rollover and will still be billed based on the previous spend limit. + + + +## Query Engines & Executions + + + + When you manually trigger an execution by pressing Run in the Query Editor, dashboard, or via the API, we accrue that usage to the user or team account. To ensure you are accruing usage in the correct account, view your selected account in the account switcher located in the middle of the top navigation bar on Dune. + + + + We have three different query engine sizes that you can use on Dune, each consuming credits based on actual compute resources used: + + **Small Engine (0 credits to run)** + - Run simple queries manually in the Dune app for free + - Credits consumed from your monthly allowance based on actual usage + - 2-minute timeout limit + - Maximum of three (3) concurrent executions + - No performance guarantees + + **Medium Engine** + - Run queries with a larger timeout, manually or programmatically + - Credits consumed based on actual compute resources used + - No limit on concurrent executions + - Suitable for most standard queries and dashboards + + **Large Engine** + - Optimized for complex workloads requiring more computational power + - Credits consumed based on actual compute resources used (more compute and resource than Medium for the same query) + - Best for data-intensive queries and complex analytics + + The Large engine provides approximately 2x the computational capacity of the Medium engine. While both Medium and Large engines charge based on actual usage, the Large engine will typically consume more credits for the same query due to the additional resources allocated, but will complete faster. The Small engine is limited in capacity and has stricter timeout constraints. + + **Note:** Exact credit consumption varies based on query complexity, data volume scanned, and processing required rather than being a fixed rate per execution. + + + + Programmatic executions are query executions done through the Dune API, scheduled executions, materialized view refreshes, or dashboard runs. Programmatic executions consume credits based on actual compute resources used, just like manual queries. Both manual and programmatic executions are charged based on the complexity and resources required by your query, ensuring consistent and fair pricing across all execution methods. + + + + The Free query engine on Dune is available to anyone at no cost, but it does come with limitations. First, there are no performance or queue priority guarantees, which means executions may take longer to run during times of high demand. Additionally, the Free query engine is limited to manual query editor executions only; automated executions (API, scheduling, refreshing) are not available. Lastly, there is a maximum limit of three (3) ongoing executions (executing or queued) at any given time for Free executions, and executions are timed out at 120 seconds. + + + +## Features + + + + If you add a private query to a public dashboard, other Dune users will be able to see the visualization in the public dashboard, but won't see your code when they click the query. The results table, other visualizations you might have, and the underlying query are all private. + + + + No, you can archive private queries that you no longer need to increase your existing private queries quota. Archived queries are not accessible by anyone else and cannot be run. You can unarchive them later if you change your mind. + + + + Yes, anyone visiting the website with the embed can see the visualization you chose to embed and nothing else. + + + + When logged in to the team on Dune, work you've created will not have watermarks. Public dashboards URLs always have watermarks. + + + +## Teams + + + + Owners of editor seats can create and edit content owned by their team, but they cannot access team management features; those are reserved for admins. Viewers have read-only access to the team's content and can still benefit from their team plan features and quotas. + + + + Yes, team benefits apply to all Dune content, as long as your team is in the correctly selected account which is viewable in the middle of the top navigation bar on Dune. + + + + Quotas are applied to all team usage. + + + + Yes, you can invite as many people as you need into your Dune team at no additional cost. All team members will need a Dune account to collaborate with you. + + + + You can create 1 Free team on Dune. + + + +## API + + + + A datapoint can, in most cases, be thought of as rows * columns with an additional limit of 100 average bytes per cell in a set of results. This can be expressed as: + + `datapoints = max(rows * columns, ceil(total_bytes / 100))` + + + + Yes, we accrue the resulting datapoints returned from every request to your credit quota. + + + + Query executions are identical to those triggered on dune.com. Please note: free executions are not supported via the API. + + + + Yes, the API is included in all Dune plans. This means that all teams and users, including those in the Free plan, can access the API to trigger executions and export data, provided their spend limit has not been exceeded. Please note: credits still apply for API usage, regardless of the plan you are on. + + + + We strongly believe Dune wizards should be credited for their work's impact. We encourage you to credit the wizard, or perhaps to link to the original query. Linking to transparent data sources like Dune is a great way of building trust. + + + diff --git a/mint.json b/mint.json index 53d2c4b7..3f0692fb 100644 --- a/mint.json +++ b/mint.json @@ -89,6 +89,7 @@ "learning/how-tos/create-and-manage-teams", "learning/how-tos/credit-system-on-dune", "learning/how-tos/credit-system", + "learning/how-tos/pricing-faqs", "learning/how-tos/search-for-content", "learning/how-tos/share-dune-content", "learning/how-tos/share-your-query", From ec1f8d3ff0e8e527785914021b83a19adf785703 Mon Sep 17 00:00:00 2001 From: dune-eng <77401252+dune-eng@users.noreply.github.com> Date: Fri, 31 Oct 2025 09:59:46 +0100 Subject: [PATCH 28/36] [Automated] Update OpenAPI specifications (#900) Co-authored-by: ivpusic <450140+ivpusic@users.noreply.github.com> --- analytics-openapi.json | 180 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) diff --git a/analytics-openapi.json b/analytics-openapi.json index 4869e459..d3ef5965 100644 --- a/analytics-openapi.json +++ b/analytics-openapi.json @@ -4355,6 +4355,91 @@ "x-codegen-request-body-name": "payload" } }, + "/v1/tables": { + "get": { + "summary": "List all tables owned by the account tied to the API key", + "description": "List all tables owned by the account tied to the API key", + "parameters": [ + { + "name": "X-Dune-Api-Key", + "in": "header", + "description": "API Key for the service", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "api_key", + "in": "query", + "description": "API Key, alternative to using the HTTP header X-Dune-Api-Key", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "description": "Number of tables to return on a page. Default: 50, max: 10000", + "schema": { + "type": "integer", + "format": "int32" + } + }, + { + "name": "offset", + "in": "query", + "description": "Offset used for pagination. Negative values are treated as 0", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.TableListResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error400" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error401" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error500" + } + } + } + } + } + } + }, "/v1/tables/create": { "post": { "summary": "TableCreate is the /v1/table endpoint which creates an empty table.", @@ -5655,6 +5740,28 @@ } } }, + "models.TableColumnInfo": { + "type": "object", + "properties": { + "metadata": { + "type": "object", + "additionalProperties": true, + "description": "Additional column metadata" + }, + "name": { + "type": "string", + "description": "Column name" + }, + "nullable": { + "type": "boolean", + "description": "Whether the column can contain null values" + }, + "type": { + "type": "string", + "description": "Column data type" + } + } + }, "models.TableCreateResponse": { "type": "object", "properties": { @@ -5686,6 +5793,79 @@ } } }, + "models.TableListElement": { + "type": "object", + "properties": { + "columns": { + "type": "array", + "description": "List of table columns", + "items": { + "$ref": "#/components/schemas/models.TableColumnInfo" + } + }, + "created_at": { + "type": "string", + "description": "ISO 8601 timestamp of table creation" + }, + "full_name": { + "type": "string", + "description": "Fully qualified table name (catalog.schema.table)" + }, + "is_private": { + "type": "boolean", + "description": "Whether the table is private" + }, + "owner": { + "type": "object", + "description": "Owner information", + "allOf": [ + { + "$ref": "#/components/schemas/models.TableOwner" + } + ] + }, + "purged_at": { + "type": "string", + "description": "ISO 8601 timestamp of when table was purged" + }, + "table_size_bytes": { + "type": "string", + "description": "Size of the table in bytes" + }, + "updated_at": { + "type": "string", + "description": "ISO 8601 timestamp of last update" + } + } + }, + "models.TableListResponse": { + "type": "object", + "properties": { + "next_offset": { + "type": "integer", + "description": "Offset for next page of results" + }, + "tables": { + "type": "array", + "items": { + "$ref": "#/components/schemas/models.TableListElement" + } + } + } + }, + "models.TableOwner": { + "type": "object", + "properties": { + "handle": { + "type": "string", + "description": "User or team identifier" + }, + "type": { + "type": "string", + "description": "Type of entity that created the table" + } + } + }, "models.UpdateQueryResponse": { "type": "object", "properties": { From 1fdf043fc2355d10de1c6f4b6a1b7e5c9cf40cd0 Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Fri, 31 Oct 2025 08:43:27 -0400 Subject: [PATCH 29/36] =?UTF-8?q?Add=20SQL=20execution=20API=20endpoint=20?= =?UTF-8?q?and=20enhance=20execution=20status=20with=20erro=E2=80=A6=20(#8?= =?UTF-8?q?94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add SQL execution API endpoint and enhance execution status with error details New Features: - Add /sql/execute endpoint documentation for executing raw SQL queries - Enhance /execution/{id}/status endpoint to include detailed error information Changes: - Created execute-sql.mdx with complete documentation for the new SQL execution endpoint - Usage-based pricing information - Complete workflow examples with polling pattern - Request/response examples in multiple languages - Updated get-execution-status.mdx with enhanced error response documentation - Added error object fields (type, message, metadata with line/column) - Added error response example showing detailed error information - Clarified that this endpoint has no charge - Added cross-reference to new execute-sql endpoint - Updated docs.json navigation to include the new execute-sql endpoint These endpoints are ready for customer testing before DuneCon. * Apply suggestion from @norbertdurcansk Co-authored-by: Norbert Durcansky * Move Example Request and Complete Workflow Example to right sidebar * Fix: Properly structure examples in RequestExample block * Revert to original structure with examples in main content * Move examples to right sidebar in RequestExample block --------- Co-authored-by: Norbert Durcansky --- .../executions/endpoint/execute-sql.mdx | 93 +++++++++++++++++++ .../endpoint/get-execution-status.mdx | 58 +++++++++++- docs.json | 1 + 3 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 api-reference/executions/endpoint/execute-sql.mdx diff --git a/api-reference/executions/endpoint/execute-sql.mdx b/api-reference/executions/endpoint/execute-sql.mdx new file mode 100644 index 00000000..04724332 --- /dev/null +++ b/api-reference/executions/endpoint/execute-sql.mdx @@ -0,0 +1,93 @@ +--- +title: Execute SQL +openapi: 'POST /v1/sql/execute' +description: "Execute raw SQL queries directly without needing to create a saved query first" +--- + +> Run arbitrary SQL queries via API. This endpoint allows you to execute SQL directly without first creating a query object, perfect for dynamic analysis and automated workflows. + +## Pricing + +This endpoint is **usage-based** and consumes credits based on the computational resources used during execution. + + + +```bash cURL +curl -X POST "https://api.dune.com/api/v1/sql/execute" \ + -H "Content-Type: application/json" \ + -H "X-Dune-Api-Key: YOUR_API_KEY" \ + -d '{ + "sql": "SELECT * FROM dex.trades WHERE block_time > now() - interval '\''1 day'\'' LIMIT 10", + "performance": "medium" + }' +``` + +```python Python +import requests + +url = "https://api.dune.com/api/v1/sql/execute" +headers = { + "X-DUNE-API-KEY": "YOUR_API_KEY", + "Content-Type": "application/json" +} +data = { + "sql": "SELECT * FROM dex.trades WHERE block_time > now() - interval '1 day' LIMIT 10", + "performance": "medium" +} + +response = requests.post(url, json=data, headers=headers) +print(response.json()) +``` + +```javascript JavaScript +const response = await fetch('https://api.dune.com/api/v1/sql/execute', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-DUNE-API-KEY': 'YOUR_API_KEY' + }, + body: JSON.stringify({ + sql: "SELECT * FROM dex.trades WHERE block_time > now() - interval '1 day' LIMIT 10", + performance: 'medium' + }) +}); + +const data = await response.json(); +console.log(data); +``` + +```bash Complete Workflow +# Step 1: Execute SQL and get execution ID +EXECUTION_ID=$(curl -s -X POST "https://api.dune.com/api/v1/sql/execute" \ + -H "Content-Type: application/json" \ + -H "X-Dune-Api-Key: YOUR_API_KEY" \ + -d '{"sql": "SELECT * FROM dex.trades LIMIT 10", "performance": "medium"}' \ + | jq -r '.execution_id') + +# Step 2: Poll for completion +while true; do + STATE=$(curl -s "https://api.dune.com/api/v1/execution/$EXECUTION_ID/status" \ + -H "X-Dune-Api-Key: YOUR_API_KEY" \ + | jq -r '.state') + + echo "State: $STATE" + [[ "$STATE" =~ (QUERY_STATE_COMPLETED|QUERY_STATE_FAILED|QUERY_STATE_CANCELLED) ]] && break + sleep 2 +done + +# Step 3: Get results +curl -s "https://api.dune.com/api/v1/execution/$EXECUTION_ID/results" \ + -H "X-Dune-Api-Key: YOUR_API_KEY" | jq +``` + + + + +```json +{ + "execution_id": "01HKZJ2683PHF9Q9PHHQ8FW4Q1", + "state": "QUERY_STATE_PENDING" +} +``` + + diff --git a/api-reference/executions/endpoint/get-execution-status.mdx b/api-reference/executions/endpoint/get-execution-status.mdx index 2e51ba14..4f234e33 100644 --- a/api-reference/executions/endpoint/get-execution-status.mdx +++ b/api-reference/executions/endpoint/get-execution-status.mdx @@ -3,9 +3,13 @@ title: 'Get Execution Status' openapi: 'GET /v1/execution/{execution_id}/status' --- -You must pass the `execution_id` obtained from making an [execute query](/api-reference/executions/endpoint/execute-query) POST request. +You must pass the `execution_id` obtained from making an [execute query](/api-reference/executions/endpoint/execute-query) or [execute SQL](/api-reference/executions/endpoint/execute-sql) POST request. -Returns the status of a query execution along with relevant metadata of the results if the execution is completed. +Returns the status of a query execution along with relevant metadata of the results if the execution is completed. **This endpoint now includes detailed error information when a query fails**, eliminating the need to call the results endpoint just to get error details. + +## Pricing + +This endpoint has **no charge** and does not consume credits. ## Execution States @@ -13,12 +17,22 @@ Once an execution is triggered, it can be in one of the following states: - `QUERY_STATE_PENDING`: The query execution is waiting for an execution slot. - `QUERY_STATE_EXECUTING`: The query is currently executing. -- `QUERY_STATE_FAILED`: The query execution failed. This is a terminal state. +- `QUERY_STATE_FAILED`: The query execution failed. This is a terminal state. **The response will include detailed error information.** - `QUERY_STATE_COMPLETED`: The query execution completed successfully. You can retrieve the query result for this execution_id. - `QUERY_STATE_CANCELED`: The query execution was canceled by the user. - `QUERY_STATE_EXPIRED`: The query execution expired, and the result is no longer available. - `QUERY_STATE_COMPLETED_PARTIAL`: The query execution was successful, but the result was truncated because it was too large. To receive the truncated result, set the `allow_partial_results` flag to `true` in the API request to fetch the result. +## Error Response Fields + +When a query execution fails (`QUERY_STATE_FAILED`), the response includes an `error` object with the following fields: + +- **type** (string): Error type classification (e.g., `FAILED_TYPE_EXECUTION_FAILED`) +- **message** (string): Detailed error message explaining what went wrong, including line and column information +- **metadata** (object): Additional error context + - **line** (integer): Line number where the error occurred + - **column** (integer): Column position where the error occurred + ```bash cURL @@ -139,3 +153,41 @@ HttpResponse response = Unirest.get("https://api.dune.com/api/v1/executi ``` + + + +```json Success Response +{ + "execution_id": "01HKZJ2683PHF9Q9PHHQ8FW4Q1", + "query_id": 3493826, + "is_execution_finished": true, + "state": "QUERY_STATE_COMPLETED", + "submitted_at": "2025-10-22T10:31:04.222464Z", + "expires_at": "2026-01-20T10:31:04.36241Z", + "execution_started_at": "2025-10-22T10:31:05.123456Z", + "execution_ended_at": "2025-10-22T10:31:15.789012Z", + "execution_cost_credits": 10 +} +``` + +```json Error Response +{ + "execution_id": "01K85QHSS0RBGW4BHDM0RFCG9C", + "query_id": 6012998, + "is_execution_finished": true, + "state": "QUERY_STATE_FAILED", + "submitted_at": "2025-10-22T10:31:04.222464Z", + "expires_at": "2026-01-20T10:31:04.36241Z", + "execution_cost_credits": 0, + "error": { + "type": "FAILED_TYPE_EXECUTION_FAILED", + "message": "line 1:8: Column 'x' cannot be resolved at line 1, position 8. Please verify that this column exists using the data explorer. Learn how to use the data explorer here: https://dune.com/docs/app/query-editor/data-explorer/ [Execution ID: 01K85QHSS0RBGW4BHDM0RFCG9C]", + "metadata": { + "line": 1, + "column": 8 + } + } +} +``` + + diff --git a/docs.json b/docs.json index 47bb67bd..2e8ab8b0 100644 --- a/docs.json +++ b/docs.json @@ -2905,6 +2905,7 @@ "pages": [ "api-reference/executions/execution-object", "api-reference/executions/endpoint/execute-query", + "api-reference/executions/endpoint/execute-sql", "api-reference/executions/endpoint/cancel-execution", "api-reference/executions/endpoint/get-execution-status", "api-reference/executions/endpoint/get-execution-result", From e23b09f05393112d2b6ec284cecb123fa878cf1c Mon Sep 17 00:00:00 2001 From: dune-eng <77401252+dune-eng@users.noreply.github.com> Date: Mon, 3 Nov 2025 16:10:14 +0100 Subject: [PATCH 30/36] [Automated] Update OpenAPI specifications (#908) --- analytics-openapi.json | 146 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/analytics-openapi.json b/analytics-openapi.json index d3ef5965..2710309e 100644 --- a/analytics-openapi.json +++ b/analytics-openapi.json @@ -4997,6 +4997,95 @@ } } } + }, + "/v1/usage": { + "post": { + "summary": "Get Usage Data", + "description": "Get usage data for the authenticated customer including private queries, dashboards,\nbytes used/allowed, and billing periods", + "parameters": [ + { + "name": "X-Dune-Api-Key", + "in": "header", + "description": "API Key for the service", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "api_key", + "in": "query", + "description": "API Key, alternative to using the HTTP header X-Dune-Api-Key", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "description": "Request payload with optional start_date and end_date", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.GetUsageRequest" + } + } + }, + "required": false + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.GetUsageResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error400" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error401" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error403" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/models.Error500" + } + } + } + } + }, + "x-codegen-request-body-name": "payload" + } } }, "components": { @@ -5138,6 +5227,27 @@ } } }, + "models.BillingPeriod": { + "type": "object", + "properties": { + "credits_included": { + "type": "number", + "description": "Float value" + }, + "credits_used": { + "type": "number", + "description": "Float value" + }, + "end_date": { + "type": "string", + "description": "YYYY-MM-DD format" + }, + "start_date": { + "type": "string", + "description": "YYYY-MM-DD format" + } + } + }, "models.CSVUploadRequest": { "type": "object", "properties": { @@ -5528,6 +5638,42 @@ } } }, + "models.GetUsageRequest": { + "type": "object", + "properties": { + "end_date": { + "type": "string", + "description": "Optional field in YYYY-MM-DD format" + }, + "start_date": { + "type": "string", + "description": "Optional field in YYYY-MM-DD format" + } + } + }, + "models.GetUsageResponse": { + "type": "object", + "properties": { + "billingPeriods": { + "type": "array", + "items": { + "$ref": "#/components/schemas/models.BillingPeriod" + } + }, + "bytes_allowed": { + "type": "integer" + }, + "bytes_used": { + "type": "integer" + }, + "private_dashboards": { + "type": "integer" + }, + "private_queries": { + "type": "integer" + } + } + }, "models.Parameter": { "type": "object", "properties": { From 11e4d68acada581492541dfc26deb00186dd50ce Mon Sep 17 00:00:00 2001 From: dune-eng <77401252+dune-eng@users.noreply.github.com> Date: Mon, 3 Nov 2025 21:14:18 +0100 Subject: [PATCH 31/36] [Automated] Update OpenAPI specifications (#909) Co-authored-by: ivpusic <450140+ivpusic@users.noreply.github.com> --- analytics-openapi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analytics-openapi.json b/analytics-openapi.json index 2710309e..0276baea 100644 --- a/analytics-openapi.json +++ b/analytics-openapi.json @@ -5654,7 +5654,7 @@ "models.GetUsageResponse": { "type": "object", "properties": { - "billingPeriods": { + "billing_periods": { "type": "array", "items": { "$ref": "#/components/schemas/models.BillingPeriod" From ba7ba406d9a35375af6717c1d7dd2b759fb97553 Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Mon, 3 Nov 2025 15:18:37 -0500 Subject: [PATCH 32/36] Add Usage and Tables List API endpoints (#905) * Add Usage and Tables List API endpoints - Added GET /v1/usage endpoint for retrieving customer usage data - Returns billing period data, credits, queries, dashboards, and storage info - Supports optional start_date and end_date parameters - Metadata endpoint (no credit consumption) - Added GET /v1/tables endpoint for listing uploaded tables - Returns paginated list of user/team tables - Includes table metadata, columns, and owner information - Supports limit and offset parameters for pagination - Metadata endpoint (no credit consumption) - Updated navigation in docs.json and mint.json - Added Usage group under Data Management Endpoints - Added List endpoint to Tables group Both endpoints follow the same structure as existing API documentation with code examples in cURL, Python, and JavaScript. * Remove implementation details from usage endpoint documentation * Simplify description of list tables endpoint Removed redundant information about the endpoint's functionality. * Remove rate limits information from list endpoint Removed rate limits section from the endpoint documentation. * Update get-usage.mdx to remove rate limits Removed rate limits section from usage endpoint documentation. * Fix: Change usage endpoint from GET to POST to match OpenAPI spec The analytics-openapi.json defines /v1/usage as a POST endpoint, not GET. Updated the MDX file and all code examples to use POST method. --- api-reference/tables/endpoint/list.mdx | 111 +++++++++++++++++++++ api-reference/usage/endpoint/get-usage.mdx | 86 ++++++++++++++++ docs.json | 7 ++ mint.json | 7 ++ 4 files changed, 211 insertions(+) create mode 100644 api-reference/tables/endpoint/list.mdx create mode 100644 api-reference/usage/endpoint/get-usage.mdx diff --git a/api-reference/tables/endpoint/list.mdx b/api-reference/tables/endpoint/list.mdx new file mode 100644 index 00000000..ac5246a7 --- /dev/null +++ b/api-reference/tables/endpoint/list.mdx @@ -0,0 +1,111 @@ +--- +title: "List Tables" +openapi: "GET /v1/tables" +description: "Get a paginated list of uploaded tables" +--- + +## Description + +Retrieves a paginated list of tables uploaded by the user or their team. + +## Pagination + +Use the `limit` and `offset` parameters to paginate through large result sets: + +- To get the first 20 tables: `?limit=20&offset=0` +- To get the next 20 tables: `?limit=20&offset=20` +- Continue incrementing `offset` by `limit` to get subsequent pages + + +## Pricing + +This is a metadata endpoint and does not consume credits. + +## Related Endpoints + +- [Create Table](/api-reference/tables/endpoint/create) - Create a new table +- [Upload Data](/api-reference/tables/endpoint/upload) - Upload data to a table +- [Delete Table](/api-reference/tables/endpoint/delete) - Delete a table + + + +```bash cURL +curl -X GET "https://api.dune.com/api/v1/tables?limit=10&offset=0" \ + -H "X-DUNE-API-KEY: YOUR_API_KEY" +``` + +```python Python +import requests + +url = "https://api.dune.com/api/v1/tables" +params = { + "limit": 10, + "offset": 0 +} +headers = {"X-DUNE-API-KEY": "YOUR_API_KEY"} + +response = requests.get(url, params=params, headers=headers) +print(response.json()) +``` + +```javascript JavaScript +const url = 'https://api.dune.com/api/v1/tables'; +const params = new URLSearchParams({ + limit: 10, + offset: 0 +}); + +const response = await fetch(`${url}?${params}`, { + headers: { + 'X-DUNE-API-KEY': 'YOUR_API_KEY' + } +}); + +const data = await response.json(); +console.log(data); +``` + + + + + +```json Example Response +{ + "tables": [ + { + "full_name": "dune.dune.ai_contract_tags", + "is_private": true, + "table_size_bytes": "1152622", + "created_at": "2024-05-15T20:34:58.585Z", + "updated_at": "2024-05-16T21:19:02.459Z", + "purged_at": null, + "owner": { + "handle": "dune", + "type": "team" + }, + "columns": [ + { + "name": "blockchain", + "type": "string", + "nullable": false, + "metadata": { + "description": "Blockchain associated with the record", + "filtering_column": true + } + }, + { + "name": "contract_address", + "type": "string", + "nullable": false, + "metadata": { + "description": "Address of the smart contract" + } + } + ] + } + ] +} +``` + + + diff --git a/api-reference/usage/endpoint/get-usage.mdx b/api-reference/usage/endpoint/get-usage.mdx new file mode 100644 index 00000000..120fb199 --- /dev/null +++ b/api-reference/usage/endpoint/get-usage.mdx @@ -0,0 +1,86 @@ +--- +title: "Get Usage" +openapi: "POST /v1/usage" +description: "Retrieve customer usage data for billing periods" +--- + +## Description + +Retrieves customer usage data including credits, queries, dashboards, and storage. Returns the current billing period when no timeframe is specified. + + +## Pricing + +This is a metadata endpoint and does not consume credits. + + + +```bash cURL +curl -X POST "https://api.dune.com/api/v1/usage" \ + -H "Content-Type: application/json" \ + -H "X-DUNE-API-KEY: YOUR_API_KEY" \ + -d '{ + "start_date": "2025-01-01", + "end_date": "2025-02-01" + }' +``` + +```python Python +import requests + +url = "https://api.dune.com/api/v1/usage" +headers = { + "X-DUNE-API-KEY": "YOUR_API_KEY", + "Content-Type": "application/json" +} +data = { + "start_date": "2025-01-01", + "end_date": "2025-02-01" +} + +response = requests.post(url, json=data, headers=headers) +print(response.json()) +``` + +```javascript JavaScript +const url = 'https://api.dune.com/api/v1/usage'; + +const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-DUNE-API-KEY': 'YOUR_API_KEY' + }, + body: JSON.stringify({ + start_date: '2025-01-01', + end_date: '2025-02-01' + }) +}); + +const data = await response.json(); +console.log(data); +``` + + + + + +```json Example Response +{ + "private_queries": 100, + "private_dashboards": 100, + "bytes_used": 1000, + "bytes_allowed": 10101, + "billingPeriods": [ + { + "start_date": "2025-01-01", + "end_date": "2025-02-01", + "credits_used": 100.10, + "credits_included": 100000 + } + ] +} +``` + + + diff --git a/docs.json b/docs.json index 2e8ab8b0..ca93422a 100644 --- a/docs.json +++ b/docs.json @@ -2952,12 +2952,19 @@ "group": "Tables", "pages": [ "api-reference/tables/endpoint/overview", + "api-reference/tables/endpoint/list", "api-reference/tables/endpoint/create", "api-reference/tables/endpoint/insert", "api-reference/tables/endpoint/upload", "api-reference/tables/endpoint/clear", "api-reference/tables/endpoint/delete" ] + }, + { + "group": "Usage", + "pages": [ + "api-reference/usage/endpoint/get-usage" + ] } ] }, diff --git a/mint.json b/mint.json index 3f0692fb..424b3318 100644 --- a/mint.json +++ b/mint.json @@ -2923,12 +2923,19 @@ "group": "Tables", "pages": [ "api-reference/tables/endpoint/overview", + "api-reference/tables/endpoint/list", "api-reference/tables/endpoint/create", "api-reference/tables/endpoint/insert", "api-reference/tables/endpoint/upload", "api-reference/tables/endpoint/clear", "api-reference/tables/endpoint/delete" ] + }, + { + "group": "Usage", + "pages": [ + "api-reference/usage/endpoint/get-usage" + ] } ] }, From 3f67e045f55d58afecf77f8e3bafe08e39c8741f Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:38:14 -0500 Subject: [PATCH 33/36] Refactor: Rename "overage" to "extra credits" for clarity (#904) Co-authored-by: Cursor Agent --- api-reference/overview/troubleshooting.mdx | 2 +- learning/how-tos/credit-system.mdx | 14 +++++++------- learning/how-tos/pricing-faqs.mdx | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/api-reference/overview/troubleshooting.mdx b/api-reference/overview/troubleshooting.mdx index 442854a9..2db822ca 100644 --- a/api-reference/overview/troubleshooting.mdx +++ b/api-reference/overview/troubleshooting.mdx @@ -43,4 +43,4 @@ When you perform an action on a private query your API key doesn't have access t "error": "This api request would exceed your configured limits per billing cycle. Please visit your settings on dune.com and adjust your limits to continue usage." } ``` -You are trying to make a request but don't have enough credits (configured) on your account. If you'd like to incur overage, head over to settings -> subscription and adjust the limit you have set within "limit extra credits" toggle. \ No newline at end of file +You are trying to make a request but don't have enough credits (configured) on your account. If you'd like to incur extra credits, head over to settings -> subscription and adjust the limit you have set within "limit extra credits" toggle. \ No newline at end of file diff --git a/learning/how-tos/credit-system.mdx b/learning/how-tos/credit-system.mdx index a8d17615..4dd74a61 100644 --- a/learning/how-tos/credit-system.mdx +++ b/learning/how-tos/credit-system.mdx @@ -32,11 +32,11 @@ Credits are consumed based on the actual compute resources used for each query e To stay in full control, you can set: - a global query cost cap (per-execution ceiling). More info on how to do this [here](https://app.arcade.software/share/C60r4u7ESOp5RXRuzbSN). -- a monthly overage limit (account-level ceiling). +- a monthly extra credit limit (account-level ceiling). These controls ensure you never exceed what you're comfortable spending per run or per month. Learn how to set this up [here](https://app.arcade.software/share/so8QGM4H4MU0OWRWhNe9). -**Credit Pricing = Overage Pricing** -Overage is charged at the same rate as your plan. The price per 100 credits shown for each plan is what you pay for any usage beyond your included credits, keeping things simple and transparent. +**Credit Pricing = Extra Credit Pricing** +Extra credits are charged at the same rate as your plan. The price per 100 credits shown for each plan is what you pay for any usage beyond your included credits, keeping things simple and transparent. **Quick Plan Reference** @@ -67,9 +67,9 @@ Explore the complete pricing plan with credit limits and features for each tier: - **Review your usage.** Check your query volume and costs regularly to stay informed about your credit consumption. - **Optimize your queries.** Efficient queries save credits and run faster. See [here](https://docs.dune.com/query-engine/writing-efficient-queries) for tips. -- **Pick the plan that fits.** If you anticipate heavy usage or notice overages, consider upgrading to Enterprise for **significantly lower per-credit rates**. Contact our sales team at [dune.com/enterprise](http://dune.com/enterprise) to discuss custom pricing and tailored solutions for your needs. +- **Pick the plan that fits.** If you anticipate heavy usage or notice extra credits usage, consider upgrading to Enterprise for **significantly lower per-credit rates**. Contact our sales team at [dune.com/enterprise](http://dune.com/enterprise) to discuss custom pricing and tailored solutions for your needs. - **Cap your query costs.** Control spending by setting a maximum credit limit for individual queries. More info on how to do this [here](https://app.arcade.software/share/C60r4u7ESOp5RXRuzbSN). -- **Set overage limits.** Configure your overage spending limits to control costs. Learn how to set this up [here](https://app.arcade.software/share/so8QGM4H4MU0OWRWhNe9). +- **Set extra credit limits.** Configure your extra credit spending limits to control costs. Learn how to set this up [here](https://app.arcade.software/share/so8QGM4H4MU0OWRWhNe9). ## Need Help? @@ -104,7 +104,7 @@ Engine matters. Large runs complex queries fastest and therefore consumes credit To stay in full control, you can set: a global query cost cap (per-execution ceiling), and -a monthly overage limit (account-level ceiling). +a monthly extra credit limit (account-level ceiling). @@ -116,7 +116,7 @@ a monthly overage limit (account-level ceiling). - The usage and billing dashboard shows credits used, overages, and historical usage. + The usage and billing dashboard shows credits used, extra credits, and historical usage. diff --git a/learning/how-tos/pricing-faqs.mdx b/learning/how-tos/pricing-faqs.mdx index 88f890cf..461c3d76 100644 --- a/learning/how-tos/pricing-faqs.mdx +++ b/learning/how-tos/pricing-faqs.mdx @@ -66,7 +66,7 @@ Find answers to common questions about Dune's pricing, credits, billing cycles, - Annual billing enables customers to pay for their plan yearly at a reduced rate. Customers on this plan will still have their credits reset on a monthly basis, as well as receive monthly charges for any potential overage incurred. + Annual billing enables customers to pay for their plan yearly at a reduced rate. Customers on this plan will still have their credits reset on a monthly basis, as well as receive monthly charges for any potential extra credits incurred. @@ -90,7 +90,7 @@ Find answers to common questions about Dune's pricing, credits, billing cycles, **Monitor Your Usage** - Check the usage tab regularly to track your credit consumption patterns - Review which queries and users consume the most credits - - Set overage limits to control how many additional credits can be purchased beyond your plan's included amount + - Set extra credit limits to control how many additional credits can be purchased beyond your plan's included amount **Control Spending** - Set query cost caps in Settings to limit the maximum credits any single query can consume @@ -103,7 +103,7 @@ Find answers to common questions about Dune's pricing, credits, billing cycles, - Once your monthly credit quota runs out, we'll continue to bill you for additional credits at your plan's overage rate. There's no separate "overage pricing", you pay the same rate per 100 credits as shown for your plan: + Once your monthly credit quota runs out, we'll continue to bill you for additional credits at your plan's extra credit rate. There's no separate "extra credit pricing", you pay the same rate per 100 credits as shown for your plan: - Free: $5.00 per 100 credits - Analyst: $1.875 per 100 credits (monthly) / $1.625 per 100 credits (annual) From 32f28799f7177660ed85bf2ecc09cc3b20e718c0 Mon Sep 17 00:00:00 2001 From: 0xRob <83790096+0xRobin@users.noreply.github.com> Date: Wed, 5 Nov 2025 11:50:59 +0100 Subject: [PATCH 34/36] Refactor: Rename prices_coinpaprika to prices_external (#911) Co-authored-by: Cursor Agent --- data-catalog/curated/prices/overview.mdx | 6 +++--- data-catalog/curated/prices/prices_day.mdx | 4 ++-- data-catalog/curated/prices/prices_hour.mdx | 4 ++-- data-catalog/curated/prices/prices_minute.mdx | 4 ++-- .../curated/token-transfers/evm/token-transfers.mdx | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/data-catalog/curated/prices/overview.mdx b/data-catalog/curated/prices/overview.mdx index a84a525b..ebac330e 100644 --- a/data-catalog/curated/prices/overview.mdx +++ b/data-catalog/curated/prices/overview.mdx @@ -108,7 +108,7 @@ All price tables share the following schema: For specialized analysis, each granularity offers source-specific tables: **Coinpaprika-only tables:** -- `prices_coinpaprika.day`, `prices_coinpaprika.hour`, `prices_coinpaprika.minute`, `prices_coinpaprika.latest` +- `prices_external.day`, `prices_external.hour`, `prices_external.minute`, `prices_external.latest` **DEX-derived tables:** - `prices_dex.day`, `prices_dex.hour`, `prices_dex.minute`, `prices_dex.latest` @@ -157,7 +157,7 @@ WHERE name = 'arbitrum' The following tables are maintained for historical compatibility: -- `prices.usd` - **View of `prices_coinpaprika.minute`** (maintains legacy schema) +- `prices.usd` - **View of `prices_external.minute`** (maintains legacy schema) -Note: `prices.usd` is a view of `prices_coinpaprika.minute` while preserving the legacy schema for backward compatibility. +Note: `prices.usd` is a view of `prices_external.minute` while preserving the legacy schema for backward compatibility. diff --git a/data-catalog/curated/prices/prices_day.mdx b/data-catalog/curated/prices/prices_day.mdx index 8075cbfc..68b96669 100644 --- a/data-catalog/curated/prices/prices_day.mdx +++ b/data-catalog/curated/prices/prices_day.mdx @@ -42,7 +42,7 @@ The daily prices are built through these steps: If you need prices from specific sources only: -#### `prices_coinpaprika.day` +#### `prices_external.day` For purely coinpaprika-based daily prices: - **Coverage**: Only tokens with Coinpaprika listings (~2,000 tokens) - **Source**: External exchange-aggregated pricing @@ -157,5 +157,5 @@ ORDER BY timestamp - Prices are calculated using volume-weighted averages for more accurate representation - **Quality Filtering**: The system includes filtering mechanisms to reduce the impact of anomalous trades - **DEX-derived limitations**: DEX-derived prices can contain errors due to low liquidity, market manipulation, or anomalous trades -- **Fallback option**: For critical applications, consider using `prices_coinpaprika.day` for more reliable pricing where available +- **Fallback option**: For critical applications, consider using `prices_external.day` for more reliable pricing where available - **Data validation**: Always validate prices for critical applications, especially for lesser-known tokens \ No newline at end of file diff --git a/data-catalog/curated/prices/prices_hour.mdx b/data-catalog/curated/prices/prices_hour.mdx index 7ce416d8..31a8a89d 100644 --- a/data-catalog/curated/prices/prices_hour.mdx +++ b/data-catalog/curated/prices/prices_hour.mdx @@ -39,7 +39,7 @@ The hourly prices are built through these steps: ### Source-Specific Variants -#### `prices_coinpaprika.hour` +#### `prices_external.hour` For purely coinpaprika-based hourly prices: - **Coverage**: Only tokens with Coinpaprika listings (~2,000 tokens) - **Source**: External exchange-aggregated hourly pricing @@ -102,5 +102,5 @@ ORDER BY 1 - Prices are calculated using volume-weighted averages for more accurate representation - **Quality Filtering**: The system includes filtering mechanisms to reduce the impact of anomalous trades - **DEX-derived limitations**: DEX-derived prices can contain errors due to low liquidity, market manipulation, or anomalous trades -- **Fallback option**: For critical applications, consider using `prices_coinpaprika.hour` for more reliable pricing where available +- **Fallback option**: For critical applications, consider using `prices_external.hour` for more reliable pricing where available - **Data validation**: Always validate prices for critical applications, especially for lesser-known tokens \ No newline at end of file diff --git a/data-catalog/curated/prices/prices_minute.mdx b/data-catalog/curated/prices/prices_minute.mdx index f7338b3e..fbe5df90 100644 --- a/data-catalog/curated/prices/prices_minute.mdx +++ b/data-catalog/curated/prices/prices_minute.mdx @@ -45,7 +45,7 @@ The minute prices are built using the hybrid approach with interpolation: ### Source-Specific Variants -#### `prices_coinpaprika.minute` +#### `prices_external.minute` For purely coinpaprika-based minute prices: - **Coverage**: Only tokens with Coinpaprika listings (~2,000 tokens) - **Source**: External exchange-aggregated minute pricing with interpolation @@ -118,5 +118,5 @@ ORDER BY 1 - **48-Hour Forward-Fill**: The system forward-fills with the last available price for a maximum of 48 hours (2880 minutes) to avoid stale data - **External source reliability**: Coinpaprika data provides stable, exchange-aggregated pricing - **DEX-derived limitations**: DEX-derived prices can contain errors due to low liquidity, market manipulation, or anomalous trades -- **Fallback option**: For critical applications, consider using `prices_coinpaprika.minute` for more reliable pricing where available +- **Fallback option**: For critical applications, consider using `prices_external.minute` for more reliable pricing where available - **Data validation**: Always validate prices for critical applications, especially for lesser-known tokens \ No newline at end of file diff --git a/data-catalog/curated/token-transfers/evm/token-transfers.mdx b/data-catalog/curated/token-transfers/evm/token-transfers.mdx index cd3e190f..773e3909 100644 --- a/data-catalog/curated/token-transfers/evm/token-transfers.mdx +++ b/data-catalog/curated/token-transfers/evm/token-transfers.mdx @@ -33,7 +33,7 @@ The transfers table provides a comprehensive view of token movement across netwo ### Pricing Methodology -**Important**: The USD values in `tokens.transfers` are calculated using `prices_coinpaprika.hour`, **not** the hybrid `prices.hour` table. +**Important**: The USD values in `tokens.transfers` are calculated using `prices_external.hour`, **not** the hybrid `prices.hour` table. The `amount_usd` column in the transfers table uses Coinpaprika-sourced pricing data exclusively, which provides: @@ -99,7 +99,7 @@ This query calculates the daily transfer volume for a specific ERC20 token. Please be aware that token volumes are not necessarily indicative of anything. These metrics can be misleading if the token is not well-known or if there are a lot of small transfers. Token transfers can be mints, burns, transfers, flash loans and anything in between, trying to read into the data can lead to misleading results. -Note: The `amount_usd` values are calculated using Coinpaprika pricing data (`prices_coinpaprika.hour`) for stable, exchange-validated pricing. +Note: The `amount_usd` values are calculated using Coinpaprika pricing data (`prices_external.hour`) for stable, exchange-validated pricing. ```sql SELECT From 49cffad558d4ab5e8a7081ee5b74d295a3048027 Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Wed, 5 Nov 2025 08:56:39 -0500 Subject: [PATCH 35/36] Move Usage endpoint to Account Management category (#912) - Created new 'Account Management' top-level category - Moved Usage endpoint from Data Management Endpoints to Account Management - Updated both docs.json and mint.json navigation structures This better reflects the purpose of the usage endpoint as account-level information rather than data management. --- docs.json | 7 ++++++- mint.json | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs.json b/docs.json index ca93422a..ec3d75af 100644 --- a/docs.json +++ b/docs.json @@ -2959,7 +2959,12 @@ "api-reference/tables/endpoint/clear", "api-reference/tables/endpoint/delete" ] - }, + } + ] + }, + { + "group": "Account Management", + "pages": [ { "group": "Usage", "pages": [ diff --git a/mint.json b/mint.json index 424b3318..07c4ded1 100644 --- a/mint.json +++ b/mint.json @@ -2930,7 +2930,12 @@ "api-reference/tables/endpoint/clear", "api-reference/tables/endpoint/delete" ] - }, + } + ] + }, + { + "group": "Account Management", + "pages": [ { "group": "Usage", "pages": [ From 82df817c31beb176bdf87c7e140f3c69217bac60 Mon Sep 17 00:00:00 2001 From: kdot <151790166+karimhass@users.noreply.github.com> Date: Wed, 5 Nov 2025 13:07:28 -0500 Subject: [PATCH 36/36] Fix SQL execute API OpenAPI spec for 'Try it' functionality (#913) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix SQL execute API OpenAPI spec for 'Try it' functionality The OpenAPI spec was incorrectly configured with: - performance as a query parameter - Request body as a plain string This caused the 'Try it' button to fail with 'Invalid request body payload'. Fixed by: - Moved performance from query parameter to request body - Changed request body to JSON object with sql and performance fields - Added new models.ExecuteSQLRequest schema with proper structure - This matches the actual API implementation and code examples Now the 'Try it' functionality will send: { "sql": "SELECT * FROM dex.trades LIMIT 10", "performance": "medium" } * Fix interval syntax in SQL execute examples Changed from: interval '1 day' To: interval '1' day The correct DuneSQL/Trino syntax requires the number and unit to be separate: - interval '1' day ✓ - interval '1 day' ✗ This fixes the error: 'Unknown resolvedType: interval at line 1, position 53' Updated: - All code examples (cURL, Python, JavaScript) - OpenAPI schema example - Complete workflow example * Add note about query_id being 0 for arbitrary SQL executions Added documentation explaining that when executing arbitrary SQL queries (queries not saved in Dune), the query_id in the response will always be 0. This is a placeholder value since these queries are not stored in the database. Addresses feedback from backend team discussion. --- analytics-openapi.json | 35 +++++++++++-------- .../executions/endpoint/execute-sql.mdx | 10 ++++-- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/analytics-openapi.json b/analytics-openapi.json index 0276baea..017a4ebd 100644 --- a/analytics-openapi.json +++ b/analytics-openapi.json @@ -4176,26 +4176,14 @@ "schema": { "type": "string" } - }, - { - "name": "performance", - "in": "query", - "description": "The performance engine tier the execution will be run on. Can be either `medium` or `large`. Credits are consumed based on actual compute resources used. Medium is the default, large provides more resources for complex queries.", - "schema": { - "type": "string", - "enum": [ - "medium", - "large" - ] - } } ], "requestBody": { - "description": "Raw SQL query to execute", + "description": "SQL query and performance configuration", "content": { - "*/*": { + "application/json": { "schema": { - "type": "string" + "$ref": "#/components/schemas/models.ExecuteSQLRequest" } } }, @@ -5419,6 +5407,23 @@ } } }, + "models.ExecuteSQLRequest": { + "type": "object", + "required": ["sql"], + "properties": { + "sql": { + "type": "string", + "description": "The SQL query to execute", + "example": "SELECT * FROM dex.trades WHERE block_time > now() - interval '1' day LIMIT 10" + }, + "performance": { + "type": "string", + "description": "The performance engine tier the execution will be run on. Can be either `medium` or `large`. Medium consumes 10 credits, and large consumes 20 credits, per run. Default is `medium`.", + "enum": ["medium", "large"], + "default": "medium" + } + } + }, "models.ExecutionResultMetadata": { "type": "object", "properties": { diff --git a/api-reference/executions/endpoint/execute-sql.mdx b/api-reference/executions/endpoint/execute-sql.mdx index 04724332..4332073b 100644 --- a/api-reference/executions/endpoint/execute-sql.mdx +++ b/api-reference/executions/endpoint/execute-sql.mdx @@ -6,6 +6,10 @@ description: "Execute raw SQL queries directly without needing to create a saved > Run arbitrary SQL queries via API. This endpoint allows you to execute SQL directly without first creating a query object, perfect for dynamic analysis and automated workflows. + +When executing arbitrary SQL queries (queries not saved in Dune), the `query_id` in the response will always be `0`. This is a placeholder value since these queries are not stored in the Dune database. + + ## Pricing This endpoint is **usage-based** and consumes credits based on the computational resources used during execution. @@ -17,7 +21,7 @@ curl -X POST "https://api.dune.com/api/v1/sql/execute" \ -H "Content-Type: application/json" \ -H "X-Dune-Api-Key: YOUR_API_KEY" \ -d '{ - "sql": "SELECT * FROM dex.trades WHERE block_time > now() - interval '\''1 day'\'' LIMIT 10", + "sql": "SELECT * FROM dex.trades WHERE block_time > now() - interval '\''1'\'' day LIMIT 10", "performance": "medium" }' ``` @@ -31,7 +35,7 @@ headers = { "Content-Type": "application/json" } data = { - "sql": "SELECT * FROM dex.trades WHERE block_time > now() - interval '1 day' LIMIT 10", + "sql": "SELECT * FROM dex.trades WHERE block_time > now() - interval '1' day LIMIT 10", "performance": "medium" } @@ -47,7 +51,7 @@ const response = await fetch('https://api.dune.com/api/v1/sql/execute', { 'X-DUNE-API-KEY': 'YOUR_API_KEY' }, body: JSON.stringify({ - sql: "SELECT * FROM dex.trades WHERE block_time > now() - interval '1 day' LIMIT 10", + sql: "SELECT * FROM dex.trades WHERE block_time > now() - interval '1' day LIMIT 10", performance: 'medium' }) });