> For a complete page index, fetch https://docs.transak.com/llms.txt

# How to Add a NFT Smart Contract in the Dashboard and Create a contractId

Use this guide to add your NFT smart contract in the Transak Dashboard and generate a `contractId` for NFT Checkout.

## What is `contractId`?

`contractId` is a unique identifier for your approved smart contract. You must pass this value when creating an NFT Checkout widget session.

<ParamField path="contractId" type="string" required={true}>
  Unique identifier for your whitelisted smart contract address and network combination.
</ParamField>

## Prerequisites

* Access to the [Transak Partner Dashboard](https://dashboard.transak.com/)
* The target smart contract address
* The target EVM network
* The contract ABI for calldata generation

<Frame>
  NFT Checkout supports custom smart contracts on EVM-compatible chains. For **production approval**, Transak may review your contract and audit details before allowing it to be used live.
</Frame>

## Step 1: Open NFT Checkout in the Dashboard

<Steps>
  <Step title="Log in to the dashboard">
    Go to [dashboard.transak.com](https://dashboard.transak.com/) and sign in.
  </Step>

  <Step title="Select the correct environment">
    Choose **Staging** or **Production** from the environment selector.
  </Step>

  <Step title="Open NFT Checkout">
    Go to the **Products** section and open **NFT Checkout**.
  </Step>
</Steps>

## Step 2: Add your custom smart contract

Submit the required contract details in the dashboard.

* Smart contract address
* Network / chain
* Collection or project details
* Any supporting metadata requested by the dashboard flow

For production, keep your contract verification and audit documentation ready if requested during review.

## Step 3: Wait for contract approval

The contract must be whitelisted before it can be used in NFT Checkout.

| Environment    | Expected behavior                         |
| -------------- | ----------------------------------------- |
| **Staging**    | Used for testing and faster validation    |
| **Production** | Subject to Transak review before live use |

<Frame>
  If possible, verify the contract on the relevant block explorer before requesting production approval. This generally makes review easier.
</Frame>

## Step 4: Copy the generated `contractId`

Once the contract is approved in the dashboard, Transak generates a `contractId` for that contract and network pair.

Save this value because you will need it in your widget session payload.

## Step 5: Generate calldata for your contract

`contractId` is required, but it is not enough by itself. NFT Checkout also requires `calldata`.

Use the dedicated guide for this part:

* [How to Generate Calldata for NFT Checkout](/guides/how-to-generate-calldata-for-nft-checkout)

Important rules:

* Encode calldata from the ABI of the implementation contract if you use a proxy
* If your function accepts `to`, `recipient`, or `buyer`, use Transak's NFT Checkout smart contract address for that chain instead of the end user's wallet address

## Step 6: Use `contractId` in Create Widget URL

Pass `contractId` inside `widgetParams` together with the other NFT Checkout fields.

```bash
curl --request POST \
     --url https://api-gateway-stg.transak.com/api/v2/auth/session \
     --header 'accept: application/json' \
     --header 'access-token: YOUR_ACCESS_TOKEN' \
     --header 'content-type: application/json' \
     --data '{
  "widgetParams": {
    "apiKey": "YOUR_API_KEY",
    "referrerDomain": "yourdomain.com",
    "walletAddress": "USER_WALLET_ADDRESS",
    "isNFT": true,
    "contractId": "YOUR_CONTRACT_ID",
    "cryptoCurrencyCode": "ETH",
    "estimatedGasLimit": 250000,
    "calldata": "0x...",
    "nftData": [
      {
        "imageURL": "https://example.com/nft.png",
        "nftName": "My NFT",
        "collectionAddress": "0x8a20e9e8e736643161ce6a2fe8dd8dd62050cd1e",
        "tokenID": ["1"],
        "price": [0.05],
        "quantity": 1,
        "nftType": "ERC721"
      }
    ]
  }
}'
```