API Call
Squid supports HTTP GET requests and returns JSON.
Request
The URL is https://yourinstance/api/x_a46gh_squidx/v1/data/{configName} where {configName} is the name of the configuration you are requesting. Configurations define what data is returned—for example, cmdb_ci_server returns all server CIs. See Predefined Configurations for available configurations.
Query parameters refine requests: filter results, request specific entities, include relations, and toggle output features.
Try it: https://demo.squid46.io/cmdb_ci_server_minimal?limit=10
The demo server is proxied and rate limited. If you're getting HTTP 429s, slow down! (This is only an issue on the publicly available demo server.)
To keep URLs shorter and more readable, all links to https://demo.squid46.io omit the /api/x_a46gh_squidx/v1/data/ path segment.
Response
Before diving into query parameters, it helps to understand what Squid returns. Every response contains four sections:
- metadata — Request information, timing, and filter details
- data — Array of requested entities
- relations — Related entities, organized by parent sys_id
- referenced — Complete data for all referenced and related entities
This structure avoids data duplication: an entity referenced multiple times appears once in referenced.
Relations
Resolving references and relations is the added value of Squid. References are resolved by default and do not have to be explicitly requested. Relations require additional database queries and are only resolved if requested.
Squid supports three different types of relations:
See Predefined Relations for an overview of all predefined relations provided by Squid.
relations
Relations are requested as query parameter relations. Squid accepts this parameter in various formats:
relations=rel1,rel2,rel3relations=rel1&relations=rel2&relations=rel3relations=rel1,rel2&relations=rel3
Use whatever fits your calling application best.
Depending on your configurations, relations may be rendered in various ways:
Please see RenderTypes for Relations for details.
and
The key distinction is where related data appears in the response:
Relation
Relations are rendered not in the parent JSON object, but in a dedicated relations property.
See RenderType Relation* for details.
{
...,
"data": [
{
"asset_tag": "P1000182",
"last_discovered": "2024-07-12T11:21:50Z",
"name": "dbaix901nyc",
"sys_class_name": "cmdb_ci_unix_server",
"sys_id": "5f9b83bfc0a8010e005a2b3212c9dc07", <= sys_id of requested server
"sys_mod_count": 12,
"sys_updated_on": "2024-07-17T10:54:43Z"
}
],
"relations": {
"5f9b83bfc0a8010e005a2b3212c9dc07": { <= sys_id of requested server
"user_groups": [
{
"sys_id": "6577e5908f972410960c53ac37bdee66", <= sys_id of user group
"sys_class_name": "sys_user_group"
},
{
"sys_id": "b85d44954a3623120004689b2d5dd60a", <= sys_id of user group
"sys_class_name": "sys_user_group"
}
]
}
},
"referenced": {
"6577e5908f972410960c53ac37bdee66": { <= sys_id of user group
"active": true,
"name": "Infrastructure",
"sys_created_by": "admin",
"sys_created_on": "2021-03-30T18:56:30Z",
"sys_id": "6577e5908f972410960c53ac37bdee66",
"sys_mod_count": 0,
"sys_updated_by": "admin",
"sys_updated_on": "2021-03-30T18:56:30Z"
},
"b85d44954a3623120004689b2d5dd60a": { <= sys_id of user group
"active": true,
"description": "CAB approvers",
"name": "CAB Approval",
"sys_created_by": "admin",
"sys_created_on": "2011-09-30T16:30:34Z",
"sys_id": "b85d44954a3623120004689b2d5dd60a",
"sys_mod_count": 0,
"sys_updated_by": "admin",
"sys_updated_on": "2011-09-30T16:30:34Z",
"type": [
"itil"
]
}
}
}
Inline
Inline relations are rendered as properties of the enclosing JSON object.
Rendering relations inline may have an extreme performance impact. See RenderType Inline* for details.
{
...,
"data": [
{
"asset_tag": "P1000182",
"last_discovered": "2024-07-12T11:21:50Z",
"name": "dbaix901nyc",
"sys_class_name": "cmdb_ci_unix_server",
"sys_id": "5f9b83bfc0a8010e005a2b3212c9dc07",
"sys_mod_count": 12,
"sys_updated_on": "2024-07-17T10:54:43Z",
"user_groups": [ <= ci_to_user_group_inline
{
"active": true,
"name": "Infrastructure",
"sys_created_by": "admin",
"sys_created_on": "2021-03-30T18:56:30Z",
"sys_id": "6577e5908f972410960c53ac37bdee66", <= sys_id of user group
"sys_mod_count": 0,
"sys_updated_by": "admin",
"sys_updated_on": "2021-03-30T18:56:30Z"
},
{
"active": true,
"description": "CAB approvers",
"name": "CAB Approval",
"sys_created_by": "admin",
"sys_created_on": "2011-09-30T16:30:34Z",
"sys_id": "b85d44954a3623120004689b2d5dd60a", <= sys_id of user group
"sys_mod_count": 0,
"sys_updated_by": "admin",
"sys_updated_on": "2011-09-30T16:30:34Z",
"type": [
"itil"
]
}
]
}
],
"relations": {},
"referenced": {},
...
}
{configName}.relations
When rendering inline content you might want to request relations for referenced entities. You can do this by adding a query parameter with the following structure:
configName.relations=rel5,rel6
This tells Squid to add the given relations whenever an entity is rendered with a configuration configName.
As with relations Squid accepts this parameter in various formats:
configName.relations=rel5,rel6,rel7configName.relations=rel5&configName.relations=rel6&configName.relations=rel7configName.relations=rel5,rel6&configName.relations=rel7
Use whatever fits your calling application best.
Try it: TODO generate demo entity and create link.
Filters
Most use cases require a specific subset of data. You will seldom want all entities in cmdb_ci_server. Squid allows
you to define query parameter that restrict what data is returned, e.g. only 'all server with modelId xxx' or all PC
clients updated in the last 14 days.
Squid supports the following filters:
encodedQuery
ServiceNow encoded queries filter results using field conditions. Squid supports most operators but restricts some for performance reasons.
Basic usage: ?encodedQuery=base_name=myserver
Important: Use the database view field names with base_ prefix (e.g., base_name, base_sys_id).
See encodedQuery Reference for supported operators, restrictions, and time/date handling.
Try it: https://demo.squid46.io/cmdb_ci_server_minimal?encodedQuery=base_name=dbaix901nyc
sys_id
sys_id allows retrieval of one or more entities by way of their sysId.
Squid accepts this parameter in various formats:
sys_id=5f9b83bfc0a8010e005a2b3212c9dc07,106c5c13c61122750194a1e96cfde951,1072335fc611227500c0267a21be5dc5
sys_id=5f9b83bfc0a8010e005a2b3212c9dc07&sys_id=106c5c13c61122750194a1e96cfde951&sys_id=1072335fc611227500c0267a21be5dc5
sys_id=5f9b83bfc0a8010e005a2b3212c9dc07,106c5c13c61122750194a1e96cfde951&sys_id=1072335fc611227500c0267a21be5dc5
Use whatever fits your calling application best.
updatedBefore / updatedSince / lastDiscoveredBefore / lastDiscoveredSince
updatedBefore, updatedSince and lastDiscoveredBefore, lastDiscoveredSince are utility query parameters intended
to make querying both values easier.
The expected DateTime format is ISO8601
- "YYYY-MM-DD'T'hh:mm(:ss)?'Z'" or
- "YYYYMMDD'T'hhmm(ss)?'Z'"
The given values are used as to build a filter of
base_sys_updated_on<givenDateTimeValueforupdatedBeforebase_sys_updated_on>=givenDateTimeValueforupdatedSincebase_sys_last_discovered<givenDateTimeValueforlastDiscoveredBeforebase_sys_last_discovered>=givenDateTimeValueforlastDiscoveredSince
Please notice that these values are inclusive for *since and exclusive for *before. (Feel free to give us feedback
on this at support.arc46.io)
The 'Variable prefix' (base_) will automatically be adjusted for whatever value is defined in the requested
configuration.
Squid only accepts and returns ISO8601 Date/Time values (except when encoded in encodedQueries).
Multiple values are considered an error condition.
Try it:
- https://demo.squid46.io/cmdb_ci_server_minimal?updatedBefore=20240501T135655Z
- https://demo.squid46.io/cmdb_ci_server_minimal?updatedSince=20240501T135655Z
- https://demo.squid46.io/cmdb_ci_server_minimal?lastDiscoveredBefore=20240501T135655Z
- https://demo.squid46.io/cmdb_ci_server_minimal?lastDiscoveredSince=20240501T135655Z
filterOnTags (cmdb_key_value)
Public cloud provider have adopted tags as way of adding metadata to entities (AWS, Azure, GCP) making tags a common and established way of qualifying and accessing configuration items, especially in a dev-ops environment.
ServiceNow supports this concept by way of cmdb_key_value. This table is populated
by Cloud Discovery, but may also be populated directly.
ServiceNow uses the term tag for a slightly different concept. See Tags for details on the ServiceNow usage.
Squid users are mainly peripheral systems or devOps integrations. These users generally understand tag as described by
the major public cloud providers. We try to make life easy for our users.
filterOnTags allows restricting the returned data to only configuration items (cmdb_key_value only allows
references to cmdb_ci) that are referenced by at least one key-value entry in cmdb_key_value that matches the given
criteria.
Negative filtering, i.e., returning only configurations items that are NOT referenced by a specific key-value entry, is NOT supported.
filterOnTags does NOT change the returned data, i.e., it does not implicitly add tags to the returned configuration
items. filterOnTags only filters (nomen-est-omen) data.
See showTags/showTagsInline below for details on how to render tags for configuration items.
filterOnTags query parameter have the following structure:
filterOnTags=tagClause1^ORtagClause2^ANDtagClause3
Following ServiceNow GlideRecord conventions (but
contrary to what you might be used to from SQL) ^OR has
precedence over ^AND! The above filterOnTags query parameter would result in
(tagClause1 OR tagClause2) AND tagClause3
tagClauses have the following structure:
tagName/tagName=*- filters on having a tag withkey=tagNameignoringvaluetagName*/tagName*=*- filters on having a tag withkeySTARTSWITHtagNameignoringvaluetagName=- filters on having a tag withkey=tagNameandvalue=nulltagName*=- filters on having a tag withkeySTARTSWITHtagNameandvalue=nulltagName=value1(,value2,...)- filters on having a tag withkey=tagNameand avalueofvalue1ORvalue2tagName*=value1(,value2,...)- filters on having a tag withkeySTARTSWITHtagNameand avalueofvalue1ORvalue2
Value wildcards (value*) are NOT supported.
Multiple filterOnTags query parameter are AND combined.
filterOnTags=tagName1=value1&filterOnTags=tagName2=value2 is equivalent to
filterOnTags=tagName1=value1^ANDtagName2=value2
filterOnTeams (cmdb_rel_team)
filterOnTeams allows restricting the returned data to only configuration items (cmdb_rel_team only allows
references to cmdb_ci) that are referenced by at least one entry in cmdb_rel_team that matches the given criteria.
Negative filtering, i.e., returning only configurations items that are NOT referenced by a specific team relation, is NOT supported.
filterOnTeams does NOT change the returned data, i.e., it does not implicitly add team relations to the returned
configuration items. filterOnTeams only filters (nomen-est-omen) data.
In order to include Teams relation, request one of the predefined Teams relations.
filterOnTeams query parameter have the following structure:
filterOnTeams=group_type=group1,group2,group3
group_type is e.g. managed_by, approval
group1,group2,group3 are either sysIds of a sys_user_group or the name of a sys_user_group.
If a name is given Squid will attempt to resolve the name to a sysId. Multiple values are combined as OR condition.
Multiple filterOnTeams query parameter are AND combined.
filterOnTeams=managed_by=group1,group2 will restrict the query to CIs that are
managed_by group1 OR group2.
filterOnTeams=managed_by=group11&filterOnTeams=managed_by=group2 will restrict the query to CIs that are
managed_by group1AND group2.
limit
limit allows you to limit the amount of entities returned. This is of limited use in a production environment, but
during development you might want to test your queries with just 10 returned entities instead of 10.000.
As the order of the result set is intentionally undefined, which entities are returned may vary from call to call.
Try it: https://demo.squid46.io/cmdb_ci_server_minimal?limit=5
Flags
Flags are query parameter that turn on features.
showBlank
By default, Squid will suppress any properties with a null value.
Some client libraries might rely on a stable JSON structure and not play nice with missing JSON properties.
The query parameter showBlank will cause Squid to render null JSON properties.
Try it:
- https://demo.squid46.io/cmdb_ci_server_full?limit=1&showBlank
- https://demo.squid46.io/cmdb_ci_server_full?limit=1
showTags
Public cloud provider have adopted tags as way of adding metadata to entities (AWS, Azure, GCP) making tags a common and established way of qualifying and accessing configuration items, especially in a dev-ops environment.
ServiceNow supports this concept by way of cmdb_key_value. This table is populated
by Cloud Discovery, but may also be populated directly.
ServiceNow uses the term tag for a slightly different concept. See Tags for details on the ServiceNow usage.
Squid users are mainly peripheral systems or devOps integrations. These users generally understand tag as described by
the major public cloud providers. We try to make life easy for our users.
Just as relations, resolving tags requires at least one additional database query. For this reason, tags are only rendered when explicitly requested.
The query parameter showTags tells Squid to retrieve and render tags belonging to a configuration item.
Tags can be rendered in two locations (external vs inline) and two formats (object vs array):
Squid can render tags in two formats:
As Object
As object. This is a standard JSON object with tagName (key) as property name and value as value.
{
...,
"tags": {
"995390bccd34f010f8778495fd9bf7f7": { <= sys_id of the entity
"Owner": "SD DC Ops", <= key:value pairs
"Location": "San Diego",
"Environment": "Production"
},
"6e5314bccd34f010f8778495fd9bf72b": {
"Owner": "SD DC Ops",
"Environment": "Production",
"Location": "San Diego"
},
"9c5314bccd34f010f8778495fd9bf710": {
"Service": "San Diego Wiki",
"Owner": "SD DC Ops",
"Location": "San Diego",
"Environment": "Production"
},
"821b6357c0a8018b244b9609d7010267": {
"Owner": null
}
},
...
}
While object is easy to read intuitively it is not without problems.
ServiceNow does NOT prevent multiple tags with the same name for a single configuration item. In our example above,
nothing prevents a configuration item from having two or more tags with the name Service. As object may only have *
one* property with a given name, it is undefined which of the multiple values is returned.
The structure of the returned object is unknown beforehand, this may lead to problems when deserializing with some
JSON frameworks.
For these reasons Squid additionally offers
As Array
as array
The exact same data as above (with the addition of the extra 'Service' tag for demonstration purposes) renders as shown below.
{
...,
"tags": {
"995390bccd34f010f8778495fd9bf7f7": [ <= sys_id of the entity
{ <= array element
"name": "Owner", <= name (key)
"value": "SD DC Ops" <= value
},
{
"name": "Location",
"value": "San Diego"
},
{
"name": "Environment",
"value": "Production"
}
],
"6e5314bccd34f010f8778495fd9bf72b": [
{
"name": "Owner",
"value": "SD DC Ops"
},
{
"name": "Environment",
"value": "Production"
},
{
"name": "Location",
"value": "San Diego"
}
],
"9c5314bccd34f010f8778495fd9bf710": [
{
"name": "Service", <= Conflicting name 'Service'
"value": "Redundant Tag!" <= different values for same name (key)
},
{
"name": "Service", <= Conflicting name 'Service'
"value": "San Diego Wiki" <= different values for same name (key)
},
{
"name": "Owner",
"value": "SD DC Ops"
},
{
"name": "Location",
"value": "San Diego"
},
{
"name": "Environment",
"value": "Production"
}
],
"821b6357c0a8018b244b9609d7010267": [
{
"name": "Owner",
"value": null
}
]
},
...
}
This is a much harder read and more verbose, but it is able to render 'conflicting' tagNames and has a predefined structure.
Allowed showTags query parameter are:
showTagsdefaults toshowTags=objectshowTags=objectshowTags=array
showTagsInline
Tags may also be rendered inline. The basic structure is the same as with showTags. The difference
is that tags are rendered directly in the JSON object of the entity.
showTagsInline will render the tags directly as property of the referencing entity. This forces us to retrieve tags
the moment we are rendering the referencing entity. This will result in a potentially very high amount of
database queries.
showTagsInline is only allowed if the requested configuration
has Allow Inline Relations set checked.
{
...,
"data": [
{
"name": "WA VM 02",
"sys_class_name": "cmdb_ci_vmware_instance",
"sys_id": "1f3350bccd34f010f8778495fd9bf7f0",
"sys_mod_count": 6,
"sys_updated_on": "2021-06-30T01:04:23Z",
"tags": {
"Environment": "Production"
}
},
...
]
}
{
...,
"data": [
{
"name": "WA VM 02",
"sys_class_name": "cmdb_ci_vmware_instance",
"sys_id": "1f3350bccd34f010f8778495fd9bf7f0",
"sys_mod_count": 6,
"sys_updated_on": "2021-06-30T01:04:23Z",
"tags": [
{
"name": "Environment",
"value": "Production"
}
]
},
...
]
}
preservePrefix
Squid uses ServiceNow database views to aggregate data. These views prefix all properties with
so-called Variable Prefixes, e.g. base_, lin_, etc.
Most of the time you do NOT want to see these prefixes. There are however use cases where preserving the prefix is
essential, e.g. when aggregating tables with name collisions. In the case of two joined tables, one with the prefix
base and the other with the prefix other with both having the property name would give us a raw result set with
base_name and other_name, with base_name having priority and other_name being ignored. The returned JSON would
only contain one property name with the value of base_name
This will usually be part of the configuration (
See Configurations - Preserve Prefix), but is also available as a
query parameter. preservePrefix has precedence over configuration settings.
Try it: https://demo.squid46.io/cmdb_ci_server?limit=1&preservePrefix
{
"data": [
{
"base_asset_tag": "P1000173",
"base_classification": "Production",
"base_company": {
"sys_id": "e7c1f3d53790200044e0bfc8bcbe5deb",
"sys_class_name": "core_company"
},
"base_cost_center": {
"sys_id": "d9d0a971c0a80a641c20b13d99a48576",
"sys_class_name": "cmn_cost_center"
},
"base_cpu_count": 1,
"base_cpu_manufacturer": {
"sys_id": "067018092b2692103c92f65ac891bf66",
"sys_class_name": "core_company"
},
"base_cpu_speed": 3192,
"base_cpu_type": "GenuineIntel",
"base_discovery_source": "ServiceNow",
"base_firewall_status": "Intranet",
"base_install_status": 1,
...,
"base_vendor": {
"sys_id": "b7e7d7d8c0a8016900a5d7f291acce5c",
"sys_class_name": "core_company"
},
"base_virtual": false
}
]
}
{config}.preservePrefix
The query parameter preservePrefix described above will only apply to the root configuration, i.e. any references or
relations will be rendered according to their corresponding configuration.
{
"data": [
{
"base_asset_tag": "P1000173", root config => base_ prefix
"base_cpu_manufacturer": {
"country": "USA", reference => no prefix
"customer": false,
"manufacturer": false,
"name": "Intel",
...
},
"base_cpu_speed": 3192
}
]
}
{configName}.preservePrefix lets you to override the configuration setting for a specific configuration and
preserve prefixes for entities rendered with that configuration.
In the above example we might want to render the manufacturer with prefixes preserved.
{
"data": [
{
"base_asset_tag": "P1000173",
"base_cpu_manufacturer": {
"base_country": "USA",
"base_customer": false,
"base_manufacturer": false,
"base_name": "Intel",
...
},
"base_cpu_speed": 3192
}
]
}
Try it: https://demo.squid46.io/cmdb_ci_server_inline?limit=1&core_company_inline.preservePrefix
showConfig
The config used to render entities is normally not part of the returned JSON and of no value to the recipient. During development, it may however help to know which configuration was used to render a specific entity.
Referenced entities may be retrieved based on multiple configs depending on the path by which they are referenced. The returned JSON will be a merge of all data returned by all relevant configs.
The query parameter showConfig will add a property squid_config to each and every returned entity as a string array
of all configs used to render the entity.
{
...,
"data": [
{
...,
"squid_config": [
"cmdb_ci_server"
],
...
}
],
"relations": {},
"referenced": {
"067018092b2692103c92f65ac891bf66": {
...
"squid_config": [
"core_company"
],
...
}
}
}
Try it: https://demo.squid46.io/cmdb_ci_server?limit=1&showConfig
metaData
metaData will add additional metadata to the returned JSON.
Try it: https://demo.squid46.io/cmdb_ci_server_inline?limit=1&metaData
lenient
We strongly suggest you use this query parameter ONLY during development.
Use in production can lead to unnoticed missing data!
Squid may encounter two different types of errors while processing a request.
- configuration errors: these are errors when configurations reference non-existent target configs etc. (We might do a deep dive on why we don't validate when a configuration is created, but for now please take our word for it that this is the only realistically workable approach.)
- query errors: these are errors when the query itself has errors, e.g., requesting a non-existent relation.
Squid now has two options:
- crash hard and early. This is usually the safest option, but developers trying to get their queries right won't have much fun with this approach - or
- be 'nice' and include warnings in the metadata of the returned JSON pointing developers to what went wrong.
Being nice has the risk of missing data without noticing. Who reads the metadata of a JSON in a technical API? Therefore, Squid will, by default, return an error whenever it encounters any type of problem.
Developers tweaking their queries have the option of adding a query parameter lenient. This tells Squid to play 'nice'
and only add warnings to the metadata.
Some types of errors are not recoverable, e.g., requesting a non-existent configuration will result in a 404 error,
regardless of whether lenient is set or not.
Try it:
Lenient: https://demo.squid46.io/cmdb_ci_server_minimal?limit=10&relations=non-existent&lenient
Not Lenient: https://demo.squid46.io/cmdb_ci_server_minimal?limit=10&relations=non-existent