In this quickstart you will learn how to create and manage intellectual property (IP) assets.

Contact sales to enable this API on your project.

What are IP credentials?

IP credentials are onchain records of intellectual property rights and authorship, enabled by Story Protocol’s infrastructure and issued using Crossmint’s APIs.

Integration steps

1. Create a Developer Account

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 production.

2. Get an API Key

Once you log in to the console, the next step is to create an .

Click the "Integrate" tab and click on the "API Keys" option on top.

Within the “Server-side keys” section, click the “Create new key” button in the top right. Then, check the necessary scopes under the “Minting API” category: nfts.create, nfts.read, collections.create, nfts.update and create your key. Save this key for the next step.

3. Create an IP Collection

First, let’s create an IP collection to hold our IP assets:

createIPCollection.js
const apiKey = "YOUR_API_KEY";
const env = "staging"; // or "www"

const url = `https://${env}.crossmint.com/api/v1/ip/collections`;
const options = {
    method: "POST",
    headers: {
        accept: "application/json",
        "content-type": "application/json",
        "x-api-key": apiKey,
    },
    body: JSON.stringify({
        metadata: {
            description: "A collection of intellectual property assets",
            name: "My IP Collection",
            symbol: "MPA",
        },
        chain: "story-testnet",
    }),
};

fetch(url, options)
    .then((res) => res.json())
    .then((json) => console.log(json))
    .catch((err) => console.error("error:" + err));

Save the collection id from the response for the next step.

4. Create an IP Asset

Now, let’s create an IP asset within our collection:

createIPAsset.js
const apiKey = "YOUR_API_KEY";
const env = "staging"; // or "www"
const collectionId = "YOUR_COLLECTION_ID";

const url = `https://${env}.crossmint.com/api/v1/ip/collections/${collectionId}/ipassets`;
const options = {
    method: "POST",
    headers: {
        accept: "application/json",
        "content-type": "application/json",
        "x-api-key": apiKey,
    },
    body: JSON.stringify({
        owner: "email:creator@example.com:story-testnet",
        nftMetadata: {
            name: "Snowflake Funk",
            description: "A disco song for the winter holidays",
            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",
                },
            ],
        },
    }),
};

fetch(url, options)
    .then((res) => res.json())
    .then((json) => console.log(json))
    .catch((err) => console.error("error:" + err));

Save the IP asset id from the response for the next steps.

5. Retrieve an IP Asset

To retrieve an IP asset:

getIPAsset.js
const apiKey = "YOUR_API_KEY";
const env = "staging"; // or "www"
const collectionId = "YOUR_COLLECTION_ID";
const ipAssetId = "YOUR_IP_ASSET_ID";

const url = `https://${env}.crossmint.com/api/v1/ip/collections/${collectionId}/ipassets/${ipAssetId}`;
const options = {
    method: "GET",
    headers: {
        accept: "application/json",
        "x-api-key": apiKey,
    },
};

fetch(url, options)
    .then((res) => res.json())
    .then((json) => console.log(json))
    .catch((err) => console.error("error:" + err));

6. Update an IP Asset

If needed, you can update an IP asset:

updateIPAsset.js
const apiKey = "YOUR_API_KEY";
const env = "staging"; // or "www"
const collectionId = "YOUR_COLLECTION_ID";
const ipAssetId = "YOUR_IP_ASSET_ID";

const url = `https://${env}.crossmint.com/api/v1/ip/collections/${collectionId}/ipassets/${ipAssetId}`;
const options = {
    method: "PATCH",
    headers: {
        accept: "application/json",
        "content-type": "application/json",
        "x-api-key": apiKey,
    },
    body: JSON.stringify({
        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: 90,
                },
                {
                    name: "Frank L",
                    crossmintUserLocator: "email:frank.l@example.com:story-testnet",
                    contributionPercent: 10,
                },
            ],
        },
    }),
};

fetch(url, options)
    .then((res) => res.json())
    .then((json) => console.log(json))
    .catch((err) => console.error("error:" + err));

Learn More

For more detailed information about IP assets, please refer to the API reference: