Syndicate’s metadata infrastructure gives you unparalleled flexibility in how you store and serve your NFT metadata, saving your team time in development and upkeep costs. Our metadata API is built to support the same enterprise scale as our transaction services, meaning you can make thousands of metadata updates per second all without paying gas fees. We offer a variety of storage options from a single API allowing you to swap solutions as your product grows without requiring a costly token migration, complex contract updates, or code changes to your services. By the end of this guide you’ll have explored how to:

  • Point an existing, 3rd party NFT at Syndicate’s metadata API
  • Create or update a Syndicate ERC-721M contract’s renderer to support dynamic metadata
  • Use Syndicate to pin and host metadata on IPFS to save your team time and money
  • Point your token metadata at an existing backend or data store
  • Combine Syndicate’s metadata and transaction broadcasting APIs to achieve cross-chain metadata on a low cost L2
  • Update an individual token’s metadata
  • Bulk update many tokens’ metadata

Point an existing NFT at Syndicate’s metadata API

If you already have an NFT contract you can use Syndicate’s metadata API to save money on IPFS pinning, reduce your team’s cloud hosting bill, or remove your own backend entirely. So long as your contract allows you to update the baseURI, sometimes called tokenURI, simply make a contract call to have your tokenURI() function resolve to the following format: https://metadata.syndicate.io/{chainId}/{tokenAddress}/{tokenId}. Please note: We currently only support files < 8KB

If you have any questions about whether you contract is compatible get in touch, we’re happy to take a look and help you get set up.

Dynamic metadata with an ERC-721M contract

Any Syndicate ERC-721M contract can support dynamic metadata out of the box thanks to our modular protocol standard. With a simple contract call to updateRenderer you’re done. There a number of ways you can make this contract call below. First use the table below to grab the contract address for the Dynamic renderer deployed on your NFT’s chain which will be referred to as implementation in the calls. Then copy the following ABI:

ChainDynamic Renderer Address
Polygon0xA67d13E3227B68bFc96DB9f5AFe7197ca32F0033
Mumbai0xd40EceBbA351044C5a564e571960a9Df7123d9b8
Ethereum Mainnet0x7aa3c4412cbe051d5ecc3d5b787c106c8b301fb0
[{ "inputs": [ { "internalType": "address", "name": "implementation", "type": "address" } ], "name": "updateRenderer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }]`.

Metadata hosting: IPFS, your data store, L2s

Syndicate offers three different options for hosting your metadata via the same API. Just point us at the location of the data and we’ll resolve it whenever you or a third party like OpenSea requests it.

Note that regardless of where your metadata is stored, a token’s metadata is always accessible via a GET request to the following URL which matches the URL format encoded on the Dynamic Renderer contract.

https://metadata.syndicate.io/{chainId}/{tokenAddress}/{tokenId}

You may notice that this is a different base URL than the one for all other Syndicate endpoints. This is intentional as we host metadata behind a separate, globally distributed load balancer to achieve the lowest possible latency.

Update an individual token’s metadata

Now that you’ve got a handle on the various hosting options Syndicate provides, let’s take a look at how you can update an individual token’s metadata. To prevent different parties from updating metadata on contracts they don’t own, we allowlist the ability on a first-come, first-served basis. To claim your contract, copy the curl command below, and replace the <projectId>, <chainId>, and <tokenAddress> with corresponding values associated with your project’s contract. For complete documentation of this endpoint, see Claim Contract. If you are the owner of this contract and it has already been claimed get in touch, we’re happy to resolve.

curl -X POST \
    -H 'Authorization: Bearer <api-key>' \
    'https://api.syndicate.io/admin/project/<projectId>/contract/<chainId>/<tokenAddress>/claim'

Next, copy the curl command below replacing <projectId> with the ID of the project this contract belongs to, the <chainId> with the integer associated with your token from this list, the <tokenAddress> with your ERC-721 contract address, and the <tokenId> with the token you wish to update. For complete documentation on the endpoint, see Update Metadata .

curl -H 'Authorization: Bearer <api-key>' \
     -H "Content-type: application/json" \
     -d '{<json-or-url>}' \
     'https://api.syndicate.io/token-metadata/update/<projectId>/<chainId>/<tokenAddress>/<tokenId>'

Bulk update tokens’ metadata

If you would like many tokens to have the same metadata, when your onboarding a batch of new users for example, the bulk update endpoint reduces the number of API calls necessary. Copy the curl command below, replacing <token-ids> with a comma separate list of tokens you wish to update such as 1,3,9. For complete documentation on the endpoint, see Bulk Update Metadata.

curl -H 'Authorization: Bearer <api-key>' \
     -H "Content-type: application/json" \
     -d '{<json-or-url>}' \
     'https://api.syndicate.io/token-metadata/bulk/<projectId>/<chainId>/<tokenAddress>?id=<token-ids>'

What’s next?

If you haven’t sent your first transaction yet, follow our Send and Monitor Transactions Guide to get started. Set up an IP range allowlist for your project if you haven’t already by following our IP Allowlist Guide to protect your keys.