In this quickstart, you will:

  • Register a music album as an IP collection
  • Register a music track as an IP asset
This quickstart is under development as new features are added to the Story Protocol daily.

Preparation Steps

1

Create a Developer Account and Project

To get started, create a developer account in the Crossmint Staging Console. Open that link, sign in, and accept the dialog to continue.

Crossmint offers two consoles: staging, for development and testing, and www, for production.

Then, navigate to project Settings > General and set the wallet type to “Smart Wallets”:

2

Get an API Key

Create a server-side API key with these scopes: collection.create, collection.update, collection.read, nfts.create.

This allows your API key to perform any kind of asset registration action.

Register Music Album

1

Create an IP Collection

const response = await fetch("https://staging.crossmint.com/api/v1/ip/collections", {
    method: "POST",
    headers: {
        "X-API-KEY": "<YOUR_API_KEY>",
        "Content-Type": "application/json"
    },
    body: JSON.stringify({
        metadata: {
            description: "My first music album",
            name: "My First Album",
            symbol: "MFA"
        }
    })
});

const collection = await response.json();
console.log("Collection created:", collection);

Additional metadata can be added to the collection to help with discovery, such as a cover image. Check out the API reference for more information.

To create the album, run the script:

npx tsx createCollection.ts

Register Song

1

Create a Song

Go to Suno, a music platform for AI-generated music, to create a song:

  • Input a prompt to create a song
  • Click on the final result to get the song’s URL (i.e. https://suno.com/song/c001fd6e-d6cd-474f-a7b6-6e6a9b3e2515)
  • Copy the song ID in the URL (i.e. c001fd6e-d6cd-474f-a7b6-6e6a9b3e2515)
  • Copy the following URL: https://cdn1.suno.ai/${SONG_ID}.mp3, making sure to replace SONG_ID with your own
2

Register Song on Story

const response = await fetch("https://staging.crossmint.com/api/v1/ip/collections/{collectionId}/ipassets", {
    method: "POST",
    headers: {
        "X-API-KEY": "<YOUR_API_KEY>",
        "Content-Type": "application/json"
    },
    body: JSON.stringify({
        owner: 'email:creator@example.com',
        nftMetadata: {
            name: 'Snowflake Funk',
            description: 'A disco groovy song for a house party during the winter time',
            image: 'https://cdn2.suno.ai/image_large_c001fd6e-d6cd-474f-a7b6-6e6a9b3e2515.jpeg'
        },
        ipAssetMetadata: {
            title: 'Snowflake Funk',
            createdAt: '2025-02-11T11:13:00',
            ipType: 'music',
            creators: [
                {
                    name: 'John Doe',
                    email: 'email:user@example.com',
                    contributionPercent: 100
                },
            ],
            media: [
                {
                    name: 'Snowflake Funk',
                    url: 'https://cdn1.suno.ai/c001fd6e-d6cd-474f-a7b6-6e6a9b3e2515.mp3',
                    mimeType: 'audio/mpeg'
                },
            ],
            attributes: [
                {
                    key: 'Suno Artist',
                    value: 'InfluentialCoda427'
                },
                {
                    key: 'Source',
                    value: 'Suno.com'
                }
            ]
        }
    })
});

const ipAsset = await response.json();
console.log("IP Asset:", ipAsset);

Run the script to register the song:

npx tsx registerIPAsset.ts

Confirm Song Registration

1

Get Action Status

You can easily check the IP asset registration status to ensure the action has completed before proceeding.

const response = await fetch("https://staging.crossmint.com/api/v1/ip/actions/{actionId}", {
    method: "GET",
    headers: {
        "X-API-KEY": "<YOUR_API_KEY>",
        "Content-Type": "application/json"
    }
});

const action = await response.json();
console.log("Action:", action);

Use the action ID returned in any of the previous steps and run the script:

npx tsx getAction.ts