> For the complete documentation index, see [llms.txt](https://docs.aevo.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.aevo.xyz/api-reference/api-key-setup/api-key-setup-api.md).

# Via API

A new API key can generated by calling the `/register` endpoint.

The endpoint requires the following parameters:

* `account`: the account's Ethereum address
* `signing_key`: a randomly generated Ethereum address
* `expiry`: UNIX timestamp in nanoseconds
* `account_signature`: signature generated using the `account`'s private key
* `signing_key_signature`: signature generated using the `signing_key`'s private key

To generate the `signing_key`, `account_signature` and `signing_key_signature`, you can follow the example code below:

1. Generate `signing_key`:

```javascript
const signer = ethers.Wallet.createRandom()
```

2. Generate `account_signature`:

```javascript
// First we hash the register data
const registerHash = ethers.utils._TypedDataEncoder.hash(
    {
      name: "Aevo Mainnet",
      version: "1",
      chainId: 1,
    },
    {
      Register: [
        { name: "key", type: "address" },
        { name: "expiry", type: "uint256" },
      ],
    },
    {
      key: await signer.getAddress(),
      expiry: ethers.constants.MaxUint256.toString(),
    }
);

// Then we sign the hash
const res = await promisify(provider.provider.sendAsync)({
  method: "eth_sign",
  params: [account.toLowerCase(), registerHash],
});

// This is the account_signature
const accountSignature = res.result;
```

3. Generate `signing_key_signature`:

```javascript
// This is the signing_key_signature
const signingKeySignature = await signer._signTypedData(
    {
      name: "Aevo Mainnet",
      version: "1",
      chainId: 1,
    },
    {
      SignKey: [{ name: "account", type: "address" }],
    },
    {
      account: your_wallet_address
    }
);
```
