Changelog

Greg

We just released one of our biggest updates yet to the Universal Bridge API. These changes will be coming soon to the SDK and UI components.

The new response schema includes a steps field, which gives you all the info you need to build a comprehensive bridge and swap UI. This includes token metadata, price, expected execution time, input and output amounts, and the transactions to be executed.

A buy, sell, or transfer prepared quote will now look something like this:

{
"data": {
"id": "0x11cb09cf545d9c1c1cc12aa20aaee180a59336ec72701b148f452734c50f1bbf",
"originAmount": "17055594260",
"destinationAmount": "10000001000001000005",
"blockNumber": "22325874",
"timestamp": 1745340923953,
"estimatedExecutionTimeMs": 22000,
"intent": {
"originChainId": 1,
"originTokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"destinationChainId": 8453,
"destinationTokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"amount": "10000001000001000005",
"sender": "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709",
"receiver": "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709"
},
"steps": [
{
"originToken": {
"chainId": 1,
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"priceUsd": 0.999949,
"iconUri": "https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694"
},
"destinationToken": {
"chainId": 8453,
"address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"symbol": "ETH",
"name": "Ether",
"decimals": 18,
"priceUsd": 1695.537726,
"iconUri": "https://assets.relay.link/icons/1/light.png"
},
"transactions": [
{
"chainId": 1,
"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"data": "0x095ea7b3000000000000000000000000f8ab2dbe6c43bf1a856471182290f91d621ba76d00000000000000000000000000000000000000000000000000000003f897b714",
"type": "eip1559",
"id": "0xe984ce73defcb35a2decb07b1cbadb57bea0e9bd4c3d919f286988daae5e98a8",
"action": "approval"
},
{
"type": "eip1559",
"to": "0xF8Ab2dBE6c43bf1a856471182290f91D621Ba76d",
"from": "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709",
"value": "0",
"data": "0x...",
"chainId": 1,
"action": "buy",
"id": "0x3b575d76157c50c94c61f0e1265dee784d00d2ad7502f1c6a6dba938e270b196",
"spender": "0xfCEF2Fe72413b65d3F393d278A714caD87512bcd"
}
],
"originAmount": "17055594260",
"destinationAmount": "10000001000001000005",
"estimatedExecutionTimeMs": 22000
}
]
}
}

Onramp quotes will now have the following schema:

{
"data": {
"id": "5a066908-82da-4d31-8dea-99c45f72e98b",
"link": "https://pay.coinbase.com/buy/select-asset?appId=41cbb2fb-8b35-45b9-949b-9672bc8edb78&addresses=%7B%220x2247d5d238d0f9d37184d8332aE0289d1aD9991b%22%3A%5B%22unichain%22%5D%7D&assets=%5B%22USDC%22%5D&defaultAsset=USDC&defaultNetwork=unichain&presetCryptoAmount=1716.321932&fiatCurrency=USD&partnerUserId=7d789de0-b4e0-4aac-84b4-5e13b11c896d",
"destinationAmount": "1000000100000010000",
"timestamp": 1745341089555,
"expiration": 1745344689547,
"intent": {
"chainId": 324,
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"amount": "1000000100000010000",
"receiver": "0x2247d5d238d0f9d37184d8332aE0289d1aD9991b",
"onramp": "coinbase",
"currency": "USD",
"maxSteps": 2,
"excludeChainIds": []
},
"steps": [
{
"originToken": {
"chainId": 130,
"address": "0x078D782b760474a361dDA0AF3839290b0EF57AD6",
"symbol": "USDC",
"name": "USDCoin",
"decimals": 6,
"priceUsd": 0.999949,
"iconUri": "https://ethereum-optimism.github.io/data/USDC/logo.png"
},
"destinationToken": {
"chainId": 324,
"address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"symbol": "ETH",
"name": "Ether",
"decimals": 18,
"priceUsd": 1691.447,
"iconUri": "https://assets.relay.link/icons/1/light.png"
},
"transactions": [
{
"chainId": 130,
"to": "0x078D782b760474a361dDA0AF3839290b0EF57AD6",
"data": "0x095ea7b3000000000000000000000000f8ab2dbe6c43bf1a856471182290f91d621ba76d00000000000000000000000000000000000000000000000000000000664cfe8c",
"type": "eip1559",
"id": "0xb1ec1d50e1ef52ebb5fab91103f05605e9d24fb8ff26c4e5ef728e41ff82b788",
"action": "approval"
},
{
"type": "eip1559",
"to": "0xF8Ab2dBE6c43bf1a856471182290f91D621Ba76d",
"from": "0x2247d5d238d0f9d37184d8332aE0289d1aD9991b",
"value": "0",
"data": "0x...",
"chainId": 130,
"action": "buy",
"id": "0x1c66f9e7aefee5ffcc9b22595d07c3eedfa89deaec189707f73272f8e52d1d7b",
"spender": "0x078D782b760474a361dDA0AF3839290b0EF57AD6"
}
],
"originAmount": "1716321932",
"destinationAmount": "1000000100000010000",
"estimatedExecutionTimeMs": 2000
}
],
"currency": "USD",
"currencyAmount": 1716.321932
}
}

The steps are to be completed after the use has done the initial onramp.

You can find all this and more in our API reference docs.

Features

  • steps parameter for all quotes with prepared transactions and estimates
  • Faster approximate quote responses
  • Onramping with post-onramp cross-chain swaps
  • Fiat quote included in onramp responses

Bug Fixes

  • Removed ZK chains from intermediate steps, due to inconsistent addresses when using smart wallets
Yash Kumar

We have added CLI and SDK support for Stylus contracts.

This allows developers to use thirdweb CLI to create, publish, and deploy their contracts written with Stylus. The deployed contracts can be used via thirdweb dashboard or SDK.

Prerequisites:

You can also use the Stylus quickstart guide for reference: https://docs.arbitrum.io/stylus/quickstart

Here's how to use this feature:

Setup a starter repo (can be skipped if you already have a Stylus project)

npx thirdweb create-stylus

This will setup a project containing a template contract.

You can now publish this contract by running the publish command:

npx thirdweb publish-stylus -k <YOUR SECRET KEY>

Publishing a contract saves the contract metadata to an onchain registry, and creates a contract page from where you can deploy a specific version of this contract multiple times.

This is how it will look:

Alternatively, you can use the deploy command to do a one-time deployment:

npx thirdweb deploy-stylus -k <YOUR SECRET KEY>

After deployment, the contract will be available on thirdweb dashboard. You can interact with it via dashboard or integrate it in your app using the code snippets as shown below:

Greg

We've significantly increased the number of onramp routes available in the Universal Bridge widget. You can now onramp to chains like Mantle, Unichain, Lens, Treasure, and more. No SDK upgrade necessary. Try it out on the bridge page here.

0:00
/0:41
Arsenii

We’ve fixed the issues with how metadata links are resolved — and introduced a new way to give you control over it.

Accurate Link Resolution

  • Fixed a bug where metadata responses sometimes included incorrectly resolved URLs.
  • Added validation logic to detect bad URIs in cached or stored metadata — and automatically re-fetches only the original source.

🧠 New: Control Over Metadata Link Resolution

  • Introduced a new resolve_metadata_links parameter (default: true) to all NFT endpoints which can return metadata.
  • When set to false, the response will return original links such as ipfs:// and ar://, instead of their resolved HTTP versions.

This gives clients full control — whether you want cleanly resolved URLs or raw metadata as authored on-chain.

Joaquim Verges

We're excited to announce a major enhancement to the thirdweb TypeScript SDK that will significantly improve the developer experience when building blockchain applications. With release 5.95.0, we've supercharged the SDK by integrating it with Insight - our in-house indexer - replacing traditional RPC calls for fetching contract state, events, balances, NFT metadata, and more.

The Power of Insight

Until now, the thirdweb SDK has relied primarily on RPC calls to fetch on-chain data. While functional, this approach sometimes faced limitations in terms of speed, reliability, and functionality. By integrating Insight directly into our SDK, we've addressed these challenges head-on, offering:

  • Significantly faster queries for contract events, balances, and NFTs
  • Enhanced reliability with reduced dependency on mutli roundtrip RPC calls
  • Cross-chain functionality that lets you query data across multiple blockchains in a single call
  • Advanced filtering capabilities for more precise data retrieval

What's New in the SDK

New capabilities in the Connect UI components

The Connect UI modal now uses Insight to give your users a full wallet experience directly in your websites:

  • Shows all ERC20 token balances
  • Show all NFTs
  • Shows past transactions of the connected wallet
0:00
/0:11

You can now view all your tokens and NFTs in the connect modal

Supercharged Existing Functions

Your favorite thirdweb functions have been turbocharged with Insight integration:

  • getContractEvents
  • getOwnedNFTs
  • getNFTs
  • getNFT

These functions now automatically leverage our indexer on supported chains, with a graceful fallback to traditional RPC calls when needed.

If you're already using those functions in your app, no changes needed on your end, you'll just get the improved functionality out of the box.

If for any reason you need to turn off that behavior, you can pass useIndexer: false to always use RPC.

New Insight Namespace

We've added a dedicated Insight namespace with powerful new functions:

  • Insight.getOwnedTokens() - Get ERC20 tokens owned by an address across multiple chains
  • Insight.getOwnedNFTs() - Get NFTs (ERC721 and ERC1155) owned by an address
  • Insight.getNFTs() - Get NFTs (ERC721 and ERC1155) for a given contract
  • Insight.getNFT() - Get NFTs metadata for a given contract and tokenId
  • Insight.getTransactions() - Get all transactions for a given wallet address
  • Insight.getContractEvents() - Query indexed events with advanced filtering options

You can import those with import { Insight } from "thirdweb"

New Standalone Package: @thirdweb-dev/insight


For developers who need direct access to our indexer API, we've released a standalone package: @thirdweb-dev/insight. This lightweight API wrapper provides:

  • Typed functions, request bodies, and responses
  • Always stays in sync with the Insight API
  • Perfect for backend applications requiring optimized blockchain data access, without the rest of the SDK

Hands-on Examples

For the existing functions, you will get the improved functionality out of the box without any changes. If you want to use the new multichain capabilities directly, here's some examples using the new Insight namespace:

Get ERC20 Tokens Across Multiple Chains

import { Insight } from "thirdweb";
const tokens = await Insight.getOwnedTokens({
client,
ownerAddress,
chains: [base, polygon, arbitrum],
});

With just a few lines of code, you can now retrieve all ERC20 tokens owned by an address across Base, Polygon, and Arbitrum networks simultaneously!

Fetch Owned NFTs

import { Insight } from "thirdweb";
const nfts = await Insight.getOwnedNFTs({
client,
ownerAddress,
chains: [sepolia],
});

Get Transaction History

import { Insight } from "thirdweb";
const transactions = await Insight.getTransactions({
client,
walletAddress,
chains: [sepolia],
});

Query Indexed Contract Events

import { Insight } from "thirdweb";
const events = await Insight.getContractEvents({
client,
chains: [sepolia],
contractAddress: "0x...",
event: transferEvent(),
decodeLogs: true,
});

Using the Standalone Insight Package

For developers who want low level access to the Insight API with type-safe functions, here's how to use the standalone @thirdweb-dev/insight package:

Configuration

import { configure } from "@thirdweb-dev/insight";
// Call this once at the startup of your application
configure({
clientId: "<YOUR_CLIENT_ID>",
});

Example Usage

import { getV1Events } from "@thirdweb-dev/insight";
const events = await getV1Events({
query: {
chain: [1, 137],
filter_address: "0x1234567890123456789012345678901234567890",
},
});

These functions will map one to one with the Insight OpenAPI spec and will stay in sync as the service changes.

Getting Started

These new features are available now in thirdweb SDK v5.95.0 and the new @thirdweb-dev/insight v1.0.0 package.

To get started:

npm install thirdweb@latest
# Or if you need the standalone package
npm install @thirdweb-dev/insight

Looking for dotnet/unity? It's already out, head over to the dotnet documentation to learn more.

What's Next?

This Insight integration is just the beginning. We're continuously working to enhance the thirdweb developer experience with more powerful indexing capabilities, additional cross-chain functionality, and deeper integration with our developer tools ecosystem.

Stay tuned for more updates, and as always, happy building!


For more detailed documentation on these new features, visit portal.thirdweb.com.

Toomas Oosalu

Insight adds more data to token price API to also return market data, historical price data and holder count in addition to the price!

Market Data

The following data is now included by default for each token:

percent_change_24h - Percentage change of the price over the last day

volume_24h_usd - Trading volume in USD over the last day

volume_change_24h - Percentage change of volume over the last day

market_cap_usd - Market cap value in USD

Holder Count

By specifying include_holders=true query param the number of on-chain holders of the token will also be returned

Historical Price Data

By including include_historical_prices=true query param, the response will contain a list of token prices per hour over the last 30 days.


Here is an example response for USDC on Ethereum

{
"data": [
{
"chain_id": 1,
"address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"symbol": "USDC",
"price_usd": 0.9998078912327243,
"price_usd_cents": 100,
"percent_change_24h": -0.02612099,
"market_cap_usd": 60411059379,
"volume_24h_usd": 10036602253,
"volume_change_24h": 6.5387,
"historical_prices": [
{
"date": "2025-03-18 11:00:00",
"price_usd": 0.9998556959666844,
"price_usd_cents": 100
},
{
"date": "2025-03-18 12:00:00",
"price_usd": 0.9998533259452913,
"price_usd_cents": 100
},
{
"date": "2025-03-18 13:00:00",
"price_usd": 0.9998012400259259,
"price_usd_cents": 100
},
.... and so on over the next 30 days...
],
"holders": 2994360
}
]
}

Try it out in our playground


📖 Learn more about Insight - it’s open source and ready to power your applications!

Joaquim Verges

We're constantly working to improve the developer and administrative experience of ecosystem wallets. Today, we're excited to announce two significant enhancements to Ecosystem Wallets, designed to give you more flexibility and control:

  1. Unified User Search: Find users faster, regardless of the address you have.
  2. Better Ecosystem Analytics: You can now see how each partner brings users to your ecosytem over time
  3. Collaborative Partner Management: Empower your team to manage ecosystem partners and rules directly.

Let's dive into the details:

1. Enhanced User Search: Find Users by Signer (EOA) or Smart Account Address

Managing users within your ecosystem just got easier. When you enable Account abstraction for you ecosystem, you can now query with users based on their originating Externally Owned Account (EOA) or their deployed Smart Account address. Previously, only EOA search was allowed.

What's New:

  • You can now search for specific users within the Ecosystem Wallets dashboard using either their Signer Address (EOA) or their specific Smart Account address associated with your project.

How to Use:

const userDetails = await getUser({
client,
walletAddress: "0x...", // can be either EOA or smart account address
});

You can also use the backend API directly.

2. Better Ecosystem Analytics

You can now view how much each partner is contributing to your ecosystem over time. Previously you could only see overall stats for the ecosystem.

What's New:

  • Your ecosystem dashboard now shows connection analytics broken down by partner. So you can measure the success of each partner in your ecosystem.

How to Use:

  • Simply navigate to your ecosystem page in the dashboard, and go to the analytics tab to see the new stats.

3. Team-Based Ecosystem Partner & Rule Management

Managing the partners and rules that govern your ecosystem can now be done by anyone in your team. Previously, these configurations might have been restricted to the team owner.

What's New:

  • Authorized team members within your thirdweb project now have the ability to add new Ecosystem Partners and edit the configurations and rules for existing partners directly from the dashboard.

How to Use:

  • Team members with appropriate permissions can access the Ecosystem Partner configuration section within the thirdweb dashboard to add or modify partner details and rules. (Ensure your project's team roles are configured accordingly in the thirdweb dashboard settings).

These updates are live now in your thirdweb dashboard and SDKs.

Happy building!

Arsenii

We’ve just completed a full rollout of metadata performance upgrades across all NFT-related API routes — and started extending the same treatment to ERC20s.

What’s New?

Optimized Metadata Across All NFT Routes

Every API call involving NFT metadata now performs a single, efficient data read per request — even for multichain queries. Whether you're pulling transfers, balances, or metadata directly, things just got a whole lot faster.

🚀 Performance Gains: NFT Metadata Latency Drops by 10x+

We’ve slashed the latency for NFT metadata queries — and the numbers speak for themselves. For example, data for GET /v1/nfts/:contract_address

MetricBeforeAfter🔻 Improvement
p50103 ms5.9 ms~17× faster
p75152 ms13.4 ms~11× faster
p90243 ms54.8 ms~4.4× faster
p95327 ms99.3 ms~3.3× faster
p99464 ms192.1 ms~2.4× faster
p99.9555 ms242.3 ms~2.3× faster
Max756 ms290.2 ms~2.6× faster
  • GET /v1/nfts and GET /v1/nfts/transfers also saw solid improvements in the ~1.1× to 2.9× range, with reduced tail latencies and smoother performance across the board.
  • Not just faster — more consistent, with reduced tail latencies and fewer spikes in production.
  • These performance gains are now live for all metadata queries hitting the NFT endpoints.

🧱 ERC20 Metadata Storage Begins

We’ve started persisting ERC20 metadata as well, laying the foundation for more efficient token balance queries with rich metadata. Stay tuned — optimized joined queries are on the way.

🔄 Unified NFT Balances Endpoint

We’ve consolidated NFT balance queries under a single route:
/v1/nfts/balance/{ownerAddress}
This new endpoint works across ERC721 and ERC1155 standards, supports multichain queries out of the box, and is the one we recommend going forward.

Heads up: the old ERC721/ERC1155-specific balance endpoints are still live, but are now officially deprecated.

This makes it easier than ever to query, display, and work with NFTs and tokens at scale — with less overhead and more consistency.

Toomas Oosalu

Insight adds two new endpoints - one to lookup a token based on symbols and one to retrieve an NFT collection's metadata.

Token Lookup

Search for tokens by their symbol across 6000+ tokens.

Symbols are not unique nor strictly curated however, so be careful with how you use them!

To fetch all tokens with symbol ETH on Ethereum and B3

const lookupTokens = async (symbol: string) => {
try {
const response = await fetch(
`https://insight.thirdweb.com/v1/tokens/lookup?symbol=${symbol}&chain=1`,
{
headers: {
"x-client-id": <THIRDWEB_CLIENT_ID>,
},
},
);
const res = await response.json();
return res.data;
} catch (error) {
console.error("Error:", error);
}
};
await lookupTokens("ETH")

Try it out in our playground

Collection Metadata

Get metadata about an NFT collection.

By including a include_stats=true query param, you can also get the following statistics about a collection:

  • owner_count - Amount of distinct addresses that hold the NFTs
  • mint_count - Amount of NFT tokens that have been minted
  • token_count - Amount of distinct token IDs that currently exist
  • total_quantity - Amount of tokens that currently exist
const getCollectionMetadata = async (contractAddress: string) => {
try {
const response = await fetch(
`https://1.insight.thirdweb.com/v1/nfts/collection/${contractAddress}?include_stats=true`,
{
headers: {
"x-client-id": <THIRDWEB_CLIENT_ID>,
},
},
);
const res = await response.json();
return res.data;
} catch (error) {
console.error("Error:", error);
}
};

Try it out in our playground


📖 Learn more about Insight - it’s open source and ready to power your applications!

Toomas Oosalu

We're excited to announce that thirdweb Insight has expanded its blockchain data querying capabilities to 84 chains, adding these 17 new chains:

What This Means For Developers
With these additions, you can now use all of Insight's powerful features across these new chains.

Try them out on the playground!

View All Supported Chains
For a complete list of supported chains and their respective chain IDs, check the thirdweb chainlist.


📖 Learn more about Insight - it’s open source and ready to power your applications!

Greg

We've added support for MAGIC on Treasure (61166) and GHO on Lens (232) to our Universal Bridge, bringing the total number of routes available to over 35,000. Check out the full API reference here to get started, or try it in the playground.

Arsenii

We’ve rolled out a series of performance upgrades across the board to make NFT metadata queries faster, smarter, and more reliable than ever.

What Changed?

Unified Fetching for NFT Data

  • NFT metadata, ownership info, and token data are now pulled in a single optimised query internally, reducing the number of round trips and improving latency consistency.
  • This makes NFT-related endpoints much more consistent at scale.

🧠 Smarter Metadata Handling

  • Metadata is now fetched on-demand only when needed, skipping unnecessary lookups for already known or irrelevant data.
  • We've introduced a system to automatically skip refetching metadata that’s deemed not worth roundtrips — improving efficiency without losing accuracy.

🪄 Parallel Processing & Query Optimizsation

  • Queries for metadata are now parallelised, making better use of compute resources.
  • Owner and balance aggregations are now handled more effectively, ensuring both speed and correctness in multi-owner or high-traffic collections.

🛠️ Critical Bugfix for NFT Transfers

  • Fixed a major issue where NFT transfers were duplicated across chains. Transfer data is now properly filtered per chain, ensuring clean and accurate results.
  • Transfer endpoints now properly correlated to chain identification to avoid any confusion in multichain contexts.

🔁 Same Gains for Fungible Tokens (ERC20)

All of these improvements won’t just apply to NFTs — we’re extending the same performance, consistency, and metadata logic enhancements to ERC20 tokens as well.


🔁 What's next? All of these improvements won’t just apply to NFTs — we’re extending the same performance, consistency, and metadata logic enhancements to ERC20 tokens as well.


💡 Result? lower and more predictable response times, better metadata hygiene, and fewer redundant operations — even across large multichain datasets.

Let us know what you think — or better yet, try it out and feel the speed.

Greg

Ever wondered if your token is supported on Universal Bridge? You can check all routes for a given token using the routes page. Search by chain ID, token address, token symbol, or name for all origin and destination routes. You can access the site at thirdweb.com/routes.

0:00
/0:17
Greg

You can use the transactions array returned by a Universal Bridge prepared quote to easily execute a full route from origin to destination. This pattern is now even easier with transaction action fields included to denote what each transaction does. The most important of these actions is the approval type, which represents a pre-assembled approval transaction. The approval will account for the sender's existing set allowance and what token is needed for the next step.

A quote response might look something like this:

{
id: "0xf04cca9127820d71ab8fe588ed9532d14d61ee883bfe29870873258646d8a03e",
originAmount: "1003793",
destinationAmount: "1000000",
blockNumber: "133945469",
timestamp: 1743489718527,
estimatedExecutionTimeMs: 62000,
intent: {
originChainId: 10,
originTokenAddress: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
destinationChainId: 8453,
destinationTokenAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
buyAmountWei: "1000000",
sender: "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709",
receiver: "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709",
},
transactions: [
{
chainId: 10,
to: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
data: "0x...",
type: "eip1559",
id: "0x723a578f5f04178f410da8e2029c138d4cad76900a9d9e650603fc64e56e113b",
action: "approval",
}, {
to: "0x81d57DD01a15BC1C19563693902df621500D4d2A",
value: "0",
data: "0x...",
chainId: 10,
from: "0x2a4f24F935Eb178e3e7BA9B53A5Ee6d8407C0709",
type: "eip1559",
action: "buy",
id: "0x3f0cb9f8a3e8649284d5c3f44648237f821c19de490fce9572509d79292867dc",
}
],
}

To execute this bridge with the TypeScript SDK, use sendAndConfirmTransaction to send each transaction, and wait for a successful Bridge.status response for each non-approval transaction:

import { Bridge, sendAndConfirmTransaction } from "thirdweb";
for (const tx of preparedBuy.transactions) {
const hash = await sendAndConfirmTransaction({
transaction: prepareTransaction(tx),
account, // Learn to generate a thirdweb account https://portal.thirdweb.com/connect/wallet/get-started
});
if (tx.action !== "approval") {
// Wait for Bridge.status to return "COMPLETED" status
}
}

It's that easy to implement bridging and swapping in your app. Want to get started? You can find the full API reference here.

Toomas Oosalu

Insight now supports webhooks so you can build pipelines and receive notifications when specific blockchain events or transactions occur!

What does this mean?

With the introduction of webhook support in Insight, you can now seamlessly integrate blockchain data into your applications or workflows. Webhooks allow you to automatically receive near real-time notifications whenever specific blockchain events or transactions occur, eliminating the need for constant polling of the blockchain.

What can I do with it?

  • Automate Workflows: Trigger actions in your applications or services when a specific blockchain event happens (e.g., a token transfer, contract interaction, or wallet activity).
  • Monitor Blockchain Events: Stay updated on relevant events without manually querying the blockchain.
  • Build Custom Pipelines: Use webhooks to feed blockchain data into analytics tools, databases, or other systems for further processing.
  • Filter Specific Data: Configure webhooks to only receive notifications for events or transactions that meet your specific criteria, such as a particular contract address or event type.

Can I receive decoded events and transactions?

Yes! Insight webhooks provide decoded data for events and transactions. This means you’ll receive human-readable payloads that include all relevant details, such as parameters and values associated with the event or transaction. This makes it easier to process and use the data directly in your applications without additional decoding steps.
To enable this, you have to define specific event signatures / function signatures and partial ABIs in the webhook filter configurations.

For more details on setting up and managing webhooks, visit the following resources:


📖 Learn more about Insight - it’s open source and ready to power your applications!

Yash Kumar
Samina Kabir

We’ve released the Agglayer Module, designed to enable secure and seamless cross-chain transfers of ERC-20 tokens using Agglayer, an interoperability protocol. Learn more about Agglayer.

Please note: This module is currently in beta while the Agglayer bridge is not live in implementation. This means deployments are limited to Sepolia and Cardona as it requires Ethereum as an L1 and zkEVM as L2.

🧩 What is it?

The Agglayer Module is a module contract that can be added to any ERC-20 modular contract built with thirdweb’s modular framework. It allows developers to bridge ERC-20 tokens across any EVM-compatible chain.

🌐 Why it matters

As the Ethereum ecosystem continues to grow with the introduction of more Layer 2 networks, fragmented liquidity and isolated user experiences have become major challenges. Without interoperability, assets are locked within specific chains, limiting usability and adoption.

The Agglayer Module helps address this by enabling interoperability at the contract level—allowing tokens to move freely across chains, reducing fragmentation, and improving the overall developer and user experience.

✅ Key Benefits

  • EVM-compatible – Works across all EVM chains
  • Modular and upgradeable – Can be installed or removed from any ERC-20 modular contract
  • Dashboard integration – Easily install through the thirdweb dashboard with no additional configuration
  • Cross-chain functionality – Mint tokens and send them to other chains seamlessly

⚠️ Requirements

  • The module currently only works with ERC-20 modular contracts
  • It must be installed on the contract in order to function

🛠 How to use it

  1. Use or deploy an ERC-20 modular contract
  2. Add the Agglayer Module through the thirdweb dashboard
  3. Mint and bridge tokens as needed

📚 View the full tutorial

As always, please don't hesitate to contact us for any questions or support.

Toomas Oosalu

Insight added support for querying a wallet's transactions (both inbound and outbound). Previously this had to be two separate queries, but can now be done by a single query.

Try it out in our playground

To fetch a wallet's transactions on Ethereum

const getWalletTransactions = async (walletAddress: string) => {
try {
const response = await fetch(
`https://1.insight.thirdweb.com/v1/wallets/${walletAddress}/transactions`,
{
headers: {
"x-client-id": <THIRDWEB_CLIENT_ID>,
},
},
);
const res = await response.json();
return res.data;
} catch (error) {
console.error("Error:", error);
}
};

📖 Learn more about Insight - it’s open source and ready to power your applications!

Greg

With v5.93.0 of the TypeScript SDK, we've added full beta functionality for thirdweb's new Universal Bridge. The bridge currently covers 50+ chains and over 30,000 routes.

  • Bridge.Buy - Specify an exact destination amount to receive
    • quote: Get estimates without a wallet connection
    • prepare: Get finalized quotes with transaction data
  • Bridge.Sell - Specify the exact origin amount to send
    • quote: Get estimates without a wallet connection
    • prepare: Get finalized quotes with transaction data

How to Send Transactions

When you call prepare, you might get multiple transactions back. You must send all transactions in order and sequentially for the full route to succeed. Before sending each transaction, call Bridge.status for the previous transaction until it returns COMPLETED. Do not simply wait for the transaction receipt, as this doesn't account for the destination chain transaction (if there is one).

The transactions returned do not include approvals. Send any necessary approvals before their corresponding transactions.

Route Discovery & Transaction Tracking

  • Bridge.routes - Advanced function to discover and filter available bridge routes
    • Filter by token address, chain ID, or both
    • Full pagination support with customizable limit and offset
  • Bridge.status - Comprehensive transaction status tracking
    • Clear status indicators: "COMPLETED", "PENDING", "FAILED", or "NOT_FOUND"
    • Detailed transaction reporting including origin and destination amounts and chains

Types

  • Standardized error handling with descriptive, formatted error messages
  • Four underlying types are exported for use with the bridging functions:
    • Route: Defines bridge routes between chains and tokens
    • Status: Represents bridge transaction status data
    • Quote: Contains detailed bridge transaction quote information
    • PreparedQuote: Extends Quote with complete transaction data

Implementation Examples

Bridge.Buy Usage Example

import { Bridge, toWei, NATIVE_TOKEN_ADDRESS } from "thirdweb";
// First, get a quote to see approximately how much you'll pay
const buyQuote = await Bridge.Buy.quote({
originChainId: 1, // Ethereum
originTokenAddress: NATIVE_TOKEN_ADDRESS,
destinationChainId: 10, // Optimism
destinationTokenAddress: NATIVE_TOKEN_ADDRESS,
buyAmountWei: toWei("0.01"), // I want to receive 0.01 ETH on Optimism
client: thirdwebClient,
});
console.log(
`To get ${buyQuote.destinationAmount} wei on destination chain, you need to pay ${buyQuote.originAmount} wei`,
);
// When ready to execute, prepare the transaction
const preparedBuy = await Bridge.Buy.prepare({
originChainId: 1,
originTokenAddress: NATIVE_TOKEN_ADDRESS,
destinationChainId: 10,
destinationTokenAddress: NATIVE_TOKEN_ADDRESS,
buyAmountWei: toWei("0.01"),
sender: "0x...", // Your wallet address
receiver: "0x...", // Recipient address (can be the same as sender)
client: thirdwebClient,
});
// The prepared quote contains the transactions you need to execute
console.log(
`Transactions to execute: ${preparedBuy.transactions.length}`,
);

Bridge.Sell Usage Example

import { Bridge, toWei } from "thirdweb";
// First, get a quote to see approximately how much you'll receive
const sellQuote = await Bridge.Sell.quote({
originChainId: 1, // Ethereum
originTokenAddress: NATIVE_TOKEN_ADDRESS,
destinationChainId: 10, // Optimism
destinationTokenAddress: NATIVE_TOKEN_ADDRESS,
sellAmountWei: toWei("0.01"), // I want to sell 0.01 ETH from Ethereum
client: thirdwebClient,
});
console.log(
`If you send ${sellQuote.originAmount} wei, you'll receive approximately ${sellQuote.destinationAmount} wei`,
);
// When ready to execute, prepare the transaction
const preparedSell = await Bridge.Sell.prepare({
originChainId: 1,
originTokenAddress: NATIVE_TOKEN_ADDRESS,
destinationChainId: 10,
destinationTokenAddress: NATIVE_TOKEN_ADDRESS,
sellAmountWei: toWei("0.01"),
sender: "0x...", // Your wallet address
receiver: "0x...", // Recipient address (can be the same as sender)
client: thirdwebClient,
});
// Execute the transactions in sequence
for (const tx of preparedSell.transactions) {
// Send the transaction using your wallet
// Wait for it to be mined
}

Route Discovery Example

import { Bridge, NATIVE_TOKEN_ADDRESS } from "thirdweb";
// Get all available routes
const allRoutes = await Bridge.routes({
client: thirdwebClient,
});
// Filter routes for a specific token or chain
const filteredRoutes = await Bridge.routes({
originChainId: 1, // From Ethereum
originTokenAddress: NATIVE_TOKEN_ADDRESS,
destinationChainId: 10, // To Optimism
client: thirdwebClient,
});
// Paginate through routes
const paginatedRoutes = await Bridge.routes({
limit: 10,
offset: 0,
client: thirdwebClient,
});

Transaction Status Monitoring Example

import { Bridge } from "thirdweb";
// Check the status of a bridge transaction
const bridgeStatus = await Bridge.status({
transactionHash:
"0xe199ef82a0b6215221536e18ec512813c1aa10b4f5ed0d4dfdfcd703578da56d",
chainId: 8453, // The chain ID where the transaction was initiated
client: thirdwebClient,
});
// The status will be one of: "COMPLETED", "PENDING", "FAILED", or "NOT_FOUND"
if (bridgeStatus.status === "completed") {
console.log(`
Bridge completed!
Sent: ${bridgeStatus.originAmount} wei on chain ${bridgeStatus.originChainId}
Received: ${bridgeStatus.destinationAmount} wei on chain ${bridgeStatus.destinationChainId}
`);
} else if (bridgeStatus.status === "pending") {
console.log("Bridge transaction is still pending...");
} else {
console.log("Bridge transaction failed");
}

Error Handling Implementation

try {
await Bridge.Buy.quote({
// ...params
});
} catch (error) {
// Errors will have the format: "ErrorCode | Error message details"
console.error(error.message); // e.g. "AmountTooHigh | The provided amount is too high for the requested route."
}

Module Integration

The Bridge module is accessible as a top-level export:

import { Bridge } from "thirdweb";

Use Bridge.Buy, Bridge.Sell, Bridge.routes, and Bridge.status to access the corresponding functionality.

Or, import the functions directly from the module:

import { Buy, Sell, routes, status } from "thirdweb/bridge";
Firekeeper

We've built Universal Bridge to allow your users to use any asset on any chain, and it's ready for you to try.

This integration simplifies onchain asset trading, and we've added extensions in .NET to integrate with any IThirdwebWallet nicely.

Core APIs

The design is akin to letting us know what your intent is.

  • Buy: "I want to buy x USDC on y Chain using z Token"
  • Sell: "I want to sell x USDC on y Chain for z Token"
  • Transfer: "Just transfer all my money to vitalik"

We will return the transactions needed to achieve whatever you desire.
You may then handle execution yourself or use our extensions.

Instantiation

using Thirdweb.Bridge;
// Create a ThirdwebBridge instance
var bridge = await ThirdwebBridge.Create(client);

Buy - Get a quote for buying a specific amount of tokens

var buyQuote = await bridge.Buy_Quote(
originChainId: 1,
originTokenAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC on Ethereum
destinationChainId: 324,
destinationTokenAddress: Constants.NATIVE_TOKEN_ADDRESS, // ETH on zkSync
buyAmountWei: BigInteger.Parse("0.1".ToWei())
);
Console.WriteLine($"Buy quote: {JsonConvert.SerializeObject(buyQuote, Formatting.Indented)}");

Buy - Get an executable set of transactions (alongside a quote) for buying a specific amount of tokens

var preparedBuy = await bridge.Buy_Prepare(
originChainId: 1,
originTokenAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC on Ethereum
destinationChainId: 324,
destinationTokenAddress: Constants.NATIVE_TOKEN_ADDRESS, // ETH on zkSync
buyAmountWei: BigInteger.Parse("0.1".ToWei()),
sender: await Utils.GetAddressFromENS(client, "vitalik.eth"),
receiver: await myWallet.GetAddress()
);
Console.WriteLine($"Prepared Buy contains {preparedBuy.Transactions.Count} transaction(s)!");

Sell - Get a quote for selling a specific amount of tokens

var sellQuote = await bridge.Sell_Quote(
originChainId: 324,
originTokenAddress: Constants.NATIVE_TOKEN_ADDRESS, // ETH on zkSync
destinationChainId: 1,
destinationTokenAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC on Ethereum
sellAmountWei: BigInteger.Parse("0.1".ToWei())
);
Console.WriteLine($"Sell quote: {JsonConvert.SerializeObject(sellQuote, Formatting.Indented)}");

Sell - Get an executable set of transactions (alongside a quote) for selling a specific amount of tokens

var preparedSell = await bridge.Sell_Prepare(
originChainId: 324,
originTokenAddress: Constants.NATIVE_TOKEN_ADDRESS, // ETH on zkSync
destinationChainId: 1,
destinationTokenAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC on Ethereum
sellAmountWei: BigInteger.Parse("0.1".ToWei()),
sender: await Utils.GetAddressFromENS(client, "vitalik.eth"),
receiver: await myWallet.GetAddress()
);
Console.WriteLine($"Prepared Sell contains {preparedSell.Transactions.Count} transaction(s)!");

Transfer - Get an executable transaction for transferring a specific amount of tokens

Why not just transfer with the SDK? Stay tuned for webhooks, think direct payments!

var preparedTransfer = await bridge.Transfer_Prepare(
chainId: 137,
tokenAddress: Constants.NATIVE_TOKEN_ADDRESS, // ETH on zkSync
transferAmountWei: BigInteger.Parse("0.1".ToWei()),
sender: await Utils.GetAddressFromENS(client, "vitalik.eth"),
receiver: await myWallet.GetAddress()
);
Console.WriteLine($"Prepared Transfer: {JsonConvert.SerializeObject(preparedTransfer, Formatting.Indented)}");

Manual Execution

This is not production code, we're just showcasing some of the APIs that would help you execute and poll status here.

// You may use our extensions to execute yourself...
var myTx = await preparedTransfer.Transactions[0].ToThirdwebTransaction(myWallet);
var myHash = await ThirdwebTransaction.Send(myTx);
// ...and poll for the status...
var status = await bridge.Status(transactionHash: myHash, chainId: 1);
var isComplete = status.StatusType == StatusType.COMPLETED;
Console.WriteLine($"Status: {JsonConvert.SerializeObject(status, Formatting.Indented)}");
// Or use our Execute extensions directly to handle everything for you!

Managed Execution

The SDK comes with some extensions that you'll see on a lot of ThirdwebBridge objects, and the main one is Execute.

// Execute a prepared Buy
var buyResult = await bridge.Execute(myWallet, preparedBuy);
var buyHashes = buyResult.Select(receipt => receipt.TransactionHash).ToList();
Console.WriteLine($"Buy hashes: {JsonConvert.SerializeObject(buyHashes, Formatting.Indented)}");
// Execute a prepared Sell
var sellResult = await bridge.Execute(myWallet, preparedSell);
var sellHashes = sellResult.Select(receipt => receipt.TransactionHash).ToList();
Console.WriteLine($"Sell hashes: {JsonConvert.SerializeObject(sellHashes, Formatting.Indented)}");
// Execute a prepared Transfer
var transferResult = await bridge.Execute(myWallet, preparedTransfer);
var transferHashes = transferResult.Select(receipt => receipt.TransactionHash).ToList();
Console.WriteLine($"Transfer hashes: {JsonConvert.SerializeObject(transferHashes, Formatting.Indented)}");

Full Bridge .NET Reference

Links

.NET Release | NuGet Release | Unity Release
Documentation | Support

Greg

We've built Universal Bridge to allow your users to use any asset on any chain, and it's ready for you to try. If you're interested in joining the private beta for Universal Bridge, complete this form (or reach out to anyone from the thirdweb team).

Who's It For?

Do you need to accept fiat and crypto payments in your app? Are you struggling to find reliable onchain liquidity for swaps? Are you tired of implementing bespoke bridges for multiple chains? Universal Bridge is for you.

What Is It?

Bridging, swapping, and accepting payments each bring their own challenges. The existing options are unreliable, complicated, and reliant on poor design choices. Universal Bridge is the easiest way to route assets in your app. Swap tokens, bridge between chains, onramp assets, accept onchain payments, and more all with a simple, unified API.

We already support 30,000+ routes across 50+ chains and are adding more every day. We're running detailed routing and reliability tests across all of them to guarantee a great experience for users.

How's It Work?

Universal Bridge uses a combination of existing protocols and onramps with thirdweb's own onchain and off-chain infrastructure for maximum coverage and reliability. The result is a "best case scenario" for buying, selling, and transferring assets between any EVM chain.

How Can I Try It?

Our Private Beta starts today, and your app can be one of the first to use it. Just complete this form or reach out to anyone on the team to get access. Or, try the playground widget here.

Toomas Oosalu

We're excited to announce that thirdweb Insight has expanded its blockchain data querying capabilities to 67 chains, including these 7 new chains:

What This Means For Developers
With these additions, you can now use all of Insight's powerful features across these new chains.

Try them out on the playground!

View All Supported Chains
For a complete list of supported chains and their respective chain IDs, check the thirdweb chainlist.


📖 Learn more about Insight - it’s open source and ready to power your applications!

Arsenii

We've revamped our metadata storage and refresh mechanisms to provide a more reliable, scalable, and efficient experience when working with NFT collections metadata through Insight!

What’s New?

More Reliable Metadata Storage

  • Replaced the previous caching approach with a more permanent storage solution, ensuring faster retrieval and better consistency across requests.
  • Metadata is now stored and accessed in a way that eliminates potential inconsistencies, making it the single source of truth for retrieval.

Explicit Force Refresh Endpoints

To give developers more control, we’ve introduced dedicated API endpoints for refreshing metadata on demand:

  • Collection Metadata Refresh
    • GET v1/nfts/metadata/refresh/:contract_address
  • Token Metadata Refresh
    • GET v1/nfts/metadata/refresh/:contract_address/:token_id
  • Both endpoints fully support multichain operations via chain query parameters.
  • Refreshing token metadata also ensures collection-level metadata stays up to date.

Why This Matters

Improved Data Consistency – Eliminates mismatches between different layers, ensuring metadata stays accurate.
Simplified Architecture – No more juggling between temporary and permanent storage solutions.
Better Scalability – Optimized for large-scale metadata operations, enabling more efficient handling of growing datasets.
Multichain-Ready – Works seamlessly across chains, just like you’re used to.

What’s Next?

We’re actively working on further performance optimizations by consolidating multiple separate queries into more efficient, single-fetch operations. This will unlock even faster metadata retrieval without sacrificing accuracy. Stay tuned with more updates to thirdweb Insight! 🚀

Jake Loo

This new update includes several changes to the tools in thirdweb MCP (Model Context Protocol) Server – improving overall accuracy in tool selection and speed performance for some onchain queries.

Improvement and Fixes

  • Improved onchain query performance and tool selection
  • Fixed Engine service auth requests that were not configured properly
  • Updated thirdweb-ai to v0.1.4 (see full changelog)

A few prompts and guide to try out:

  • What is the price of ETH? or What is the price of UNI token?
  • Show me the recent events for 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 on Ethereum (1)
  • What are the recent transactions from 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 on Base (8453)?
  • What is the ABI of 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 on Ethereum (1)
  • Transfer 0.00001 ETH to 0xEb0effdFB4dC5b3d5d3aC6ce29F3ED213E95d675 on Sepolia (11155111)

Always provide a fully valid wallet address, and include chain id along with the chain name.

Upgrade Guide

# Using pipx
pipx upgrade thirdweb-mcp
# Using uvx
uvx --upgrade thirdweb-mcp
Jake Loo

This new update focuses on improving the accuracy of tool selection by consolidating tools, picking better default values, and giving developers the ability to override tool description prompts.

New Features

  • Override service tools' description prompts
from thirdweb_ai import Insight
insight = Insight(secret_key=...)
# using default tool description
tools = [insight.get_all_transactions()]
# using custom tool description
tools = [insight.get_all_transactions(description="Call this to fetch transactions for account")]

Improvements

  • Insight always requests with most recent and decoded data
  • Insight performance improvement by using the correct sort key
  • Updated resolve tool prompt to provide a more accurate description
  • Reduced number of tools with similar functionality:
    • Merged get_contract_abi into get_contract_metadata
    • Merged get_contract_events_by_signature into get_all_events

Bug Fixes

  • Fixed invalid auth for Engine requests due to headers not being set correctly
  • Fixed some invalid paths or bodies for Engine and Insight tools
  • Fixed improper schema error from OpenAI Agents adapter when a tool schema contains anyOf, oneOf, or allOf

Upgrade Guide

# pip
pip install thirdweb-ai --upgrade
# poetry
poetry update thirdweb-ai
# uv
uv add thirweb-ai --upgrade
Joaquim Verges

We just released a new live playground that lets you customize and interact with the Universal Bridge via the prebuilt UI component.

Try it out at: https://playground.thirdweb.com/connect/pay

The playground lets you customize:

  • Payment mode: fund wallets, direct payments or onchain transactions
  • Price, chain and token information
  • Payment methods
  • Metadata
  • Theme
  • Gas sponsorship

Every customization shows you the changes in a live preview, as well as the corresponding code to copy paste into your projects.

Happy building! 🛠️

Jake Loo

We're excited to announce the first release of thirdweb ai, a powerful Python library (TypeScript coming soon) that enables AI agents to interact with any EVM chains autonomously using thirdweb. This is a significant step forward in our mission to make web3 more accessible and empower developers to build the next generation of AI-powered onchain applications.

Why thirdweb ai?

As Large Language Models (LLMs) and AI Agents continue to evolve as transformative technologies, we recognized the need for these systems to interact with blockchain networks autonomously. We believe that giving AI agents the ability to perform onchain actions based on real-time data will unlock new possibilities.

What Can You Build?

With thirdweb ai, you can create AI agents that:

  • Manage wallets and transactions securely using Engine
  • Retrieve and analyze on-chain data in real-time using Insight
  • Delegate complex onchain executions to Nebula agents

All of this functionality integrates smoothly with the AI agent framework of your choice, including OpenAI Agents, LangChain, AgentKit, GOAT, AutoGen, LlamaIndex, and many more.

Getting Started

Installation

Install the core package with all adapters:

pip install "thirdweb-ai[all]"

Or choose specific framework adapters:

# For OpenAI Agents
pip install "thirdweb-ai[openai]"
# For LangChain
pip install "thirdweb-ai[langchain]"
# For AutoGen
pip install "thirdweb-ai[autogen]"
# For LlamaIndex
pip install "thirdweb-ai[llama-index]"
# For additional frameworks
pip install "thirdweb-ai[goat]"
pip install "thirdweb-ai[agentkit]"
pip install "thirdweb-ai[mcp]"
pip install "thirdweb-ai[smolagents]"
pip install "thirdweb-ai[pydantic-ai]"

See here for the full list of supported framework and installation guides.

Basic Usage

from thirdweb_ai import Engine, Insight, Nebula, Tool
# Initialize thirdweb services
insight = Insight(secret_key=...)
nebula = Nebula(secret_key=...)
engine = Engine(secret_key=..., engine_url=..., engine_auth_jwt=...)
# Get available tools
tools = [
# Access powerful web3 tools
# Optionally, select tool from each services
*insight.get_tools(), # Giving agents real-time on-chain data access
*engine.get_tools(), # Wallet and transaction management
*nebula.get_tools(), # Agent for complex blockchain tasks
]

Framework Integration Examples

OpenAI Agents

from thirdweb_ai import Tool
from thirdweb_ai.adapters.openai import get_openai_tools
# Initialize your thirdweb tools
tools = [...] # List of thirdweb tools
# Convert to OpenAI tools
openai_tools = get_openai_tools(tools)
# Use in your OpenAI Agent
agent = Agent("thirdweb_agent", tools=openai_tools, ...)

LangChain

from thirdweb_ai import Tool
from thirdweb_ai.adapters.langchain import get_langchain_tools
# Initialize your thirdweb tools
tools = [...] # List of thirdweb tools
# Convert to LangChain tools
langchain_tools = get_langchain_tools(tools)
# Use in your LangChain agent
agent = create_tool_calling_agent(tools=langchain_tools, ...)

Developer Resources

LLM Integration

When building applications that integrate LLMs with thirdweb's blockchain capabilities, you can enhance your results by including thirdweb context files:

Learn More

Get started with thirdweb-ai today and join us in building the future of onchain AI agents!

Joaquim Verges

We just shipped a big upgrade to partner management for ecosystems. You can now specify what type of signatures are permitted for each partner, as well as granular controls on what exactly can be signed. As an ecosystem owner, this means you have full control of what each partner is able to do with your user's ecosystem wallets, like restricting to particular assets or actions.

In your ecosystem dashboard, you'll find a new option for "Access Control" when you create or edit an ecosystem partner. You can setup these signing restrictions in 2 ways: your own server verification, or built in rules.

Server verification

This is the most flexible and powerful option - every signature request will flow through your own server and you get to perform your own logic for allowing or disallowing a particular signature.

server verifier setup

The response from your sever should just be a simple JSON body with the following format.

{
isAllowed: boolean;
reason?: string;
}

Built-in rules

You can also set your rules directly in the dashboard. These include what signature types you would like to allow, and granular permissions per signature type, like the chain, contract addresses or function selectors that are allowed to be called.

For ecosystems that use smart accounts, since those require personal_sign signatures, we've added a user operation filter that lets you control which smart account operations are allowed to be signed by the ecosystem wallets.

These controls are low level and powerful, letting you tightly control what can and cannot be done with wallets on a per-partner basis.

We're continuously improving this UI to make it easier for ecosystem owners to setup these rules. Your feedback is appreciated and help us make this product better for everyone!

Vernon Johnson

We're excited to announce improvements to our Token and NFT APIs in Insight. We've recently added support to get all token transfers by owner, wallet, and token contracts. We've also included in this release major performance improvements to existing NFT endpoints.

The following endpoints are now available to use.

Get NFT Transfers by Wallet

GET https://{chain}.insight.thirdweb.com/v1/nfts/transfers?owner_address={owner_address}

Retrieve all NFT transfers by wallet address. Supports ERC1155 and ERC721.

Get Transfers by Contract

GET https://{chain}.insight.thirdweb.com/v1/tokens/transfers/{contract_address}

Get all token transfers for a contract address. Supports ERC20, ERC1155, and ERC721.

Get Transfers by Wallet

GET https://{chain}.insight.thirdweb.com/v1/tokens/transfers?owner_address={owner_address}

View all token transfers for a wallet address. Supports ERC20, ERC1155, and ERC721.

Get Transfers by Transaction

GET https://{chain}.insight.thirdweb.com/v1/tokens/transfers/transaction/{transaction_hash}

Get all token transfers in a transaction. Supports ERC20, ERC1155, and ERC721.

Resources

Jonas Daniels

With the latest dashboard update, users can now view their invoices directly in thirdweb for easy management.

  • Invoice history, amount, and details are available at a glance.
  • Download the full invoice pdf document to see breakdown of charges by usage and plan.

To view your invoices, login to thirdweb and navigate to Settings > Invoices.

For any feedback or support inquiries, please visit our support site.

Arsenii

We’re pleased to announce a more robust contract verification process, now featuring a dedicated Etherscan verification status check and final result reporting. This means you can confidently verify your contracts—proxy or otherwise—knowing you’ll receive a much more clear outcome every time.

Added Verification Status Check and Final Result Return

  • Introduced extra logic to check for verification status on Etherscan-like explorers, which polls for verification completion.
    • This now returns the final verification result (e.g., "success," "failure," or "already verified") instead of just the receipt GUID.

Fixed Constructor Parameter Fetching for Proxy Contracts

  • Fixed some corner cases where we should use the implementation address when verifying proxied contracts with constructor parameters.

We hope this streamlined verification workflow reduces the friction of contract verifications and helps you focus on delivering great applications. Happy building!

Nischit Pradhan

We're excited to announce an important update to our RPC edge infrastructure at thirdweb. This enhancement is designed to improve performance and reduce costs for our users.

🚀 What’s New?

  • Response Compression at RPC Edge:
    We’ve enabled response compression, meaning our RPC endpoints now deliver compressed responses to reduce data size and speed up transmission.
  • Cost Reduction for Users:
    With smaller payloads, users can enjoy reduced bandwidth usage and lower overall costs when interacting with our servers.
  • New Request Requirement:
    To take full advantage of this update, you need to add an Accept-Encoding header to your requests. This tells our servers that your client can handle compressed responses.

🛠️ How to Use the New Feature

Simply include the Accept-Encoding header in your API requests. For instance, if you're calling the eth_blockNumbermethod using our RPC endpoint, you can use the following curl example:

curl -H "Content-Type: application/json" \
-H "Accept-Encoding: gzip" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
https://1.rpc.thirdweb.com

In this example:

  • The Accept-Encoding: gzip header signals that your client accepts gzip-compressed responses.
  • The JSON payload makes a call to eth_blockNumber to retrieve the latest block number.

🎉 Conclusion

This update is part of our continuous effort to enhance performance and efficiency. We’re committed to providing you with the best tools and infrastructure for your development needs. If you have any feedback or questions, please don’t hesitate to reach out.

Toomas Oosalu

We're excited to announce that thirdweb Insight has expanded its blockchain data querying capabilities to 61 chains, including these 19 new chains:

What This Means For Developers
With these additions, you can now use all of Insight's powerful features across these new chains.

Try them out on the playground!

View All Supported Chains
For a complete list of supported chains and their respective chain IDs, check the thirdweb chainlist.


📖 Learn more about Insight - it’s open source and ready to power your applications!

Manan Tank

You can now view the list all sponsored transactions across in a team by going to your Team > Usage Page in thirdweb dashboard

You can also view this table in your Team > Project > Connect > Account Abstraction > Analytics page to see only sponsored transactions for the selected project

Greg

The thirdweb SDK comes with built-in tree-shaking, meaning your application only keeps what it uses from the SDK. However, we still like to keep the overall package size as small as possible for convenience while you're running your application in development. With version 5.92.0 we've reduced the package install size by more than 25%, from 199 MB to 144 MB. See the latest here.

MediaRenderer Changes

Unfortunately, this means we've had to remove support for 3D models in the media renderer. You can still display 3D model NFTs in your application using our IPFS resolvers and Three.js or a similar library.

Vernon Johnson

We're excited to announce the release of additional NFT API endpoints to Insight. These endpoints provide comprehensive APIs for accessing NFT metadata, transfers, ownership information, and more. The NFT API provides a great alternative for developers looking to migrate from SimpleHash, which is expected to shutdown on March 27th.

The endpoints below are now available to use.

NFT Tokens API

Get NFTs by Contract

GET https://{chain}.insight.thirdweb.com/v1/nfts/{contract_address}

Retrieve all NFTs from a specific contract address.

Get NFT by Token ID

GET https://{chain}.insight.thirdweb.com/v1/nfts/{contract_address}/{token_id}

Fetch data for a specific NFT using its contract address and token ID.

Get NFTs by Owner

GET https://{chain}.insight.thirdweb.com/v1/nfts?owner_address={owner_address}

List all NFTs owned by a specific wallet address across all contracts.

NFT Transfers API

Get NFT Transfers by Contract

GET https://{chain}.insight.thirdweb.com/v1/nfts/transfers/{contract_address}?metadata=true

Track all transfer events for a specific NFT contract with optional metadata.

Get NFT Transfers by Token

GET https://{chain}.insight.thirdweb.com/v1/nfts/transfers/{contract_address}/{token_id}?metadata=true

View the complete transfer history for a specific NFT token with optional metadata.

Get NFT Transfers by Transaction

GET https://{chain}.insight.thirdweb.com/v1/nfts/transfers/transaction/{transaction_hash}?metadata=true

Retrieve all NFT transfers that occurred within a specific transaction with optional metadata.

NFT Ownership API

Get NFT Owners by Contract

GET https://{chain}.insight.thirdweb.com/v1/nfts/owners/{contract_address}

List all current owners of NFTs from a specific contract.

Get NFT Owners by Token

GET https://{chain}.insight.thirdweb.com/v1/nfts/owners/{contract_address}/{token_id}

Identify the current owners of a specific NFT token.

Resources

Jake Loo

We’re excited to introduce significant upgrades Nebula's transaction execution. Our latest model, t0-003, is more capable, accurate, and intelligent—enabling seamless execution of complex, multi-step prompts.

With expanded support for bridging, swapping, and multi-transaction workflows, developers can now perform actions like retrieving balances, executing transfers across chains, and handling approvals in a single streamlined process.

Improvements

  • New model: t0-003 — more capable, higher accuracy and smarter
    • Supports complex prompts that involve multi-step instructions
    • For example:
      get the usdc balance for thirdweb.eth on ethereum, then transfer that amount to jakeloo.eth on base
  • Bridging and swapping with more chains and more token routes supported
    • Supports multiple transactions, for example, approve and transfer. Wallets will need to execute the transactions in order.
    • The chat completion API may consist of multiple unsigned_transaction in the actions

Nebula is currently in Alpha for a select number of developers. For access to the product, please sign up on the Nebula waitlist.

For any feedback or support inquiries, please visit our support site.

Toomas Oosalu

Querying token prices in USD is now supported by Insight API!

Try it out in our playground

To fetch a token's price by its contract address

(0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee is used for native tokens)

const getPrice = async () => {
try {
const response = await fetch(
"https://1.insight.thirdweb.com/v1/tokens/price?address=0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
{
headers: {
"x-client-id": <THIRDWEB_CLIENT_ID>,
},
},
);
const priceData = await response.json();
return priceData.data;
} catch (error) {
console.error("Error:", error);
}
};

Response

[
{
chain_id: 1,
address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
symbol: 'ETH',
price_usd: 2192.917084798869,
price_usd_cents: 219291
}
]

You can optionally define a timestamp and the API will return the closest data it has to that timestamp.

const getPrice = async () => {
try {
const ts = Date.now() - 3 * 60 * 60 * 1000; // 3 hours ago
const response = await fetch(
`https://1.insight.thirdweb.com/v1/tokens/price?address=0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&timestamp=${ts}`,
{
headers: {
"x-client-id": <THIRDWEB_CLIENT_ID>,
},
},
);
const priceData = await response.json();
return priceData.data;
} catch (error) {
console.error("Error:", error);
}
};

To fetch token prices by symbol

const getPriceBySymbol = async () => {
try {
const response = await fetch(
"https://1.insight.thirdweb.com/v1/tokens/price?symbol=ETH",
{
headers: {
"x-client-id": <THIRDWEB_CLIENT_ID>,
},
},
);
const priceData = await response.json();
return priceData.data;
} catch (error) {
console.error("Error:", error);
}
};

Note that there can be multiple tokens with the same symbol


We support more than 6000 tokens currently and keep adding more.

We also provide an endpoint to fetch the list of supported tokens for each chain.


📖 Learn more about Insight - it’s open source and ready to power your applications!

Toomas Oosalu

Insight API will deprecate all camelCase fields from responses and remove them by 30th of March 2025. Every field that was previously in camelCase has a duplicate field in snake_case for the time being, allowing users to migrate their response handling.

List of affected fields:

  • decodedData
    • New name: decoded
    • Affected endpoints
      • v1/transactions (in case of decode=true query param)
      • v1/transactions/:contractAddress (in case of decode=true query param)
      • v1/transactions/:contractAddress/:signature
      • v1/events (in case of decode=true query param)
      • v1/events/:contractAddress (in case of decode=true query param)
      • v1/events/:contractAddress/:signature
  • decodedData.indexedParams and decoded.indexedParams
    • New name: indexed_params
    • Affected endpoints
      • v1/events (in case of decode=true query param)
      • v1/events/:contractAddress (in case of decode=true query param)
      • v1/events/:contractAddress/:signature
  • decodedData.nonIndexedParams and decoded.nonIndexedParams
    • New name: non_indexed_params
    • Affected endpoints
      • v1/events (in case of decode=true query param)
      • v1/events/:contractAddress (in case of decode=true query param)
      • v1/events/:contractAddress/:signature
  • chainId
    • New name: chain_id
    • Affected endpoints
      • v1/tokens/erc20/:ownerAddress
      • v1/tokens/erc721/:ownerAddress
      • v1/tokens/erc1155/:ownerAddress
  • tokenAddress
    • New name: token_address
    • Affected endpoints
      • v1/tokens/erc20/:ownerAddress
      • v1/tokens/erc721/:ownerAddress
      • v1/tokens/erc1155/:ownerAddress
  • tokenId
    • New name: token_id
    • Affected endpoints
      • v1/tokens/erc721/:ownerAddress
      • v1/tokens/erc1155/:ownerAddress

Example of a decoded data response

// rest of response...
"decoded": {
"name": "Transfer",
"signature": "Transfer(address,address,uint256)",
// will be deprecated
"indexedParams": {
"from": "0x0000000000000000000000000000000000000000",
"to": "0x321b7ff75154472b18edb199033ff4d116f340ff"
},
"indexed_params": {
"from": "0x0000000000000000000000000000000000000000",
"to": "0x321b7ff75154472b18edb199033ff4d116f340ff"
},
// will be deprecated
"nonIndexedParams": {
"amount": 4843303142399797056
},
"non_indexed_params": {
"amount": 4843303142399797056
}
},
// rest of response...

It should be noted that the properties in indexed_params and non_indexed_params could be any format, because they are based on how the smart contract was programmed.

Example of a token response

// rest of response...
{
// will be deprecated
"chainId": 1,
"chain_id": 1,
// will be deprecated
"tokenAddress": "0xca8098ab4503aee15b3291d22c0852518d04da63",
"token_address": "0xca8098ab4503aee15b3291d22c0852518d04da63",
// will be deprecated
"tokenId": "78",
"token_id": "78",
"balance": "1"
},
// rest of response...

📖 Learn more about Insight - it’s open source and ready to power your applications!

Arsenii

We’re excited to share that Thirdweb now better aligns with Etherscan’s latest V2 API. If you regularly need to have your contracts verified on Etherscan-like explorers, this change means a more streamlined, less error-prone experience - so you can spend more time shipping, and less time wrestling with parameters. One click on the Thirdweb dashboard is all it takes!

What’s New

  • V2 API Readiness: Our system automatically targets Etherscan V2 endpoints for the correct chain, minimising manual setup and reducing the possibility of misconfiguration.
  • Future-Proofing: This approach lays the groundwork for supporting additional block explorer APIs with minimal friction, ensuring that Thirdweb utilities remains flexible and up-to-date.

Why It Matters

The goal behind these changes is to make verifying your smart contracts as hassle-free as possible. By cutting down on repetitive parameters and streamlining the integration with Etherscan V2, we’ve drastically reduced the chance of errors. Ultimately, we want you to focus on the things that matter—innovating, building, and delivering great blockchain experiences.

We’re always improving our developer experience, so if you have any questions or feedback, reach out to us. In the meantime, we hope you enjoy the smoother, more robust contract verification process!

Amine Afia
Vernon Johnson

Insight now serves NFT assets through the Thirdweb Gateway, improving retrieval times by caching the content on a globally serving data on edge. Instead of referencing IPFS or Arweave links, insight automatically resolves them to edge-friendly endpoints, so metadata no longer displays IPFS URLs. This deployment works seamlessly with the existing NFT schema without requiring any additional steps. It enhances performance, reduces latency, and ensures consistent, high-speed access to decentralized assets.

Example:

before:

"image_url": "ipfs://QmY1vKaHd3UvbzStxgndUMH3FzprK7jTJcAvgbHbcLsZXv/107.png"

After

"image_url": "https://5c9e93b8acbb5d972c1841911a7dce5f.ipfscdn.io/ipfs/QmY1vKaHd3UvbzStxgndUMH3FzprK7jTJcAvgbHbcLsZXv/107.png"

This means you can use the image directly in your frontend, the snippet bellow would render the NFT image from thirdweb gateway.

<img src="https://5c9e93b8acbb5d972c1841911a7dce5f.ipfscdn.io/ipfs/QmY1vKaHd3UvbzStxgndUMH3FzprK7jTJcAvgbHbcLsZXv/107.png" alt="NFT Image" />
NFT Image
Jake Loo
Samina Kabir

Effective Date: March 3, 2025, at 3:00 PM PST

Announcing some important changes to our mint fee process that further standardize our fee structure for all new contract deployments. We are introducing a 1% protocol fee applied to all contracts, and adjusting the convenience fee to 1.5% from previous 2.5%.

We believe this change strikes the right balance between a standardized protocol fee and the flexibility for custom fee settings, making fee management easier and more transparent for everyone.

Please note this change does not effect already deployed contracts.

What’s Changing?

  • Fixed protocol fee:
    All new deployments now include a non-overridable 1% protocol fee. This fee is implemented into the contract and will always apply if deployed through SDK, dashboard, or third-party integrations. For example, an asset listed at 0.1 ETH will distribute 0.099 ETH to the seller and 0.001 ETH to the platform.
  • Convenience Fee:
    When deploying via dashboard, the fee includes a 1.5% convenience fee or 2.5% total (1% protocol fee plus an additional 1.5%). For example, an asset listed at 0.1 ETH will distribute 0.0975 ETH to the seller and 0.0025 ETH to the platform.
  • Custom Fee Configuration:
    You can still set your own platform fee during deployment or later via our platform. The process works exactly as before, with the custom fee now being applied in addition to the fixed thirdweb fee.

Why the Change?

This adjustment helps support continued development and maintenance of prebuilt smart contracts, ensuring reliability, security, and innovation for the ecosystem.

For any questions or further details, please reach out to our support team.

FAQs

  • Which prebuilt contracts will have included fees?
    • The following contracts and corresponding modular versions will now include a seller fee:
      • Drop Contracts: DropERC20, DropERC721, DropERC1155, OpenEdition
      • Token Contracts: TokenERC20, TokenERC721, TokenERC1155
      • Specialized Contracts: LoyaltyCard, BurnToClaim, MarketplaceV3
  • I deployed a contract prior to the effective date, will these fees apply to me?
    • This fee is only applied to any contracts deployed after 3:00 pm PST on March 3, 2025
Amine Afia

We Introduced a new include_spam query parameter to the ERC20 token endpoint to filter out potential spam tokens.

GET /v1/tokens/erc20/vitalik.eth&include_spam=true

The criteria for identifying spam include:

• Empty token name

• Empty token symbol

• Symbol length greater than 15 characters

• Zero decimals

By default, spam tokens are excluded from responses (include_spam=false). You can try it in our playground by visiting here. See the example bellow:

Here is a Typescript example showing how to use it in your code:

fetchTokens = async () => {
try {
const response = await fetch(
"https://1.insight.thirdweb.com/v1/tokens/erc20/vitalik.eth?metadata=true&include_spam=true",
{
headers: {
"x-client-id": clientId,
},
},
);
const tokensResult = await response.json();
return tokensResult;
} catch (error) {
console.error("Error:", error);
}
};
Toomas Oosalu

We are now supporting NFT metadata for Insight NFT balance endpoints (ERC-721 and ERC-115).

By adding metadata=true query parameter to the request, the response will include metadata about the NFT - name, description, image URL, background color, external URL, collection and contract info in addition to the balance.

Here's an example of the data that can be returned:

{
"chainId": 137,
"tokenAddress": "0x819384ee58c4aadcf170a78728addafb6301d871",
"tokenId": "3907",
"balance": "1",
"name": "Cloude Doodle #3907",
"description": "The Doodle Cloud Kingdom is an ally of the Bekantan Kingdom to defend and show strength.",
"image_url": "ipfs://QmVCu8NRuKUb64jDQqg3fsPrXa19W37Y7Cx2Vo8C5fdZe5/3907.png",
"extra_metadata": {
"dna": "20a571eaae29e115ed30716bf4282f7663ab3f7c",
"edition": 3907,
"date": 1660320491602,
"attributes": [
{
"trait_type": "Background",
"value": "Gradient (55)"
},
{
"trait_type": "Body",
"value": "Cumulos (61)"
},
{
"trait_type": "Hat",
"value": "Bando (7)"
},
{
"trait_type": "Mouth",
"value": "Stoic"
},
{
"trait_type": "Eyes",
"value": "Villain"
},
{
"trait_type": "Nose",
"value": "Disgusted (57)"
}
],
"compiler": "HashLips Art Engine"
},
"collection": {
"name": "Cloude Doodle"
},
"contract": {
"type": "ERC721",
"name": "Cloude Doodle",
"symbol": "CLD"
}
}

Try it out on our playground

Or call it directly from code

const getNFTsWithMetadata = async (address: string) => {
try {
const response = await fetch(
`https://1.insight.thirdweb.com/v1/tokens/erc721/${address}?metadata=true`,
{
headers: {
"x-client-id": <your-client-id>,
},
},
);
const response = await response.json();
return response;
} catch (error) {
console.error("Error:", error);
}
};

📖 Learn more about Insight - it’s open source and ready to power your applications!

Vernon Johnson

The Insights API now supports querying contract metadata and ABIs. Powered by our contract indexing and verification backend, developers can now access verified contract metadata and ABIs for all supported chains directly within Insights. This eliminates the need to interact with block explorers and third party source code verifiers to get contract metadata and ABIs.

We've added the following endpoints:

Get contract ABI

curl https://insight.thirdweb.com/v1/contracts/abi/0x66a9893cc07d91d95644aedd05d03f95e1dba8af?chain=1&clientId=THIRDWEB_CLIENT_ID

Get contract ABI

Get contract ABI

Get contract metadata

curl https://insight.thirdweb.com/v1/contracts/metadata/0x66a9893cc07d91d95644aedd05d03f95e1dba8af?chain=1&clientId=THIRDWEB_CLIENT_ID

Get contract metadata

Get contract metadata

Both endpoints are available in the playground to test.

Stay tuned for more updates and exciting features from Thirdweb!

Arsenii

We’re excited to unveil a powerful addition to the thirdweb platform: a brand-new API designed to automate chain onboarding in real time. This release is especially useful for Rollup-as-a-Service (RaaS) providers, who can now seamlessly integrate new chains into the thirdweb ecosystem the moment they’re spun up. No more back-and-forth or manual listing processes—this API provides a streamlined way to manage your chains on thirdweb.

What’s New?

  1. Automated Registration of Newly Spun-Up Chains
    Our new API endpoints let you programmatically add or update chain configurations on the thirdweb platform. This is critical for RaaS providers who rapidly deploy new chains and need an immediate, frictionless connection to thirdweb.
  2. Seamless Integration with Existing Workflows
    Because the API is designed for simplicity, it easily slots into your existing DevOps workflow. You can add a single API call to your chain deployment scripts, automatically informing thirdweb about the new chain’s details—no manual steps required.
  3. Real-Time Updates
    Once your chain is registered, the thirdweb platform reflects the changes immediately, so developers can start using thirdweb tools (SDKs, CLIs, and dashboards) on your newly created chains right away.
  4. Robust Documentation and Tooling
    We’ve launched an accompanying API Reference that covers everything you need—from authenticating requests to building complex integration flows. You’ll find clear examples, success and error response codes, and best practice guidelines.

Key Endpoints at a Glance

Below are some of the most commonly used endpoints. A full list of endpoints and usage examples can be found in the API docs.

  • POST /chains
    Register a new chain with thirdweb. Supply essential metadata (e.g., chain name, chain ID, explorer URLs, stack type and custom RPC urls) for immediate onboarding.
  • GET /chains
    Fetch details about chains added by your team. Useful for verifying that your chains has been successfully added and has all the relevant info present.
  • PUT /rpcUrls/{chainId}
    Add RPC urls for an existing chain, very requested by RaaS providers.

Why This Matters for RaaS Providers

  • Speedy Deployment: Spin up a new rollup chain and instantly register it with thirdweb in a single automated step.
  • Less Overhead: No more waiting on manual reviews or dealing with miscommunications. Your chain data stays in sync whenever you roll out a new version or fork.
  • Scalability: Whether you have one chain or a thousand, the API is built to handle bulk provisioning and updates.

How to Get Started

  1. Review the Documentation
    Check out the API docs for quickstart guides and detailed references.
  2. Generate an API Key
    Obtain an API key from your thirdweb dashboard. This key will authenticate your requests.
  3. Integrate With Your Deployment Scripts
    Add API calls to your RaaS deployment pipeline or CI/CD workflow to register new chains automatically.
  4. Test & Monitor
    Use the provided sandbox environment or your standard staging area to test new chain registrations before rolling out changes to production.

Looking Ahead

We’re committed to making thirdweb the most developer-friendly platform for emerging blockchain solutions. Here’s a sneak peek at what’s coming next:

  • Account Abstraction
    Automate provisioning and integration with your custom account abstraction flows for enhanced security and better user experiences.
  • Universal Bridge (previously thirdweb Pay)
    Simplify asset transfers across different chains with an automatically provisioned, interoperable payment/bridge layer.
  • Insight
    Gain real-time analytics and diagnostics across all your chains—insightful dashboards and metrics will be automatically enabled for new rollups.

Expect these features—along with additional endpoints, analytics hooks, and security enhancements—to be part of our continued effort to streamline multi-chain support.

Stay tuned for details and in the meantime, don't hesitate reaching out to get early access and needed permissions to be able to utilise this and give us feedback!


As always, thank you for building with thirdweb!

Amine Afia

We’re introducing metadata retrieval in our ERC20 token API!

You can now include token information—such as name, symbol, and decimals—in a single call to our /tokens/erc20 endpoint. Just add the new metadata=true parameter to the query string. For example:

GET /v1/tokens/erc20/vitalik.eth&metadata=true

This returns the token’s metadata along with the usual balance data, simplifying your workflows and saving you from making extra calls. We’ve also added caching so metadata lookups are faster after the first request.

You can try it in our playground by visiting here. See the example bellow:

Here is a Typescript example showing how to use it in your code:

const search = async () => {
try {
const response = await fetch('https://1.insight.thirdweb.com/v1/tokens/erc20/vitalik.eth?metadata=true', {
headers: {
"x-client-id": clientId,
},
});
const tokensResult = await response.json();
return tokensResult
} catch (error) {
console.error('Error:', error);
}
};
Toomas Oosalu

Insight API added support for querying block data.

Try it out on our playground

Or use it directly from code

const getBlock = async (blockNumber: number) => {
try {
const response = await fetch(
`https://1.insight.thirdweb.com/v1/blocks?filter_block_number=${blockNumber}&limit=1`,
{
headers: {
"x-client-id": <your-client-id>,
},
},
);
const blockResponse = await response.json();
return blockResponse.data[0];
} catch (error) {
console.error("Error:", error);
}
};

📖 Learn more about Insight - it’s open source and ready to power your applications!

Toomas Oosalu

Insight API now supports an explorer-like endpoint to resolve blockchain data.

The resolve endpoint supports

  • Transaction hashes - returns the transaction data
  • Block hashes - returns the block data
  • Addresses (also ENS names)
    • In case of an EOA - returns last 20 transactions from that address
    • In case of a contract - returns last 20 transactions to that address
  • Event signatures - returns the latest 20 events with the given signature
  • Function signatures - returns the latest 20 transactions with the given signature

Try it out on our playground

Or use it directly from code

const resolve = async () => {
try {
const response = await fetch('https://1.insight.thirdweb.com/v1/resolve/0xe01d4a0dbd117152f14c081a8b91b4f55429c469e2dc1530ea00d2714c6bb2a8', {
headers: {
"x-client-id": clientId,
},
});
const result = await response.json();
return result
} catch (error) {
console.error('Error:', error);
}
};

This endpoint was initially called v1/search/:input but was changed to v1/resolve/:input to better reflect its purpose.


📖 Learn more about Insight - it’s open source and ready to power your applications!

Nischit Pradhan

At thirdweb, innovation is in our DNA. We’re excited to share a behind-the-scenes look at how our team is continuously pushing the boundaries to deliver an unparalleled user experience. Today, we're diving into some key upgrades that have transformed our RPC server.

🍞 Embracing the Bun Runtime

We’ve made a bold move by switching our RPC server to the Bun runtime. This isn’t just a technological upgrade—it’s a leap toward efficiency. With this change, we’ve managed to slash memory usage by 30%. What does that mean for you? More network requests are handled seamlessly, ensuring a smoother and more responsive experience without the need for extra hardware.

⚡ Turbocharged with Short-term Caching

Performance matters, and every millisecond counts. By introducing short-term caching into our architecture, we’ve dramatically reduced latency. Our metrics tell the story:

  • P90 latency is down by 50%.
  • P95 latency has improved by a whopping 300%.

These numbers translate into faster response times and a more robust service, even during peak usage periods.

🔍 Deep-Dive Monitoring with Enhanced APM

Understanding every nuance of our system is key to delivering excellence. We’ve integrated fine-grained our Performance Monitoring that drills down into every RPC call. This means we now track method-level usage and latency, giving us a crystal-clear view of performance across the board. With this insight, we’re empowered to act swiftly, optimizing our service before issues can arise.

Firekeeper

What's Changed

Insight Indexer .NET Integration

Insight is an extremely useful and performant tool to query blockchain data and can decorate it quite nicely too.

Did you know that vitalik, on Ethereum, Polygon and Arbitrum alone owns 7811 ERC20s, 34,362 ERC721s and 2,818 ERC1155s?
Let's go through some examples!

Instantiation

using Thirdweb.Indexer;
// Create a ThirdwebInsight instance
var insight = await ThirdwebInsight.Create(client);

Simple Args

// Setup some filters
var address = await Utils.GetAddressFromENS(client, "vitalik.eth");
var chains = new BigInteger[] { 1, 137, 42161 };

Fetching all tokens owned by a given address

// Fetch all token types
var tokens = await insight.GetTokens(address, chains);
Console.WriteLine($"ERC20 Count: {tokens.erc20Tokens.Length} | ERC721 Count: {tokens.erc721Tokens.Length} | ERC1155 Count: {tokens.erc1155Tokens.Length}");

Fetching a specific type of token owned by a given address

// Fetch ERC20s only
var erc20Tokens = await insight.GetTokens_ERC20(address, chains);
Console.WriteLine($"ERC20 Tokens: {JsonConvert.SerializeObject(erc20Tokens, Formatting.Indented)}");
// Fetch ERC721s only
var erc721Tokens = await insight.GetTokens_ERC721(address, chains);
Console.WriteLine($"ERC721 Tokens: {JsonConvert.SerializeObject(erc721Tokens, Formatting.Indented)}");
// Fetch ERC1155s only
var erc1155Tokens = await insight.GetTokens_ERC1155(address, chains);
Console.WriteLine($"ERC1155 Tokens: {JsonConvert.SerializeObject(erc1155Tokens, Formatting.Indented)}");

Fetching Events
Note: most of these parameters are optional (and some are not showcased here)

// Fetch events (great amount of optional filters available)
var events = await insight.GetEvents(
chainIds: new BigInteger[] { 1 }, // ethereum
contractAddress: "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d", // bored apes
eventSignature: "Transfer(address,address,uint256)", // transfer event
fromTimestamp: Utils.GetUnixTimeStampNow() - 3600, // last hour
sortBy: SortBy.TransactionIndex, // block number, block timestamp or transaction index
sortOrder: SortOrder.Desc, // latest first
limit: 5 // last 5 transfers
);
Console.WriteLine($"Events: {JsonConvert.SerializeObject(events, Formatting.Indented)}");

Full Insight .NET Reference

Engine Blockchain API .NET Integration

Engine is one of thirdweb's most important products. We've created an EngineWallet class that can be used as an IThirdwebWallet and as such benefits from being compatible with the entire SDK!

Usage:

// EngineWallet is compatible with IThirdwebWallet and can be used with any SDK method/extension
var engineWallet = await EngineWallet.Create(
client: client,
engineUrl: Environment.GetEnvironmentVariable("ENGINE_URL"),
authToken: Environment.GetEnvironmentVariable("ENGINE_ACCESS_TOKEN"),
walletAddress: Environment.GetEnvironmentVariable("ENGINE_BACKEND_WALLET_ADDRESS"),
timeoutSeconds: null, // no timeout
additionalHeaders: null // can set things like x-account-address if using basic session keys
);
// Simple self transfer
var receipt = await engineWallet.Transfer(chainId: 11155111, toAddress: await engineWallet.GetAddress(), weiAmount: 0);
Console.WriteLine($"Receipt: {receipt}");

Integrated with last December's EIP-7702 release!

Additional Changes

  • Arbitrum, Arbitrum Nova and Arbitrum Sepolia gas price related methods now get shortcut early and return maxFeePerGas = maxPriorityFeePerGas = current gas price.
  • Utils.GetChainMetadata chain id related variables updated from int to BigInteger.

Links

.NET Release | NuGet Release | Unity Release

Documentation | Support