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
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.
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
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"
},
chain: "story-testnet"
})
});
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
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
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:story-testnet',
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: 'john.doe@example.com',
crossmintUserLocator: 'email:john.doe@example.com:story-testnet',
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
Retrieve Your IP Asset
Get IP Asset Details
After registering your IP asset, you can retrieve its details to verify the information or display it in your application.
const response = await fetch("https://staging.crossmint.com/api/v1/ip/collections/{collectionId}/ipassets/{ipAssetId}", {
method: "GET",
headers: {
"X-API-KEY": "<YOUR_API_KEY>",
"Content-Type": "application/json"
}
});
const ipAsset = await response.json();
console.log("IP Asset:", ipAsset);
Replace {collectionId}
with your collection ID and {ipAssetId}
with the IP asset ID returned when you registered the asset. Then run the script:
Confirm Song Registration
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: