NFTs API

API is for creating and managing NFTs. To prepare images and metadata for your NFT collection you can use the Storage API. To learn more about metadata standards you can visit: https://docs.opensea.io/docs/metadata-standardsopen in new window

Get NFT Collection

Get NFT collection by UUID

GET /nfts/collections/:uuid

URL parameters

NameDescriptionRequired
uuidUnique key of collection. Key is displayed in developer dashboard.true

Possible errors

CodeDescription
40300000Not allowed to access collection.
50012009Collection does not exist.

Response Fields

NameTypeDescription
createTimeDateTimeCollection create time.
updateTimeDateTimeCollection last update time.
collectionTypenumberType of smart contract to use for collection. Available types are described here.
collectionUuidstringUnique key of a collection.
symbolstringNFT collection symbol (usually 3-4 characters long).
namestringNFT collection name.
descriptionstringNFT collection description.
maxSupplynumberMaximal number of NFTs ever in existence (0 stands for unlimited).
bucketUuidstringUUID of the bucket where metadata is stored.
baseUristringBase URI for collection metadata (token id and file extension is appended to it).
baseExtensionstringFile extension that is auto appended after token id to form a full URL.
isSoulboundbooleanSoul bound tokens are NFTs that are bounded to wallet and not transferable.
isRevokablebooleanFor revocable collection owner can destroy NFTs at any time.
isAutoIncrementbooleanIf set to false, enables minting NFTs with a custom token ID
royaltiesFeesnumberPercentage (between 0 and 100) of each NFT sale sent to wallet specified under royalties address.
royaltiesAddressstringAddress where royalties are sent to.
collectionStatusnumberApillon internal/database collection status.
contractAddressstringSmart address of contract for deployed collection.
transactionHashstringDeployment transaction hash/id.
deployerAddressstringWallet address of deployer.
chainnumberBlockchain id on which you want to release your collection.
dropbooleanDetermines if collection is mintable by public.
dropStartnumberUNIX timestamp which determines public mint opening date and time.
dropPricenumberPrice of NFT at mint stage in token that is used on chain.
dropReservenumberAmount of NFTs reserved by owner.
curl --location 'https://api.apillon.io/nfts/collections/:uuid' \
--header 'Authorization: Basic :credentials'
{
  "id": "b5935c73-204d-4365-9f9a-6a1792adab5b",
  "status": 200,
  "data": {
    "createTime": "2023-06-13T10:15:58.000Z",
    "updateTime": "2023-06-13T10:15:58.000Z",
    "collectionType": 1,
    "collectionUuid": "d6355fd3-640d-4803-a4d9-79d875abcb5a",
    "symbol": "NFT",
    "name": "NFT Collection",
    "description": "NFT Collection Description",
    "maxSupply": 1000,
    "bucketUuid": "a9425ff7-4802-4a38-b771-84a790112c30",
    "baseUri": "https://ipfs.apillon.io/metadata/",
    "baseExtension": ".json",
    "isSoulbound": false,
    "isRevokable": true,
    "royaltiesFees": 0.1,
    "royaltiesAddress": "0x4156edbafc5091507de2dd2a53ded551a346f83b",
    "collectionStatus": 0,
    "contractAddress": "0x452101C96A1Cf2cBDfa5BB5353e4a7F235241557",
    "transactionHash": "0x6b97424de3367cd0335b08265787b83053b62bee2d1c8bec1f776936bea4fb26",
    "deployerAddress": "0x4156edbafc5091507de2dd2a53ded551a346f83b",
    "chain": 1287,
    "drop": true,
    "dropStart": 1687251003,
    "dropPrice": 0.1,
    "dropReserve": 5
  }
}
Collection Type
NumberDescription
0Generic NFT collection.
1Nestable NFT collection.
Collection Statuses
NumberDescription
0Collection was created.
1Deploying collection was initiated.
2Collection is being deployed.
3Collection was deployed successfully.
4Collection was transferred successfully.
5Failed deploying collection.

List NFT Collections

List NFT collections. Items are paginated and can be filtered and ordered through query parameters.

GET /nfts/collections

Query parameters

All query parameters from listing request plus:

NameDescriptionRequired
collectionStatusCollection status. Find available statuses here.false

Response

Response is a list of items described under Response Fields above.

curl --location 'https://api.apillon.io/nfts/collections' \
--header 'Authorization: Basic :credentials'
{
  "id": "b5935c73-204d-4365-9f9a-6a1792adab5b",
  "status": 200,
  "data": {
    "items": [
      {
        "createTime": "2023-06-13T10:15:58.000Z",
        "updateTime": "2023-06-13T10:15:58.000Z",
        "collectionType": 1,
        "collectionUuid": "d6355fd3-640d-4803-a4d9-79d875abcb5a",
        "symbol": "NFT",
        "name": "NFT Collection",
        "description": "NFT Collection Description",
        "maxSupply": 1000,
        "bucketUuid": "a9425ff7-4802-4a38-b771-84a790112c30",
        "baseUri": "https://ipfs.apillon.io/metadata/",
        "baseExtension": ".json",
        "isSoulbound": false,
        "isRevokable": true,
        "royaltiesFees": 0.1,
        "royaltiesAddress": "0x4156edbafc5091507de2dd2a53ded551a346f83b",
        "collectionStatus": 0,
        "contractAddress": "0x452101C96A1Cf2cBDfa5BB5353e4a7F235241557",
        "transactionHash": "0x6b97424de3367cd0335b08265787b83053b62bee2d1c8bec1f776936bea4fb26",
        "deployerAddress": "0x4156edbafc5091507de2dd2a53ded551a346f83b",
        "chain": 1287,
        "drop": true,
        "dropStart": 1687251003,
        "dropPrice": 0.1,
        "dropReserve": 5
      }
    ],
    "total": 1
  }
}

List Collection Transactions

List NFT collections. Items are paginated and can be filtered and ordered through query parameters.

GET /nfts/collections/:uuid/transactions

URL parameters

NameDescriptionRequired
uuidUnique key of collection. Key is displayed in developer dashboard.true

Query parameters

All query parameters from listing request plus:

NameDescriptionRequired
transactionStatusTransaction status.false
transactionTypeTransaction type.false

Response Fields

NameTypeDescription
chainIdnumberBlockchain id on which you want to release your collection.
transactionTypenumberTransaction type.
transactionStatusnumberTransaction status
transactionHashnumberTransaction hash/id.
updateTimeDateTimeTransaction last update time.
createTimeDateTimeTransaction create time.
curl --location 'https://api.apillon.io/nfts/collections/:uuid/transactions' \
--header 'Authorization: Basic :credentials'
{
  "id": "b5935c73-204d-4365-9f9a-6a1792adab5b",
  "status": 200,
  "data": {
    "items": [
      {
        "chainId": 1287,
        "transactionType": 1,
        "transactionStatus": 1,
        "transactionHash": "0xb988c8cda7ec8b441611b208360e0aace9c294e1ca5672375b21e815890a54d1",
        "updateTime": "2023-06-13T10:15:58.000Z",
        "createTime": "2023-06-13T10:15:58.000Z"
      }
    ],
    "total": 1
  }
}
Transaction Types
NumberDescription
1Deploy Contract
2Transfer Contract Ownership
3Mint NFT
4Set Collection Base URI
5Burn NFT
6Nest mint NFT
Transaction Status
NumberDescription
1Pending
2Confirmed
3Failed
4Error

Create NFT Collection

API endpoint that creates NFT collection and deploys it on selected network.

An NFT Collection can be created with a few features/functionalities:

  • drop: collection can be minted/purchased by users
  • revokable: NFTs can be revoked by collection owner who can burn them
  • soulbound: NFTs are bound to wallet address and can't be transferred
  • royalties: owner can enable royalties to earn specified percentage per each NFT trade

2 types of collections are supported:

  1. Generic collection, which represents an extension of the ERC-721 standard for EVM collections and the PSP-34 standard for substrate collections. You can read more about these standards here
  2. Nestable collection which allows nesting NFTs under each other (based on RMRKs ERC-7401open in new window NFT standard - EVM only)

Additionally, 2 chain types/environments are supported: EVM and Substrate.

Create Substrate NFT Collection


POST /nfts/collections/substrate

Body fields

NameTypeDescriptionRequired
collectionTypenumberType of smart contract to use when deploying collection (1 for generic, 2 for nestable).true
chainnumberBlockchain ID on which you want to release your collection. Options: (8 - Astar)true
symbolstringNFT collection symbol (usually 3-4 characters long).true
namestringNFT collection name.true
descriptionstringNFT collection description.false
maxSupplynumberMaximal number of NFTs ever in existence (0 stands for unlimited).true
baseUristringBase URI for collection metadata (token id and file extension is appended to it).true
baseExtensionstringFile extension that is auto appended after token id to form a full URL.true
royaltiesAddressstringAddress where royalties are sent to.true
royaltiesFeesnumberPercentage of royalties earned per each NFT trade.true
dropbooleanDetermines if collection is mintable by public.true
dropStart*numberUNIX timestamp (in seconds) which determines public mint opening date and time.true
dropPrice*numberPrice of NFT at mint stage.true
dropReserve*numberAmount of NFTs reserved by owner.true

Notes:

*dropStart, dropPrice and dropReserve are only used if drop is set to boolean true.

Possible errors

Beside validation errors (with 422 http status code) these are the error codes may be returned:

CodeDescription
40012002Collection quota reached
50012003Failed deploying NFT contract on chain.
50012010Failed to create bucket for storing metadata.

Response

Response payload is described under Response Fields above.

curl --location 'https://api.apillon.io/nfts/collections/substrate' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic :credentials' \
--data '{
    "collectionType": 1,
    "chain": 8,
    "symbol": "NFT",
    "name": "NFT Collection",
    "description": "NFT Collection description",
    "maxSupply": 1000,
    "baseUri": "https://ipfs.apillon.io/metadata/",
    "baseExtension": "json",
    "royaltiesAddress": "5TdmScYtgDGg13mG1pvQ5zAooMXMK45bHBt3meGDXrNBKua",
    "royaltiesFees": 10,
    "drop": true,
    "dropStart": 1687251003,
    "dropReserve": 5,
    "dropPrice": 0.1
}'
{
  "id": "b5935c73-204d-4365-9f9a-6a1792adab5b",
  "status": 200,
  "data": {
    "createTime": "2023-06-13T10:15:58.000Z",
    "updateTime": "2023-06-13T10:15:58.000Z",
    "chain": 8,
    "collectionType": 1,
    "collectionUuid": "d6355fd3-640d-4803-a4d9-79d875abcb5a",
    "symbol": "NFT",
    "name": "NFT Collection",
    "description": "NFT Collection Description",
    "maxSupply": 1000,
    "bucketUuid": "a9425ff7-4802-4a38-b771-84a790112c30",
    "baseUri": "https://ipfs.apillon.io/metadata/",
    "baseExtension": ".json",
    "isSoulbound": false,
    "isRevokable": false,
    "royaltiesFees": 0.1,
    "royaltiesAddress": "5TdmScYtgDGg13mG1pvQ5zAooMXMK45bHBt3meGDXrNBKua",
    "collectionStatus": 0,
    "contractAddress": "XjuXMnFxcJoAgMCdUQKvvt2Daykq4H9rsCfYEVpF6noFP5u",
    "transactionHash": "0xb59d8497feb121b0ca0b8480df72a456333edddc68ad65f23b6b8b9028e3a6b3",
    "deployerAddress": "WmMcyrPY4fivB5FUPN85QPhCMKtnrjmUyAgtXC2oW2XbcnY",
    "drop": true,
    "dropStart": 1687251003,
    "dropPrice": 0.1,
    "dropReserve": 5
  }
}

Create EVM NFT Collection


POST /nfts/collections/evm

Body fields

All the fields from substrate collection, plus:

NameTypeDescriptionRequired
chainnumberBlockchain ID on which you want to release your collection. Options: (1284 - Moonbeam, 1287 - Moonbase, 592 - Astar)true
isRevokablebooleanFor revocable collection owner can destroy NFTs at any time. (default: false)true
isSoulboundbooleanSoul bound tokens are NFTs that are bound to wallet and not transferable. (default: false)true
isAutoIncrementbooleanIf set to false, enables minting NFTs with a custom token ID, otherwise defaults to isAutoIncrement = truefalse

Possible errors

Beside validation errors (with 422 http status code) these are the error codes may be returned:

CodeDescription
40012002Collection quota reached
50012003Failed deploying NFT contract on chain.
50012010Failed to create bucket for storing metadata.

Response

Response payload is described under Response Fields above.

curl --location 'https://api.apillon.io/nfts/collections/evm' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic :credentials' \
--data '{
    "collectionType": 1,
    "chain": 1287,
    "symbol": "NFT",
    "name": "NFT Collection",
    "description": "NFT Collection description",
    "maxSupply": 1000,
    "baseUri": "https://ipfs.apillon.io/metadata/",
    "baseExtension": "json",
    "royaltiesAddress": "0x4156edbafc5091507de2dd2a53ded551a346f83b",
    "royaltiesFees": 10,
    "drop": true,
    "dropStart": 1687251003,
    "dropReserve": 5,
    "dropPrice": 0.1,
    "isRevokable": true,
    "isSoulbound": true
}'
{
  "id": "b5935c73-204d-4365-9f9a-6a1792adab5b",
  "status": 200,
  "data": {
    "createTime": "2023-06-13T10:15:58.000Z",
    "updateTime": "2023-06-13T10:15:58.000Z",
    "chain": 1287,
    "collectionType": 1,
    "collectionUuid": "d6355fd3-640d-4803-a4d9-79d875abcb5a",
    "symbol": "NFT",
    "name": "NFT Collection",
    "description": "NFT Collection Description",
    "maxSupply": 1000,
    "bucketUuid": "a9425ff7-4802-4a38-b771-84a790112c30",
    "baseUri": "https://ipfs.apillon.io/metadata/",
    "baseExtension": ".json",
    "isSoulbound": false,
    "isRevokable": false,
    "royaltiesFees": 0.1,
    "royaltiesAddress": "0x4156edbafc5091507de2dd2a53ded551a346f83b",
    "collectionStatus": 0,
    "contractAddress": "0x452101C96A1Cf2cBDfa5BB5353e4a7F235241557",
    "transactionHash": "0x6b97424de3367cd0335b08265787b83053b62bee2d1c8bec1f776936bea4fb26",
    "deployerAddress": "0x4156edbafc5091507de2dd2a53ded551a346f83b",
    "drop": true,
    "dropStart": 1687251003,
    "dropPrice": 0.1,
    "dropReserve": 5,
    "isRevokable": true,
    "isSoulbound": true
  }
}

Transfer Collection

Transfer collection ownership from a wallet owned by caller to a new wallet address.

POST/nfts/collections/:uuid/transfer

URL parameters

NameDescriptionRequired
uuidUnique key of collection. Key is displayed in developer dashboard.true

Body fields

NameTypeDescriptionRequired
addressstringWallet address of a new owner.true

Possible errors

Beside validation errors (with 422 http status code) these are the error codes may be returned:

CodeDescription
40012003Contract can't be transferred to wallet address that already owns this collection.
40012004Transfer transaction already exists.
40300000Not allowed to access collection
50012002Collection doesn't exist, wasn't deployed or was already transferred.
50012004Collection transfer failed.

Response

Response payload is described under Response Fields above.

curl --location 'https://api.apillon.io/nfts/collections/:uuid/transfer' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic :credentials' \
--data '{"address": "0x452101C96A1Cf2cBDfa5BB5353e4a7F235241551"}'
{
  "id": "b5935c73-204d-4365-9f9a-6a1792adab5b",
  "status": 200,
  "data": {
    "createTime": "2023-06-13T10:15:58.000Z",
    "updateTime": "2023-06-13T10:15:58.000Z",
    "collectionType": 1,
    "collectionUuid": "d6355fd3-640d-4803-a4d9-79d875abcb5a",
    "symbol": "NFT",
    "name": "NFT Collection",
    "description": "NFT Collection Description",
    "maxSupply": 1000,
    "bucketUuid": "a9425ff7-4802-4a38-b771-84a790112c30",
    "baseUri": "https://ipfs.apillon.io/metadata/",
    "baseExtension": ".json",
    "isSoulbound": false,
    "isRevokable": true,
    "royaltiesFees": 0.1,
    "royaltiesAddress": "0x4156edbafc5091507de2dd2a53ded551a346f83b",
    "collectionStatus": 0,
    "contractAddress": "0x452101C96A1Cf2cBDfa5BB5353e4a7F235241557",
    "transactionHash": "0x6b97424de3367cd0335b08265787b83053b62bee2d1c8bec1f776936bea4fb26",
    "deployerAddress": "0x4156edbafc5091507de2dd2a53ded551a346f83b",
    "chain": 1287,
    "drop": true,
    "dropStart": 1687251003,
    "dropPrice": 0.1,
    "dropReserve": 5
  }
}

Mint Collection NFTs

Mint specified amount of NFTs to a wallet address provided in request.

Note: if the collection is set as drop this endpoint can only mint reserved NFTs.

POST/nfts/collections/:uuid/mint

URL parameters

NameDescriptionRequired
uuidUnique key of collection. Key is displayed in developer dashboard.true

Body fields

NameTypeDescriptionRequired
receivingAddressstringWallet address of NFT receiver.true
quantitynumberNumber of NFTs to mint.true

Possible errors

Beside validation errors (with 422 http status code) these are the error codes may be returned:

CodeDescription
40300000Not allowed to access collection.
50012002Collection doesn't exist, wasn't deployed or was already transferred.
50012005Error minting NFT.
50012007Total number of minted NFTs would exceed max supply for this collection.
50012008All of the reserved NFTs were already minted.

Response Fields

FieldTypeDescription
successbooleanStatus of action.
curl --location 'https://api.apillon.io/nfts/collections/:uuid/mint' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic :credentials' \
--data '{"receivingAddress": "0x452101C96A1Cf2cBDfa5BB5353e4a7F235241557", "quantity": 1}'
{
  "id": "b5935c73-204d-4365-9f9a-6a1792adab5b",
  "status": 200,
  "data": {
    "success": true
  }
}

Nest Mint Collection NFTs

Nest mint specified amount of NFTs under a parent NFT defined by the parent collection UUID and token id.

POST/nfts/collections/:uuid/nest-mint

URL parameters

NameDescriptionRequired
uuidUnique key of (child) collection we are minting.true

Body fields

NameTypeDescriptionRequired
parentCollectionUuidstringCollection UUID of NFT receiving nest-minted NFT.true
parentNftIdnumberToken id of NFT receiving nest-minted NFT.true
quantitynumberNumber of NFTs to nest-mint.true

Possible errors

Beside validation errors (with 422 http status code) these are the error codes may be returned:

CodeDescription
40300000Not allowed to access collection.
50012002Collection doesn't exist, wasn't deployed or was already transferred.
50012007Total number of minted NFTs would exceed max supply for this collection.
50012008All of the reserved NFTs were already minted.
50012013Parrent collection doesn't support nesting.
50012014Parrent and child collection chain missmatch.

Response Fields

FieldTypeDescription
successbooleanStatus of action.
curl --location 'https://api.apillon.io/nfts/collections/:uuid/next-mint' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic :credentials' \
--data '{"parentCollectionUuid": "d6355fd3-640d-4803-a4d9-79d875abcb5a", "parentNftId": 1, "quantity": 1}'
{
  "id": "b5935c73-204d-4365-9f9a-6a1792adab5b",
  "status": 200,
  "data": {
    "success": true
  }
}

Burn Collection NFT

Burn specific NFT belonging to collection specified.

Note: burning NFTs is only available if isRevokable is enabled on collection.

POST/nfts/collections/:uuid/burn

URL parameters

NameDescriptionRequired
uuidUnique key of collection. Key is displayed in developer dashboard.true

Body fields

NameTypeDescriptionRequired
tokenIdnumberNon fungible token id that we are burning.true

Possible errors

Beside validation errors (with 422 http status code) these are the error codes may be returned:

CodeDescription
40300000Not allowed to access collection.
50012002Collection doesn't exist, wasn't deployed or was already transferred.
50012012Burning NFT failed.

Response fields

FieldTypeDescription
successbooleanStatus of action.
curl --location 'https://api.apillon.io/nfts/collections/:uuid/burn' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic :credentials' \
--data '{"tokenId": 1}'
{
  "id": "b5935c73-204d-4365-9f9a-6a1792adab5b",
  "status": 200,
  "data": {
    "status": true
  }
}