# Floating Features

### Floating Features

* Floating feature registration using `/featureRegister` and `/check_license_feature`
* Floating feature release using `/featureRelease` and `/feature_release`
* Releasing all floating feature registrations using `/featureRelease/all` and `/feature_release/all`

### Offline Floating Feature

Starting from release v1.4.11, the floating server supports offline floating features. This allows customers to add offline floating features to a product and licenses built for that product. These can then be imported into the floating server, enabling registration and release of users entirely offline on premises.

To add these features to a product, navigate to the product within the vendor platform, select the "Features" tab, and click "Add Product Feature". In the popup window, after specifying the feature's name, code, and other details, check the "Offline Floating Feature" checkbox.

![Offline Floating Feature option in the feature creation form](https://api.archbee.com/api/optimize/IJdHyjBlO9LOXOrDnWJTx/vvWokL6xPVPadp6mSukXN_image.png)

The API endpoints associated with floating features are described below.

***

### Feature Register

Registers a user to a specific feature of a license on the Floating Server. Requires a username, product code, and feature code.

Endpoint POST <http://localhost:8080/api/v4/featureRegister>

Examples

{% tabs %}
{% tab title="javascript" %}
{% code title="featureRegister (JS)" %}

```javascript
var myHeaders = new Headers();
myHeaders.append("Accept", "application/json");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
  "product": "test",
  "feature": "testingFeature",
  "user": "testUser",
  "os_hostname": "",
  "ip_local": "0.1.1.1",
  "user_info": "",
  "registered_at": "2024-08-26T12:21:59.776731-07:00",
  "borrowed_until": "0001-01-01T00:00:00Z"
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("http://localhost:8080/api/v4/featureRegister", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
```

{% endcode %}
{% endtab %}

{% tab title="curl" %}
{% code title="featureRegister (curl)" %}

```bash
curl -X POST "http://localhost:8080/api/v4/featureRegister" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
  "product": "test",
  "feature": "testingFeature",
  "user": "testUser",
  "os_hostname": "",
  "ip_local": "0.1.1.1",
  "user_info": "",
  "registered_at": "2024-08-26T12:21:59.776731-07:00",
  "borrowed_until": "0001-01-01T00:00:00Z"
}'
```

{% endcode %}
{% endtab %}
{% endtabs %}

Possible responses

* 200 (example payload)

```json
{
  "product": "test",
  "feature": "testingFeature",
  "user": "testUser",
  "os_hostname": "",
  "ip_local": "0.1.1.1",
  "user_info": "",
  "registered_at": "2024-08-26T12:21:59.776731-07:00",
  "borrowed_until": "0001-01-01T00:00:00Z"
}
```

* 400 (feature not found)

```json
{
  "code": "feature_not_found",
  "message": "Feature color not found for product test",
  "status": 400
}
```

Request body parameters

* product (required, String) — product code of the target product
* feature (required, string) — feature code of the target feature
* user (required, string) — name or id of the user to be registered
* os\_hostname (required, string)
* ip\_local (required, string)
* user\_info (required, string)
* registered\_at (required, string)
* borrowed\_until (required, string)

***

### Feature Release

Releases a user who has been registered to a specific feature of a license.

Endpoint POST <http://localhost:8080/api/v4/featureRelease>

Examples

{% tabs %}
{% tab title="javascript" %}
{% code title="featureRelease (JS)" %}

```javascript
var myHeaders = new Headers();
myHeaders.append("Accept", "application/json");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
  "product": "test",
  "feature": "testingFeature",
  "user": "testUser",
  "os_hostname": "",
  "ip_local": "0.1.1.1",
  "user_info": "",
  "registered_at": "2024-08-26T12:21:59.776731-07:00",
  "borrowed_until": "0001-01-01T00:00:00Z"
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("http://localhost:8080/api/v4/featureRelease", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
```

{% endcode %}
{% endtab %}

{% tab title="curl" %}
{% code title="featureRelease (curl)" %}

```bash
curl -X POST "http://localhost:8080/api/v4/featureRelease" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
  "product": "test",
  "feature": "testingFeature",
  "user": "testUser",
  "os_hostname": "",
  "ip_local": "0.1.1.1",
  "user_info": "",
  "registered_at": "2024-08-26T12:21:59.776731-07:00",
  "borrowed_until": "0001-01-01T00:00:00Z"
}'
```

{% endcode %}
{% endtab %}
{% endtabs %}

Possible responses

* 200

```
"feature_released"
```

* 400 (feature not found)

```json
{
  "code": "feature_not_found",
  "message": "Feature color not found for product test",
  "status": 400
}
```

Request body parameters

* product (required, String) — product code of the target product
* feature (required, string) — feature code of the target feature
* user (required, string) — name or id of the user to be released
* os\_hostname (required, string)
* ip\_local (required, string)
* user\_info (required, string)
* registered\_at (required, string)
* borrowed\_until (required, string)

***

### Release All

Releases all users registered to all features across all licenses.

Endpoint GET <http://localhost:8080/api/v4/featureRelease/all>

Examples

{% tabs %}
{% tab title="javascript" %}
{% code title="featureRelease/all (JS)" %}

```javascript
var myHeaders = new Headers();
myHeaders.append("Accept", "application/json");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({});

var requestOptions = {
  method: 'GET',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("http://localhost:8080/api/v4/featureRelease/all", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
```

{% endcode %}
{% endtab %}

{% tab title="curl" %}
{% code title="featureRelease/all (curl)" %}

```bash
curl -X POST "http://localhost:8080/api/v4/featureRelease/all" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{}'
```

{% endcode %}
{% endtab %}
{% endtabs %}

Possible responses

* 200 (empty string)

```
""
```

***

### LicenseSpring-Compatible Floating Endpoints (since v1.6.2)

To align with LicenseSpring’s API, three endpoints were added with equivalent behavior but LicenseSpring-style routes.

* /check\_license\_feature — equivalent to /featureRegister (register user to a feature)
* /feature\_release — equivalent to /featureRelease (release a registered user)
* /feature\_release/all — equivalent to /featureRelease/all (release all registrations)

#### Feature Register (LicenseSpring-compatible)

Endpoint POST <http://localhost:8080/api/v4/check\\_license\\_feature>

Examples

{% tabs %}
{% tab title="javascript" %}
{% code title="check\_license\_feature (JS)" %}

```javascript
var myHeaders = new Headers();
myHeaders.append("Accept", "application/json");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
  "product": "test",
  "feature": "testingFeature",
  "user": "testUser",
  "os_hostname": "",
  "ip_local": "0.1.1.1",
  "user_info": "",
  "registered_at": "2024-08-26T12:21:59.776731-07:00",
  "borrowed_until": "0001-01-01T00:00:00Z"
});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("http://localhost:8080/api/v4/check_license_feature", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
```

{% endcode %}
{% endtab %}

{% tab title="curl" %}
{% code title="check\_license\_feature (curl)" %}

```bash
curl -X POST "http://localhost:8080/api/v4/check_license_feature" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
  "product": "test",
  "feature": "testingFeature",
  "user": "testUser",
  "os_hostname": "",
  "ip_local": "0.1.1.1",
  "user_info": "",
  "registered_at": "2024-08-26T12:21:59.776731-07:00",
  "borrowed_until": "0001-01-01T00:00:00Z"
}'
```

{% endcode %}
{% endtab %}
{% endtabs %}

Responses and request parameters are the same as /featureRegister.

#### Feature Release (LicenseSpring-compatible)

Endpoint POST <http://localhost:8080/api/v4/feature\\_release>

Examples

{% tabs %}
{% tab title="javascript" %}
{% code title="feature\_release (JS)" %}

```javascript
/* Example request body is identical to /featureRelease; same request flow */
```

{% endcode %}
{% endtab %}

{% tab title="curl" %}
{% code title="feature\_release (curl)" %}

```bash
curl -X POST "http://localhost:8080/api/v4/feature_release" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
  "product": "test",
  "feature": "testingFeature",
  "user": "testUser",
  "os_hostname": "",
  "ip_local": "0.1.1.1",
  "user_info": "",
  "registered_at": "2024-08-26T12:21:59.776731-07:00",
  "borrowed_until": "0001-01-01T00:00:00Z"
}'
```

{% endcode %}
{% endtab %}
{% endtabs %}

Responses and request parameters are the same as /featureRelease.

#### Release All Features (LicenseSpring-compatible)

Endpoint GET <http://localhost:8080/api/v4/feature\\_release/all>

Examples

{% tabs %}
{% tab title="javascript" %}
{% code title="feature\_release/all (JS)" %}

```javascript
/* Same behavior as /featureRelease/all; releases all floating feature registrations */
```

{% endcode %}
{% endtab %}

{% tab title="curl" %}
{% code title="feature\_release/all (curl)" %}

```bash
curl -X POST "http://localhost:8080/api/v4/feature_release/all" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{}'
```

{% endcode %}
{% endtab %}
{% endtabs %}

Responses are the same as /featureRelease/all.

***

If you need the examples in another language or format added as tabs, tell me which language(s) and I'll add them.


---

# 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.licensespring.com/floating-server/floating-server-v1/best-practices/floating-features.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.
