> ## Documentation Index
> Fetch the complete documentation index at: https://docs.crossmint.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Register External Collection

> Import custom and/or third party contracts

Crossmint has a pre-audited library of [smart contracts](/minting/nfts/integrate/create-collections) that serve most use cases. However, if you have custom needs, you can also bring your own.

<Tip>
  The Checkout has been battle-tested at scale with Crossmint's collections, and may result in a more reliable
  experience than using an untested, imported contract, or at least require less trouble-shooting.
</Tip>

<AccordionGroup>
  <Accordion title="When does it make sense to bring my own contract?">
    * When you require very custom functionality not supported by Crossmint's contracts.
    * If you're developing a marketplace.
    * If you have an accesslist.
  </Accordion>

  <Accordion title="What about secondary sale contracts/marketplaces?">
    Secondary markets are platforms where NFTs are traded after their initial mint/primary sale. These are marketplaces where users can buy and sell NFTs from each other.
    It requires manual support from Crossmint to import secondary contracts. See our [marketplaces and launchpads guide](/payments/advanced/marketplaces-and-launchpads).

    The self-serve option is only available for importing primary contracts for EVM and Solana.

    When importing contracts, Crossmint has support to fetch listings from the following secondary marketplaces:

    * **Auction House**: Solana's native marketplace protocol
    * **Tensor**: High-performance Solana NFT marketplace
    * **Magic Eden API**: Popular multi-chain NFT marketplace
    * **Hyperspace**: Cross-chain NFT marketplace and aggregator

    To add support for a new marketplace, please [contact sales](https://www.crossmint.com/contact/sales?utm_source=devrel\&utm_medium=docs\&utm_campaign=backlinks).
  </Accordion>
</AccordionGroup>

## Quick Navigation

All collection imports start with the same initial steps, then diverge based on your blockchain:

* [Common Steps (All Chains)](#common-steps-all-chains) - Steps 1-4 for all blockchains
* [EVM-Specific Steps](#evm-specific-steps) - Steps for Ethereum, Polygon, etc.
* [Solana-Specific Steps](#solana-specific-steps) - Additional steps for Solana candy machines

## Common Steps (All Chains)

These initial steps are the same whether you're importing an EVM contract or a Solana candy machine:

<Steps>
  <Step title="Navigate to Token collections and click `New collection`">
    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/9uJPRLU6Ro7RXKau/images/console/collections/1-new-collection.jpg?fit=max&auto=format&n=9uJPRLU6Ro7RXKau&q=85&s=f57ebc648bb4e893c340f99e8913be7f" alt="New collections screenshot" width="3022" height="717" data-path="images/console/collections/1-new-collection.jpg" />
    </Frame>
  </Step>

  <Step title="Enter Collection Information">
    This information is displayed in the Hosted Checkout and Storefront. You can edit it later.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/9uJPRLU6Ro7RXKau/images/console/collections/2-collection-info.jpg?fit=max&auto=format&n=9uJPRLU6Ro7RXKau&q=85&s=94ddb32bd1ca35ab3f84dd68a4305f12" alt="Collection info screenshot" width="2806" height="1178" data-path="images/console/collections/2-collection-info.jpg" />
    </Frame>
  </Step>

  <Step title="Select `Import an existing contract` option">
    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/9uJPRLU6Ro7RXKau/images/console/collections/3-import.jpg?fit=max&auto=format&n=9uJPRLU6Ro7RXKau&q=85&s=d4663d732d3433d9861cc224f5ed4e4e" alt="Import Collection screenshot" width="2062" height="724" data-path="images/console/collections/3-import.jpg" />
    </Frame>
  </Step>

  <Step title="Select the Blockchain your contract is deployed on">
    Remember, Crossmint has staging and production [environments](/introduction/platform/staging-vs-production).
    When working in the staging environment, choose the mainnet name. For example, if your contract is on the
    Polygon Amoy testnet, select Polygon.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/JdAfMyaUlkD6WCcK/images/console/collections/4-select-chain.jpg?fit=max&auto=format&n=JdAfMyaUlkD6WCcK&q=85&s=865ccdbbf1c5e0624636cf2a9fffaa36" alt="Select blockchain screenshot" width="2304" height="718" data-path="images/console/collections/4-select-chain.jpg" />
    </Frame>
  </Step>
</Steps>

After completing these common steps, continue with the blockchain-specific instructions below.

## EVM-Specific Steps

Complete the [Common Steps](#common-steps-all-chains) above first, then continue with these EVM-specific steps:

### Pre-requisites

* Your contract must be ERC-721, ERC-721A, or ERC-1155 compliant.
* The minting function must allow minting directly to an address that is different from the one that invoked the contract. And it must contain at least one parameter that specifies that recipient address.
* A single address must be able to call the mint function unlimited times but does not need to be able to hold unlimited NFTs.

### Contract Registration

You may register contracts manually from the console or via <Tooltip tip="Enterprise feature">API</Tooltip>.

<AccordionGroup>
  <Accordion title="My ABI wasn't automatically imported">
    When you compile your smart contract there will be a corresponding abi file with an `.abi` or `.json` extension.

    Inside this file, you'll see JSON property named abi, which describes the functions in your smart contract. Here's an example of a very simple abi file. Yours will likely have more function descriptions.

    ```json theme={null}
    // Example generated abi file for smart contract
    {
        "abi": [
            {
                "inputs": [],
                "stateMutability": "nonpayable",
                "type": "constructor"
            },
            {
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "_to",
                        "type": "address"
                    }
                ],
                "name": "mintTo",
                "outputs": [],
                "stateMutability": "payable",
                "type": "function"
            }
        ]
    }
    ```

    Copy the JSON array object that comes after the string `abi` and paste it into the `Contract ABI` text box in the developer console. The content you paste in should begin with `[` and end with `]`.
  </Accordion>

  <Accordion title="Specifying the remaining parameters">
    Whether your ABI was retrieved automatically or you pasted it in manually, you need to specify the:

    * Mint function
    * Recipient address parameter name
    * \[Optional] Quantity of NFTs to mint parameter name

    Crossmint will attempt to automatically select these values for you, but it's important to ensure they are set correctly. Especially if you're setting up a USDC mint function as the list of options will be longer.
  </Accordion>

  <Accordion title="Using proxy contracts">
    Proxy contracts are an advanced feature. You should use this only if you are certain that your contracts adhere to this pattern. This is crucial because Crossmint requires the actual NFT contract address when you register a mint/buy/purchase/claim function in a sales contract or revenue splitter.

    If you don't specify the NFT contract address, our system won't be able to extract token URI information or facilitate transfers. Set this up only if it isn't a transparent proxy, which is common for upgradeable contracts.
  </Accordion>
</AccordionGroup>

### EVM Contract Import Steps

<Steps>
  <Step title="Step 5: Select `Import my own contract` option">
    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/JdAfMyaUlkD6WCcK/images/console/collections/5-contract-provider.jpg?fit=max&auto=format&n=JdAfMyaUlkD6WCcK&q=85&s=eda5e20fb12a518d2b30f72d68321394" alt="Select contract provider screenshot" width="2292" height="432" data-path="images/console/collections/5-contract-provider.jpg" />
    </Frame>
  </Step>

  <Step title="Step 6: Contract Address">
    Enter the address of your contract and the console will determine the contract type automatically.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/JdAfMyaUlkD6WCcK/images/console/collections/6-contract-address.jpg?fit=max&auto=format&n=JdAfMyaUlkD6WCcK&q=85&s=f030a3feefe548f121be68094de65acf" alt="Enter contract address screenshot" width="2000" height="664" data-path="images/console/collections/6-contract-address.jpg" />
    </Frame>
  </Step>

  <Step title="Step 7: Proxy or Sales Contract (optional)">
    Notice in the screenshot that the example has the same contract address that was entered in previous step. This indicates a basic setup where the purchase function is within the registered NFT contract. The only reason to change this is if purchases should be sent to a different contract address that is not the same as the NFT contract.

    Most developers do not need to change this. If you are unsure, leave it as is. Transparent upgradeable contracts also do not need to use this setting and should use the beacon address in the previous step.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/JdAfMyaUlkD6WCcK/images/console/collections/7-sales-contract.jpg?fit=max&auto=format&n=JdAfMyaUlkD6WCcK&q=85&s=1af320ae7754edd9618582f873f64331" alt="Sales contract option screenshot" width="2000" height="310" data-path="images/console/collections/7-sales-contract.jpg" />
    </Frame>
  </Step>

  <Step title="Step 8: Contract ABI">
    As long as your contract is verified on the block explorer we can query the ABI automatically. If you have not verified your contract, you must enter the ABI manually.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/JdAfMyaUlkD6WCcK/images/console/collections/8-contract-abi.jpg?fit=max&auto=format&n=JdAfMyaUlkD6WCcK&q=85&s=2addc2ad8e53cec1e8ab2ec9e373bc83" alt="Contract ABI section screenshot" width="2000" height="488" data-path="images/console/collections/8-contract-abi.jpg" />
    </Frame>
  </Step>

  <Step title="Step 9: Mint Function Currency">
    Unless you specifically deployed a contract that supports USDC you must leave the native currency selected. If you are unsure, leave it as is.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/JdAfMyaUlkD6WCcK/images/console/collections/9-currency.jpg?fit=max&auto=format&n=JdAfMyaUlkD6WCcK&q=85&s=34cc6bddb2c6b94ba118c7816339fbee" alt="Contract mint function currency section screenshot" width="2064" height="211" data-path="images/console/collections/9-currency.jpg" />
    </Frame>
  </Step>

  <Step title="Step 10: Select Mint Function">
    If you selected the native currency in the previous step, this will be a very short list. If you have multiple mint functions in your contract that you want to accept payments for, you must register each one separately.

    <Note>USDC mint functions typically are NOT `payable`. Change the currency selector to USDC to populate the mint function list with valid options.</Note>

    The mint function must accept an address parameter and mint to that address. If your mint function lacks this you'll need to deploy a new contract or modify your existing contract.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/9uJPRLU6Ro7RXKau/images/console/collections/10-mint-function.jpg?fit=max&auto=format&n=9uJPRLU6Ro7RXKau&q=85&s=be53cc9508e0b6e51561adbf5bdd12be" alt="Contract mint function section screenshot" width="2064" height="207" data-path="images/console/collections/10-mint-function.jpg" />
    </Frame>
  </Step>

  <Step title="Step 11: Parameter for recipient address">
    After the mint function has been selected, this will be a short list built from the function parameters of type `address`. If you have multiple options here, ensure that you select the correct one. Doing this incorrectly will result in the purchased NFTs being sent to the wrong address and they likely will not be recoverable.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/9uJPRLU6Ro7RXKau/images/console/collections/11-recipient-address.jpg?fit=max&auto=format&n=9uJPRLU6Ro7RXKau&q=85&s=769fd927cb2407d038cac0c00ce88bf8" alt="Contract mint function recipient address section screenshot" width="2064" height="195" data-path="images/console/collections/11-recipient-address.jpg" />
    </Frame>
  </Step>

  <Step title="Step 12: Parameter for quantity">
    This will be a short list built from the function parameters of type `uint256`. If you have multiple options here, ensure that you select the correct one. Doing this incorrectly will result in the NFT checkout tools not being able to properly mint the correct quantity of NFTs.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/9uJPRLU6Ro7RXKau/images/console/collections/12-nft-quantity.jpg?fit=max&auto=format&n=9uJPRLU6Ro7RXKau&q=85&s=45c359480abfbae94ed5d7f6e318f615" alt="Contract mint function quantity parameter section screenshot" width="2064" height="386" data-path="images/console/collections/12-nft-quantity.jpg" />
    </Frame>
  </Step>

  <Step title="Step 13: Review details and click `Register collection` to complete">
    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/9uJPRLU6Ro7RXKau/images/console/collections/13-done-evm.jpg?fit=max&auto=format&n=9uJPRLU6Ro7RXKau&q=85&s=80f71c3ba6eadf69a58fabc8a38d8152" alt="EVM registration complete screenshot" width="2646" height="1308" data-path="images/console/collections/13-done-evm.jpg" />
    </Frame>
  </Step>
</Steps>

## Solana-Specific Steps

Complete the [Common Steps](#common-steps-all-chains) above first, then continue with these Solana-specific steps:

Instant support for:

* **Primaries**: Candy Machine v3, Metaplex Instant Sales, Magic Eden's Launchpad
* **Secondaries**: Auction House, Tensor, Magic Eden API, Hyperspace

<Note>
  Only the integrations listed above are available at the moment. For custom integrations, please [contact
  sales](https://www.crossmint.com/contact/sales?utm_source=devrel\&utm_medium=docs\&utm_campaign=backlinks).
</Note>

### Solana Candy Machine Import

Crossmint supports Candy Machine v3. After completing the common steps above, continue with these Solana-specific steps:

<Steps>
  <Step title="Step 5: Select Solana for the blockchain">
    This step replaces step 4 from the common steps above - select Solana from the blockchain dropdown.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/JdAfMyaUlkD6WCcK/images/console/collections/4-select-chain-solana.jpg?fit=max&auto=format&n=JdAfMyaUlkD6WCcK&q=85&s=24f10e939480d098558e059d2e2130d6" alt="Select Solana blockchain screenshot" width="2000" height="690" data-path="images/console/collections/4-select-chain-solana.jpg" />
    </Frame>
  </Step>

  <Step title="Step 6: Choose candy machine version and enter candy machine ID">
    Find the ID in the `cache.json` file in the folder where you deployed your Candy Machine.

    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/JdAfMyaUlkD6WCcK/images/console/collections/5-candy-machine.jpg?fit=max&auto=format&n=JdAfMyaUlkD6WCcK&q=85&s=83e5b9035d5ac1b654da665923a8ff1f" alt="Candy machine registration screenshot" width="2000" height="644" data-path="images/console/collections/5-candy-machine.jpg" />
    </Frame>
  </Step>

  <Step title="Step 7: Review details and click `Register collection` to complete">
    <Frame type="simple">
      <img src="https://mintcdn.com/crossmint/JdAfMyaUlkD6WCcK/images/console/collections/6-done-solana.jpg?fit=max&auto=format&n=JdAfMyaUlkD6WCcK&q=85&s=b83edfe7ce9b431ef67d179614d9cf02" alt="Candy machine registration complete screenshot" width="1650" height="817" data-path="images/console/collections/6-done-solana.jpg" />
    </Frame>
  </Step>
</Steps>

Congratulations! 🎉 You've successfully registered your external collection in Crossmint.

<Snippet file="collection-next-steps.mdx" />

## FAQs

<AccordionGroup>
  <Accordion title="What about Xion blockchain contracts?">
    For Xion blockchain contracts, please refer to our [Xion Contract Requirements](/minting/advanced/xion-contracts) documentation.
  </Accordion>

  <Accordion title="What about other blockchains? (Aptos, Sui, etc.)">
    Currently only importing EVM and Solana primary contracts is self-serve. If you wish to import Aptos and Sui contracts, please [contact
    sales](https://www.crossmint.com/contact/sales?utm_source=devrel\&utm_medium=docs\&utm_campaign=backlinks).
  </Accordion>

  <Accordion title="Can I register my collection via API?">
    Yes! You can programmatically register collections using the Collections Registration API.

    **API Endpoint:** `POST https://staging.crossmint.com/api/v1-alpha1/collections`

    **Required Headers:**

    * `Content-Type: application/json`
    * `x-api-key: <your-api-key>` (requires `collections.create` scope)

    <CodeGroup>
      ```bash EVM Contract Example theme={null}
      curl --request POST \
           --url https://staging.crossmint.com/api/v1-alpha1/collections \
           --header 'content-type: application/json' \
           --header 'x-api-key: <X_API_KEY>' \
           --data '{
             "chain": "ethereum",
             "contractType": "erc-721",
             "args": {
               "contractAddress": "0x1234567890123456789012345678901234567890",
               "abi": "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"mintTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}]",
               "mintFunctionName": "mintTo(address)",
               "toParamName": "_to",
               "quantityParamName": "_quantity",
               "contractType": "erc-721"
             },
             "metadata": {
               "title": "My NFT Collection",
               "description": "A custom NFT collection",
               "imageUrl": "https://example.com/collection-image.png",
               "social": {
                 "twitter": "https://twitter.com/mycollection",
                 "discord": "https://discord.gg/mycollection"
               }
             },
             "ownership": "external",
             "category": "art",
             "scopes": ["payments:credit-card", "payments:cross-chain"]
           }'
      ```

      ```bash Solana Candy Machine Example theme={null}
      curl --request POST \
           --url https://staging.crossmint.com/api/v1-alpha1/collections \
           --header 'content-type: application/json' \
           --header 'x-api-key: <X_API_KEY>' \
           --data '{
             "chain": "solana",
             "contractType": "candy-machine",
             "args": {
               "candyMachineId": "your-candy-machine-id-here"
             },
             "metadata": {
               "title": "My Solana Collection",
               "description": "A Solana NFT collection",
               "imageUrl": "https://example.com/collection-image.png"
             },
             "ownership": "external",
             "category": "art",
             "scopes": ["payments:credit-card", "payments:cross-chain"]
           }'
      ```
    </CodeGroup>

    **Key Parameters:**

    * **chain**: `"solana"`, `"ethereum"`, `"polygon"`, `"bsc"`
    * **contractType**: `"candy-machine"`, `"erc-721"`, `"erc-1155"`, `"thirdweb-drop"`
    * **args**: Contract-specific arguments (see examples above)
      * For EVM: `contractAddress`, `abi`, `mintFunctionName`, `toParamName`, `contractType` (required); `quantityParamName`, `tokenContractAddress` (optional)
          <Note>
            In EVM, if you use a separate contract for minting than for token metadata, set the minting contract address as `contractAddress`, and the token contract address as `tokenContractAddress`.
          </Note>
      * For Solana: `candyMachineId` (required)
    * **metadata**: Object with `title`, `description`, `imageUrl` (all required), and optional `social` object with `twitter`/`discord` links
    * **ownership**: `["self", "external"]`. Set to `"external"` for imported contracts
    * **category**: `"art"`, `"gaming"`, `"music"`, `"loyalty"`, `"ticketing"`, `"charity"`, `"other"`
    * **scopes**: `["payments:credit-card", "payments:cross-chain"]`. Scopes are required when `ownership` is `"external"`

    **Response (201 Created):**
    The API returns a collection object with identifiers you can use with Crossmint's checkout and payment systems.

    ```json theme={null}
    {
        "collectionId": "abc123-def456-ghi789...",
        "clientId": "abc123-def456-ghi789..."
    }
    ```

    <Note>This API is currently in alpha (v1-alpha1) and subject to change. The returned `collectionId` and `clientId` are typically the same value and can be used interchangeably for checkout integration.</Note>
  </Accordion>
</AccordionGroup>
