Delete an asset
curl --request DELETE \
--url https://api-eu.flexportal.io/v1/assets/{serialNumber} \
--header 'Authorization: Bearer <token>' \
--header 'Tenant-ID: <tenant-id>'import requests
url = "https://api-eu.flexportal.io/v1/assets/{serialNumber}"
headers = {
"Tenant-ID": "<tenant-id>",
"Authorization": "Bearer <token>"
}
response = requests.delete(url, headers=headers)
print(response.text)const options = {
method: 'DELETE',
headers: {'Tenant-ID': '<tenant-id>', Authorization: 'Bearer <token>'}
};
fetch('https://api-eu.flexportal.io/v1/assets/{serialNumber}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-eu.flexportal.io/v1/assets/{serialNumber}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Tenant-ID: <tenant-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-eu.flexportal.io/v1/assets/{serialNumber}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("Tenant-ID", "<tenant-id>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://api-eu.flexportal.io/v1/assets/{serialNumber}")
.header("Tenant-ID", "<tenant-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-eu.flexportal.io/v1/assets/{serialNumber}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["Tenant-ID"] = '<tenant-id>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"serialNumber": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Assets
Delete Asset
Soft deletes an asset by setting status to unavailable.
DELETE
/
v1
/
assets
/
{serialNumber}
Delete an asset
curl --request DELETE \
--url https://api-eu.flexportal.io/v1/assets/{serialNumber} \
--header 'Authorization: Bearer <token>' \
--header 'Tenant-ID: <tenant-id>'import requests
url = "https://api-eu.flexportal.io/v1/assets/{serialNumber}"
headers = {
"Tenant-ID": "<tenant-id>",
"Authorization": "Bearer <token>"
}
response = requests.delete(url, headers=headers)
print(response.text)const options = {
method: 'DELETE',
headers: {'Tenant-ID': '<tenant-id>', Authorization: 'Bearer <token>'}
};
fetch('https://api-eu.flexportal.io/v1/assets/{serialNumber}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-eu.flexportal.io/v1/assets/{serialNumber}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Tenant-ID: <tenant-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-eu.flexportal.io/v1/assets/{serialNumber}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("Tenant-ID", "<tenant-id>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://api-eu.flexportal.io/v1/assets/{serialNumber}")
.header("Tenant-ID", "<tenant-id>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-eu.flexportal.io/v1/assets/{serialNumber}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["Tenant-ID"] = '<tenant-id>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"serialNumber": "<string>"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Overview
Remove an asset from your inventory. This is a soft delete—the asset is marked as unavailable rather than permanently removed, preserving historical data for reporting and auditing.Assets that are currently assigned to active subscriptions cannot be deleted. End or cancel the subscription first.
What Happens When You Delete
- Asset status changes to
unavailable - Asset removed from available inventory queries
- Historical records preserved (subscriptions, payments)
- Cannot be assigned to new subscriptions
Common Use Cases
- Sold Assets: Device was sold to customer (buyout)
- Retired Inventory: Device too old or damaged for reuse
- Lost/Stolen: Device cannot be recovered
- Inventory Cleanup: Remove test or duplicate entries
Prerequisites
Before deleting:- No active subscriptions using this asset
- Asset returned (if previously rented)
async function canDeleteAsset(serialNumber) {
const asset = await getAsset(serialNumber);
if (asset.status === 'rented_out') {
return {
canDelete: false,
reason: 'Asset is currently rented',
currentSubscription: asset.rentalId,
currentCustomer: asset.customerId
};
}
return { canDelete: true };
}
Example: Delete with Reason
async function retireAsset(serialNumber, reason) {
// First, update with reason for audit trail
await updateAsset(serialNumber, {
notes: `Retired: ${reason}`,
status: 'unavailable'
});
// Then delete
await deleteAsset(serialNumber);
return { retired: true, serialNumber, reason };
}
// Usage
await retireAsset('SN123456789', 'End of life - 5 years old');
await retireAsset('SN987654321', 'Sold to customer via buyout');
Alternative: Mark Unavailable
If you want to preserve the asset record but remove from active inventory, consider updating status instead:// Instead of deleting:
await updateAsset(serialNumber, {
status: 'unavailable',
condition: 'Retired - end of service life',
notes: 'Removed from fleet January 2025'
});
Recovering Deleted Assets
Since deletion is a soft delete, you can reactivate assets:PATCH /v1/assets/{serialNumber}
{
"status": "available",
"notes": "Reactivated after repair"
}
Error Handling
| Error Code | Cause | Solution |
|---|---|---|
NOT_FOUND | Serial number doesn’t exist | Verify serial number |
ASSET_IN_USE | Asset has active subscription | End subscription first |
Related Endpoints
- Get Asset - Check asset status before deletion
- Update Asset - Alternative: mark unavailable
- List Assets - Find assets to delete
Authorizations
API key obtained from FlexPortal dashboard
Headers
Your tenant identifier
Path Parameters
The asset serial number
Was this page helpful?