# Create NFTs from the backend on Solana

We have already seen how we can [create NFTs from the front end using SHYFT APIs](https://docs.shyft.to/tutorials/build-your-first-nft-dapp) efficiently. Sometimes, we may have a different use-case scenario where we have all the data available in the backend and we have to create the NFT directly from the backend. This tutorial shows one such use-case scenario where we create NFTs directly from the backend using SHYFT APIs.

## Pre-requisites <a href="#id-8a9e" id="id-8a9e"></a>

**Authentication: Getting your Shyft API key**

`x-api-key` is an authentication parameter, which gives you access to SHYFT APIs. You can get your own API Key from the [SHYFT website](https://shyft.to/get-api-key). Just signup with your email id [here](https://shyft.to/get-api-key) and you can get it for free.

**NPM Packages Required**

* path — This package is used to read the image from a specified path.
* axios — This package is used to make the API call, you can also use any other method or package as per your requirement.

## The API call <a href="#id-0d1b" id="id-0d1b"></a>

For creating NFTs from the backend. we will use the following API :

```
POST https://api.shyft.to/sol/v1/nft/create
```

This API accepts the following details of the NFT that is to be created in `multipart/form-data` format:

* `network`: Specifies the Solana network instance, which can be devnet, testnet or mainnet-beta.
* `name`: Name of the NFT to be created.
* `symbol`: Symbol of the NFT to be created.
* `description`: A short description about the NFT that we are creating.
* `attributes`: Accepts the NFT attributes according to their trait-type and value. Check below sample for the format.
* `external_url`: any external URL associated with the NFT.
* `max_supply`: Number of editions of the currently created NFT that can be minted. If set to `0`, creates one-of-a-kind NFTs.
* `royalty`: Specifies the creator royalty in percentage, a value between 0 - 100.
* `nft_receiver`: Specifies the wallet to which the NFT will be minted, if left blank, will be minted to the wallet whose `private_key` has been provided.
* `service_charge`: Specifies an amount in SOL, which can be charged while creating the NFTs
* `private_key`: Private Key of the user who is attempting to create the NFT.

For more details about our APIs, check out [SHYFT’s API Documentation](https://docs.shyft.to/) or you can also check out our postman documentation [here](https://documenter.getpostman.com/view/18419720/UzQvt5Kf).

Assuming we have all the data available in the backend, let’s create a new `FormData object` and append all the data required to create the NFT. (we have used static data for demo purposes)

```javascript
const data = new FormData();
  
data.append('network', 'devnet');
data.append('name', 'GirlDrags');
data.append('symbol', 'GDG');
data.append('description', 'hair on fire problem solving');
data.append('attributes', '[{"trait_type": "speed", "value": 100},\\n{"trait_type": "aggression", "value": "crazy"},\\n{"trait_type": "energy", "value": "very high"}]');
data.append('external_url', 'https://shyft.to/');
data.append('max_supply', '1');
data.append('royalty', '10');
data.append('file', fs.createReadStream(path.resolve(__dirname, './images/index.png')));
data.append('nft_receiver', '5KW2twHzRsAaiLeEx4zYNV35CV2hRrZGw7NYbwMfL4a2');
data.append('service_charge', '{ "receiver": "2fmz8SuNVyxEP6QwKQs6LNaT2ATszySPEJdhUDesxktc", "amount": 0.1 }');
data.append('private_key', YOUR-PRIVATE-KEY);
```

## Sending Image Data <a href="#id-9374" id="id-9374"></a>

Note that, we have used the `createReadStream` function, with the image path to open and read the data in the file/stream. the function `path.resolve()` has been used to resolve the relative path provided for the image. Alternatively, for using absolute paths such as 'D:/index.png’, we will have to use the `path.join()` function.

```
data.append('file', fs.createReadStream(path.join('D:/index.png')));
```

We can also get the image data in a readable stream format from an external URI, but for that, we would require a few extra steps. First, we will have to fetch the image data in a readable stream format, somewhat like this

```
const imgData = await axios.get('https://www.arweave.net/GZtct3fpYUlB9ZT92SMkVEp7TUvLlFV-kke4f5I5D9E?ext=jpg', { responseType: 'stream' });
```

Once this request has been executed successfully, we go on and append the `imgData.data` to the FormData object, so that it can be passed on as a parameter for making the create NFT API call.

```
data.append('file', imgData.data, 'test.jpg');
```

Once done, now we are ready to make the API call. We have used the `axios` package to make the API call, but you can use any other method as per your requirement. Also, note that we have to set the `Content_type` to `multipart/form-data` in the header, and we have to pass the `x-api-key` obtained from the [SHYFT website](https://shyft.to/get-api-key).

Here is the API call:

```javascript
const response = await axios.post('https://api.shyft.to/sol/v1/nft/create', data, { headers: {
    'Content-Type': 'multipart/form-data',
    'x-api-key': YOUR_API_KEY,
  } });
console.log('data', response.data); // displaying the response
```

Once successfully executed, it should return a response somewhat similar to this. The `mint` returned in the response is the NFT address of the NFT just created.

```json
data {
  success: true,
  message: 'NFT created successfully',
  result: {
    txId: '4gs1ffsGHtvxLKV4D6vmTUfjNvisPS82iJjB8DNyeKmL9cUBX8VKvkFUX3nXtUUUNcA5TQ8vZzu5GaoT7CeEwWpp',
    mint: '7LjUNQ9gDydqy5kbVppFomNSRnRnE8cgf8zvFRHp39nz',
    metadata: '4W333HyXhLsX16rZYaHgUbfapv6dTB9KtFqpMSdcMsx9',
    edition: '9WbVRGgHRCXNTA8WfU31AussJxRSptW8Vyic2RaFafSh'
  }
}
```

That’s pretty much everything about this tutorial. If you follow this tutorial step by step, you will be able to create a new NFT successfully from the backend.

If you enjoyed this tutorial, please feel free to check out our API tutorials on [Building your first NFT dApp](https://docs.shyft.to/tutorials/build-your-first-nft-dapp) or [Building your own NFT marketplace](https://medium.com/shyft-to/build-your-first-nft-marketplace-2e52f24ae7ec).

## Resources <a href="#id-35ff" id="id-35ff"></a>

[SHYFT API Documentation](https://docs.shyft.to/)

[Shyft Website](https://shyft.to/)

[Get API Key](https://shyft.to/get-api-key)

[GitHub](https://github.com/Shyft-to)

Join our [Discord](https://discord.com/invite/VS5ThWVRMn)

Hope you have a great time building dApps with [SHYFT](https://shyft.to/) APIs. Happy Hacking!! 😇

<br>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.shyft.to/dev-guides/solana/nfts/create-nfts-from-the-backend-on-solana.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
