IT Glue Configurations — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited IT Glue Configurations (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Configurations in IT Glue represent trackable assets such as servers, workstations, network devices, printers, and more. They serve as the central repository for asset documentation, enabling technicians to quickly find device information, network details, warranty status, and related documentation.
Configuration types classify assets at the highest level:
| Type | Description | Examples |
|---|---|---|
| Server | Physical or virtual servers | Domain controllers, file servers, application servers |
| Workstation | End-user devices | Desktops, laptops |
| Network Device | Network infrastructure | Routers, switches, firewalls, access points |
| Printer | Print devices | Network printers, multifunction devices |
| Mobile Device | Portable devices | Tablets, phones |
| Domain | Internet domains | Primary domains, subdomains |
| SSL Certificate | Security certificates | Web certificates, code signing |
| Cloud Service | Cloud subscriptions | Microsoft 365, AWS, Azure |
| Software | Software licenses | Application licenses |
| Other | Miscellaneous | UPS, cameras, IoT devices |
| Status | Description | Business Logic |
|---|---|---|
| Active | Currently in use | Standard operational state |
| Inactive | Not currently in use | Spare or standby equipment |
| Decommissioned | End of life | Historical record only |
| Missing | Cannot locate | Requires investigation |
Network interfaces associated with a configuration:
Configuration: DC-01 (Server)
├── Interface: Ethernet0 (192.168.1.10, AA:BB:CC:DD:EE:01)
├── Interface: Ethernet1 (10.0.0.10, AA:BB:CC:DD:EE:02)
└── Interface: iLO (192.168.100.10, AA:BB:CC:DD:EE:03)| Field | Type | Required | Description |
|---|---|---|---|
id | integer | System | Auto-generated unique identifier |
organization-id | integer | Yes | Parent organization |
name | string | Yes | Display name |
hostname | string | No | Network hostname |
configuration-type-id | integer | No | Type classification |
configuration-status-id | integer | No | Status classification |
| Field | Type | Description |
|---|---|---|
manufacturer-id | integer | Manufacturer reference |
model-id | integer | Model reference |
serial-number | string | Serial number |
asset-tag | string | Internal asset tag |
| Field | Type | Description |
|---|---|---|
primary-ip | string | Primary IP address |
mac-address | string | Primary MAC address |
default-gateway | string | Default gateway |
installed-by | string | Installer name |
| Field | Type | Description |
|---|---|---|
purchased-at | date | Purchase date |
installed-at | date | Installation date |
warranty-expires-at | date | Warranty expiration |
| Field | Type | Description |
|---|---|---|
notes | string | Detailed notes (HTML) |
operating-system-notes | string | OS-specific notes |
| Field | Type | Description |
|---|---|---|
psa-id | string | PSA configuration item ID |
psa-integration-type | string | PSA platform type |
rmm-id | string | RMM agent/device ID |
rmm-integration-type | string | RMM platform type |
GET /configurations
x-api-key: YOUR_API_KEY
Content-Type: application/vnd.api+jsonBy Organization:
GET /organizations/123/relationships/configurationsWith Filters:
GET /configurations?filter[organization-id]=123&filter[configuration-type-id]=456&filter[configuration-status-id]=1With Pagination:
GET /configurations?page[size]=100&page[number]=1&sort=nameGET /configurations/789
x-api-key: YOUR_API_KEYWith Includes:
GET /configurations/789?include=organization,configuration-interfaces,related-itemsPOST /configurations
Content-Type: application/vnd.api+json
x-api-key: YOUR_API_KEYServer Example:
{
"data": {
"type": "configurations",
"attributes": {
"organization-id": 123456,
"name": "DC-01",
"hostname": "dc-01.acme.local",
"configuration-type-id": 12,
"configuration-status-id": 1,
"primary-ip": "192.168.1.10",
"serial-number": "ABC123456789",
"notes": "<p>Primary domain controller for Acme Corporation</p>"
}
}
}Workstation Example:
{
"data": {
"type": "configurations",
"attributes": {
"organization-id": 123456,
"name": "WS-JSMITH",
"hostname": "ws-jsmith.acme.local",
"configuration-type-id": 15,
"configuration-status-id": 1,
"primary-ip": "192.168.1.150",
"asset-tag": "ACME-WS-0042",
"notes": "<p>User: John Smith (Sales)</p>"
}
}
}PATCH /configurations/789
Content-Type: application/vnd.api+json
x-api-key: YOUR_API_KEY{
"data": {
"type": "configurations",
"attributes": {
"primary-ip": "192.168.1.20",
"notes": "<p>Updated IP after network migration</p>"
}
}
}DELETE /configurations/789
x-api-key: YOUR_API_KEYBy Hostname:
GET /configurations?filter[hostname]=dc-01By Serial Number:
GET /configurations?filter[serial-number]=ABC123By IP Address:
GET /configurations?filter[primary-ip]=192.168.1.10By PSA ID:
GET /configurations?filter[psa-id]=54321GET /configurations/789/relationships/configuration-interfacesPOST /configuration-interfaces
Content-Type: application/vnd.api+json{
"data": {
"type": "configuration-interfaces",
"attributes": {
"configuration-id": 789,
"name": "Ethernet0",
"ip-address": "192.168.1.10",
"mac-address": "AA:BB:CC:DD:EE:FF",
"primary": true,
"notes": "Primary LAN interface"
}
}
}GET /configurations/789/relationships/related-itemsPOST /related-items
Content-Type: application/vnd.api+json{
"data": {
"type": "related-items",
"attributes": {
"resource-id": 789,
"resource-type": "Configuration",
"destination-id": 456,
"destination-type": "Configuration",
"notes": "VM hosted on this hypervisor"
}
}
}async function onboardAsset(orgId, assetData) {
// Step 1: Create configuration
const config = await createConfiguration({
'organization-id': orgId,
name: assetData.name,
hostname: assetData.hostname,
'configuration-type-id': assetData.typeId,
'configuration-status-id': ACTIVE_STATUS,
'primary-ip': assetData.ip,
'serial-number': assetData.serialNumber,
'asset-tag': assetData.assetTag,
'purchased-at': assetData.purchaseDate,
'warranty-expires-at': assetData.warrantyDate,
notes: assetData.notes
});
// Step 2: Add network interfaces
for (const iface of assetData.interfaces || []) {
await createInterface({
'configuration-id': config.id,
name: iface.name,
'ip-address': iface.ip,
'mac-address': iface.mac,
primary: iface.primary
});
}
// Step 3: Create relationships if applicable
if (assetData.hostServer) {
await createRelatedItem({
'resource-id': config.id,
'resource-type': 'Configuration',
'destination-id': assetData.hostServer,
'destination-type': 'Configuration',
notes: 'Hosted on this server'
});
}
return config;
}async function getExpiringWarranties(daysAhead = 90) {
const futureDate = new Date();
futureDate.setDate(futureDate.getDate() + daysAhead);
const today = new Date().toISOString().split('T')[0];
const future = futureDate.toISOString().split('T')[0];
// Note: IT Glue doesn't support date range filters directly
// Fetch all and filter client-side
const configs = await fetchConfigurations({
filter: { 'configuration-status-id': ACTIVE_STATUS }
});
return configs
.filter(c => {
const warranty = c.attributes['warranty-expires-at'];
return warranty && warranty >= today && warranty <= future;
})
.map(c => ({
name: c.attributes.name,
organization: c.relationships.organization.data.id,
warrantyExpires: c.attributes['warranty-expires-at'],
daysRemaining: Math.ceil(
(new Date(c.attributes['warranty-expires-at']) - new Date()) / (1000 * 60 * 60 * 24)
)
}))
.sort((a, b) => a.daysRemaining - b.daysRemaining);
}async function decommissionAsset(configId, reason) {
// Update status
await updateConfiguration(configId, {
'configuration-status-id': DECOMMISSIONED_STATUS,
notes: `<p><strong>Decommissioned:</strong> ${new Date().toLocaleDateString()}</p>
<p><strong>Reason:</strong> ${reason}</p>`
});
// Add note about decommissioning
return { status: 'decommissioned', configId, reason };
}async function generateNetworkInventory(orgId) {
const configs = await fetchConfigurations({
filter: {
'organization-id': orgId,
'configuration-status-id': ACTIVE_STATUS
},
include: 'configuration-interfaces'
});
return configs.map(config => ({
name: config.attributes.name,
hostname: config.attributes.hostname,
type: config.relationships['configuration-type']?.data?.id,
primaryIp: config.attributes['primary-ip'],
interfaces: config.relationships['configuration-interfaces']?.data?.map(iface => ({
name: iface.attributes.name,
ip: iface.attributes['ip-address'],
mac: iface.attributes['mac-address']
})) || []
}));
}| Code | Message | Resolution |
|---|---|---|
| 400 | Name can't be blank | Provide configuration name |
| 400 | Organization required | Include organization-id |
| 401 | Invalid API key | Check IT_GLUE_API_KEY |
| 404 | Configuration not found | Verify configuration ID |
| 422 | Invalid type ID | Query valid type IDs first |
| Error | Cause | Fix |
|---|---|---|
| Name required | Missing name | Add name to request |
| Organization required | No org ID | Include organization-id |
| Invalid type | Bad type ID | Query /configuration-types |
| Invalid status | Bad status ID | Query /configuration-statuses |
| Invalid IP format | Malformed IP | Use valid IPv4/IPv6 format |
async function safeCreateConfiguration(data) {
try {
return await createConfiguration(data);
} catch (error) {
if (error.status === 422) {
const errors = error.errors || [];
// Handle missing type
if (errors.some(e => e.detail?.includes('configuration-type'))) {
const types = await getConfigurationTypes();
console.log('Valid configuration types:', types);
}
// Handle duplicate
if (errors.some(e => e.detail?.includes('already been taken'))) {
return await findConfigurationByName(data['organization-id'], data.name);
}
}
throw error;
}
}~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.