---
sidebar_position: 1
title: TypeScript SDK
---
} title="Official SDK">
This SDK is official and maintained by the Remnawave team.
Remnawave TypeScript SDK is a library for convenient interaction with the RestAPI types.
It does not contain http-client, so you need to implement it yourself.
This SDK can be used in backend and frontend.
import Admonition from '@theme/Admonition';
import { FaCheckCircle } from "react-icons/fa";
## Installation
```bash
npm install @remnawave/backend-contract
```
:::warning
Always pick and pin the correct version of the SDK to match the version of the Remnawave backend.
:::
| Contract Version | Remnawave Panel Version |
| ---------------- | ---------------------------------------- |
| 2.1.12 | 2.1.0 |
| 2.0.2 | 2.0.6, 2.0.7, 2.0.8 |
| 2.0.0 | 2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.0.5 |
| 0.7.26 | 1.6.14, 1.6.15, 1.6.16 |
| 0.7.21 | 1.6.13 |
| 0.7.19 | 1.6.12 |
| 0.7.16 | 1.6.11 |
| 0.7.16 | 1.6.11 |
| 0.7.16 | 1.6.10 |
| 0.7.16 | 1.6.9 |
| 0.7.16 | 1.6.8 |
| 0.7.16 | 1.6.7 |
| 0.7.16 | 1.6.6 |
| 0.7.13 | 1.6.5 |
| 0.7.13 | 1.6.4 |
| 0.7.13 | 1.6.3 |
| 0.7.1 | 1.6.2 |
| 0.7.1 | 1.6.1 |
| 0.7.0 | 1.6.0 |
| 0.4.5 | 1.5.7 |
| 0.3.71 | 1.5.0 |
## Usage
Example backend service, using Axios and NestJS
```typescript
import axios from 'axios'
import { Injectable, Logger } from '@nestjs/common'
import { ConfigService } from '@nestjs/config'
import { GetUserByUsernameCommand } from '@remnawave/backend-contract'
import { ICommandResponse } from '../types/command-response.type'
@Injectable()
export class AxiosService {
public axiosInstance: AxiosInstance
private readonly logger = new Logger(AxiosService.name)
constructor(private readonly configService: ConfigService) {
this.axiosInstance = axios.create({
baseURL: this.configService.getOrThrow('REMNAWAVE_PANEL_URL'),
timeout: 45_000,
headers: {
// highlight-next-line-green
'x-forwarded-for': '127.0.0.1', // use this headers to bypass the panel reverse proxy restrictions. So you can access the panel from bridge networks: http://remnawave:3000
// highlight-next-line-green
'x-forwarded-proto': 'https', // use this headers to bypass the panel reverse proxy restrictions. So you can access the panel from bridge networks: http://remnawave:3000
Authorization: `Bearer ${this.configService.get('REMNAWAVE_API_TOKEN')}`
}
})
const caddyAuthApiToken = this.configService.get('CADDY_AUTH_API_TOKEN')
if (caddyAuthApiToken) {
this.axiosInstance.defaults.headers.common['X-Api-Key'] = caddyAuthApiToken
}
}
public async getUserByUsername(
username: string
): Promise> {
try {
const response = await this.axiosInstance.request({
method: GetUserByUsernameCommand.endpointDetails.REQUEST_METHOD,
url: GetUserByUsernameCommand.url(username)
})
return {
isOk: true,
response: response.data
}
} catch (error) {
if (error instanceof AxiosError) {
this.logger.error('Error in Axios GetUserByUsername Request:', error.message)
return {
isOk: false
}
} else {
this.logger.error('Error in GetUserByUsername Request:', error)
return {
isOk: false
}
}
}
}
}
```
## Full examples
You can find full examples in the [Remnawave Frontend](https://github.com/remnawave/frontend) repository and in the [Remnawave Subscription page](https://github.com/remnawave/subscription-page) repository.