# API Quickstart

### Prerequisite

* You need to signup PLYR\[ID] first on both [Mainnet ](https://pgu.plyr.network/signup/)and [Testnet](https://pgu-testnet.vercel.app/dashboard/). This PLYR\[ID] gonna be a "Developer account and Game ID". Please set a name to be related with your game name.
* API KEY and SECRET KEY — After you signup the PLYR\[ID]. You can request us to generate API KEY Pair.

### **Basic to Call our API**

We use **"Timestamp + Body Payload"** and signs with **SECRET KEY** as  a **HMAC (SHA256) signature**. You need to include custom header apikey, signature, timestamp every time to call our API.

## Base Headers

Every API request must include these base headers:

```typescript
{
    apikey: string; // Your API key obtained from the developer portal
    signature: string; // HMAC signature of the request
    timestamp: string; // Current timestamp in milliseconds (Date.now().toString())
}
```

## Header Requirements

Format Requirements:

```
- Headers are case-sensitive
- Values must be strings
- Timestamp must be in milliseconds
```

## HMAC Signature Generation

```typescript
// Example signature generation
const timestamp = Date.now().toString();
const payload = JSON.stringify(requestBody);
const message = timestamp + payload;
const signature = crypto.createHmac('sha256', secretKey).update(message).digest('hex');
```

{% hint style="warning" %}
Always keep your API key and secret key secure. Never expose them in client-side code or public repositories.
{% endhint %}

### **Example 1: GET Method API without Body Payload.**

Let see the example of "userInfo" API endpoint.

{% tabs %}
{% tab title="Javascript" %}

```javascript
// Generate HMAC signature from timestamp + body //
const crypto = require('crypto');
const axios = require("axios");

const APIKEY = ''; // your api key
const SECRETKEY = ''; // you api secret key 

function generateHmacSignature(timestamp, body, secretkey) {
  const bodyString = JSON.stringify(body);
  const data = timestamp + bodyString;
  return crypto
    .createHmac('sha256', secretkey)
    .update(data)
    .digest('hex');
}

const timestamp = Date.now().toString();
const apiEndpoint = 'https://api-testnet.plyr.network/api';
const searchText = 'cyptofennec'; // PLYR[ID]
let hmac = generateHmacSignature(timestamp, {}, SECRETKEY); // If API required body payload (POST method) just pass the object //
let ret = await axios.get(
            apiEndpoint + "/api/user/info/" + searchTxt + '/',
            {
                headers: {
                    apikey: APIKEY,
                    signature: hmac,
                    timestamp: timestamp,
                },
            }
        );
console.log("ret data",ret.data);
```

{% endtab %}

{% tab title="Result" %}

```json
{
  plyrId: "cyptofennec",
  mirrorAddress: "0x4eaf4CE71c42758b2D4B4C23E543e1D98c8dE9C6",
  primaryAddress: "0x6Ab499c8E2f3CBc9C99034b6e2912149212bE770",
  chainId: 62831,
  avatar: "https://ipfs.plyr.network/ipfs/QmfMhXz8vqBDMHVVstnK8tykmhAN6oXv5xZunC3SXR1NWL",
  createdAt: "2024-08-05T12:48:30.429Z",
  ippClaimed: false,
  isIPP: false
}
```

{% endtab %}
{% endtabs %}

### **Example 2: POST Method API with Body Payload.**

Let see the example of "getAvatars" API endpoint.

{% tabs %}
{% tab title="Javascript" %}

```javascript
// Generate HMAC signature from timestamp + body //
const crypto = require('crypto');
const axios = require("axios");

const APIKEY = ''; // your api key
const SECRETKEY = ''; // you api secret key 

function generateHmacSignature(timestamp, body, secretkey) {
  const bodyString = JSON.stringify(body);
  const data = timestamp + bodyString;
  return crypto
    .createHmac('sha256', secretkey)
    .update(data)
    .digest('hex');
}

const timestamp = Date.now().toString();
const apiEndpoint = 'https://api-testnet.plyr.network/api';
let body = {
    plyrIds: ['fennec2', 'cyptofennec']
}
let hmac = generateHmacSignature(timestamp, body, SECRETKEY);
let ret = await axios.post(
            apiEndpoint + "/api/user/avatars",
            body,
            {
                headers: {
                    apikey: APIKEY,
                    signature: hmac,
                    timestamp: timestamp,
                },
            }
        );
console.log("ret data",ret.data);
```

{% endtab %}

{% tab title="Result" %}

```json
{
  avatars: [
    {
      plyrId: "cyptofennec",
      avatar: "https://ipfs.plyr.network/ipfs/QmfMhXz8vqBDMHVVstnK8tykmhAN6oXv5xZunC3SXR1NWL"
    },
    {
      plyrId: "fennec2",
      avatar: "https://ipfs.plyr.network/ipfs/QmYHv8HJ6SDGbGkMDwfVfXehpNNGvPrB8W2dXnd26CpPYL"
    }
  ]
}
```

{% endtab %}
{% endtabs %}


---

# 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://dev.plyr.network/api-quickstart.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.
